TapHome

Shelly EM MQTT

Packet Parser → MQTT
Pridal
Posledná aktualizácia: 05. 2026
Shelly EM MQTT

Shelly EM je jednofázový elektromer s dvoma nezávislými meracími kanálmi a 2A reléovým výstupom na ovládanie stykača. Každý kanál sa pripája k externému prúdovému transformátoru (CT svorke) – dostupnému v 50A a 120A variantoch – čo umožňuje neinvazívne sledovanie dvoch samostatných obvodov súčasne. Táto šablóna sa pripája k zariadeniu cez MQTT broker v lokálnej sieti. Cloudové pripojenie nie je potrebné.

Šablóna vytvára tri zariadenia: dva elektromery (jeden na CT kanál) sledujúce kumulatívnu spotrebu energie a spínač pre stykačové relé.

Konfigurácia

Device ID

Shelly EM používa Device ID vo formáte shellyem-XXXXXX, kde XXXXXX je posledných 6 znakov MAC adresy v hexadecimálnom formáte (napr. shellyem-B929CC). Pri importe šablóny zadajte len hexadecimálnu časť (napr. B929CC) do parametra Device ID.

Device ID nájdete:

  • Vo webovom rozhraní Shelly: Settings > Device Info
  • Cez API: GET http://<device-ip>/settings – pole mqtt.id

Toto zariadenie podporuje mDNS discovery. Namiesto IP adresy môžete pri konfigurácii MQTT brokera použiť hostname shellyem-{MAC}.local. Nahraďte {MAC} plnou MAC adresou v hexadecimálnom formáte (napr. shellyem-b929cc.local). Použitie hostname predchádza problémom s konektivitou pri zmene IP adresy zariadenia.

Nastavenie MQTT

Pred importom šabl��ny aktivujte MQTT na zariadení Shelly EM:

  1. Otvorte webové rozhranie Shelly na http://<device-ip>
  2. Prejdite do Internet & Security > Advanced — Developer Settings
  3. Zaškrtnite Enable action execution via MQTT
  4. Do poľa Server zadajte adresu MQTT brokera vo formáte broker-ip:1883
  5. Stlačte SAVE

Na zariadeniach Shelly Gen1 aktivácia MQTT deaktivuje Shelly Cloud. Obe funkcie nemôžu bežať súčasne.

Nastavenie šablóny

Po importe šablóny v TapHome:

  1. Nastavte MQTT Broker IP na adresu vášho MQTT brokera
  2. Nastavte MQTT Broker Port (predvolene 1883)
  3. Nastavte Device ID na hexadecimálnu časť Device ID zariadenia Shelly EM (napr. B929CC)

Modul odoberá topic shellies/# a listener skripty na každom zariadení filtrujú správy podľa nakonfigurovaného Device ID.

Možnosti zariadenia

Meranie energie (na kanál)

Každý kanál je v TapHome vystavený ako nezávislé zariadenie Elektromer. Listener skript odoberá dva MQTT topicy na kanál:

TopicJednotkaPopis
emeter/{i}/energywatt-minútyKumulatívna energia od posledného reštartu – delená 60 000 pre prepočet na kWh
emeter/{i}/totalWhTrvalá celková spotrebovaná energia – prežije reštarty

Šablóna ukladá obe hodnoty: Ed (energia z topicu watt-minút, prepočítaná na kWh) a To (celková spotreba vo Wh z perzistentného topicu).

Topic energy sa pri reštarte zariadenia vynuluje. Pre trvalé sledovanie energie šablóna číta aj topic total, ktorý prežije reštarty.

Každý kanál tiež vystavuje servisný atribút Napätie, ktorý číta efektívne sieťové napätie z MQTT topicu emeter/{i}/voltage.

Skripty readtotalconsumption a readdemand sú zakomentované šablónové boilerplate – všetky údaje o energii prichádzajú cez MQTT listener. To znamená, že šablóna neposkytuje okamžité odčítanie výkonu (W). Sleduje sa len kumulatívna energia (kWh) a celková spotreba (Wh). Okamžitý činný výkon je dostupný cez MQTT topic emeter/{i}/power, ale táto šablóna ho neodoberá.

Stykačové relé

Reléový výstup je v TapHome vystavený ako spínač. Relé je dimenzované na 2A / 230 VAC – je určené len na ovládanie stykača, nie na priame spínanie záťaže.

  • Čítanie: odoberá topic shellies/shellyem-{id}/relay/0 – payload on = zapnuté, off = vypnuté
  • Zápis: publikuje on alebo off do shellies/shellyem-{id}/relay/0/command

Relé je dimenzované len na 2A. Na záťaže prekračujúce tento limit vždy použite externý stykač. Priame pripojenie výkonových záťaží poškodí relé.

Riešenie problémov

Žiadne údaje o energii
  1. Overte, že MQTT je aktivované vo webovom rozhraní Shelly (Internet & Security > Advanced – MQTT)
  2. Skontrolujte, že adresa a port MQTT brokera sú správne v nastaveniach zariadenia Shelly aj modulu TapHome
  3. Skontrolujte, že vlastná premenná Device ID presne zodpovedá Device ID zariadenia Shelly (napr. B929CC)
  4. Pomocou MQTT klienta (napr. MQTT Explorer) odoberajte topic shellies/# a overte, že zariadenie publikuje topicy emeter/0/energy a emeter/1/energy
Údaje len z jedného kanálu
  1. Overte, že CT svorka je pripojená do správneho 3,5mm jacku (kanál 0 alebo kanál 1)
  2. Skontrolujte, že meraným vodičom preteká prúd – CT svorka musí obopínať jeden vodič, nie celý kábel
  3. Samostatne odoberajte topicy shellies/shellyem-{id}/emeter/0/# a shellies/shellyem-{id}/emeter/1/# a overte, že oba kanály publikujú údaje
Relé nereaguje
  1. Skontrolujte, že Shelly EM je napájané a pripojené k MQTT brokeru
  2. Manuálne publikujte on alebo off do shellies/shellyem-{id}/relay/0/command cez MQTT klienta a otestujte funkciu relé nezávisle od TapHome
  3. Overte správne zapojenie reléového výstupu (skontrolujte označenie svoriek na zariadení)

Zariadenia Shelly Gen1 nepodporujú MQTT cez TLS. Komunikácia medzi zariadením a MQTT brokerom je nešifrovaná (plain MQTT, port 1883). Uistite sa, že MQTT broker je v dôveryhodnej lokálnej sieti.

Ako nainštalovať v TapHome

Predpoklady

  • Zariadenie Shelly pripojené k Wi-Fi (ak ešte nie, pozrite návod na HTTP pripojenie)
  • MQTT broker bežiaci vo vašej lokálnej sieti (napr. Mosquitto, Home Assistant alebo vstavaný broker TapHome)
  • TapHome CCU v rovnakej sieti ako broker

Na zariadeniach Gen1 povolenie MQTT vypne Shelly Cloud. Oboje nemôže bežať súčasne. Na zariadeniach Gen2/Plus toto obmedzenie neplatí.

Krok 1 — Povoľte MQTT na zariadení Shelly

Zariadenia Gen1 (Shelly 1, 1PM, 2.5, EM, 3EM, Plug S, RGBW2, Dimmer, TRV…)

  1. Otvorte webové rozhranie Shelly: http://<device-ip>/
  2. Prejdite na Internet & SecurityAdvanced — MQTT
  3. Povoľte MQTT
  4. Nastavte MQTT Server: <broker-ip>:<port> (napr. 192.168.1.10:1883)
  5. Voliteľne nastavte MQTT User a MQTT Password, ak váš broker vyžaduje autentifikáciu
  6. Kliknite na Save — zariadenie sa reštartuje a pripojí k brokeru

Zariadenia Gen2 / Plus (Shelly Plus 1, Plus 1PM, Plus 2PM, Plus Plug S, Plus H&T, Pro 3EM…)

  1. Otvorte webové rozhranie Shelly: http://<device-ip>/
  2. Prejdite na SettingsMQTT
  3. Povoľte MQTT
  4. Nastavte Server: <broker-ip>:<port> (napr. 192.168.1.10:1883)
  5. Client ID je predvyplnené ID zariadenia (napr. shellyplus1pm-AABBCCDDEE) — ponechajte tak, pokiaľ nemáte konkrétny dôvod na zmenu
  6. Kliknite na Save a reštartujte zariadenie

Na overenie funkčnosti MQTT použite MQTT klienta (napr. MQTT Explorer) a prihláste sa na odber shellies/# (Gen1) alebo <device-id>/# (Gen2). Mali by ste vidieť stavové správy zo zariadenia.

Krok 2 — Zistite Device ID / MQTT Client ID

Niektoré šablóny vyžadujú parameter Device ID alebo MQTT Client ID. Ide o jedinečný identifikátor používaný v MQTT topicoch.

  • Gen1: nachádza sa na štítku ako MAC adresa (napr. AABBCCDDEE). Device ID = shelly<model>-<mac>, napr. shelly1pm-AABBCCDDEE
  • Gen2/Plus: nachádza sa vo webovom rozhraní Shelly v časti SettingsDevice InfoDevice ID, alebo na štítku zariadenia

Krok 3 — Konfigurácia v TapHome

  1. V TapHome pridajte nový modul Packet Parser (MQTT)
  2. IP Address: zadajte IP adresu MQTT brokera (napr. 192.168.1.10)
  3. Port: 1883 (predvolený; pre TLS použite 8883)
  4. Device ID / MQTT Client ID: zadajte hodnotu z kroku 2 (ak to šablóna vyžaduje)
  5. Importujte šablónu — TapHome sa automaticky prihlási na odber topicov zariadenia

Dostupné zariadenia

Shelly EM MQTT Modul
Vlastné premenné
deviceID (string)MQTT Device ID zariadenia Shelly EM — formát je 'shellyem-DEVICEID', kde DEVICEID je posledných 6 hex znakov MAC adresy (napr. B929CC)
Open http://shellyIpAddress → Settings → Device Info → copy Device ID
Elektromer - Kanál 1 Elektromer Len na čítanie

Spotreba energie na CT svorke kanálu 1 -- kumulatívna energia (kWh) a celková spotreba (Wh)

numeric Jednotka: kWh
Servisné atribúty
NapätieEfektívne napätie na kanáli 1 čítané z MQTT topicu emeter/0/voltage

Elektromer - Kanál 1

Čítanie celkovej spotreby
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");
Čítanie odberu
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");
Listener
VAR whatEd := "shellies/shellyem-"+deviceID+"/emeter/0/energy";
VAR whatTo := "shellies/shellyem-"+deviceID+"/emeter/0/total";

IF (whatEd = RECEIVEDMSG.TOPIC)
 Ed := todouble(TOSTRING(RECEIVEDMSG.PAYLOAD))/60000;
END
IF (whatTo = RECEIVEDMSG.TOPIC)
 To := todouble(TOSTRING(RECEIVEDMSG.PAYLOAD));
END
Servisné atribúty
Voltage [V]
if parsejson(response, "Topic") = "shellies/shellyem-"+deviceID+"/emeter/0/voltage"
 return(todouble(parsejson(response, "Payload")));
end
Elektromer - Kanál 2 Elektromer Len na čítanie

Spotreba energie na CT svorke kanálu 2 -- kumulatívna energia (kWh) a celková spotreba (Wh)

numeric Jednotka: kWh
Servisné atribúty
NapätieEfektívne napätie na kanáli 2 čítané z MQTT topicu emeter/1/voltage

Elektromer - Kanál 2

Čítanie celkovej spotreby
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");
Čítanie odberu
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");
Listener
VAR whatEd := "shellies/shellyem-"+deviceID+"/emeter/1/energy";
VAR whatTo := "shellies/shellyem-"+deviceID+"/emeter/1/total";

IF (whatEd = RECEIVEDMSG.TOPIC)
 Ed := todouble(TOSTRING(RECEIVEDMSG.PAYLOAD))/60000;
END
IF (whatTo = RECEIVEDMSG.TOPIC)
 To := todouble(TOSTRING(RECEIVEDMSG.PAYLOAD));
END
Servisné atribúty
voltage [V]
if parsejson(response, "Topic") = "shellies/shellyem-"+deviceID+"/emeter/1/voltage"
 return(parsejson(response, "Payload"));
end
Stykačové relé Prepínač

2A reléový výstup na ovládanie stykača -- číta stav relay/0 a publikuje príkazy on/off

boolean
Hodnoty / Stavy: ON · OFF

Stykačové relé

Čítanie stavu prepínača
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");
Zápis stavu prepínača
MQTTPUBLISH("shellies/shellyem-" + deviceID + "/relay/0/command",if(St = 1, "on","off"));

# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/set/value=" + St);
# IF response.IsSuccess = false
#  ADDERROR(response.StatusCode);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/setValue", "GET", "value=" + St, "header1:value1", "header2:value2", ...);\r
# Or VAR request := HTTPREQUEST("/example/setValue");
# request.Method := "PUT";
# VAR response := SENDHTTPREQUEST(request);
#r
#
# Send TCP, UDP data:
# VAR data1 := "{\"name\":\"John\", \"age\":" + St + "}";
# SENDDATA(data1);
# VAR data2 := TOBYTES("{\"name\":\"John\", \"age\":" + St + "}", "iso-8859-1");
# SENDDATA(data2);
# You can process received TCP or UDP data in the Listener script
#
#
# Upload data to FTP:
# FTPUPLOAD("filePath", "somedata=" + St, "write"); # use "append" mode to append data to existing file
Listener
VAR whatSt := "shellies/shellyem-"+deviceID+"/relay/0";
IF (whatSt = RECEIVEDMSG.TOPIC)
 IF (TOSTRING(RECEIVEDMSG.PAYLOAD) = "on")
  St := 1;
 ELSE
  St := 0;
 END
END
Pripojenie: Packet Parser → MQTT
Možné vylepšenia (5)
  • Active Power — Instantaneous active power in W per channel. Available via MQTT but template listener scripts do not subscribe to it — readdemand is commented-out boilerplate.
  • Reactive Power — Instantaneous reactive power in VAR per channel. Available via MQTT topic.
  • Total Energy Returned — Total energy returned to grid in Wh per channel. Useful for solar/bidirectional setups.
  • Connection Status — LWT topic — true on connect, false on disconnect. Could detect device offline state.
  • Reset Energy Data — Payload 'reset_data' resets all accumulated energy counters on both channels.

Zdroje

Našli ste problém s touto šablónou zariadenia?

Napíšte nám, čo nefunguje, čo chýba, alebo ako by sa mala šablóna správať. Vaša spätná väzba nám pomáha udržiavať katalóg presný.

Overené TapHomom

Chcete to použiť vo svojom TapHome jadre?

Otvorte túto šablónu v Customer Portali a aplikujte ju na svoj domov, alebo navrhnite zmenu a odošlite ju späť do katalógu.

Otvoriť v portáli