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).