A † marks information that comes from the official ComfoControl app (what it reads, writes or names), but that has not been checked on a unit.
A RMI message is send towards a Node. The node ids are not fixed: the bridge announces the nodes that are available
with CnNodeNotification messages when a session starts, and the ventilation unit is the node whose productId is
1 (ComfoAirQ) or 8 (ComfoAir Flex). On a ComfoAirQ with a ComfoConnect LAN C, this typically results in:
| Node | Description |
|---|---|
| 0x01 | The Ventilation Unit itself |
| 0x30 | The ComfoConnect LAN C device |
On other setups the ids differ. A ComfoAir Flex has for example been seen at node 0x2D (45), with its connection
board at node 0x29 (41).
The Ventilation Unit is seperated into multiple Units, and sometimes even SubUnits. Here is a list of some existing units:
| ID | # of SubUnits | Name | Responsible for |
|---|---|---|---|
| 0x01 | 1 | NODE | Represents the general node with attributes like serial nr, etc. |
| 0x02 | 1 | COMFOBUS | Unit responsible for comfobus-communication. Probably stores the ID's of connected devices. |
| 0x03 | 1 | ERROR | Stores errors, allows errors to be reset |
| 0x15 | 10 | SCHEDULE | Responsible for managing Timers, the schedule, etc. Check here for level, bypass etc. |
| 0x16 | 2 | VALVE | The valves: 01 extract (V11), 02 bypass/preheater (V21) † |
| 0x17 | 2 | FAN | Represents the two fans: 01 exhaust (F12), 02 supply (F22) † |
| 0x18 | 1 | POWERSENSOR | Counts the actual wattage of ventilation and accumulates to year and since factory reset |
| 0x19 | 1 | PREHEATER | Represents the optional preheater |
| 0x1A | 1 | HMI | Represents the Display + Buttons |
| 0x1B | 1 | RFCOMMUNICATION | Wireless-communication with attached devices |
| 0x1C | 1 | FILTER | Counts the days since last filter change |
| 0x1D | 1 | TEMPHUMCONTROL | Controls the target temperature, if its cooling or heating period and some settings |
| 0x1E | 1 | VENTILATIONCONFIG | Responsible for managing various configuration options of the ventilation |
| 0x20 | 1 | NODECONFIGURATION | Manages also some options |
| 0x21 | 6 | TEMPERATURESENSOR | Represents the 6 temperature sensors in the ventilation (see below) |
| 0x22 | 6 | HUMIDITYSENSOR | Represents the 6 humidity sensors (see below) |
| 0x23 | 2 | PRESSURESENSOR | Represents both pressure sensors: 01 exhaust (P12), 02 supply (P22) † |
| 0x24 | 1 | PERIPHERALS | Stores the ID of the ComfoCool attached, can reset peripheral errors here |
| 0x25 | 4 | ANALOGINPUT | Provides data and functionality for the analog inputs, also the scaling for the voltages. Subunit 00 holds the settings the inputs share † |
| 0x26 | 1 | COOKERHOOD | "Dummy" unit, probably represents the ComfoHood if attached |
| 0x27 | 1 | POSTHEATER | Represents the optional post heater attached (temperature sens, config) |
| 0x28 | 1 | COMFOFOND | "Dummy" unit, represents the optional comfofond |
| 0x29 | 1 | ERRORLOGGING | The error log: the number of entries and the entries themselves † |
| 0x2A | 1 | COMPONENTCHECK | The component check of the service menu (fan, bypass, preheater, …) † |
| 0x2B | 8 | CO2SENSOR | The CO2 control, one subunit per zone (01-08); subunit 00 holds the shared settings † |
| 0x2C | 1 | SERVICEPRINT | Countries and article numbers, for installing the unit as another article † |
The subunits of the sensor units are the same for temperature (T) and humidity (H) †:
| SubUnit | Sensor |
|---|---|
| 0x01 | Room (T10, H10) |
| 0x02 | Extract air (T11, H11) |
| 0x03 | Exhaust air (T12, H12) |
| 0x04 | Outdoor air (T20, H20) |
| 0x05 | Outdoor air after the preheater (T21, H21) |
| 0x06 | Supply air (T22, H22) |
Their PDOs follow the same order: 272 + subunit for the temperatures and 288 + subunit for the humidities (see
PROTOCOL-PDO.md).
Other nodes reuse the unit ids from 0x15 on for their own units (like the ComfoClime below). The app knows these:
| Node (productId) | Unit | Name |
|---|---|---|
ComfoCool (6) |
0x15 | The cooler |
ComfoCool (6) |
0x16 | Temperature sensors: 01 room (T10), 02 condensor (T13), 03 supply air (T23) |
Option Box (4) |
0x15 | Inputs and outputs |
ComfoAir Flex connection board (9) |
0x15 | Inputs and outputs |
ComfoAir Flex connection board (9) |
0x16 | Node configuration |
ComfoAir Flex connection board (9) |
0x17 | WiFi |
CO2 sensor (10) |
0x15 | CO2 sensor; property 03 (BOOL, rw) enables it |
CO2 sensor (10) |
0x16 | Temperature sensor; property 03 (BOOL, rw) enables it |
CO2 sensor (10) |
0x17 | Humidity sensor; property 03 (BOOL, rw) enables it |
CO2 sensor (10) |
0x18 | Ambient pressure sensor; property 03 (BOOL, rw) enables it |
CO2 sensor (10) |
0x19 | Display: property 02 (UINT8, rw) is the LED mode (0=off, 1=warning only, 2=low, 3=medium, 4=high, 5=highest) |
A CO2 sensor also has a property 0E (BOOL, rw) on its NODE unit, which the app calls the sensor mode.
If an error occurs the reason can be one of the following:
| Number | Description |
|---|---|
| 11 | Unknown command: the unit has no such command |
| 12 | Unknown unit |
| 13 | Unknown subunit: higher than the number of subunits, or the command isn't allowed on this subunit |
| 14 | Unknown property |
| 15 | A range or step size was asked for a type that has none (BOOL, STRING, VERSION) |
| 30 | Value not in range (on a set; the step size isn't checked), or an invalid argument for a command |
| 32 | The property can't be read (get) or written (set) |
| 40 | The reply doesn't fit |
| 41 | The request is too short, e.g. a missing property id, value or argument |
| 45 | The node didn't answer within 1 second (set by the bridge) |
| 52 | The bridge is still busy with another RMI to that node (set by the bridge) |
There are three commands which always exist on a given Unit:
-
0x01: Get a single propertyThis command reads a single property identified by the Unit, SubUnit and Property.
Syntax:
01 Unit SubUnit Type PropertyThe
Typecan be one of the following:- 0x00: None
- 0x10: Actual value
- 0x20: Range
- 0x40: Step size
Each writable property may have a range & step size. You can get those values by using the
0x20and0x40Typevalues. You can request multiple types at the same time by OR'ing the value.Example: Request:
01 1d 01 70 03, Response:a0 00 96 00 90 01 0a 00This gets the actual value, the range and the step size of the RMOT cooling threshold (an INT16) at once: 160 (16.0 °C), range 150 - 400, step 10.Reading the range and the step size together with the value costs no extra request.
Example: Request:
01 20 01 10 03, Response:34 32 31 30 00(4210\0) This gets the maintainer password. Unit isNODECONFIGURATION, SubUnit is01, get the actual value, Property03. -
0x02: Get multiple propertiesThis command allows to read multiple properties in one request.
Syntax:
02 Count Unit SubUnit Type Property1 Property2 ... PropertyN [Unit SubUnit Type Property1 ...]Countis the number of Unit/SubUnit groups that follow, so one request can read properties from several units at once. In each group, theTypevalue needs to be OR'ed with the number of properties of that group. So if you want to read the actual value of 5 properties, theTypevalue needs to be0x10 | 0x05=0x15. The official app puts at most 7 properties in a group. The response holds the values one after the other, in the order of the request.This document used to give the syntax as
02 Unit SubUnit 01 Type .... That reads the same bytes for the example below, because it reads one group (Count=01) from Unit01, SubUnit01, but not for other units. Checked on a unit with TEMPHUMCONTROL (0x1D), SubUnit01, properties0x0Aand0x0B: the syntax above,02 01 1D 01 12 0A 0B, repliede6 00 d2 00(230 and 210, the same as two single reads), while the old syntax,02 1D 01 01 12 0A 0B, got an RMI error.Reading several groups in one request was also checked on a unit:
02 02 1D 01 13 0A 08 02 01 01 12 14 06reads TEMPHUMCONTROL properties0x0A(INT16, the warm profile temperature),0x08(UINT8, the temperature profile mode) and0x02(INT16, the RMOT heating threshold), then NODE properties0x14(the name, a string ending with00) and0x06(the firmware version, 4 bytes). The reply held the five values back to back in that order, the same as five single reads.Example: Request:
02 01 01 01 15 03 04 06 05 14, Response:\02 BEA000000000000\00 \00\10\10\c0 \02 ComfoAirQ\00This reads the following property values of the NODE unit (the same ones the official app reads to identify a node):- 0x03: Product variant (
02is a ComfoAir Q450, seen on a unit) - 0x04: Serial Number
- 0x06: Firmware version
- 0x05: Hardware version †
- 0x14: Ventilation Unit Name
- 0x03: Product variant (
-
0x03: Set a single propertyThis commands sets one property to the given value. The value needs to be in the range as identified within 0x01, otherwise an error of 30 is returned. The step size, however, is not checked.
Syntax:
03 Unit SubUnit Property ValueExample:
03 1D 01 04 00Unit isTEMPHUMCONTROL, SubUnit01, Property:04, value00Sets the Property "Sensor ventilation: Temperature passive" to off
Property 0x01 of every unit is the zone of the node (UINT8, rw) †. It is a bit set: zone 1 is 01, zone 2 is 02,
zone 3 is 04, and so on up to zone 8 (80); the ComfoConnect LAN C reports ff (every zone). That is why so many
units answer 01 for property 0x01 in the tables below.
All other commands are >= 0x80 and dependent on the SubUnit. Please do not try to run command 0x80, 0x82 on NODECONFIGURATION (0x20), they will probably
break your configuration, and even worse would be calling ANY >= 0x80 command on NODE (0x01). It can probably completely brick your ventilation. (It enters
factory mode or tries to perform an update.)
Where this table had no access or format, or one that differs from the official app, the Access and Format columns now follow the app †.
| Unit | SubUnit | Property | Access | Format | Description |
|---|---|---|---|---|---|
| NODE | 0x01 | 0x01 | rw | UINT8 | Zone (bit set, see above) †; 01 = 1 |
| NODE | 0x01 | 0x02 | ro | UINT8 | Product id (01 = 1, ComfoAir Q) † |
| NODE | 0x01 | 0x03 | ro | UINT8 | Product variant: ComfoAir Q 1=Q350, 2=Q450 (seen on a unit), 3=Q600 †; ComfoAir Flex 1=250 (85 W), 2=350 (115 W), 3=350 (85 W). 02 = 2 |
| NODE | 0x01 | 0x04 | ro | STRING | Serial number (BEA009999999999) |
| NODE | 0x01 | 0x05 | ro | UINT8 | Hardware version (02 = 2, seen on a unit) |
| NODE | 0x01 | 0x06 | ro | UINT32 | Firmware version (See version_decode()) |
| NODE | 0x01 | 0x07 | ro | UINT32 | Version of the object definitions, encoded like the firmware version † (00541040) |
| NODE | 0x01 | 0x08 | ro | STRING | Model number (ComfoAir Q450 B R RF ST Quality) |
| NODE | 0x01 | 0x09 | ro | UINT32 | Version of the configuration data, encoded like the firmware version † (04000000) |
| NODE | 0x01 | 0x0A | ro | UINT32 | Version of the language data, encoded like the firmware version † (0004f0c0) |
| NODE | 0x01 | 0x0B | ro | STRING | Article number (471502004) |
| NODE | 0x01 | 0x0C | ro | STRING | Product serial number † (NULL) |
| NODE | 0x01 | 0x0D | ro | STRING | Current Country (BE) |
| NODE | 0x01 | 0x14 | rw | STRING | Ventilation Unit Name (ComfoAirQ); writable according to the app † |
| FILTER | 0x01 | 0x02 | rw | UINT16 | Filter warning period in days (21); a UINT16 in the app † |
| FILTER | 0x01 | 0x03 | rw | UINT16 | Filter lifetime in days (150); the app only uses it from firmware R1.9.0 on † |
| TEMPHUMCONTROL | 0x01 | 0x01 | rw | UINT8 | Zone † (01 = 1) |
| TEMPHUMCONTROL | 0x01 | 0x02 | rw | INT16 | RMOT for heating period (180 -> 18°C) |
| TEMPHUMCONTROL | 0x01 | 0x03 | rw | INT16 | RMOT for cooling period (200 -> 20°C) |
| TEMPHUMCONTROL | 0x01 | 0x04 | rw | UINT8 | Passive temperature control (0=off, 1=autoonly, 2=on) |
| TEMPHUMCONTROL | 0x01 | 0x05 | rw | UINT8 | Active temperature control (0=off, 1=autoonly, 2=on) † (00 = 0) |
| TEMPHUMCONTROL | 0x01 | 0x06 | rw | UINT8 | Humidity comfort control (o=off, 1=autoonly, 2=on) |
| TEMPHUMCONTROL | 0x01 | 0x07 | rw | UINT8 | Humidity protection (0=off, 1=autoonly, 2=on) |
| TEMPHUMCONTROL | 0x01 | 0x08 | rw | UINT8 | Temperature profile mode (0=adaptive, 1=fixed; a ComfoAir Q reports a range of 0-1) |
| TEMPHUMCONTROL | 0x01 | 0x0A | rw | INT16 | Target temperature for profile: Heating (230 -> 23°C) |
| TEMPHUMCONTROL | 0x01 | 0x0B | rw | INT16 | Target temperature for profile: Normal (210 -> 21°C) |
| TEMPHUMCONTROL | 0x01 | 0x0C | rw | INT16 | Target temperature for profile: Cooling (190 -> 19°C) |
| TEMPHUMCONTROL | 0x01 | 0x0D | rw | UINT8 | Temperature unit (0=Celsius, 1=Fahrenheit) † (00 = 0) |
| TEMPHUMCONTROL | 0x01 | 0x0E | rw | UINT8 | Speed of the passive temperature control (0=slow, 1=medium, 2=fast), from firmware R1.9.0 on † |
| VENTILATIONCONFIG | 0x01 | 0x01 | rw | UINT8 | Zone † (01 = 1) |
| VENTILATIONCONFIG | 0x01 | 0x02 | ro | UINT8 | Flags of the allowed presets † (0f = 15) |
| VENTILATIONCONFIG | 0x01 | 0x03 | rw | INT16 | Ventilation speed in "Away" Level (75); a UINT16 in the app † |
| VENTILATIONCONFIG | 0x01 | 0x04 | rw | INT16 | Ventilation speed in "Low" Level (110); a UINT16 in the app † |
| VENTILATIONCONFIG | 0x01 | 0x05 | rw | INT16 | Ventilation speed in "Medium" Level (180); a UINT16 in the app † |
| VENTILATIONCONFIG | 0x01 | 0x06 | rw | INT16 | Ventilation speed in "High" Level (370); a UINT16 in the app † |
| VENTILATIONCONFIG | 0x01 | 0x07 | rw | UINT8 | Height above sea level (0=0-500, 1=500-1000, 2=1000-1500, 3=1500-2000) |
| VENTILATIONCONFIG | 0x01 | 0x08 | ro | UINT16 | Measured maximum flow † (8b01 = 395) |
| VENTILATIONCONFIG | 0x01 | 0x09 | rw | UINT8 | Ventilation control mode (0=flow control, 1=constant flow) |
| VENTILATIONCONFIG | 0x01 | 0x0A | rw | INT16 | Unbalance in direct fan control (DFC) mode, in 0.1 % † (ecff = -20 -> -2.0 %) |
| VENTILATIONCONFIG | 0x01 | 0x0B | rw | UINT16 | Bathroom switch, activation delay (300 = 300 sec) |
| VENTILATIONCONFIG | 0x01 | 0x0C | rw | UINT8 | Bathroom switch, deactivation delay (30 = 30 min) |
| VENTILATIONCONFIG | 0x01 | 0x0D | rw | UINT8 | Bathroom switch, mode (0=fixed, 1=mirrored) |
| VENTILATIONCONFIG | 0x01 | 0x0E | rw | UINT8 | Airflow unit (1=kg/h, 2=l/s, 3=m³/h) † (03 = 3) |
| VENTILATIONCONFIG | 0x01 | 0x0F | rw | BOOL | Direct fan control (DFC) enabled † (00 = 0) |
| VENTILATIONCONFIG | 0x01 | 0x11 | rw | UINT16 | Flow in direct fan control (DFC) mode † (c800 = 200) |
| VENTILATIONCONFIG | 0x01 | 0x12 | rw | INT16 | Unbalance (9dff = -99 -> -9.9 %) |
| VENTILATIONCONFIG | 0x01 | 0x13 | ro | UINT16 | Maximum reference flow, exhaust fan † (0000 = 0) |
| VENTILATIONCONFIG | 0x01 | 0x14 | ro | UINT16 | Maximum reference flow, supply fan † (0000 = 0) |
| VENTILATIONCONFIG | 0x01 | 0x15 | ro | UINT16 | Maximum reference fan speed, exhaust fan † (980d = 3480) |
| VENTILATIONCONFIG | 0x01 | 0x16 | ro | UINT16 | Maximum reference fan speed, supply fan † (660c = 3174) |
| VENTILATIONCONFIG | 0x01 | 0x17 | ro | UINT16 | Medium reference flow, exhaust fan † (0000 = 0) |
| VENTILATIONCONFIG | 0x01 | 0x18 | ro | UINT16 | Medium reference flow, supply fan † (0000 = 0) |
| VENTILATIONCONFIG | 0x01 | 0x19 | ro | UINT16 | Medium reference fan speed, exhaust fan † (8107 = 1921) |
| VENTILATIONCONFIG | 0x01 | 0x1A | ro | UINT16 | Medium reference fan speed, supply fan † (a106 = 1697) |
| VENTILATIONCONFIG | 0x01 | 0x1B | ro | UINT16 | Fan speed at maximum pressure, exhaust fan † (0f05 = 1295) |
| VENTILATIONCONFIG | 0x01 | 0x1C | ro | UINT16 | Fan speed at maximum pressure, supply fan † (0c05 = 1292) |
| VENTILATIONCONFIG | 0x01 | 0x1D | ro | UINT16 | Expected fan speed without pressure, exhaust fan † (5304 = 1107) |
| VENTILATIONCONFIG | 0x01 | 0x1E | ro | UINT16 | Expected fan speed without pressure, supply fan † (1304 = 1043) |
| VENTILATIONCONFIG | 0x01 | 0x1F | ro | UINT16 | Expected maximum flow † |
| VENTILATIONCONFIG | 0x01 | 0x20 | rw | UINT8 | ComfoHood switch-off delay, from firmware R1.5.0 on † |
| NODECONFIGURATION | 0x01 | 0x01 | rw | UINT8 | Zone † (01 = 1) |
| NODECONFIGURATION | 0x01 | 0x03 | ro | STRING | Maintainer password (NL=4210, BE=2468, DE=4210); 4 characters † |
| NODECONFIGURATION | 0x01 | 0x04 | ro | BOOL | ComfoSense allowed †. This table listed the orientation here before; the app reads it from 0x06 |
| NODECONFIGURATION | 0x01 | 0x05 | ro | BOOL | ComfoSwitch allowed † (01 = 1) |
| NODECONFIGURATION | 0x01 | 0x06 | rw | UINT8 | Orientation (0=left, 1=right) † (00 = 0) |
| NODECONFIGURATION | 0x01 | 0x07 | rw | UINT8 | Position of the condensation drain (0=none, 1=left, 2=right) † (00 = 0) |
| NODECONFIGURATION | 0x01 | 0x08 | rw | BOOL | Fireplace present † (01 = 1) |
| NODECONFIGURATION | 0x01 | 0x0A | rw | UINT8 | User level of the menu (0=basic, 1=advanced, 2=installer) † (00 = 0) |
| NODECONFIGURATION | 0x01 | 0x0B | rw | UINT8 | Preset used to fine tune the airflow (0=away, 1=low, 2=medium, 3=high) † (02 = 2) |
| NODECONFIGURATION | 0x01 | 0x0C | rw | BOOL | Commissioning finished † (01 = 1) |
| NODECONFIGURATION | 0x01 | 0x0D | rw | UINT8 | Heat recovery type (0=HRV, 1=ERV), from firmware R1.5.0 on † |
The app also reads and writes these properties. None of them were checked on a unit.
| Unit | SubUnit | Property | Access | Format | Description |
|---|---|---|---|---|---|
| COMFOBUS | 0x01 | 0x02 | ro | BOOL | The CAN bus is off |
| COMFOBUS | 0x01 | 0x03 | ro | UINT8 | CAN receive error counter |
| COMFOBUS | 0x01 | 0x04 | ro | UINT8 | CAN transmit error counter |
| VALVE | 0x01-0x02 | 0x02 | rw | UINT16 | Valve position, in 0.1 % |
| FAN | 0x01-0x02 | 0x02 | ro | BOOL | The fan may be disabled |
| PREHEATER | 0x01 | 0x02 | ro | BOOL | Preheater present |
| PREHEATER | 0x01 | 0x03 | ro | UINT8 | Location of the preheater (0=left, 1=right) |
| PREHEATER | 0x01 | 0x04 | rw | UINT8 | Duty cycle, in % |
| PREHEATER | 0x01 | 0x05 | rw | UINT8 | Ratio, in % |
| HMI | 0x01 | 0x02 | ro | BOOL | Display present |
| HMI | 0x01 | 0x03 | rw | UINT8 | Brightness |
| HMI | 0x01 | 0x04 | rw | STRING | Language |
| HMI | 0x01 | 0x05 | rw | BOOL | Child lock |
| HMI | 0x01 | 0x06 | rw | UINT8 | Door state (also PDO 162) |
| HMI | 0x01 | 0x07 | rw | UINT8 | Button states (also PDO 161) |
| HMI | 0x01 | 0x08 | ro | BOOL | LCD operational (also PDO 160) |
| RFCOMMUNICATION | 0x01 | 0x02 | ro | BOOL | RF present |
| RFCOMMUNICATION | 0x01 | 0x03 | ro | BOOL | RF enabled |
| RFCOMMUNICATION | 0x01 | 0x04 | rw | UINT8 | Priority of RF sensors (0=on, 1=autoonly, 2=off) |
| RFCOMMUNICATION | 0x01 | 0x05 | rw | UINT8 | Function of RF sensors (0=flow proportional, 1=flow preset) |
| RFCOMMUNICATION | 0x01 | 0x06 | rw | UINT8 | RF duty, in % |
| TEMPERATURESENSOR | 0x01-0x06 | 0x02 | ro | BOOL | Sensor present |
| HUMIDITYSENSOR | 0x01-0x06 | 0x02 | ro | BOOL | Sensor present |
| PRESSURESENSOR | 0x01-0x02 | 0x02 | ro | BOOL | Sensor present |
| PERIPHERALS | 0x01 | 0x0B | ro | UINT8 | The ComfoCool that is attached |
| ANALOGINPUT | 0x00 | 0x01 | rw | UINT8 | Priority of the analog inputs (0=on, 1=autoonly, 2=off) |
| ANALOGINPUT | 0x00 | 0x02 | rw | UINT8 | Function of the analog inputs (0=flow proportional, 1=flow preset) |
| ANALOGINPUT | 0x00 | 0x03 | ro | BOOL | Analog inputs present |
| ANALOGINPUT | 0x01-0x04 | 0x02 | rw | UINT8 | Level for 0 % |
| ANALOGINPUT | 0x01-0x04 | 0x03 | rw | UINT8 | Level for 100 % |
| ANALOGINPUT | 0x01-0x04 | 0x04 | rw | UINT8 | Mode (0=steer, 1=control) |
| ANALOGINPUT | 0x01-0x04 | 0x05 | rw | UINT8 | Setpoint in control mode |
| ANALOGINPUT | 0x01-0x04 | 0x06 | rw | UINT8 | Proportional band in control mode, in % (0-255) |
| ANALOGINPUT | 0x01-0x04 | 0x07 | rw | UINT16 | Integral time in control mode |
| ANALOGINPUT | 0x01-0x04 | 0x08 | rw | BOOL | Input enabled |
| POSTHEATER | 0x01 | 0x03 | rw | INT16 | Proportional band |
| POSTHEATER | 0x01 | 0x04 | rw | UINT16 | Integral time |
| POSTHEATER | 0x01 | 0x05 | rw | INT16 | Comfort temperature, in 0.1 °C |
| CO2SENSOR | 0x00 | 0x01 | rw | UINT8 | Priority of the CO2 control (0=on, 1=autoonly, 2=off) |
| CO2SENSOR | 0x00 | 0x02 | rw | UINT8 | Function of the CO2 control (0=flow proportional, 1=flow preset) |
| CO2SENSOR | 0x01-0x08 | 0x02 | rw | UINT16 | Level for 0 % |
| CO2SENSOR | 0x01-0x08 | 0x03 | rw | UINT16 | Level for 100 % |
| CO2SENSOR | 0x01-0x08 | 0x05 | rw | UINT16 | Setpoint in control mode |
| CO2SENSOR | 0x01-0x08 | 0x06 | rw | UINT8 | Proportional band in control mode, in % (0-250) |
| CO2SENSOR | 0x01-0x08 | 0x07 | rw | UINT16 | Integral time in control mode |
| CO2SENSOR | 0x01-0x08 | 0x08 | rw | BOOL | CO2 control of the zone enabled |
On subunit 00 of ANALOGINPUT and CO2SENSOR, the app reads property 0x01 as the priority, not as the zone.
| Unit | SubUnit | Property | Access | Format | Description |
|---|---|---|---|---|---|
| NODE | 0x01 | 0x01 | rw | UINT8 | Zone † (ff = 255, every zone) |
| NODE | 0x01 | 0x02 | ro | UINT8 | Product id † (05 = 5, Zehnder gateway) |
| NODE | 0x01 | 0x03 | ro | UINT8 | Product variant † (00 = 0) |
| NODE | 0x01 | 0x04 | ro | STRING | Serial number (DEM0999999999) |
| NODE | 0x01 | 0x05 | ro | UINT8 | Hardware version † (01 = 1) |
| NODE | 0x01 | 0x06 | ro | UINT32 | Firmware version (See version_decode()) |
| NODE | 0x01 | 0x07 | ro | UINT32 | Version of the object definitions, encoded like the firmware version † (008c10c0) |
| NODE | 0x01 | 0x14 | rw | STRING | Unit Name (ComfoConnect LAN C) |
The ComfoClime reuses unit ids 0x16 and 0x17 for its own purposes, so these are not the VALVE and FAN
units of a ventilation unit. Reverse engineered from the ComfoClime's own HTTP API, which addresses these as
unit/subunit/property. All temperatures are stored in tenths of a degree.
| Unit | SubUnit | Property | Access | Format | Description |
|---|---|---|---|---|---|
| NODE | 0x01 | 0x04 | ro | STRING | Serial number (MBE0999999999) |
| NODE | 0x01 | 0x06 | ro | UINT32 | Firmware version (See version_decode()) |
| NODE | 0x01 | 0x14 | rw | STRING | Unit Name |
| CLIME_TEMPCONFIG | 0x01 | 0x02 | rw | UINT8 | Automatic season detection (0=off, 1=on) |
| CLIME_TEMPCONFIG | 0x01 | 0x03 | rw | UINT8 | Season (0=transition, 1=heating, 2=cooling) |
| CLIME_TEMPCONFIG | 0x01 | 0x04 | rw | INT16 | Heating curve knee point (5.0 - 15.0 °C) |
| CLIME_TEMPCONFIG | 0x01 | 0x05 | rw | INT16 | Cooling curve knee point (15.0 - 25.0 °C) |
| CLIME_TEMPCONFIG | 0x01 | 0x09 | rw | INT16 | Heating comfort temperature (15.0 - 25.0 °C) |
| CLIME_TEMPCONFIG | 0x01 | 0x0A | rw | INT16 | Cooling comfort temperature (20.0 - 28.0 °C) |
| CLIME_TEMPCONFIG | 0x01 | 0x0B | rw | INT16 | Maximum temperature while cooling (20.0 - 28.0 °C) |
| CLIME_TEMPCONFIG | 0x01 | 0x0C | rw | INT16 | Heating reduction delta (0.0 - 5.0 °C) |
| CLIME_TEMPCONFIG | 0x01 | 0x0D | rw | INT16 | Manual target temperature (18.0 - 28.0 °C) |
| CLIME_TEMPCONFIG | 0x01 | 0x15 | rw | UINT8 | Heat pump standby (0=active, 1=standby) |
| CLIME_TEMPCONFIG | 0x01 | 0x1D | rw | UINT8 | Temperature profile (0=comfort, 1=power, 2=eco) |
| CLIME_HEATPUMP | 0x01 | 0x03 | rw | INT16 | Heat pump maximum temperature (40.0 - 60.0 °C) |
| CLIME_HEATPUMP | 0x01 | 0x04 | rw | INT16 | Heat pump minimum temperature (10.0 - 17.0 °C) |
The ComfoClime also drives two properties on the ventilation unit node:
| Unit | SubUnit | Property | Access | Format | Description |
|---|---|---|---|---|---|
| TEMPHUMCONTROL | 0x01 | 0x02 | rw | INT16 | RMOT heating threshold (5.0 - 20.0 °C) |
| TEMPHUMCONTROL | 0x01 | 0x03 | rw | INT16 | RMOT cooling threshold (5.0 - 35.0 °C) |
0x80: GETSCHEDULEENTRY0x81: ENABLESCHEDULEENTRY0x82: DISABLESCHEDULEENTRY0x83: GETTIMERENTRY0x84: ENABLETIMERENTRY0x85: DISABLETIMERENTRY0x86: GETSCHEDULE0x87: GETTIMERS
Each subunit has one or more timers that override a setting. The request is command subunit timer:
0x83 subunit timer: get the timer. Reply:active(u8) delay(i32) duration(i32) remaining(i32) value(u8). An inactive timer keeps the fields of its last run, so only use them whenactiveis01.0x84 subunit timer delay(i32) duration(i32) value(u8): start the timer. A duration of-1runs until it is cancelled. A duration of1lets the unit pick its default (the speed and manual mode timers use this, like the official app).0x85 subunit timer: cancel the timer. The official app cancels all timers of a subunit at once with timer00†.0x87 subunit: get all timers of the subunit †. Reply: one byte, then the 14 bytes of the0x83reply for every timer of the subunit, from timer 1 on.
The constants are in aiocomfoconnect/const.py, and ComfoConnect has get_timer, set_timer and cancel_timer.
| SubUnit | Timer | Constants | Description |
|---|---|---|---|
| 0x01 | 0x01 | SCHEDULE_PRESET, TIMER_DEFAULT |
Fan speed (00=away/01=low/02=medium/03=high) |
| 0x01 | 0x02 | PRESETRF | |
| 0x01 | 0x03 | PRESETANALOG | |
| 0x01 | 0x04 | PRESETRFANALOG | |
| 0x01 | 0x05 | MANUALMODE | |
| 0x01 | 0x06 | SCHEDULE_PRESET, TIMER_BOOST |
Boost (03=high) |
| 0x01 | 0x07 | BOOSTRF | |
| 0x01 | 0x08 | BOOSTSWITCH | |
| 0x01 | 0x0b | SCHEDULE_PRESET, TIMER_AWAY |
Away (00=away) |
| 0x02 | 0x01 | SCHEDULE_BYPASS, TIMER_DEFAULT |
Bypass (01=on/02=off, no timer is auto) |
| 0x03 | 0x01 | SCHEDULE_TEMPERATURE_PROFILE, TIMER_DEFAULT |
Temperature profile (00=normal/01=cool/02=warm) |
| 0x04 | 0x01 | Standby (00=off/01=on) † |
|
| 0x05 | 0x01 | SCHEDULE_COMFOCOOL, TIMER_DEFAULT |
ComfoCool (00=auto/01=off in the official app) |
| 0x06 | 0x01 | SCHEDULE_SUPPLY_ONLY, TIMER_DEFAULT |
Exhaust fan off (01), so supply only |
| 0x07 | 0x01 | SCHEDULE_EXHAUST_ONLY, TIMER_DEFAULT |
Supply fan off (01), so exhaust only |
| 0x08 | 0x01 | SCHEDULE_MANUAL_MODE, TIMER_DEFAULT |
Manual mode (01=manual, no timer is auto) |
| 0x09 | 0x01 | ComfoHood (00=off/01=on) † |
|
| 0x09 | 0x02 | ComfoHood switch timer (00=off/01=on) † |
|
| 0x0a | 0x01 | Postheater (00=off/01=heat/02=comfort) † |
The durations the official app offers for a timer are 1, 2, 3, 6 and 12 hours and 1 day; for the ComfoCool and for
supply fan off (exhaust only) also "continuous", a duration of -1 †.
Next to the timers, every subunit has a week schedule of 10 entries. The official app reads and writes it like this:
0x86 subunit: get the whole schedule. Reply: 130 bytes, 13 bytes for each of the 10 entries.0x80 subunit entry: get one entry. Reply: the 13 bytes of that entry.0x81 subunit entry day hour minute duration(i32) value(u8): enable an entry. The app leaves entry00alone and adds new entries in the first free slot from01to09.0x82 subunit entry: disable an entry.
An entry is enabled(u8) day(u8) hour(u8) minute(u8) duration(i32) remaining(i32) value(u8): the entry starts at
hour:minute, lasts duration seconds (the app adds a day when the end time is earlier than the start time) and sets
the subunit to value, with the same values as the timers. When enabled is not 01 the rest of the entry has no
meaning. The days are: 00=every day, 01=Monday to 07=Sunday, 08=weekdays, 09=weekend, 0a=no day.
The PDOs with base 32 and 320 report the active entry and the enabled entries (see Schedule PDOs).
These commands are sent to subunit 0x01, e.g. 80 03 01.
0x80: GETACTIVEERRORS. The reply is a bit set of 32 bytes: bitnis set when errornis active.0x81 error: reset one error, given by its id (u8).0x82: RESETALLERRORS
After an error was reset, the node sends its alarm again.
| Error ID | Description |
|---|---|
| 21 | DANGER! OVERHEATING! Two or more sensors are detecting an incorrect temperature. Ventilation has stopped. |
| 22 | Temperature too high for ComfoAir Q (TEMP_HRU ERROR) |
| 23 | The extract air temperature sensor has a malfunction (SENSOR_ETA ERROR) |
| 24 | The extract air temperature sensor is detecting an incorrect temperature (TEMP_SENSOR_ETA ERROR) |
| 25 | The exhaust air temperature sensor has a malfunction (SENSOR_EHA ERROR) |
| 26 | The exhaust air temperature sensor is detecting an incorrect temperature (TEMP_SENSOR_EHA ERROR) |
| 27 | The outdoor air temperature sensor has a malfunction (SENSOR_ODA ERROR) |
| 28 | The outdoor air temperature sensor is detecting an incorrect temperature (TEMP_SENSOR_ODA ERROR) |
| 29 | The pre-conditioned outdoor air temperature sensor has a malfunction |
| 30 | The pre-conditioned outdoor air temperature sensor is detecting an incorrect temperature (TEMP_SENSOR_P-ODA ERROR) |
| 31 | The supply air temperature sensor has a malfunction (SENSOR_SUP ERROR) |
| 32 | The supply air temperature sensor is detecting an incorrect temperature (TEMP_SENSOR_SUP ERROR) |
| 33 | The Ventilation Unit has not been commissioned (INIT ERROR) |
| 34 | The front door is open |
| 35 | The Pre-heater is present, but not in the correct position (right/left). (PREHEAT_LOCATION ERROR) |
| 37 | The pre-heater has a malfunction (PREHEAT ERROR) |
| 38 | The pre-heater has a malfunction (PREHEAT ERROR) |
| 39 | The extract air humidity sensor has a malfunction (SENSOR_ETA ERROR) |
| 41 | The exhaust air humidity sensor has a malfunction (SENSOR_EHA ERROR) |
| 43 | The outdoor air humidity sensor has a malfunction (SENSOR_ODA ERROR) |
| 45 | The outdoor air humidity sensor has a malfunction (SENSOR_P-ODA ERROR) |
| 47 | The supply air humidity sensor has a malfunction (SENSOR_SUP ERROR) |
| 49 | The exhaust air flow sensor has a malfunction (SENSOR_EHA ERROR) |
| 50 | The supply air flow sensor has a malfunction (SENSOR_SUP ERROR) |
| 51 | The extract air fan has a malfunction (FAN_EHA ERROR) |
| 52 | The supply air fan has a malfunction (FAN_SUP ERROR) |
| 53 | Exhaust air pressure too high. Check air outlets, ducts and filters for pollution and obstructions. Check valve settings (EXT_PRESSURE_EHA ERROR) |
| 54 | Supply air pressure too high. Check air outlets, ducts and filters for pollution and obstructions. Check valve settings. (EXT_PRESSURE_SUP ERROR) |
| 55 | The extract air fan has a malfunction (FAN_EHA ERROR) |
| 56 | The supply air fan has a malfunction (FAN_SUP ERROR) |
| 57 | The exhaust air flow is not reaching its set point (AIRFLOW_EHA ERROR) |
| 58 | The supply air flow is not reaching its set point (AIRFLOW_SUP ERROR) |
| 59 | Failed to reach required temperature too often for outdoor air after pre-heater (TEMPCONTROL_P-ODA ERROR) |
| 60 | Failed to reach required temperature too often for supply air. The modulating by-pass may have a malfunction. (TEMPCONTROL_SUP ERROR) |
| 61 | Supply air temperature is too low too often (TEMP_SUP_MIN ERROR) |
| 62 | Unbalance occurred too often beyond tolerance levels in past period (UNBALANCE ERROR) |
| 63 | Postheater was present, but is no longer detected (POSTHEAT_CONNECT ERROR) |
| 64 | Temperature sensor value for supply air ComfoCool exceeded limit too often (CCOOL_TEMP ERROR) |
| 65 | Room temperature sensor was present, but is no longer detected (T_ROOM_PRES ERROR) |
| 66 | RF Communication hardware was present, but is no longer detected (RF_PRES ERROR) |
| 67 | Option Box was present, but is no longer detected (OPTION_BOX CONNECT ERROR) |
| 68 | Pre-heater was present, but is no longer detected (PREHEAT_PRES ERROR) |
| 69 | Postheater was present, but is no longer detected (POSTHEAT_CONNECT ERROR) |
| # Firmware 1.4.0+ (the official app uses this numbering for every version except exactly R1.4.0 †) | |
| 70 | Analog input 1 was present, but is no longer detected (ANALOG_1_PRES ERROR) |
| 71 | Analog input 2 was present, but is no longer detected (ANALOG_2_PRES ERROR) |
| 72 | Analog input 3 was present, but is no longer detected (ANALOG_3_PRES ERROR) |
| 73 | Analog input 4 was present, but is no longer detected (ANALOG_4_PRES ERROR) |
| 74 | ComfoHood was present, but is no longer detected (HOOD_CONNECT ERROR) |
| 75 | ComfoCool was present, but is no longer detected (CCOOL_CONNECT ERROR) |
| 76 | ComfoFond was present, but is no longer detected (GROUND_HEAT_CONNECT ERROR) |
| 77 | The filters of the Ventilation Unit must be replaced now |
| 78 | It is necessary to replace or clean the external filter |
| 79 | Order new filters now, because the remaining filter life time is limited |
| 80 | Service mode is active (SERVICE MODE) |
| 81 | Preheater has no communication with the ComfoAir unit (PREHEAT ERROR , 1081) |
| 82 | ComfoHood temperature error (HOOD_TEMP ERROR) |
| 83 | Postheater temperature error (POSTHEAT_TEMP ERROR) |
| 84 | Outdoor temperature of ComfoFond error (GROUND_HEAT_TEMP ERROR) |
| 85 | Analog input 1 error (ANALOG_1_IN ERROR) |
| 86 | Analog input 2 error (ANALOG_2_IN ERROR) |
| 87 | Analog input 3 error (ANALOG_3_IN ERROR) |
| 88 | Analog input 4 error (ANALOG_4_IN ERROR) |
| 89 | Bypass is in manual mode |
| 90 | ComfoCool is overheating |
| 91 | ComfoCool compressor error (CCOOL_COMPRESSOR ERROR) |
| 92 | ComfoCool room temperature sensor error (CCOOL_TEMP ERROR) |
| 93 | ComfoCool condensor temperature sensor error (CCOOL_TEMP ERROR) |
| 94 | ComfoCool supply air temperature sensor error (CCOOL_TEMP ERROR) |
| 95 | ComfoHood temperature is too high (HOOD_TEMP ERROR) |
| 96 | ComfoHood is activated |
| 97 | UNKNOWN: QM_Constraint_min_ERR |
| 98 | UNKNOWN: H_21_qm_min_ERR |
| 99 | Configuration error |
| 100 | Error analysis is in progress… |
| 101 | ComfoNet Error |
| 102 | The number of CO2 sensors has decreased – one or more sensors are no longer detected |
| 103 | More than 8 sensors detected in a zone |
| 104 | CO₂ Sensor C error |
| 105 | General I²C bus error † |
| # Firmware 1.4.0 (the official app uses this numbering only for exactly R1.4.0 †) | |
| 70 | ComfoHood was present, but is no longer detected (HOOD_CONNECT ERROR) |
| 71 | ComfoCool was present, but is no longer detected (CCOOL_CONNECT ERROR) |
| 72 | ComfoFond was present, but is no longer detected (GROUND_HEAT_CONNECT ERROR) |
| 73 | The filters of the Ventilation Unit must be replaced now |
| 74 | It is necessary to replace or clean the external filter |
| 75 | Order new filters now, because the remaining filter life time is limited |
| 76 | Service mode is active (SERVICE MODE) |
| 77 | Preheater has no communication with the ComfoAir unit (PREHEAT ERROR , 1081) |
| 78 | ComfoHood temperature error (HOOD_TEMP ERROR) |
| 79 | Postheater temperature error (POSTHEAT_TEMP ERROR) |
| 80 | Outdoor temperature of ComfoFond error (GROUND_HEAT_TEMP ERROR) |
| 81 | Bypass is in manual mode |
| 82 | ComfoCool is overheating |
| 83 | ComfoCool compressor error (CCOOL_COMPRESSOR ERROR) |
| 84 | ComfoCool room temperature sensor error (CCOOL_TEMP ERROR) |
| 85 | ComfoCool condensor temperature sensor error (CCOOL_TEMP ERROR) |
| 86 | ComfoCool supply air temperature sensor error (CCOOL_TEMP ERROR) |
The official app uses these commands of the ventilation unit. Like the warning above says, some of them change the configuration or the state of the unit, so don't try them on a unit you care about.
| Unit | Command | Arguments | Description |
|---|---|---|---|
| NODE | 0x80 |
Enter update mode | |
| NODE | 0x81 |
Enter factory mode | |
| NODE | 0x82 |
Enter operational mode | |
| NODE | 0x83 |
Enter service mode | |
| NODECONFIGURATION | 0x80 |
which (u8) | Revert to defaults: 0=factory, 1=installer, 2=user without the schedules, 3=user with the schedules |
| NODECONFIGURATION | 0x82 |
event (u8) | Commissioning wizard: 0=abort, 1=finish, 2=stop and save, 3=start |
| FAN | 0x81 |
one byte | Enable the fan |
| FAN | 0x82 |
Disable the fan | |
| POWERSENSOR | 0x80 |
Reset the analysis | |
| PREHEATER | 0x80 |
Reset the analysis | |
| HMI | 0x80 |
Get the languages | |
| RFCOMMUNICATION | 0x80 |
Start pairing an RF device (follow it with PDO 176) | |
| RFCOMMUNICATION | 0x81 |
Stop pairing | |
| FILTER | 0x80 |
Begin the filter replacement | |
| FILTER | 0x81 |
End the filter replacement | |
| FILTER | 0x82 |
Abort the filter replacement | |
| FILTER | 0x83 |
Reset the days left of the filter | |
| VENTILATIONCONFIG | 0x80 |
Set the airflow units | |
| PERIPHERALS | 0x80 |
Reset the presence of the peripherals | |
| ERRORLOGGING | 0x80 |
type (u8): 0=error, 1=assert | Get the number of log entries |
| ERRORLOGGING | 0x81 |
Get a log entry | |
| COMPONENTCHECK | 0x80 |
component (u8) | Start the check of 0=none, 1=fan, 2=bypass, 3=preheater, 4=postheater, 5=ComfoFond, 6=ComfoCool |
| COMPONENTCHECK | 0x81 |
Stop the check | |
| COMPONENTCHECK | 0x82 |
Reset the timer of the check | |
| SERVICEPRINT | 0x7e |
Get the number of countries | |
| SERVICEPRINT | 0x7f |
index (u8) | Get the name of a country |
| SERVICEPRINT | 0x80 |
country (string) | Get the number of article numbers |
| SERVICEPRINT | 0x81 |
country (string), index (u8) | Get an article number |
| SERVICEPRINT | 0x82 |
two strings | Get the description of an article |
| SERVICEPRINT | 0x83 |
two strings | Install an article |
See the comfoconnect.py file for more commands and how they are constructed.
| Command | Description |
|---|---|
84 15 01 01 00000000 01000000 00 |
Switch to fan speed away |
84 15 01 01 00000000 01000000 01 |
Switch to fan speed 1 |
84 15 01 01 00000000 01000000 02 |
Switch to fan speed 2 |
84 15 01 01 00000000 01000000 03 |
Switch to fan speed 3 |
84 15 01 06 00000000 58020000 03 |
Boost mode: start for 10m (= 600 seconds = 0x0258) |
85 15 01 06 |
Boost mode: end |
85 15 08 01 |
Switch to auto mode |
84 15 08 01 00000000 01000000 01 |
Switch to manual mode |
84 15 06 01 00000000 100e0000 01 |
Set ventilation mode: supply only for 1 hour |
85 15 06 01 |
Set ventilation mode: balance mode |
84 15 03 01 00000000 ffffffff 00 |
Set temperature profile: normal |
84 15 03 01 00000000 ffffffff 01 |
Set temperature profile: cool |
84 15 03 01 00000000 ffffffff 02 |
Set temperature profile: warm |
84 15 02 01 00000000 100e0000 01 |
Set bypass: activated for 1 hour |
84 15 02 01 00000000 100e0000 02 |
Set bypass: deactivated for 1 hour |
85 15 02 01 |
Set bypass: auto |
03 1d 01 04 00 |
Set sensor ventilation: temperature passive: off |
03 1d 01 04 01 |
Set sensor ventilation: temperature passive: auto only |
03 1d 01 04 02 |
Set sensor ventilation: temperature passive: on |
03 1d 01 06 00 |
Set sensor ventilation: humidity comfort: off |
03 1d 01 06 01 |
Set sensor ventilation: humidity comfort: auto only |
03 1d 01 06 02 |
Set sensor ventilation: humidity comfort: on |
03 1d 01 07 00 |
Set sensor ventilation: humidity protection: off |
03 1d 01 07 01 |
Set sensor ventilation: humidity protection: auto |
03 1d 01 07 02 |
Set sensor ventilation: humidity protection: on |