Zehnder ComfoAirQ350 -- do I need ComfoConnect to control it?

Yes, it works with OH3.
You have to configure in WebUI mqtt broker and add 2 Homie devices.

All items should be auto discovered but You can also use Items definitions from my repo for example to import them in WebUI from textual definiton.

Early OH2.5 versions had issues with Homie devices so I hope with OH3 it will be more stable. I started migration to OH3 a couple days ago. For now i have not noticed any issues.

It’s not on my priority list:-) I think I couldn’t spend to much time for that.
Are You considering starting implementation native OH binding?

If I had your skills I would start :-S for me probably too diddicult.
I thought maybe a java version of the existing stuff would be feasible.
so if its easier to leave the MQTT binding would be ok.
But instead of PHP stuff just 1 binding that connects to the Lanconnect and puts it on mqtt without the other manual steps php + homie etc.

But I am following this thread so long now and there were people like bitweasel that actually had it already up and running that I at some point just implement any solution that works at all.

Recently I installed this ComfoAirQ-Homie tool from @klaudiusz223 on OH 2.5.11 for my Zehnder Q350. Most part is working fine, I did make some small changes to the mqtt publish code, and some DateTime code (.calendar.timeInMillis to .zonedDateTime.toInstant.toEpochMilli), plus added some NULL checks.

I also had this error:

2021-01-19 18:31:03.913 [ERROR] [ansport.mqtt.internal.ClientCallback] - MQTT message received. MqttMessageSubscriber#processMessage() implementation failure
java.lang.IllegalArgumentException: Value must be between 0 and 100
        at org.eclipse.smarthome.core.library.types.PercentType.validateValue(PercentType.java:57) ~[?:?]
        at org.eclipse.smarthome.core.library.types.PercentType.<init>(PercentType.java:52) ~[?:?]
        at org.eclipse.smarthome.core.library.types.DecimalType.as(DecimalType.java:152) ~[?:?]
        at org.eclipse.smarthome.core.internal.items.ItemStateConverterImpl.convertToAcceptedState(ItemStateConverterImpl.java:64) ~[?:?]
        at org.eclipse.smarthome.core.thing.internal.profiles.ProfileCallbackImpl.sendUpdate(ProfileCallbackImpl.java:134) ~[?:?]
        at org.eclipse.smarthome.core.thing.internal.profiles.SystemDefaultProfile.onStateUpdateFromHandler(SystemDefaultProfile.java:53) ~[?:?]
        at org.eclipse.smarthome.core.thing.internal.CommunicationManager.lambda$9(CommunicationManager.java:467) ~[?:?]
        at org.eclipse.smarthome.core.thing.internal.CommunicationManager.lambda$11(CommunicationManager.java:487) ~[?:?]
        at java.lang.Iterable.forEach(Iterable.java:75) ~[?:1.8.0_275]
        at org.eclipse.smarthome.core.thing.internal.CommunicationManager.handleCallFromHandler(CommunicationManager.java:483) ~[?:?]
        at org.eclipse.smarthome.core.thing.internal.CommunicationManager.stateUpdated(CommunicationManager.java:465) ~[?:?]
        at org.eclipse.smarthome.core.thing.internal.ThingManagerImpl$1.stateUpdated(ThingManagerImpl.java:168) ~[?:?]
        at org.eclipse.smarthome.core.thing.binding.BaseThingHandler.updateState(BaseThingHandler.java:245) ~[?:?]
        at org.openhab.binding.mqtt.generic.AbstractMQTTThingHandler.updateChannelState(AbstractMQTTThingHandler.java:274) ~[?:?]
        at org.openhab.binding.mqtt.generic.ChannelState.processMessage(ChannelState.java:204) ~[?:?]
        at org.eclipse.smarthome.io.transport.mqtt.internal.ClientCallback.lambda$3(ClientCallback.java:96) ~[?:?]
        at java.util.ArrayList.forEach(ArrayList.java:1259) ~[?:1.8.0_275]
        at org.eclipse.smarthome.io.transport.mqtt.internal.ClientCallback.messageArrived(ClientCallback.java:96) ~[?:?]
        at org.eclipse.smarthome.io.transport.mqtt.internal.ClientCallback.messageArrived(ClientCallback.java:71) ~[?:?]
        at com.hivemq.client.internal.mqtt.mqtt3.Mqtt3AsyncClientView.lambda$callbackView$1(Mqtt3AsyncClientView.java:73) ~[bundleFile:?]
        at com.hivemq.client.internal.mqtt.MqttAsyncClient$CallbackSubscriber.onNext(MqttAsyncClient.java:227) [bundleFile:?]
        at com.hivemq.client.internal.mqtt.MqttAsyncClient$CallbackSubscriber.onNext(MqttAsyncClient.java:212) [bundleFile:?]
        at com.hivemq.client.rx.FlowableWithSingle$SingleFutureSubscriber.onNext(FlowableWithSingle.java:377) [bundleFile:?]
        at com.hivemq.client.internal.rx.operators.FlowableWithSingleCombine$SplitSubscriber$Default.tryOnNextActual(FlowableWithSingleCombine.java:206) [bundleFile:?]
        at com.hivemq.client.internal.rx.operators.FlowableWithSingleCombine$SplitSubscriber.tryOnNext(FlowableWithSingleCombine.java:171) [bundleFile:?]
        at io.reactivex.internal.operators.flowable.FlowableObserveOn$ObserveOnConditionalSubscriber.runAsync(FlowableObserveOn.java:649) [bundleFile:?]
        at io.reactivex.internal.operators.flowable.FlowableObserveOn$BaseObserveOnSubscriber.run(FlowableObserveOn.java:176) [bundleFile:?]
        at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66) [bundleFile:?]
        at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57) [bundleFile:?]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_275]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_275]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_275]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_275]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_275]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_275]

After some trail and error it seems to be caused by the dimmer items (eg. EQ_Ventilation_Supply_Duty). For now I have changed them to Number:Dimensionless and everything seems to work fine. I hope it can help others who are trying to set this up.

hey since there is now this python and jython stuff available as part of openhab scripting is there a way to actually get this “closer” to openhab standards?

best

There is now an official API.
They even Show openhab as example at Minute 8

Now … Who integrates it in a Binding? :slight_smile:

edit
they also have a web portal

1 Like

Zehnder offered to give 1:1 Session to Talk about the API and openhab Integration.
Somebody want to Join? Possibly in German as My Mails with Them were in German.
@klaudiusz223 @stfn82 @michaelarnauts
Interested?

Thnx for the heads up. Would be interesting to see how this develops. Unfortunately I have no coding experience.

I’m also interested. But as @stfn82 I have also very little coding experience. By the way Zehnder shows they have integration with OH. Is it only plans or they already have something?

Hi. Also Interesses with very little coding expertise as well.
Some questions on the way Zender shows it in their video with “OH support” ? What exactly are they claiming to provide ?
RoL

Are you still in contact with Zehnder on the API and is there anything I can help ?

They invite soonish for a next Meeting to discuss their API.
If you are a Dev and can Work in the Binding I can pull you in the Fall with Them.

Hi would be so nice to have a binding for this.
Also very interested

I received now access to the beta of their API.
Any Devs here that are interested to work on a binding?
I can also pull you in a direct contact with a Dev on their side.

Let me know.

Are there any news about that binding?

I am interested as well – any news ?

And is it possible to share what shorty707 has received as beta API description ?

Are there any news about a Binding? Maybe even as test version?

1 Like

Guys, I lost myself reading. Can you confirm if there is any way to connect to Q350 without ComfoConnect LAN C?

I think ComfoConnect KNX C module and KNX binding, described here:
Integrating Zehnder ComfoAir 350 using ComfoConnect KNX C - Tutorials & Examples - openHAB Community

I’ve created a rule to send a notification if it’s time to change your filters. At 90, 60, 30 and 7 days or less you get a notification.

Also I noticed that a few times a day the filtertime was increased with 1 and later on it was decreased with 1 again to the actual value. Don’t know what is causing this, but I coded a workaround. NB. you need to persist EQ_Ventilation_Filter_Replace_Remaining_Time for this to work. It could be caused because I restart the comfoair service every 4h, otherwise it hangs so often.

rule "13 Filters vervangen"
when
    Item EQ_Ventilation_Filter_Replace_Remaining_Time changed
then
    val filtertimePrevious = EQ_Ventilation_Filter_Replace_Remaining_Time.previousState(true).state
    logInfo("13 Filters vervangen", "Comfoair filtertime = " + EQ_Ventilation_Filter_Replace_Remaining_Time.state.toString)
    logInfo("13 Filters vervangen", "Comfoair previous filtertime = " + String::format("%.0f", (filtertimePrevious as Number).floatValue))
    
    if ( EQ_Ventilation_Filter_Replace_Remaining_Time.state < filtertimePrevious) {
        logInfo("13 Filters vervangen", "Comfoair filtertime is lager dan de vorige waarde.")
        if (EQ_Ventilation_Filter_Replace_Remaining_Time.state == 90 || EQ_Ventilation_Filter_Replace_Remaining_Time.state == 60 || EQ_Ventilation_Filter_Replace_Remaining_Time.state == 30 || EQ_Ventilation_Filter_Replace_Remaining_Time.state < 8) {
            val telegramAction = getActions("telegram","telegram:telegramBot:Telegram_Bot")
            telegramAction.sendTelegram("Comfoair filtertime is " + EQ_Ventilation_Filter_Replace_Remaining_Time.state.toString)
        }
    } else {
        logInfo("13 Filters vervangen", "Comfoair filtertime is hoger dan de vorige waarde. Melding wordt genegeerd.")
    }
end
1 Like