TapHome

Midea M-Thermal Heat Pump

Modbus RTU
Submitted by
Last updated: 09. 2026
Midea M-Thermal Heat Pump

The Midea M-Thermal A Series Split (R32) is an inverter heat pump system consisting of an outdoor unit and a hydronic box. The system communicates with TapHome via Modbus RTU over RS-485 at 9600 baud, exposing holding registers for control and monitoring. The template provides heating and DHW on/off control, operating mode selection, DHW and zone 1 thermostats, temperature sensors, defrost and backup-heater status contacts, cumulative energy counters, compressor diagnostics and refrigerant pressure monitoring.

The same Modbus register map is used by OEM clones including Hyundai, Concept, Hajdu, Immergas and Clivet Swan heat pumps. The template is compatible with these units when using the same wired controller and hydronic box hardware.

The Modbus register map for this device is community-sourced (Home Assistant community). Register addresses have been verified by multiple users but are not officially documented by Midea.

Hardware connection

RS-485 wiring

The RS-485 Modbus connection is provided through ports H1 and H2 on the wired controller PCB. The wired controller must be connected to the hydraulic module for full Modbus data access.

Connect the RS-485 signal lines:

SignalDirectionPort
BUS1 (A+)<->H2
BUS2 (B-)<->H1

Important — Wired controller required

The wired controller must be connected to the hydronic box for Modbus communication to work. Without the wired controller, registers will not be accessible over RS-485.

Technical specifications
  • Protocol: Modbus RTU Slave, RS-485
  • Baud rate: 9600, no parity, 1 stop bit, 8 data bits
  • Default Slave ID: 1 (rotary switch S3 position 0)
  • Models: MHA-V4W to MHA-V16W (4-16 kW), D2N8-B and D2RN8-B variants
  • Hydronic box: HB-A60/A100/A160/CGN8-B

Configuration

Slave address (S3 rotary switch)

The Modbus slave address is set by rotary switch S3 on the hydronic box main PCB. Position 0 corresponds to slave address 1.

Midea M-Thermal hydronic box main PCB layout with S3 rotary switch

Key components on the hydronic box PCB:

  • S3 (label 2) — Rotary dip switch for Modbus slave address
  • CN14 (label 21) — Communication with the wired controller
  • CN19 (label 20) — Communication between indoor and outdoor unit
  • CN30 (label 22) — Communication with wired controller and internal machine parallel
  • DIS1 (label 3) — Digital display for error codes
Enabling Modbus communication
  1. Remove all power from the heat pump system
  2. Remove the wired controller backplate
  3. Connect the RS-485 A and B signal lines to ports H1 and H2 on the wired controller
  4. Access the hydronic box PCB
  5. Ensure the rotary switch S3 is set to the desired position (position 0 = slave address 1)
  6. Turn on the heat pump system

When configuring the TapHome module, use Modbus RTU with 9600 baud, no parity, 1 stop bit, 8 data bits. The default slave ID is 1 (S3 position 0). If using a Modbus TCP-to-RTU gateway (such as WaveShare), configure the gateway port to 502 and set the slave ID to match the S3 switch position.

Static IP recommendation

If connecting through a Modbus TCP-to-RTU gateway, assign a static IP address or DHCP reservation to the gateway to prevent connectivity issues when the IP address changes.

Device capabilities

Heating and DHW control

The template uses register H:0 as a bit field to control individual functions:

  • Heating (Heat Pump) (H:0 bit 1) — enables or disables heat-pump space heating
  • DHW (H:0 bit 2) — enables or disables the domestic hot water function

Each function is controlled independently using GETBIT/SETBIT operations, allowing heating and DHW to be toggled without affecting each other.

Disinfection of the DHW tank is exposed twice: Disinfection Status reads H:5 bit 4 as a read-only contact, and a Disinfection switch is listed alongside it.

The Disinfection switch carries no read or write formula in the current template — it is displayed in the app but does not start or stop the disinfection cycle. Use Disinfection Status to see whether the cycle is running.

Status contacts

Three read-only contacts expose bits of the heat pump status words:

  • Defrosting (H:128 bit 1) — the outdoor unit is running a defrost cycle
  • IBH1 Immersion Heater (3 kW) (H:129 bit 0) — the internal 3 kW backup immersion heater is energised
  • SV1 3-Way Valve (H:129 bit 4) — the SV1 valve diverts heating water to the DHW tank coil
Operating mode

Heat Pump Mode (H:1) selects the operating mode: Auto (0), Auto (1), Cooling (2), Heating (3), and additional modes (4-9). The template presents this as a multi-value switch.

DHW thermostat

DHW Temperature reads the current DHW tank temperature from H:115 (T5 sensor) and writes the target temperature to H:4. This functions as a thermostat — the current temperature is displayed alongside the setpoint.

Zone 1 thermostat

Zone 1 Water Temperature reads and writes the low byte of H:2, the target water temperature of the zone 1 heating circuit. The register packs two values into one word, so the template writes the low byte with SETBYTE and leaves the high byte untouched. There is no separate current-temperature register — the setpoint byte is read back as the current value.

Temperature monitoring

The template provides six temperature sensors:

  • Calculated Water Temperature (H:110) — final water outlet temperature (T1 sensor)
  • Weather-Compensated Target Temperature (H:136) — equithermic curve target temperature calculated by the heat pump controller
  • Inlet Water Temperature (H:104) — water entering the heat exchanger (Tw_in sensor)
  • Outlet Water Temperature (H:105) — water leaving the heat exchanger (Tw_out sensor)
  • Outdoor Temperature (H:107) — outdoor ambient temperature (T4 sensor), polled every 1 second
  • DHW Temperature Sensor (H:115) — domestic hot water tank temperature (T5 probe) as a plain read-only sensor, the same probe the DHW thermostat reads
Compressor and performance diagnostics
  • Compressor Frequency (H:100) — current inverter compressor speed in Hz
  • Compressor Operating Time (H:122) — cumulative compressor run time in hours
  • Fan Speed (H:102) — outdoor unit fan speed in RPM (12 speed steps, 200-730 RPM depending on model)
  • Capacity (H:140) — current heat pump capacity output (raw value / 100)
  • Water Flow (H:138) — water flow rate through the hydronic circuit in m³/h (raw value / 100)
Energy counters
  • Total Electricity Consumption (H:144) — cumulative electricity consumed by the heat pump in kWh
  • Heat Production (H:146) — cumulative heat energy delivered by the heat pump in kWh

Both counters are documented in the community register map as Int32 values spanning two registers (H:143–H:144 and H:145–H:146). The template reads the low word only, so the readings wrap at 32767 kWh.

Electrical monitoring
  • Outdoor Unit Voltage (H:119) — supply voltage (protection: single phase >=265 V or <=172 V, error code H7)
  • Outdoor Unit Current (H:118) — compressor current draw (protection limits vary by model: 18 A for 4-6 kW, 30 A for 12-16 kW)
  • DC Bus Voltage (H:134) — inverter DC bus voltage (raw value x 10)
  • DC Bus Current (H:133) — inverter DC bus current
Refrigerant pressure
  • Outdoor Unit High Pressure (H:116) — refrigerant high-side pressure in kPa (protection triggers at >4.3 MPa, error code P1)
  • Outdoor Unit Low Pressure (H:117) — refrigerant low-side pressure in kPa (protection triggers at <0.14 MPa, error code P0)
Service diagnostics

The module exposes one service attribute:

  • Software Version (H:130) — heat pump firmware version number
Additional capabilities

The Midea M-Thermal system also exposes registers for heating curve selection, forced water heating, forced tank booster heater (TBH) and internal backup heater (IBH1) control, Smart Grid maximum setpoint, and additional temperature sensors including T1S (final water outlet), T3 (air side HX outlet), Tp (discharge pipe), Th (suction pipe), T1, T2 (liquid pipe) and T2B (gas pipe). Fault code readback (H:124), target compressor frequency and the remaining bits of the status words (H:128, H:129) are also available. IBH1, IBH2 and TBH power settings can be configured. These can be added in a future template update.

The current fault code register (H:124) is not included in the template. To monitor heat pump errors, it can be added as a custom Modbus device in TapHome reading register H0124 as Int16.

Troubleshooting

No Modbus communication
  1. Verify the wired controller is connected to the hydronic box — without it, Modbus registers are not accessible
  2. Check RS-485 signal connections: BUS1 to H2, BUS2 to H1
  3. Confirm TapHome is set to: 9600 baud, no parity, 1 stop bit, 8 data bits
  4. Verify the slave address: check the S3 rotary switch position on the hydronic box PCB (position 0 = address 1)
  5. If using a TCP-to-RTU gateway, verify the gateway is reachable and the serial port settings match
Communication error (H0 error code)

Error code H0 indicates a communication error between the outdoor unit and the hydronic box. Possible causes:

  1. Power supply abnormal — check transformer input (220 V AC) and output (13.5 V AC)
  2. Electromagnetic interference from nearby high-frequency devices — relocate or shield
  3. Communication wires P, Q, E between outdoor unit and hydraulic module are loose or damaged — reconnect
Temperature sensor errors (E3-E9 codes)

Error codes E3, E4, H2, H3, Ed, HA, E5, E6, E9, EA indicate temperature sensor failures:

  1. Check the sensor connection on the corresponding PCB port (see PCB layout diagram)
  2. Measure sensor resistance — if too low, the sensor is short-circuited; if inconsistent with the resistance table, the sensor has failed
  3. If connections are correct and sensor is functional, the PCB may need replacement
Pressure protection errors
  • P0 (low pressure) — suction pressure below 0.14 MPa. Check refrigerant charge, expansion valve operation
  • P1 (high pressure) — discharge pressure above 4.3 MPa. Check condenser airflow, fan operation, refrigerant overcharge
  • P4 (high discharge temperature) — discharge pipe temperature above 115 °C. Check compressor operation, refrigerant levels

Available devices

Midea Heat Pump Module
Service Attributes
Software Versionreads H:130 (UInt16); heat pump firmware version number
Software version

Midea Heat Pump

Service Attributes
Attribute
Software version
MODBUSR(H, 130, UInt16)
Calculated Water Temperature Temperature Sensor Read-only

Final water outlet temperature — T1 sensor (H:110)

Register: H:110 Int16 (Temperature) Unit: °C numeric

Calculated Water Temperature

Read temperature
MODBUSR(H, 110, Int16)
Capacity Variable Read-only

Current heat pump capacity output as a percentage

Register: H:140 Int16 numeric

Capacity

Read
MODBUSR(H, 140, Int16) / 100
Total Electricity Consumption Electricity Meter Read-only

Cumulative electricity consumed by the heat pump in kWh (H:144)

Register: H:144 Int16 Unit: kWh numeric

Total Electricity Consumption

Read total consumption
MODBUSR(H, 144, Int16)
Weather-Compensated Target Temperature Temperature Sensor Read-only

Equithermic curve target temperature calculated by the heat pump controller (H:136)

Register: H:136 Int16 (Temperature) Unit: °C numeric

Weather-Compensated Target Temperature

Read temperature
MODBUSR(H, 136, Int16)
Compressor Operating Time Variable Read-only

Cumulative compressor run time in hours

Register: H:122 Int16 Unit: h numeric

Compressor Operating Time

Read
MODBUSR(H, 122, Int16)
DC Bus Current Variable Read-only

Inverter DC bus current

Register: H:133 Int16 Unit: A numeric

DC Bus Current

Read
MODBUSR(H, 133, Int16)
DC Bus Voltage Variable Read-only

Inverter DC bus voltage — raw value multiplied by 10

Register: H:134 Int16 Unit: V numeric

DC Bus Voltage

Read
MODBUSR(H, 134, Int16) *10
Defrosting Reed Contact Read-only

Shows whether the outdoor unit is running a defrost cycle (H:128 bit 1)

Register: H:128 Bool (bit 1) bitfield

Defrosting

Read
GETBIT(MODBUSR(H, 128, Int16),1)
Disinfection Status Reed Contact Read-only

Shows whether the anti-legionella disinfection cycle is running (H:5 bit 4)

Register: H:5 Bool (bit 4) bitfield

Disinfection Status

Read
GETBIT(MODBUSR(H, 5, Int16),4)
Disinfection Switch

Anti-legionella disinfection cycle for the DHW tank

Bool bitfield
Values / States: ON · OFF
Compressor Frequency Variable Read-only
Register: H:100 Int16 Unit: Hz numeric

Compressor Frequency

Read
MODBUSR(H, 100, Int16)
IBH1 Immersion Heater (3 kW) Reed Contact Read-only

Shows whether the 3 kW internal backup immersion heater is energised (H:129 bit 0)

Register: H:129 Bool (bit 0) bitfield

IBH1 Immersion Heater (3 kW)

Read
GETBIT(MODBUSR(H, 129, Int16),0)
Inlet Water Temperature Temperature Sensor Read-only

Water entering the heat exchanger — Tw_in sensor (H:104)

Register: H:104 Int16 (Temperature) Unit: °C numeric

Inlet Water Temperature

Read temperature
MODBUSR(H, 104, Int16)
Heating (Heat Pump) Switch

Enables or disables heat-pump space heating

Register: H:0H:0 Bool (bit 1) bitfield
Values / States: ${general_yes} · ${general_no}

Heating (Heat Pump)

Read switch state
GETBIT(MODBUSR(H, 0, Int16),1)
Write switch state
var reg := MODBUSR(H, 0 , UInt16);
MODBUSW(H, 0 , UInt16, SETBIT(reg,1,St));
Fan Speed Variable Read-only

Outdoor unit fan speed in RPM

Register: H:102 Int16 Unit: RPM numeric

Fan Speed

Read
MODBUSR(H, 102, Int16)
Outdoor Unit Current Variable Read-only
Register: H:118 Int16 Unit: A numeric

Outdoor Unit Current

Read
MODBUSR(H, 118, Int16)
Outdoor Unit High Pressure Variable Read-only

Refrigerant high-side pressure — protection triggers above 4.3 MPa (error code P1)

Register: H:116 Int16 Unit: kPa numeric

Outdoor Unit High Pressure

Read
MODBUSR(H, 116, Int16)
Outdoor Unit Low Pressure Variable Read-only

Refrigerant low-side pressure — protection triggers below 0.14 MPa (error code P0)

Register: H:117 Int16 Unit: kPa numeric

Outdoor Unit Low Pressure

Read
MODBUSR(H, 117, Int16)
Outdoor Unit Voltage Variable Read-only
Register: H:119 Int16 Unit: V numeric

Outdoor Unit Voltage

Read
MODBUSR(H, 119, Int16)
Outlet Water Temperature Temperature Sensor Read-only

Water leaving the heat exchanger — Tw_out sensor (H:105)

Register: H:105 Int16 (Temperature) Unit: °C numeric

Outlet Water Temperature

Read temperature
MODBUSR(H, 105, Int16)
Heat Production Electricity Meter Read-only

Cumulative heat energy delivered by the heat pump in kWh (H:146)

Register: H:146 Int16 Unit: kWh numeric

Heat Production

Read total consumption
MODBUSR(H, 146, Int16)
Heat Pump Mode Multi-value Switch

Operating mode selection — Auto, Cooling, Heating and additional modes

Register: H:1H:1 Int16 numeric
Values / States: Auto · Auto · Chladenie · Kurenie

Heat Pump Mode

Read switch state
MODBUSR(H, 1, Int16)
Write switch state
MODBUSW(H, 1, Int16, Mu)
SV1 3-Way Valve Reed Contact Read-only

Shows whether the SV1 valve diverts heating water to the DHW tank (H:129 bit 4)

Register: H:129 Bool (bit 4) bitfield

SV1 3-Way Valve

Read
GETBIT(MODBUSR(H, 129, Int16),4)
DHW Temperature Sensor Temperature Sensor Read-only

Domestic hot water tank temperature as a read-only sensor — T5 probe (H:115)

Register: H:115 Int16 (Temperature) Unit: °C numeric

DHW Temperature Sensor

Read temperature
MODBUSR(H, 115, Int16)
DHW Temperature Thermostat

Domestic hot water tank thermostat — reads current tank temperature, writes target setpoint

Register: H:115 (current), H:4 (setpoint)H:4 Int16 Unit: °C numeric

DHW Temperature

Read temperature
MODBUSR(H, 115, Int16)
Read desired temperature
MODBUSR(H, 4, Int16)
Write desired temperature
MODBUSW(H, 4, Int16, Se)
DHW Switch

Enables or disables the domestic hot water function

Register: H:0H:0 Bool (bit 2) bitfield
Values / States: ON · OFF

DHW

Read switch state
GETBIT(MODBUSR(H, 0, Int16),2)
Write switch state
var reg := MODBUSR(H, 0 , UInt16);
MODBUSW(H, 0, UInt16, SETBIT(reg,2,St));
Outdoor Temperature Temperature Sensor Read-only

Outdoor ambient temperature — T4 sensor (H:107)

Register: H:107 Int16 (Temperature) Unit: °C numeric

Outdoor Temperature

Read temperature
MODBUSR(H, 107, Int16)
Water Flow Variable Read-only

Water flow rate through the hydronic circuit in m³/h

Register: H:138 Int16 Unit: m³/h numeric

Water Flow

Read
MODBUSR(H, 138, Int16) / 100
Zone 1 Water Temperature Thermostat

Target water temperature for the zone 1 heating circuit — low byte of H:2

Register: H:2 (low byte)H:2 (low byte) Int16 (low byte) Unit: °C packed-byte

Zone 1 Water Temperature

Read temperature
MODBUSR(H, 2, Int16) & 0xFF
Write desired temperature
MODBUSW(H, 2, Int16, SETBYTE(MODBUSR(H, 2, UInt16), 0, Se))
Connection: Modbus RTU • 9600 baud• 8N1 • Slave ID: $[SlaveId]
Possible improvements (21)
  • H:6 Curve Selection — Heating curve selection — weather-compensated heating curve parameter
  • H:7 Forced Water Heating — Manual water heating trigger — forces heating cycle
  • H:8 Forced TBH — Tank Booster Heater — forces DHW tank electric backup heater on
  • H:9 Forced IBH1 — Internal Backup Heater 1 — forces electric backup heater on
  • H:10 Smart Grid Max Setpoint (t_SG_MAX) — Maximum setpoint for smart grid operation
  • H:11 T1S Temperature — Final water outlet temperature (T1S sensor). H:110 (T1) is now implemented as 'Calculated Water Temperature'
  • H:101 Operating Mode (read) — Current operating mode status readback — different from the control register H:1
  • H:106 T3 Temperature — Air side heat exchanger refrigerant outlet temperature
  • H:108 Tp Temperature (Discharge) — Discharge pipe temperature. Protection: >115°C triggers P4 error
  • H:109 Th Temperature (Suction) — Suction pipe temperature
  • H:112 T2 Temperature (Liquid pipe) — Water side heat exchanger liquid pipe temperature
  • H:113 T2B Temperature (Gas pipe) — Water side heat exchanger gas pipe temperature
  • H:124 Current Fault Code — Active error code — could enable fault monitoring in TapHome
  • H:128 Bit Status 1 — remaining bits — System status bit field. Bit 1 is implemented as the Defrosting contact; the other status bits are not exposed
  • H:129 Load Output — remaining bits — Load output bit field. Bit 0 is implemented as the IBH1 immersion heater contact and bit 4 as the SV1 3-way valve contact; the other load bits are not exposed
  • H:132 Target Frequency — Requested compressor speed — useful to compare against actual frequency (H:100)
  • H:143 (high word) Electricity Consumption — high word — The counter is Int32 across H:143–H:144. The template implements the low word only (Total Electricity Consumption); the high word is not read, so readings wrap at 32767 kWh
  • H:145 (high word) Power Output — high word — The counter is Int32 across H:145–H:146. The template implements the low word only (Heat Production); the high word is not read, so readings wrap at 32767 kWh
  • H:250 IBH1 Power — Internal Backup Heater 1 power setting
  • H:251 IBH2 Power — Internal Backup Heater 2 power setting
  • H:252 TBH Power — Tank Booster Heater power setting

Sources

Found a problem with this device template?

Tell us what's wrong, what's missing, or how the template should behave. We rely on your feedback to keep the catalog accurate.

Verified by TapHome

Want to use this in your TapHome Core?

Open this template in the Customer Portal to apply it to one of your homes, or to draft a refinement and submit it back to the catalog.

Open in portal