Hello all,
at first, sorry for my bad english. I hope you understand what i mean.
Platform information:
- Raspberry PI 3b
- KNX Bus
- openHab latest Version https://github.com/openhab/openhabian/releases/tag/v1.4.1
I want to control my ventilation Zehnder Comfoair Q350 with the Comfoconnect KNX C module. I found a solution here: https://community.openhab.org/t/integarting-zehnder-comfoair-350-using-comfoconnect-knx-c/30028. But it works with the KNX 1 Binding, i have the KNX 2 Binding.
I see the data from the ventilation, but i have problems with the control part. I can’t switch the “Auto Mode”, because the DPT is 1.003. With many try and errors, i see the data in KNX(ETS) but it will send in HEX. I need for the DPT 1.003 “Abschalten” (Auto Mode off) and “Freigeben” (Ato Mode an). I can’t switch the Auto Mode with ON/OFF or 0/1.
For other controls (Fan Level) i used dummy items, but it works with 0…3.
I think i must convert the Hex in text (ASCII) or i need a different solution to send a text string to my KNX ventilation. Please help me.
.things:
Thing device zehnder_comfoair [
address="1.1.55",
fetch=true,
pingInterval=300,
readInterval=3600
] {
Type number : luefter_stufe "Lüfterstufe" [ ga="5.010:5/2/10+<5/2/15" ]
Type string : auto_modus "Auto-Modus" [ ga="1.003:5/2/30+<5/2/31" ]
Type number : temp_profil_modus "Temperatur Profil-Modus" [ ga="5/2/50+<5/2/51" ]
Type number : temp_profil "Temperatur Profil" [ ga="5/2/40+<5/2/41" ]
Type number : abwesend "Abwesend" [ ga="5/2/60+<5/2/61" ]
Type number : temperatur_voreinst "Temperatur Voreinstellung" [ ga="5/2/90+<5/2/91" ]
Type number : status_error "Status" [ ga="5/2/100" ]
Type number : error "Fehler" [ ga="5/2/112" ]
Type string : filterwechsel "Filterwechsel" [ ga="7.007:5/2/110" ]
Type number : temperatur_fortluft "Fortlufttemp." [ ga="5/2/71" ]
Type number : temperatur_abluft "Ablufttemp." [ ga="9.001:5/2/72" ]
Type number : temperatur_aussenluft "Außenlufttemp." [ ga="9.001:5/2/73" ]
Type number : temperatur_zuluft "Zulufttemp." [ ga="9.001:5/2/74" ]
Type number : luftfeuchtigkeit_fortluft "Fortluftfeuchte" [ ga="5/2/81" ]
Type number : luftfeuchtigkeit_abluft "Abluftfeuchte" [ ga="5/2/82" ]
Type number : luftfeuchtigkeit_aussenluft "Außenluftfeuchte" [ ga="5/2/83" ]
Type number : luftfeuchtigkeit_zuluft "Zuluftfeuchte" [ ga="5/2/84" ]
Type number : luftmenge "Luftmenge" [ ga="5/2/111" ]
.items:
Group gLueftung "Lüftungsanlage" <pie>
Group gLueftung_Chart_Airflow
Group gLueftung_Chart_Humidity
Number Lueftung_Chart_Period "Chart Period"
//Number Lueftung_Control "Steuerung" <settings> (gLueftung) {comfoair="activate"}
//Number Lueftung_Komfortemperatur "Zieltemperatur [%.1f °C]" <temperature> (gLueftung) {comfoair="target_temperatur"}
//Number Lueftung_Bypass "Bypass [MAP(bypass_de.map):%s]" <selfBypass> (gLueftung) {comfoair="bypass_mode"}
Number Lueftung_Fan_Level_Control "Lüfterstufe Steuerung"
Number Lueftung_Fan_Level "Lüfterstufe]" <fan> (gLueftung) { channel="knx:device:bridge:zehnder_comfoair:luefter_stufe"}
Number Lueftung_Auto_Mode_Control "Auto Modus Steuerung"
String Lueftung_Auto_Mode "Auto Modus" (gLueftung) { channel="knx:device:bridge:zehnder_comfoair:auto_modus" }
Number Lueftung_Airflow "Luftmenge [%d l/h]" (gLueftung, gLueftung_Chart_Airflow) { channel="knx:device:bridge:zehnder_comfoair:luftmenge" }
Number Lueftung_Filterwechsel "Filterwechsel [%d h]" (gLueftung) { channel="knx:device:bridge:zehnder_comfoair:filterwechsel" }
Number Lueftung_Status "Status [%d]" (gLueftung) { channel="knx:device:bridge:zehnder_comfoair:status_error" }
Number Lueftung_Temperature_profile_mode "Temperatur Profil Modus [MAP(tempprofmodmode.map):%s]" <settings> (gLueftung) { channel="knx:device:bridge:zehnder_comfoair:temp_profil_modus" }
Number Lueftung_Temperature_profile "Temperatur Profil [MAP(tempprofmode.map):%s]" <settings> (gLueftung) { channel="knx:device:bridge:zehnder_comfoair:temp_profil" }
Number Lueftung_Temperature_set_point "Temperatur [%.1f]" <temperature> (gLueftung) { channel="knx:device:bridge:zehnder_comfoair:temperatur_voreinst" }
//Switch Lueftung_StatusErr "Error Status [%d]" (gLueftung) { autoupdate="true", knx="<(30)1.003:30/1/6" }
Number Lueftung_Temperatur_Room "Raum [%.1f °C]" (gLueftung) { channel="knx:device:bridge:zehnder_comfoair:temperatur_raum" }
Number Lueftung_Temperatur_Extract "Fortluft [%.1f °C]" (gLueftung) { channel="knx:device:bridge:zehnder_comfoair:temperatur_fortluft" }
Number Lueftung_Temperatur_Exhaust "Abluft [%.1f °C]" (gLueftung) { channel="knx:device:bridge:zehnder_comfoair:temperatur_abluft" }
Number Lueftung_Temperatur_Outdoor "Außenuft [%.1f °C]" (gLueftung) { channel="knx:device:bridge:zehnder_comfoair:temperatur_aussenluft" }
Number Lueftung_Temperatur_Supply "Zuluft [%.1f °C]" (gLueftung) { channel="knx:device:bridge:zehnder_comfoair:temperatur_zuluft" }
Number Lueftung_Humidity_Room "Raum [%d %%]" (gLueftung) { channel="knx:device:bridge:zehnder_comfoair:luftfeuchtigkeit_raum" }
Number Lueftung_Humidity_Extract "Fortluft [%d %%]" (gLueftung, gLueftung_Chart_Humidity) { channel="knx:device:bridge:zehnder_comfoair:luftfeuchtigkeit_fortluft" }
Number Lueftung_Humidity_Exhaust "Abluft [%d %%]" (gLueftung) { channel="knx:device:bridge:zehnder_comfoair:luftfeuchtigkeit_abluft" }
Number Lueftung_Humidity_Outdoor "Außenuft [%d %%]" (gLueftung) { channel="knx:device:bridge:zehnder_comfoair:luftfeuchtigkeit_aussenluft" }
Number Lueftung_Humidity_Supply "Zuluft [%d %%]" (gLueftung, gLueftung_Chart_Humidity) { channel="knx:device:bridge:zehnder_comfoair:luftfeuchtigkeit_zuluft" }
.rules:
rule "Lüftungsanlage Stufen"
when
Item Lueftung_Fan_Level_Control received command
then
switch (receivedCommand) {
case 0 : Lueftung_Fan_Level.sendCommand(0)
case 1 : Lueftung_Fan_Level.sendCommand(1)
case 2 : Lueftung_Fan_Level.sendCommand(2)
case 3 : Lueftung_Fan_Level.sendCommand(3)
}
end
rule "Lüftungsanlage Stufen"
when
Item Lueftung_Auto_Mode_Control received command
then
switch (receivedCommand) {
case 0 : Lueftung_Auto_Mode.sendCommand("Abschalten")
case 1 : Lueftung_Auto_Mode.sendCommand("Freigeben")
}
end
rule "Status and Error Status Message"
when
System started
or
Item Lueftung_Status changed
or
Item Lueftung_StatusErr received update
then
if( (Lueftung_Status.state instanceof DecimalType) ){
var Number Status = Lueftung_Status.state as DecimalType
if (Status.intValue == 0) {
postUpdate(Lueftung_Status, "ok, Status: " + Status.intValue)
} else {
postUpdate(Lueftung_Status, "Not ok check ComfoConnect KNX C manual, status val: " + Status.intValue)
}
}
if ( (Lueftung_StatusErr.state instanceof DecimalType) ){
var Number StatusErr = Lueftung_StatusErr.state as DecimalType
if (StatusErr.intValue == 0) {
postUpdate(Lueftung_StatusErr_Msg, "no Error")
} else {
postUpdate(Lueftung_StatusErr_Msg, "Error: check ComfoConnect KNX C manual, status val: " + StatusErr.intValue )
}
}
end
rule "Filterwechsel Message"
when
System started
or
Item Lueftung_Filterwechsel changed
then
if( (Lueftung_Filterwechsel.state instanceof DecimalType) ){
var Number Filterwechsel = Lueftung_Filterwechsel.state as DecimalType
var Number days = Filterwechsel/24
var String msg = days.intValue + " Tage"
postUpdate(Lueftung_Filterwechsel, msg)
}
end
rule "Temperature Message"
when
System started
or
Item Lueftung_Temperatur_Room changed
or
Item Lueftung_Temperatur_Extract changed
or
Item Lueftung_Temperatur_Exhaust changed
or
Item Lueftung_Temperatur_Outdoor changed
or
Item Lueftung_Temperatur_Supply changed
then
if( (Lueftung_Temperatur_Room.state instanceof DecimalType) ){
postUpdate(Lueftung_Temperatur_Room, Lueftung_Temperatur_Room.state.format("%.1f") + "°C")
}
if( (Lueftung_Temperatur_Extract.state instanceof DecimalType) ){
postUpdate(Lueftung_Temperatur_Extract, Lueftung_Temperatur_Extract.state.format("%.1f") + "°C")
}
if( (Lueftung_Temperatur_Exhaust.state instanceof DecimalType) ){
postUpdate(Lueftung_Temperatur_Exhaust, Lueftung_Temperatur_Exhaust.state.format("%.1f") + "°C")
}
if( (Lueftung_Temperatur_Outdoor.state instanceof DecimalType) ){
postUpdate(Lueftung_Temperatur_Outdoor, Lueftung_Temperatur_Outdoor.state.format("%.1f") + "°C")
}
if( (Lueftung_Temperatur_Supply.state instanceof DecimalType) ){
postUpdate(Lueftung_Temperatur_Supply, Lueftung_Temperatur_Supply.state.format("%.1f") + "°C")
}
end
rule "Humidity Message"
when
System started
or
Item Lueftung_Humidity_Room changed
or
Item Lueftung_Humidity_Extract changed
or
Item Lueftung_Humidity_Exhaust changed
or
Item Lueftung_Humidity_Outdoor changed
or
Item Lueftung_Humidity_Supply changed
then
if( (Lueftung_Humidity_Room.state instanceof DecimalType) ){
postUpdate(Lueftung_Humidity_Room, Lueftung_Humidity_Room.state.format("%d") + "%")
}
if( (Lueftung_Humidity_Extract.state instanceof DecimalType) ){
postUpdate(Lueftung_Humidity_Extract, Lueftung_Humidity_Extract.state.format("%d") + "%")
}
if( (Lueftung_Humidity_Exhaust.state instanceof DecimalType) ){
postUpdate(Lueftung_Humidity_Exhaust, Lueftung_Humidity_Exhaust.state.format("%d") + "%")
}
if( (Lueftung_Humidity_Outdoor.state instanceof DecimalType) ){
postUpdate(Lueftung_Humidity_Outdoor, Lueftung_Humidity_Outdoor.state.format("%d") + "%")
}
if( (Lueftung_Humidity_Supply.state instanceof DecimalType) ){
postUpdate(Lueftung_Humidity_Supply, Lueftung_Humidity_Supply.state.format("%d") + "%")
}
end
rule "Filterlaufzeit"
when
System started
or
Item Lueftung_Filterlaufzeit changed
then
if( Lueftung_Filterlaufzeit.state instanceof DecimalType ){
var Number laufzeit = Lueftung_Filterlaufzeit.state as DecimalType
var Number weeks = Math::floor( (laufzeit/168).doubleValue )
var Number days = Math::floor( ((laufzeit-(weeks*168))/24).doubleValue)
var String msg = ""
if( weeks > 0 ){
if( weeks == 1 ) msg = weeks.intValue + " Woche"
else msg = weeks.intValue + " Wochen"
}
if( days > 0 ){
if( msg.length > 0 ) msg = msg + ", "
if( days == 1 ) msg = msg + days.intValue + " Tag"
else msg = msg + days.intValue + " Tage"
}
postUpdate(Lueftung_Filterlaufzeit_Message,msg)
}
end
.sitemap
Frame label="Lüftungsanlage Steuerung"{
Switch item=Lueftung_Auto_Mode mappings=[0="Aus", 1="An"] icon="control"
Switch item=Lueftung_Fan_Level_Control mappings=[0="abwesend", 1="1", 2="2", 3="3"] icon="fan"
Switch item=Lueftung_Temperature_profile_mode label="Temp. Profil Modus" mappings=[0="adaptiv", 1="fest", 2="setpoint"]
Switch item=Lueftung_Temperature_profile label="Temperatur Profil" mappings=[0="normal", 1="kalt", 2="warm"]
Setpoint item=Lueftung_Temperature_set_point minValue=16 maxValue=24 step=0.5
//Switch item=Lueftung_Chart_Period label="Chart Period" icon="chart" mappings=[0="Hour", 1="Day", 2="Week"]
}
Frame label="Lüftungsanlage Status" {
Text item=Lueftung_Filterwechsel label="Filterwechsel" icon=""
Text item=Lueftung_Airflow label="Luftmenge" icon=""
Text item=Lueftung_Status label="Status" icon=""
//Text item=Lueftung_StatusErr label="Fehler" icon=""
//Chart item=gLueftung_Chart_Airflow period=h refresh=600 visibility=[Lueftung_Chart_Period==0, Lueftung_Chart_Period=="NULL"]
//Chart item=gLueftung_Chart_Airflow period=D refresh=3600 visibility=[Lueftung_Chart_Period==1]
//Chart item=gLueftung_Chart_Airflow period=W refresh=3600 visibility=[Lueftung_Chart_Period==2]
}
Frame label="Lüftungsanlage Temperaturen" {
Text item=Lueftung_Temperatur_Extract label="Fortluft" icon=""
Text item=Lueftung_Temperatur_Exhaust label="Abluft" icon=""
Text item=Lueftung_Temperatur_Outdoor label="Außenuft" icon=""
Text item=Lueftung_Temperatur_Supply label="Zuluft" icon=""
}
Frame label="Lüftungsanlage Luftfeuchtigkeit" {
Text item=Lueftung_Humidity_Extract label="Fortluft" icon=""
Text item=Lueftung_Humidity_Exhaust label="Abluft" icon=""
Text item=Lueftung_Humidity_Outdoor label="Außenluft" icon=""
Text item=Lueftung_Humidity_Supply label="Zuluft" icon=""
//Chart item=gLueftung_Chart_Humidity period=h refresh=600 visibility=[Lueftung_Chart_Period==0, Lueftung_Chart_Period=="NULL"]
//Chart item=gLueftung_Chart_Humidity period=D refresh=3600 visibility=[Lueftung_Chart_Period==1]
//Chart item=gLueftung_Chart_Humidity period=W refresh=3600 visibility=[Lueftung_Chart_Period==2]
}
}
.persistence:
Strategies {
// for rrd charts, we need a cron strategy
everyMinute : "0 * * * * ?"
}
Items {
DemoSwitch,NoOfLights,Window_GF_Toilet,Heating* : strategy = everyChange, everyMinute, restoreOnStartup
// let's only store temperature values in rrd
Temperature*,Weather_Chart* : strategy = everyMinute, restoreOnStartup
Heizung_Chart* : strategy = everyMinute, restoreOnStartup
Lueftung_Airflow, Lueftung_Humidity_Extract, Lueftung_Humidity_Supply: strategy = everyMinute, restoreOnStartup
gLueftung_Chart_Airflow, gLueftung_Chart_Humidity : strategy = everyMinute, restoreOnStartup
SMA_TotalPac : strategy = everyMinute, restoreOnStartup
gSMA_Chart : strategy = everyMinute, restoreOnStartup
}
More Problems:
- Lueftung_Temperature_profile_mode, Lueftung_Temperature_profile and Lueftung_Temperature_set_point are not tested
- convert the item “Lueftung_Filterwechsel” from hours to days don’t work
- charts don’t work (i haven’t seen why)
Many thanks.
Torsten