Archived — this is the version for Home Assistant 2026.8 and older. Development continues at cjungde/ha-lg-thermav-modbus.
The successor requires Home Assistant 2026.9, where it takes a unit on the
modbuscomponent's shared connection instead of running a pymodbus client of its own. That matters on RS485: integrations reaching one gateway over separate sockets interleave their requests, and replies come back on transaction ids the other client is not expecting. Sharing the connection serializes them behind one lock and ends that.The two cannot be one release — the successor cannot run on 2026.8, and dropping every user on an older core to say so would be worse than a split.
Moving across is a straight swap. Both use the integration domain
lg_thermav_r290, so entity ids, history and long-term statistics survive it and the config entry is read as it stands. Uninstall this one first, then install the successor and restart — do not run both, they claim the same directory.This repository stays readable and installable. It receives no further changes.
HACS custom integration for the LG ThermaV R290 heat pump via Modbus TCP or RTU.
Replaces a hand-crafted YAML Modbus configuration with native HA entities: sensors, binary sensors, switches, buttons, number inputs, and select dropdowns — all updated on every poll cycle without requiring template sensors or automations.
- Sensors — temperatures (inlet, outlet, DHW, outdoor, refrigerant circuit), flow rate, pressures, compressor speed, error code, operation mode, control method, energy state
- Computed thermal power sensors — total / heating circuit / DHW, calculated from flow rate and ΔT each poll cycle (Q = flow/60 × ΔT × 4186 W)
- Binary sensors — compressor, pumps, DHW heating, defrost, backup heater stages, fault, silent mode, cooling, emergency modes, energy state slots 0–8
- Switches — main power, DHW, silent mode, emergency stop
- Buttons — start DHW disinfection (momentary trigger coil)
- Number inputs — flow temperature setpoints (circuit 1, circuit 2), DHW target temperature, heating curve shift values (circuit 1, circuit 2)
- Select inputs — operation mode (Heating / Cooling / Auto), control method (outlet temp / inlet temp / room air)
- Supports Modbus TCP, Modbus TCP-RTU, and Modbus RTU (serial)
- Configurable poll interval (default 30 s), reconfigurable without restart
- In HACS → Integrations → ⋮ → Custom repositories, add
https://github.com/cjungde/ha-lg-thermav-r290with category Integration. - Install "LG ThermaV R290".
- Restart Home Assistant.
- Settings → Devices & Services → Add Integration → search "LG ThermaV R290".
Copy the custom_components/lg_thermav_r290/ folder into your HA custom_components/ directory and restart.
The config flow asks for connection type first, then connection-specific parameters:
| Parameter | Default | Notes |
|---|---|---|
| Connection type | — | TCP / TCP-RTU / RTU |
| Host / IP | — | TCP only |
| Port | 502 | TCP only |
| Serial port | — | RTU only (e.g. /dev/ttyUSB0) |
| Baudrate | 9600 | RTU only |
| Parity | N | RTU only |
| Stop bits | 1 | RTU only |
| Slave ID | 1 | 1–247 |
| Poll interval | 30 s | Adjustable in Options |
| Entity | Description | Unit |
|---|---|---|
sensor.lg_thermav_r290_inlet_temperature |
Inlet water temperature | °C |
sensor.lg_thermav_r290_outlet_temperature |
Outlet water temperature | °C |
sensor.lg_thermav_r290_dhw_temperature |
DHW tank temperature | °C |
sensor.lg_thermav_r290_outdoor_temperature |
Outdoor air temperature | °C |
sensor.lg_thermav_r290_backup_heater_outlet_temperature |
Backup heater outlet temp | °C |
sensor.lg_thermav_r290_flow_temperature_circuit_2 |
Flow temperature circuit 2 | °C |
sensor.lg_thermav_r290_flow_rate |
Water flow rate | l/min |
sensor.lg_thermav_r290_water_pressure |
Water pressure | bar |
sensor.lg_thermav_r290_high_pressure_condenser |
High pressure (condenser) | bar |
sensor.lg_thermav_r290_low_pressure_evaporator |
Low pressure (evaporator) | bar |
sensor.lg_thermav_r290_compressor_speed |
Compressor speed | rpm |
sensor.lg_thermav_r290_error_code |
Error code | — |
sensor.lg_thermav_r290_thermal_power_total |
Total thermal power output | W |
sensor.lg_thermav_r290_thermal_power_heating_circuit |
Heating circuit thermal power | W |
sensor.lg_thermav_r290_thermal_power_dhw |
DHW thermal power | W |
sensor.lg_thermav_r290_operation_mode |
Operation mode (label) | — |
sensor.lg_thermav_r290_control_method |
Control method (label) | — |
sensor.lg_thermav_r290_energy_state |
Energy state (label) | — |
| Entity | Description |
|---|---|
binary_sensor.lg_thermav_r290_compressor |
Compressor running |
binary_sensor.lg_thermav_r290_water_pump |
Water pump running |
binary_sensor.lg_thermav_r290_external_water_pump |
External water pump |
binary_sensor.lg_thermav_r290_dhw_heating |
DHW heating active |
binary_sensor.lg_thermav_r290_defrost |
Defrost active |
binary_sensor.lg_thermav_r290_dhw_disinfection |
DHW disinfection |
binary_sensor.lg_thermav_r290_backup_heater_step_1 |
Backup heater step 1 |
binary_sensor.lg_thermav_r290_backup_heater_step_2 |
Backup heater step 2 |
binary_sensor.lg_thermav_r290_dhw_boost_heater |
DHW boost heater |
binary_sensor.lg_thermav_r290_fault |
Fault active |
binary_sensor.lg_thermav_r290_silent_mode |
Silent mode |
binary_sensor.lg_thermav_r290_cooling_active |
Cooling active |
binary_sensor.lg_thermav_r290_water_flow |
Water flow present (see note below) |
binary_sensor.lg_thermav_r290_energy_state_normal_operation |
Energy state: normal (value 2) |
| … | Energy states 0–8 as individual binary sensors |
Note on discrete input 10001 (water flow). The LG manual documents this bit as
0 = flow rate OK / 1 = flow rate too low. On the R290 monoblock it behaves the other way round: the bit is set while water is flowing. Measured on 2026-08-18 —di[0] = 0at 5.0 LPM with the pump off,di[0] = 1at 15.3 and 29.5 LPM with the pump running, withdi[0]anddi[1](pump) identical in every sample of the same poll. A read offset is ruled out, sincedi[3](compressor) anddi[5](DHW heating) stay correctly aligned.The entity is therefore exposed as
binary_sensor.lg_thermav_r290_water_flowwith device classrunning. Up to and including v0.x it was named..._water_flow_insufficientwith device classproblem, which raised a false problem alert on every pump run. After updating, the old entity remains in the registry asunavailableand can be removed manually.
| Entity | Modbus coil |
|---|---|
switch.lg_thermav_r290_heat_pump |
Coil 0 |
switch.lg_thermav_r290_dhw |
Coil 1 |
switch.lg_thermav_r290_silent_mode |
Coil 2 |
switch.lg_thermav_r290_emergency_stop |
Coil 4 |
Coil 3 is a momentary trigger, not a state switch. The manual specifies it as
0: hold status / 1: start operation — the unit clears the coil by itself after
the write, so reading it back is never a confirmation. Use the binary sensor to
see whether the operation actually started.
| Entity | Modbus coil | Status entity |
|---|---|---|
button.lg_thermav_r290_start_disinfection |
Coil 3 (trigger) | binary_sensor.lg_thermav_r290_dhw_disinfection (discrete 6) |
Breaking change in 0.0.11: this replaces
switch.lg_thermav_r290_disinfection_mode, which modelled a trigger coil as a switch and therefore always read backoff, even when the write succeeded. After updating, the old switch remains in the registry asunavailableand can be removed manually. Note that the trigger only has an effect if disinfection is enabled on the unit itself (installer menu → DHW → disinfection active; factory default is off).
| Entity | Range | Holding register |
|---|---|---|
number.lg_thermav_r290_target_temperature_circuit_1_radiators |
30–50 °C | 2 (×0.1) |
number.lg_thermav_r290_target_temperature_circuit_2_underfloor |
20–40 °C | 5 (×0.1) |
number.lg_thermav_r290_dhw_target_temperature |
35–60 °C | 8 (×0.1) |
number.lg_thermav_r290_setpoint_shift_circuit_1 |
−5…+5 K | 4 (signed) |
number.lg_thermav_r290_setpoint_shift_circuit_2 |
−5…+5 K | 7 (signed) |
| Entity | Options | Holding register |
|---|---|---|
select.lg_thermav_r290_operation_mode |
Heating / Cooling / Auto | 0 |
select.lg_thermav_r290_control_method |
Outlet / Inlet Water Temp Control / Room Air Control | 1 |
| FC | Address range | Content |
|---|---|---|
| FC04 (input) | 0–24 | Temperatures, flow, pressures, compressor speed, error code |
| FC04 (input) | 9997–9998 | Product info, device group |
| FC03 (holding) | 0–9 | Operation mode, control method, setpoints, shift values, energy state |
| FC01 (coils) | 0–4 | Main switch, DHW, silent mode, disinfection trigger, emergency stop |
| FC02 (discrete) | 0–16 | Status bits (compressor, pumps, defrost, faults, …) |
- Thermal power formula:
Q [W] = (flow_rate [l/min] / 60) × (outlet_temp − inlet_temp) [K] × 4186 [J/(l·K)] - Heating circuit / DHW split is based on the
di_dhw_heatingdiscrete input; when DHW is active the full flow is attributed to DHW and the heating circuit sensor reports 0, and vice versa. - Shift values (holding regs 4, 7) are stored as two's-complement uint16; values ≥ 32768 are interpreted as negative.
- Tested on LG ThermaV R290 9 kW via Modbus TCP, slave ID 33.
MIT