Zehnder Q350 über Comfoconnect Pro

Hallo zusammen,

ich bin aktuell in der Arbeit meine Lüftungsanlage von Zehnder in Home Assistant zu implementieren. Da mein Kommunikationsmodul das neue Comfoconnet Pro ist funktionieren die aktuellen Integrationen nicht. Allerdings lässt sich die Pro-Box über Modbus TCP steuern was mir eigentlich auch erstmal ausreicht.

Nun zu meiner Frage bzw. Problem. Die Sensoren zum auslesen der Temperaturen, usw. funktionieren soweit.

allerdings komme ich bei der Lüftersteuerung nicht weiter. Habe das über Switches versucht und auch über Templates. Bei letzterem habe ich zwar das Template aber dieses schaltet die Lüftung nicht gemäß der Auswahl zu.

Danke schonmal für die Unterstützung!

nachfolgend mal der Code der Modbus Einstellung und des Templates:

template:

#Select-Entität für die Zehnder Lüftung
  - select:
      - name: "Ventilation Preset"
        unique_id: zehnder_ventilation_preset_select
        # Der Zustand wird aus dem Modbus-Sensor gelesen und in lesbare Namen umgewandelt.
        state: >
          {% set presets = {0: "Away", 1: "Preset 1", 2: "Preset 2", 3: "Preset 3"} %}
          {% set state = states('sensor.ventilation_preset_state') | int(0) %}
          {{ presets[state] if state in presets else 'unknown' }}
        # Die Optionen werden jetzt als ein einzelner String definiert, um den Fehler zu umgehen.
        options: "{{ ['Away', 'Preset 1', 'Preset 2', 'Preset 3'] }}"
        # Die select_option-Aktion sendet den Befehl über Modbus an die Lüftung.
        select_option:
          - service: modbus.write_register
            data:
              hub: "zehnder_comfoconnect_pro"
              slave: 1
              address: 1
              # Der ausgewählte String wird in den entsprechenden Integer-Wert umgewandelt und als Liste übergeben.
              value:
                - >
                  {% set options_map = {"Away": 0, "Preset 1": 1, "Preset 2": 2, "Preset 3": 3} %}
                  {{ options_map[option] }}

Mein Modbus ist wie folgt eingestellt:

modbus:
  - name: "zehnder_comfoconnect_pro"
    type: tcp
    host: "192.168.178.81"  
    port: 502
    switches:
      - name: "Zehnder Boost Modus"
        unique_id: zehnder_boost_modus
        slave: 1
        address: 7
        command_on: 1
        command_off: 0

Hallo, ich habe seit gestern die Comfoconnect Pro in Betrieb. Laut Zehnder Doku muss man vom Register 1 abziehen für die korrekte Adresse. Ich habe dein Script mal ausprobiert mit der Ergänzung “write_type: coil” stellt sich die Lüftungsanlage auf Away.

Anbei eine YAML Datei für Modbus

Über ein angepasstes Dashboard kannst ud dann alles Steuern. Beim Booster ist z.B. wichtig, auch eine Zeit mitzugeben, sonst geht der Booster nicht an. Ich habe das über Helper und Variabeln gemacht.

# modbus.yaml — Home Assistant Modbus TCP for Zehnder ComfoConnect Pro
# Source: Zehnder ComfoConnect PRO installer manual (Section 9: Third‑part communication protocols).
# Addresses below use 0‑based PDU indexing (manual 0x0001 → address: 0).
# Temperatures are °C×10 (scale 0.1). Humidity is plain % (no scaling). CO₂ is ppm.
# This file defines: sensors (input registers), binary_sensors (discrete inputs), and switches (coils).
# Holding registers (writeable values) are controlled via service calls (see notes at end).

- name: zehnder
  type: tcp
  host: 000.000.000.000        # ← set to your ComfoConnect Pro IP
  port: 502
  timeout: 5
  delay: 0
  message_wait_milliseconds: 0

  sensors:
    # ---- Status & errors (Input Registers) ----
    - name: ComfoAirQ Attic Connection state
      unique_id: comfoairq_attic_connection_state
      slave: 1
      address: 0            # 0x0001
      input_type: input
      data_type: uint16
      precision: 0
      scan_interval: 10

    - name: ComfoAirQ Attic Active error 1
      unique_id: comfoairq_attic_active_error_1
      slave: 1
      address: 1            # 0x0002
      input_type: input
      data_type: uint16
      scan_interval: 10

    - name: ComfoAirQ Attic Active error 2
      unique_id: comfoairq_attic_active_error_2
      slave: 1
      address: 2            # 0x0003
      input_type: input
      data_type: uint16
      scan_interval: 10

    - name: ComfoAirQ Attic Active error 3
      unique_id: comfoairq_attic_active_error_3
      slave: 1
      address: 3            # 0x0004
      input_type: input
      data_type: uint16
      scan_interval: 10

    - name: ComfoAirQ Attic Active error 4
      unique_id: comfoairq_attic_active_error_4
      slave: 1
      address: 4            # 0x0005
      input_type: input
      data_type: uint16
      scan_interval: 10

    - name: ComfoAirQ Attic Active error 5
      unique_id: comfoairq_attic_active_error_5
      slave: 1
      address: 5            # 0x0006
      input_type: input
      data_type: uint16
      scan_interval: 10

    - name: ComfoAirQ Attic Value Boost Timer
      unique_id: comfoairq_attic_value_boost_timer
      slave: 1
      address: 4            # 0x0005
      input_type: holding
      scan_interval: 10
      scale: 0.0166666666666667
      unit_of_measurement: "min"
      device_class: duration

    # ---- Airflow (m³/h) ----
    - name: ComfoAirQ Attic Airflow
      unique_id: comfoairq_attic_airflow
      slave: 1
      address: 6            # 0x0007
      input_type: input
      data_type: uint16
      unit_of_measurement: "m³/h"
      precision: 0
      scan_interval: 5

    # ---- Temperatures (°C ×10 -> scale 0.1) ----
    - name: ComfoAirQ Attic Room temperature
      unique_id: comfoairq_attic_t_room
      slave: 1
      address: 7            # 0x0008
      input_type: input
      data_type: int16
      scale: 0.1
      precision: 1
      unit_of_measurement: "°C"
      scan_interval: 10

    - name: ComfoAirQ Attic Extract temperature
      unique_id: comfoairq_attic_t_extract
      slave: 1
      address: 8            # 0x0009
      input_type: input
      data_type: int16
      scale: 0.1
      precision: 1
      unit_of_measurement: "°C"
      scan_interval: 10

    - name: ComfoAirQ Attic Exhaust temperature
      unique_id: comfoairq_attic_t_exhaust
      slave: 1
      address: 9            # 0x000A
      input_type: input
      data_type: int16
      scale: 0.1
      precision: 1
      unit_of_measurement: "°C"
      scan_interval: 10

    - name: ComfoAirQ Attic Outdoor temperature
      unique_id: comfoairq_attic_t_outdoor
      slave: 1
      address: 10           # 0x000B
      input_type: input
      data_type: int16
      scale: 0.1
      precision: 1
      unit_of_measurement: "°C"
      scan_interval: 5

    - name: ComfoAirQ Attic Supply temperature
      unique_id: comfoairq_attic_t_supply
      slave: 1
      address: 11           # 0x000C
      input_type: input
      data_type: int16
      scale: 0.1
      precision: 1
      unit_of_measurement: "°C"
      scan_interval: 10

    # ---- Humidity (%; no scaling) ----
    - name: ComfoAirQ Attic Room humidity
      unique_id: comfoairq_attic_h_room
      slave: 1
      address: 12           # 0x000D
      input_type: input
      data_type: uint16
      unit_of_measurement: "%"
      precision: 0
      scan_interval: 10

    - name: ComfoAirQ Attic Extract humidity
      unique_id: comfoairq_attic_h_extract
      slave: 1
      address: 13           # 0x000E
      input_type: input
      data_type: uint16
      unit_of_measurement: "%"
      precision: 0
      scan_interval: 10

    - name: ComfoAirQ Attic Exhaust humidity
      unique_id: comfoairq_attic_h_exhaust
      slave: 1
      address: 14           # 0x000F
      input_type: input
      data_type: uint16
      unit_of_measurement: "%"
      precision: 0
      scan_interval: 10

    - name: ComfoAirQ Attic Outdoor humidity
      unique_id: comfoairq_attic_h_outdoor
      slave: 1
      address: 15           # 0x0010
      input_type: input
      data_type: uint16
      unit_of_measurement: "%"
      precision: 0
      scan_interval: 10

    - name: ComfoAirQ Attic Supply humidity
      unique_id: comfoairq_attic_h_supply
      slave: 1
      address: 16           # 0x0011
      input_type: input
      data_type: uint16
      unit_of_measurement: "%"
      precision: 0
      scan_interval: 10

#     # ---- CO₂ zones (ppm) ----
#     - name: ComfoAirQ Attic CO2 zone 1
#       unique_id: comfoairq_attic_co2_1
#       slave: 1
#       address: 17           # 0x0012
#       input_type: input
#       data_type: uint16
#       unit_of_measurement: "ppm"
#     - name: ComfoAirQ Attic CO2 zone 2
#       unique_id: comfoairq_attic_co2_2
#       slave: 1
#       address: 18           # 0x0013
#       input_type: input
#       data_type: uint16
#       unit_of_measurement: "ppm"
#     - name: CO2 zone 3
#       unique_id: comfoairq_attic_co2_3
#       slave: 1
#       address: 19           # 0x0014
#       input_type: input
#       data_type: uint16
#       unit_of_measurement: "ppm"
#     - name: CO2 zone 4
#       unique_id: comfoairq_attic_co2_4
#       slave: 1
#       address: 20           # 0x0015
#       input_type: input
#       data_type: uint16
#       unit_of_measurement: "ppm"
#     - name: CO2 zone 5
#       unique_id: comfoairq_attic_co2_5
#       slave: 1
#       address: 21           # 0x0016
#       input_type: input
#       data_type: uint16
#       unit_of_measurement: "ppm"
#     - name: CO2 zone 6
#       unique_id: comfoairq_attic_co2_6
#       slave: 1
#       address: 22           # 0x0017
#       input_type: input
#       data_type: uint16
#       unit_of_measurement: "ppm"
#     - name: CO2 zone 7
#       unique_id: comfoairq_attic_co2_7
#       slave: 1
#       address: 23           # 0x0018
#       input_type: input
#       data_type: uint16
#       unit_of_measurement: "ppm"
#     - name: CO2 zone 8
#       unique_id: comfoairq_attic_co2_8
#       slave: 1
#       address: 24           # 0x0019
#       input_type: input
#       data_type: uint16
#       unit_of_measurement: "ppm"
# 
#     # ---- Filter ----
    - name: ComfoAirQ Attic Filter days remaining
      unique_id: comfoairq_attic_filter_days_remaining
      slave: 1
      address: 25           # 0x001A
      input_type: input
      data_type: uint16
      unit_of_measurement: "days"
      precision: 0
      scan_interval: 7200

    # Current ventilation preset (holding reg 0x0001 → address 0), 0..3
    - name: ComfoAirQ Attic Ventilation preset
      unique_id: comfoairq_attic_vent_preset
      slave: 1
      address: 0
      input_type: holding
      data_type: uint16
      precision: 0
      scan_interval: 10

    # External temperature setpoint (holding reg 0x0004 → address 3), °C×10 → scale 0.1
    - name: ComfoAirQ Attic External setpoint
      unique_id: comfoairq_attic_external_setpoint
      slave: 1
      address: 3
      input_type: holding
      data_type: uint16
      scale: 0.1
      precision: 1
      unit_of_measurement: "°C"
      scan_interval: 10
      
  binary_sensors:
    # ---- Discrete inputs (read‑only) ----
    - name: ComfoAirQ Attic Error flag
      unique_id: comfoairq_attic_error_flag
      slave: 1
      address: 0            # 0x0001
      input_type: discrete_input
      device_class: problem
      scan_interval: 10

    - name: ComfoAirQ Attic Standby (status)
      unique_id: comfoairq_attic_standby_status
      slave: 1
      address: 1            # 0x0002
      input_type: discrete_input
      scan_interval: 10

    - name: ComfoAirQ Attic ComfoHood active
      unique_id: comfoairq_attic_hood_active
      slave: 1
      address: 2            # 0x0003
      input_type: discrete_input
      scan_interval: 10

    - name: ComfoAirQ Attic Filter dirty
      unique_id: comfoairq_attic_filter_dirty
      slave: 1
      address: 3            # 0x0004
      input_type: discrete_input
      device_class: problem
      scan_interval: 300

  switches:
    # ---- Coils (writeable booleans) ----
    - name: ComfoAirQ Attic Reset errors
      unique_id: comfoairq_attic_reset_errors
      slave: 1
      address: 0            # coil 0x0001
      write_type: coil
      verify:
        address: 0
        state_on: 1
        state_off: 0
        delay: 1

    - name: ComfoAirQ Attic Preset Away
      unique_id: comfoairq_attic_preset_away
      slave: 1
      address: 1            # coil 0x0002
      write_type: coil
      verify:
        address: 1
        state_on: 1
        state_off: 0
        delay: 1

    - name: ComfoAirQ Attic Preset 1 (Low)
      unique_id: comfoairq_attic_preset_1
      slave: 1
      address: 2            # coil 0x0003
      write_type: coil
      verify:
        address: 2
        state_on: 1
        state_off: 0
        delay: 1

    - name: ComfoAirQ Attic Preset 2 (Medium)
      unique_id: comfoairq_attic_preset_2
      slave: 1
      address: 3            # coil 0x0004
      write_type: coil
      verify:
        address: 3
        state_on: 1
        state_off: 0
        delay: 1

    - name: ComfoAirQ Attic Preset 3 (High)
      unique_id: comfoairq_attic_preset_3
      slave: 1
      address: 4            # coil 0x0005
      write_type: coil
      verify:
        address: 4
        state_on: 1
        state_off: 0
        delay: 1

    - name: ComfoAirQ Attic Auto mode
      unique_id: comfoairq_attic_auto_mode
      slave: 1
      address: 5            # coil 0x0006
      write_type: coil
      verify:
        address: 5
        state_on: 1
        state_off: 0
        delay: 1

    - name: ComfoAirQ Attic Boost
      unique_id: comfoairq_attic_boost
      slave: 1
      address: 6            # coil 0x0007
      write_type: coil
      
      verify:
        address: 6
        state_on: 1
        state_off: 0
        delay: 1

    - name: ComfoAirQ Attic Away function
      unique_id: comfoairq_attic_away_function
      slave: 1
      address: 7            # coil 0x0008
      write_type: coil
      verify:
        address: 7
        state_on: 1
        state_off: 0
        delay: 1

    - name: ComfoAirQ Attic ComfoCool enable
      unique_id: comfoairq_attic_comfocool_enable
      slave: 1
      address: 8            # coil 0x0009
      write_type: coil
      verify:
        address: 8
        state_on: 1
        state_off: 0
        delay: 1
      
#  Climate

  climates:
    - name: "ComfoAirQ Attic"
      unique_id: comfoairq_attic_climate
      slave: 1

      # Current temperature = Extract temperature (input reg 0x0009 → address 8)
      address: 8
      input_type: input
      data_type: int16
      scale: 0.1          # applies to current temp AND target temp register
      precision: 1
      temperature_unit: C
      min_temp: 18
      max_temp: 24
      temp_step: 3
      scan_interval: 10

      # Target temperature writes to External Setpoint (holding 0x0004 → address 3)
      target_temp_register: 3

      # Fan modes mapped to Ventilation Preset (holding 0x0001 → address 0)
      fan_mode_register:
        address: 0
        values:
          state_fan_auto: 0
          state_fan_low: 1
          state_fan_medium: 2
          state_fan_high: 3

Hat jemand eine Idee, wie ich den Bypass über die Modbus Register aktivieren kann?