How to set SGReady states using the Stiebel-Eltron ISG binding?

How to set SGReady states using the Stiebel-Eltron ISG binding?
I have the binding working and can happily ready the items.
But how to set the SGReady states, or change the target temperature or the heating schedules, or the holiday mode…?

You cannot set the temperature values for the SG-Ready state in this binding.
But you should be able to set Eco and Comfort temperatures and heating mode using the predefined channels.
I additionally use the modbus binding to get/control some other values for example to enable/disable SG-Ready.

Could you share the config for that please ?

Does one need the ISG in order to do modbus ? Do you have the Stiebel modbus spec ?

Yes, at least for my device (WPF 07 Cool) you need the ISG to use both, the binding or modbus.The binding is also based on modbus as far as I know.
To use modbus you first need the add a modbus TCP slave thing:

UID: modbus:tcp:c6786e01
label: Heizung Modbus TCP Slave
thingTypeUID: modbus:tcp
  rtuEncoded: false
  connectMaxTries: 1
  reconnectAfterMillis: 60000
  timeBetweenTransactionsMillis: 60
  port: 502
  timeBetweenReconnectMillis: 0
  connectTimeoutMillis: 10000
  host: "Your ISG IP"
  afterConnectionDelayMillis: 0
  id: 1
  enableDiscovery: false
location: Heizung

Then you need a modbus poller thing where you configure the registers you want to read/write. This can include only one register or multiple depending what you need:

UID: modbus:poller:c6786e01:c9b5ee93f5
label: Heizung Regular Poll SG-Ready
thingTypeUID: modbus:poller
  start: 4000
  length: 1
  refresh: 60000
  maxTries: 3
  cacheMillis: 50
  type: holding
bridgeUID: modbus:tcp:c6786e01
location: Heizung

Finally you need a modbus data thing which references to the pooler. Here you can link an item. You have also to configure which single register you want to handle with. The poller obviously also have to include this adress:

UID: modbus:data:31ae134298
label: Heizung SG-Ready On/Off
thingTypeUID: modbus:data
  readValueType: uint16
  readTransform: default
  writeTransform: default
  writeType: holding
  readStart: "4000"
  updateUnchangedValuesEveryMillis: 1000
  writeValueType: int16
  writeMultipleEvenWithSingleRegisterOrCoil: false
  writeMaxTries: 3
  writeStart: "4000"
bridgeUID: modbus:poller:c6786e01:c9b5ee93f5
location: Heizung
  - id: number
    channelTypeUID: modbus:number-type
    label: Value as Number
    description: Number item channel
    configuration: {}
  - id: switch
    channelTypeUID: modbus:switch-type
    label: Value as Switch
    description: Switch item channel
    configuration: {}
  - id: contact
    channelTypeUID: modbus:contact-type
    label: Value as Contact
    description: Contact item channel
    configuration: {}
  - id: dimmer
    channelTypeUID: modbus:dimmer-type
    label: Value as Dimmer
    description: Dimmer item channel
    configuration: {}
  - id: datetime
    channelTypeUID: modbus:datetime-type
    label: Value as DateTime
    description: DateTime item channel
    configuration: {}
  - id: string
    channelTypeUID: modbus:string-type
    label: Value as String
    description: String item channel
    configuration: {}
  - id: rollershutter
    channelTypeUID: modbus:rollershutter-type
    label: Value as Rollershutter
    description: Rollershutter item channel
    configuration: {}
  - id: lastReadSuccess
    channelTypeUID: modbus:last-successful-read-type
    label: Last Successful Read
    description: Date of last read
    configuration: {}
  - id: lastReadError
    channelTypeUID: modbus:last-erroring-read-type
    label: Last Erroring Read
    description: Date of last read error
    configuration: {}
  - id: lastWriteSuccess
    channelTypeUID: modbus:last-successful-write-type
    label: Last Successful Write
    description: Date of last write
    configuration: {}
  - id: lastWriteError
    channelTypeUID: modbus:last-erroring-write-type
    label: Last Erroring Write
    description: Date of last write error
    configuration: {}

To conclude: You need a slave, one or multiple pollers and a modbus data thing for each value you want to read/write.
In my case I “short-circuited” the SG-Ready Input on the ISG so it is always “ON”. Like this I can control if SG-Ready should be active using the modbus thing, depending on my Photovoltaics power production.

You should get modbus referenz from Stiebel Website.
Modbus reference ISG
Stiebel Eltron Modbus

Yeah that’s pretty much standard in modbus implementations.
Thanks for the spec pointer, according to that it’s modbus register 5001 you can use to set the SGr mode.

Now on making that part of the binding @laursen is the author of that one.
Thanks for your contribution Jacob.
Would you be willing to upgrade the binding with 5001 and maybe some more of the registers from the spec document ?

You may also need the 400x registers.
In my case I had also to use registers like 1505 + 1506 as I have two Heating circuits and the binding only provides access to Heating circuit 1, which is useless in my case. I have to use circuit 2.

I think you confused me with someone else. :wink:

Sorry then. @robd @Levin1 you can create a PR yourself or a feature request with the openhab-addons repository on Github. Prefix the title with [stiebeleltron] or so.

What do you mean with “always ON”? So you do not need above items?

see [stiebeleltron] Add SG-Ready to the Stiebel-Eltron ISG binding · Issue #16758 · openhab/openhab-addons · GitHub

Yes I need the items. Otherwise SG-Ready is always active on the heatpump.
In my setup, the ISGs SG-Ready Input (which you can connect to your inverter for example to control on/off) is always “ON” / contact closed, so SG-Ready would be active always. If I want to switch to normal heating, I disable SG-Ready function on the heatpump thgrough modbus.
I hope this makes sense.

But that’s not normal. Eletrically speaking you have an install fail, haven’t you ?
BTW in the modbus doc there were registers for “activating” single SGr inputs, 4002/3 I think they were.

Its just an open/close contact. There should be no electricity on it.
Yes I saw 4002/3 registers too yesterday. They are r/w.
Maybe I could get rid of the physical SG-Ready input.

Sorry, I am still confused:
Are you talking about a physical contact? Where is that on the heat pump or the ISG?
Or are you talking about the energy management setting in the ISG web interface (in my case: Einstellungen → Energiemanagement).
There I have “SGREADY AKTIVIERT” = “on” or “off”
and “SG-READY EINGANG” = “off” or “Modbus” or “CAN bus”.

I would assume to set the first to “on” and the second to “Modbus”.

Yes it is a physical contact on the ISG. It is normally used to connect it to an inverter so he can force SG-Ready if there is enough sun-power. But I wanted to control it by openhab, so I built this special setup.
But as there are modbus register the physical contact is maybe not needed.
The “SGREADY aktiviert” just enables the functionality itself but if there is no such signal it will not activate sgready mode. So in my case there is always the signal as the physical contact is closed all the time. To stop SGReady mode I use modbus to disable it temporarily, like the mentioned setting in UI.
In my case I can not see the second setting you mentioned in UI.

1 Like

It’s on the heat pump, isn’t it ? You can run your pump without ISG.

No on the ISG.
Maybe the Heatpump also have one but I don’t think so.
There is no SG-Ready option directly on my heatpump as far as I know. Maybe it depends on model.

The code seems to be rather easy, but please confirm:
As far as I understand the source code following registers are currently covered, that are related to this topic:
They are read/write (int16):
The current operation mode of the heat pump (1=ready mode, 2=program mode, 3=comfort mode, 4=eco mode, 5=heating water mode, 0=emergency mode)

In the modbus doc they list the registers with +1 so 1501 instead of 1500. But this seems to be a config issue (1 based / 0 based)

Alone with these existing settings I could already control my headpump, not sure why I did not see it. Then SG Ready might not be such relevant any more.

So Levin wants to add
CHANNEL_COMFORT_TEMPERATURE_HEATING_2: 1504 // for register 1505
CHANNEL_ECO_TEMPERATURE_HEATING_2:1505// for register 1506

and then we might need the SGReady ones:
CHANNEL_SGREADY_ONOFF:4000 // for register 4001 read/write
CHANNEL_SGREADY_STATE: 5000 // for register 5001 read only
1: Heating system must not start. Frost protection is assured.
2: Standard operation. Automatic/ programmed omode (see operating and installation instructions for the connected heat pump)
3: Accelerated mode with increased values for heating and DHW temperature
4: Immediate switch to maximum heating and DHW temperature values

If this operation mode is set we need to write to two other registers:
1 → 0 / 1 (if operation mode should be set to 1 write 0 to [SG READY INPUT 1] and 1 to [SG READY INPUT 2]
2 → 0 / 0
3 → 1 / 0
4 → 1 / 1
The docu lists [SG READY INPUT 2] before [SG READY INPUT 1] not sure if this sort order is relevant.

I think I can write the code, but I do not have a dev environment to compile it any more.