Inspired by the very pupular topic Weishaupt Heatpump integration via modbus - Share your Projects! - Home Assistant Community (home-assistant.io), I have decided to share my Weishaupt Heatpump (WWP L9 ID) setup as well.
Hardware
- Weishaupt LWPM 410, ~150€
- RS485 Konverter Bus Adapter Seriell USB, ~3€
Config
-
heatpump config
- Menu → Config → Network: Select modbus, baudrate 9600 and slave address 1 (if only device)
- Optional for Smart Grid: Menü + Enter → Config → Anlage → Flexeingang → N1/J5-ID1+2 digital: Smart Grid
-
modbus config
modbus:
- name: weishaupt_wwp_l9
type: serial
baudrate: 9600
bytesize: 8
method: rtu
parity: N
port: /dev/ttyUSB0
stopbits: 1
#retry_on_empty: true
timeout: 14
climates:
# Heizen
- name: "WP Climate Heizen Temperatur"
unique_id: wp_climate_heizentemperature
address: 46 # 5 Vorlauf, scale 0.1
slave: 1
input_type: input
data_type: int16
max_temp: 38
min_temp: 0
offset: 0
precision: 1
scale: 1
target_temp_register: 163 # Parallelverschiebung
target_temp_write_registers: true
temp_step: 1
temperature_unit: C
# hvac_onoff_register: 103
# hvac_mode_register:
# address: 103
# values:
# state_off: 1
# state_heat: 2
# state_cool: 5
- name: "WP Climate Warmwasser Temperatur"
unique_id: wp_climate_watertemperature
address: 0 # 3, should be scale 0.1
slave: 1
input_type: input
data_type: int16
max_temp: 85
min_temp: 10
offset: 0
precision: 1
scale: 1
target_temp_register: 174
target_temp_write_registers: true
temp_step: 1
temperature_unit: C
# leads to duplicate issue
#hvac_onoff_register: 103
#hvac_mode_register:
# address: 103
# values:
# state_off: 1
# state_heat: 4
sensors:
# Warmwasser
- name: "WP Warmwasser Solltemperatur"
unique_id: wp_warmwasser_solltemperatur
slave: 1
address: 58
input_type: input
unit_of_measurement: °C
state_class: measurement
scale: 0.1
offset: 0
precision: 1
data_type: int16
- name: "WP Warmwasser Solltemperatur Maximal"
unique_id: wp_warmwasser_solltemperatur_maximal
slave: 1
address: 175
input_type: input
unit_of_measurement: °C
state_class: measurement
scale: 1
offset: 0
precision: 1
data_type: int16
- name: "WP Warmwasser Hysterese"
unique_id: wp_warmwasser_hysterese
slave: 1
address: 172
input_type: input
unit_of_measurement: K
state_class: measurement
scale: 1
offset: 0
precision: 1
data_type: int16
- name: "WP Warmwasser Temperatur"
unique_id: wp_warmwasser_temperatur
slave: 1
address: 3
input_type: input
unit_of_measurement: °C
state_class: measurement
scale: 0.1
offset: 0
precision: 1
data_type: int16
- name: "WP Warmwasser Thermische Desinfektion"
unique_id: wp_warmwasser_thermische_desinfektion
slave: 1
address: 192
input_type: input
scale: 1
offset: 0
precision: 0
data_type: int16
# System
- name: "WP Betriebsmodus ID"
unique_id: wp_betriebsmodus_id
slave: 1
address: 142
input_type: input
scale: 1
offset: 0
precision: 0
data_type: int16
- name: "WP Display Status ID"
unique_id: wp_display_status_id
slave: 1
address: 103
input_type: input
scale: 1
offset: 0
precision: 0
data_type: int16
- name: "WP Display Sperre ID"
unique_id: wp_display_sperre_id
slave: 1
address: 104
input_type: input
scale: 1
offset: 0
precision: 0
data_type: int16
- name: "WP Display Störung ID"
unique_id: wp_display_stoerung_id
slave: 1
address: 105
input_type: input
scale: 1
offset: 0
precision: 0
data_type: int16
- name: "WP Display Sensor ID"
unique_id: wp_display_sensor_id
slave: 1
address: 106
input_type: input
scale: 1
offset: 0
precision: 0
data_type: int16
- name: "WP Außen Temperatur"
unique_id: wp_aussen_temperatur
slave: 1
address: 1
input_type: input
unit_of_measurement: °C
state_class: measurement
scale: 0.1
offset: 0
precision: 1
data_type: int16
# Heizkreis
- name: "WP Rücklauf Solltemperatur"
unique_id: wp_ruecklauf_solltemperatur
slave: 1
address: 53
input_type: input
unit_of_measurement: °C
state_class: measurement
scale: 0.1
offset: 0
precision: 1
data_type: int16
- name: "WP Vorlauf Temperatur"
unique_id: wp_vorlauf_temperatur
slave: 1
address: 5
input_type: input
unit_of_measurement: °C
state_class: measurement
scale: 0.1
offset: 0
precision: 1
data_type: int16
- name: "WP Rücklauf Temperatur"
unique_id: wp_ruecklauf_temperatur
slave: 1
address: 2
input_type: input
unit_of_measurement: °C
state_class: measurement
scale: 0.1
offset: 0
precision: 1
data_type: int16
- name: "WP Parallelverschiebung"
unique_id: wp_parallelverschiebung
slave: 1
address: 163
input_type: holding
state_class: measurement
scale: 1
offset: 0
precision: 1
data_type: int16
- name: "WP Heizen Hysterese"
unique_id: wp_heizen_hysterese
slave: 1
address: 47
input_type: input
unit_of_measurement: K
state_class: measurement
scale: 0.1
offset: 0
precision: 1
data_type: int16
# WEZ
- name: "WP Verdichter1 Stunden"
unique_id: wp_verdichter1_stunden
slave: 1
address: 72
input_type: input
unit_of_measurement: h
state_class: measurement
scale: 1
offset: 0
precision: 0
data_type: int16
- name: "WP 2.Wärmeerzeuger Stunden"
unique_id: wp_2waermeerzeuger_stunden
slave: 1
address: 75
input_type: input
unit_of_measurement: h
state_class: measurement
scale: 1
offset: 0
precision: 0
data_type: int16
# Energy
- name: "WP Energy Heizen 1-4"
unique_id: wp_energy_heizen_1_4
slave: 1
address: 223
input_type: input
unit_of_measurement: kWh
device_class: energy
state_class: total
scale: 1
offset: 0
precision: 1
data_type: int16
- name: "WP Energy Heizen 5-8"
unique_id: wp_energy_heizen_5_8
slave: 1
address: 224
input_type: input
unit_of_measurement: kWh
device_class: energy
state_class: total
scale: 1
offset: 0
precision: 1
data_type: int16
- name: "WP Energy Heizen 9-12"
unique_id: wp_energy_heizen_9_12
slave: 1
address: 225
input_type: input
unit_of_measurement: kWh
device_class: energy
state_class: total
scale: 1
offset: 0
precision: 1
data_type: int16
- name: "WP Energy Warmwasser 1-4"
unique_id: wp_energy_warmwasser_1_4
slave: 1
address: 226
input_type: input
unit_of_measurement: kWh
device_class: energy
state_class: total
scale: 1
offset: 0
precision: 1
data_type: int16
- name: "WP Energy Warmwasser 5-8"
unique_id: wp_energy_warmwasser_5_8
slave: 1
address: 227
input_type: input
unit_of_measurement: kWh
device_class: energy
state_class: total
scale: 1
offset: 0
precision: 1
data_type: int16
- name: "WP Energy Warmwasser 9-12"
unique_id: wp_energy_warmwasser_9_12
slave: 1
address: 228
input_type: input
unit_of_measurement: kWh
device_class: energy
state_class: total
scale: 1
offset: 0
precision: 1
data_type: int16
- name: "WP Energy Umwelt 1-4"
unique_id: wp_energy_umwelt_1_4
slave: 1
address: 254
input_type: input
unit_of_measurement: kWh
device_class: energy
state_class: total
scale: 1
offset: 0
precision: 1
data_type: int16
- name: "WP Energy Umwelt 5-8"
unique_id: wp_energy_umwelt_5_8
slave: 1
address: 255
input_type: input
unit_of_measurement: kWh
device_class: energy
state_class: total
scale: 1
offset: 0
precision: 1
data_type: int16
#- name: "WP Energy Umwelt 9-12"
# unique_id: wp_energy_umwelt_9_12
# slave: 1
# address: 256
# input_type: input
# unit_of_measurement: kWh
# device_class: energy
# state_class: total
# scale: 1
# offset: 0
# precision: 1
# data_type: int16
binary_sensors:
# Smart Grid
- name: "WP Smart Grid 1"
unique_id: wp_smart_grid_1
slave: 1
address: 3
input_type: coil
- name: "WP Smart Grid 2"
unique_id: wp_smart_grid_2
slave: 1
address: 4
input_type: coil
- template sensors
template:
- sensor:
# WP Energy
- name: "WP Energy Heizen (Total)"
unique_id: wp_energy_heizen_total
unit_of_measurement: 'kWh'
state_class: total_increasing
device_class: energy
state: >-
{% if states('sensor.wp_energy_heizen_1_4') in ['unknown', 'unavailable']
or states('sensor.wp_energy_heizen_5_8') in ['unknown', 'unavailable']
or states('sensor.wp_energy_heizen_9_12') in ['unknown', 'unavailable']
%}
{{ states("sensor.wp_energy_heizen_total") }}
{% else %}
{{ states("sensor.wp_energy_heizen_9_12")|float(0) * 100000000
+ states("sensor.wp_energy_heizen_5_8")|float(0) * 10000
+ states("sensor.wp_energy_heizen_1_4")|float(0)
}}
{% endif %}
- name: "WP Energy Warmwasser (Total)"
unique_id: wp_energy_warmwasser_total
unit_of_measurement: 'kWh'
state_class: total_increasing
device_class: energy
state: >-
{% if states('sensor.wp_energy_warmwasser_1_4') in ['unknown', 'unavailable']
or states('sensor.wp_energy_warmwasser_5_8') in ['unknown', 'unavailable']
or states('sensor.wp_energy_warmwasser_9_12') in ['unknown', 'unavailable']
%}
{{ states("sensor.wp_energy_warmwasser_total") }}
{% else %}
{{ states("sensor.wp_energy_warmwasser_9_12")|float(0) * 100000000
+ states("sensor.wp_energy_warmwasser_5_8")|float(0) * 10000
+ states("sensor.wp_energy_warmwasser_1_4")|float(0)
}}
{% endif %}
- name: "WP Energy Umwelt (Total)"
unique_id: wp_energy_umwelt_total
unit_of_measurement: 'kWh'
state_class: total_increasing
device_class: energy
state: >-
{% if states('sensor.wp_energy_umwelt_1_4') in ['unknown', 'unavailable']
or states('sensor.wp_energy_umwelt_5_8') in ['unknown', 'unavailable']
%}
{{ states("sensor.wp_energy_umwelt_total") }}
{% else %}
{{ states("sensor.wp_energy_umwelt_5_8")|float(0) * 10000
+ states("sensor.wp_energy_umwelt_1_4")|float(0)
}}
{% endif %}
- name: "WP Energy Grid (Total)"
unique_id: wp_energy_grid_total
unit_of_measurement: 'kWh'
state_class: total_increasing
device_class: energy
state: >-
{{ states("sensor.wp_energy_heizen_total")|float(0)
+ states("sensor.wp_energy_warmwasser_total")|float(0)
- states("sensor.wp_energy_umwelt_total")|float(0)
}}
# WP Modus
- name: "WP Betriebsmodus"
unique_id: wp_betriebsmodus
state: >
{% if is_state('sensor.wp_betriebsmodus_id', '0') %}
Sommer
{% elif is_state('sensor.wp_betriebsmodus_id', '1') %}
Auto
{% elif is_state('sensor.wp_betriebsmodus_id', '2') %}
Urlaub
{% elif is_state('sensor.wp_betriebsmodus_id', '3') %}
Party
{% elif is_state('sensor.wp_betriebsmodus_id', '4') %}
2.Wärmeerzeuger
{% else %}
{{ states('sensor.wp_betriebsmodus') }}
{% endif %}
# WP Smart Grid
- name: "WP Smart Grid"
unique_id: wp_smart_grid
state: >-
{% if states('binary_sensor.wp_smart_grid_1') in ['unknown', 'unavailable']
or states('binary_sensor.wp_smart_grid_2') in ['unknown', 'unavailable']
%}
{{ states('sensor.wp_smart_grid') }}
{% else %}
{% if is_state('binary_sensor.wp_smart_grid_1', 'off') and is_state('binary_sensor.wp_smart_grid_2', 'on') %}
rot
{% elif is_state('binary_sensor.wp_smart_grid_1', 'off') and is_state('binary_sensor.wp_smart_grid_2', 'off') %}
gelb
{% elif is_state('binary_sensor.wp_smart_grid_1', 'on') and is_state('binary_sensor.wp_smart_grid_2', 'off') %}
grün
{% elif is_state('binary_sensor.wp_smart_grid_1', 'on') and is_state('binary_sensor.wp_smart_grid_2', 'on') %}
dunkelgrün
{% endif %}
{% endif %}
# WP Betrieb
- name: "WP Display Status"
unique_id: wp_display_status
state: >
{% if is_state('sensor.wp_display_status_id', '0') %}
Aus
{% elif is_state('sensor.wp_display_status_id', '1') %}
Aus
{% elif is_state('sensor.wp_display_status_id', '2') %}
Heizen
{% elif is_state('sensor.wp_display_status_id', '4') %}
Warmwasser
{% elif is_state('sensor.wp_display_status_id', '11') %}
Durchflussüberwachung
{% elif is_state('sensor.wp_display_status_id', '30') %}
Sperre
{% else %}
{{ states('sensor.wp_display_status') }}
{% endif %}
# WP Display Sperre
- name: "WP Display Sperre"
unique_id: wp_display_sperre
state: >
{% if is_state('sensor.wp_display_sperre_id', '0') %}
keine
{% elif is_state('sensor.wp_display_sperre_id', '2') %}
Volumenstrom
{% elif is_state('sensor.wp_display_sperre_id', '5') %}
Funktionskontrolle
{% elif is_state('sensor.wp_display_sperre_id', '6') %}
Einsatzgrenze HT
{% elif is_state('sensor.wp_display_sperre_id', '7') %}
Systemkontrolle
{% elif is_state('sensor.wp_display_sperre_id', '9') %}
Pumpenvorlauf
{% elif is_state('sensor.wp_display_sperre_id', '10') %}
Mindeststandzeit
{% elif is_state('sensor.wp_display_sperre_id', '11') %}
Netzbelastung
{% elif is_state('sensor.wp_display_sperre_id', '12') %}
Schaltspielsperre
{% elif is_state('sensor.wp_display_sperre_id', '13') %}
Warmwasser Nacherwärmung
{% elif is_state('sensor.wp_display_sperre_id', '14') %}
Regenerativ
{% elif is_state('sensor.wp_display_sperre_id', '15') %}
EVU-Sperre
{% elif is_state('sensor.wp_display_sperre_id', '16') %}
Sanftanlasser
{% elif is_state('sensor.wp_display_sperre_id', '17') %}
Durchfluss
{% elif is_state('sensor.wp_display_sperre_id', '18') %}
Einsatzgrenze Wärmepumpe
{% elif is_state('sensor.wp_display_sperre_id', '19') %}
Hochdruck
{% elif is_state('sensor.wp_display_sperre_id', '20') %}
Niederdruck
{% elif is_state('sensor.wp_display_sperre_id', '21') %}
Einsatzgrenze Wärmequelle
{% elif is_state('sensor.wp_display_sperre_id', '23') %}
System Grenze
{% elif is_state('sensor.wp_display_sperre_id', '24') %}
Last Primärkreis
{% elif is_state('sensor.wp_display_sperre_id', '25') %}
Sperre Extern
{% elif is_state('sensor.wp_display_sperre_id', '31') %}
Aufwärmen
{% elif is_state('sensor.wp_display_sperre_id', '33') %}
EvD Initialisierung
{% elif is_state('sensor.wp_display_sperre_id', '34') %}
2.Wärmeerzeuger freigegeben
{% elif is_state('sensor.wp_display_sperre_id', '35') %}
Störung
{% elif is_state('sensor.wp_display_sperre_id', '38') %}
Kommunikation Wärmepumpe (Master)
{% elif is_state('sensor.wp_display_sperre_id', '39') %}
Störung Wärmepumpe (Master)
{% else %}
{{ states('sensor.wp_display_sperre') }}
{% endif %}
# WP Display Störung
- name: "WP Display Störung"
unique_id: wp_display_stoerung
state: >
{% if is_state('sensor.wp_display_stoerung_id', '0') %}
keine
{% elif is_state('sensor.wp_display_stoerung_id', '1') %}
Fehler N17.1
{% elif is_state('sensor.wp_display_stoerung_id', '2') %}
Fehler N17.2
{% elif is_state('sensor.wp_display_stoerung_id', '3') %}
Fehler N17.3
{% elif is_state('sensor.wp_display_stoerung_id', '4') %}
Fehler N17.4
{% elif is_state('sensor.wp_display_stoerung_id', '6') %}
Elektronisches Ex.Ventil
{% elif is_state('sensor.wp_display_stoerung_id', '10') %}
WPIO
{% elif is_state('sensor.wp_display_stoerung_id', '12') %}
Inverter
{% elif is_state('sensor.wp_display_stoerung_id', '13') %}
WQIF
{% elif is_state('sensor.wp_display_stoerung_id', '15') %}
Sensorik
{% elif is_state('sensor.wp_display_stoerung_id', '16') %}
Niederdruck Sole
{% elif is_state('sensor.wp_display_stoerung_id', '19') %}
Primärkreis
{% elif is_state('sensor.wp_display_stoerung_id', '20') %}
Abtauen
{% elif is_state('sensor.wp_display_stoerung_id', '21') %}
Niederdruck Sole
{% elif is_state('sensor.wp_display_stoerung_id', '22') %}
Warmwasser
{% elif is_state('sensor.wp_display_stoerung_id', '23') %}
Last Verdichter
{% elif is_state('sensor.wp_display_stoerung_id', '24') %}
Codierung
{% elif is_state('sensor.wp_display_stoerung_id', '25') %}
Niederdruck
{% elif is_state('sensor.wp_display_stoerung_id', '26') %}
Frostschutz
{% elif is_state('sensor.wp_display_stoerung_id', '28') %}
Hochdruck
{% elif is_state('sensor.wp_display_stoerung_id', '29') %}
Temperatur Differenz
{% elif is_state('sensor.wp_display_stoerung_id', '30') %}
Heißgasthermostat
{% elif is_state('sensor.wp_display_stoerung_id', '31') %}
Durchfluss
{% else %}
{{ states('sensor.wp_display_stoerung') }}
{% endif %}
# WP Display Sensor
- name: "WP Display Sensor"
unique_id: wp_display_sensor
state: >
{% if is_state('sensor.wp_display_sensor_id', '0') %}
kein
{% elif is_state('sensor.wp_display_sensor_id', '1') %}
Außenfühler (R1)
{% elif is_state('sensor.wp_display_sensor_id', '2') %}
Rücklauffühler (R2)
{% elif is_state('sensor.wp_display_sensor_id', '3') %}
Warmwasserfühler (R3)
{% elif is_state('sensor.wp_display_sensor_id', '4') %}
Codierung (R7)
{% elif is_state('sensor.wp_display_sensor_id', '5') %}
Vorlauffühler (R9)
{% elif is_state('sensor.wp_display_sensor_id', '6') %}
2.Heizkreisfühler (R5)
{% elif is_state('sensor.wp_display_sensor_id', '7') %}
3.Heizkreisfühler (R13)
{% elif is_state('sensor.wp_display_sensor_id', '8') %}
Regenerativfühler (R13)
{% elif is_state('sensor.wp_display_sensor_id', '9') %}
Raumfühler 1
{% elif is_state('sensor.wp_display_sensor_id', '10') %}
Raumfühler 2
{% elif is_state('sensor.wp_display_sensor_id', '11') %}
Fühler Wärmequellenaustritt (R6)
{% elif is_state('sensor.wp_display_sensor_id', '12') %}
Fühler Wärmequelleneintritt (R24)
{% elif is_state('sensor.wp_display_sensor_id', '14') %}
Kollektorfühler (R23)
{% elif is_state('sensor.wp_display_sensor_id', '15') %}
Niederdrucksensor (R25)
{% elif is_state('sensor.wp_display_sensor_id', '16') %}
Hochdrucksensor (R26)
{% elif is_state('sensor.wp_display_sensor_id', '17') %}
Raumfeuchte 1
{% elif is_state('sensor.wp_display_sensor_id', '18') %}
Raumfeuchte 2
{% elif is_state('sensor.wp_display_sensor_id', '19') %}
Fühler Frostschutz-Kälte
{% elif is_state('sensor.wp_display_sensor_id', '20') %}
Heisgas
{% elif is_state('sensor.wp_display_sensor_id', '21') %}
Rücklauffühler (R2.1)
{% elif is_state('sensor.wp_display_sensor_id', '22') %}
Schwimmbadfühler (R20)
{% elif is_state('sensor.wp_display_sensor_id', '23') %}
Vorlauffühler Kühlen Passiv (R11)
{% elif is_state('sensor.wp_display_sensor_id', '24') %}
Rücklauffühler Kühlen Passiv (R4)
{% elif is_state('sensor.wp_display_sensor_id', '26') %}
Fühler Solarspeicher (R22)
{% elif is_state('sensor.wp_display_sensor_id', '28') %}
Anforderungsfühler Heizen (R2.2)
{% elif is_state('sensor.wp_display_sensor_id', '29') %}
RTM Econ
{% elif is_state('sensor.wp_display_sensor_id', '30') %}
Anforderungsfühler Kühlen (R39)
{% else %}
{{ states('sensor.wp_display_sensor') }}
{% endif %}
Based on this I can do pretty much everything My main use cases are:
- Smart Grid based on Solar energy produced / forecast (incl. thermal desinfection)
- Change operation mode
- Monitor energy consumption of heatpump
- Calc JAZ
- Monitor temperatures around the heatpump (watertemp, room temp, …)