Problems with openhab<>KNX (Comfoconnect KNX C)

Hello all,

at first, sorry for my bad english. I hope you understand what i mean.
Platform information:

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

I have the same problem. Any solution?