Luckily it’s a simple change.
Thank you very much for that, Hannes!
I have to admitt that I had little hope to get an answer and tried it on my own after my last post here.
Maybe my solution is from intrest for someone else or maybe even for you as I additionally decode the status signal of the heatpump (LWZ404 BETRIEBSSTATUS). I did not integrate all signals for now, but with your work that is a quick deal now. Your solution with the “scale” command is certainly better than the postprocessing via sensor template.
> name: lwz404
> close_comm_on_error: false
> retry_on_empty: true
> retries: 10
> # lazy_error_count: 10
> # unit: 1
> type: tcp
> host: 192.168.XXX.XXX
> port: 502
> sensors:
> - name: LWZ404 AUSSENTEMPERATUR RAW
> slave: 1
> count: 1
> address: 6 # Aussentemperatur = Modbus Adresse 7 - Offset 1
> input_type: input
> data_type: int16
> unit_of_measurement: °C
> device_class: temperature
> - name: LWZ404 ISTWERT HK1 RAW
> slave: 1
> count: 1
> address: 7 # Istwert HK1 = Modbus Adresse 8 - Offset 1
> input_type: input
> data_type: int16
> unit_of_measurement: °C
> device_class: temperature
> - name: LWZ404 SOLLWERT HK1 RAW
> slave: 1
> count: 1
> address: 8 # Sollwert HK1 = Modbus Adresse 9 - Offset 1
> input_type: input
> data_type: int16
> unit_of_measurement: °C
> device_class: temperature
> - name: LWZ404 ISTWERT HK2 RAW
> slave: 1
> count: 1
> address: 9 # Istwert HK2 = Modbus Adresse 10 - Offset 1
> input_type: input
> data_type: int16
> unit_of_measurement: °C
> device_class: temperature
> - name: LWZ404 SOLLWERT HK2 RAW
> slave: 1
> count: 1
> address: 10 # Sollert HK2 = Modbus Adresse 11 - Offset 1
> input_type: input
> data_type: int16
> unit_of_measurement: °C
> device_class: temperature
> - name: LWZ404 WW IST TEMPERATUR RAW
> slave: 1
> count: 1
> address: 15 # WW-IST-TEMPERATUR = Modbus Adresse 16 - Offset 1
> input_type: input
> data_type: int16
> unit_of_measurement: °C
> device_class: temperature
> - name: LWZ404 WW SOLL TEMPERATUR RAW
> slave: 1
> count: 1
> address: 16 # WW-SOLL-TEMPERATUR = Modbus Adresse 17 - Offset 1
> input_type: input
> data_type: int16
> unit_of_measurement: °C
> device_class: temperature
> - name: LWZ404 VORLAUFTEMP RAW
> slave: 1
> count: 1
> address: 11 # Vorlauftemperatur = Modbus Adresse 12 - Offset 1
> input_type: input
> data_type: int16
> unit_of_measurement: °C
> device_class: temperature
> - name: LWZ404 RUECKLAUFTEMP RAW
> slave: 1
> count: 1
> address: 12 # Ruecklauftemperatur = Modbus Adresse 13 - Offset 1
> input_type: input
> data_type: int16
> unit_of_measurement: °C
> device_class: temperature
> - name: LWZ404 HEISSGASTEMP RAW
> slave: 1
> count: 1
> address: 27 # Heissgastemperatur = Modbus Adresse 28 - Offset 1
> input_type: input
> data_type: int16
> unit_of_measurement: °C
> device_class: temperature
>
> - name: LWZ404 BETRIEBSSTATUS
> address: 2000 # Betriebsstatus = Modbus Adresse 2001 - Offset 1
> slave: 1
> count: 1
> input_type: input
> data_type: uint16
binary_sensor:
- platform: template
lwz404_schaltprogramm_aktiv:
friendly_name: "LWZ404 Schaltprogramm aktiv"
value_template: "{{ states('sensor.lwz404_betriebsstatus')|int|bitwise_and(1) > 0 }}"
lwz404_kompressor_aktiv:
friendly_name: "LWZ404 Kompressor aktiv"
value_template: "{{ states('sensor.lwz404_betriebsstatus')|int|bitwise_and(2) > 0 }}"
lwz404_heizbetrieb_aktiv:
friendly_name: "LWZ404 Heizbetrieb aktiv"
value_template: "{{ states('sensor.lwz404_betriebsstatus')|int|bitwise_and(4) > 0 }}"
lwz404_warmwasserbereitung_aktiv:
friendly_name: "LWZ404 WW Bereitung aktiv"
value_template: "{{ states('sensor.lwz404_betriebsstatus')|int|bitwise_and(16) > 0 }}"
lwz404_elektrische_nacherwaermung_aktiv:
friendly_name: "LWZ404 elektrische Nacherwärmung aktiv"
value_template: "{{ states('sensor.lwz404_betriebsstatus')|int|bitwise_and(32) > 0 }}"
lwz404_service_aktiv:
friendly_name: "LWZ404 Service aktiv"
value_template: "{{ states('sensor.lwz404_betriebsstatus')|int|bitwise_and(64) > 0 }}"
lwz404_evu_sperre:
friendly_name: "LWZ404 EVU Sperre aktiv"
value_template: "{{ states('sensor.lwz404_betriebsstatus')|int|bitwise_and(128) > 0 }}"
lwz404_filterwechsel:
friendly_name: "LWZ404 Filterwechsel beide Filter"
value_template: "{{ states('sensor.lwz404_betriebsstatus')|int|bitwise_and(256) > 0 }}"
lwz404_lueftung_aktiv:
friendly_name: "LWZ404 Lüftung aktiv"
value_template: "{{ states('sensor.lwz404_betriebsstatus')|int|bitwise_and(512) > 0 }}"
lwz404_heizkreispumpe:
friendly_name: "LWZ404 Heizkreispumpe aktiv"
value_template: "{{ states('sensor.lwz404_betriebsstatus')|int|bitwise_and(1024) > 0 }}"
lwz404_abtauen:
friendly_name: "LWZ404 Abtauen aktiv"
value_template: "{{ states('sensor.lwz404_betriebsstatus')|int|bitwise_and(2048) > 0 }}"
lwz404_filterwechsel_abluft:
friendly_name: "LWZ404 Filterwechsel Abluft"
value_template: "{{ states('sensor.lwz404_betriebsstatus')|int|bitwise_and(4096) > 0 }}"
lwz404_filterwechsel_zuluft:
friendly_name: "LWZ404 Filterwechsel Zuluft"
value_template: "{{ states('sensor.lwz404_betriebsstatus')|int|bitwise_and(8192) > 0 }}"
lwz404_aufheizprogramm_aktiv:
friendly_name: "LWZ404 Aufheizprogramm aktiv"
value_template: "{{ states('sensor.lwz404_betriebsstatus')|int|bitwise_and(16384) > 0 }}"
sensor:
- platform: template
sensors:
lwz404_aussentemp:
friendly_name: 'Aussentemperatur'
unit_of_measurement: '°C'
value_template: "{{ (states('sensor.LWZ404_AUSSENTEMPERATUR_RAW')|int / 10)|round(2,'floor') }}"
lwz404_istwert_hk1:
friendly_name: 'Istwert HK1'
unit_of_measurement: '°C'
value_template: "{{ (states('sensor.LWZ404_ISTWERT_HK1_RAW')|int / 10)|round(2,'floor') }}"
lwz404_sollwert_hk1:
friendly_name: 'Sollwert HK1'
unit_of_measurement: '°C'
value_template: "{{ (states('sensor.LWZ404_SOLLWERT_HK1_RAW')|int / 10)|round(2,'floor') }}"
lwz404_istwert_hk2:
friendly_name: 'Istwert HK2'
unit_of_measurement: '°C'
value_template: "{{ (states('sensor.LWZ404_ISTWERT_HK2_RAW')|int / 10)|round(2,'floor') }}"
lwz404_sollwert_hk2:
friendly_name: 'Sollwert HK2'
unit_of_measurement: '°C'
value_template: "{{ (states('sensor.LWZ404_SOLLWERT_HK2_RAW')|int / 10)|round(2,'floor') }}"
lwz404_istwert_ww:
friendly_name: 'Istwert Warmwasser'
unit_of_measurement: '°C'
value_template: "{{ (states('sensor.LWZ404_WW_IST_TEMPERATUR_RAW')|int / 10)|round(2,'floor') }}"
lwz404_sollwert_ww:
friendly_name: 'Sollwert Warmwasser'
unit_of_measurement: '°C'
value_template: "{{ (states('sensor.LWZ404_WW_SOLL_TEMPERATUR_RAW')|int / 10)|round(2,'floor') }}"
lwz404_vorlauftemperatur:
friendly_name: 'LWZ 404 Vorlauftemperatur'
unit_of_measurement: '°C'
value_template: "{{ (states('sensor.LWZ404_VORLAUFTEMP_RAW')|int / 10)|round(2,'floor') }}"
lwz404_ruecklauftemperatur:
friendly_name: 'LWZ 404 Rücklauftemperatur'
unit_of_measurement: '°C'
value_template: "{{ (states('sensor.LWZ404_RUECKLAUFTEMP_RAW')|int / 10)|round(2,'floor') }}"
lwz404_heissgastemperatur:
friendly_name: 'LWZ 404 Heissgastemperatur'
unit_of_measurement: '°C'
value_template: "{{ (states('sensor.LWZ404_HEISSGASTEMP_RAW')|int / 10)|round(2,'floor') }}"
Your’re welcome
And thank you for decoding the BETRIEBSSTATUS - will definitely use that one!
Greetings from Switzerland!
We do run a Stiebel WPL20AC here and i got it “somehow” to work by using the ISG modbus guide and check each number by comparing it with the ISG homepage.
# Configure a default setup of Home Assistant (frontend, api, etc)
default_config:
# Text to speech
tts:
- platform: google_translate
# Includes
group: !include groups.yaml
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
# sensor: !include sensors.yaml
# Modbus activation
modbus:
##########################################################
# Stiebel ISG
- name: isg
type: tcp
host: 192.168.10.101
port: 502
sensors:
##########################################################
# Sensors Temperature
#
# Heizung
# Heizung - ISTTEMPERATUR HK 2
- name: isg_heizung_ist_temp_hk2
slave: 1
address: 510
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
# Heizung - SOLLTEMPERATUR HK 2
- name: isg_heizung_soll_temp_hk2
slave: 1
address: 511
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
#
# Wasser
# Wasser - IST Temperatur
- name: isg_wasser_ist_temp
slave: 1
address: 521
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
# Wasser - SOLL Temperatur
- name: isg_wasser_soll_temp
slave: 1
address: 522
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
#
# Wohnraum
# Raumtemparatur - ISTTEMPERATUR 2
- name: isg_raum_temp_ist
slave: 1
address: 587
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
# Raumtemparatur - SOLLTEMPERATUR 2
- name: isg_raum_temp_soll
slave: 1
address: 588
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
# Raumtemparature - RAUMFEUCHTE 2
- name: isg_raum_feuchtigkeit
slave: 1
address: 589
input_type: input
unit_of_measurement: "%"
device_class: humidity
scale: 0.1
precision: 1
#
# Aussen
# Aussentemperatur - AUSSENTEMPERATUR 2
- name: isg_aussen_temp
slave: 1
address: 506
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
#
##########################################################
# Sensors Produktion Energie
#
# Produktion - Wärmemenge
# Heizen Tag - VD HEIZEN TAG - Kilowatt
- name: isg_produktion_heizen_kilowatt_tag
slave: 1
address: 3500
input_type: input
unit_of_measurement: kWh
device_class: power
scale: 1
precision: 1
# Heizen Summe - VD HEIZEN SUMME - Kilowatt
- name: isg_produktion_heizen_kilowatt_total
slave: 1
address: 3501
input_type: input
unit_of_measurement: kWh
device_class: power
scale: 1
precision: 1
# Heizen Summe - VD HEIZEN SUMME - Megawatt
- name: isg_produktion_heizen_megawatt_total
slave: 1
address: 3502
input_type: input
unit_of_measurement: MWh
device_class: power
scale: 1
precision: 1
# Warmwasser Tag - VD WARMWASSER TAG
- name: isg_produktion_wasser_kilowatt_tag
slave: 1
address: 3503
input_type: input
unit_of_measurement: kWh
device_class: power
scale: 1
precision: 1
# Warmwasser Tag - VD WARMWASSER TAG
- name: isg_produktion_wasser_kilowatt_total
slave: 1
address: 3504
input_type: input
unit_of_measurement: kWh
device_class: power
scale: 1
precision: 1
# Warmwasser Summe - VD WARMWASSER SUMME
- name: isg_produktion_wasser_megawatt_total
slave: 1
address: 3505
input_type: input
unit_of_measurement: MWh
device_class: power
scale: 1
precision: 1
#
##########################################################
# Sensors Verbauch Energie
#
# Verbauch - Leistungsaufnahme
# Heizen Tag - VD HEIZEN TAG - Kilowatt
- name: isg_verbrauch_heizen_kilowatt_tag
slave: 1
address: 3510
input_type: input
unit_of_measurement: kWh
device_class: power
scale: 1
precision: 1
# Heizen Summe - VD HEIZEN SUMME - Kilowatt
- name: isg_verbrauch_heizen_kilowatt_total
slave: 1
address: 3511
input_type: input
unit_of_measurement: MWh
device_class: power
scale: 0.001
precision: 3
# Heizen Summe - VD HEIZEN SUMME - Megawatt
- name: isg_verbrauch_heizen_megawatt_total
slave: 1
address: 3512
input_type: input
unit_of_measurement: MWh
device_class: power
scale: 1
precision: 1
# Warmwasser Tag - VD WARMWASSER TAG
- name: isg_verbrauch_wasser_tag
slave: 1
address: 3535
input_type: input
unit_of_measurement: kWh
device_class: power
scale: 1
precision: 1
# Warmwasser Summe - VD WARMWASSER SUMME
- name: isg_verbrauch_wasser_total
slave: 1
address: 3536
input_type: input
unit_of_measurement: MWh
device_class: power
scale: 0.001
precision: 3
#
##########################################################
#
# Laufzeit
# Laufzeit VD Heizen
- name: isg_laufzeit_heizen_total
slave: 1
address: 3643
input_type: input
unit_of_measurement: H
device_class: date
# Laufzeit VD Warmwasser
- name: isg_laufzeit_wasser_total
slave: 1
address: 3644
input_type: input
unit_of_measurement: H
device_class: date
#
##########################################################
#
- name: 3645
slave: 1
address: 3645
input_type: input
precision: 3
- name: 3646
slave: 1
address: 3646
input_type: input
precision: 3
- name: 3647
slave: 1
address: 3647
input_type: input
precision: 3
- name: 3648
slave: 1
address: 3648
input_type: input
precision: 3
- name: 3648
slave: 1
address: 3648
input_type: input
precision: 3
- name: 3509
slave: 1
address: 3509
input_type: input
precision: 3
- name: 3511
slave: 1
address: 3511
input_type: input
precision: 3
- name: 3512
slave: 1
address: 3512
input_type: input
precision: 3
##########################################################
# E3DC Power Reactor
- name: e3dc
type: tcp
host: 192.168.10.102
port: 502
##########################################################
# Sensors Solar
#
# Solar
But as the config file is now growing i wanted to “outsource” stuff with the include commands.
And here my struggle begins.
I could manage the modbus.yaml
# Modbus activation
# Stiebel ISG
- name: isg
type: tcp
host: 192.168.10.101
port: 502
# E3DC Power Reactor
- name: e3dc
type: tcp
host: 192.168.10.102
port: 502
configuration file → modbus: !include modbus.yaml
BUT i am failing constantly with the sensors stuff…
created a sensors.yaml
configuration file → sensor: !include sensors.yaml
File looks like this:
#
- platform: modbus
registers:
name: isg_heizung_ist_temp_hk2
slave: 1
address: 510
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
hub: isg
So two things here:
- i used two modbus hubs (hub: isg and later e3dc)
- I fail with the formatting
Would you guys please enlighten me on what i am doing/formatting wrong here?
Details:
Asustor NAS, Docker HA Version core-2021.10.7
Any tip is much appreaciated!
thank you all!
Armin
ok i think i found a solution to split the stuff.
# Include sensors (all in a seperate *.yaml)
sensor: !include_dir_merge_list sensor/
# Include modbus (all in a seperate *.yaml)
modbus: !include_dir_merge_list modbus/
created directories modbus and sensor.
in there seperated all the sensors and modbus configurations in to an extra files and merge them while load.
/sensor
— systemmonitor.yaml
— asustor.yaml
/modbus
– isg.yaml
– e3dc.yaml
Used ssh to create the files and folders to they kept the owner and permissions.
AND finally… it seems that with the update the modbus configuration has changed.
- platform modbus does not seem to work anymore.
So i had to put the modbus and sensor config into a file and load it with merge.
modbus file → isg.yaml
# Modbus
# Stiebel ISG
- name: isg
type: tcp
host: 192.168.10.101
port: 502
sensors:
#
# Heizung
# -- ISTTEMPERATUR HK 2
- name: 'ISG Temperatur Heizung HK2 IST'
slave: 1
address: 510
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
# --Heizung - SOLLTEMPERATUR HK 2
- name: 'ISG Temperatur Heizung HK2 SOLL'
slave: 1
address: 511
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
#
# Wasser
# -- IST Temperatur
- name: 'ISG Temperatur Wasser IST'
slave: 1
address: 521
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
# -- SOLL Temperatur
- name: 'ISG Temperatur Wasser IST'
slave: 1
address: 522
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
#
# Temperatur
# -- ISTTEMPERATUR 2
- name: 'ISG Temperatur Raum IST'
slave: 1
address: 587
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
# -- SOLLTEMPERATUR 2
- name: 'ISG Temperatur Raum SOLL'
slave: 1
address: 588
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
# -- RAUMFEUCHTE 2
- name: 'ISG Temperatur Raum Feuchtigkeit'
slave: 1
address: 589
input_type: input
unit_of_measurement: '%'
device_class: humidity
scale: 0.1
precision: 1
# -- AUSSENTEMPERATUR 2
- name: 'ISG Temperatur Raum Aussentemperatur'
slave: 1
address: 506
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
#
# Produktion Wärmemenge
# -- VD HEIZEN TAG - Kilowatt
- name: 'ISG Produktion Heizen Tag in kWh'
slave: 1
address: 3500
input_type: input
unit_of_measurement: kWh
device_class: power
scale: 1
precision: 1
# -- VD HEIZEN SUMME - Kilowatt
- name: 'ISG Produktion Heizen Total in kWh'
slave: 1
address: 3501
input_type: input
unit_of_measurement: kWh
device_class: power
scale: 1
precision: 1
# -- VD HEIZEN SUMME - Megawatt
- name: 'ISG Produktion Heizen Total in MWh'
slave: 1
address: 3502
input_type: input
unit_of_measurement: MWh
device_class: power
scale: 1
precision: 1
# -- VD WARMWASSER TAG
- name: 'ISG Produktion Wasser Tag in kWh'
slave: 1
address: 3503
input_type: input
unit_of_measurement: kWh
device_class: power
scale: 1
precision: 1
# -- VD WARMWASSER SUMME
- name: 'ISG Produktion Wasser Total in kWh'
slave: 1
address: 3504
input_type: input
unit_of_measurement: kWh
device_class: power
scale: 1
precision: 1
# -- VD WARMWASSER SUMME
- name: 'ISG Produktion Wasser Total in MWh'
slave: 1
address: 3505
input_type: input
unit_of_measurement: MWh
device_class: power
scale: 1
precision: 1
#
# Verbauch - Leistungsaufnahme
# -- VD HEIZEN TAG - Kilowatt
- name: 'ISG Verbauch Heizen Tag in kWh'
slave: 1
address: 3510
input_type: input
unit_of_measurement: kWh
device_class: power
scale: 1
precision: 1
# -- VD HEIZEN SUMME - Kilowatt
- name: 'ISG Verbauch Heizen Total in kWh'
slave: 1
address: 3511
input_type: input
unit_of_measurement: MWh
device_class: power
scale: 0.001
precision: 3
# -- VD HEIZEN SUMME - Megawatt
- name: 'ISG Verbauch Heizen Total in MWh'
slave: 1
address: 3512
input_type: input
unit_of_measurement: MWh
device_class: power
scale: 1
precision: 1
# -- VD WARMWASSER TAG
- name: 'ISG Verbauch Wasser Tag in kWh'
slave: 1
address: 3535
input_type: input
unit_of_measurement: kWh
device_class: power
scale: 1
precision: 1
# -- VD WARMWASSER SUMME
- name: 'ISG Verbauch Wasser Total in MWh'
slave: 1
address: 3536
input_type: input
unit_of_measurement: MWh
device_class: power
scale: 0.001
precision: 3
#
# Laufzeit
# -- VD Heizen
- name: 'ISG Laufzeit Heizen Total in h'
slave: 1
address: 3643
input_type: input
unit_of_measurement: H
device_class: date
# -- VD Warmwasser
- name: 'ISG Laufzeit Wasser Total in h'
slave: 1
address: 3644
input_type: input
unit_of_measurement: H
device_class: date
#
#####################################################################
# Test Sensoren
# -- NAME VOM SENSOR
- name: 3645
slave: 1
address: 3645
input_type: input
precision: 3
I uploaded my config as well, I have to clean it up now: homeassistant-config/configuration.yaml at 10384e93fe7893c0c8ee182ea9d66fa41fd88813 · thorsten/homeassistant-config · GitHub
Evening Gentlemen,
I started digging through the modbus of the ISG again but i am unable to find “the rest” of the values.
Please see embedded picture. I can find the the number before the comma appears but i am not able to find the values behind. Picture is in german but i think you can get what i mean.
Excample: heat production of the day Modbus 3500 or 3522 shows 38 kWh. But 3499 or 3521 does not exist and so i cannot find the missing 0.939 kWh.
Same for some other sensor values. I can find the kWh but not the 0.xxxx values behind.
Did anyone encounter the same and could solve it? I checked most of the modbus IDs but these values just did not appear.
On the picture you also find some values made from MWh and kWH: For them i used a template sensor which adds them together.
# Heating Total calculation
# ISG Consumption Heat Total Part1 Energy + ISG Consumption Heat Total Part2 Energy
# These two sensors are the total used energy for heating electricity consumption
- platform: template
sensors:
# Production calculation
# Heat Total
isg_production_heat_total_energy:
friendly_name: ISG Production Heat Total Energy
unit_of_measurement: kWh
value_template: "{{ (states('sensor.isg_production_heat_total_part1_energy') | float) + (states('sensor.isg_production_heat_total_part2_energy') | float) }}"
...
Just make sure you set the MwH to scale 1000 so you get kWh. Then add them together.
And one more thing.
Could you help me to get a write register? i did find the room eco and comfort temperatures and they appear to be writeable.
Comfort
- name: ISG Comfort Room Temperature
slave: 1
address: 1504
input_type: holding
scale: 0.1
precision: 1
unit_of_measurement: °C
device_class: temperature
Eco
- name: ISG Eco Room Temperature
slave: 1
address: 1505
input_type: holding
scale: 0.1
precision: 1
unit_of_measurement: °C
device_class: temperature
Would be cool to have a dashboard card to be able to change it.
thank you very much!
cheers A
Evening,
how did you implement the “Betriebsstatus” into the Lovelace?
Just an entity set?
thanks
armin
I wonder what all the steps are to get this working. We have a similar system, the WPL15AC+ISG-web
Hi Dennis,
to monitor your 15AC you would need to run the modbus integration.
With this and the registers you then get loads of details which you can later process in Home Assistant.
Install Modbus Integration
Use the modbus configuration on your configuration.yaml or an extra file.
Reload and you get sensors with the details. Use entiies or sensors in lovelace and you get them on your dashboard.
Its was a bit tricky for me at the beginning and a lot of trial and error. But i could manage to get pretty close to want i expected. see screenshot.
Our WPL20 uses the same registers you could start using the one i dropped here.
If you need more help let me know.
cheers A
PS: it is worth the work. The ISG web interface is “ugly as hell”
About the set komfort and room temperature:
Create 2 helpers (input numbers) Eco and Comfort
Then 2 automations. One for set another one for sync.
Modbus Holdings are:
# Temperatur Sets Room Comfort and Eco -> these can be written as well.
# Comfort
- name: ISG Comfort Room Temperature
slave: 1
address: 1504
input_type: holding
scale: 0.1
precision: 2
unit_of_measurement: °C
device_class: temperature
# Eco
- name: ISG Eco Room Temperature
slave: 1
address: 1505
input_type: holding
scale: 0.1
precision: 2
unit_of_measurement: °C
device_class: temperature
Set Temp automation:
alias: ISG Temperature Comfort Set
trigger:
- platform: state
entity_id: input_number.isg_comfort_temperature
action:
- service: modbus.write_register
data_template:
hub: isg
unit: 1
address: 1504
value: '{{ states.input_number.isg_comfort_temperature.state | float * 10 }}'
Sync Temp automation
alias: ISG Temperature Comfort Sync
trigger:
- platform: time_pattern
seconds: '59'
action:
- service: input_number.set_value
data_template:
entity_id: input_number.isg_comfort_temperature
value: '{{ states.input_number.isg_comfort_temperature.state | float / 10 }}'
Use Number Card from HACS and use them on the dashboard.
type: custom:numberbox-card
border: true
entity: input_number.isg_comfort_temperature
name: Temperatur Komfort
I guess there might be better ways but this one i found and it works fine.
Hope this helps.
cheers A
Wow, I love your Lovelace interface. got it partial working, the readout of power consumption, running hours is showing up.
some modbus adresses are not matching up with the former code you posted
Is it possible that you share the modbus ISG.yaml and Lovelace cards again.
Hi Denis,
Modbus ISG
This is was i used. Focus on WPM system colum.
I went through most of them one by one. The issue is the offset. You have to use -1 or sometimes -2 on the register numbers. What i did i created the modbus address in a range.
eg:
1500 i created 3 entries 1498, 1499, 1500 and compared the results against the ISG webpage.
with that i could get most of the details i wanted.
Its a shame that they use so many different variantions for each product as your 15 and our 20 are the same …
About my config. Here i created a seperate modbus folder and moved all the configs out of the master configuration file. On the config file i used the pointer to integrate the directory.
my structure looks as follow
config folder
→ configuration,yaml
→ modebus folder
------------> isg.yaml
→ sensor folder
------------> isg.yaml
Here is the code for configuration.yaml
# Include modbus (all in a seperate *.yaml)
modbus: !include_dir_merge_list modbus/
# Include sensors (all in a seperate *.yaml)
sensor: !include_dir_merge_list sensor/
Here the modbus
# Modbus
# Stiebel ISG -> offset -1 or even -2
- name: isg
type: tcp
host: !secret isg
port: !secret modbus
sensors:
# Heating
# -- Heating Circuit HC2 Actual Temperature
- name: ISG HC2 Actual Temperature
slave: 1
address: 510
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
# -- THeating Circuit HC2 Set Temperature
- name: ISG HC2 Set Temperature
slave: 1
address: 511
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
# Water
# -- Actual Temperatur
- name: ISG Water Actual Temperature
slave: 1
address: 521
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
# -- Set Temperature
- name: ISG Water Set Temperature
slave: 1
address: 522
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
# Temperature
# -- Room Actual Temperature
- name: ISG Room Actual Temperature
slave: 1
address: 587
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
# -- Room Set Temperature
- name: ISG Room Set Temperature
slave: 1
address: 588
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
# -- Room Humidity
- name: ISG Room Humidity
slave: 1
address: 589
input_type: input
unit_of_measurement: '%'
device_class: humidity
scale: 0.1
precision: 1
# -- Outside Temperature
- name: ISG Outside Temperature
slave: 1
address: 506
input_type: input
unit_of_measurement: °C
device_class: temperature
scale: 0.1
precision: 1
# Heat Production
# -- Heating Daily Energy kWh
- name: ISG Production Heat Daily Energy
slave: 1
address: 3500
input_type: input
unit_of_measurement: kWh
device_class: energy
scale: 1
precision: 1
# -- Heating Total Energy kWh
- name: ISG Production Heat Total Part1 Energy
slave: 1
address: 3501
input_type: input
unit_of_measurement: kWh
device_class: energy
scale: 1
precision: 1
# -- Heating Total Energy MWh
- name: ISG Production Heat Total Part2 Energy
slave: 1
address: 3502
input_type: input
unit_of_measurement: kWh
device_class: energy
scale: 1000
precision: 1
# -- Water Daily Energy kWh
- name: ISG Production Water Daily Energy
slave: 1
address: 3503
input_type: input
unit_of_measurement: kWh
device_class: energy
scale: 1
precision: 1
# -- Water Total Energy kWh
- name: ISG Production Water Total Part1 Energy
slave: 1
address: 3504
input_type: input
unit_of_measurement: kWh
device_class: energy
scale: 1
precision: 1
# -- Water Total Energy MWh
- name: ISG Production Water Total Part2 Energy
slave: 1
address: 3505
input_type: input
unit_of_measurement: kWh
device_class: energy
scale: 1000
precision: 1
# Consumption - Electricity in kWh/MWh
# -- Heating Daily Energy kWh
- name: ISG Consumption Heat Daily Energy
slave: 1
address: 3510
input_type: input
unit_of_measurement: kWh
device_class: energy
scale: 1
precision: 1
# -- Heating Total Energy kWh - will be summarized in a template
- name: ISG Consumption Heat Total Part1 Energy
slave: 1
address: 3511
input_type: input
unit_of_measurement: kWh
device_class: energy
scale: 1
precision: 1
# -- Heating Total Energy kWh - will be summarized in a template
- name: ISG Consumption Heat Total Part2 Energy
slave: 1
address: 3512
input_type: input
unit_of_measurement: kWh
device_class: energy
scale: 1000
precision: 1
# -- Water Daily Energy kWh
- name: ISG Consumption Water Daily Energy
slave: 1
address: 3535
input_type: input
unit_of_measurement: kWh
device_class: energy
scale: 1
precision: 3
# -- Water Total Energy MWh
- name: ISG Consumption Water Total Energy
slave: 1
address: 3536
input_type: input
unit_of_measurement: kWh
device_class: energy
scale: 1
precision: 1
#
# Runtime
# -- Heating Production
- name: ISG Runtime Heating Time
slave: 1
address: 3643
input_type: input
unit_of_measurement: H
device_class: date
# -- Water Production
- name: ISG Runtime Water Time
slave: 1
address: 3644
input_type: input
unit_of_measurement: H
device_class: date
#
# Operating Status
# -- Operating Status
- name: ISG Operating Status
slave: 1
count: 1
address: 2500
input_type: input
data_type: uint16
# Temperatur Sets Room Comfort and Eco -> these can be written as well.
# Comfort
- name: ISG Comfort Room Temperature
slave: 1
address: 1504
input_type: holding
scale: 0.1
precision: 2
unit_of_measurement: °C
device_class: temperature
# Eco
- name: ISG Eco Room Temperature
slave: 1
address: 1505
input_type: holding
scale: 0.1
precision: 2
unit_of_measurement: °C
device_class: temperature
#
#####################################################################
# Test Sensors
# -- NAME
- name: 3520
slave: 1
address: 3520
input_type: input
precision: 3
- name: 499
slave: 1
address: 499
input_type: input
precision: 3
- name: 501
slave: 1
address: 501
input_type: input
precision: 3
- name: 502
slave: 1
address: 502
input_type: input
precision: 3
- name: 1501
slave: 1
address: 1501
input_type: holding
- name: 2502
slave: 1
count: 1
address: 2502
input_type: input
data_type: uint16
- name: 1500
slave: 1
count: 1
address: 1500
input_type: input
data_type: uint16
For some sensors you might need/want a template creation.
So here i created another folder called sensor
In there i got the isg.yaml for sensors.
# Sensor
# Stiebel ISG Templates
- platform: template
sensors:
# Operational State Template
# Converts the operational state of the WPL to true or false
isg_state_active_hc1_pump:
friendly_name: "ISG State HC1 Pump active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(1) > 0 }}"
isg_state_active_hc2_pump:
friendly_name: "ISG State HC2 Pump active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(2) > 0 }}"
isg_state_preheating_active:
friendly_name: "ISG State Pre Heating active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(4) > 0 }}"
isg_state_electrical_heating_active:
friendly_name: "ISG State Electrical Heating active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(8) > 0 }}"
isg_state_heating_active:
friendly_name: "ISG State Heating active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(16) > 0 }}"
isg_state_hot_water_production_active:
friendly_name: "ISG State Hot Water Production active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(32) > 0 }}"
isg_state_compressor_active:
friendly_name: "ISG State Compressor active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(64) > 0 }}"
isg_state_summer_mode_active:
friendly_name: "ISG State Summer Mode active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(128) > 0 }}"
isg_state_cooling_active:
friendly_name: "ISG State Cooling active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(256) > 0 }}"
isg_state_defrost_active:
friendly_name: "ISG State Defrost active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(512) > 0 }}"
isg_state_silentmode1_active:
friendly_name: "ISG State Silentmode1 active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(1024) > 0 }}"
isg_state_silentmode2_active:
friendly_name: "ISG State Silentmode2 active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(2048) > 0 }}"
# Heating Total calculation
# ISG Consumption Heat Total Part1 Energy + ISG Consumption Heat Total Part2 Energy
# These two sensors are the total used energy for heating electricity consumption
# Production calculation
# Heat Total
isg_production_heat_total_energy:
friendly_name: ISG Production Heat Total Energy
unit_of_measurement: kWh
value_template: "{{ (states('sensor.isg_production_heat_total_part1_energy') | float) + (states('sensor.isg_production_heat_total_part2_energy') | float) }}"
# Water Total
isg_production_water_total_energy:
friendly_name: ISG Production Water Total Energy
unit_of_measurement: kWh
value_template: "{{ (states('sensor.isg_production_water_total_part1_energy') | float) + (states('sensor.isg_production_water_total_part2_energy') | float) }}"
# Consumption Calculation
# Heat Total
isg_consumption_heat_total_energy:
friendly_name: ISG Consumption Heat Total Energy
unit_of_measurement: kWh
value_template: "{{ (states('sensor.isg_consumption_heat_total_part1_energy') | float) + (states('sensor.isg_consumption_heat_total_part2_energy') | float) }}"
# Sensor to caluclation the production ratio between consumed energy and produced heat.
isg_produced_heat_vs_consumed_energy_ratio:
friendly_name: ISG Produced Heat VS Consumed Energy Ratio
unit_of_measurement: ""
value_template: "{{ ((states('sensor.isg_production_heat_daily_energy') | float) / (states('sensor.isg_consumption_heat_daily_energy')| float)) | round(1) }}"
Here is a sceenshot of my folder and file structure:
Lovelace:
Most of them are entities or sensor cards.
The heat production/warm and ratio cads are buttons as they look nicer.
The set temperature is the number box card add on from HACS.
Maybe check the grid card as well. Here you can use grid / in / grid to sort better.
This is how my “Heizung & Temperatur” (heating and temperature) looks like
type: grid
title: Heizung & Temperatur
cards:
- type: grid
cards:
- type: sensor
entity: sensor.isg_outside_temperature
graph: line
name: Aussen
detail: 1
- type: sensor
entity: sensor.isg_room_actual_temperature
graph: line
name: Innen
- type: sensor
entity: sensor.isg_room_humidity
graph: line
name: Feuchte
columns: 3
square: false
- type: grid
cards:
- type: sensor
entity: sensor.isg_hc2_actual_temperature
graph: line
name: 'Heizkreis 2 '
- type: sensor
entity: sensor.isg_water_actual_temperature
graph: line
name: Warmwasser
columns: 2
square: false
- type: grid
cards:
- type: custom:numberbox-card
border: true
entity: input_number.isg_comfort_temperature
name: Temperatur Komfort
- type: custom:numberbox-card
border: true
entity: input_number.isg_eco_temperature
name: Temperatur Eco
columns: 1
square: false
- type: horizontal-stack
cards:
- type: grid
cards:
- type: button
tap_action:
action: none
entity: sensor.isg_production_heat_daily_energy
show_state: true
icon: mdi:radiator
name: Wärme Produziert
hold_action:
action: none
- type: button
tap_action:
action: none
entity: sensor.isg_consumption_heat_daily_energy
name: Strom Benötigt
show_state: true
icon: mdi:flash
show_icon: true
hold_action:
action: none
- type: button
tap_action:
action: none
entity: sensor.isg_produced_heat_vs_consumed_energy_ratio
icon: mdi:format-vertical-align-center
color: purple
show_state: true
name: Ratio Wärme/Strom
hold_action:
action: none
show_name: true
square: false
- type: entity-filter
entities:
- sensor.isg_state_compressor_active
- sensor.isg_state_cooling_active
- sensor.isg_state_defrost_active
- sensor.isg_kompressor_aktiv
- sensor.isg_state_electrical_heating_active
- sensor.isg_state_active_hc1_pump
- sensor.isg_state_active_hc2_pump
- sensor.isg_state_heating_active
- sensor.isg_state_hot_water_production_active
- sensor.isg_state_preheating_active
- sensor.isg_state_silentmode1_active
- sensor.isg_state_silentmode2_active
- sensor.isg_state_summer_mode_active
state_filter:
- 'True'
card:
type: entities
title: Aktueller Betrieb
columns: 1
square: false
Just give it a try. I made several dashboards before i ended up with the one i showed you.
cheers A
Hi armin,
Beautiful work! I’ve used most of your code with a few tweaks (i dont use HK2, but HK1 etc.).
But I can’t get the Aktueller Betrieb to work. I also dont get any data back when I check it manually with a Modbus reader;
Any ideas?
Afternoon,
HK1 - Heat circuit 1 from the pump to the “boiler”
HK2 - Heat Circuit 2 is the ground heating inside the house.
About “Aktueller Betrieb” its the operating status of the pump. Betriebsstatus called in German.
You can find it in the Sensor.yaml
# Operational State Template
# Converts the operational state of the WPL to true or false
isg_state_active_hc1_pump:
friendly_name: "ISG State HC1 Pump active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(1) > 0 }}"
isg_state_active_hc2_pump:
friendly_name: "ISG State HC2 Pump active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(2) > 0 }}"
isg_state_preheating_active:
friendly_name: "ISG State Pre Heating active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(4) > 0 }}"
isg_state_electrical_heating_active:
friendly_name: "ISG State Electrical Heating active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(8) > 0 }}"
isg_state_heating_active:
friendly_name: "ISG State Heating active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(16) > 0 }}"
isg_state_hot_water_production_active:
friendly_name: "ISG State Hot Water Production active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(32) > 0 }}"
isg_state_compressor_active:
friendly_name: "ISG State Compressor active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(64) > 0 }}"
isg_state_summer_mode_active:
friendly_name: "ISG State Summer Mode active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(128) > 0 }}"
isg_state_cooling_active:
friendly_name: "ISG State Cooling active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(256) > 0 }}"
isg_state_defrost_active:
friendly_name: "ISG State Defrost active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(512) > 0 }}"
isg_state_silentmode1_active:
friendly_name: "ISG State Silentmode1 active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(1024) > 0 }}"
isg_state_silentmode2_active:
friendly_name: "ISG State Silentmode2 active"
value_template: "{{ states('sensor.isg_operating_status')|int|bitwise_and(2048) > 0 }}"
And you need the modbus entries:
# Operating Status
# -- Operating Status
- name: ISG Operating Status
slave: 1
count: 1
address: 2500
input_type: input
data_type: uint16
The card i used the entity filter. it shows only running (set to true) events.
type: entity-filter
entities:
- sensor.isg_state_compressor_active
- sensor.isg_state_cooling_active
- sensor.isg_state_defrost_active
- sensor.isg_kompressor_aktiv
- sensor.isg_state_electrical_heating_active
- sensor.isg_state_active_hc1_pump
- sensor.isg_state_active_hc2_pump
- sensor.isg_state_heating_active
- sensor.isg_state_hot_water_production_active
- sensor.isg_state_preheating_active
- sensor.isg_state_silentmode1_active
- sensor.isg_state_silentmode2_active
- sensor.isg_state_summer_mode_active
state_filter:
- 'True'
card:
type: entities
title: Aktueller Betrieb
The whole Entitiy List is:
Hope this explains.
Maybe you have a different register depending on the type of pump.
I took it from here and focused on WPM system
cheers A
Glad it worked out!
Excellent Ratio you have. Seems to be warmer in your Area.
We got loads of snow today in Switzerland
Only thing i am missing is the second value of the summaries from the ISG.
If you scroll up on this topic you find a post. 11 days ago.
Maybe you stumble over these registers. Please let me know if you do so.
cheers A