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 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 Raum Solltemperatur" unique_id: wp_raum_solltemperatur slave: 1 address: 46 input_type: input unit_of_measurement: °C state_class: measurement scale: 0.1 offset: 0 precision: 1 data_type: int16 - 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 Heizkurve" unique_id: wp_heizkurve slave: 1 address: 163 input_type: holding state_class: measurement scale: 0.01 offset: 0 precision: 2 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
# 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, …)