Port of ComfoAir protocol to ESPHome.io firmware originally by @wichers modified by @nyxnyx to be installed as external_components. Modified for the Zehnder WHR 950 by @tieskuh. Also confirmed working for the Zehnder WHR 930.
Note: Updated for the latest ESPHome (verified to compile on 2026.5). Earlier versions no longer built due to changes in the ESPHome
ClimateTraitsAPI and component includes.
Add to your yaml configuration the definition of external_components:
external_components:
- source:
type: git
url: https://github.com/tieskuh/esphome-comfoair
components: [comfoair]
refresh: 0s
And than add the uart configuration and component. Pin 22 and 19 are used for the M5Stack Atom Lite with the RS-232 addon. For the Atom S3 Lite with the RS-232 addon use rx_pin 5 and tx_pin 6.
uart:
id: uart_bus
rx_pin: 22
tx_pin: 19
baud_rate: 9600
comfoair:
name: "WHR 950"
id: comfoair_climate
uart_id: uart_bus
fan_supply_air_percentage:
name: "Supply fan"
fan_exhaust_air_percentage:
name: "Exhaust fan"
fan_speed_supply:
name: "Supply fan speed"
fan_speed_exhaust:
name: "Exhaust fan speed"
is_bypass_valve_open:
name: "Bypass"
is_preheating:
name: "Preheating"
outside_air_temperature:
name: "Outside temperature"
supply_air_temperature:
name: "Supply temperature"
return_air_temperature:
name: "Return temperature"
exhaust_air_temperature:
name: "Exhaust temperature"
is_supply_fan_active:
name: "Supply fan"
is_filter_full:
name: "Filter status"
bypass_step:
name: "Bypass valve"
is_summer_mode:
name: "Summer mode"
button:
- platform: template
name: "Reset filter"
on_press:
then:
- lambda: |-
id(comfoair_climate)->reset_filter();
The following sensors are created in Homeassistant. With the climate entity, it is possible to change the fan speed.
I used the following hardware:
- RS-232 cable with DB9 D-SUB male connector
- M5Stack Atom Lite: https://nl.aliexpress.com/item/1005003299215808.html (Atom S3 Lite also confirmed to be working)
- M5Stack RS-232 add-on: https://nl.aliexpress.com/item/1005005933403536.html
- 12v to 5v USB-C adapter: https://nl.aliexpress.com/item/1005004984244010.html
Pin layout:
- RX (receive) = pin 2
- TX (transmit) = pin 3
- GND (ground) = pin 5
(If it doesn't work, try to switch RX and TX. The RX on one end should be the TX on the other end.)
To power the M5Stack, I used a 12v to 5v USB-C adapter and powered the M5Stack via USB-C. There are unused 12v connectors on the WHR's board. Or just use a normal 220v USB adapter.





