# ComfoAir Binding
This binding allows to monitor and control Zehnder ComfoAir serial controlled ventilation systems via RS232 serial connection. Though the binding is developed based on the protocol description for Zehnder ComfoAir devices it should also work for mostly identical systems from different manufacturers, like StorkAir WHR930, Wernig G90-380 and Paul Santos 370 DC. It was also successfully tested on a Wernig G90-160.
NOTE: This binding does not work with the ComfoAir Q-series (e.g. Q350 or Q450). These ventilation units use a CAN bus for communication and a different protocol.
# Limitations
- Either the ComfoAir binding or the CCEase Comfocontrol can be active, but not together.
- You must implement auto mode by yourself with rules, but it is more powerful.
# Prerequisites
Computer communication between ComfoAir device and openHAB via RS232 connection has to be set up. The connection should be made with a 3-wire cable connecting pins: GND, TX, RX of RS232 sockets, but RX and TX pins should be crossed (TX of ComfoAir to RX of PC, RX of ComfoAir to TX of PC).
# Serial Port Access Rights
- Take care that the user that runs openHAB has rights to access the serial port
- On Ubuntu/Debian based systems (incl. openHABian) that usually means adding the user (e.g. openhab) to the group "dialout", i.e.
sudo usermod -a -G dialout openhab
# Supported Things
The binding supports thing types for different device types. They only differ in the available channels, where the generic comfoair thing type supports all available channels. If there is no thing type that matches your specific device you can safely choose the comfoair type.
Thing Type ID | Description |
---|---|
comfoair | A ComfoAir ventilation system connected via RS232 serial connection. |
WHR930 | Thing type restricted to the data points available for the StorkAir WHR930. |
# Discovery
Discovery is not supported.
# Thing Configuration
For the thing creation, the appropriate serial port has to be set.
Parameter | Values | Default |
---|---|---|
serialPort | /dev/ttyUSB0 , COM1 , etc. | - |
refreshInterval | Refresh interval in seconds (10...65535) | 60 |
# Channels
The ComfoAir binding supports the following channels.
Channel ID | Item Type | Label | Description | Read Only | Advanced |
---|---|---|---|---|---|
Binding Control | |||||
bindingControl#activate | Switch | Activate Binding Control | Activate (control through openHAB) or deactivate (return control to CCEase) binding control | false | no |
Ventilation Values | |||||
ventilation#fanLevel | Number | Fan Level | Fan level | false | no |
ventilation#fanOut0 | Number | Fan Out Level 0 (away) | Fan level 0 performance (%) of outgoing fan | false | yes |
ventilation#fanOut1 | Number | Fan Out Level 1 | Fan level 1 performance (%) of outgoing fan | false | yes |
ventilation#fanOut2 | Number | Fan Out Level 2 | Fan level 2 performance (%) of outgoing fan | false | yes |
ventilation#fanOut3 | Number | Fan Out Level 3 | Fan level 3 performance (%) of outgoing fan | false | yes |
ventilation#fanIn0 | Number | Fan In Level 0 (away) | Fan level 0 performance (%) of incoming fan | false | yes |
ventilation#fanIn1 | Number | Fan In Level 1 | Fan level 1 performance (%) of incoming fan | false | yes |
ventilation#fanIn2 | Number | Fan In Level 2 | Fan level 2 performance (%) of incoming fan | false | yes |
ventilation#fanIn3 | Number | Fan In Level 3 | Fan level 3 performance (%) of incoming fan | false | yes |
ventilation#fanInPercent | Number | Fan In (%) | Current relative speed (%) of incoming fan | false | yes |
ventilation#fanOutPercent | Number | Fan Out (%) | Current relative speed (%) of outgoing fan | true | yes |
ventilation#fanInRPM | Number:Frequency | Fan In (rpm) | Current absolute speed (rpm) of incoming fan | true | yes |
ventilation#fanOutRPM | Number:Frequency | Fan Out (rpm) | Current absolute speed (rpm) of outgoing fan | true | yes |
Temperature Values | |||||
temperatures#targetTemperature | Number:Temperature | Target Temperature | Target (comfort) temperature | false | no |
temperatures#outdoorTemperatureIn | Number:Temperature | Outdoor Temperature Incoming | Intake air temperature (outside) | true | yes |
temperatures#outdoorTemperatureOut | Number:Temperature | Outdoor Temperature Outgoing | Outlet air temperature (outside) | true | yes |
temperatures#indoorTemperatureIn | Number:Temperature | Indoor Temperature Incoming | Inlet air temperature (inside) | true | yes |
temperatures#indoorTemperatureOut | Number:Temperature | Indoor Temperature Outgoing | Uptake air temperature (inside) | true | yes |
temperatures#isT1Sensor | Switch | Sensor T1 Available | Availability of temperature sensor T1 (outdoor in) | true | yes |
temperatures#isT2Sensor | Switch | Sensor T2 Available | Availability of temperature sensor T2 (indoor in) | true | yes |
temperatures#isT3Sensor | Switch | Sensor T3 Available | Availability of temperature sensor T3 (indoor out) | true | yes |
temperatures#isT4Sensor | Switch | Sensor T4 Available | Availability of temperature sensor T4 (outdoor out) | true | yes |
temperatures#isEWTSensor | Switch | GHX Sensor Available | Availability of geothermal heat exchanger temperature sensor | true | yes |
temperatures#isHeaterSensor | Switch | Heater Sensor Available | Availability of heater temperature sensor | true | yes |
temperatures#isCookerhoodSensor | Switch | Cookerhood Sensor Available | Availability of cookerhood temperature sensor | true | yes |
temperatures#ewtTemperature | Number:Temperature | GHX Temperature | Temperature of geothermal heat exchanger sensor | true | yes |
temperatures#heaterTemperature | Number:Temperature | Heater Temperature | Temperature of heater sensor | true | yes |
temperatures#cookerhoodTemperature | Number:Temperature | Cookerhood Temperature | Temperature of cookerhood sensor | true | yes |
Uptimes | |||||
times#level0Time | Number:Time | Level 0 duration | Uptime at level 0 (away) | true | yes |
times#level1Time | Number:Time | Level 1 duration | Uptime at level 1 | true | yes |
times#level2Time | Number:Time | Level 2 duration | Uptime at level 2 | true | yes |
times#level3Time | Number:Time | Level 3 duration | Uptime at level 3 | true | yes |
times#freezeTime | Number:Time | Antifrost Duration | Uptime of antifrost | true | yes |
times#preheaterTime | Number:Time | Preheater Duration | Uptime of preheater | true | yes |
times#bypassTime | Number:Time | Bypass Duration | Hours of bypass open | true | yes |
times#filterHours | Number:Time | Filter Duration | Uptime of the filter | true | no |
Menu P1: Control States | |||||
menuP1#menu20Mode | Switch | Menu 20 Mode (P10) | State of menu 20 mode (P10) | true | yes |
menuP1#menu21Mode | Switch | Menu 21 Mode (P11) | State of menu 21 mode (P11) | true | yes |
menuP1#menu22Mode | Switch | Menu 22 Mode (P12) | State of menu 22 mode (P12) | true | yes |
menuP1#menu23Mode | Switch | Menu 23 Mode (P13) | State of menu 23 mode (P13) | true | yes |
menuP1#menu24Mode | Switch | Menu 24 Mode (P14) | State of menu 24 mode (P14) | true | yes |
menuP1#menu25Mode | Switch | Menu 25 Mode (P15) | State of menu 25 mode (P15) | true | yes |
menuP1#menu26Mode | Switch | Menu 26 Mode (P16) | State of menu 26 mode (P16) | true | yes |
menuP1#menu27Mode | Switch | Menu 27 Mode (P17) | State of menu 27 mode (P17) | true | yes |
menuP1#menu28Mode | Switch | Menu 28 Mode (P18) | State of menu 28 mode (P18) | true | yes |
menuP1#menu29Mode | Switch | Menu 29 Mode (P19) | State of menu 29 mode (P19) | true | yes |
Menu P2: Delay Settings | |||||
menuP2#bathroomStartDelay | Number:Time | Menu P21 | Start delay for bathroom switch (uses minutes internally) | false | yes |
menuP2#bathroomEndDelay | Number:Time | Menu P22 | End delay for bathroom switch (uses minutes internally) | false | yes |
menuP2#L1EndDelay | Number:Time | Menu P23 | End delay for L1 switch (uses minutes internally) | false | yes |
menuP2#pulseVentilation | Number:Time | Menu P27 | Period for pulse ventilation (uses minutes internally) | false | yes |
menuP2#filterWeeks | Number:Time | Menu P24 | Usage period until filter pollution message (uses weeks internally) | false | yes |
menuP2#RFShortDelay | Number:Time | Menu P25 | End delay (RF short actuation) for ventilation level 3 (uses minutes internally) | false | yes |
menuP2#RFLongDelay | Number:Time | Menu P26 | End delay (RF long actuation) for ventilation level 3 (uses minutes internally) | false | yes |
menuP2#cookerhoodDelay | Number:Time | Menu P20 | End delay for cooker hood control (uses minutes internally) | false | yes |
Menu P9: Option States | |||||
menuP9#chimneyState | Switch | Chimney Control State | State of the chimney control | true | yes |
menuP9#bypassState | Switch | Bypass State | State of the bypass (ON = open / OFF = closed) | true | yes |
menuP9#ewtState | Switch | GHX State | State of the geothermal heat exchanger valve (ON = open / OFF = closed) | true | yes |
menuP9#heaterState | Switch | Heater State | State of the heater | true | yes |
menuP9#vControlState | Switch | 0-10V Control State | State of the 0-10V control | true | yes |
menuP9#frostState | Switch | Antifrost State | State of the antifrost control | true | yes |
menuP9#cookerhoodState | Switch | Cookerhood State | State of the cookerhood control | true | yes |
menuP9#enthalpyState | Switch | Enthalpy State | State of the enthalpy module | true | yes |
Error States | |||||
errors#filterError | Switch | Filter Error | Filter full | true | no |
errors#errorsCurrent | String | Errors Current | Current errors | true | no |
errors#errorsLast | String | Errors Last | Last errors | true | yes |
errors#errorsPrelast | String | Errors Prelast | Prelast errors | true | yes |
errors#errorsPrePrelast | String | Errors Pre-Prelast | Pre-Prelast errors | true | yes |
Bypass Values | |||||
bypass#bypassFactor | Number | Bypass Factor | Bypass factor value | true | yes |
bypass#bypassLevel | Number | Bypass Level | Bypass level state | true | yes |
bypass#bypassCorrection | Number | Bypass Correction | Bypass correction state | true | yes |
bypass#bypassSummer | Switch | Bypass Summer Mode | Bypass summer mode | true | yes |
Preheater Values | |||||
preheater#preheaterValve | Number | Preheater Valve | State of the preheater valve | true | yes |
preheater#preheaterFrostProtect | Switch | Frost Protection | State of the frost protection | true | yes |
preheater#preheaterHeating | Switch | Preheater | State of the preheater | true | yes |
preheater#preheaterFrostTime | Number:Time | Preheater Frost Time | Frost minutes | true | yes |
preheater#preheaterSafety | Number | Preheater Frost Safety | Frost safety setting | true | yes |
GHX Values | |||||
ewt#ewtTemperatureLow | Number:Temperature | GHX Temperature (low) | Lower temperature of the geothermal heat exchanger | false | yes |
ewt#ewtTemperatureHigh | Number:Temperature | GHX Temperature (high) | Upper temperature of the geothermal heat exchanger | false | yes |
ewt#ewtSpeed | Number | GHX Speed Up (%) | Speed up of the geothermal heat exchanger | false | yes |
Heater Values | |||||
heater#heaterPower | Number | Heater Power | Heater power value | true | yes |
heater#heaterPowerI | Number | Heater Power I-parameter | Heater power I-parameter value | true | yes |
heater#heaterTargetTemperature | Number:Temperature | Heater Target Temperature | Target temperature of the heater | false | yes |
Cookerhood Values | |||||
cookerhood#cookerhoodSpeed | Number | Cookerhood Speed Up (%) | Speed up of the cookerhood | true | yes |
Enthalpy Values | |||||
enthalpy#enthalpyTemperature | Number:Temperature | Enthalpy Sensor Temperature | Temperature of the enthalpy sensor | true | yes |
enthalpy#enthalpyHumidity | Number | Enthalpy Sensor Humidity | Humidity of the enthalpy sensor | true | yes |
enthalpy#enthalpyLevel | Number | Enthalpy Sensor Level | Level of the enthalpy sensor | true | yes |
enthalpy#enthalpyTime | Number:Time | Enthalpy Sensor Timer | Timer state of the enthalpy sensor | true | yes |
Option Settings | |||||
options#isPreheater | Switch | Preheater | Preheater option installed | true | yes |
options#isBypass | Switch | Bypass | Bypass option installed | true | yes |
options#recuType | Number | ComfoAir Type | Type of the ComfoAir (1 = left / 2 = right) | true | yes |
options#recuSize | Number | ComfoAir Size | Size of the ComfoAir (1 = big / 2 = small) | true | yes |
options#isChimney | Switch | Chimney | Chimney option installed | true | yes |
options#isCookerhood | Switch | Cookerhood | Cookerhood option installed | true | yes |
options#isHeater | Switch | Heater | Heater option installed | true | yes |
options#isEnthalpy | Number | Enthalpy | Enthalpy option installed | true | yes |
options#isEWT | Number | Geothermal Heat Exchanger | Geothermal heat exchanger option installed | true | yes |
options#analogPriority | Number | Analog Priority | Priority of analog inputs for highest fan level | true | yes |
Inputs | |||||
inputs#isL1Switch | Switch | L1 Switch | Availability of L1 step switch | true | yes |
inputs#isL2Switch | Switch | L2 Switch | Availability of L2 step switch | true | yes |
inputs#isBathroomSwitch | Switch | Bathroom Switch | Availability of bathroom switch | true | yes |
inputs#isCookerhoodSwitch | Switch | Cookerhood Switch | Availability of cookerhood switch | true | yes |
inputs#isExternalFilter | Switch | External Filter | Availability of external filter | true | yes |
inputs#isWTW | Switch | Heat Recovery | Availability of heat recovery (WTW) | true | yes |
inputs#isBathroom2Switch | Switch | Bathroom Switch 2 | Availability of bathroom switch 2 (luxe) | true | yes |
Resets | |||||
resets#filterReset | Number | Filter Reset | Reset filter uptime | false | no |
resets#errorReset | Number | Error Reset | Reset errors | false | no |
Analog Inputs [1-4] | |||||
analog[1-4]#isAnalog | Switch | Analog Input Availability | Availability of analog input [1-4] | false | yes |
analog[1-4]#analogMode | Switch | Analog Input State | State of analog input [1-4] | false | yes |
analog[1-4]#analogNegative | Switch | Analog Input Postive/Negative | Postive/Negative state of analog input [1-4] | false | yes |
analog[1-4]#analogVolt | Number:ElectricPotential | Analog Input Voltage Level | Voltage level of analog input [1-4] | false | yes |
analog[1-4]#analogMin | Number | Analog Input Min | Minimum setting for analog input [1-4] | false | yes |
analog[1-4]#analogMax | Number | Analog Input Max | Maximum setting for analog input [1-4] | false | yes |
analog[1-4]#analogValue | Number | Analog Input Target | Target setting for analog input [1-4] | false | yes |
RF Input | |||||
analogRF#isRF | Switch | RF Input Availability | Availability of RF input | false | yes |
analogRF#RFMode | Switch | RF Input State | State of RF input | false | yes |
analogRF#RFNegative | Switch | RF Input Postive/Negative | Postive/Negative state of RF input | false | yes |
analogRF#RFMin | Number | RF Input Min | Minimum setting for RF input | false | yes |
analogRF#RFMax | Number | RF Input Max | Maximum setting for RF input | false | yes |
analogRF#RFValue | Number | RF Input Target | Target setting for RF input | false | yes |
analogRF#analogPriority | Number | Analog Priority | Priority of control | false | yes |
# Full Example
.things
file:
Thing comfoair:comfoair:myComfoAir "ComfoAir" [serialPort="/dev/ttyUSB0", refreshInterval="60"]
.items
file:
Switch comfoairControl "Activate" <computer> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:bindingControl#activate"}
Number comfoairFanLevel "Ventilation level [%d]" <chart> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:ventilation#fanLevel"}
Number comfoairErrorReset "Error reset" <service> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:resets#errorReset"}
Number comfoairFilterReset "Filter reset" <service> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:resets#filterReset"}
Number comfoairFilterPeriod "Filter period [%d weeks]" <clock> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:menuP2#filterWeeks"}
// Messages
String comfoairError "Error: [%s]" (ComfoAir) {channel="comfoair:comfoair:myComfoAir:errors#errorsCurrent"}
Number:Time comfoairFilterRuntime "Filter runtime [%.0f h]" (ComfoAir) {channel="comfoair:comfoair:myComfoAir:times#filterHours"}
// State
Number:Temperature comfoairTargetTemperature "Comfort temperature [%.1f °C]" <temperature> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:temperatures#targetTemperature"}
Number:Temperature comfoairOutdoorIncomingTemperature "Inlet air temperature [%.1f °C]" <temperature> (ComfoAir, comfoairTemps_Chart) {channel="comfoair:comfoair:myComfoAir:temperatures#outdoorTemperatureIn"}
Number:Temperature comfoairIndoorIncomingTemperature "Supply air temperature [%.1f °C]" <temperature> (ComfoAir, comfoairTemps_Chart) {channel="comfoair:comfoair:myComfoAir:temperatures#indoorTemperatureIn"}
Number:Temperature comfoairIndoorOutgoingTemperature "Return air temperature [%.1f °C]" <temperature> (ComfoAir, comfoairTemps_Chart) {channel="comfoair:comfoair:myComfoAir:temperatures#indoorTemperatureOut"}
Number:Temperature comfoairOutdoorOutgoingTemperature "Exhaust air temperature [%.1f °C]" <temperature> (ComfoAir, comfoairTemps_Chart) {channel="comfoair:comfoair:myComfoAir:temperatures#outdoorTemperatureOut"}
Number comfoairIncomingFan "Supply capacity [%d %%]" <fan_in> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:ventilation#fanInPercent"}
Number comfoairOutgoingFan "Exhaust capacity [%d %%]" <fan_out> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:ventilation#fanOutPercent"}
Number comfoairFanIn0 "Supply capacity - level 0 [%d %%]" <fan_in> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:ventilation#fanIn0"}
Number comfoairFanOut0 "Exhaust capacity - level 0 [%d %%]" <fan_out> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:ventilation#fanOut0"}
Switch comfoairBypassMode "Bypass [MAP(comfoair_bypass.map):%s]" <climate> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:menuP9#bypassState"}
Switch comfoairGHXMode "GHX [MAP(comfoair_on-off.map):%s]" <climate> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:menuP9#ewtState"}
Switch comfoairChimneyMode "Fire programme [MAP(comfoair_on-off.map):%s]" <climate> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:menuP9#chimneyState"}
Switch comfoairHeaterMode "Heater [MAP(comfoair_on-off.map):%s]" <climate> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:menuP9#heaterState"}
Switch comfoairCookerHoodMode "Extractor hood [MAP(comfoair_on-off.map):%s]" <climate> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:menuP9#cookerhoodState"}
Switch comfoairEnthalpyMode "Enthalpy [MAP(comfoair_on-off.map):%s]" <climate> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:menuP9#enthalpyState"}
Switch comfoairFreezeMode "Freeze [MAP(comfoair_freeze.map):%s]" <climate> (ComfoAir) {channel="comfoair:comfoair:myComfoAir:menuP9#frostState"}
.sitemap
file:
sitemap comfoair label="ComfoAir" {
Frame label="Main" {
Text item=comfoairError labelcolor=[!="No Errors"="red"] valuecolor=[!="No Errors"="red"]
Switch item=comfoairControl mappings=[OFF="CCEase", ON="Computer"]
Switch item=comfoairErrorReset mappings=[1="Reset"]
Switch item=comfoairFilterReset mappings=[1="Reset"]
}
Frame label="Control" {
Selection item=comfoairFanLevel
Setpoint item=comfoairTargetTemperature step=0.5 minValue=15 maxValue=28 valuecolor=["black"]
}
Frame label="State" {
Text item=comfoairOutdoorIncomingTemperature valuecolor=["black"]
Text item=comfoairOutdoorOutgoingTemperature valuecolor=["black"]
Text item=comfoairIndoorIncomingTemperature valuecolor=["black"]
Text item=comfoairIndoorOutgoingTemperature valuecolor=["black"]
}
Frame {
Text item=comfoairIncomingFan valuecolor=["black"]
Text item=comfoairBypassMode valuecolor=["black"]
Text item=comfoairOutgoingFan valuecolor=["black"]
Text item=comfoairGHXMode valuecolor=[OFF="silver", ON="black"]
Text item=comfoairEfficiency valuecolor=["black"]
Text item=comfoairFreezeMode valuecolor=[OFF="black", ON="red"]
Text item=comfoairFilterRuntime_Message valuecolor=["black"]
Text item=comfoairChimneyMode valuecolor=[OFF="silver", ON="black"]
}
}
comfoair_bypass.map
file:
ON=Opened
OFF=Closed
undefined=unknown
-=unknown
comfoair_on-off.map
file:
ON=active
OFF=inactive
undefined=unknown
-=unknown
comfoair_freeze.map
file:
ON=frozen
OFF=OK
undefined=unknown
-=unknown
# Control Protocol Reference
For reference the protocol description used can be found here (german version only): Protokollbeschreibung Zehnder ComfoAir (opens new window)