---
title: "EMS-ESP Wärmepumpe (Bosch, Buderus, IVT)"
description: "Betriebsmodus inkl. Kühlen, Raum- und Warmwassersollwert, Temperaturen und Energie von Bosch-, Buderus- und IVT-Wärmepumpen über die EMS-ESP-REST-API."
url: "https://taphome.com/de/compatibility/ems-esp-heat-pump-http/"
language: de
lastmod: 2026-10-18
generator: hugo
ai:
  topics: ["http","heat-pump","ems-bus","rest-api","gateway","wifi","ethernet","cooling","dhw"]
  questions: ["Ist meine Buderus-Wärmepumpe mit TapHome kompatibel?","Wie wird eine Wärmepumpe von Bosch, Buderus oder IVT über EMS-ESP in TapHome eingebunden?","Was liest und steuert die TapHome-Vorlage für EMS-ESP-Wärmepumpen?","Wie wird das BBQKees-EMS-ESP-Gateway an die Wärmepumpe und an TapHome angeschlossen?","Kann TapHome eine Buderus-Wärmepumpe über EMS-ESP auf Kühlen schalten?","Warum meldet ein EMS-ESP-Gerät in TapHome „no value from the gateway“ oder Fehler 401?"]
---

# EMS-ESP Wärmepumpe (Bosch, Buderus, IVT)

Kommunikation: Packet Parser → HTTP

- [Offizielle Website von BBQKees Electronics](https://bbqkees-electronics.nl)
- [Produktseite BBQKees Gateway E32 V2 KIT](https://bbqkees-electronics.nl/product/gateway-e32-v2-ethernet-wifi-edition-v2-kit/)

## Integrationsanleitung

Die Vorlage EMS-ESP Heat Pump verbindet TapHome mit einer Wärmepumpe von Bosch, Buderus oder IVT über ein EMS-ESP-Gateway — ein BBQKees Electronics Gateway E32 V2, auf dem die quelloffene Firmware EMS-ESP läuft und das am EMS-Bus der Wärmepumpe angeschlossen wird. TapHome kommuniziert mit dem Gateway über dessen lokale HTTP-REST-API (Port 80, JSON); eine Cloud-Verbindung ist nicht nötig. In EMS-ESP erscheint die Wärmepumpe als Gerätetyp `boiler` und ihr Regler als Gerätetyp `thermostat`.

Die Vorlage liest Außen-, Vorlauf-, Rücklauf-, Raum- und Warmwassertemperatur, den Kompressorstatus, die Kompressorleistung und die Energiezähler. Mit einem Zugangstoken stellt sie außerdem den Betriebsmodus des Heizkreises 1 (einschließlich Kühlen), die Raum- und Kühlsollwerte und den Warmwassersollwert ein.

> [!WARNING]
> **Community-Vorlage.** Die Vorlage wurde im TapHome-Portal erstellt und für **EMS-ESP 3.8.6** geschrieben. Sie erhalten sie im TapHome-Portal: [EMS-ESP Heat Pump — Community-Vorlage](https://portal.taphome.com/portal/community/ems-esp-heat-pump-http) (XML herunterladen — ohne Anmeldung — und als neues Modul importieren).

**[EMS-ESP Heat Pump (Bosch/Buderus/IVT)](https://portal.taphome.com/de/portal/community/ems-esp-heat-pump-http)** — EMS-ESP, HTTP. EMS-ESP 3.8.6 template for Bosch, Buderus and IVT heat pumps: mode incl.

## Kompatible Wärmepumpen und Regler

Zwei Dinge entscheiden, ob eine Wärmepumpe mit dieser Vorlage funktioniert: EMS-ESP muss die Wärmepumpe unterstützen, und Wärmepumpe und Regler müssen die Werte senden, die die Vorlage liest.

Von der Vorlage abgedeckte Wärmepumpen:

- Bosch Compress 6000AW, Hybrid 3000-7000iAW
- Buderus WLW166i, WLW176i, WLW196i, WSW196i
- CS5800i, CS6800i
- Enviline, SupraEco, Geo 5xx
- IVT AirX und Geo mit einem Regler Rego 2000 oder Rego 3000 — von EMS-ESP-Nutzern gemeldet, nicht auf der offiziellen EMS-ESP-Liste unterstützter Wärmepumpen

Das Gateway funktioniert mit den Busvarianten EMS, EMS Plus (EMS+), EMS2 und Heatronic 3.

Welche Werte ein bestimmtes Gerät sendet, ist nicht pro Modell dokumentiert. Die Seite Devices in der Weboberfläche von EMS-ESP zeigt nur Entitäten mit einem Wert; eine Entität, die in EMS-ESP existiert, aber keinen Wert hat, wird von der Firmware unterstützt, nicht vom angeschlossenen Gerät. Dieselbe Liste gibt es unter `http://<gateway-ip>/api/boiler/entities` und `http://<gateway-ip>/api/thermostat/entities`.

**Kühlen** braucht einen Regler, der `hc1.hpoperatingmode` sendet. EMS-ESP registriert diese Entität für die RC300-Familie (RC310, HMC310, Rego 2000 / 3000) und die BC400-Familie; ob ein bestimmter Regler sie tatsächlich sendet, ist nicht dokumentiert. Der **UI800** meldet sie auf der obersten Ebene des Thermostats (`/api/thermostat/hpoperatingmode`) statt unter Heizkreis 1, daher funktioniert das Gerät für den Betriebsmodus — und damit das Kühlen — mit dem UI800 nicht.

## Hardware-Anschluss

Das BBQKees Gateway E32 V2 KIT enthält das Gateway, ein 150 cm langes EMS-Servicekabel, ein 100 cm langes Kabel für die EMS-Schraubklemmen, einen Adapterstecker für den EMS-Serviceanschluss, ein Netzteil (12 V DC mit Hohlstecker oder 5 V USB-C, je nach Produktionscharge) und ein JST-ZH-Kabel für eigene Temperatursensoren DS18B20. Das Gateway wird auf eine von drei Arten an die Wärmepumpe angeschlossen:

| Anschluss an der Wärmepumpe | Kabel | Stromversorgung |
|---|---|---|
| EMS-Servicebuchse (3,5 mm) | 150 cm EMS-Servicekabel | aus der Servicebuchse |
| EMS-Servicebuchse (3,5 mm) | 150 cm EMS-Servicekabel | externes Netzteil |
| Schraubklemmen des EMS-Busses | 100 cm Kabel für EMS-Schraubklemmen | externes Netzteil (12 V DC oder 5 V USB-C) |

Die Servicebuchse kommt nur in Frage, wenn die Wärmepumpe eine hat. Gateways, die ab Sommer 2025 verkauft werden, akzeptieren beide Netzteiltypen. Das [BBQKees EMS Gateway Wiki](https://bbqkees-electronics.nl/wiki/) zeigt, wie das Gateway an einen bestimmten Kessel oder eine bestimmte Wärmepumpe angeschlossen wird.

- **Netzwerk:** Ethernet (RJ45) oder WLAN. EMS-ESP verbindet sich nur mit 2,4-GHz-WLAN-Netzen mit WPA2, nicht mit 5 GHz.
- **Firmware:** EMS-ESP. Das Gateway E32 V2 (verkauft ab Januar 2024) hat PSRAM und verwendet die Firmware-Variante `ESP32-16MB+`. Die Firmware wird in der Weboberfläche von EMS-ESP unter Settings → Version aktualisiert.

## Konfiguration

### Ersteinrichtung von EMS-ESP

1. Beim ersten Start öffnet EMS-ESP einen WLAN-Zugangspunkt `ems-esp` (WPA-Passwort `ems-esp-neo`). Ein Gateway am Ethernet ist unter der IP-Adresse erreichbar, die ihm der Router zugewiesen hat.
2. Melden Sie sich mit dem Standardbenutzer `admin` / `admin` an und ändern Sie das Passwort.
3. Verbinden Sie das Gateway unter Settings → Network mit dem Heimnetz (WLAN oder Ethernet).
4. Reservieren Sie im Router eine feste IP-Adresse für das Gateway (DHCP-Reservierung) — die Vorlage spricht das Gateway über seine IP-Adresse an.

### Wichtige Einstellungen in EMS-ESP

- **Temperaturen in °C** — lassen Sie „Convert temperature values to Fahrenheit“ unter Settings → Application ausgeschaltet. Das Modul prüft dies alle 60 s und zeigt einen Fehler, wenn EMS-ESP °F meldet.
- **Boolean Format, Enum Format und Language** spielen keine Rolle. Die Vorlage liest die Schlüssel `index` und `bool` aus dem Entitätsdetail von EMS-ESP, die von diesen Einstellungen nicht abhängen, und schreibt die englischen Optionstexte, die EMS-ESP in jeder Sprache akzeptiert.
- **Firmware 3.8** — das Modul zeigt eine Warnung, wenn das Gateway eine Version außerhalb der Reihe 3.8 meldet. Die von der Vorlage verwendeten Entitätsnamen haben sich in 3.7.0 (`ww` → verschachteltes `dhw`) und 3.7.2 (`remoteseltemp` → `cooltemp`) geändert; zwischen 3.8.0 und 3.8.6 blieben sie gleich.

### Zugangstoken für Schreibzugriffe

Lesen braucht keine Authentifizierung. Schreiben — Betriebsmodus, Raum- und Kühlsollwert sowie Warmwassersollwert — braucht das EMS-ESP-Zugangstoken eines Benutzers mit Administratorrechten:

1. Öffnen Sie die Weboberfläche von EMS-ESP → Settings → Security → Manage Users.
2. Klicken Sie auf das Schlüsselsymbol eines Benutzers mit Administratorrechten und kopieren Sie das Token. Das Token hat kein Ablaufdatum.
3. Fügen Sie das Token beim Import der Vorlage in den Importparameter `AccessToken` ein.

Ohne Token ist die Integration nur lesend und jeder Schreibzugriff endet mit Fehler 401. Schalten Sie stattdessen nicht „Bypass Access Token authorization on API calls“ in EMS-ESP ein — die API wird dadurch offen, und die EMS-ESP-Dokumentation rät davon ab.

### Importparameter

| Parameter | Beschreibung |
|---|---|
| `IpAddress` | IP-Adresse des EMS-ESP-Gateways |
| `AccessToken` | EMS-ESP-Zugangstoken eines Benutzers mit Administratorrechten — nur für Schreibzugriffe nötig; für eine rein lesende Integration leer lassen |

## Gerätefunktionen

### Heizkreis 1

- **Betriebsmodus der Wärmepumpe** — Aus, Auto, Heizen oder Kühlen für Heizkreis 1. In dieser Vorlage ist das der einzige Weg, die Wärmepumpe auf Kühlen zu schalten (siehe Einschränkungen der Regler oben).
- **Raumthermostat** — aktuelle und gewählte Raumtemperatur des Heizkreises 1, wie sie der Regler meldet. Der Sollwertbereich ist 0–30 °C in Schritten von 0,5 °C.
- **Kühltemperatur** — Einstellung der Kühltemperatur des Heizkreises 1, lesbar und schreibbar von −1 bis 30 °C in Schritten von 0,5 °C.

Das Gerät Raumthermostat ist auf 0–30 °C begrenzt. Die Kühltemperatur wird unverändert an EMS-ESP gesendet, halten Sie sie daher im Bereich −1 bis 30 °C.

### Status der Wärmepumpe

- **Kompressoraktivität** — was der Kompressor gerade tut: Aus, Heizen, Kühlen, Warmwasser, Pool, Poolheizung, Abtauen oder Kompressoralarm. Das ist ein reiner Lesestatus; die Auswahl eines Werts in TapHome hat keine Wirkung.
- **Kompressor läuft** — Ein/Aus-Anzeige, ein, solange der Kompressor läuft.

### Temperaturen

- **Außentemperatur**, **Vorlauftemperatur** und **Rücklauftemperatur**, wie sie die Wärmepumpe meldet, mit einer Auflösung von 0,1 °C.

### Energie

- **Stromzähler** — die Leistung ist die aktuelle elektrische Leistung des Kompressors (EMS-ESP meldet W, TapHome zeigt kW); der Gesamtverbrauch ist der gesamte elektrische Energieverbrauch der Wärmepumpe in kWh. Die Quellen sagen nicht, ob diese Summe den elektrischen Zusatzheizer enthält, daher muss die über die Zeit integrierte Leistung nicht mit ihr übereinstimmen.
- **Abgegebene Wärme [kWh]** (Service-Attribut des Stromzählers) — die gesamte von der Wärmepumpe abgegebene Wärmeenergie. Das ist thermische Energie, kein Stromverbrauch.

### Warmwasser

- **Warmwasser** — aktuelle und gewählte Warmwassertemperatur der Wärmepumpe. Der Sollwertbereich des Geräts ist 35–70 °C, der Sollwert wird in ganzen Grad gesendet und die Wärmepumpe wendet ihre eigenen Grenzen an. Die Vorlage verwendet die Warmwasserwerte der Wärmepumpe, nicht die Warmwassereinstellungen des Reglers (`dhw.settemp`, `dhw.mode`).

### So kommuniziert die Vorlage mit EMS-ESP

Jedes Gerät liest seine eigenen Werte mit einer HTTP-GET-Anfrage pro Entität auf `/api/<device>/[hc1/|dhw/]<entity>` und nimmt den Schlüssel `value`, `index` oder `bool` aus der Antwort. Die Geräte fragen alle 30 s ab (Außentemperatur und Stromzähler alle 60 s); das Modul liest `/api/system/info` alle 60 s. Schreibzugriffe sind HTTP-POST-Anfragen mit einem JSON-Body und dem Zugangstoken im Header `Authorization: Bearer`.

EMS-ESP 3.8.3 und neuer antwortet mit `429 Too Many Requests` auf eine GET-Anfrage, die weniger als 50 ms nach dem vorherigen API-Aufruf eintrifft. Die Vorlage wartet deshalb vor jeder GET-Anfrage 60 ms und wiederholt sie bei 429 einmal nach 200 ms. Ein anderer Client, der die EMS-ESP-API zur gleichen Zeit abfragt (zum Beispiel ein zweites Hausautomationssystem), kann trotzdem gelegentlich eine Wiederholung auslösen.

> [!NOTE]
> **Warum REST und nicht Modbus.** EMS-ESP bietet auch Modbus TCP (seit 3.7.0, nur auf Platinen mit PSRAM) und MQTT. Die Modbus-Registeroffsets von EMS-ESP haben sich zwischen den stabilen Versionen 3.8.0 und 3.8.6 verschoben, daher würde eine Modbus-Vorlage nach einem Firmware-Update des Gateways stillschweigend andere Werte lesen. Die REST-API spricht Werte über ihren Namen an — eine umbenannte Entität endet in einem sichtbaren Gerätefehler.

## Fehlerbehebung

### Gerätefehler „no value from the gateway“

Die Meldung „no value from the gateway — this controller or unit does not report it; delete this device“ bedeutet, dass die angeschlossene Wärmepumpe oder der Regler diese Entität nicht sendet. Prüfen Sie die Seite Devices von EMS-ESP oder `http://<gateway-ip>/api/boiler/entities` und `http://<gateway-ip>/api/thermostat/entities` und löschen Sie das Gerät nach dem Import — die anderen Geräte funktionieren weiter.

### Gerätefehler 404

Ein `404` mit einer Meldung wie `no 'xyz' in thermostat` bedeutet, dass EMS-ESP die Entität unter diesem Pfad nicht kennt — der Regler hat sie nicht (zum Beispiel `hc1.hpoperatingmode` beim UI800) oder die Firmware verwendet einen anderen Namen. `unknown device` bedeutet, dass EMS-ESP am EMS-Bus keine Wärmepumpe und keinen Regler dieses Typs erkannt hat.

### Schreibzugriff endet mit Fehler 401

Das Zugangstoken fehlt oder ist falsch. Kopieren Sie es erneut unter Settings → Security → Manage Users → Schlüsselsymbol eines Benutzers mit Administratorrechten und tragen Sie es in die Variable `AccessToken` des Moduls ein. Das Token wird aus dem Benutzernamen und dem Super-User-Passwort unter Settings → Security → Security Settings abgeleitet.

### Fehler 429

Ein anderer Client fragt die EMS-ESP-API im selben Moment ab. Die Vorlage verteilt ihre eigenen Anfragen bereits zeitlich und wiederholt sie einmal; verringern Sie die Abfragerate des anderen Clients, wenn der Fehler wiederkehrt.

### Fehler oder Warnung des Moduls

- „EMS-ESP reports °F“ — schalten Sie Fahrenheit unter Settings → Application aus.
- „Template written for EMS-ESP 3.8.6, gateway reports …“ — das Gateway läuft mit einer Firmware außerhalb der Reihe 3.8. Aktualisieren Sie EMS-ESP unter Settings → Version.

### Fehler des Stromzählers zu nrgtotal

Ein Gerät ohne Wärmemengenmessung sendet `nrgtotal` nicht. Der Stromzähler zeigt dann einen Fehler und das Attribut Abgegebene Wärme bleibt leer; Leistung und Gesamtverbrauch funktionieren weiter.

### Gateway nicht erreichbar

1. Prüfen Sie die LED des Gateways: 1 blaues Blinken beim Start = EMS-Bus noch nicht verbunden (Kabel und Einstellung EMS Tx Mode prüfen), 2 rote Blinksignale = Netzwerk verbindet sich noch (Settings → Network prüfen; WLAN muss 2,4 GHz WPA2 sein), Dauerlicht = EMS-Daten fließen.
2. Öffnen Sie `http://<gateway-ip>/api/system/info` im Browser — wenn es antwortet, ist das Gateway erreichbar.
3. Wenn sich die IP-Adresse geändert hat, finden Sie das Gateway über den mDNS-Namen `http://ems-esp.local` und richten Sie dann im Router eine DHCP-Reservierung ein.
4. Verwenden Sie `http://` — die EMS-ESP-API unterstützt kein HTTPS mit selbstsignierten Zertifikaten.

## Verfügbare Geräte 10

Diese Geräte erscheinen nach dem Import in TapHome.

EMS-ESP Wärmepumpe Modul

Benutzerdefinierte Variablen

`AccessToken` (string) EMS-ESP-Zugangstoken eines Benutzers mit Administratorrechten, wird bei jedem Schreibzugriff (Betriebsmodus, Sollwerte) als Bearer-Header gesendet; Lesen funktioniert ohne, ein leeres Token ergibt also eine rein lesende Integration

EMS-ESP web interface → Settings → Security → Manage Users → key icon of a user with admin rights; paste the token into the AccessToken import parameter. The token has no expiry date.

Lesen (Modul)

```taphome
SLEEP(60);
VAR r := SENDHTTPREQUEST("/api/system/info");
IF r.StatusCode = 429
    SLEEP(200);
    r := SENDHTTPREQUEST("/api/system/info");
END
IF r.IsSuccess
    SystemInfo := r.Content;
    IF PARSEJSON(SystemInfo, "$.settings.fahrenheit", true) = true
        ADDERROR(1, "EMS-ESP reports °F — switch Fahrenheit off in EMS-ESP Settings → Application");
    END
    IF !ISNULL(PARSEJSON(SystemInfo, "$.system.version", true))
        VAR ver := TOSTRING(PARSEJSON(SystemInfo, "$.system.version", true));
        IF INDEXOF(ver, "3.8.") != 0
            ADDWARNING(0, "Template written for EMS-ESP 3.8.6, gateway reports " + ver);
        END
    END
ELSE
    SystemInfo := "";
    ADDERROR(0, "system/info: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
END
```

Betriebsmodus der Wärmepumpe Mehrwertschalter Lesen und Schreiben

Betriebsmodus des Heizkreises 1 — Aus, Auto, Heizen oder Kühlen; der einzige Weg, die Wärmepumpe auf Kühlen zu schalten, nur mit Reglern verfügbar, die ihn senden (nicht UI800)

enum numeric

Werte / Zustände: Off · Auto · Heating · Cooling

Schaltzustand lesen

```taphome
SLEEP(60);
VAR r := SENDHTTPREQUEST("/api/thermostat/hc1/hpoperatingmode");
IF r.StatusCode = 429
    SLEEP(200);
    r := SENDHTTPREQUEST("/api/thermostat/hc1/hpoperatingmode");
END
IF r.IsSuccess
    VAR idx := PARSEJSON(r.Content, "$.index", true);
    IF ISNULL(idx)
        ADDERROR(0, "hpoperatingmode: no value from the gateway — this controller or unit does not report it; delete this device");
        RETURN(NaN);
    END
    RETURN(TODOUBLE(idx));
ELSE
    ADDERROR(0, "hpoperatingmode: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
    RETURN(NaN);
END
```

Schaltzustand schreiben

```taphome
VAR opttext := IF(Mu = 0, "off", IF(Mu = 1, "auto", IF(Mu = 2, "heating", "cooling")));
VAR body := "{\"value\":\"" + opttext + "\"}";
VAR r := SENDHTTPREQUEST("/api/thermostat/hc1/hpoperatingmode", "POST", body, "Content-Type: application/json", "Authorization: Bearer " + AccessToken);
IF r.IsSuccess = false
    IF r.StatusCode = 401
        ADDERROR(0, "hpoperatingmode: access token missing or wrong (EMS-ESP Settings → Security → Manage Users → key icon of an admin user)");
    ELSE
        ADDERROR(0, "hpoperatingmode write: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
    END
END
```

Raumthermostat Thermostat Lesen und Schreiben

Aktuelle und gewählte Raumtemperatur des Heizkreises 1 vom Regler der Wärmepumpe; Sollwert 0–30 °C in Schritten von 0,5 °C

numeric Einheit: °C

Temperatur lesen

```taphome
IF CurrTempHc1 = ""
    RETURN(NaN);
END
VAR v := PARSEJSON(CurrTempHc1, "$.value", true);
IF ISNULL(v)
    ADDERROR(0, "currtemp: no value from the gateway — this controller or unit does not report it; delete this device");
    RETURN(NaN);
END
RETURN(TODOUBLE(v));
```

Lesen (Modul)

```taphome
SLEEP(60);
VAR r := SENDHTTPREQUEST("/api/thermostat/hc1/currtemp");
IF r.StatusCode = 429
    SLEEP(200);
    r := SENDHTTPREQUEST("/api/thermostat/hc1/currtemp");
END
IF r.IsSuccess
    CurrTempHc1 := r.Content;
ELSE
    CurrTempHc1 := "";
    ADDERROR(0, "currtemp: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
END
SLEEP(60);
r := SENDHTTPREQUEST("/api/thermostat/hc1/seltemp");
IF r.StatusCode = 429
    SLEEP(200);
    r := SENDHTTPREQUEST("/api/thermostat/hc1/seltemp");
END
IF r.IsSuccess
    SelTempHc1 := r.Content;
ELSE
    SelTempHc1 := "";
    ADDERROR(1, "seltemp: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
END
```

Solltemperatur lesen

```taphome
IF SelTempHc1 = ""
    RETURN(NaN);
END
VAR v := PARSEJSON(SelTempHc1, "$.value", true);
IF ISNULL(v)
    ADDERROR(1, "seltemp: no value from the gateway — this controller or unit does not report it; delete this device");
    RETURN(NaN);
END
RETURN(TODOUBLE(v));
```

Solltemperatur schreiben

```taphome
VAR body := "{\"value\":" + Se + "}";
VAR r := SENDHTTPREQUEST("/api/thermostat/hc1/seltemp", "POST", body, "Content-Type: application/json", "Authorization: Bearer " + AccessToken);
IF r.IsSuccess = false
    IF r.StatusCode = 401
        ADDERROR(0, "seltemp: access token missing or wrong (EMS-ESP Settings → Security → Manage Users → key icon of an admin user)");
    ELSE
        ADDERROR(0, "seltemp write: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
    END
END
```

Kühltemperatur Variable Lesen und Schreiben

Einstellung der Kühltemperatur des Heizkreises 1, einstellbar von −1 bis 30 °C in Schritten von 0,5 °C; nur mit Reglern verfügbar, die sie senden

numeric Einheit: °C

Lesen

```taphome
SLEEP(60);
VAR r := SENDHTTPREQUEST("/api/thermostat/hc1/cooltemp");
IF r.StatusCode = 429
    SLEEP(200);
    r := SENDHTTPREQUEST("/api/thermostat/hc1/cooltemp");
END
IF r.IsSuccess
    VAR v := PARSEJSON(r.Content, "$.value", true);
    IF ISNULL(v)
        ADDERROR(0, "cooltemp: no value from the gateway — this controller or unit does not report it; delete this device");
        RETURN(NaN);
    END
    RETURN(TODOUBLE(v));
ELSE
    ADDERROR(0, "cooltemp: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
    RETURN(NaN);
END
```

Schreiben

```taphome
VAR body := "{\"value\":" + Va + "}";
VAR r := SENDHTTPREQUEST("/api/thermostat/hc1/cooltemp", "POST", body, "Content-Type: application/json", "Authorization: Bearer " + AccessToken);
IF r.IsSuccess = false
    IF r.StatusCode = 401
        ADDERROR(0, "cooltemp: access token missing or wrong (EMS-ESP Settings → Security → Manage Users → key icon of an admin user)");
    ELSE
        ADDERROR(0, "cooltemp write: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
    END
END
```

Kompressoraktivität Mehrwertschalter Nur lesen

Reiner Lesestatus, was der Kompressor gerade tut — Aus, Heizen, Kühlen, Warmwasser, Pool, Poolheizung, Abtauen oder Kompressoralarm

enum numeric

Werte / Zustände: Off · Heating · Cooling · Hot Water · Pool · Pool Heating · Defrost · Compressor Alarm

Schaltzustand lesen

```taphome
SLEEP(60);
VAR r := SENDHTTPREQUEST("/api/boiler/hpactivity");
IF r.StatusCode = 429
    SLEEP(200);
    r := SENDHTTPREQUEST("/api/boiler/hpactivity");
END
IF r.IsSuccess
    VAR idx := PARSEJSON(r.Content, "$.index", true);
    IF ISNULL(idx)
        ADDERROR(0, "hpactivity: no value from the gateway — this controller or unit does not report it; delete this device");
        RETURN(NaN);
    END
    RETURN(TODOUBLE(idx));
ELSE
    ADDERROR(0, "hpactivity: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
    RETURN(NaN);
END
```

Kompressor läuft Reed-Kontakt Nur lesen

boolean

Lesen

```taphome
SLEEP(60);
VAR r := SENDHTTPREQUEST("/api/boiler/hpcompon");
IF r.StatusCode = 429
    SLEEP(200);
    r := SENDHTTPREQUEST("/api/boiler/hpcompon");
END
IF r.IsSuccess
    VAR b := PARSEJSON(r.Content, "$.bool", true);
    IF ISNULL(b)
        ADDERROR(0, "hpcompon: no value from the gateway — this controller or unit does not report it; delete this device");
        RETURN(NaN);
    END
    RETURN(b);
ELSE
    ADDERROR(0, "hpcompon: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
    RETURN(NaN);
END
```

Außentemperatur Temperatursensor Nur lesen

numeric Einheit: °C

Temperatur lesen

```taphome
SLEEP(60);
VAR r := SENDHTTPREQUEST("/api/boiler/outdoortemp");
IF r.StatusCode = 429
    SLEEP(200);
    r := SENDHTTPREQUEST("/api/boiler/outdoortemp");
END
IF r.IsSuccess
    VAR v := PARSEJSON(r.Content, "$.value", true);
    IF ISNULL(v)
        ADDERROR(0, "outdoortemp: no value from the gateway — this controller or unit does not report it; delete this device");
        RETURN(NaN);
    END
    RETURN(TODOUBLE(v));
ELSE
    ADDERROR(0, "outdoortemp: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
    RETURN(NaN);
END
```

Vorlauftemperatur Temperatursensor Nur lesen

numeric Einheit: °C

Temperatur lesen

```taphome
SLEEP(60);
VAR r := SENDHTTPREQUEST("/api/boiler/curflowtemp");
IF r.StatusCode = 429
    SLEEP(200);
    r := SENDHTTPREQUEST("/api/boiler/curflowtemp");
END
IF r.IsSuccess
    VAR v := PARSEJSON(r.Content, "$.value", true);
    IF ISNULL(v)
        ADDERROR(0, "curflowtemp: no value from the gateway — this controller or unit does not report it; delete this device");
        RETURN(NaN);
    END
    RETURN(TODOUBLE(v));
ELSE
    ADDERROR(0, "curflowtemp: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
    RETURN(NaN);
END
```

Rücklauftemperatur Temperatursensor Nur lesen

numeric Einheit: °C

Temperatur lesen

```taphome
SLEEP(60);
VAR r := SENDHTTPREQUEST("/api/boiler/rettemp");
IF r.StatusCode = 429
    SLEEP(200);
    r := SENDHTTPREQUEST("/api/boiler/rettemp");
END
IF r.IsSuccess
    VAR v := PARSEJSON(r.Content, "$.value", true);
    IF ISNULL(v)
        ADDERROR(0, "rettemp: no value from the gateway — this controller or unit does not report it; delete this device");
        RETURN(NaN);
    END
    RETURN(TODOUBLE(v));
ELSE
    ADDERROR(0, "rettemp: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
    RETURN(NaN);
END
```

Stromzähler Stromzähler Nur lesen

Aktuelle elektrische Leistung des Kompressors (kW) und gesamter elektrischer Energieverbrauch der Wärmepumpe (kWh)

numeric Einheit: W / kWh

Serviceattribute

|                         |                                                                                         |
|-------------------------|-----------------------------------------------------------------------------------------|
| Abgegebene Wärme \[kWh] | Gesamte von der Wärmepumpe abgegebene Wärmeenergie — Wärmeleistung, kein Stromverbrauch |

Gesamtverbrauch lesen

```taphome
IF NrgConsTotal = ""
    RETURN(NaN);
END
VAR v := PARSEJSON(NrgConsTotal, "$.value", true);
IF ISNULL(v)
    ADDERROR(1, "nrgconstotal: no value from the gateway — this controller or unit does not report it; delete this device");
    RETURN(NaN);
END
RETURN(TODOUBLE(v));
```

Bedarf lesen

```taphome
IF HpCurrPower = ""
    RETURN(NaN);
END
VAR v := PARSEJSON(HpCurrPower, "$.value", true);
IF ISNULL(v)
    ADDERROR(0, "hpcurrpower: no value from the gateway — this controller or unit does not report it; delete this device");
    RETURN(NaN);
END
RETURN(TODOUBLE(v) / 1000);
```

Lesen (Modul)

```taphome
SLEEP(60);
VAR r := SENDHTTPREQUEST("/api/boiler/hpcurrpower");
IF r.StatusCode = 429
    SLEEP(200);
    r := SENDHTTPREQUEST("/api/boiler/hpcurrpower");
END
IF r.IsSuccess
    HpCurrPower := r.Content;
ELSE
    HpCurrPower := "";
    ADDERROR(0, "hpcurrpower: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
END
SLEEP(60);
r := SENDHTTPREQUEST("/api/boiler/nrgconstotal");
IF r.StatusCode = 429
    SLEEP(200);
    r := SENDHTTPREQUEST("/api/boiler/nrgconstotal");
END
IF r.IsSuccess
    NrgConsTotal := r.Content;
ELSE
    NrgConsTotal := "";
    ADDERROR(1, "nrgconstotal: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
END
SLEEP(60);
r := SENDHTTPREQUEST("/api/boiler/nrgtotal");
IF r.StatusCode = 429
    SLEEP(200);
    r := SENDHTTPREQUEST("/api/boiler/nrgtotal");
END
IF r.IsSuccess
    NrgTotal := r.Content;
    IF ISNULL(PARSEJSON(NrgTotal, "$.value", true))
        ADDERROR(3, "nrgtotal: no value from the gateway — this unit does not report heat delivered; the attribute stays empty");
    END
ELSE
    NrgTotal := "";
    ADDERROR(2, "nrgtotal: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
END
```

Serviceattribute

Heat delivered \[kWh]

```taphome
IF NrgTotal = "" RETURN(NaN); END VAR v := PARSEJSON(NrgTotal, "$.value", true); IF ISNULL(v) RETURN(NaN); END RETURN(TODOUBLE(v));
```

Warmwasser Thermostat Lesen und Schreiben

Aktuelle und gewählte Warmwassertemperatur der Wärmepumpe; der Sollwert wird in ganzen Grad gesendet und die Wärmepumpe wendet ihre eigenen Grenzen an

numeric Einheit: °C

Temperatur lesen

```taphome
IF DhwCurTemp = ""
    RETURN(NaN);
END
VAR v := PARSEJSON(DhwCurTemp, "$.value", true);
IF ISNULL(v)
    ADDERROR(0, "dhw/curtemp: no value from the gateway — this controller or unit does not report it; delete this device");
    RETURN(NaN);
END
RETURN(TODOUBLE(v));
```

Lesen (Modul)

```taphome
SLEEP(60);
VAR r := SENDHTTPREQUEST("/api/boiler/dhw/curtemp");
IF r.StatusCode = 429
    SLEEP(200);
    r := SENDHTTPREQUEST("/api/boiler/dhw/curtemp");
END
IF r.IsSuccess
    DhwCurTemp := r.Content;
ELSE
    DhwCurTemp := "";
    ADDERROR(0, "dhw/curtemp: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
END
SLEEP(60);
r := SENDHTTPREQUEST("/api/boiler/dhw/seltemp");
IF r.StatusCode = 429
    SLEEP(200);
    r := SENDHTTPREQUEST("/api/boiler/dhw/seltemp");
END
IF r.IsSuccess
    DhwSelTemp := r.Content;
ELSE
    DhwSelTemp := "";
    ADDERROR(1, "dhw/seltemp: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
END
```

Solltemperatur lesen

```taphome
IF DhwSelTemp = ""
    RETURN(NaN);
END
VAR v := PARSEJSON(DhwSelTemp, "$.value", true);
IF ISNULL(v)
    ADDERROR(1, "dhw/seltemp: no value from the gateway — this controller or unit does not report it; delete this device");
    RETURN(NaN);
END
RETURN(TODOUBLE(v));
```

Solltemperatur schreiben

```taphome
VAR body := "{\"value\":" + ROUND(Se) + "}";
VAR r := SENDHTTPREQUEST("/api/boiler/dhw/seltemp", "POST", body, "Content-Type: application/json", "Authorization: Bearer " + AccessToken);
IF r.IsSuccess = false
    IF r.StatusCode = 401
        ADDERROR(0, "dhw/seltemp: access token missing or wrong (EMS-ESP Settings → Security → Manage Users → key icon of an admin user)");
    ELSE
        ADDERROR(0, "dhw/seltemp write: " + r.StatusCode + IF(ISNULL(PARSEJSON(r.Content, "$.message", true)), "", " — " + PARSEJSON(r.Content, "$.message", true)));
    END
END
```

**Verbindung:** Packet Parser → HTTP • Hostname: `ems-esp.local`

Mögliche Verbesserungen (15)

- Heat pump operating mode on UI800 (thermostat top level) — UI800 reports hpoperatingmode at the thermostat top level instead of under hc1, so the template's operating mode device (and with it cooling) does not work with UI800
- Heating circuits 2–8 — Same entities as hc1 under the hc2…hc8 path prefix; the template covers heating circuit 1 only — devices for further circuits would be copies with a different path
- Heating circuit mode — Enum, writable: manual / auto on RC300, RC100, Rego 3000 and HMC310; off / manual / auto on BC400, UI800 and CR120
- Heat pump cooling enabled — Boolean, writable — enables cooling on the heating circuit
- Summer / winter switchover — winter / auto / summer, RC100 and RC300
- Further heating circuit settings — Comfort / eco / manual setpoints, summer threshold, flow temperature limits, heating curve design temperature, offset, room influence and control mode (RC100 / RC300); the docs mark the command table as incomplete and model-dependent
- Controller-side domestic hot water settings — DHW mode (off / on / auto), DHW set temperatures, one-time charge and circulation mode on RC100 / RC300 — the template reads and writes the heat pump (boiler) DHW entities instead
- EMS-ESP firmware version — Already fetched by the module for the version warning; could be exposed as a module service attribute
- Restart EMS-ESP — GET with access token; candidate for a module service action
- Refresh all device values — Forces EMS-ESP to re-read all values from the EMS bus; no authentication
- Temperature sensors on the gateway (DS18B20) — The kit includes a JST ZH cable for own DS18B20 sensors; their readings are available over the same REST API
- Analog sensors and outputs of the gateway — Readings and setvalue for gateway analog inputs, counters and output pins
- Custom entities — User-defined entities for EMS telegrams EMS-ESP does not decode yet
- Entity discovery lists — Not a device — the live list of entities a given installation reports; the way to check which template devices will work before importing
- Other EMS-ESP interfaces — EMS-ESP also offers Modbus TCP (since 3.7.0) and MQTT / MQTT Discovery; the template uses the REST API by entity name instead of Modbus register offsets

## Importparameter

Diese Werte geben Sie beim Import des XML ein.

| In der App abgefragt                                                             | Standard             |
|----------------------------------------------------------------------------------|----------------------|
| EMS-ESP IP address                                                               | Beim Import eingeben |
| EMS-ESP access token (admin user, Settings → Security → Manage Users → key icon) | Beim Import eingeben |

## Quellen

- EMS-ESP 3.8.6 REST API facts (TapHome digest of the firmware at tag v3.8.6)
  
  [github.com](https://github.com/emsesp/EMS-ESP32/tree/v3.8.6) 2026-10-18
- EMS-ESP documentation — Commands and API Reference
  
  [docs.emsesp.org](https://docs.emsesp.org/Commands) 2026-10-18
- EMS-ESP documentation — Configuring EMS-ESP
  
  [docs.emsesp.org](https://docs.emsesp.org/Configuring) 2026-10-18
- EMS-ESP documentation — Supported Heat Pumps
  
  [docs.emsesp.org](https://docs.emsesp.org/Heat-Pumps) 2026-10-18
- EMS-ESP documentation — Supported Thermostats
  
  [docs.emsesp.org](https://docs.emsesp.org/Thermostats) 2026-10-18
- EMS-ESP documentation — Installing
  
  [docs.emsesp.org](https://docs.emsesp.org/Installing) 2026-10-18
- EMS-ESP documentation — Getting Started
  
  [docs.emsesp.org](https://docs.emsesp.org/Getting-Started) 2026-10-18
- EMS-ESP changelog 3.7.0 – 3.8.6
  
  [github.com](https://github.com/emsesp/EMS-ESP32/blob/v3.8.6/CHANGELOG.md) 2026-10-18
- BBQKees Gateway E32 V2 KIT (Ethernet + WiFi Edition V2 KIT) — product page
  
  [bbqkees-electronics.nl](https://bbqkees-electronics.nl/product/gateway-e32-v2-ethernet-wifi-edition-v2-kit/) 2026-10-18

## Verwandte Dokumentation

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

