Zehnder ComfoAir CA350 integration via serial connection (RS232) and MQTT

could you elaborate on that? i assume you dont have exhaust air vents in the rooms like living room etc… so why it should distribute smell around entire house?

thanks

Well, because I have (and most houses will have as well) exhaust vents not only in the kitchen where the smell is produced but also in the bathrooms or in the corridor on a second floor. So the air will go all over the house. If you keep doors shut in the rooms with supply vents only most likely they’ll be ok but if the door is open you’ll always have some air exchange with the other rooms. So creating pressure imbalance - higher pressure from the active supply fan there is much more air going out only through the kitchen hood hence preventing the smells going around the house.
It is even the standard behaviour of the Comfoair system if you have the kitchen hood switch connected to it.

can you share your automations to control humidity levels? That would be inspirational!

Well, it is quite simple:

alias: Vent - Airing on humidity or presence
description: ""
mode: single
triggers:
  - entity_id: sensor.aeon_labs_zw100_multisensor_6_relative_humidity
    above: "64"
    trigger: numeric_state
  - entity_id: binary_sensor.aeon_labs_zw100_multisensor_6_home_security_motion_detection
    to: "on"
    for:
      hours: 0
      minutes: 6
      seconds: 0
    trigger: state
  - entity_id: sensor.sensor_bathroom_upstairs_humidity
    above: "65"
    trigger: numeric_state
conditions:
  - condition: state
    entity_id: input_select.fan_mode
    state: low
  - condition: state
    entity_id: group.allpersons
    state: home
  - condition: time
    after: "05:00:00"
    before: "22:30:00"
actions:
  - data: {}
    action: script.fan_medium_20min

and here is the script called in the actions:

alias: Vent - Airing Medium 20 minutes
sequence:
  - data:
      entity_id: script.fan_high_10min
    action: script.turn_off
  - data:
      entity_id: climate.ca350_climate
      fan_mode: medium
    action: climate.set_fan_mode
  - data:
      entity_id: input_select.wietrzenie
      option: medium
    action: input_select.select_option
  - choose:
      - conditions:
          - condition: or
            conditions:
              - condition: state
                entity_id: select.ca350_fan_control
                state: "off"
              - condition: state
                entity_id: select.ca350_fan_control
                state: In
        sequence:
          - data:
              option: Both
            target:
              entity_id: select.ca350_fan_control
            action: select.select_option
  - delay: "00:20:00"
  - data:
      entity_id: climate.ca350_climate
      fan_mode: low
    action: climate.set_fan_mode
  - data:
      entity_id: input_select.wietrzenie
      option: "off"
    action: input_select.select_option
mode: restart
1 Like

Cool thank you. One question: why do you use relative humidity instead of absolute? I believe absolute is more precise as relative depends on the temperature as well

I’m using the one that my sensors provide. No choice here

Alright if you are interested there’s a handy integration called thermal comfort which gives you all the data starting from temp and relative humidity

Hello guys!

I’ve tried to use julianpas/esphome-comfoair repo to communicate with my Zehnder CA 550. The ESP32 starts up normally and appears to run fine, but as soon as I power on my Zehnder CA 550 and communication begins between the ESP32 and the ventilation unit, the ESP32 freezes after a few seconds.

With the original code from wichers repo, the ESP32 communicates with the Zehnder unit reliably without any freeze ('m using the same ESP32 hardware and wiring for both your fork and the original repo).

Some details:

Logs:

INFO ESPHome 2025.4.1
INFO Reading configuration /config/esphome/esphome-web-8ab534.yaml...
INFO Starting log output from 192.168.68.53 using esphome API
INFO Successfully connected to esphome-web-8ab534 @ 192.168.68.53 in 2.054s
INFO Successful handshake with esphome-web-8ab534 @ 192.168.68.53 in 0.022s
[11:18:45][I][app:100]: ESPHome version 2025.4.1 compiled on May 2 2025, 11:04:26
[11:18:45][C][wifi:600]: WiFi:
[11:18:45][C][wifi:428]: Local MAC: 5C:01:3B:8A:B5:34
[11:18:45][C][wifi:433]: SSID: [redacted]
[11:18:45][C][wifi:436]: IP Address: 192.168.68.53
[11:18:45][C][wifi:440]: BSSID: [redacted]
[11:18:45][C][wifi:441]: Hostname: 'esphome-web-8ab534'
[11:18:45][C][wifi:443]: Signal strength: -24 dB ▂▄▆█
[11:18:45][V][wifi:445]: Priority: 0.0
[11:18:45][C][wifi:447]: Channel: 1
[11:18:45][C][wifi:448]: Subnet: 255.255.255.0
[11:18:45][C][wifi:449]: Gateway: 192.168.68.1
[11:18:45][C][wifi:450]: DNS1: 8.8.8.8
[11:18:45][C][wifi:451]: DNS2: 0.0.0.0
[11:18:45][C][logger:177]: Logger:
[11:18:45][C][logger:178]: Max Level: VERBOSE
[11:18:45][C][logger:179]: Initial Level: VERBOSE
[11:18:45][C][logger:181]: Log Baud Rate: 0
[11:18:45][C][logger:182]: Hardware UART: UART0
[11:18:45][C][uart.arduino_esp32:151]: UART Bus 0:
[11:18:45][C][uart.arduino_esp32:152]: TX Pin: GPIO17
[11:18:45][C][uart.arduino_esp32:153]: RX Pin: GPIO16
[11:18:45][C][uart.arduino_esp32:155]: RX Buffer Size: 256
[11:18:45][C][uart.arduino_esp32:157]: Baud Rate: 9600 baud
[11:18:45][C][uart.arduino_esp32:158]: Data Bits: 8
[11:18:45][C][uart.arduino_esp32:159]: Parity: NONE
[11:18:45][C][uart.arduino_esp32:160]: Stop bits: 1
[11:18:45][C][uart.arduino_esp32:151]: UART Bus 1:
[11:18:45][C][uart.arduino_esp32:152]: TX Pin: GPIO1
[11:18:45][C][uart.arduino_esp32:153]: RX Pin: GPIO3
[11:18:45][C][uart.arduino_esp32:155]: RX Buffer Size: 256
[11:18:45][C][uart.arduino_esp32:157]: Baud Rate: 9600 baud
[11:18:45][C][uart.arduino_esp32:158]: Data Bits: 8
[11:18:45][C][uart.arduino_esp32:159]: Parity: NONE
[11:18:45][C][uart.arduino_esp32:160]: Stop bits: 1
[11:18:45][C][switch.gpio:068]: GPIO Switch 'Test Switch'
[11:18:45][C][switch.gpio:091]: Restore Mode: always OFF
[11:18:45][C][switch.gpio:031]: Pin: GPIO25
[11:18:45][C][comfoair:149]: ComfoAir:
[11:18:45][C][comfoair:152]: Bootloader WHR 960 v3.60 b32
[11:18:45][C][comfoair:154]: Firmware WHR 960 v3.60 b32
[11:18:45][C][comfoair:156]: Connector Board Luxe CA350 v3.22
[11:18:45][C][mdns:116]: mDNS:
[11:18:45][C][mdns:117]: Hostname: esphome-web-8ab534
[11:18:45][V][mdns:118]: Services:
[11:18:45][V][mdns:120]: - _esphomelib, _tcp, 6053
[11:18:45][V][mdns:122]: TXT: friendly_name = ESP-Rekuperacja-3
[11:18:45][V][mdns:122]: TXT: version = 2025.4.1
[11:18:45][V][mdns:122]: TXT: mac = 5c013b8ab534
[11:18:45][V][mdns:122]: TXT: platform = ESP32
[11:18:45][V][mdns:122]: TXT: board = esp32dev
[11:18:45][V][mdns:122]: TXT: network = wifi
[11:18:45][C][esphome.ota:073]: Over-The-Air updates:
[11:18:45][C][esphome.ota:074]: Address: 192.168.68.53:3232
[11:18:45][C][esphome.ota:075]: Version: 2
[11:18:45][C][safe_mode:018]: Safe Mode:
[11:18:45][C][safe_mode:020]: Boot considered successful after 60 seconds
[11:18:45][C][safe_mode:021]: Invoke after 10 boot attempts
[11:18:45][C][safe_mode:023]: Remain in safe mode for 300 seconds
[11:18:45][W][safe_mode:029]: Last reset occurred too quickly; safe mode will be invoked in 8 restarts
[11:18:45][C][api:140]: API Server:
[11:18:45][C][api:141]: Address: 192.168.68.53:6053
[11:18:45][C][api:145]: Using noise encryption: NO
[11:18:47][D][comfoair:896]: getting fan status
[11:18:47][V][comfoair:246]: Response 0xD6 from confosense with 2 bytes.
[11:18:47][V][comfoair:246]: Response 0x0C from confosense with 14 bytes.
[11:18:47][V][sensor:043]: 'intake_fan_speed': Received new state 15.000000
[11:18:47][D][sensor:094]: 'intake_fan_speed': Sending state 15.00000 % with 0 decimals of accuracy
[11:18:47][V][sensor:043]: 'exhaust_fan_speed': Received new state 15.000000
[11:18:47][D][sensor:094]: 'exhaust_fan_speed': Sending state 15.00000 % with 0 decimals of accuracy
[11:18:47][V][sensor:043]: 'intake_fan_speed_rpm': Received new state 462.278107
[11:18:47][D][sensor:094]: 'intake_fan_speed_rpm': Sending state 462.27811 RPM with 0 decimals of accuracy
[11:18:47][V][sensor:043]: 'exhaust_fan_speed_rpm': Received new state 471.579468
[11:18:47][D][sensor:094]: 'exhaust_fan_speed_rpm': Sending state 471.57947 RPM with 0 decimals of accuracy
[11:18:49][D][comfoair:905]: getting valve status
[11:18:49][V][comfoair:246]: Response 0x0C from confosense with 2 bytes.
[11:18:49][V][comfoair:246]: Response 0x0E from confosense with 12 bytes.
[11:18:49][V][sensor:043]: 'bypass_valve': Received new state 0.000000
[11:18:49][D][sensor:094]: 'bypass_valve': Sending state 0.00000 % with 0 decimals of accuracy
[11:18:49][D][binary_sensor:036]: 'bypass_valve_open': Sending state OFF
[11:18:49][D][binary_sensor:036]: 'preheating_state': Sending state OFF
[11:18:49][V][sensor:043]: 'motor_current_bypass': Received new state 0.000000
[11:18:49][D][sensor:094]: 'motor_current_bypass': Sending state 0.00000 A with 1 decimals of accuracy
[11:18:49][V][sensor:043]: 'motor_current_preheating': Received new state 0.000000
[11:18:49][D][sensor:094]: 'motor_current_preheating': Sending state 0.00000 A with 1 decimals of accuracy
[11:18:49][W][component:239]: Component esphome.coroutine took a long time for an operation (53 ms).
[11:18:49][W][component:240]: Components should block for at most 30 ms.
[11:18:51][D][comfoair:940]: getting sensor data
[11:18:51][V][comfoair:246]: Response 0x0E from confosense with 2 bytes.
[11:18:51][V][comfoair:246]: Response 0x98 from confosense with 28 bytes.
[11:18:51][V][sensor:043]: 'enthalpy_temperature': Received new state -20.000000
[11:18:51][D][sensor:094]: 'enthalpy_temperature': Sending state -20.00000 °C with 1 decimals of accuracy
[11:18:53][D][comfoair:946]: getting ventilation level
[11:18:53][V][comfoair:246]: Response 0x98 from confosense with 2 bytes.
[11:18:53][V][comfoair:246]: Response 0xCE from confosense with 22 bytes.
[11:18:53][D][comfoair:523]: Level 01
[11:18:53][W][comfoair:524]: Off ab 15 - Off zu 15 - Low ab 35 - Low zu 35 - Middle ab 50 - Middle zu 50 - High ab 80 - High zu 77
[11:18:53][V][sensor:043]: 'return_air_level': Received new state 15.000000
[11:18:53][D][sensor:094]: 'return_air_level': Sending state 15.00000 m³ with 1 decimals of accuracy
[11:18:53][V][sensor:043]: 'supply_air_level': Received new state 15.000000
[11:18:53][D][sensor:094]: 'supply_air_level': Sending state 15.00000 m³ with 1 decimals of accuracy

>>>>> LOGS FREEZE HERE so I closed the window and started logs again<<<<

INFO Starting log output from 192.168.68.53 using esphome API
INFO Successfully connected to esphome-web-8ab534 @ 192.168.68.53 in 7.212s
WARNING Can't connect to ESPHome API for esphome-web-8ab534 @ 192.168.68.53: Timeout waiting for HelloResponse, ConnectResponse after 30.0s (TimeoutAPIError)
INFO Trying to connect to esphome-web-8ab534 @ 192.168.68.53 in the background
WARNING esphome-web-8ab534 @ 192.168.68.53: Connection error occurred: esphome-web-8ab534 @ 192.168.68.53: Connection lost
INFO Successfully connected to esphome-web-8ab534 @ 192.168.68.53 in 0.012s
INFO Successful handshake with esphome-web-8ab534 @ 192.168.68.53 in 2.322s
[11:20:27][I][app:100]: ESPHome version 2025.4.1 compiled on May 2 2025, 11:04:26
[11:20:27][C][wifi:600]: WiFi:
[11:20:27][C][wifi:428]: Local MAC: 5C:01:3B:8A:B5:34
WARNING esphome-web-8ab534 @ 192.168.68.53: Connection error occurred: [Errno 104] Connection reset by peer
INFO Processing unexpected disconnect from ESPHome API for esphome-web-8ab534 @ 192.168.68.53
WARNING Disconnected from API
WARNING Can't connect to ESPHome API for esphome-web-8ab534 @ 192.168.68.53: Error connecting to [AddrInfo(family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, proto=6, sockaddr=IPv4Sockaddr(address='192.168.68.53', port=6053))]: [Errno 111] Connect call failed ('192.168.68.53', 6053) (SocketAPIError)

The above pattern repeats consistently every time, and it does not matter whether I have comfosense connected or not. Has anyone else encountered this problem?

Can you describe how you wired the ESP32 up? It seems like you have wired the unit to the second UART which is meant to proxy the ComfoSense commands.

Hi Julian! Thanks for responding!
I’ve triple-checked the wiring and it is the same as in the image from the post above, so:
the units TX/RX → level shifter channel 1 RX/TX → esp32 RX/TX pins (3/1)
comfosense TX/RX → level shifter channel2 RX/TX → esp32 pins 16/17

Here is my yaml:

esphome:
  name: esphome-web-8ab534
  friendly_name: ESP-Rekuperacja-3
  min_version: 2024.11.0
  name_add_mac_suffix: false

esp32:
  board: esp32dev
  framework:
    type: arduino

logger:
  baud_rate: 0
  level: VERY_VERBOSE

# Enable Home Assistant API
api:

# Allow Over-The-Air updates
ota:
  - platform: esphome

wifi:
  ssid: "[cut]"
  password: "[cut]"
  domain: .local
  reboot_timeout: 15min
  power_save_mode: NONE
  fast_connect: False
  passive_scan: False
  output_power: 20.0dB
  enable_on_boot: True
  manual_ip:
    static_ip: 192.168.68.53
    gateway: 192.168.68.1
    subnet: 255.255.255.0
    dns1: 8.8.8.8
  use_address: 192.168.68.53
  ap:
    ssid: "Rekuperacja Fallback Hotspot"

switch:
  - platform: gpio
    pin: GPIO25
    name: "Test Switch"

sensor:

binary_sensor:

external_components:
  - source:
      type: git
      url: https://github.com/julianpas/esphome-comfoair
    components: [comfoair]

uart:
  - id: uart_bus
    rx_pin: 3
    tx_pin: 1
    baud_rate: 9600
  - id: uart_proxy
    rx_pin: 16
    tx_pin: 17
    baud_rate: 9600

comfoair:
  name: "ComfoAir 350"
  id: "comfoair_climate"
  uart_id: uart_bus
  proxy_uart: uart_proxy
  type:
    name: "type"
  size:

Here are the logs:

INFO ESPHome 2025.4.1
INFO Reading configuration /config/esphome/esphome-web-8ab534.yaml...
INFO Starting log output from 192.168.68.53 using esphome API
INFO Successfully connected to esphome-web-8ab534 @ 192.168.68.53 in 0.005s
INFO Successful handshake with esphome-web-8ab534 @ 192.168.68.53 in 0.023s
[16:33:58][I][app:100]: ESPHome version 2025.4.1 compiled on May 11 2025, 16:32:08
[16:33:58][C][wifi:600]: WiFi:
[16:33:58][C][wifi:428]:   Local MAC: 5C:01:3B:8A:B5:34
[16:33:58][C][wifi:433]:   SSID: [redacted]
[16:33:58][C][wifi:436]:   IP Address: 192.168.68.53
[16:33:58][C][wifi:440]:   BSSID: [redacted]
[16:33:58][C][wifi:441]:   Hostname: 'esphome-web-8ab534'
[16:33:58][C][wifi:443]:   Signal strength: -44 dB ▂▄▆█
[16:33:58][V][wifi:445]:   Priority: 0.0
[16:33:58][C][wifi:447]:   Channel: 1
[16:33:58][C][wifi:448]:   Subnet: 255.255.255.0
[16:33:58][C][wifi:449]:   Gateway: 192.168.68.1
[16:33:58][C][wifi:450]:   DNS1: 8.8.8.8
[16:33:58][C][wifi:451]:   DNS2: 0.0.0.0
[16:33:58][C][logger:177]: Logger:
[16:33:58][C][logger:178]:   Max Level: VERY_VERBOSE
[16:33:58][C][logger:179]:   Initial Level: VERY_VERBOSE
[16:33:58][C][logger:181]:   Log Baud Rate: 0
[16:33:58][C][logger:182]:   Hardware UART: UART0
[16:33:58][C][uart.arduino_esp32:151]: UART Bus 0:
[16:33:58][C][uart.arduino_esp32:152]:   TX Pin: GPIO1
[16:33:58][C][uart.arduino_esp32:153]:   RX Pin: GPIO3
[16:33:58][C][uart.arduino_esp32:155]:   RX Buffer Size: 256
[16:33:58][C][uart.arduino_esp32:157]:   Baud Rate: 9600 baud
[16:33:58][C][uart.arduino_esp32:158]:   Data Bits: 8
[16:33:58][C][uart.arduino_esp32:159]:   Parity: NONE
[16:33:58][C][uart.arduino_esp32:160]:   Stop bits: 1
[16:33:58][C][uart.arduino_esp32:151]: UART Bus 1:
[16:33:58][C][uart.arduino_esp32:152]:   TX Pin: GPIO17
[16:33:58][C][uart.arduino_esp32:153]:   RX Pin: GPIO16
[16:33:58][C][uart.arduino_esp32:155]:   RX Buffer Size: 256
[16:33:58][C][uart.arduino_esp32:157]:   Baud Rate: 9600 baud
[16:33:58][C][uart.arduino_esp32:158]:   Data Bits: 8
[16:33:58][C][uart.arduino_esp32:159]:   Parity: NONE
[16:33:58][C][uart.arduino_esp32:160]:   Stop bits: 1
[16:33:58][C][switch.gpio:068]: GPIO Switch 'Test Switch'
[16:33:58][C][switch.gpio:091]:   Restore Mode: always OFF
[16:33:58][C][switch.gpio:031]:   Pin: GPIO25
[16:33:58][C][comfoair:149]: ComfoAir:
[16:33:58][C][comfoair:152]:   Bootloader  v0.00 b 0
[16:33:58][C][comfoair:154]:   Firmware  v0.00 b 0
[16:33:58][C][comfoair:156]:   Connector Board  v0.00
[16:33:58][C][mdns:116]: mDNS:
[16:33:58][C][mdns:117]:   Hostname: esphome-web-8ab534
[16:33:58][V][mdns:118]:   Services:
[16:33:58][V][mdns:120]:   - _esphomelib, _tcp, 6053
[16:33:58][V][mdns:122]:     TXT: friendly_name = ESP-Rekuperacja-3
[16:33:58][V][mdns:122]:     TXT: version = 2025.4.1
[16:33:58][V][mdns:122]:     TXT: mac = 5c013b8ab534
[16:33:58][V][mdns:122]:     TXT: platform = ESP32
[16:33:58][V][mdns:122]:     TXT: board = esp32dev
[16:33:58][V][mdns:122]:     TXT: network = wifi
[16:33:58][C][esphome.ota:073]: Over-The-Air updates:
[16:33:58][C][esphome.ota:074]:   Address: 192.168.68.53:3232
[16:33:58][C][esphome.ota:075]:   Version: 2
[16:33:58][C][safe_mode:018]: Safe Mode:
[16:33:58][C][safe_mode:020]:   Boot considered successful after 60 seconds
[16:33:58][C][safe_mode:021]:   Invoke after 10 boot attempts
[16:33:58][C][safe_mode:023]:   Remain in safe mode for 300 seconds
[16:33:58][C][api:140]: API Server:
[16:33:58][C][api:141]:   Address: 192.168.68.53:6053
[16:33:58][C][api:145]:   Using noise encryption: NO
[16:33:59][D][comfoair:956]: getting operation hours
[16:33:59][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:01][D][comfoair:961]: getting preheating status
[16:34:01][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:03][D][comfoair:966]: getting time delay
[16:34:03][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:04][VV][api.service:697]: on_ping_request: PingRequest {}
[16:34:04][VV][api.service:043]: send_ping_response: PingResponse {}
[16:34:05][D][comfoair:896]: getting fan status
[16:34:05][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:07][D][comfoair:905]: getting valve status
[16:34:07][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:09][D][comfoair:940]: getting sensor data
[16:34:09][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:11][D][comfoair:946]: getting ventilation level
[16:34:11][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:13][D][comfoair:951]: getting temperatures
[16:34:13][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:15][D][comfoair:913]: getting error status
[16:34:15][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:17][D][comfoair:923]: getting bypass control
[16:34:17][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:19][D][comfoair:956]: getting operation hours
[16:34:19][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:19][V][comfoair:246]: Response 0x3F from confosense with 2 bytes.
[16:34:19][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:19][V][comfoair:246]: Response 0xDE from confosense with 28 bytes.
[16:34:19][V][sensor:043]: 'level0_hours': Received new state 54463.000000
[16:34:19][D][sensor:094]: 'level0_hours': Sending state 54463.00000 h with 0 decimals of accuracy
[16:34:19][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 2783741559
  state: 54463
  missing_state: NO
}
[16:34:19][V][sensor:043]: 'level1_hours': Received new state 26522.000000
[16:34:19][D][sensor:094]: 'level1_hours': Sending state 26522.00000 h with 0 decimals of accuracy
[16:34:19][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 4003978570
  state: 26522
  missing_state: NO
}
[16:34:19][V][sensor:043]: 'level2_hours': Received new state 3990.000000
[16:34:19][D][sensor:094]: 'level2_hours': Sending state 3990.00000 h with 0 decimals of accuracy
[16:34:19][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 4111507005
  state: 3990
  missing_state: NO
}
[16:34:19][V][sensor:043]: 'level3_hours': Received new state 377.000000
[16:34:19][D][sensor:094]: 'level3_hours': Sending state 377.00000 h with 0 decimals of accuracy
[16:34:19][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 948212344
  state: 377
  missing_state: NO
}
[16:34:19][V][sensor:043]: 'frost_protection_hours': Received new state 0.000000
[16:34:19][D][sensor:094]: 'frost_protection_hours': Sending state 0.00000 h with 0 decimals of accuracy
[16:34:19][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 2375985149
  state: 0
  missing_state: NO
}
[16:34:19][V][sensor:043]: 'bypass_open_hours': Received new state 23579.000000
[16:34:19][D][sensor:094]: 'bypass_open_hours': Sending state 23579.00000 h with 0 decimals of accuracy
[16:34:19][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 3096519312
  state: 23579
  missing_state: NO
}
[16:34:19][V][sensor:043]: 'preheating_hours': Received new state 84.000000
[16:34:19][D][sensor:094]: 'preheating_hours': Sending state 84.00000 h with 0 decimals of accuracy
[16:34:19][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 2108822
  state: 84
  missing_state: NO
}
[16:34:19][V][sensor:043]: 'filter_hours': Received new state 206.000000
[16:34:19][D][sensor:094]: 'filter_hours': Sending state 206.00000 h with 0 decimals of accuracy
[16:34:19][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 932503283
  state: 206
  missing_state: NO
}
[16:34:19][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:19][W][component:239]: Component esphome.coroutine took a long time for an operation (136 ms).
[16:34:19][W][component:240]: Components should block for at most 30 ms.
[16:34:21][D][comfoair:961]: getting preheating status
[16:34:21][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:21][V][comfoair:246]: Response 0xDE from confosense with 2 bytes.
[16:34:21][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:21][V][comfoair:246]: Response 0xE2 from confosense with 14 bytes.
[16:34:21][V][text_sensor:013]: 'preheating_valve': Received new state Closed
[16:34:21][D][text_sensor:064]: 'preheating_valve': Sending state 'Closed'
[16:34:21][VV][api.service:174]: send_text_sensor_state_response: TextSensorStateResponse {
  key: 3407430625
  state: 'Closed'
  missing_state: NO
}
[16:34:21][D][binary_sensor:036]: 'frost_protection_active': Sending state OFF
[16:34:21][VV][api.service:070]: send_binary_sensor_state_response: BinarySensorStateResponse {
  key: 452245478
  state: NO
  missing_state: NO
}
[16:34:21][D][binary_sensor:036]: 'preheating_state': Sending state OFF
[16:34:21][VV][api.service:070]: send_binary_sensor_state_response: BinarySensorStateResponse {
  key: 3801981092
  state: NO
  missing_state: NO
}
[16:34:21][V][sensor:043]: 'frost_protection_minutes': Received new state 0.000000
[16:34:21][D][sensor:094]: 'frost_protection_minutes': Sending state 0.00000 min with 0 decimals of accuracy
[16:34:21][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 2213580883
  state: 0
  missing_state: NO
}
[16:34:21][V][text_sensor:013]: 'frost_protection_level': Received new state HighProtection
[16:34:21][D][text_sensor:064]: 'frost_protection_level': Sending state 'HighProtection'
[16:34:21][VV][api.service:174]: send_text_sensor_state_response: TextSensorStateResponse {
  key: 1190408890
  state: 'HighProtection'
  missing_state: NO
}
[16:34:21][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:21][W][component:239]: Component esphome.coroutine took a long time for an operation (77 ms).
[16:34:21][W][component:240]: Components should block for at most 30 ms.
[16:34:23][D][comfoair:966]: getting time delay
[16:34:23][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:23][V][comfoair:246]: Response 0xE2 from confosense with 2 bytes.
[16:34:23][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:23][V][comfoair:246]: Response 0xCA from confosense with 16 bytes.
[16:34:23][V][sensor:043]: 'bathroom_switch_on_delay_minutes': Received new state 0.000000
[16:34:23][D][sensor:094]: 'bathroom_switch_on_delay_minutes': Sending state 0.00000  with 0 decimals of accuracy
[16:34:23][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 37141532
  state: 0
  missing_state: NO
}
[16:34:23][V][sensor:043]: 'bathroom_switch_off_delay_minutes': Received new state 30.000000
[16:34:23][D][sensor:094]: 'bathroom_switch_off_delay_minutes': Sending state 30.00000  with 0 decimals of accuracy
[16:34:23][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 3329223050
  state: 30
  missing_state: NO
}
[16:34:23][V][sensor:043]: 'l1_switch_off_delay_minutes': Received new state 0.000000
[16:34:23][D][sensor:094]: 'l1_switch_off_delay_minutes': Sending state 0.00000  with 0 decimals of accuracy
[16:34:23][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 643315379
  state: 0
  missing_state: NO
}
[16:34:23][V][sensor:043]: 'boost_ventilation_minutes': Received new state 30.000000
[16:34:23][D][sensor:094]: 'boost_ventilation_minutes': Sending state 30.00000  with 0 decimals of accuracy
[16:34:23][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 567365624
  state: 30
  missing_state: NO
}
[16:34:23][V][sensor:043]: 'filter_warning_weeks': Received new state 26.000000
[16:34:23][D][sensor:094]: 'filter_warning_weeks': Sending state 26.00000 weeks with 0 decimals of accuracy
[16:34:23][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 3253144704
  state: 26
  missing_state: NO
}
[16:34:23][V][sensor:043]: 'rf_high_time_short_minutes': Received new state 10.000000
[16:34:23][D][sensor:094]: 'rf_high_time_short_minutes': Sending state 10.00000  with 0 decimals of accuracy
[16:34:23][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 1226358341
  state: 10
  missing_state: NO
}
[16:34:23][V][sensor:043]: 'rf_high_time_long_minutes': Received new state 30.000000
[16:34:23][D][sensor:094]: 'rf_high_time_long_minutes': Sending state 30.00000  with 0 decimals of accuracy
[16:34:23][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 2639474907
  state: 30
  missing_state: NO
}
[16:34:23][V][sensor:043]: 'extractor_hood_switch_off_delay_minutes': Received new state 0.000000
[16:34:23][D][sensor:094]: 'extractor_hood_switch_off_delay_minutes': Sending state 0.00000  with 0 decimals of accuracy
[16:34:23][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 3409199027
  state: 0
  missing_state: NO
}
[16:34:23][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:23][W][component:239]: Component esphome.coroutine took a long time for an operation (120 ms).
[16:34:23][W][component:240]: Components should block for at most 30 ms.
[16:34:25][D][comfoair:896]: getting fan status
[16:34:25][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:25][V][comfoair:246]: Response 0xCA from confosense with 2 bytes.
[16:34:25][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:25][V][comfoair:246]: Response 0x0C from confosense with 14 bytes.
[16:34:25][V][sensor:043]: 'intake_fan_speed': Received new state 35.000000
[16:34:25][D][sensor:094]: 'intake_fan_speed': Sending state 35.00000 % with 0 decimals of accuracy
[16:34:25][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 2256682803
  state: 35
  missing_state: NO
}
[16:34:25][V][sensor:043]: 'exhaust_fan_speed': Received new state 35.000000
[16:34:25][D][sensor:094]: 'exhaust_fan_speed': Sending state 35.00000 % with 0 decimals of accuracy
[16:34:25][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 3240621979
  state: 35
  missing_state: NO
}
[16:34:25][V][sensor:043]: 'intake_fan_speed_rpm': Received new state 1278.990479
[16:34:25][D][sensor:094]: 'intake_fan_speed_rpm': Sending state 1278.99048 RPM with 0 decimals of accuracy
[16:34:25][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 2775799405
  state: 1278.99
  missing_state: NO
}
[16:34:25][V][sensor:043]: 'exhaust_fan_speed_rpm': Received new state 1246.675537
[16:34:25][D][sensor:094]: 'exhaust_fan_speed_rpm': Sending state 1246.67554 RPM with 0 decimals of accuracy
[16:34:25][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 3840914389
  state: 1246.68
  missing_state: NO
}
[16:34:25][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:25][W][component:239]: Component esphome.coroutine took a long time for an operation (77 ms).
[16:34:25][W][component:240]: Components should block for at most 30 ms.
[16:34:27][D][comfoair:905]: getting valve status
[16:34:27][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:27][V][comfoair:246]: Response 0x0C from confosense with 2 bytes.
[16:34:27][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:27][V][comfoair:246]: Response 0x0E from confosense with 12 bytes.
[16:34:27][V][sensor:043]: 'bypass_valve': Received new state 0.000000
[16:34:27][D][sensor:094]: 'bypass_valve': Sending state 0.00000 % with 0 decimals of accuracy
[16:34:27][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 4097165914
  state: 0
  missing_state: NO
}
[16:34:27][D][binary_sensor:036]: 'bypass_valve_open': Sending state OFF
[16:34:27][VV][api.service:070]: send_binary_sensor_state_response: BinarySensorStateResponse {
  key: 3828666037
  state: NO
  missing_state: NO
}
[16:34:27][V][sensor:043]: 'motor_current_bypass': Received new state 0.000000
[16:34:27][D][sensor:094]: 'motor_current_bypass': Sending state 0.00000 A with 1 decimals of accuracy
[16:34:27][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 2944638445
  state: 0
  missing_state: NO
}
[16:34:27][V][sensor:043]: 'motor_current_preheating': Received new state 0.000000
[16:34:27][D][sensor:094]: 'motor_current_preheating': Sending state 0.00000 A with 1 decimals of accuracy
[16:34:27][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 4040142686
  state: 0
  missing_state: NO
}
[16:34:27][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:27][W][component:239]: Component esphome.coroutine took a long time for an operation (69 ms).
[16:34:27][W][component:240]: Components should block for at most 30 ms.
[16:34:29][D][comfoair:940]: getting sensor data
[16:34:29][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:29][V][comfoair:246]: Response 0x0E from confosense with 2 bytes.
[16:34:29][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:29][V][comfoair:246]: Response 0x98 from confosense with 28 bytes.
[16:34:29][V][sensor:043]: 'enthalpy_temperature': Received new state -20.000000
[16:34:29][D][sensor:094]: 'enthalpy_temperature': Sending state -20.00000 °C with 1 decimals of accuracy
[16:34:29][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 1399672037
  state: -20
  missing_state: NO
}
[16:34:29][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:29][W][component:239]: Component esphome.coroutine took a long time for an operation (55 ms).
[16:34:29][W][component:240]: Components should block for at most 30 ms.
[16:34:31][D][comfoair:946]: getting ventilation level
[16:34:31][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:31][V][comfoair:246]: Response 0x98 from confosense with 2 bytes.
[16:34:31][VV][uart.arduino_esp32:194]:     Flushing...
[16:34:31][V][comfoair:246]: Response 0xCE from confosense with 22 bytes.
[16:34:31][D][comfoair:523]: Level 02
[16:34:31][W][comfoair:524]: Off ab 15 - Off zu 15 - Low ab 35 - Low zu 35 - Middle ab 50 - Middle zu 50 - High ab 80 - High zu 77
[16:34:31][V][sensor:043]: 'return_air_level': Received new state 35.000000
[16:34:31][D][sensor:094]: 'return_air_level': Sending state 35.00000 m³ with 1 decimals of accuracy
[16:34:31][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 229499437
  state: 35
  missing_state: NO
}
[16:34:31][V][sensor:043]: 'supply_air_level': Received new state 35.000000
[16:34:31][D][sensor:094]: 'supply_air_level': Sending state 35.00000 m³ with 1 decimals of accuracy
[16:34:31][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 3719388934
  state: 35
  missing_state: NO
}
[16:34:31][V][sensor:043]: 'ventilation_level': Received new state 1.000000
[16:34:31][D][sensor:094]: 'ventilation_level': Sending state 1.00000  with 0 decimals of accuracy
[16:34:31][VV][api.service:140]: send_sensor_state_response: SensorStateResponse {
  key: 2606862985
  state: 1
  missing_state: NO
}
WARNING esphome-web-8ab534 @ 192.168.68.53: Connection error occurred: Ping response not received after 90.0 seconds
INFO Processing unexpected disconnect from ESPHome API for esphome-web-8ab534 @ 192.168.68.53
WARNING Disconnected from API
WARNING Can't connect to ESPHome API for esphome-web-8ab534 @ 192.168.68.53: Error connecting to [AddrInfo(family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, proto=6, sockaddr=IPv4Sockaddr(address='192.168.68.53', port=6053))]: [Errno 113] Connect call failed ('192.168.68.53', 6053) (SocketAPIError)
INFO Trying to connect to esphome-web-8ab534 @ 192.168.68.53 in the background

(please ignore the logs between 16:34:59 and 16:34:19 - recuperator and comfosense were not powered on at this time)

Can you share you esphome yaml part that change the ventilationlevel?

of course:

    on_click:
      - min_length: 25ms
        max_length: 700ms
        then:
          - if:
              condition:
                lambda: 'return id(ventilation_level).state > 1;'
              then:     
                - uart.write: [0x07, 0xF0, 0x00, 0x99, 0x01, 0x02, 0x49, 0x07, 0x0F]
                - light.turn_off: led
              else:
                - uart.write: [0x07, 0xF0, 0x00, 0x99, 0x01, 0x03, 0x4A, 0x07, 0x0F]
                - light.turn_on: led
      - min_length: 1000ms
        max_length: 3000ms
        then:
          - if:
              condition:
                lambda: 'return id(ventilation_level).state < 3;'
              then:
                - uart.write: [0x07, 0xF0, 0x00, 0x99, 0x01, 0x04, 0x4B, 0x07, 0x0F]
                - light.turn_on: led  
              else:
                - uart.write: [0x07, 0xF0, 0x00, 0x99, 0x01, 0x03, 0x4A, 0x07, 0x0F]
                - light.turn_on: led    
1 Like

Sorry for the late reply @trutru21 , I was not around for a while.

I see that you are getting data but then the ESP crashes for some reason. Honestly I don’t have good sense what is the issue. Are you getting the same issue even when the ComfoSense is not connected? Also I would try to power up the Zehned unit first and then the ESP (or at least reset it when the unit is on) because then it will go through the init sequence properly.

Yeah, the issues is the same. I’ve tried all configurations to no avail. Don’t worry about it, I just switched to wicher’s and removed the comfosense :slight_smile:

Is it possible to cut of the power of the zehnder ?
When I am not using it, it still gives me 11 /12w per hour. It is possible to reduce it ?

Most models can only be turned down to lowest speed. The possible lowest setting depends on the model (you can find that info in the installer manual). My CA350 allows 15% lowest setting. In this setting it uses ~12W.
This is due to the fact that mechanical ventilation fully replaces gravitational one and it should never be fully turned off. If you really know what you are doing you can just install a smart plug and turn of the power completely. But I would not recommend doing it.

1 Like

Hello, I have managed to connect to Zehnder 375 using wichers/esphome-comfoair. I can read values from sensor. I am however unable to control the power levels.

I have the unit connected using the 3-position switch. I don’t have the comfosense unit, just direct connection to esp32.

Did anybody manage to control the power levels on Zehnder 375 via HA? Any clues what could be wrong?

Edit: It turns out that I can control the levels, but only to and above the level set on the 3-way switch. So it needs to be set to level 1 to be able to switch between all levels.

Well, that is no surprise. You can replace the physical switch with a smart one or disconnect it completely and relay on the smart control only.

Hi all, my unit seems to be different from everything I already read. I bought a house with a storkAir WHR930. I wanted to automate this with an ESP8266 and HA. I bought and build the parts similar to GitHub - LukasdeBoer/esp8266-whr930-mqtt: Control your StorkAir / Zehnder WHR930 using a ESP8266 via MQTT. However when the time came to connect it to the PCB i found that my unit did not have an RJ45 port, after some measuring and testing i found out it was an RJ9 port (4P4C). I ordered this cable cut it up and tried connecting it this way to a DB9 RS232-TTL converter. However i am not sure about the pin out i tried a couple of combinations but nothing seems to work. Has anyone got any ideas. tips or resources to set me in the right direction?

Are you sure its a WHR930, because it doesn’t look like a print of a WHR930. These are green and have a RJ44 (RJ45) connector for RS232 communication.

By the AI looks of it this is a 950 or 960;

edit: hmm funny… If I click on electrical scheme I get a schematic drawing which mentions RJ45. https://zehndernl.zendesk.com/hc/nl/articles/360000168117-WHR-950-Elektrisch-schema

apparently there are different board versions? As your photo matches the connector on the 950/960 board photo.