---
title: "SVC Heat Pump"
description: "Modbus TCP integration for a generic heat pump controller labelled SVC. Temperatures, power, pressures, mode, heat/cool and DHW setpoints."
url: "https://taphome.com/en/compatibility/svc/"
language: en
lastmod: 2026-10-08
generator: hugo
ai:
  topics: ["modbus-tcp","heat-pump","ethernet","dhw","hydronic","reversible-heat-pump","whitelabel-controller"]
  questions: ["How to integrate an SVC heat pump with TapHome?","What does the SVC TapHome template measure and control?","How do I verify my heat pump matches the SVC Modbus register map?","Why do Heat and Cool thermostats show the same current temperature?","Why is the Tank thermostat setpoint different from Heat and Cool thermostats?","What do the Output Status, Run Status and Main Valve registers mean on SVC?"]
---

# SVC Heat Pump

Communication: Modbus TCP

> Network address
> 
> TapHome reaches this device at the address entered on import. Give the device a fixed address — an IP reservation in the router, or its mDNS name if it supports one — otherwise the integration stops working when the router changes the address.
> 
> [Network Preparation](https://taphome.com/en/docs/setup/network-preparation/)

## Integration guide

The `SVC` template is a **generic Modbus TCP integration** for a reversible air-to-water heat pump controller that exposes sensors, mode selection and three thermostats (space heating, space cooling and domestic hot water) over the local network. TapHome connects directly to the heat pump's Ethernet interface — no RS-485 wiring and no gateway is required.

> [!WARNING]
> **Manufacturer identity is not confirmed.** The string `SVC` comes from the `<Producer>` field in the original TapHome XML template and is almost certainly a generic / whitelabel designation rather than a consumer brand. Before importing this template, **verify that your controller uses the exact register map documented below** (holding registers `H:0–H:34`, mode at `H:30` with values `0–6`, out water temperature at `H:8`, heat/cool thermostat setpoints at `H:31`/`H:32` with ×1 scaling, tank thermostat setpoint at `H:33` with ×10 scaling). If any register does not match, this template will misread or misconfigure the device.

The register map, mode enumeration and scaling described on this page are extracted directly from the canonical TapHome XML. No vendor manual is available.

## Hardware connection

The SVC controller uses the **`ModbusTcpCCU`** CCU model, meaning TapHome speaks Modbus TCP directly to the heat pump's LAN interface.

- **Protocol:** Modbus TCP
- **Port:** 502 (standard)
- **Register type:** all holding registers (H)
- **Data type:** all registers are `Int16`, big-endian
- **Byte order:** standard Modbus (high byte first)
- **Register range:** `H:0 – H:34` (registers 9–14, 17–19, 21–23 and 27–29 are not referenced by the template and should not be assumed present on the controller)

### Network requirements

1. Connect the heat pump's Ethernet / LAN port to the same local network as the TapHome Core.
2. Assign the heat pump a **stable IP address** — either configure a static IP on the controller or add a DHCP reservation in the router based on the MAC address. The template's default `192.168.0.1` is a placeholder.
3. Ensure no firewall between TapHome Core and the heat pump blocks TCP port 502.

> [!NOTE]
> The template does not use mDNS / Zeroconf discovery — the heat pump's IP address must be entered manually during import.

## Configuration

### Enabling Modbus communication

Because the manufacturer of this controller is unknown, there is no vendor-specific procedure documented here. The general approach for this class of heat pump controller is:

1. Enter the **service / installer menu** on the heat pump's wired controller or on a built-in display (typically protected by a PIN).
2. Locate the **communication** or **network settings** section.
3. **Enable Modbus TCP** if it is not active by default.
4. Set the **IP address** (static recommended) and, if applicable, **subnet mask and gateway**.
5. Confirm or set the **Modbus slave (unit) ID** — the template default is `1`.
6. Save and reboot the controller if required.

Consult the service manual supplied with the unit for the exact menu path. If Modbus TCP is not an option in the controller's menu, this template cannot be used.

### Import parameters

When importing the template in TapHome, provide:

| Parameter | Description | Default |
|-----------|-------------|---------|
| **IP Address** | Local IP of the heat pump controller | `192.168.0.1` |
| **Slave ID** | Modbus unit identifier | `1` |

> [!TIP]
> Verify connectivity from the TapHome Core host before import by pinging the heat pump's IP, and — if possible — by probing TCP port 502 with a tool such as `nc` or a Modbus client. This catches networking issues before they show up as template-level errors.

## Register map

The template exposes the following holding registers. All registers are `Int16`. Temperature scaling `/10` means the raw integer value is divided by 10 to obtain degrees Celsius (e.g. raw `235` → `23.5 °C`).

| Addr | Name | R/W | Scaling | Unit | Notes |
|------|------|-----|---------|------|-------|
| H:0 | Out ambient temp | R | `/10` | °C | Outdoor ambient at the outdoor unit |
| H:1 | Out coil temp | R | `/10` | °C | Outdoor refrigerant coil |
| H:2 | Discharge temp | R | `/10` | °C | Compressor discharge line |
| H:3 | Suction temp | R | `/10` | °C | Compressor suction line |
| H:4 | In ambient temp (reversed) | R | `/10` | °C | Indoor-side sensor; "(reversed)" note from XML is unexplained |
| H:5 | Tank temp | R | `/10` | °C | DHW buffer tank; also used as current-temp source for Tank Thermostat |
| H:6 | In coil temp | R | `/10` | °C | Indoor refrigerant coil |
| H:7 | In water temp | R | `/10` | °C | Water inlet to the heat exchanger |
| H:8 | Out water temp | R | `/10` | °C | Water outlet from the heat exchanger; also used as current-temp source for both Heat and Cool Thermostats |
| H:15 | Output status | R | raw | — | Raw integer, semantics undocumented |
| H:16 | Run status | R | raw | — | Raw integer, semantics undocumented |
| H:20 | Main valve | R | raw | — | Raw integer, likely 4-way reversing valve state |
| H:24 | Power [Watt] | R | raw | W | Int16 — clips at ±32767 W |
| H:25 | Low pressure [kPa] | R | raw | kPa | Suction-side refrigerant pressure |
| H:26 | High pressure [kPa] | R | raw | kPa | Discharge-side refrigerant pressure |
| H:30 | Mode | R/W | enum | — | See Operating modes below |
| H:31 | Heat thermostat setpoint | R/W | `×1` | °C | Integer-degree resolution |
| H:32 | Cool thermostat setpoint | R/W | `×1` | °C | Integer-degree resolution |
| H:33 | Tank thermostat setpoint | R/W | `×10` | °C | Decimal resolution — write value `Se*10` |
| H:34 | Difference temp of restart | R/W | raw | °C | Hysteresis / restart differential |

> [!WARNING]
> **Asymmetric thermostat scaling — easy to miss.** The DHW Tank Thermostat (`H:33`) uses `×10` scaling, while the Heat Thermostat (`H:31`) and Cool Thermostat (`H:32`) use `×1` scaling. This means Tank setpoint supports decimals (e.g. 48.5 °C) but Heat / Cool setpoints are whole degrees only. This asymmetry comes from the controller firmware, not from TapHome.

> [!NOTE]
> The XML sets `IsReadOnly=False` on registers `H:15`, `H:16`, `H:20`, `H:24`, `H:25` and `H:26`, but no `WriteState` formula is provided for any of them. These registers are therefore **effectively read-only** through the template.

## Device capabilities

The template exposes **20 devices** covering sensors, a mode selector, three thermostats and a restart-differential parameter.

### Temperature sensors

Nine read-only temperature sensors cover the refrigerant circuit, the hydronic loop and ambient conditions:

- **Outdoor Ambient Temperature** (`H:0`) — outdoor air temperature at the outdoor unit.
- **Outdoor Coil Temperature** (`H:1`) — refrigerant coil on the outdoor side (evaporator in heating, condenser in cooling).
- **Indoor Coil Temperature** (`H:6`) — refrigerant coil on the indoor side (condenser in heating, evaporator in cooling).
- **Compressor Discharge Temperature** (`H:2`) — hot-side refrigerant leaving the compressor.
- **Compressor Suction Temperature** (`H:3`) — cool-side refrigerant returning to the compressor.
- **Indoor Ambient Temperature (reversed)** (`H:4`) — indoor-side ambient sensor. The `(reversed)` suffix is carried verbatim from the XML; without vendor documentation its precise meaning cannot be confirmed — it may indicate inverted sensor polarity or an indoor-facing placement on the outdoor unit.
- **DHW Tank Temperature** (`H:5`) — domestic hot water buffer tank. This register is also used as the current-temperature source for the DHW Tank Thermostat.
- **Water Inlet Temperature** (`H:7`) — water returning from the hydronic loop into the heat exchanger.
- **Water Outlet Temperature** (`H:8`) — water leaving the heat exchanger. This register is also used as the current-temperature source for **both** the Heat Thermostat and the Cool Thermostat.

> [!WARNING]
> **Shared current-temperature source.** Registers `H:5` (Tank temp) and `H:8` (Out water temp) are used twice each — once as a standalone sensor and again as the current-temperature source for a thermostat. In particular, the Heat Thermostat and Cool Thermostat both read `H:8`, so the template cannot distinguish a separate "zone current temperature" for heating versus cooling. The controller simply does not expose independent zone sensors.

### Operating mode

The **Operating Mode** selector (`H:30`, Read/Write) is exposed as a multi-value switch with the following values:

| Value | Mode | Meaning |
|-------|------|---------|
| 0 | Power Off | Heat pump off |
| 1 | Heat | Space heating only |
| 2 | Powerful Heat | Boost / forced heating |
| 3 | Tank Heat | DHW only |
| 4 | Cool | Space cooling only |
| 5 | Heat + Tank Heat | Space heating combined with DHW |
| 6 | Cool + Tank Heat | Space cooling combined with DHW |

Values `7`, `8` and `9` appear in the XML as placeholder slots with raw digit names — they are not valid modes and should not be used.

### Thermostats

Three thermostats are exposed, each as a separate TapHome device with its own setpoint and a shared current-temperature source:

- **Space Heating Thermostat** (`H:31`, Read/Write, ×1 scaling) — whole-degree setpoint for space heating. Current temperature is read from `H:8` (Out water temp).
- **Space Cooling Thermostat** (`H:32`, Read/Write, ×1 scaling) — whole-degree setpoint for space cooling. Current temperature is also read from `H:8`.
- **DHW Tank Thermostat** (`H:33`, Read/Write, ×10 scaling) — decimal-resolution setpoint for the DHW tank. Current temperature is read from `H:5` (Tank temp). No valve feedback is available (`ReadValveState` is hard-coded to `0`).

> [!NOTE]
> The heat pump's internal logic decides whether the heating or cooling setpoint is active based on the selected Operating Mode at `H:30`. Writing to a setpoint register does not itself switch the unit between heating and cooling — change the mode first, then adjust the corresponding setpoint.

### Power and refrigerant pressures

- **Electrical Power** (`H:24`) — instantaneous power consumption of the heat pump in watts (W). Because the register is `Int16`, the value clips at ±32767 W; large commercial units may exceed this range.
- **Low-Side Pressure** (`H:25`) — suction-side refrigerant pressure in kilopascals (kPa). Typical R410A / R32 low-side values fall in the ~100–700 kPa range.
- **High-Side Pressure** (`H:26`) — discharge-side refrigerant pressure in kilopascals (kPa). Typical R410A / R32 high-side values fall in the ~1500–4500 kPa range.

### Status variables (raw)

Three status registers are exposed as raw `Int16` readings because the controller vendor has not documented any bitmask or enumeration for them:

- **Output Status** (`H:15`)
- **Run Status** (`H:16`)
- **Main Valve State** (`H:20`) — likely the 4-way reversing valve state (heating vs. cooling refrigerant path), but this interpretation is not confirmed.

These values can be monitored for change detection, but they cannot be translated into user-friendly labels without vendor documentation.

### Service parameter

- **Restart Temperature Differential** (`H:34`, Read/Write, raw integer in °C) — the hysteresis value that determines how many degrees below the active setpoint must be reached before the compressor restarts. Typical controllers in this class use values between 1 and 15 °C, but the valid range for this specific device has not been verified.

## Troubleshooting

### No Modbus communication

1. Confirm the heat pump's Ethernet port is physically connected and linked (check the controller's network status LED if present).
2. Verify the IP address — inspect the controller's network settings menu or check the router's DHCP lease table.
3. Ensure TapHome Core and the heat pump are on the same subnet, or that routing between subnets allows TCP port 502.
4. Check that no firewall or VLAN rule blocks port 502.
5. Confirm Modbus TCP is actually enabled in the controller's service menu (some controllers ship with it disabled by default).

### Values look clearly wrong (garbled temperatures, impossible numbers)

If temperatures read as thousands of degrees, pressures read as tiny numbers or the mode selector shows unknown values, your heat pump most likely uses a different register map than the one this template expects. The `SVC` label covers an unidentified OEM controller — other OEM heat pumps (SPRSUN / Carel, Fairland, Gree Versati, Midea / Clivet / Kaisai, LG Therma V, Aermec, Sibotherm) all use different register layouts. Do not keep the template running against a mismatched device, as writes to mode and thermostat registers could alter unrelated settings.

### Setpoint changes appear to "halve" or "tenfold"

This is almost always a scaling mismatch. The **Tank Thermostat (`H:33`) uses ×10 scaling** while the **Heat (`H:31`) and Cool (`H:32`) thermostats use ×1 scaling**. If you see a setpoint applied 10× larger or smaller than expected, confirm you are writing to the right thermostat — the template already applies the correct scaling per-device, so the most likely cause is that the controller firmware differs from the assumed map.

### Heat and Cool thermostats show the same current temperature

This is expected. Both the Heat Thermostat and the Cool Thermostat read current temperature from register `H:8` (Water Outlet Temperature). The template cannot separate "heating zone current temp" from "cooling zone current temp" because the controller exposes only a single outlet sensor. If you need distinct zone sensors, add separate TapHome temperature sensors (wired directly to TapHome IO).

### Power reading is stuck at 32767 or –32768

The `H:24` Power register is a signed 16-bit integer, so instantaneous consumption above 32 767 W (32.77 kW) overflows. This affects large commercial units only — residential units typically stay well under this limit.

## Available devices 20

These devices appear in TapHome after import.

SVC Module

Outdoor Ambient Temperature Temperature Sensor Read-only

Outdoor ambient air temperature measured at the outdoor unit

Register: H:0 Int16 Unit: °C

Read temperature

```taphome
MODBUSR(H, 0, Int16) / 10
```

Operating Mode Multi-value Switch Read and write

Heat pump operating mode — Power Off, Heat, Powerful Heat (boost), Tank Heat (DHW only), Cool, Heat + Tank Heat (combined heating + DHW), Cool + Tank Heat (combined cooling + DHW)

Register: H:30 Int16 numeric

Values / States: Power Off · Heat · Powerful Heat · Tank Heat · Cool · Heat + Tank Heat · Cool + Tank Heat

Read switch state

```taphome
MODBUSR(H, 30, Int16)
```

Write switch state

```taphome
MODBUSWNE(H, 30, Int16, Mu)
```

Outdoor Coil Temperature Temperature Sensor Read-only

Refrigerant coil temperature on the outdoor side — evaporator in heating mode, condenser in cooling mode

Register: H:1 Int16 Unit: °C

Read temperature

```taphome
MODBUSR(H, 1, Int16) / 10
```

Compressor Discharge Temperature Temperature Sensor Read-only

Hot-side refrigerant temperature leaving the compressor

Register: H:2 Int16 Unit: °C

Read temperature

```taphome
MODBUSR(H, 2, Int16) / 10
```

Compressor Suction Temperature Temperature Sensor Read-only

Cool-side refrigerant temperature returning to the compressor

Register: H:3 Int16 Unit: °C

Read temperature

```taphome
MODBUSR(H, 3, Int16) / 10
```

Indoor Ambient Temperature Temperature Sensor Read-only

Indoor-side ambient sensor — the XML '(reversed)' label suggests either polarity-reversed wiring or indoor-facing placement on the outdoor unit (not confirmed by vendor)

Register: H:4 Int16 Unit: °C

Read temperature

```taphome
MODBUSR(H, 4, Int16) / 10
```

DHW Tank Temperature Temperature Sensor Read-only

Domestic hot water buffer tank temperature — also used as the current-temperature source for the DHW Tank Thermostat

Register: H:5 Int16 Unit: °C

Read temperature

```taphome
MODBUSR(H, 5, Int16) / 10
```

Indoor Coil Temperature Temperature Sensor Read-only

Refrigerant coil temperature on the indoor side — condenser in heating mode, evaporator in cooling mode

Register: H:6 Int16 Unit: °C

Read temperature

```taphome
MODBUSR(H, 6, Int16) / 10
```

Water Inlet Temperature Temperature Sensor Read-only

Water temperature entering the heat pump heat exchanger (return from the hydronic loop)

Register: H:7 Int16 Unit: °C

Read temperature

```taphome
MODBUSR(H, 7, Int16) / 10
```

Water Outlet Temperature Temperature Sensor Read-only

Water temperature leaving the heat pump heat exchanger — also used as the current-temperature source for both the Space Heating Thermostat and the Space Cooling Thermostat

Register: H:8 Int16 Unit: °C

Read temperature

```taphome
MODBUSR(H, 8, Int16) / 10
```

Output Status Variable Read-only

Raw output-status value — bitmask or enum semantics are not documented by the manufacturer, so the value is exposed as-is

Register: H:15 Int16 raw-int-value

Read

```taphome
MODBUSR(H, 15, Int16)
```

Run Status Variable Read-only

Raw run-status value — bitmask or enum semantics are not documented by the manufacturer, so the value is exposed as-is

Register: H:16 Int16 raw-int-value

Read

```taphome
MODBUSR(H, 16, Int16)
```

Main Valve State Variable Read-only

Raw state of the main valve — likely the 4-way reversing valve that switches between heating and cooling refrigerant paths (interpretation not confirmed)

Register: H:20 Int16 raw-int-value

Read

```taphome
MODBUSR(H, 20, Int16)
```

Electrical Power Variable Read-only

Instantaneous electrical power consumption of the heat pump in watts — clips at ±32767 W because the register is a signed 16-bit integer

Register: H:24 Int16 Unit: W

Read

```taphome
MODBUSR(H, 24, Int16)
```

Low-Side Pressure Variable Read-only

Suction-side refrigerant pressure (low-pressure side of the refrigerant circuit) in kilopascals

Register: H:25 Int16 Unit: kPa

Read

```taphome
MODBUSR(H, 25, Int16)
```

High-Side Pressure Variable Read-only

Discharge-side refrigerant pressure (high-pressure side of the refrigerant circuit) in kilopascals

Register: H:26 Int16 Unit: kPa

Read

```taphome
MODBUSR(H, 26, Int16)
```

DHW Tank Thermostat Thermostat Read and write

Setpoint for the domestic hot water buffer tank — decimal resolution (×10 scaling), current temperature read from the DHW Tank sensor

Register: H:33 Int16 Unit: °C

Read temperature

```taphome
MODBUSR(H, 5, Int16) / 10
```

Read desired temperature

```taphome
MODBUSR(H, 33, Int16) / 10
```

Write desired temperature

```taphome
MODBUSWNE(H, 33, Int16, Se * 10)
```

Read valve state

```taphome
0
```

Space Heating Thermostat Thermostat Read and write

Setpoint for space heating — whole-degree resolution (×1 scaling), current temperature read from the Water Outlet sensor and shared with the Space Cooling Thermostat

Register: H:31 Int16 Unit: °C

Read temperature

```taphome
MODBUSR(H, 8, Int16) / 10
```

Read desired temperature

```taphome
MODBUSR(H, 31, Int16)
```

Write desired temperature

```taphome
MODBUSWNE(H, 31, Int16, Se)
```

Space Cooling Thermostat Thermostat Read and write

Setpoint for space cooling — whole-degree resolution (×1 scaling), current temperature read from the Water Outlet sensor and shared with the Space Heating Thermostat

Register: H:32 Int16 Unit: °C

Read temperature

```taphome
MODBUSR(H, 8, Int16) / 10
```

Read desired temperature

```taphome
MODBUSR(H, 32, Int16)
```

Write desired temperature

```taphome
MODBUSWNE(H, 32, Int16, Se)
```

Restart Temperature Differential Variable Read and write

Hysteresis value — how many degrees below the active setpoint must be reached before the compressor restarts

Register: H:34 Int16 Unit: °C

Read

```taphome
MODBUSR(H, 34, Int16)
```

Write

```taphome
MODBUSWNE(H, 34, Int16, Va)
```

**Connection:** Modbus TCP • Slave ID: $\[SlaveId]

## Import parameters

Enter these values when you import the XML.

| Asked in the app | Default       |
|------------------|---------------|
| Slave ID         | `1`           |
| IP address       | `192.168.0.1` |

## Sources

- TapHome Official Modbus Template (SVC.xml)
  
  [github.com](https://github.com/taphome-official/modbus_templates/blob/master/SVC/SVC.xml) 2026-04-24

## Related Documentation

- [Modbus Integration](https://taphome.com/en/compatibility/modbus-guide/)
- [Modbus](https://taphome.com/en/docs/integration/modbus/)
- [Simple configuration using templates](https://taphome.com/en/docs/integration/modbus/templates/)
- [Modbus scripts and prefetch](https://taphome.com/en/docs/script/modbus-scripts/)
- [Modbus functions](https://taphome.com/en/docs/script/modbus/)
- [Modbus data types](https://taphome.com/en/docs/script/modbus-data-types/)

