Dimplex Heatpump LWPS9 + Modbus RTU module + Waveshare to Wifi

Hi, I have managed to share/modify the data of my “simple minded” Boesch / Dimplex LWPS9 heatpump via Home Assistant.
This is what I used:
Modbus RTU module:

Waveshare Modbus to Wifi/Ethernet gateway (Waveshare Industrial Grade Serial Server RS232/485 to WiFi and Ethernet, Modbus Gateway, MQTT Gateway, Metal Case, Wail-Mount and Rail-Mount Support):

Power adapter for Waveshare gateway (DC 15V 1A 1000mA 5.5mm plug):

Heatpump manager is FW version L22.17

Waveshare setup:

  1. Powered on waveshare gateway

  2. connected to default wifi from waveshare

  3. looked up the „gateway“ address that was stated for the waveshare wifi (10.10.110.254 )

  4. Connected to this ip via Chrome browser.

  5. Default login for waveshare: user: „admin“ password: „admin“

  6. Under Quick Configure, Wifi settings:
    switched Mode to „STA Mode“
    entered the settings for my IoT wifi (SSID, key= wifi password)

  7. in Uart settings (these are the setttings that I read on the Dimplex heatpump manager display under “Network” - set this to “Modbus” (not “Modbus extended”) in the heatpump manager; the address range I set to “1 … 127”):
    Uart settings waveshare

  8. Last, under „Device Management“, don’t forget to change the default login and password

  9. Apply all settings & perform a restart of the waveshare gateway via the respective buttons

  10. In my router DHCP settings, I reserved a dedicated IP address for the waveshare gateway (192.168.0.137 in my example)

Wiring:

  1. Switched off power to the heatpump manager/control
  2. put the Modbus RTU module in place
  3. connected a bus wire between the modbus RTU and the waveshare gateway:
    GND to PE
    “+” to A
    “-” to B
  4. Switched on power for the heatpump manager and connected power plug for the waveshare gateway.

Confirmed that I can reach the waveshare gateway via wifi on IP 192.168.0.137.

Home Assistant setup:
Enabled Modbus integration by adding the „modbus:“ line to the configuration.yaml:
modbus: !include modbus.yaml

Then created the „modbus.yaml“ in the same „CONFIG“ folder where the configuration.yaml is:

Initially, I took the content of the modbus.yaml from Rod McBain’s instructions: Mastering Modbus: Heat Pump Integration with Home Assistant – Rod McBain

I modified the registers and inputs according to the register information from dimplex: https://dimplex.atlassian.net/wiki/spaces/DW/pages/3440443393/Modbus+RTU+-+Datenpunktliste and the full PDF here: https://devicedb.my-gekko.com/download_docu.php?id_pk=92&ext=pdf

This is my modbus.yaml now:

- name: waveshare1
  type: tcp
  host: 192.168.0.137
  port: 8899
  delay: 2
  timeout: 5
  binary_sensors:
    #Ausgänge
    - name: "wp_ausgang_verdichter1"
      unique_id: "modbus.wp_ausgang_verdichter1"
      scan_interval: 10
      address: 41
      slave: 1
      input_type: coil

    - name: "wp_ausgang_ventilator"
      unique_id: "modbus.wp_ausgang_ventilator"
      scan_interval: 10
      address: 43
      slave: 1
      input_type: coil

    - name: "wp_ausgang_WEZ2"
      unique_id: "modbus.wp_ausgang_WEZ2"
      scan_interval: 10
      address: 44
      slave: 1
      input_type: coil

    - name: "wp_ausgang_flanschheizung"
      unique_id: "modbus.wp_ausgang_flanschheizung"
      scan_interval: 10
      address: 50
      slave: 1
      input_type: coil

    - name: "wp_ausgang_heizungspumpe"
      unique_id: "modbus.wp_ausgang_heizungspumpe"
      scan_interval: 10
      address: 45
      slave: 1
      input_type: coil

  sensors:
    #Betriebsdaten
    - name: "wp_modus"
      unique_id: "wp_modus"
      scan_interval: 60
      address: 142
      slave: 1
      input_type: input

    - name: "wp_temp_außen"
      unique_id: "modbus.wp_temp_außen"
      scan_interval: 10
      address: 1
      slave: 1
      input_type: input
      scale: 0.1
      precision: 1
      device_class: temperature
      unit_of_measurement: "°C"

    - name: "wp_temp_rücklauf"
      unique_id: "modbus.wp_temp_rücklauf"
      scan_interval: 10
      address: 2
      slave: 1
      input_type: input
      scale: 0.1
      precision: 1
      device_class: temperature
      unit_of_measurement: "°C"

    - name: "wp_temp_rücklauf_soll"
      unique_id: "modbus.wp_temp_rücklauf_soll"
      scan_interval: 10
      address: 53
      slave: 1
      input_type: input
      scale: 0.1
      precision: 1
      device_class: temperature
      unit_of_measurement: "°C"

    - name: "wp_temp_vorlauf"
      unique_id: "modbus.wp_temp_vorlauf"
      scan_interval: 10
      address: 5
      slave: 1
      input_type: input
      scale: 0.1
      precision: 1
      device_class: temperature
      unit_of_measurement: "°C"

    - name: "wp_temp_wärmequellenaustritt"
      unique_id: "modbus.wp_temp_wärmequellenaustritt"
      scan_interval: 10
      address: 7
      slave: 1
      input_type: input
      scale: 0.1
      precision: 1
      device_class: temperature
      unit_of_measurement: "°C"

    - name: "wp_temp_raumsensor1"
      unique_id: "modbus.wp_temp_raumsensor1"
      scan_interval: 10
      address: 11
      slave: 1
      input_type: input
      scale: 0.1
      precision: 1
      device_class: temperature
      unit_of_measurement: "°C"

    - name: "wp_humidity_raumsensor1"
      unique_id: "modbus.wp_humidity_raumsensor1"
      scan_interval: 10
      address: 13
      slave: 1
      input_type: input
      scale: 0.1
      precision: 1
      device_class: humidity
      unit_of_measurement: "%"

    #Statusmeldungen
    - name: "wp_statusmeldungen"
      unique_id: "modbus.wp_statusmeldungen"
      scan_interval: 10
      address: 103
      slave: 1
      input_type: input

    #Historie/Laufzeiten
    - name: "wp_runtime_verdichter1"
      unique_id: "modbus.wp_runtime_verdichter1"
      scan_interval: 60
      address: 72
      slave: 1
      input_type: input
      data_type: uint16
      device_class: duration
      unit_of_measurement: "h"
      state_class: total_increasing

    - name: "wp_runtime_ventilator"
      unique_id: "modbus.wp_runtime_ventilator"
      scan_interval: 60
      address: 74
      slave: 1
      input_type: input
      data_type: uint16
      device_class: duration
      unit_of_measurement: "h"
      state_class: total_increasing

    - name: "wp_runtime_wärmeerzeuger2_E10"
      unique_id: "modbus.wp_runtime_wärmeerzeuger2_E10"
      scan_interval: 60
      address: 75
      slave: 1
      input_type: input
      data_type: uint16
      device_class: duration
      unit_of_measurement: "h"
      state_class: total_increasing

    - name: "wp_runtime_heizungspumpe_M13"
      unique_id: "modbus.wp_runtime_heizungspumpe_M13"
      scan_interval: 60
      address: 76
      slave: 1
      input_type: input
      data_type: uint16
      device_class: duration
      unit_of_measurement: "h"
      state_class: total_increasing

    - name: "wp_runtime_warmwasserpumpe_M18"
      unique_id: "modbus.wp_runtime_warmwasserpumpe_M18"
      scan_interval: 60
      address: 77
      slave: 1
      input_type: input
      data_type: uint16
      device_class: duration
      unit_of_measurement: "h"
      state_class: total_increasing

    - name: "wp_runtime_flanschheizung_E9"
      unique_id: "modbus.wp_runtime_flanschheizung_E9"
      scan_interval: 60
      address: 78
      slave: 1
      input_type: input
      data_type: uint16
      device_class: duration
      unit_of_measurement: "h"
      state_class: total_increasing

    - name: "wp_runtime_zusatzumwälzpumpe_M16"
      unique_id: "modbus.wp_runtime_zusatzumwälzpumpe_M16"
      scan_interval: 60
      address: 71
      slave: 1
      input_type: input
      data_type: uint16
      device_class: duration
      unit_of_measurement: "h"
      state_class: total_increasing

    #Heizkreis 1
    - name: "wp_temp_raum_soll"
      unique_id: "modbus.wp_temp_raum_soll"
      scan_interval: 10
      address: 46
      slave: 1
      input_type: input
      data_type: uint16
      scale: 0.1
      precision: 1
      device_class: temperature
      unit_of_measurement: "°C"

    - name: "wp_hk_hysterese"
      unique_id: "modbus.wp_hk_hysterese"
      scan_interval: 60
      address: 47
      slave: 1
      input_type: input
      data_type: uint16
      scale: 0.1
      precision: 1
      device_class: temperature
      unit_of_measurement: "K"

    #Warmwasser
    - name: "wp_temp_warmwasser"
      unique_id: "modbus.wp_temp_warmwasser"
      scan_interval: 10
      address: 3
      slave: 1
      input_type: input
      scale: 0.1
      precision: 1
      device_class: temperature
      unit_of_measurement: "°C"

    - name: "wp_temp_warmwasser_soll"
      unique_id: "modbus.wp_temp_warmwasser_soll"
      scan_interval: 10
      address: 174
      slave: 1
      input_type: input
      data_type: uint16
      device_class: temperature
      unit_of_measurement: "°C"

    - name: "wp_temp_warmwasser_minimum"
      unique_id: "modbus.wp_temp_warmwasser_minimum"
      scan_interval: 60
      address: 58
      slave: 1
      input_type: input
      data_type: uint16
      scale: 0.1
      device_class: temperature
      unit_of_measurement: "°C"

    - name: "wp_temp_warmwasser_maximum"
      unique_id: "modbus.wp_temp_warmwasser_maximum"
      scan_interval: 60
      address: 175
      slave: 1
      input_type: input
      data_type: uint16
      device_class: temperature
      unit_of_measurement: "°C"

    - name: "wp_warmwasser_hysterese"
      unique_id: "modbus.wp_warmwasser_hysterese"
      scan_interval: 60
      address: 172
      slave: 1
      input_type: input
      data_type: uint16
      device_class: temperature
      unit_of_measurement: "K"

      # 2. Wärmeerzeuger
    - name: "wp_grenztemperatur_2WEZ"
      unique_id: "modbus.wp_grenztemperatur_2WEZ"
      scan_interval: 60
      address: 147
      slave: 1
      input_type: input
      device_class: temperature
      unit_of_measurement: "°C"

  switches:

  climates:
    - name: "wp_climate_raumtemperatur"
      unique_id: "modbus.wp_climate_raumtemperatur"
      address: 11
      slave: 1
      input_type: input
      max_temp: 30.0
      min_temp: 15.0
      offset: 0
      precision: 1
      scale: 0.1
      target_temp_register: 46
      temp_step: 0.1
      temperature_unit: C
      write_registers: true
      hvac_mode_register:
        address: 142
        values:
          state_off: 0
          state_auto: 1

    # - name: "wp_climate_warmwasser"
    #   unique_id: "modbus.wp_climate_warmwasser"
    #   address: 3
    #   scale: 0.1
    #   precision: 1
    #   slave: 1
    #   input_type: input
    #   max_temp: 65
    #   min_temp: 10
    #   offset: 0
    #   target_temp_register: 174
    #   temp_step: 1
    #   temperature_unit: C

I had to set the last climate to comments, because I have not yet managed to integrate a separate scale for the target temperature setting (i.e. the current temperature and target temperature registers have a different scaling, so either scale I choose, I get one value wrong).

Thanks for sharing your insights!

I was looking for a way to integrate a Dimplex-based heat pump into Home Assistant last year. The hardware setup is a similar to yours. My solution was to implement an alternative Modbus integration via MQTT. Maybe it helps someone.

1 Like

Hi, great project. Thanks for sharing. I will try to do the same as soon I get LWPM. Can you change the room temperature? Isn’t it a read register? I would like to control the modus, room temperature and water temperature. Is this possible?
greets Marko

Thank you! Yes, that is possible. I have implementet both the room control and the water as “climate” entities.

  climates:
    - name: "wp_climate_raumtemperatur"
      unique_id: "modbus.wp_climate_raumtemperatur"
      address: 11
      slave: 1
      input_type: input
      max_temp: 30.0
      min_temp: 15.0
      offset: 0
      precision: 1
      scale: 0.1
      target_temp_register: 46
      temp_step: 0.1
      temperature_unit: C
      write_registers: true
      hvac_mode_register:
        address: 142
        values:
          state_off: 0
          state_auto: 1
          state_cool: 2

    - name: "wp_climate_warmwasser"
      unique_id: "modbus.wp_climate_warmwasser"
      address: 175
      precision: 1
      slave: 1
      input_type: input
      max_temp: 65
      min_temp: 10
      offset: 0
      target_temp_register: 174
      temp_step: 1
      temperature_unit: C
      write_registers: true

I am only facing two issues still: The room temperature target/actual values have different scales, but the climate entity only supports one scale for both.
And the other issue is that the room temperature from register 11 is not the actual room temperature, even if this should be the correct register for this room sensor according to documentation. At some point, I will try to scan all the register values and see if one matches the actual room temperature.

I succesfully copied your project. works great! thank you.

1 Like