ComfoAir

The ComfoAir plugin is designed to connect to a Zehnder ComfoAir KWL (heat-recovery ventilation) system and read out and write its parameters. Primarly supported is the ComfoAir 350, which uses the following protocol: http://www.see-solutions.de/sonstiges/Protokollbeschreibung_ComfoAir.pdf There exist identical systems from different manufactures which use the exact same protocol, known is the Wernig G90-380 and supposedly some types of Paul Lüftung Germany.

Additional support for the ComfoAir 500 was added but the protocol is not fully investigated yet: http://matsab.de/images/comfoair/Protokoll_CA500_Avignon.pdf

The ComfoAir plugin uses a separate commands.py file which contains the different control- (control characters like start sequence, acknowledge etc.) and commandsets for the supported systems.

You can configure the plugin to connect by TCP (host and port) using a TCP to serial (RS232 for ComfoAir 350 or RS485 for ComfoAir 500) converter or provide a direct serial connection on the host system.

WARNING!

  • Don’t use the CC Ease command panel parallel with the plugin. They would both try to communicate with ComfoAir at the same time and create big troubles (corrupt the config in ComfoAir in worst case).

Requirements

This plugin has no requirements or dependencies.

Configuration

plugin.yaml

comfoair:
    plugin_name: comfoair
    kwltype: comfoair350       # Currently supported: comfoair350 and comfoair500
    host: 192.168.123.6        # Provide host and port if you want to use TCP connection (for a TCP to serial converter)
    port: 5555                 # Port
    #serialport: /dev/ttyUSB0  # Enable this if you want to use a serial connection

items.yaml

The plugin is completely flexible in which commands you use and when you want the read out which parameters. Everything is configured by adding new items in a SmartHomeNG item configuration file.

The following item attributes are supported:

comfoair_send

Changes to this item result in sending the configured command to the KWL system. The command is complemented by the item value in a pre-configured way (see commands.py).

comfoair_send: WriteVentilationLevel

comfoair_read

The item value should be read by using the configured command.

comfoair_read: ReadVentilationLevel

comfoair_read_afterwrite

A timespan (seconds) can be configured. If a value for this attribute is set, the plugin will wait the configured delay after the write command and then issue the configured read command to update the items value. This attribute has no default value. If the attribute is not set, no read will be issued after write.

comfoair_read_afterwrite: 1 # seconds

comfoair_read_cycle

With this attribute a read cycle for this item can be configured (timespan between cycles in seconds).

comfoair_read_cycle: 3600 # every hour

comfoair_init

If this attribute is set to a value (e.g. ‚true‘), the plugin will use the read command at startup to get an initial value.

comfoair_init: true

comfoair_trigger

This attribute can contain a list of commands, which will be issued if the item is updated. Useful for instance: If the ventilation level is changed, get updated ventilator RPM values.

comfoair_trigger:
   - ReadSupplyAirRPM
   - ReadExtractAirRPM

comfoair_trigger_afterwrite

A timespan (seconds) can be configured. After an update to this item, the commands configured in comfoair_trigger will be issued. Before triggering the here configured delay will be waited for. Default value: 5 seconds.

comfoair_trigger_afterwrite: 10 # seconds

Example

Here you can find a sample configuration using the ComfoAir 350 commands:

kwl:
    level:
        type: num
        comfoair_send: WriteVentilationLevel
        comfoair_read: ReadCurrentVentilationLevel
        comfoair_read_afterwrite: 1 # seconds
        comfoair_trigger: ReadSupplyAirRPM
        comfoair_trigger_afterwrite: 6 # seconds
        comfoair_init: true
        sqlite: yes
    extractair:
        rpm:
            type: num
            comfoair_read: ReadExtractAirRPM
            comfoair_read_cycle: 60 # seconds
            comfoair_init: true
        level:
            type: num
            comfoair_read: ReadExtractAirPercentage
            comfoair_read_cycle: 60 # seconds
            comfoair_init: true
    supplyair:
        rpm:
            type: num
            comfoair_read: ReadSupplyAirRPM
            comfoair_read_cycle: 60 # seconds
            comfoair_init: true
        level:
            type: num
            comfoair_read: ReadSupplyAirPercentage
            comfoair_read_cycle: 60 # seconds
            comfoair_init: true
    filter:
        reset:
            type: bool
            comfoair_send: WriteFilterReset
    temp:
        comfort:
            type: num
            comfoair_send: WriteComfortTemperature
            comfoair_read: ReadComfortTemperature
            comfoair_read_cycle: 60 # seconds
            comfoair_init: true
        freshair:
            type: num
            comfoair_read: ReadFreshAirTemperature
            comfoair_read_cycle: 60 # seconds
            comfoair_init: true
            sqlite: yes
        supplyair:
            type: num
            comfoair_read: ReadSupplyAirTemperature
            comfoair_read_cycle: 60 # seconds
            comfoair_init: true
            sqlite: yes
        extractair:
            type: num
            comfoair_read: ReadExtractAirTemperature
            comfoair_read_cycle: 60 # seconds
            comfoair_init: true
            sqlite: yes
        exhaustair:
            type: num
            comfoair_read: ReadExhaustAirTemperature
            comfoair_read_cycle: 60 # seconds
            comfoair_init: true
            sqlite: yes
        preheater:
            type: num
            comfoair_read: ReadPreHeatingTemperature
            comfoair_read_cycle: 60 # seconds
            comfoair_init: true
        groundheat:
            type: num
            comfoair_read: ReadGroundHeatTemperature
            comfoair_read_cycle: 60 # seconds
            comfoair_init: true
    bypass:
        type: num
        comfoair_read: ReadBypassPercentage
        comfoair_read_cycle: 600 # seconds
        comfoair_init: true
    preheater:
        type: num
        comfoair_read: ReadPreHeatingStatus
        comfoair_read_cycle: 600 # seconds
        comfoair_init: true
    operatinghours:
        away:
            type: num
            comfoair_read: ReadOperatingHoursAway
            comfoair_read_cycle: 3600 # seconds
            comfoair_init: true
        low:
            type: num
            comfoair_read: ReadOperatingHoursLow
            comfoair_read_cycle: 3600 # seconds
            comfoair_init: true
        medium:
            type: num
            comfoair_read: ReadOperatingHoursMedium
            comfoair_read_cycle: 3600 # seconds
            comfoair_init: true
        high:
            type: num
            comfoair_read: ReadOperatingHoursHigh
            comfoair_read_cycle: 3600 # seconds
            comfoair_init: true
        antifreeze:
            type: num
            comfoair_read: ReadOperatingHoursAntiFreeze
            comfoair_read_cycle: 3600 # seconds
            comfoair_init: true
        preheater:
            type: num
            comfoair_read: ReadOperatingHoursPreHeating
            comfoair_read_cycle: 3600 # seconds
            comfoair_init: true
        bypass:
            type: num
            comfoair_read: ReadOperatingHoursBypass
            comfoair_read_cycle: 3600 # seconds
            comfoair_init: true
        filter:
            type: num
            comfoair_read: ReadOperatingHoursFilter
            comfoair_read_cycle: 3600 # seconds
            comfoair_init: true
    heatpreparationratio:
        type: num
        eval: (sh.kwl.temp.supplyair() - sh.kwl.temp.freshair()) / (sh.kwl.temp.extractair() - sh.kwl.temp.exhaustair()) * 100
        eval_trigger:
          - kwl.temp.supplyair
          - kwl.temp.freshair
          - kwl.temp.extractair
          - kwl.temp.exhaustair

logic.yaml

Currently there is no logic configuration for this plugin.

Methods

Currently there are no functions offered from this plugin.