[SOLVED] Migrate Stiebel-Eltron LWZ403+ISGWeb to OH2.4 and new modbus-binding-2.4.0

Hi Jens,
yes, it’s “Option 1”.
I just had a phone conversation with the technical support of Tecalor.
The problem is, that on my ISGweb “EMI Energymanagement” is active (for connecting with my SMAphotovoltaic system). And: You can’t have Modbus and EMI active on the same ISGweb :roll_eyes:
Learning never stops!
So i have to find another way to get the data from my tecalor system.

I assume you now have created many more things / items to read data from your heating.
I am just connecting now opnehab to my ISG and if you have more things / items to share that would be a real timesaver :slight_smile:

Hi Shorty,

here is my latest config:


Bridge modbus:tcp:lwz [ host="", port=502, id=1 ] {   
// Lueftersteuerung
Bridge poller luefter [ start=1000, length=27, refresh=1000, type="holding" ] {
	Thing data STUFETAG [ readStart="1017", readValueType="int16", writeStart="1017", writeValueType="int16", writeType="holding" ]
	Thing data STUFENACHT [ readStart="1018", readValueType="int16", writeStart="1018", writeValueType="int16", writeType="holding" ]

// Systemparameter (Holding r+w)
Bridge poller heizungsdaten1 [ start=1000, length=27, refresh=1000, type="holding" ] {
	Thing data WWSOLLTAG [ readStart="1011", readValueType="int16", readTransform="JS(divide10.js)" ]
	Thing data WWSOLLNACHT [ readStart="1012", readValueType="int16", readTransform="JS(divide10.js)" ]
	// Issue with datatype 7
	Thing data HK1STEIGUNG [ readStart="1007", readValueType="int16", readTransform="JS(divide100.js)" ]
	Thing data HK1FUSSPUNKT [ readStart="1008", readValueType="int16", readTransform="JS(divide10.js)" ]
	Thing data HK2STEIGUNG [ readStart="1009", readValueType="int16", readTransform="JS(divide100.js)" ]
	Thing data HK2FUSSPUNKT [ readStart="1010", readValueType="int16", readTransform="JS(divide10.js)" ]

// Systemwerte (InputRegister)
Bridge poller heizungsdaten2 [ start=0, length=31, refresh=1000, type="input" ] {
	Thing data RAUMISTTEMPHK1 [ readStart="0", readValueType="int16", readTransform="JS(divide10.js)" ]
	Thing data RAUMSOLLTEMPHK1 [ readStart="1", readValueType="int16", readTransform="JS(divide10.js)" ]
	Thing data AUSSENTEMPERATUR [ readStart="6", readValueType="int16", readTransform="JS(divide10.js)" ]
	Thing data WWISTTEMP [ readStart="15", readValueType="int16", readTransform="JS(divide10.js)" ]
	Thing data WWSOLLTEMP [ readStart="16", readValueType="int16", readTransform="JS(divide10.js)" ]
	Thing data KOLLEKTORTEMPERATUR [ readStart="26", readValueType="int16", readTransform="JS(divide10.js)" ]	

// Energetische Daten (InputRegsiter)
Bridge poller energetik [ start=3000, length=32, refresh=1000, type="input" ] {
	Thing data PHEIZUNGTAG [ readStart="3021", readValueType="int16" ]
	Thing data PHEIZUNGSUMME1 [ readStart="3022", readValueType="int16" ]
	Thing data PHEIZUNGSUMME2 [ readStart="3023", readValueType="int16" ]
	Thing data PWWTAG [ readStart="3024", readValueType="int16" ]
	Thing data PWWSUMME1 [ readStart="3025", readValueType="int16" ]
	Thing data PWWSUMME2 [ readStart="3026", readValueType="int16" ]
	Thing data ELEKTRNEHEIZEN [ readStart="3030", readValueType="int16" ]
	Thing data ELEKTRNEWW [ readStart="3031", readValueType="int16" ]


// Systemparameter
Number WWSOLLTAG “WW-Soll-Tag [%.1f °C]” { channel=“modbus:data:lwz:heizungsdaten1:WWSOLLTAG:number”, autopudate=“false” }
Number WWSOLLNACHT “WW-Soll-Nacht [%.1f °C]” { channel=“modbus:data:lwz:heizungsdaten1:WWSOLLNACHT:number”, autopudate=“false” }
Number HK1FUSSPUNKT “Fusspunkt HK1 [%.1f °C]” { channel=“modbus:data:lwz:heizungsdaten1:HK1FUSSPUNKT:number”, autopudate=“false” }
Number HK1STEIGUNG “Steigung HK1 [%.2f]” { channel=“modbus:data:lwz:heizungsdaten1:HK1STEIGUNG:number”, autopudate=“false” }
Number HK2FUSSPUNKT “Fusspunkt HK2 [%.1f °C]” { channel=“modbus:data:lwz:heizungsdaten1:HK2FUSSPUNKT:number”, autopudate=“false” }
Number HK2STEIGUNG “Steigung HK2 [%.2f]” { channel=“modbus:data:lwz:heizungsdaten1:HK2STEIGUNG:number”, autopudate=“false” }

// Systemwerte
Number RAUMISTTEMPHK	"Raum-Ist [%.1f °C]"			{ channel="modbus:data:lwz:heizungsdaten2:RAUMISTTEMPHK1:number", autopudate="false" }
Number RAUMSOLLTEMPHK	"Raum-Soll [%.1f °C]"			{ channel="modbus:data:lwz:heizungsdaten2:RAUMSOLLTEMPHK1:number", autopudate="false" }
Number WWISTTEMP        "WW-Ist [%.1f °C]"				{ channel="modbus:data:lwz:heizungsdaten2:WWISTTEMP:number", autopudate="false" }
Number WWSOLLTEMP		"WW-Soll [%.1f °C]"				{ channel="modbus:data:lwz:heizungsdaten2:WWSOLlTEMP:number", autopudate="false" }
Number AUSSENTEMPERATUR	"Aussen-Temp [%.1f °C]"			{ channel="modbus:data:lwz:heizungsdaten2:AUSSENTEMPERATUR:number", autopudate="false" }
Number KOLLEKTORTEMPERATUR "Kollektor-Temp [%.1f °C]"	{ channel="modbus:data:lwz:heizungsdaten2:KOLLEKTORTEMPERATUR:number", autopudate="false" }

// Energetische Daten
Number PHEIZUNGTAG		"P-Heizung-Tag [%d kWh]"		{ channel="modbus:data:lwz:energetik:PHEIZUNGTAG:number", autopudate="false" }
Number PHEIZUNGSUMME1	"P-Heizung-Summe1 [%d kWh]"		{ channel="modbus:data:lwz:energetik:PHEIZUNGSUMME1:number", autopudate="false" }
Number PHEIZUNGSUMME2	"P-Heizung-Summe2 [%d mWh]"		{ channel="modbus:data:lwz:energetik:PHEIZUNGSUMME2:number", autopudate="false" }
Number ELEKTRNEHEIZEN	"ELEKTR. NE HEIZEN [%d h]" 		{ channel="modbus:data:lwz:energetik:ELEKTRNEHEIZEN:number", autopudate="false" }
Number ELEKTRNEWW 		"ELEKTR. NE WW [%d h]" 			{ channel="modbus:data:lwz:energetik:ELEKTRNEWW:number", autopudate="false" }
Number PWWTAG			"P-WW-Tag [%d kWh]"				{ channel="modbus:data:lwz:energetik:PWWTAG:number", autopudate="false" }
Number PWWSUMME1		"P-WW-Summe1 [%d kWh]"			{ channel="modbus:data:lwz:energetik:PWWSUMME1:number", autopudate="false" }
Number PWWSUMME2		"P-WW-Summe2 [%d mWh]"			{ channel="modbus:data:lwz:energetik:PWWSUMME2:number", autopudate="false" }

// Luefter
Number STUFETAG			"Stufe Tag"						{ channel="modbus:data:lwz:luefter:STUFETAG:number", autopudate="false" }
Number STUFENACHT		"Stufe Nacht"					{ channel="modbus:data:lwz:luefter:STUFENACHT:number", autopudate="false" }


sitemap lwz label=“LWZ”

Frame label=“Lueftersteuerung” {
Switch item=STUFETAG mappings=[0=“OFF”, 1=“MIN”, 2=“MED”, 3=“MAX”]
Switch item=STUFENACHT mappings=[0=“OFF”, 1=“MIN”, 2=“MED”, 3=“MAX”]

Frame label=“Sytemwerte” {

  Text item=WWISTTEMP
  Text item=WWSOLLTAG


Frame label=“Energetische Werte” {
Text item=PWWTAG
Text item=PWWSUMME2
Text item=PWWSUMME1

Frame label=“Heizungssteuerung” {

Did not yet configure rules :slight_smile:


I already read some values because of your great support which helps so much to learn fast!

I have ISG on latest firmware and a WPM4 heatpump.
Odd thing … the registers from the manual PDF are incorrect for WPM4 …
I definately e.g. read “Outside Temp (Aussentemperatur)” on 506 … manual says 507.

My next question would be …
could you share the divide10.js etc scripts for the transformations ? :slight_smile:
does that transformation “on the fly” also work for write actions?

thanks !!

OK - found this on the manual now… for some reason they say everything could off by 1 register index.
Modbus is too new for me to understand what they mean with “1 based”.

See the modbus binding documentation, ‘Transformations’

Hi Shorty,

yes you are correct the addressing is -1 so if you want to read register 1001 you have to put register 1000 in your OpenHab configuration.


// Wrap everything in a function (no global variable pollution)
// variable "input" contains data passed by openhab
(function(inputData) {
// on read: the polled number as string
// on write: openHAB command as string
var DIVIDE_BY = 10;
return parseFloat(inputData) / DIVIDE_BY;

I did not try to write value that need to be transformed, but this works similarly. I think it was explained in the docu: https://www.openhab.org/addons/bindings/modbus/#modbus-binding

I will as well look into this once I have more time.


Hi Jens,

I would like to control the fan with Alexa. Can you help me with that?


Hi Stlyewarz3,

I am not integrating with Alexa yet, however I think once you have the OpenHAB skill setup and you can control the fan from OpenHAB now that this should as well work via Alexa:

OpenHAB Alexa Skill

Why would you do that via Alexa though? There is 2 reasons to adjust fan speed: outside temperature (you do not want to get the hot air in summer into the house) and air quality (which you could measure with NetAtmo modules which have built-in CO2 sensors).

A third could be noise - but if your system is correctly configured you should not have annoying noise.


  • Jens

I want to put the levels 0,1,2,3 with Alexa. alexa needs a switch, but a switch has only two states. So I need 4 switches, each with a status (0, 1, 2, 3). Or do you have another idea?

I have fixed this in OpenHAB with declaring the item itself as number and then work with a mapping in OpenHAB

Frame label=“Lueftersteuerung” {
Switch item=STUFETAG mappings=[0=“OFF”, 1=“MIN”, 2=“MED”, 3=“MAX”]
Switch item=STUFENACHT mappings=[0=“OFF”, 1=“MIN”, 2=“MED”, 3=“MAX”]

As said I did not work with Alexa yet but I use the REST API and basically you can set the value - maybe you could say Alexa, fan level 0…?


Hi Jens,

Do you have any experience with trying integrate the new LWZ 180 & 280 machines with modbus? If so can you help? @JensF

Hi @Darbur8,

it seems these are not compatible with the ISG Web interface which is needed (or recommended, I think there was a guide on the web to create your own serial adapter, too).

You can check out the ISG docu if you find references to supported devices:

[https://www.stiebel-eltron.de/content/dam/ste/cdbassets/historic/bedienungs-_u_installationsanleitungen/ISG_Modbus__b89c1c53-6d34-4243-a630-b42cf0633361.pdf](https://Stiebel Eltron LWZ)


Hi @JensF

Thank you for your reply.

Do you have the guide at hand? Or can you tell me where I can find a it?

I just searched on Google and found this: lwz180/README.md at main · kdarnok/lwz180 · GitHub

Maybe it helps - I am afraid I cannot help you further.


How to transform in Openhab 4.0.0?
It seems as the JS transform (divide10) is not available anymore?

There seems to be discussions on this within the community already, check out this thread

I am yet to move on to OH4, currently on 3.4.4


I’m trying to set the warm water temperature in the modbus stiebel isg binding - default name water temperature set point - but if I enter 37 (for 37°C) it shows a few seconds the value, but falls back to the currently set valvue (44°C in my case) and is not transmitted to the ISG.
In the former version (modbus without stiebel extension) I’ve transmitted 370 (due to the data type) - that worked.
What do I need to do to get it done with the new official binding?

Modbus binding support read/write transformation. You need to scale values according to ISG thresholds.

But what in Detail do I need to send? I tried various values,read once again the Stiebel ISG modbus pdf, in case I miss something…?
Please advice,
thanks, Christian

Look for examples involving ie. javascript transformations and divide.js examples on the forum. Whole trick you need is making i.e $ohState*10 during write and $isgValue/10 while reading. Even this topic includes an example: [SOLVED] Migrate Stiebel-Eltron LWZ403+ISGWeb to OH2.4 and new modbus-binding-2.4.0 - #19 by JensF

Please note that openHAB 4.0 changes a bit syntax for calling transformation services, so many of available blueprints may require further tweaking.