---
title: "EMS-ESP pompa ciepła (Bosch, Buderus, IVT)"
description: "Tryb pracy z chłodzeniem, nastawy pomieszczenia i CWU, temperatury i energia pomp ciepła Bosch, Buderus i IVT przez REST API bramki EMS-ESP."
url: "https://taphome.com/pl/compatibility/ems-esp-heat-pump-http/"
language: pl
lastmod: 2026-10-18
generator: hugo
ai:
  topics: ["http","heat-pump","ems-bus","rest-api","gateway","wifi","ethernet","cooling","dhw"]
  questions: ["Czy moja pompa ciepła Buderus jest kompatybilna z TapHome?","Jak zintegrować pompę ciepła Bosch, Buderus lub IVT z TapHome przez EMS-ESP?","Co odczytuje i czym steruje szablon TapHome dla pomp ciepła EMS-ESP?","Jak podłączyć bramkę BBQKees EMS-ESP do pompy ciepła i do TapHome?","Czy TapHome może przełączyć pompę ciepła Buderus na chłodzenie przez EMS-ESP?","Dlaczego urządzenie EMS-ESP w TapHome zgłasza „no value from the gateway” lub błąd 401?"]
---

# EMS-ESP pompa ciepła (Bosch, Buderus, IVT)

Komunikacja: Packet Parser → HTTP

- [Oficjalna strona BBQKees Electronics](https://bbqkees-electronics.nl)
- [Strona produktu BBQKees Gateway E32 V2 KIT](https://bbqkees-electronics.nl/product/gateway-e32-v2-ethernet-wifi-edition-v2-kit/)

## Poradnik integracji

Szablon EMS-ESP Heat Pump łączy TapHome z pompą ciepła Bosch, Buderus lub IVT przez bramkę EMS-ESP — BBQKees Electronics Gateway E32 V2, która działa na otwartym oprogramowaniu EMS-ESP i podłącza się do magistrali EMS pompy ciepła. TapHome komunikuje się z bramką przez jej lokalne HTTP REST API (port 80, JSON); połączenie z chmurą nie jest potrzebne. W EMS-ESP pompa ciepła występuje jako typ urządzenia `boiler`, a jej regulator jako typ urządzenia `thermostat`.

Szablon odczytuje temperaturę zewnętrzną, zasilania, powrotu, pomieszczenia i ciepłej wody, stan sprężarki, moc sprężarki i liczniki energii. Z tokenem dostępu ustawia także tryb pracy obiegu grzewczego 1 (w tym chłodzenie), nastawy temperatury pomieszczenia i chłodzenia oraz nastawę ciepłej wody.

> [!WARNING]
> **Szablon społeczności — jeszcze nie przetestowany z TapHome.** Szablon powstał w portalu TapHome i został napisany dla **EMS-ESP 3.8.6**; nie został jeszcze sprawdzony w rzeczywistej instalacji. Pobierz go z portalu TapHome: [EMS-ESP Heat Pump — szablon społeczności](https://portal.taphome.com/portal/community/ems-esp-heat-pump-http) (pobierz XML — bez logowania — i zaimportuj go jako nowy moduł).

**[EMS-ESP Heat Pump (Bosch/Buderus/IVT)](https://portal.taphome.com/pl/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.

## Kompatybilne pompy ciepła i regulatory

O tym, czy pompa ciepła działa z tym szablonem, decydują dwie rzeczy: EMS-ESP musi obsługiwać pompę ciepła, a pompa ciepła i jej regulator muszą wysyłać wartości, które szablon odczytuje.

Pompy ciepła objęte szablonem:

- Bosch Compress 6000AW, Hybrid 3000-7000iAW
- Buderus WLW166i, WLW176i, WLW196i, WSW196i
- CS5800i, CS6800i
- Enviline, SupraEco, Geo 5xx
- IVT AirX i Geo z regulatorem Rego 2000 lub Rego 3000 — zgłoszone przez użytkowników EMS-ESP, nie ma ich na oficjalnej liście pomp ciepła obsługiwanych przez EMS-ESP

Bramka działa z wariantami magistrali EMS, EMS Plus (EMS+), EMS2 i Heatronic 3.

Które wartości wysyła dana jednostka, nie jest udokumentowane dla poszczególnych modeli. Strona Devices w interfejsie WWW EMS-ESP pokazuje tylko encje z wartością; encja, która istnieje w EMS-ESP, ale nie ma wartości, jest obsługiwana przez oprogramowanie, a nie przez podłączoną jednostkę. Ta sama lista jest dostępna pod `http://<gateway-ip>/api/boiler/entities` i `http://<gateway-ip>/api/thermostat/entities`.

**Chłodzenie** wymaga regulatora, który wysyła `hc1.hpoperatingmode`. EMS-ESP rejestruje tę encję dla rodziny RC300 (RC310, HMC310, Rego 2000 / 3000) i rodziny BC400; czy dany regulator rzeczywiście ją wysyła, nie jest udokumentowane. **UI800** zgłasza ją na najwyższym poziomie termostatu (`/api/thermostat/hpoperatingmode`), a nie w obiegu grzewczym 1, dlatego urządzenie trybu pracy — a z nim chłodzenie — nie działa z UI800.

## Połączenie sprzętowe

Zestaw BBQKees Gateway E32 V2 KIT zawiera bramkę, kabel serwisowy EMS 150 cm, kabel 100 cm do zacisków śrubowych EMS, adapter portu serwisowego EMS, zasilacz (12 V DC z wtykiem lub 5 V USB-C, zależnie od partii produkcyjnej) oraz kabel JST ZH do własnych czujników temperatury DS18B20. Bramkę podłącza się do pompy ciepła na jeden z trzech sposobów:

| Złącze w pompie ciepła | Kabel | Zasilanie |
|---|---|---|
| Gniazdo serwisowe EMS (3,5 mm) | kabel serwisowy EMS 150 cm | z gniazda serwisowego |
| Gniazdo serwisowe EMS (3,5 mm) | kabel serwisowy EMS 150 cm | zasilacz zewnętrzny |
| Zaciski śrubowe magistrali EMS | kabel 100 cm do zacisków śrubowych EMS | zasilacz zewnętrzny (12 V DC lub 5 V USB-C) |

Gniazdo serwisowe wchodzi w grę tylko wtedy, gdy pompa ciepła je ma. Bramki sprzedawane od lata 2025 przyjmują oba typy zasilaczy. [BBQKees EMS Gateway Wiki](https://bbqkees-electronics.nl/wiki/) pokazuje, jak podłączyć bramkę do konkretnego kotła lub pompy ciepła.

- **Sieć:** Ethernet (RJ45) lub Wi-Fi. EMS-ESP łączy się tylko z sieciami Wi-Fi 2,4 GHz z WPA2, nie z 5 GHz.
- **Oprogramowanie:** EMS-ESP. Gateway E32 V2 (sprzedawany od stycznia 2024) ma PSRAM i używa wariantu oprogramowania `ESP32-16MB+`. Oprogramowanie aktualizuje się w interfejsie WWW EMS-ESP w Settings → Version.

## Konfiguracja

### Pierwsza konfiguracja EMS-ESP

1. Przy pierwszym uruchomieniu EMS-ESP otwiera punkt dostępu Wi-Fi `ems-esp` (hasło WPA `ems-esp-neo`). Bramka podłączona przez Ethernet jest dostępna pod adresem IP przydzielonym jej przez router.
2. Zaloguj się domyślnym użytkownikiem `admin` / `admin` i zmień hasło.
3. W Settings → Network podłącz bramkę do sieci domowej (Wi-Fi lub Ethernet).
4. W routerze zarezerwuj dla bramki stały adres IP (rezerwacja DHCP) — szablon adresuje bramkę jej adresem IP.

### Ważne ustawienia EMS-ESP

- **Temperatury w °C** — pozostaw wyłączone „Convert temperature values to Fahrenheit” w Settings → Application. Moduł sprawdza to co 60 s i pokazuje błąd, gdy EMS-ESP zgłasza °F.
- **Boolean Format, Enum Format i Language** nie mają znaczenia. Szablon odczytuje klucze `index` i `bool` ze szczegółów encji EMS-ESP, które nie zależą od tych ustawień, i zapisuje angielskie teksty opcji, które EMS-ESP akceptuje w każdym języku.
- **Oprogramowanie 3.8** — moduł pokazuje ostrzeżenie, gdy bramka zgłasza wersję spoza serii 3.8. Nazwy encji używane przez szablon zmieniły się w wersji 3.7.0 (`ww` → zagnieżdżone `dhw`) i 3.7.2 (`remoteseltemp` → `cooltemp`); między 3.8.0 a 3.8.6 się nie zmieniły.

### Token dostępu do zapisu

Odczyt nie wymaga uwierzytelniania. Zapis — tryb pracy, nastawy pomieszczenia, chłodzenia i ciepłej wody — wymaga tokenu dostępu EMS-ESP użytkownika z uprawnieniami administratora:

1. Otwórz interfejs WWW EMS-ESP → Settings → Security → Manage Users.
2. Kliknij ikonę klucza przy użytkowniku z uprawnieniami administratora i skopiuj token. Token nie ma daty wygaśnięcia.
3. Podczas importu szablonu wklej token do parametru importu `AccessToken`.

Bez tokenu integracja działa tylko w trybie odczytu, a każdy zapis kończy się błędem 401. Zamiast tego nie włączaj w EMS-ESP opcji „Bypass Access Token authorization on API calls” — otwiera ona API, a dokumentacja EMS-ESP jej nie zaleca.

### Parametry importu

| Parametr | Opis |
|---|---|
| `IpAddress` | Adres IP bramki EMS-ESP |
| `AccessToken` | Token dostępu EMS-ESP użytkownika z uprawnieniami administratora — potrzebny tylko do zapisu; dla integracji tylko do odczytu pozostaw pusty |

## Możliwości urządzeń

### Obieg grzewczy 1

- **Tryb pracy pompy ciepła** — Wyłączony, Auto, Grzanie lub Chłodzenie dla obiegu grzewczego 1. W tym szablonie to jedyny sposób na przełączenie pompy ciepła na chłodzenie (zobacz ograniczenia regulatorów powyżej).
- **Termostat pokojowy** — aktualna i zadana temperatura pomieszczenia obiegu grzewczego 1 zgłaszana przez regulator. Zakres nastawy to 0–30 °C w krokach co 0,5 °C.
- **Temperatura chłodzenia** — nastawa temperatury chłodzenia obiegu grzewczego 1, odczyt i zapis od −1 do 30 °C w krokach co 0,5 °C.

Urządzenie termostatu pokojowego jest ograniczone do 0–30 °C. Temperatura chłodzenia jest wysyłana do EMS-ESP bez zmian, dlatego utrzymuj ją w zakresie od −1 do 30 °C.

### Stan pompy ciepła

- **Praca sprężarki** — co właśnie robi sprężarka: Wyłączona, Grzanie, Chłodzenie, Ciepła woda, Basen, Grzanie basenu, Odszranianie lub Alarm sprężarki. To stan tylko do odczytu; wybranie wartości w TapHome nie ma żadnego efektu.
- **Sprężarka pracuje** — wskaźnik wł./wył., włączony, gdy sprężarka pracuje.

### Temperatury

- **Temperatura zewnętrzna**, **Temperatura zasilania** i **Temperatura powrotu** zgłaszane przez pompę ciepła, z rozdzielczością 0,1 °C.

### Energia

- **Licznik energii elektrycznej** — moc to aktualna moc elektryczna sprężarki (EMS-ESP zgłasza W, TapHome pokazuje kW); zużycie całkowite to całkowite zużycie energii elektrycznej pompy ciepła w kWh. Źródła nie podają, czy ta suma obejmuje elektryczną grzałkę wspomagającą, więc moc scałkowana w czasie nie musi się z nią zgadzać.
- **Dostarczone ciepło [kWh]** (atrybut serwisowy licznika) — całkowita energia cieplna dostarczona przez pompę ciepła. To energia cieplna, a nie zużycie energii elektrycznej.

### Ciepła woda użytkowa

- **Ciepła woda użytkowa** — aktualna i zadana temperatura ciepłej wody pompy ciepła. Zakres nastawy urządzenia to 35–70 °C, nastawa jest wysyłana w pełnych stopniach, a pompa ciepła stosuje własne ograniczenia. Szablon używa wartości ciepłej wody pompy ciepła, a nie ustawień ciepłej wody regulatora (`dhw.settemp`, `dhw.mode`).

### Jak szablon komunikuje się z EMS-ESP

Każde urządzenie odczytuje swoje wartości jednym żądaniem HTTP GET na encję pod `/api/<device>/[hc1/|dhw/]<entity>` i bierze klucz `value`, `index` lub `bool` z odpowiedzi. Urządzenia odpytują co 30 s (temperatura zewnętrzna i licznik energii co 60 s); moduł odczytuje `/api/system/info` co 60 s. Zapisy to żądania HTTP POST z treścią JSON i tokenem dostępu w nagłówku `Authorization: Bearer`.

EMS-ESP 3.8.3 i nowsze odpowiada `429 Too Many Requests` na żądanie GET, które nadejdzie wcześniej niż 50 ms po poprzednim wywołaniu API. Szablon dlatego czeka 60 ms przed każdym GET i przy 429 jeden raz powtarza żądanie po 200 ms. Inny klient, który odpytuje API EMS-ESP w tym samym czasie (na przykład drugi system automatyki domowej), nadal może sporadycznie wywołać powtórzenie.

> [!NOTE]
> **Dlaczego REST, a nie Modbus.** EMS-ESP oferuje także Modbus TCP (od wersji 3.7.0, tylko na płytkach z PSRAM) i MQTT. Przesunięcia rejestrów Modbus w EMS-ESP zmieniły się między stabilnymi wersjami 3.8.0 i 3.8.6, więc szablon Modbus po aktualizacji oprogramowania bramki po cichu odczytywałby inne wartości. REST API adresuje wartości po nazwie — encja o zmienionej nazwie kończy się widocznym błędem urządzenia.

## Rozwiązywanie problemów

### Błąd urządzenia „no value from the gateway”

Komunikat „no value from the gateway — this controller or unit does not report it; delete this device” oznacza, że podłączona pompa ciepła lub regulator nie wysyła tej encji. Sprawdź stronę Devices w EMS-ESP albo `http://<gateway-ip>/api/boiler/entities` i `http://<gateway-ip>/api/thermostat/entities`, a następnie usuń urządzenie po imporcie — pozostałe urządzenia działają dalej.

### Błąd urządzenia 404

`404` z komunikatem typu `no 'xyz' in thermostat` oznacza, że EMS-ESP nie zna encji pod tą ścieżką — regulator jej nie ma (na przykład `hc1.hpoperatingmode` w UI800) albo oprogramowanie używa innej nazwy. `unknown device` oznacza, że EMS-ESP nie wykrył na magistrali EMS pompy ciepła ani regulatora tego typu.

### Zapis kończy się błędem 401

Brak tokenu dostępu lub jest on nieprawidłowy. Skopiuj go ponownie z Settings → Security → Manage Users → ikona klucza przy użytkowniku z uprawnieniami administratora i wpisz go do zmiennej `AccessToken` modułu. Token jest wyprowadzany z nazwy użytkownika i hasła superużytkownika w Settings → Security → Security Settings.

### Błąd 429

Inny klient odpytuje API EMS-ESP w tej samej chwili. Szablon już rozkłada swoje żądania w czasie i powtarza je jeden raz; jeśli błąd się powtarza, zmniejsz częstotliwość odpytywania drugiego klienta.

### Błąd lub ostrzeżenie modułu

- „EMS-ESP reports °F” — wyłącz Fahrenheit w Settings → Application.
- „Template written for EMS-ESP 3.8.6, gateway reports …” — bramka działa na oprogramowaniu spoza serii 3.8. Zaktualizuj EMS-ESP w Settings → Version.

### Błąd licznika dotyczący nrgtotal

Jednostka bez pomiaru ciepła nie wysyła `nrgtotal`. Licznik pokazuje wtedy błąd, a atrybut Dostarczone ciepło pozostaje pusty; moc i zużycie całkowite działają dalej.

### Bramka niedostępna

1. Sprawdź diodę LED bramki: 1 niebieskie mignięcie podczas uruchamiania = magistrala EMS jeszcze nie jest podłączona (sprawdź kabel i ustawienie EMS Tx Mode), 2 czerwone mignięcia = sieć wciąż się łączy (sprawdź Settings → Network; Wi-Fi musi być 2,4 GHz WPA2), światło ciągłe = dane EMS napływają.
2. Otwórz `http://<gateway-ip>/api/system/info` w przeglądarce — jeśli odpowiada, bramka jest dostępna.
3. Jeśli adres IP się zmienił, znajdź bramkę przez nazwę mDNS `http://ems-esp.local`, a następnie ustaw w routerze rezerwację DHCP.
4. Używaj `http://` — API EMS-ESP nie obsługuje HTTPS z certyfikatami samopodpisanymi.

## Dostępne urządzenia 10

Te urządzenia pojawią się w TapHome po imporcie.

EMS-ESP pompa ciepła Moduł

Zmienne niestandardowe

`AccessToken` (string) Token dostępu EMS-ESP użytkownika z uprawnieniami administratora, wysyłany jako nagłówek Bearer przy każdym zapisie (tryb pracy, nastawy); odczyt działa bez niego, więc pusty token oznacza integrację tylko do odczytu

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.

Odczyt (moduł)

```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
```

Tryb pracy pompy ciepła Przełącznik wielowartościowy Odczyt i zapis

Tryb pracy obiegu grzewczego 1 — Wyłączony, Auto, Grzanie lub Chłodzenie; jedyny sposób na przełączenie pompy ciepła na chłodzenie, dostępny tylko z regulatorami, które go wysyłają (nie UI800)

enum numeric

Wartości / Stany: Off · Auto · Heating · Cooling

Odczyt stanu przełącznika

```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
```

Zapis stanu przełącznika

```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
```

Termostat pokojowy Termostat Odczyt i zapis

Aktualna i zadana temperatura pomieszczenia obiegu grzewczego 1 z regulatora pompy ciepła; nastawa 0–30 °C w krokach co 0,5 °C

numeric Jednostka: °C

Odczyt temperatury

```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));
```

Odczyt (moduł)

```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
```

Odczyt temperatury zadanej

```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));
```

Zapis temperatury zadanej

```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
```

Temperatura chłodzenia Zmienna Odczyt i zapis

Nastawa temperatury chłodzenia obiegu grzewczego 1, regulowana od −1 do 30 °C w krokach co 0,5 °C; dostępna tylko z regulatorami, które ją wysyłają

numeric Jednostka: °C

Odczyt

```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
```

Zapis

```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
```

Praca sprężarki Przełącznik wielowartościowy Tylko do odczytu

Stan tylko do odczytu, co robi sprężarka — Wyłączona, Grzanie, Chłodzenie, Ciepła woda, Basen, Grzanie basenu, Odszranianie lub Alarm sprężarki

enum numeric

Wartości / Stany: Off · Heating · Cooling · Hot Water · Pool · Pool Heating · Defrost · Compressor Alarm

Odczyt stanu przełącznika

```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
```

Sprężarka pracuje Kontakt reed Tylko do odczytu

boolean

Odczyt

```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
```

Temperatura zewnętrzna Czujnik temperatury Tylko do odczytu

numeric Jednostka: °C

Odczyt temperatury

```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
```

Temperatura zasilania Czujnik temperatury Tylko do odczytu

numeric Jednostka: °C

Odczyt temperatury

```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
```

Temperatura powrotu Czujnik temperatury Tylko do odczytu

numeric Jednostka: °C

Odczyt temperatury

```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
```

Licznik energii elektrycznej Licznik energii Tylko do odczytu

Aktualna moc elektryczna sprężarki (kW) i całkowite zużycie energii elektrycznej pompy ciepła (kWh)

numeric Jednostka: W / kWh

Atrybuty serwisowe

|                           |                                                                                                            |
|---------------------------|------------------------------------------------------------------------------------------------------------|
| Dostarczone ciepło \[kWh] | Całkowita energia cieplna dostarczona przez pompę ciepła — moc cieplna, a nie zużycie energii elektrycznej |

Odczyt całkowitego zużycia

```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));
```

Odczyt zapotrzebowania

```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);
```

Odczyt (moduł)

```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
```

Atrybuty serwisowe

Heat delivered \[kWh]

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

Ciepła woda użytkowa Termostat Odczyt i zapis

Aktualna i zadana temperatura ciepłej wody pompy ciepła; nastawa jest wysyłana w pełnych stopniach, a pompa ciepła stosuje własne ograniczenia

numeric Jednostka: °C

Odczyt temperatury

```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));
```

Odczyt (moduł)

```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
```

Odczyt temperatury zadanej

```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));
```

Zapis temperatury zadanej

```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
```

**Połączenie:** Packet Parser → HTTP • Hostname: `ems-esp.local`

Możliwe ulepszenia (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

## Parametry importu

Te wartości podajesz podczas importu pliku XML.

| Pytanie w aplikacji                                                              | Domyślnie           |
|----------------------------------------------------------------------------------|---------------------|
| EMS-ESP IP address                                                               | Podaj przy imporcie |
| EMS-ESP access token (admin user, Settings → Security → Manage Users → key icon) | Podaj przy imporcie |

## Źródła

- 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

## Powiązana dokumentacja

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

