---
title: "LinkedGo ST802-B Fan Coil Thermostat (Powered by Shelly)"
description: "LinkedGo ST802-B fan coil thermostat over the local Shelly HTTP API: temperature, humidity, fan speed and mode in TapHome. Password must be off."
url: "https://taphome.com/en/compatibility/linkedgo-st802-b-shelly-http/"
language: en
lastmod: 2026-11-10
generator: hugo
ai:
  topics: ["http","thermostat","fan-coil","floor-heating","wifi","humidity","shelly-rpc"]
  questions: ["How to integrate the LinkedGo ST802-B thermostat with TapHome?","What does the LinkedGo ST802-B TapHome template control?","How to connect the LinkedGo ST802-B to TapHome over Wi-Fi and HTTP?","How to add the LinkedGo ST802-B to the Shelly Smart Control app?","Why do all LinkedGo ST802-B devices in TapHome show HTTP 401?","Does the LinkedGo ST802-B template work with password protection enabled?","Which working modes does the LinkedGo ST802-B offer for each H02 setting?","How to wire the LinkedGo ST802-B to a 2-pipe or 4-pipe fan coil?","Why does TapHome show a warning that the thermostat uses degrees Fahrenheit?","What target humidity range does the LinkedGo ST802-B accept?"]
---

# LinkedGo ST802-B Fan Coil Thermostat (Powered by Shelly)

Communication: Packet Parser → HTTP

> 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 LinkedGo ST802-B is a flush-mounted wall thermostat for fan coil units and floor heating, "Powered by Shelly". It switches the fan coil's three fan speeds, the fan coil valve and the floor heating valve itself, and has a built-in room temperature and humidity sensor. TapHome talks to it over the local Shelly RPC API (HTTP on port 80, Wi-Fi) — no cloud connection is needed.

The template reads the room temperature and humidity and sets the target temperature, fan speed, working mode, on/off, anti-freeze and target humidity. This is a community template by Libor Kratochvíl.

## Hardware connection

The thermostat is mounted in a 60 mm flush wall box, indoors only (IP20). It is powered from 230 V AC mains; the Shelly knowledge base lists an input range of 90–240 V AC, 50/60 Hz. Maximum load is 1 A inductive or 2 A resistive. Installation and every change of the wiring belong to a qualified electrician, with the terminals disconnected from the mains.

### Terminals

| Terminal | Function |
|---|---|
| N, L | power supply, neutral and live |
| H, M, Lo | fan high, medium and low speed — 230 V output, 1 A each |
| NO, NC | fan coil valve — relay with normally open and normally closed contact, 230 V |
| FL | floor heating valve — 230 V output |
| C1, C2 | dry contact (digital output) to switch a heat pump or gas boiler on and off |
| 0-10V, GND | analog output for the speed of a DC fan motor, and common |
| A1/B1, A2/B2 | RS485 — not used by this template |

![ST802-B terminal layout: N, L, H, M, Lo, NO, NC, FL mains terminals with fan and valve connections, plus low-voltage terminals A1/B1, A2/B2, C1/C2, GND, 0-10V.](https://taphome.com/images/compatibility/linkedgo-st802-b-shelly-http/wiring-st802-b_hu_f7bfd10e13cfca3.jpg)

### Wiring per thermostat function (parameter H02)

How the fan and valves are wired depends on the system type, which is set on the thermostat by the installer parameter **H02**. The LinkedGo technical instruction shows one diagram per H02 value:

| H02 | System | Modes offered |
|---|---|---|
| 0 | 2-pipe AC fan coil — fan on H/M/Lo, fan coil valve on NO/NC | cooling, heating, dry, ventilation |
| 1 | DC fan coil — fan speed from the 0-10V output, fan coil valve on NO/NC | cooling, heating, dry, ventilation |
| 2 | floor heating only — floor heating valve on FL | floor heating |
| 3 | AC fan coil cooling + floor heating | fan coil cooling, floor heating |
| 4 | AC fan coil cooling and heating + floor heating | cooling, heating, floor heating, dry, ventilation |
| 6 | DC fan coil cooling + floor heating | fan coil cooling, floor heating, dry, ventilation |
| 7 | DC fan coil cooling and heating + floor heating | cooling, heating, floor heating, dry, ventilation |
| 17 | 4-pipe AC fan coil — cooling valve on NO/NC, heating valve on FL | cooling, heating, dry, ventilation |

![LinkedGo ST802 electrical diagrams for H02 settings 0, 1, 2, 3/4, 6/7 and 17 (fan coil and floor heating valve wiring) and RS485 network, with the H02 function table.](https://taphome.com/images/compatibility/linkedgo-st802-b-shelly-http/wiring-h02-variants_hu_6b5233d5f48d321b.jpg)

## Configuration

### Connecting the thermostat to Wi-Fi

The thermostat is added to the network with the free **Shelly Smart Control** app (App Store, Google Play or AppGallery; a free Shelly account is required). Use a **2.4 GHz** Wi-Fi network and turn Bluetooth on in the phone before you start.

1. Open the Shelly Smart Control app and tap **+** in the bottom right corner.
2. Select **Add via Bluetooth** and tap **Next**; a list of supported devices appears.
3. Select the thermostat and tap **Next**.
4. Enter the Wi-Fi name and password and tap **Add device**. Adding can take a few minutes; a success message appears at the end.
5. Give the device a name and picture, pick a room and tap **Save**.

If the app does not find the thermostat, hold the **ON/OFF** button on the thermostat for 10 seconds and scan again. Once the thermostat is connected, the Wi-Fi signal icon appears on its display.

### Fixed IP address

TapHome reaches the thermostat by its IP address. Give it a fixed address — the simplest way is a DHCP reservation for the thermostat's MAC address in the router — so the address does not change after a router or thermostat restart. You need this address when importing the template.

### Password protection off

> [!WARNING]
> **Leave password protection of the thermostat turned off** in the Shelly app. TapHome does not support the HTTP Digest authentication of Shelly Gen2+ devices; with a password set, the thermostat answers HTTP 401 and every TapHome device shows the error "Thermostat asks for a password (HTTP 401)".

To check it, open `http://<thermostat IP>/rpc/Shelly.GetDeviceInfo` in a browser on the same network. If it returns JSON without asking for a login, TapHome can read the thermostat.

### Temperature unit in °C

Keep the thermostat's temperature unit set to **degrees Celsius**. TapHome reads all temperatures as °C; when the thermostat is set to Fahrenheit, the module shows the warning "Thermostat uses degrees Fahrenheit". The current setting is visible at `http://<thermostat IP>/rpc/Service.GetConfig?id=0` (`"temp_unit": "C"`).

### Installer parameters on the thermostat

Set the installer parameters on the thermostat's keypad before connecting it to TapHome, because they decide which modes and set points the thermostat accepts:

- **H02** — system type and the working modes the thermostat offers (table above).
- **H05** — 0 heating and cooling, 1 cooling only, 2 heating only.
- **H23 / H24** — minimum and maximum set point (default 5 °C and 35 °C).
- **A05 / A06** — antifreeze protection on/off and its room temperature point (0–21 °C, default 5 °C).

To enter the installer parameters, hold the **Mode** button for 5 seconds; the display shows the parameter groups (H, P, F …). Select the group and parameter with the up and down buttons, change the value and save it. The full parameter list is in the LinkedGo technical instruction.

### Adding the thermostat in TapHome

In TapHome, add the module from this template under a Packet Parser interface and enter the thermostat's IP address.

## Device capabilities

| Device | What it does |
|---|---|
| Thermostat | room temperature, target temperature (5–35 °C, step 0.5 °C) and room humidity |
| Fan speed | Auto, Low, Medium, High |
| Working mode | Cool, Heat, Dry, Ventilation, Floor heating |
| Thermostat on/off | switches the thermostat's control function on or off |
| Anti-freeze | frost protection on or off |
| Target humidity | humidity set point for the Dry mode (40–75 %) |

Which working modes the thermostat accepts depends on H02. A unit configured for a 2-pipe AC fan coil (H02 = 0) offers Cool, Dry, Heat and Ventilation. If you pick a mode the thermostat does not offer (for example Floor heating without a floor heating valve), the thermostat refuses it and TapHome shows the mode that stays active. A mode the template does not know is shown as an error on the Working mode device.

### Module information and service actions

The module shows the Wi-Fi network, IP address, signal strength, MAC address, the service state, the thermostat mode (cool, heat or auto), the temperature unit and the temperature and humidity calibration offsets. It warns when a firmware update is available, when a restart is required, when the thermostat reports a service error and when it is set to degrees Fahrenheit. Service actions: firmware update and reboot.

> [!NOTE]
> Which relay output is switched at the moment (fan speed, fan coil valve, floor heating valve) is not available in the Shelly API, so TapHome cannot show it.

### Behaviour worth knowing

- After a TapHome Core restart every device reads its value from the thermostat, so a change made on the thermostat's keypad while Core was off is kept, never overwritten.
- A value outside the thermostat's range (for example target humidity 80 %, or a set point outside H23–H24) is refused by the thermostat; TapHome then shows the value that stays set.
- Values are polled every 5–15 seconds; a change on the keypad appears in TapHome within that time.

## Troubleshooting

### All devices show "HTTP 401"

Password protection is turned on in the thermostat. Turn it off in the Shelly app, then check `http://<thermostat IP>/rpc/Shelly.GetDeviceInfo` in a browser — it must answer without a login prompt.

### Devices show "Thermostat answered HTTP …" or no values

1. Check that the thermostat shows the Wi-Fi icon and that its IP address has not changed (fixed address or DHCP reservation).
2. Open `http://<thermostat IP>/rpc/Shelly.GetDeviceInfo` from a device in the same network as TapHome Core — if it returns JSON, the thermostat is reachable.
3. Make sure TapHome Core and the thermostat are in the same network or that routing between them is allowed.

### Temperatures look wrong

- Check the temperature unit — the module warns when the thermostat is set to Fahrenheit.
- Check the temperature and humidity calibration offsets shown on the module.

### Working mode or fan speed shows an error

The thermostat reported a value the template does not know. The Shelly API lists the fan speeds auto, low, medium and high; the LinkedGo technical instruction lists five speeds for a DC fan coil. Check the H02 setting and the value on the thermostat's display.

### Display shows E03

E03 is the LinkedGo alarm code for a room sensor failure. Errors that the thermostat reports through the Shelly API appear on the module as the warning "Thermostat reports: …".

## Available devices 6

These devices appear in TapHome after import.

LinkedGo ST802-B Module

Service Attributes

|                                |
|--------------------------------|
| Wi-Fi                          |
| ${ipAddress}                   |
| ${xml\_signal\_strength} \[dB] |
| MAC                            |
| Service state                  |
| Thermostat mode                |
| Temperature unit               |
| Temperature offset             |
| Humidity offset \[%]           |

Service Actions

|                    |
|--------------------|
| ${xml\_update\_fw} |
| Reboot             |

Custom Variables

|                          |
|--------------------------|
| `SysStatus` (string)     |
| `WiFiStatus` (string)    |
| `ServiceConfig` (string) |
| `ServiceStatus` (string) |

Read (module)

```taphome
VAR r := SENDHTTPREQUEST("/rpc/Sys.GetStatus");
IF r.IsSuccess
    SysStatus := r.Content;
ELSE
    IF r.StatusCode = 401
        ADDERROR(401, "Thermostat asks for a password (HTTP 401). Turn off password protection in the Shelly app, TapHome does not support HTTP Digest.");
    ELSE
        ADDERROR(1, "Thermostat answered HTTP " + TOSTRING(r.StatusCode));
    END
    RETURN(0);
END
r := SENDHTTPREQUEST("/rpc/WiFi.GetStatus");
IF r.IsSuccess
    WiFiStatus := r.Content;
END
r := SENDHTTPREQUEST("/rpc/Service.GetConfig?id=0");
IF r.IsSuccess
    ServiceConfig := r.Content;
END
r := SENDHTTPREQUEST("/rpc/Service.GetStatus?id=0");
IF r.IsSuccess
    ServiceStatus := r.Content;
END
IF PARSEJSON(ServiceConfig, "$.temp_unit", true) = "F"
    ADDWARNING(4, "Thermostat uses degrees Fahrenheit. Set the temperature unit to Celsius in the Shelly app, TapHome reads the values as degrees Celsius.");
END
VAR errors := PARSEJSON(ServiceStatus, "$.errors", true);
IF ! ISNULL(errors)
    ADDWARNING(5, "Thermostat reports: " + TOSTRING(errors));
END
IF ! ISNULL(PARSEJSON(SysStatus, "available_updates.stable", true))
    ADDWARNING(2, "New firmware update is available");
END
IF PARSEJSON(SysStatus, "restart_required", true)
    ADDWARNING(3, "Restart required");
END
```

Service Attributes

Wi-Fi

```taphome
PARSEJSON(WiFiStatus, "ssid", true)
```

${ipAddress}

```taphome
PARSEJSON(WiFiStatus, "sta_ip", true)
```

${xml\_signal\_strength} \[dB]

```taphome
PARSEJSON(WiFiStatus, "rssi", true)
```

MAC

```taphome
PARSEJSON(SysStatus, "mac", true)
```

Service state

```taphome
PARSEJSON(ServiceStatus, "state", true)
```

Thermostat mode

```taphome
PARSEJSON(ServiceConfig, "thermostat_mode", true)
```

Temperature unit

```taphome
PARSEJSON(ServiceConfig, "temp_unit", true)
```

Temperature offset

```taphome
PARSEJSON(ServiceConfig, "temp_offset", true)
```

Humidity offset \[%]

```taphome
PARSEJSON(ServiceConfig, "humidity_offset", true)
```

Service Actions

${xml\_update\_fw}

```taphome
VAR r := SENDHTTPREQUEST("/rpc/Shelly.Update?stage=\"stable\"");
IF r.IsSuccess
    RETURN("OK");
ELSE
    RETURN("Error " + TOSTRING(r.StatusCode));
END
```

Reboot

```taphome
VAR r := SENDHTTPREQUEST("/rpc/Shelly.Reboot");
IF r.IsSuccess
    RETURN("OK");
ELSE
    RETURN("Error " + TOSTRING(r.StatusCode));
END
```

Thermostat Thermostat

Read temperature

```taphome
VAR r := SENDHTTPREQUEST("/rpc/Number.GetStatus?owner=\"service:0\"&role=\"current_temperature\"");
IF r.IsSuccess
    RETURN(PARSEJSON(r.Content, "$.value"));
END
IF r.StatusCode = 401
    ADDERROR(401, "Thermostat asks for a password (HTTP 401). Turn off password protection in the Shelly app, TapHome does not support HTTP Digest.");
ELSE
    ADDERROR(1, "Thermostat answered HTTP " + TOSTRING(r.StatusCode));
END
RETURN(NaN);
```

Read humidity

```taphome
VAR r := SENDHTTPREQUEST("/rpc/Number.GetStatus?owner=\"service:0\"&role=\"current_humidity\"");
IF r.IsSuccess
    RETURN(PARSEJSON(r.Content, "$.value"));
END
IF r.StatusCode = 401
    ADDERROR(401, "Thermostat asks for a password (HTTP 401). Turn off password protection in the Shelly app, TapHome does not support HTTP Digest.");
ELSE
    ADDERROR(1, "Thermostat answered HTTP " + TOSTRING(r.StatusCode));
END
RETURN(NaN);
```

Read desired temperature

```taphome
VAR r := SENDHTTPREQUEST("/rpc/Number.GetStatus?owner=\"service:0\"&role=\"target_temperature\"");
IF r.IsSuccess
    RETURN(PARSEJSON(r.Content, "$.value"));
END
IF r.StatusCode = 401
    ADDERROR(401, "Thermostat asks for a password (HTTP 401). Turn off password protection in the Shelly app, TapHome does not support HTTP Digest.");
ELSE
    ADDERROR(1, "Thermostat answered HTTP " + TOSTRING(r.StatusCode));
END
RETURN(NaN);
```

Write desired temperature

```taphome
SENDHTTPREQUEST("/rpc/Number.Set?owner=\"service:0\"&role=\"target_temperature\"&value=" + TOSTRING(Se, "F1"));
```

Fan speed Multi-value Switch

Values / States: Auto · Low · Medium · High

Read switch state

```taphome
VAR r := SENDHTTPREQUEST("/rpc/Enum.GetStatus?owner=\"service:0\"&role=\"fan_speed\"");
IF r.IsSuccess = false
    IF r.StatusCode = 401
        ADDERROR(401, "Thermostat asks for a password (HTTP 401). Turn off password protection in the Shelly app, TapHome does not support HTTP Digest.");
    ELSE
        ADDERROR(1, "Thermostat answered HTTP " + TOSTRING(r.StatusCode));
    END
    RETURN(NaN);
END
VAR v := PARSEJSON(r.Content, "$.value", true);
IF v = "auto"
    RETURN(0);
ELSEIF v = "low"
    RETURN(1);
ELSEIF v = "medium"
    RETURN(2);
ELSEIF v = "high"
    RETURN(3);
END
ADDERROR(2, "Unknown fan speed: " + TOSTRING(v));
RETURN(NaN);
```

Write switch state

```taphome
VAR val := "high";
IF Mu = 0
    val := "auto";
ELSEIF Mu = 1
    val := "low";
ELSEIF Mu = 2
    val := "medium";
END
SENDHTTPREQUEST("/rpc/Enum.Set?owner=\"service:0\"&role=\"fan_speed\"&value=\"" + val + "\"");
```

Working mode Multi-value Switch

Values / States: Cool · Heat · Dry · Ventilation · Floor Heating

Read switch state

```taphome
VAR r := SENDHTTPREQUEST("/rpc/Enum.GetStatus?owner=\"service:0\"&role=\"working_mode\"");
IF r.IsSuccess = false
    IF r.StatusCode = 401
        ADDERROR(401, "Thermostat asks for a password (HTTP 401). Turn off password protection in the Shelly app, TapHome does not support HTTP Digest.");
    ELSE
        ADDERROR(1, "Thermostat answered HTTP " + TOSTRING(r.StatusCode));
    END
    RETURN(NaN);
END
VAR v := PARSEJSON(r.Content, "$.value", true);
IF v = "cool"
    RETURN(0);
ELSEIF v = "heat"
    RETURN(1);
ELSEIF v = "dry"
    RETURN(2);
ELSEIF v = "ventilation"
    RETURN(3);
ELSEIF v = "floor_heating"
    RETURN(4);
END
ADDERROR(2, "Unknown working mode: " + TOSTRING(v));
RETURN(NaN);
```

Write switch state

```taphome
VAR val := "floor_heating";
IF Mu = 0
    val := "cool";
ELSEIF Mu = 1
    val := "heat";
ELSEIF Mu = 2
    val := "dry";
ELSEIF Mu = 3
    val := "ventilation";
END
SENDHTTPREQUEST("/rpc/Enum.Set?owner=\"service:0\"&role=\"working_mode\"&value=\"" + val + "\"");
```

Thermostat on/off Switch

Values / States: ON · OFF

Read switch state

```taphome
VAR r := SENDHTTPREQUEST("/rpc/Boolean.GetStatus?owner=\"service:0\"&role=\"enable\"");
IF r.IsSuccess
    RETURN(PARSEJSON(r.Content, "$.value"));
END
IF r.StatusCode = 401
    ADDERROR(401, "Thermostat asks for a password (HTTP 401). Turn off password protection in the Shelly app, TapHome does not support HTTP Digest.");
ELSE
    ADDERROR(1, "Thermostat answered HTTP " + TOSTRING(r.StatusCode));
END
RETURN(NaN);
```

Write switch state

```taphome
SENDHTTPREQUEST("/rpc/Boolean.Set?owner=\"service:0\"&role=\"enable\"&value=" + IF(St, "true", "false"));
```

Anti-freeze Switch

Values / States: ON · OFF

Read switch state

```taphome
VAR r := SENDHTTPREQUEST("/rpc/Boolean.GetStatus?owner=\"service:0\"&role=\"anti_freeze\"");
IF r.IsSuccess
    RETURN(PARSEJSON(r.Content, "$.value"));
END
IF r.StatusCode = 401
    ADDERROR(401, "Thermostat asks for a password (HTTP 401). Turn off password protection in the Shelly app, TapHome does not support HTTP Digest.");
ELSE
    ADDERROR(1, "Thermostat answered HTTP " + TOSTRING(r.StatusCode));
END
RETURN(NaN);
```

Write switch state

```taphome
SENDHTTPREQUEST("/rpc/Boolean.Set?owner=\"service:0\"&role=\"anti_freeze\"&value=" + IF(St, "true", "false"));
```

Target humidity Variable

Read

```taphome
VAR r := SENDHTTPREQUEST("/rpc/Number.GetStatus?owner=\"service:0\"&role=\"target_humidity\"");
IF r.IsSuccess
    RETURN(PARSEJSON(r.Content, "$.value"));
END
IF r.StatusCode = 401
    ADDERROR(401, "Thermostat asks for a password (HTTP 401). Turn off password protection in the Shelly app, TapHome does not support HTTP Digest.");
ELSE
    ADDERROR(1, "Thermostat answered HTTP " + TOSTRING(r.StatusCode));
END
RETURN(NaN);
```

Write

```taphome
SENDHTTPREQUEST("/rpc/Number.Set?owner=\"service:0\"&role=\"target_humidity\"&value=" + TOSTRING(Va, "F0"));
```

**Connection:** Packet Parser → HTTP

## Import parameters

Enter these values when you import the XML.

| Asked in the app | Default         |
|------------------|-----------------|
| IP address       | `192.168.1.100` |

## Related Documentation

- [Packet Parser Integration](https://taphome.com/en/compatibility/packet-parser-guide/)
- [Packet Parser (HTTP, TCP, UDP, FTP, MQTT)](https://taphome.com/en/docs/integration/packet-parser/)
- [Packet parser functions](https://taphome.com/en/docs/script/packet-parser/)
- [Parsing functions](https://taphome.com/en/docs/script/parsing-functions/)

