Helios Binding for Modbus TCP

Hi,
do you also have a Thing for the KWL and is it also online?
What’s your Item and Sitemap definitions?

kwl.things file:
Bridge modbus:tcp:modbus-gateway “Modbus TCP/IP Gateway” [ host=“192.168.0.25”, port=502, id=180, enableDiscovery=true ] {
Thing helios-ventilation-easycontrols kwl “KWL”
}

default.sitemap:
Text label=“KWL” icon=“fan” {
Frame label=“Manual operation” {
Selection item=KWL_Manual mappings=[0=Auto, 1=Manual]
Selection item=KWL_Stage mappings=[0=off, 1=“Stage 1”, 2=“Stage 2”, 3=“Stage 3”, 4=“Stage 4”]
Text item=KWL_Stage_Percent
}

Frame label="Party mode" {
    Switch item=KWL_Party_Mode mappings=[OFF=off, ON=on]
    Selection item=KWL_Party_Mode_Stage mappings=[0=off, 1="Stage 1", 2="Stage 2", 3="Stage 3", 4="Stage 4"]
    Selection item=KWL_Standby_Mode_Duration mappings=[60="60 Minutes", 120="120 Minutes", 180="180 Minutes", 240="240 Minutes"]
    Text item=KWL_Party_Mode_Remaining
}

Frame label="Standby mode" {
    Switch item=KWL_Standby_Mode mappings=[OFF=Aus, ON=Ein]
    Selection item=KWL_Standby_Mode_Stage mappings=[0=off, 1="Stage 1", 2="Stage 2", 3="Stage 3", 4="Stage 4"]
    Selection item=KWL_Standby_Mode_Duration mappings=[60="60 Minutes", 120="120 Minutes", 180="180 Minutes", 240="240 Minutes"]
    Text item=KWL_Standby_Mode_Remaining
}

Frame label="Status infos" {
    Text item=KWL_Temp_Outide_Air
    Text item=KWL_Temp_Supply_Air
    Text item=KWL_Temp_Outgoing_Air
    Text item=KWL_Temp_Extract_Air
    Text item=KWL_Supply_Air_RPM
    Text item=KWL_Extract_Air_RPM
    Text item=KWL_Filter_Change
    Text item=KWL_Filter_Change_Remaining
    Text item=KWL_Errors_String
    Text item=KWL_Warnings_String
    Text item=KWL_Infos_String
    Text item=KWL_Datum
    Text item=KWL_Zeit
}

}

Haus.items

// Manual operation
Number KWL_Manual “Manual operation” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:operation#operatingMode”}
Number KWL_Stage “KWL fan stage” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:operation#fanStage”}
Number:Dimensionless KWL_Stage_Percent “KWL fan stage [%d %unit%]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:operation#percentageFanStage”}

// Party mode
Switch KWL_Party_Mode “Party mode” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:operation#partyModeStatus”}
Number KWL_Party_Mode_Duration “Party mode duration” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:operation#partyModeDuration”}
Number KWL_Party_Mode_Stage “Party mode fan stage” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:operation#partyModeFanStage”}
Number KWL_Party_Mode_Remaining “Party mode remaining time [%d min]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:operation#partyModeRemainingTime”}

// Standby mode
Switch KWL_Standby_Mode “Standby mode” <fan_off> (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:operation#standbyModeStatus”}
Number KWL_Standby_Mode_Duration “Standby mode duration” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:operation#standbyModeDuration”}
Number KWL_Standby_Mode_Stage “Standby mode fan stage” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:operation#standbyModeFanStage”}
Number KWL_Standby_Mode_Remaining “Standby mode remaining time [%d min]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:operation#standbyModeRemainingTime”}

// Status infos
Number:Temperature KWL_Temp_Outide_Air “Temperature outside air [%.1f °C]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:general#temperatureOutsideAir”}
Number:Temperature KWL_Temp_Supply_Air “Temperature supply air [%.1f °C]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:general#temperatureSupplyAir”}
Number:Temperature KWL_Temp_Outgoing_Air “Temperature outgoing air [%.1f °C]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:general#temperatureOutgoingAir”}
Number:Temperature KWL_Temp_Extract_Air “Temperature extract air [%.1f °C]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:general#temperatureExtractAir”}
Number KWL_Supply_Air_RPM “RPM supply air [%d]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:general#supplyAirRpm”}
Number KWL_Extract_Air_RPM “RPM extract air [%d]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:general#extractAirRpm”}
Number KWL_Filter_Change “Filter change [MAP(helios_yes_no.map):%s]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:unitConfig#filterChange”}
Number KWL_Filter_Change_Remaining “Filter change [%d %unit%]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:general#filterChangeRemainingTime”}

Number KWL_Errors “Number errors [%d]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:general#noOfErrors”}
String KWL_Errors_String “Error messages [%s]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:general#errorsMsg”}
Number KWL_Warnings “Number warnings [%d]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:general#noOfWarnings”}
String KWL_Warnings_String “Warning messages [%s]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:general#warningsMsg”}
Number KWL_Infos “Number infos [%d]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:general#noOfInfos”}
String KWL_Infos_String “Info messages [%s]” (gKWL) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:general#infosMsg”}

Switch KWL_Bypass “KWL - Bypass offen” (gKWL, gKWL_Status, gMQTT) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:general#bypassStatus”}
DateTime KWL_Bypass_von “Bypass von [%1$td/%1$tm]” (gKWL, gMQTT) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:unitConfig#bypassFrom”}
DateTime KWL_Bypass_bis “Bypass bis [%1$td/%1$tm]” (gKWL, gMQTT) {channel=“modbus:helios-ventilation-easycontrols:modbus-gateway:kwl:unitConfig#bypassTo”}

in the log file i see
2020-11-16 06:13:57.663 [hingStatusInfoChangedEvent] - ‘modbus:tcp:modbus-gateway’ changed from UNINITIALIZED to INITIALIZING
2020-11-16 06:13:57.668 [hingStatusInfoChangedEvent] - ‘modbus:tcp:modbus-gateway’ changed from INITIALIZING to ONLINE

Both in the Things definition as well as the channels attached to the items remote the ‘ventilation’ part.
It should be helios-easycontrols instead of helios-ventilation-easycontrols.
This mistake will be removed from the OH3 documentation…

that fix it for me - thank you!

Hi Bernhard,

I have another question to the binding. In the things documentation the channel operatingMode is defined as Switch, but in the example you used the numbertype.

Which is the correct type? Switch oder Number?

Hi Malte,

thanks for the info!
It should be a Number item, 0 indicating “automatic” mode, 1 indicating “manual” mode.

1 Like

Hi,

first of all: many thanks for the binding! Works really good. But today i found this warning in the logs:

2020-12-04 09:38:30.774 [WARN ] [s.internal.HeliosEasyControlsHandler] - HeliosEasyControlsHandler encountered Exception when trying to update property: Illegal value for variable heatExchangerType: 3

Looking into the documentation it looks like there is something wrong:

From the binding doku:

heatExchangerType Heat exchanger type (0 = plastic, 1 = aluminium, 2 = enthalpy)

And from the helios doku https://www.easycontrols.net/de/service/downloads/send/4-software/16-modbus-dokumentation-f%C3%BCr-kwl-easycontrols-ger%C3%A4te page 10 the heat exchanger type (Wärmetauschertyp) starts with the key 1 and ends with 3. Is there a possibility to change this in a config?

br
markus

Hi,
thanks for the info on this bug. I’ve created an issue and just submitted a PR for the corresponding changes that should fix this.

Many thanks Bernhard!

br
markus

hello guys, first of all thank you very much for this post. he has already helped me a lot. i own a helios 300w ec. connected via lan rj45 and the remote controls are connected via rj12. I have created the thing helios-easycontrols according to Helios easyControls - Bindings | openHAB. The Modbus binding is also installed and correctly created (enableDiscovery). Both are online in the paperui under things. there is no error message in the openhab2 log viewer. However, no values are displayed in the basicui. if i change values in the basicui, these are not implemented in the helios kwl. the changes are in the log. What did I do wrong? I am using OH 2.5.11 and rrd4j persistence. Thank you

Hi @Peter85, it would help if you share your thing and item configuration

Can you please format the code Auto highlighting/formatting on code blocks in posts

Bridge modbus:tcp:modbus-gateway "Modbus TCP/IP Gateway" [ host="192.168.178.55", port=502, id=180, enableDiscovery=true ] {

    Thing helios-easycontrols kwl "KWL"

}
//KWL Lüftungsanlage

// Manual operation

Number KWL_Manual                        "Manual operation"                          <fan>         (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#operatingMode"}

Number KWL_Stage                         "KWL fan stage"                             <fan>         (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#fanStage"}

Number:Dimensionless KWL_Stage_Percent   "KWL fan stage [%d %unit%]"                 <fan>         (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#percentageFanStage"}

// Party mode

Switch KWL_Party_Mode                    "Party mode"                                <parents>     (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#partyModeStatus"}

Number KWL_Party_Mode_Duration           "Party mode duration"                       <clock>       (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#partyModeDuration"}

Number KWL_Party_Mode_Stage              "Party mode fan stage"                      <fan>         (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#partyModeFanStage"}

Number KWL_Party_Mode_Remaining          "Party mode remaining time [%d min]"        <clock>       (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#partyModeRemainingTime"}

// Standby mode

Switch KWL_Standby_Mode                  "Standby mode"                              <fan_off>     (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#standbyModeStatus"}

Number KWL_Standby_Mode_Duration         "Standby mode duration"                     <clock>       (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#standbyModeDuration"}

Number KWL_Standby_Mode_Stage            "Standby mode fan stage"                    <fan>         (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#standbyModeFanStage"}

Number KWL_Standby_Mode_Remaining        "Standby mode remaining time [%d min]"      <clock>       (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:operation#standbyModeRemainingTime"}

// Status infos

Number:Temperature KWL_Temp_Outide_Air   "Temperature outside air [%.1f °C]"         <temperature> (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#temperatureOutsideAir"}

Number:Temperature KWL_Temp_Supply_Air   "Temperature supply air [%.1f °C]"          <temperature> (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#temperatureSupplyAir"}

Number:Temperature KWL_Temp_Outgoing_Air "Temperature outgoing air [%.1f °C]"        <temperature> (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#temperatureOutgoingAir"}

Number:Temperature KWL_Temp_Extract_Air  "Temperature extract air [%.1f °C]"         <temperature> (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#temperatureExtractAir"}

Number KWL_Supply_Air_RPM                "RPM supply air [%d]"                       <fan>         (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#supplyAirRpm"}

Number KWL_Extract_Air_RPM               "RPM extract air [%d]"                      <fan>         (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#extractAirRpm"}

Number KWL_Filter_Change                 "Filter change [MAP(helios_yes_no.map):%s]" <none>        (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:unitConfig#filterChange"}

Number KWL_Filter_Change_Remaining       "Filter change [%d %unit%]"                 <clock>       (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#filterChangeRemainingTime"}

Number KWL_Errors                        "Number errors [%d]"                        <error>       (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#noOfErrors"}

String KWL_Errors_String                 "Error messages [%s]"                       <error>       (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#errorsMsg"}

Number KWL_Warnings                      "Number warnings [%d]"                      <warning>     (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#noOfWarnings"}

String KWL_Warnings_String               "Warning messages [%s]"                     <warning>     (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#warningsMsg"}

Number KWL_Infos                         "Number infos [%d]"                         <info>        (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#noOfInfos"}

String KWL_Infos_String                  "Info messages [%s]"                        <info>        (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#infosMsg"}

DateTime KWL_Datum                       "KWL Date and time [%1$td/%1$tm]"           <calendar>    (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#sysdate"}

Switch KWL_Bypass                       "KWL - Bypass offen"                        <switch>        (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:general#bypassStatus"}

DateTime KWL_Bypass_von                 "Bypass von [%1$td/%1$tm]"                  <calendar>      (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:unitConfig#bypassFrom"}

DateTime KWL_Bypass_bis                 "Bypass bis [%1$td/%1$tm]"                  <calendar>      (RRD4J,gKWL) {channel="modbus:helios-easycontrols:modbus-gateway:kwl:unitConfig#bypassTo"}

From a first look at your configuration I don’t see anything off with it. If the things are both online in PaperUI the communication with the device per se should work.
I think it’s best to try removing all but one item from the items file and see if you can get this to work, then add items to mabye identify the issue.

Do you see the device’s properties in PaperUI? (e.g. dateFormat or articleDescription).

Does it work with OH3?

many thanks @bern77 I’ll try it out like you wrote. where exactly should i look in the paperui? I haven’t tried it in the OH3. I got an error message after switching off the thing kwl and then switching it on again:

2020-12-30 17:56:37.541 [ERROR] [ing.ModbusSlaveConnectionFactoryImpl] - connect try 1/1 error: Connection refused (Connection refused). Connection TCPMasterConnection@1e8129c[socket=Socket[unconnected]]. Endpoint ModbusTCPSlaveEndpoint@fff6aa[address=192.168.178.55,port=502]

2020-12-30 17:56:37.542 [ERROR] [ing.ModbusSlaveConnectionFactoryImpl] - re-connect reached max tries 1, throwing last error: Connection refused (Connection refused). Connection TCPMasterConnection@1e8129c[socket=Socket[unconnected]]. Endpoint ModbusTCPSlaveEndpoint@fff6aa[address=192.168.178.55,port=502]

2020-12-30 17:56:37.543 [ERROR] [ing.ModbusSlaveConnectionFactoryImpl] - Error connecting connection TCPMasterConnection@1e8129c[socket=Socket[unconnected]] for endpoint ModbusTCPSlaveEndpoint@fff6aa[address=192.168.178.55,port=502]: Connection refused (Connection refused)

2020-12-30 17:56:37.544 [WARN ] [rt.modbus.internal.ModbusManagerImpl] - Could not connect to endpoint ModbusTCPSlaveEndpoint@fff6aa[address=192.168.178.55,port=502] -- aborting request ModbusWriteRegisterRequestBlueprint@1207c57[slaveId=180,reference=1,functionCode=WRITE_MULTIPLE_REGISTERS,registers=ModbusRegisterArrayImpl(76 30 32 31 32 39 00 00),maxTries=5] [operation ID cfd33572-7509-4b5d-8849-031f967173b8]

Good morning @Peter85,

since I’ve already migrated to OH3 I can’t post a screenshot. But if you view the KWL thing’s details, there should be ‘Properties’ section you can expand. If these properties are filled with meaningful contents this is also proof that the communication with the device works, so the problem must be in the items definition.

If you get an error of ‘connection refused’, are you certain you have the correct IP address for your device?
I can reproduce such an error if entering the wrong IP address… Generally I think it would be best to assign a static DHCP lease to your device to rule out communication issues on this level.

Hey @ bern77, thanks for your message. I looked for ‘Properties’ under things KWL. These are not available to me. For other things I can choose “show properties”. I just “logged” an item. Can you do something with that?
grafik
It is the correct IP of the Helios KWL EC300. I have a password for online operation. Is that required for OH?

The item info from the REST API also shows that the state of the item is NULL, i.e. no update from the device was received.

You shouldn’t need a password if you use the Modbus/TCP interface.

Did you activate the modbus interface in the device’s web interface? In my case it is under configuration / device (don’t know the exact wording in English since I’m usig it in German).

Hey Bernhard, happy new year! These are my configurations in the web interface.


grafik

Bridge modbus:tcp:modbus-gateway "Modbus TCP/IP Gateway" [ host="192.168.178.55", port=502, id=180, enableDiscovery=true ] {

    Thing helios-easycontrols kwl "KWL"

}

On the remote control KWL-BEC in the service menu, the IP address is 192.168.178.055.

Hi @Peter85,
happy New Year to you too!

Very strange, I use the exact same settings.

My guess would still be that the problem is somewhere in the networking rather than the OH config. If you get an error of ‘connection refused’ maybe the KWL’s IP address / port can’t be reached from openHAB. Are OH and the KWL in the same subnet? Are there any firewall rules which could prevent communication?

Another thing could be the KWL’s software version. The Modbus TCP specification indicates a minimum version of 2.01. Can you please check this in your system configuration?

1 Like