TapHome

LG Therma V (pre-2021)

Modbus RTU
Submitted by
Last updated: 06. 2026
LG Therma V (pre-2021)

The LG Therma V is an air-to-water heat pump (5–16 kW, single- and three-phase, R-410A and R32 generations) for space heating, cooling and domestic hot water. The pre-2021 generation exposes a native Modbus RTU interface on the indoor unit’s main PCB via the CN_MODBUS(WH) connector, so TapHome connects directly over RS-485 — no external LG gateway is needed.

This template covers the integrated Modbus interface on the older R-410A line (HU091MR / HM091M / AHUW / AHNW) and the early R32 Hydrosplit / Monobloc range (HU121MRB / HU141MRB / HU161MRB U30, HU123MRB / HU143MRB / HU163MRB U30, HN0916T.NB1 + HU091MR.U44). The 2021+ Therma V generation uses the external PMBUSB00A Modbus gateway with different register addressing — for those units use the lg-thermav-2021 template instead.

Make sure you have the correct hardware before importing this template. Look at the indoor unit’s main PCB: if you see a white CN_MODBUS(WH) connector and no external gateway box near the unit, you have the pre-2021 generation that this template targets. If LG installed a separate small white box labelled PMBUSB00A between the indoor unit and the BMS, use the lg-thermav-2021 template — its register addressing is incompatible with this one.

Hardware connection

The integrated Modbus interface lives on the indoor main PCB. The TapHome ModbusRtuCCU wires directly to the CN_MODBUS(WH) connector on the PCB with a twisted pair (A+/B−). Alternatively, an RS-485-to-Ethernet gateway (Waveshare RS485-TO-ETH(B), Elfin EW11, etc.) can be placed between the heat pump and TapHome — the template’s IpAddress import parameter handles both RTU-direct and RTU-over-TCP topologies.

Indoor PCB connectors
LG Therma V indoor and outdoor PCB layout — CN_MODBUS connector is on the Main PCB (Indoor), bottom-left panel

The bottom-left panel shows the Main PCB (Indoor) — find the connector labelled CN_MODBUS (white housing, typically WH in the chassis colour code). Relevant connectors on the indoor PCB:

ConnectorColourPurpose
CN_MODBUSWHRS-485 Modbus bus — connects to TapHome. A+, B− (GND optional, not present on every chassis revision)
CN_REMOGRWired remote controller — used to set the Modbus slave address
CN_EXTBLExternal DI/DO terminal block (dry contact, not used by template)
RS-485 wiring
  • A (BUS_A / D+) → A+ on the TapHome RS-485 bus
  • B (BUS_B / D−) → B− on the TapHome RS-485 bus
  • GND (where provided) → GND on the TapHome power supply

Use shielded twisted-pair cable (CAT5 STP or industrial RS-485). For runs longer than 10 m, terminate the far end with a 120 Ω resistor; TapHome Core has a built-in termination resistor on its BUS terminals, so it can sit at one end of the daisy chain without an external resistor. Connect the cable shield to ground at one end only.

A GND reference between the heat pump and the TapHome bus is recommended for runs longer than a few metres, even though LG does not include a dedicated GND pin on every chassis revision. If the chassis lacks a CN_MODBUS GND, use the PE/earth bar in the indoor unit as the bonding point.

USB-RS485 and Ethernet gateway alternatives

When TapHome Core cannot be wired directly to the indoor unit, an RS-485 gateway in front of the heat pump is a verified topology:

GatewayNotes
Waveshare RS485-TO-ETH(B)Most commonly used. Set to TCP server mode, default port 4196. Use a static IP / DHCP reservation.
Elfin EW11 (RS-485 to Wi-Fi)Works but adds latency — not recommended for control writes.
USB-RS485 (FTDI / Genuine Prolific)Reliable for direct Core connection at 9600 baud.
USB-RS485 (CH340 cheap dongles)Often drops frames at 9600 baud — avoid for production.

Configuration

Enabling Modbus communication

The Modbus interface is disabled by default and must be activated via two DIP switches on the indoor PCB. Power down the indoor unit before changing DIP positions — switches are read at boot and changes made with power on are ignored until the next reset.

LG Therma V indoor PCB with SW1 and SW2 DIP-switch banks highlighted

Set the following positions on Option Switch 1 (SW1) on the indoor main PCB:

SwitchPositionFunction
SW1-1ON (up)MODBUS — As Slave (default is As Master)
SW1-2ON (up)MODBUS Function — Unified Open Protocol (default is REGINE, a proprietary LG protocol not compatible with standard Modbus clients)

If SW1-2 is left in the default REGINE position, TapHome will see “Read Error 02” on every poll and no register reads will succeed. Both SW1-1 and SW1-2 must be ON before standard Modbus communication works.

After setting the DIP switches, cycle power on the indoor unit. The “Modbus Address” menu item only appears in the wired-remote service menu after a power cycle with SW1-1 = ON.

Setting the slave address

Set the slave address from the indoor unit’s wired remote controller:

1
Menu  →  Installer settings  →  Connectivity  →  Modbus Address

The address can be set from 1 to 247 (Modbus RTU specification). The template defaults to slave ID 1, matching the LG factory default.

On some early R-410A firmware revisions, the factory default slave ID is 2 rather than 1. If communication times out with the default SlaveId=1 import parameter, try SlaveId=2 first before checking wiring or DIP switches.

Communication parameters

The integrated interface uses fixed Modbus RTU parameters — only the slave ID is configurable.

ParameterValue
Baud rate9600
Data bits8
ParityNone
Stop bits1
Slave ID1 (default; 2 on some early firmware)
TapHome import parameters

When importing the template into TapHome, set:

ParameterValue
SlaveId1 (or the value configured on the wired remote)
IpAddressIP address of an RS-485-to-Ethernet gateway (e.g. Waveshare). Leave at the placeholder default when wiring TapHome Core directly to CN_MODBUS over RS-485.

Device capabilities

The template exposes twelve devices grouped around the four control axes of the heat pump: mode and demand selection, setpoint and thermostat, status sensing, and quiet-mode operation. Module-level error monitoring decodes CH01–CH18 fault codes into TapHome error messages automatically.

Operating mode and demand
  • Heating/Cooling Demand (C:0) — main on/off switch for the unit. Setting it to ON is equivalent to pressing on/off on the wired remote.
  • Mode (H:0) — selects the operating mode: Cooling (0), Auto (3) or Heating (4). Only those three values are valid per the LG protocol — the placeholder values 1, 2 and 5–9 visible in the multi-value list should not be selected.
  • Operating Mode (A:1) — read-only outdoor-unit operation cycle: Standby/Off (0), Cooling (1) or Heating (2). Reflects the actual current cycle, which may differ briefly from the requested Mode above (e.g. during defrost or warm-up).
  • Quiet Mode (C:2) — silent-mode toggle that reduces outdoor-unit fan and compressor noise for night-time operation.
Control method and thermostat
  • Control Method (H:1) — selects which sensor the heat pump uses for regulation: Water Outlet (0, default), Water Inlet (1) or Room Air (2). This setting also drives the thermostat’s process-variable register selection.

  • Thermostat (setpoint H:2, current temperature dynamically chosen) — combined setpoint and current-temperature device. The setpoint is stored in H:2 on a ×10 scale (°C × 10). The current-temperature read register is selected dynamically based on the Control Method:

    • Control Method = Room Air → reads A:7 (Room Air Temperature, Circuit 1)
    • Control Method = Water Inlet → reads A:2 (Water Inlet Temperature)
    • Control Method = Water Outlet (default) → reads A:3 (Water Outlet Temperature)

    If the underlying sensor reads ≤ −64.9 °C, TapHome reports a “Nezapojený teplomer” (sensor disconnected) error and the thermostat returns NaN. The setpoint range depends on the Control Method — approximately 30–50 °C for Water Outlet heating (Circuit 1 Target Temperature). Narrower comfort ranges apply in Room Air mode and also depend on firmware revision and whether high-temperature DHW is enabled.

Status sensing
  • Compressor (D:3) — ON when the outdoor-unit compressor is producing heating or cooling output.
  • Circulation Pump (D:1) — ON when the heat pump’s internal water pump is moving water through the primary circuit.
  • Defrost (D:4) — ON while the outdoor unit is running a defrost cycle. Heating output is temporarily suspended while ice is melted from the outdoor coil — expect a short drop in leaving water temperature during this period.
Temperatures
  • Water Inlet Temperature (A:2) — return water temperature entering the heat pump from the heating circuit.
  • Water Outlet Temperature (A:3) — leaving water temperature exiting the heat pump to the heating circuit.
  • Outdoor Temperature (A:12) — outdoor air temperature measured by the outdoor unit’s ambient sensor.

All three temperatures are scaled Int16 ÷ 10 (°C) and polled every 15 seconds. A raw reading at or below −64.9 °C is treated as “sensor disconnected” — TapHome reports a “Nezapojené” error and the value returns NaN.

Error monitoring

The module-level read script polls the discrete alarm flag (D:13) and, when set, reads the active error code from A:0 and decodes it into a human-readable TapHome error. The following CH codes are mapped:

CodeMeaning
CH01Air temperature sensor error
CH03No communication between wired remote controller and indoor unit
CH05Indoor unit and outdoor unit communication error
CH08Water tank temperature sensor error
CH09Indoor unit EEPROM error
CH11Indoor unit and inverter PCB communication error
CH12Inverter PCB error
CH13Problem in solar-thermal sensor
CH14Flow switch error — water flow below threshold
CH15Water pipe overheated
CH16Combined water inlet/outlet temperature sensor error
CH17Water inlet temperature sensor error
CH18Water outlet temperature sensor error

Outdoor-PCB error codes (CH21 and above) are not exposed via the indoor Modbus interface — they are reported only via the LED blink pattern on the outdoor unit.

Troubleshooting

“Read Error 02” on every poll

Almost always caused by SW1-2 = OFF (REGINE proprietary protocol). Power off the indoor unit, set SW1-2 = ON (Unified Open Protocol), power back on and retry.

Slave never responds
  • DIP switch SW1-1 = OFF — the unit acts as a Modbus master instead of slave and never answers polls. Set to ON and reboot the PCB.
  • Wrong slave ID — try SlaveId=2 on early R-410A firmware before changing wiring.
  • “Modbus Address” menu item missing in the wired remote — DIP SW1-1 is not ON, or the PCB was not power-cycled after the change.
Setpoint writes silently rejected

On older NK3 firmware (pre-2018), only holding registers H:0 (Mode), H:1 (Control Method) and H:2 (Setpoint) are universally writable. Circuit-2 setpoints and the DHW target temperature are documented in the register map but the unit may ignore writes to them — they are intentionally not exposed by this template for that reason.

Frame drops with cheap USB-RS485 adapters

CH340-based dongles often miss frames at 9600 baud due to OS scheduling and inter-character timing. Switch to an FTDI- or Prolific-based adapter, or move to a Waveshare RS485-TO-ETH gateway (RTU-over-TCP via the IpAddress import parameter) for production deployments.

Sensor reports “Nezapojené” / “Nezapojený teplomer”

The raw temperature register returned a value at or below −64.9 °C, indicating the underlying LG sensor is disconnected or faulty. Check the sensor wiring at the relevant indoor-PCB connector (CN_ROOM1 for room air, the leaving/return water sensors on the indoor unit) or the outdoor unit’s ambient sensor for the outdoor temperature device.

Available devices

LG Therma V Module

TC LG

Read (module)
if MODBUSR(D, 13, bool)
    #ADDERROR("Ch: " + MODBUSR(A, 0, int16));
    switch(MODBUSR(A, 0, int16),
        1, ADDERROR("CH01 Air temperature sensor error"),
        3, ADDERROR("CH03 No communication between wired remote controller & indoor unit"),
        5, ADDERROR("CH05 Indoor unit & outdoor unit communication error"),
        8, ADDERROR("CH08 Water tank temperature sensor error"),
        9, ADDERROR("CH09 Indoor unit EEPROM error"),
        11, ADDERROR("CH11 Indoor unit & inverter PCB communication error"),
        12, ADDERROR("CH12 Inverter PCB error"),
        13, ADDERROR("CH13 Problem in Solar-thermal sensor "),
        14, ADDERROR("CH14 Flow switch error"),
        15, ADDERROR("CH15 Water pipe overheated"),
        16, ADDERROR("CH16 Water inlet & outlet temperature sensor error"),
        17, ADDERROR("CH17 Water inlet temperature sensor error"),
        18, ADDERROR("CH18 Water outlet temperature sensor error"),
        ADDERROR("CH01 Air temperature sensor error"));
end
Compressor Reed Contact Read-only

Compressor running status — ON when the outdoor-unit compressor is actively producing heating or cooling output

Register: D:3 Bool

Compressor

Read
MODBUSR(D, 3, Bool)
Control Method Multi-value Switch

Selects which temperature sensor regulates the heat pump — Water Outlet, Water Inlet or Room Air. Also drives which sensor the Thermostat device reads.

Register: H:1 Int16 numeric
Values / States: Vystupna voda · Vstupna voda · Teplota v miestnosti

Control Method

Read switch state
MODBUSR(H, 1, Int16)
Write switch state
MODBUSW(H, 1, Int16, Mu)
Circulation Pump Reed Contact Read-only

Internal water pump running status — ON when the heat pump's circulation pump is moving water through the primary circuit

Register: D:1 Bool

Circulation Pump

Read
MODBUSR(D, 1, Bool)
Defrost Reed Contact Read-only

Active while the outdoor unit is running a defrost cycle — heating output is temporarily suspended while ice is melted from the outdoor coil

Register: D:4 Bool

Defrost

Read
MODBUSR(D, 4, Bool)
Operating Mode Multi-value Switch Read-only

Read-only outdoor-unit operation cycle — Standby/Off, Cooling or Heating. Reflects the actual current cycle, which may differ briefly from the requested Mode (for example during defrost or warm-up).

Register: A:1 Int16 numeric
Values / States: Standby (Off) · ${category_cooling} · ${category_heating}

Operating Mode

Read switch state
MODBUSR(A, 1, Int16)
Heating/Cooling Demand Switch

Main on/off switch for space heating and cooling — equivalent to pressing the on/off button on the wired remote controller

Register: C:0 Bool
Values / States: ${general_yes} · ${general_no}

Heating/Cooling Demand

Read switch state
MODBUSR(C, 0, Bool)
Write switch state
MODBUSW(C, 0, Bool, St)
Mode Multi-value Switch

Operating mode selector — Cooling, Auto or Heating. Only these three values are valid; other entries in the list are placeholder slots and must not be selected.

Register: H:0 Int16 numeric
Values / States: ${category_cooling} · ${device_mode_long_Automatic} · ${category_heating}

Mode

Read switch state
MODBUSR(H, 0, Int16)
Write switch state
MODBUSW(H, 0, Int16, Mu)
Thermostat Thermostat

Setpoint and current-temperature thermostat — the current temperature is read dynamically based on the Control Method (Room Air, Water Inlet or Water Outlet). Setpoint range depends on the selected method, typically 30–50 °C in Water Outlet heating mode and 16–32 °C in Room Air mode.

Register: H:2H:2 Int16 Unit: °C numeric

Thermostat

Read temperature
var mode := MODBUSR(H, 1, Int16);
var reg := switch(mode, 2, 7, 1, 2, 3);
var temp := MODBUSR(A, reg, Int16) / 10;
if temp <= -64.9
    adderror("Nezapojeny teplomer");
    return(NaN);
else
    return(temp);
end
Read desired temperature
var Sp := MODBUSR(H, 2, Int16) / 10;

if round(Se) != Sp
    return(Sp);
else
    return(Se);
end
Write desired temperature
MODBUSW(H, 2, Int16, round(Se) * 10)
Quiet Mode Switch

Silent-mode toggle — reduces outdoor-unit fan and compressor noise for night-time operation

Register: C:2 Bool
Values / States: ON · OFF

Quiet Mode

Read switch state
MODBUSR(C, 2, Bool)
Write switch state
MODBUSW(C, 2, Bool, St)
Outdoor Temperature Temperature Sensor Read-only

Outdoor air temperature measured by the outdoor unit's ambient sensor. Reports a 'Nezapojené' (sensor disconnected) error and NaN value when the raw reading falls at or below −64.9 °C.

Register: A:12 Int16 Unit: °C numeric

Outdoor Temperature

Read temperature
var temp := MODBUSR(A, 12, Int16) / 10;
if temp <= -64.9
    adderror("Nezapojene");
    return(NaN);
else
    return(temp);
end
Water Inlet Temperature Temperature Sensor Read-only

Return water temperature entering the heat pump from the heating circuit. Reports a 'Nezapojené' (sensor disconnected) error and NaN value when the raw reading falls at or below −64.9 °C.

Register: A:2 Int16 Unit: °C numeric

Water Inlet Temperature

Read temperature
var temp := MODBUSR(A, 2, Int16) / 10;
if temp <= -64.9
    adderror("Nezapojene");
    return(NaN);
else
    return(temp);
end
Water Outlet Temperature Temperature Sensor Read-only

Leaving water temperature exiting the heat pump to the heating circuit. Reports a 'Nezapojené' (sensor disconnected) error and NaN value when the raw reading falls at or below −64.9 °C.

Register: A:3 Int16 Unit: °C numeric

Water Outlet Temperature

Read temperature
var temp := MODBUSR(A, 3, Int16) / 10;
if temp <= -64.9
    adderror("Nezapojene");
    return(NaN);
else
    return(temp);
end
Connection: Modbus RTU • 9600 baud• 8N1 • Slave ID: $[SlaveId]
Possible improvements (38)
  • H:8 DHW Target Temperature — DHW tank setpoint, range 45–60 °C, scale ×10. Required to control DHW output from TapHome.
  • A:5 DHW Tank Water Temperature — Current tank temperature, Int16 ÷ 10, °C. Pair with H:8 for full DHW visibility.
  • C:1 DHW Enable — DHW on/off coil (0=Disable, 1=Enable). Independent of space heating C:0.
  • C:3 DHW Disinfection Trigger — Triggers thermal anti-Legionella cycle on the DHW tank.
  • D:5 DHW Heating Status — 1 = DHW production is currently active.
  • D:6 DHW Disinfection Status — 1 = anti-Legionella cycle in progress.
  • D:12 DHW Boost Heater Status — 1 = electric boost heater on the DHW tank is running.
  • A:13 Water Pressure — System water pressure, UInt16 ÷ 10, bar. Important for diagnosing low-pressure faults (E14 flow switch errors).
  • A:8 Flow Rate — Primary water flow, UInt16 ÷ 10, L/min.
  • D:0 Water Flow Status — Binary — 1 = flow detected by flow switch.
  • D:2 External Water Pump Status — Status of an external (secondary) circulation pump.
  • A:16 Liquid Gas Temperature — Refrigerant liquid-line temperature (Int16, °C, no scale). Useful for COP analysis.
  • A:18 Suction Temperature — Compressor suction-side refrigerant temperature.
  • A:19 Heat Gas (Discharge) Temperature — Compressor discharge refrigerant temperature — high-side cycle diagnostic.
  • A:20 Temperature Before Vaporiser — Int16 ÷ 10, °C. Pre-evaporator refrigerant temperature.
  • A:21 Temperature After Vaporiser — Int16 ÷ 10, °C. Post-evaporator refrigerant temperature.
  • A:22 High Pressure — Refrigerant high-side pressure, UInt16, bar. Critical for compressor protection diagnostics.
  • A:23 Low Pressure — Refrigerant low-side pressure, UInt16, bar.
  • A:24 Compressor RPM — Compressor speed, UInt16 × 60 = RPM. Indicates inverter modulation level.
  • H:5 Target Temperature (Circuit 2) — UInt16 ÷ 10, °C. Setpoint for the second heating zone (20–40 °C). Only relevant for dual-zone installations with mixer valve.
  • H:6 Room Air Temperature (Circuit 2) — UInt16 ÷ 10, °C. Room air temperature override for Circuit 2.
  • H:7 Shift Value Auto Mode (Circuit 2) — Auto-mode shift (−5…+5 K). Adjusts curve for Circuit 2.
  • H:4 Shift Value Auto Mode (Circuit 1) — Auto-mode shift (−5…+5 K) — biases the weather curve.
  • H:3 Room Air Temperature (Circuit 1) — Writable for thermostat takeover — sends an external room temperature reading back to the indoor unit.
  • A:9 Flow Temperature (Circuit 2) — Int16 ÷ 10, °C. Secondary loop water temperature.
  • A:10 Room Air Temperature (Circuit 2) — Int16 ÷ 10, °C. Secondary loop room sensor.
  • A:0 Error Code — Raw error code register. The template uses it via the module readscript (triggered when D:13 = 1) to decode CH01–CH18 errors into TapHome error messages, but does not expose it as a standalone diagnostic value/device.
  • A:4 Backup Heater Outlet Temperature — Int16 ÷ 10, °C. Temperature downstream of the electric backup heater.
  • A:6 Solar Collector Temperature — Int16 ÷ 10, °C. For installs with solar thermal integration.
  • A:7 Room Air Temperature (Circuit 1) — Indirectly used: the thermostat's ReadCurrentTemperature reads A:7 dynamically when Control Method=2, but no standalone room temperature sensor device is exposed.
  • A:11 Energy State (input) — UInt16 enum — Smart Grid / energy management state.
  • H:9 Energy State (control) — Writable Smart Grid energy state input.
  • D:7 Silent Mode Status — Confirms whether silent/quiet mode is actually active (separate from the C:2 command coil).
  • D:8 Cooling Status — 1 = cooling production active (complement to D:3 compressor).
  • D:9 Solar Pump Status — 1 = solar pump running (solar-thermal integration).
  • D:10 Backup Heater Step 1 Status — 1 = first stage of electric backup heater is on.
  • D:11 Backup Heater Step 2 Status — 1 = second stage of electric backup heater is on.
  • D:13 Error Status (binary flag) — 1 = at least one alarm active. Used by the module readscript as a gate (only decodes A:0 when D:13=1), but not exposed as a TapHome device/attribute.

Sources

  • LG Therma V — AWHP Service Manual (MFL68682007, 2020)
    PDF
  • LG Therma V Modbus Setup Guide (YourWizBlog) — DIP switches, corrected register map
  • Home Assistant LG Therma V Modbus Integration — full register YAML (basti242)
    github.com 2026-05-29
  • Home Assistant Community thread — model matrix, gateway hardware verdicts, DIP switch verification
  • Velog — Controlling LG Heat Pump via Modbus on HA (HU091MR.U44 + HN0916T.NB1 verified setup)
    velog.io 2026-05-29

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