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

Ok,

so I found the first issue:
the documentation said

  • Clone this repo into your www folder inside your configuration. So it will be: config_folder/www/lovelace-mqttcomfoair.

but the js is looking for
local/lovelace-comfoair
image

after renaming the folder from lovelace-mqttcomfoair to lovelace-comfoair the error disappears, but the card is not loaded

Did you have any success in connecting your Q600?

There is a standard integration for Q* devices, you just need to install the network interface ComfoConnect LAN C

1 Like

I was wondering if it is possible without shelling out another £400 for a simple LAN interface.

For the non-Q devices some people were integrating it via analog inputs - they allow to control fan speed (and probably not much more than that). But there is no serial port on them. From what I can see the price in Poland is ~£200 which is still quite a lot. Unfortunately Zehnder is using proprietary protocol “ComfoNet” but there still should be some additional inputs that would allow to control fan speed (with dry contacts or 0-10V analog input, like it is in the non-Q versions).

1 Like

I’ve just checked and to have the analog inputs you need an " Option Box" which is also a cost of almost £200… So the LAN module would be a better choice (unless you already have the option box as it is needed also for some of the installation options e.g. for ground-air heat exchanger).

Yes, I did buy the very expensive ComfoConnect LAN C. It’s far overpriced, you need to have a ethernet cable running to the Q* device. But to be honest, it’s was worth the money. In combination with Home Assistant there are many possibilities to script/automate.

Thanks. I have a switch nearby so the Ethernet connection is not a problem.

The problem now is a 30 week lead time :frowning:

Hi Folks,

can you help me to understand that:

filter status shows ok
image

this is what i see in MQTT
image

but in developer mode i see this
image

My comfoair shows on the panel the filter message, so I have to change the filters
what i should check to understandd if i have or not to change the filters?
any clue?

This is how the binary sensor of device class “problem” shows OK when the status is “off” and Problem detected (not sure what exactly is displayed) when the status is “on”. See documentation here:

@adorobis, I’m confused, in my case the Display shows “FILTER” that means I have to change it,
why I see Problem OK / status OFF? I shouldn’t see Problem XYZ / status ON?

image

what is I see is filterstatus OK and filter_binary 1, can I take this as the correct threshold?, then it means my expectation is to see the opposite when filter are good

Let me try to clarify

Problem OK / status OFF / filter_binary 1 == Filter Alert, you need to change the filters
Problem XYZ / status ON / filter_binary 0 == Filter are goos, NO need to change the filters

that is the correct status / meaning?
This should be the trigger to raise the alert, right?

The trigger should be from off to on. The other question is why the integration shows OK (off status) while you can see the message to change the filter in the Display. I think this one was difficult to test as I’ve set a date for the filter far in the future so it does not bother me anymore. The best would be if you could debug the python app and see what the RS232 is actually returning, I might have a mistake somewhere there.

I have looked at the documentation and there might be a mistake in the get_filter_status function. Could you change it to the following (index changed from 11 to 10 in data[10]):

def get_filter_status():
    data = send_command(b'\x00\xD9', None)

    if data is None:
        warning_msg('get_filter_status function could not get serial data')
    else:
        if len(data) > 16:
            if data[10] == 0:
                FilterStatus = 'Ok'
                FilterStatusBinary = 1
            elif data[10] == 1:
                FilterStatus = 'Full'
                FilterStatusBinary = 0
            else:
                FilterStatus = 'Unknown'
                FilterStatusBinary = 0
            publish_message(msg=str(FilterStatus), mqtt_path='comfoair/filterstatus')
            publish_message(msg=int(FilterStatusBinary), mqtt_path='comfoair/filterstatus_binary')
            debug_msg('FilterStatus: {0}'.format(FilterStatus))
        else:
            warning_msg('get_filter_status data array too short')

And let me know the result?

I made the change, no changes
I still get OK and 1

image

Sorry, my mistake, check with data[8]:

def get_filter_status():
    data = send_command(b'\x00\xD9', None)

    if data is None:
        warning_msg('get_filter_status function could not get serial data')
    else:
        if len(data) > 16:
            if data[8] == 0:
                FilterStatus = 'Ok'
                FilterStatusBinary = 1
            elif data[8] == 1:
                FilterStatus = 'Full'
                FilterStatusBinary = 0
            else:
                FilterStatus = 'Unknown'
                FilterStatusBinary = 0
            publish_message(msg=str(FilterStatus), mqtt_path='comfoair/filterstatus')
            publish_message(msg=int(FilterStatusBinary), mqtt_path='comfoair/filterstatus_binary')
            debug_msg('FilterStatus: {0}'.format(FilterStatus))
        else:
            warning_msg('get_filter_status data array too short')

Almost :smiley:

now the MQTT message is correct
image

but the entity remains stuck on OK

image

It can be we need to change the topic?

problem: on means problem detected, off means no problem (OK)

            if data[8] == 0:
                FilterStatus = 'Off'
                FilterStatusBinary = 1
            elif data[8] == 1:
                FilterStatus = 'On'
                FilterStatusBinary = 0

I delete the MQTT device and restarted the script, but the sensor still shows OK

image

Rather this way, as FilterStatus is a text sensor and FilterStatusBinary is the one you are looking for to fix:

            if data[8] == 0:
                FilterStatus = 'Ok'
                FilterStatusBinary = 'OFF'
            elif data[8] == 1:
                FilterStatus = 'Full'
                FilterStatusBinary = 'ON'