Troubleshooting Hyundai Heat Pump (Midea Clone) Integration into Home Assistant via RS485/TCP


Hello community,

I’m seeking assistance with a technical challenge I’m facing in integrating a Hyundai HYHC-V18W/D2RN8 heat pump (which is a clone of Midea models) into Home Assistant. I am using a Waveshare RS485 to Ethernet module (link) for this connection, but I’m having trouble reading any data from the pump.

Details of my current setup:

  • Hardware Connection: I have connected the Waveshare module to the wired remote of the heat pump, using the H1 and H2 ports.
  • RS485/TCP Module Configuration: I have set the module with the following specifications: Baud rate 9600, Data bits 8, Parity none, Stop bits 1.
  • Issue: I am unable to read any data from the pump, despite following all instructions and recommendations from the documentation.

I would greatly appreciate advice or guidance on the following:

  • Are the RS485 settings I configured correct? Is there any particularity I should be aware of regarding these heat pumps?
  • Is there a specific integration in Home Assistant for communicating with Hyundai or Midea heat pumps via RS485/TCP?
  • What other troubleshooting steps might I try to resolve this issue?

Any experience, advice, or suggestion related to this situation would be immensely valuable. I am relatively new to home automation and trying to navigate through these technical challenges.

Thank you very much for any help you can provide!




Uploading: IMG-20231225-WA0011.jpg…

1 Like

Following! Trying to achieve the exact same thing since yesterday (clivet branded midea clone)

Hi,

I have succesfully integrated the Midea heatpump in Home Assistant.
Instead of the Waveshare device I use a simple RS485 to USB interface and connect it to my HA hardware platform being a generic NUC intel computer.
But your setup should work as well, using the MODBUS tcp setup. All the hardware settings seem to be ok so I think you should be able to read the heatpump registers. In the QModMaster you may want to try start address 104 in stead of 40105. This should return the water inlet temperature in degrees celcius. (Tw-in).
Here is my configuration.yaml setup for reference:
modbus:

  • name: WP
    type: serial
    method: rtu
    port: /dev/ttyUSB1
    baudrate: 9600
    stopbits: 1
    bytesize: 8
    parity: N
    delay: 2
    sensors:
    xxxxxxxx

I have a Carrier heat pump thermostat that looks very similar and is also HA/HB interface

  1. The thermostat is connected to the air handler via HA/HB. How to you connect the RS485 module? Just in parallel to the HA/HB pins? Either on the air handler side or the thermostat side?

  2. I’d be planning to use a ESP RS485 adapter. Once you get data, how do you connect it to Home Assistant? Is this modbus under RS485? Which integration? How to get the climate entities? Can you share more details?

Thank you!!

I implemented mine using RS 485 to USB adapter and did the configuration in configuration.yaml. Not sure how to use ESP RS485 adapter but you may find a good starting point here:
https://esphome.io/components/modbus_controller
This explains how to setup the modbus component in ESP Home.
You will need to configure the UART parameters that meet your hardware requirements. like tx pin, rx pin. Set the baud rate to 9600 and stop bits to 1

You will need to find out the address of the slave, in my case this is 1.
Next you need to figure out the addresses of the holding registers of the data that you are intrested in. Once you have these then you can read the data from these registers or, if allowed change them by writing. To read or write specific bits from/to the registers you will need to use bitmasks.
Here are all the registers I have used to read the data that I was intrested in:
Hopefully this will help.

sensors:
      - name: WP Power On Off
        slave: 1
        address: 0
        data_type: uint16
        input_type: holding
      - name: WP Function Setting
        slave: 1
        address: 5
        scan_interval: 5
        data_type: uint16
        input_type: holding
      - name: WP Curve Selection
        slave: 1
        address: 6
        data_type: uint16
        input_type: holding
      - name: Forced Water Heating
        slave: 1
        address: 7
        data_type: int16
        input_type: holding
      - name: Forced TBH
        slave: 1
        address: 8
        data_type: int16
        input_type: holding
      - name: Forced IBH1
        slave: 1
        address: 9
        data_type: int16
        input_type: holding
      - name: t_SG_MAX
        slave: 1
        address: 10
        data_type: int16
        input_type: holding
      - name: T1S
        unit_of_measurement: °C
        device_class: temperature
        state_class: measurement
        slave: 1
        address: 11
        data_type: int16
        input_type: holding
      - name: Compressor Frequency
        unit_of_measurement: Hz
        device_class: frequency
        state_class: measurement
        slave: 1
        address: 100
        data_type: int16
        input_type: holding
      - name: Operating Mode
        slave: 1
        address: 101
        data_type: int16
        input_type: holding
      - name: Fan Speed
        unit_of_measurement: RpM
        state_class: measurement
        slave: 1
        address: 102
        data_type: int16
        input_type: holding
      - name: TW_in
        unit_of_measurement: °C
        device_class: temperature
        state_class: measurement
        slave: 1
        address: 104
        data_type: int16
        input_type: holding
      - name: TW_out
        unit_of_measurement: °C
        device_class: temperature
        state_class: measurement
        slave: 1
        address: 105
        data_type: int16
        input_type: holding
      - name: T3 Temperature
        unit_of_measurement: °C
        device_class: temperature
        state_class: measurement
        slave: 1
        address: 106
        data_type: int16
        input_type: holding
      - name: T4 Temperature
        unit_of_measurement: °C
        device_class: temperature
        state_class: measurement
        slave: 1
        address: 107
        data_type: int16
        input_type: holding  
      - name: Tp
        unit_of_measurement: °C
        device_class: temperature
        state_class: measurement
        slave: 1
        address: 108
        data_type: int16
        input_type: holding
      - name: Th
        unit_of_measurement: °C
        device_class: temperature
        state_class: measurement
        slave: 1
        address: 109
        data_type: int16
        input_type: holding
      - name: T1 Temperature
        unit_of_measurement: °C
        device_class: temperature
        state_class: measurement
        slave: 1
        address: 110
        data_type: int16
        input_type: holding  
      - name: T2 Temperature
        unit_of_measurement: °C
        device_class: temperature
        state_class: measurement
        slave: 1
        address: 112
        data_type: int16
        input_type: holding
      - name: T2B Temperature
        unit_of_measurement: °C
        device_class: temperature
        state_class: measurement
        slave: 1
        address: 113
        data_type: int16
        input_type: holding
      - name: T5 Temperature
        unit_of_measurement: °C
        device_class: temperature
        state_class: measurement
        slave: 1
        address: 115
        data_type: int16
        input_type: holding
      - name: Compressor High Pressure
        unit_of_measurement: kPa
        device_class: pressure
        state_class: measurement
        slave: 1
        address: 116
        data_type: int16
        input_type: holding
      - name: Compressor Low Pressure
        unit_of_measurement: kPa
        device_class: pressure
        state_class: measurement
        slave: 1
        address: 117
        data_type: int16
        input_type: holding
      - name: WP Current
        unit_of_measurement: A
        device_class: current
        state_class: measurement
        slave: 1
        address: 118
        data_type: int16
        input_type: holding
      - name: WP Voltage
        unit_of_measurement: V
        device_class: voltage
        state_class: measurement
        slave: 1
        address: 119
        data_type: int16
        input_type: holding
      - name: Compressor Operating Time
        unit_of_measurement: h
        device_class: duration
        state_class: measurement
        slave: 1
        address: 122
        data_type: int16
        input_type: holding
      - name: Current Fault
        slave: 1
        address: 124
        data_type: int16
        input_type: holding
      - name: WP Bit Status 1
        slave: 1
        address: 128
        scan_interval: 5
        data_type: uint16
        input_type: holding
      - name: WP Load Output
        slave: 1
        address: 129
        scan_interval: 5
        data_type: uint16
        input_type: holding
      - name: WP Target Frecuency
        unit_of_measurement: Hz
        device_class: frequency
        state_class: measurement
        slave: 1
        address: 132
        scan_interval: 5
        data_type: uint16
        input_type: holding
      - name: WP T1S Calc
        unit_of_measurement: °C
        slave: 1
        address: 136
        data_type: int16
        input_type: holding
      - name: WP Water Flow*100
        unit_of_measurement: m3/h
        slave: 1
        address: 138
        data_type: int16
        input_type: holding
      - name: WP Electricity Consumption
        unit_of_measurement: kWh
        device_class: energy
        state_class: total_increasing
        slave: 1
        address: 143
        data_type: int32
        input_type: holding
      - name: WP Power Output
        unit_of_measurement: kWh
        device_class: energy
        state_class: total_increasing
        slave: 1
        address: 145
        data_type: int32
        input_type: holding
      - name: WP Parameter Settings 1
        slave: 1
        address: 210
        scan_interval: 5
        data_type: uint16
        input_type: holding
      - name: WP Parameter Settings 2
        slave: 1
        address: 211
        scan_interval: 5
        data_type: uint16
        input_type: holding
      - name: WP IBH1 Power
        slave: 1
        address: 250
        scan_interval: 5
        data_type: uint16
        input_type: holding
      - name: WP IBH2 Power
        slave: 1
        address: 251
        scan_interval: 5
        data_type: uint16
        input_type: holding
      - name: WP TBH Power
        slave: 1
        address: 252
        scan_interval: 5
        data_type: uint16
        input_type: holding
    climates:
      - name: "DHW"
        address: 115
        data_type: int16
        input_type: holding
        max_temp: 60
        min_temp: 20
        offset: 0
        precision: 1
        scale: 1
        target_temp_register: 4
        temp_step: 1
        temperature_unit: C

Hi @Richardvdw01 and @cornekus would you mind sharing a picture of your PCB and how it is connected?

How exactly is your thermostat connected? Only via H1/H2 wires or are there others? And importantly, is your thermostat powered by these signals?

I am asking because today I took the jump and tried to connect an Atom RS485 adapter in parallel to my thermostat (schematic). Right after connecting, the air handler started to click and the thermostat went off. I immediately pulled the breaker. I tried connecting it before powering on the air handler but same issue. Even according to the manual, it is possible to have parallel connections but something with my RS485 adapter doesn’t seem to work.

I am also wondering how is the thermostat powered by these two wires? I thought this is just a differential RS485 signaling wire? Maybe not?

My configuration uses a on/off room thermostat that is connected to the hydronics PCB terminal CN31 COM and CL contacts. The Home Assistant Modbus is connected to the H1 and H2 terminals of the wired controller.
Looks like you have a different setup where the thermostat is connected to the modbus ?? I presume that by “thermostat” you do not refer to the wired controller?

On my github page you can find more info about connection an ESPHome device to a Midea (and clones) heat pump. Also a ready made solution is available.

what about MIDEA HA/HB 2 wire remote controller?
I can’t connect via modbus. Tried with ESP32+RS485/TTL and with WAVEShare RS485-TCP but there is no packet captured from interface.
Also in https://shop.svenar.nl/ the controller is “Not compatible with the Midea remote display using the A/X1, B/X2 wiring (2 wires).”

Are you sure that the connections you have are not modbus? Can you share the brand and model heat pump you have and which version of the remote controller is used?