Is there any interest in a Stiebel Eltron climate platform?

It look like this for example in configuration.yaml:

  sensors:
  - name:                'LWZ BETRIEBSSTATUS'
    slave:                 1
    count:                 1
    address:             2000
    input_type:         input
    data_type:          uint16
binary_sensor:
  - platform: template
    sensors:
      lwz_filterwechsel:
        friendly_name: "LWZ Filterwechsel beide Filter"
        value_template: "{{ states('sensor.LWZ_BETRIEBSSTATUS')|int|bitwise_and(256) > 0 }}"

The entity “LWZ Filterwechsel beide Filter” shows then the status with on/off

Hi people,

Thanks for this thread! I own a LWZ 404 SOL and I’m desperate to integrate it into my HA for visualizing status informations, logging data over time and maybe start to control basic things like switching between automatic mode and “Bereitschaft” (standby?) to define slots when heating is more appropriate or not.

I’ve read about the ISG Web option (approx. 400€ AFAIR) which offers a gateway from the LWZ to LAN (RJ45) when I understood it correctly. It has much more functionality but I would not use it for that. I would use it as an interface to get data from/to HA.

Then there is the DIY variant (ESP-Home and an MCP 2515 CAN-Bus device; https://juerg5524.ch/list_data.php ) where I have to get some parts, solder them together and build something that gets connected to a RPi which is able to talk to HA.

So here’s my question to you: Did I understand it correctly that those two hardware options are more or less offering the same level of HA integration (number of values to read out; options to control basic things)?

If so, I probably will prefer bying the expensive ISG Web (although it’s hurting my geeky heart) because I’m able to solder parts together but I’m not able to debug DIY hardware issues when it’s not working and getting those (single) parts in the first place is very tedious to me as a non-hardware guy.

Thanks for your work and your motivation to share it with this community!

Hi @DaKo,

I ran into exact the same problem (no decimal values via modbus), so I quickly set up some screen scraping.
Initially, I used the built-in HA scrape integration, but that led to a huge amount of log errors and failures as the ISG frontend has such a bad performance that the scraper throwed a lot of connectivity errors. The problem is that the scrape integration will do seperate requests for every scraping task (=sensors, 4 in my case).

I decided to use multiscrape as this can handle several data scraping tasks within one http request.

My configuration:

multiscrape:
  - resource: http://<isg-ip>/?s=1,1
    scan_interval: 60
    sensor:
    
        # Wärmemenge VD Heizen Tag
      - unique_id: se_scrape_wm_heizen_tag
        select: "div.span-11:nth-child(2) > table:nth-child(1) > tr:nth-child(2) > td:nth-child(2)"
        value_template: '{{ value | replace ("KWh", "") }}'
        unit_of_measurement: kWh
        device_class: power
        
        # Wärmemenge VD Warmwasser Tag
      - unique_id: se_scrape_wm_warmwasser_tag
        select: "div.span-11:nth-child(2) > table:nth-child(1) > tr:nth-child(4) > td:nth-child(2)"
        value_template: '{{ value | replace ("KWh", "") }}'
        unit_of_measurement: kWh
        device_class: power
        
        # Leistungsaufnahme VD Heizen Tag
      - unique_id: se_scrape_la_heizen_tag
        select: "div.span-11:nth-child(3) > table:nth-child(1) > tr:nth-child(2) > td:nth-child(2)"
        value_template: '{{ value | replace ("KWh", "") }}'
        unit_of_measurement: kWh
        device_class: power
        
        # Leistungsaufnahme VD Warmwasser Tag
      - unique_id: se_scrape_la_warmwasser_tag
        select: "div.span-11:nth-child(3) > table:nth-child(1) > tr:nth-child(4) > td:nth-child(2)"
        value_template: '{{ value | replace ("KWh", "") }}'
        unit_of_measurement: kWh
        device_class: power

// Edit 13.06.2022: When you protected your ISG with a password, you can use the form submit functionality. This will let the multiscrape integration post the login form on first start (it will save the session / cookie, so this has not to be done every scrape run).
Just add the following lines to your multiscrape configuration:

    form_submit:
        select: "#werte"
        input:
            user: "<your-username>"
            pass: '<your-password>'
        submit_once: True
4 Likes

hey sorry I am just migrating to Home Assistant… so my questions might be stupid…

    - name:                WPL17 Komforttemperatur
      slave:               1
      address:             1501
      input_type:          holding
      scale:               0.1
      precision:           2
      unit_of_measurement: °C
      device_class:        temperature
      scan_interval:       60

can I define directly at creation of such entities a value range? so a minimum and max value that entity can actually have? and a stepping like stepping 0.1 ?

    - name:                WPL17 Betriebsart
      slave:               1
      address:             1500
      input_type:          holding
      scan_interval:       60

for this entity the value actually translates to a string.
so if the value == 1 I would like to actually show “Standby” for a 2 “Comfort” etc.
Can this be defined directly as part of the entity syntax?

thank you

Works great! I was now able to read out the compressor starts value correctly.

1 Like

Out of interest, because I will be getting one of these later in the year, have you tried playing with data_type and precision in your sensor configs?

I was wondering if changing the precision to “3” would give you 3 decimal places (from default “0”).
Or if the comma (for european numbers) was causing a problem, and therefore changing the data_type to “string” or “float16” from the default “int16” would work.

The link below is to the data type section:

Yeah, tried that without any success. Changing the precision to 3 only increases the number of zeros after the decimal.

Looking at external HA control for the Stiebel WWK Hot Water Heat Pump.

Most of the discussion here has been around HVAC heat pump systems and not hot water heat pumps.

The SG Ready option looks like it needs a relay to control a boost function, which should be simple with something like a Shelly Uni to provide a wifi interface I can switch when I have excess solar.

The Energy Management System interface looks like it is going to have greater functionality, but I have not been able to find any details - is it via an open standard? Is this the ISG/ ModBus interface supported by the HA integration?

Anyone with experience in either of these interface options?

Hi Jokaan,

did you solve the problem? I’m currently facing the same issue.

Simon

I did everything as you described. Unfortunately I get the following error:

Scraper_noname_0 # Multiscrape Sensor # Unable to scrape data: ‘NoneType’ object has no attribute ‘select_one’. Consider using debug logging and log_response for further investigation.

@DaKo: Did you try to use logging and log_response according to this?
What are the results?

There might be a problem when using a different version of ISG with maybe a different html. I am using v12.1.0 (footer in ISG interface).

I’ve got one of these getting installed into my house late this year, I’m also curious to see how it can be integrated

Hey, I use a Stiebel Eltron HK 07 Premium and I control it via SG-Ready (my E3DC inverter has a relay for sg-ready). It is also possible to set the sg ready conditions via modbus (so you probably don’t need a relay and the shelly). As far as I know, the Energy Management System only works with the SMA Sunny Home Manager 2.0 (Energy Management Interface (EMI))

Hello everyone,
I have a LWZ 303 integral.
Via modbus I’m able to read the values from my lwz. But I can not translate the value “betriebsstatus” into its description. For example the current value of sensor.HEIZUNG-BETRIEBSSTATUS is 1095.
Home Assistant shows entity with the status not avalible.
Does anyone have an idea, where my mistake is?

first sensor definition

  - name:                'HEIZUNG-BETRIEBSSTATUS'
    slave:              1
    address:            2000
    #count:              1
    input_type:         input
    data_type:          uint16

second sensor definition

- platform: template
  sensors:

    isg_betriebsstatus_schaltprogramm:
      friendly_name: "Heizung Schaltprogramm"
      value_template: "{{ states('sensor.HEIZUNG-BETRIEBSSTATUS')|int|bitwise_and(1) > 0 }}"
        
    isg_betriebsstatus_verdichter:
      friendly_name: "Heizung Verdichter"
      value_template: "{{ states('sensor.HEIZUNG-BETRIEBSSTATUS')|int|bitwise_and(2) > 0 }}"
        
    isg_betriebsstatus_heizen:
      friendly_name: "Heizung Heizen"
      value_template: "{{ states('sensor.HEIZUNG-BETRIEBSSTATUS')|int|bitwise_and(4) > 0 }}"      
 
    isg_betriebsstatus_kuehlen:
      friendly_name: "Heizung Kühlen"
      value_template: "{{ states('sensor.HEIZUNG-BETRIEBSSTATUS')|int|bitwise_and(8) > 0 }}"          
 
    isg_betriebsstatus_warmwasser:
      friendly_name: "Heizung Warmwasserbereitung"
      value_template: "{{ states('sensor.HEIZUNG-BETRIEBSSTATUS')|int|bitwise_and(16) > 0 }}"  
  
    isg_betriebsstatus_elektrische_ne:
      friendly_name: "Heizung Elektr. NE"
      value_template: "{{ states('sensor.HEIZUNG-BETRIEBSSTATUS')|int|bitwise_and(32) > 0 }}"  
  
    isg_betriebsstatus_service:
      friendly_name: "Heizung Service"
      value_template: "{{ states('sensor.HEIZUNG-BETRIEBSSTATUS')|int|bitwise_and(64) > 0 }}"
  
    isg_betriebsstatus_evu:
      friendly_name: "Heizung EVU Sperre"
      value_template: "{{ states('sensor.HEIZUNG-BETRIEBSSTATUS')|int|bitwise_and(128) > 0 }}"
  
    isg_betriebsstatus_filterwechsel:
      friendly_name: "Heizung Filterwechsel beide"
      value_template: "{{ states('sensor.HEIZUNG-BETRIEBSSTATUS')|int|bitwise_and(256) > 0 }}"

    isg_betriebsstatus_lueftung:
      friendly_name: "Heizung Lüftung"
      value_template: "{{ states('sensor.HEIZUNG-BETRIEBSSTATUS')|int|bitwise_and(512) > 0 }}"

    isg_betriebsstatus_heizkreispumpe:
      friendly_name: "Heizung Heizkreispumpe"
      value_template: "{{ states('sensor.HEIZUNG-BETRIEBSSTATUS')|int|bitwise_and(1024) > 0 }}"

    isg_betriebsstatus_abtauen:
      friendly_name: "Heizung Abtauen Verdampfer"
      value_template: "{{ states('sensor.HEIZUNG-BETRIEBSSTATUS')|int|bitwise_and(2048) > 0 }}"

    isg_betriebsstatus_filterwechsel_abluft:
      friendly_name: "Heizung Filterwechsel Abluft"
      value_template: "{{ states('sensor.HEIZUNG-BETRIEBSSTATUS')|int|bitwise_and(4096) > 0 }}"

    isg_betriebsstatus_filterwechsel_zuluft:
      friendly_name: "Heizung Filterwechsel Zuluft"
      value_template: "{{ states('sensor.HEIZUNG-BETRIEBSSTATUS')|int|bitwise_and(8192) > 0 }}"
    
    isg_betriebsstatus_aufheizprogramm:
      friendly_name: "Heizung Aufheizprogramm"
      value_template: "{{ states('sensor.HEIZUNG-BETRIEBSSTATUS')|int|bitwise_and(16384) > 0 }}"

@kreuzundkwer

As far as I have seen (and entirely based on my very recent experiences) the entity IDs get reformatted as compared to the name you defined in your first sensor.

So the entity ID for “HEIZUNG-BETRIEBSSTATUS” likely is “sensor.heizung_betriebsstatus”. You can confirm this by checking the entity in Developer Tools > States. Once there you can also save yourself some typos by clicking the copy button next to the entity ID and pasting it.

Hope this helps.

You are absolutly right. I didn‘t respect the case sensitivity. That was my mistake. After changig this, all works fine.
Thanks alot!

You are welcome.

Just a tip; in my case I converted the statuses through binary “running” sensor templates instead of generic sensors. It seemed appropriate and I find it gives a slightly cleaner look in dashboards. I am assuming that you are building based on @ArminF 's trail blazing work. (can’t thank him enough!) If yes, you would have to store the binary sensor templates in a different folder that also needs to be referenced in configuration.yaml

It looks like this for me:

configuration.yaml

# Include sensors (all in a seperate *.yaml)
sensor: !include_dir_merge_list sensor/
binary_sensor: !include_dir_merge_list sensor_binary/

And then in another yaml file created in the “sensor_binary” folder

# Sensor
# Stiebel WPM Templates
- platform: template
  sensors:

# Operational State Template
# Converts the operational state of the WPL to running or not running
    wpm_system_state_hc1_pump_active:
      friendly_name: "WPM System - Internal Circuit Pump"
      device_class: running
      value_template: "{{ states('sensor.wpm_system_wpm_operating_states')|int|bitwise_and(1) > 0 }}"
    
    wpm_system_state_hc2_pump_active:
      friendly_name: "WPM System - Heating Circuit Pump"
      device_class: running
      value_template: "{{ states('sensor.wpm_system_wpm_operating_states')|int|bitwise_and(2) > 0 }}"
    
    wpm_system_state_heat_up_active:
      friendly_name: "WPM System - Heat-Up"
      device_class: running
      value_template: "{{ states('sensor.wpm_system_wpm_operating_states')|int|bitwise_and(4) > 0 }}"      

    wpm_system_state_backup_heater_active:
      friendly_name: "WPM System - Backup Heater"
      device_class: running
      value_template: "{{ states('sensor.wpm_system_wpm_operating_states')|int|bitwise_and(8) > 0 }}"          

    wpm_system_state_heating_active:
      friendly_name: "WPM System - Heating"
      device_class: running
      value_template: "{{ states('sensor.wpm_system_wpm_operating_states')|int|bitwise_and(16) > 0 }}"  
  
    wpm_system_state_warm_water_production_active:
      friendly_name: "WPM System - Warm Water Production"
      device_class: running
      value_template: "{{ states('sensor.wpm_system_wpm_operating_states')|int|bitwise_and(32) > 0 }}"  
  
    wpm_system_state_compressor_active:
      friendly_name: "WPM System - Compressor"
      device_class: running
      value_template: "{{ states('sensor.wpm_system_wpm_operating_states')|int|bitwise_and(64) > 0 }}"
  
    wpm_system_state_summer_mode_active:
      friendly_name: "WPM System - Summer Mode"
      device_class: running
      value_template: "{{ states('sensor.wpm_system_wpm_operating_states')|int|bitwise_and(128) > 0 }}"

The important part is to reference the “device_class”

1 Like

It has been a while but I thought I would share my experience on this since I have been going through the same process and was also considering using a physical relay at first. Turns out it is totally possible to trigger the SG Ready inputs through Modbus. In my case I used Node-Red and the “Modbus - Write” node. (FC6, Address 4001). “Boost production” is a helper that I switch on or off when my PV production passes a certain threshold for a certain time as well as early morning when the grid price is lower. When it is toggled the following executes.

This is for an ISG Plus connected to a WPM 3i controller for a WPF10 geothermal heat pump. The SG-Ready input has to be switched to Modbus in servicewelt. Might need to double check the Modbus address for another setup.

hi folks!

thanks a lot for the great job implementing this!
i managed to add all sensors, i need.

but how did u manage to add the sensors to the home assistant energy dashboard?
i can not select the isg sensors there?

maybe ich need a little how to :smiley:

greetings

just wanted to say THANK YOU to everybody in this thread. It helped me very much to figure out a solution to my problem (getting 2 Stiebel Eltron Heat Pumps in 1 Network connected to Home Assistant). Finaly made it with “modbus:”-integration in configuration.yaml (and a bit multiscrape-sensor).

This is how my working setup looks:

It looks like this in the configuration.yaml

# Wärmempumpe mit Modbus steuern
modbus:

# Neubau
  - type: tcp
    host: 192.168.188.144
    port: 502
    name: ISG_Niehues
    close_comm_on_error: false
    retry_on_empty: true
    retries: 10

    # Sensoren
    sensors:

      # INPUT-Entities - nur lesender Zugriff

      - name:                wp_neubau_ist_temp_aussen
        unique_id:           wp_neubau_ist_temp_aussen
        slave:               1
        address:             506 #507 - 1
        input_type:          input
        unit_of_measurement: °C
        device_class:        temperature
        scale:               0.1
        precision:           1

      - name:                wp_neubau_ist_temp_heizkreis1
        unique_id:           wp_neubau_ist_temp_heizkreis1
        slave:               1
        address:             507 #508 - 1
        input_type:          input
        unit_of_measurement: °C
        device_class:        temperature
        scale:               0.1
        precision:           1

To Change values via the “+”, “-” and “Modus”-Buttons i use a “tap:action:” with following code:

    tap_action:
      action: call-service
      service: modbus.write_register
      service_data:
        address: 1500
        slave: 1
        hub: ISG_Niehues
        value: 3
tap_action:
  action: call-service
  service: input_number.decrement
  service_data:
    entity_id: input_number.wp_neubau_temp_komfort
1 Like