TapHome

Shelly EM MQTT

Packet Parser → MQTT
Přidal
Poslední aktualizace: 06. 2026
Shelly EM MQTT

Shelly EM je jednofázový elektroměr se dvěma nezávislými měřicími kanály a 2A reléovým výstupem pro ovládání stykače. Každý kanál se připojuje k externímu proudovému transformátoru (CT svorce) – dostupnému v 50A a 120A variantách – což umožňuje neinvazivní sledování dvou samostatných obvodů současně. Tato šablona se připojuje k zařízení přes MQTT broker v lokální síti. Cloudové připojení není potřeba.

Šablona vytváří tři zařízení: dva elektroměry (jeden na CT kanál) sledující kumulativní spotřebu energie a spínač pro stykačové relé.

Konfigurace

Device ID

Shelly EM používá Device ID ve formátu shellyem-XXXXXX, kde XXXXXX je posledních 6 znaků MAC adresy v hexadecimálním formátu (např. shellyem-B929CC). Při importu šablony zadejte pouze hexadecimální část (např. B929CC) do parametru Device ID.

Device ID najdete:

  • Ve webovém rozhraní Shelly: Settings > Device Info
  • Přes API: GET http://<device-ip>/settings – pole mqtt.id

Toto zařízení podporuje mDNS discovery. Místo IP adresy můžete při konfiguraci MQTT brokeru použít hostname shellyem-{MAC}.local. Nahraďte {MAC} plnou MAC adresou v hexadecimálním formátu (např. shellyem-b929cc.local). Použití hostname předchází problémům s konektivitou při změně IP adresy zařízení.

Nastavení MQTT

Před importem šablony aktivujte MQTT na zařízení Shelly EM:

  1. Otevřete webové rozhraní Shelly na http://<device-ip>
  2. Přejděte do Internet & Security > Advanced — Developer Settings
  3. Zaškrtněte Enable action execution via MQTT
  4. Do pole Server zadejte adresu MQTT brokeru ve formátu broker-ip:1883
  5. Stiskněte SAVE

Na zařízeních Shelly Gen1 aktivace MQTT deaktivuje Shelly Cloud. Obě funkce nemohou běžet současně.

Nastavení šablony

Po importu šablony v TapHome:

  1. Nastavte MQTT Broker IP na adresu vašeho MQTT brokeru
  2. Nastavte MQTT Broker Port (výchozí 1883)
  3. Nastavte Device ID na hexadecimální část Device ID zařízení Shelly EM (např. B929CC)

Modul odebírá topic shellies/# a listener skripty na každém zařízení filtrují zprávy podle nakonfigurovaného Device ID.

Možnosti zařízení

Měření energie (na kanál)

Každý kanál je v TapHome vystaven jako nezávislé zařízení Elektroměr. Listener skript odebírá dva MQTT topicy na kanál:

TopicJednotkaPopis
emeter/{i}/energywatt-minutyKumulativní energie od posledního restartu – dělená 60 000 pro převod na kWh
emeter/{i}/totalWhTrvalá celková spotřebovaná energie – přežije restarty

Šablona ukládá obě hodnoty: Ed (energie z topicu watt-minut, převedená na kWh) a To (celková spotřeba ve Wh z perzistentního topicu).

Topic energy se při restartu zařízení vynuluje. Pro trvalé sledování energie šablona čte i topic total, který přežije restarty.

Každý kanál také vystavuje servisní atribut Napětí, který čte efektivní síťové napětí z MQTT topicu emeter/{i}/voltage.

Skripty readtotalconsumption a readdemand jsou zakomentovaný šablonový boilerplate – veškeré údaje o energii přicházejí přes MQTT listener. To znamená, že šablona neposkytuje okamžité odečty výkonu (W). Sleduje se pouze kumulativní energie (kWh) a celková spotřeba (Wh). Okamžitý činný výkon je dostupný přes MQTT topic emeter/{i}/power, ale tato šablona jej neodebírá.

Stykačové relé

Reléový výstup je v TapHome vystaven jako spínač. Relé je dimenzováno na 2A / 230 VAC – je určeno pouze pro ovládání stykače, nikoli pro přímé spínání zátěže.

  • Čtení: odebírá topic shellies/shellyem-{id}/relay/0 – payload on = zapnuto, off = vypnuto
  • Zápis: publikuje on nebo off do shellies/shellyem-{id}/relay/0/command

Relé je dimenzováno pouze na 2A. Pro zátěže překračující tento limit vždy použijte externí stykač. Přímé připojení výkonových zátěží poškodí relé.

Řešení problémů

Žádné údaje o energii
  1. Ověřte, že MQTT je aktivováno ve webovém rozhraní Shelly (Internet & Security > Advanced – MQTT)
  2. Zkontrolujte, že adresa a port MQTT brokeru jsou správné v nastavení zařízení Shelly i modulu TapHome
  3. Zkontrolujte, že vlastní proměnná Device ID přesně odpovídá Device ID zařízení Shelly (např. B929CC)
  4. Pomocí MQTT klienta (např. MQTT Explorer) odebírejte topic shellies/# a ověřte, že zařízení publikuje topicy emeter/0/energy a emeter/1/energy
Údaje pouze z jednoho kanálu
  1. Ověřte, že CT svorka je připojena do správného 3,5mm jacku (kanál 0 nebo kanál 1)
  2. Zkontrolujte, že měřeným vodičem protéká proud – CT svorka musí obepínat jeden vodič, nikoli celý kabel
  3. Samostatně odebírejte topicy shellies/shellyem-{id}/emeter/0/# a shellies/shellyem-{id}/emeter/1/# a ověřte, že oba kanály publikují údaje
Relé nereaguje
  1. Zkontrolujte, že Shelly EM je napájeno a připojeno k MQTT brokeru
  2. Manuálně publikujte on nebo off do shellies/shellyem-{id}/relay/0/command přes MQTT klienta a otestujte funkci relé nezávisle na TapHome
  3. Ověřte správné zapojení reléového výstupu (zkontrolujte označení svorek na zařízení)

Zařízení Shelly Gen1 nepodporují MQTT přes TLS. Komunikace mezi zařízením a MQTT brokerem je nešifrovaná (plain MQTT, port 1883). Ujistěte se, že MQTT broker je v důvěryhodné lokální síti.

Jak nainstalovat v TapHome

Předpoklady

  • Zařízení Shelly připojené k Wi-Fi (pokud ještě ne, podívejte se na návod na HTTP připojení)
  • MQTT broker běžící ve vaší lokální síti (např. Mosquitto, Home Assistant nebo vestavěný broker TapHome)
  • TapHome CCU ve stejné síti jako broker

Na zařízeních Gen1 povolení MQTT vypne Shelly Cloud. Obojí nemůže běžet současně. Na zařízeních Gen2/Plus toto omezení neplatí.

Krok 1 — Povolte MQTT na zařízení Shelly

Zařízení Gen1 (Shelly 1, 1PM, 2.5, EM, 3EM, Plug S, RGBW2, Dimmer, TRV…)

  1. Otevřete webové rozhraní Shelly: http://<device-ip>/
  2. Přejděte na Internet & SecurityAdvanced — MQTT
  3. Povolte MQTT
  4. Nastavte MQTT Server: <broker-ip>:<port> (např. 192.168.1.10:1883)
  5. Volitelně nastavte MQTT User a MQTT Password, pokud váš broker vyžaduje autentifikaci
  6. Klikněte na Save — zařízení se restartuje a připojí k brokeru

Zařízení Gen2 / Plus (Shelly Plus 1, Plus 1PM, Plus 2PM, Plus Plug S, Plus H&T, Pro 3EM…)

  1. Otevřete webové rozhraní Shelly: http://<device-ip>/
  2. Přejděte na SettingsMQTT
  3. Povolte MQTT
  4. Nastavte Server: <broker-ip>:<port> (např. 192.168.1.10:1883)
  5. Client ID je předvyplněné ID zařízení (např. shellyplus1pm-AABBCCDDEE) — ponechte tak, pokud nemáte konkrétní důvod ke změně
  6. Klikněte na Save a restartujte zařízení

Pro ověření funkčnosti MQTT použijte MQTT klienta (např. MQTT Explorer) a přihlaste se k odběru shellies/# (Gen1) nebo <device-id>/# (Gen2). Měli byste vidět stavové zprávy ze zařízení.

Krok 2 — Zjistěte Device ID / MQTT Client ID

Některé šablony vyžadují parametr Device ID nebo MQTT Client ID. Jde o jedinečný identifikátor používaný v MQTT topicích.

  • Gen1: nachází se na štítku jako MAC adresa (např. AABBCCDDEE). Device ID = shelly<model>-<mac>, např. shelly1pm-AABBCCDDEE
  • Gen2/Plus: nachází se ve webovém rozhraní Shelly v části SettingsDevice InfoDevice ID, nebo na štítku zařízení

Krok 3 — Konfigurace v TapHome

  1. V TapHome přidejte nový modul Packet Parser (MQTT)
  2. IP Address: zadejte IP adresu MQTT brokeru (např. 192.168.1.10)
  3. Port: 1883 (výchozí; pro TLS použijte 8883)
  4. Device ID / MQTT Client ID: zadejte hodnotu z kroku 2 (pokud to šablona vyžaduje)
  5. Importujte šablonu — TapHome se automaticky přihlásí k odběru topiců zařízení

Dostupná zařízení

Shelly EM MQTT Modul
Vlastní proměnné
deviceID (string)MQTT Device ID zařízení Shelly EM — formát je 'shellyem-DEVICEID', kde DEVICEID je posledních 6 hex znaků MAC adresy (např. B929CC)
Open http://shellyIpAddress → Settings → Device Info → copy Device ID
Elektroměr - Kanál 1 Elektroměr Pouze ke čtení

Spotřeba energie na CT svorce kanálu 1 -- kumulativní energie (kWh) a celková spotřeba (Wh)

numeric Jednotka: kWh
Servisní atributy
NapětíEfektivní napětí na kanálu 1 čtené z MQTT topicu emeter/0/voltage

Elektroměr - Kanál 1

Čtení celkové spotřeby
# 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");
Čtení odběru
# 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í atributy
Voltage [V]
if parsejson(response, "Topic") = "shellies/shellyem-"+deviceID+"/emeter/0/voltage"
 return(todouble(parsejson(response, "Payload")));
end
Elektroměr - Kanál 2 Elektroměr Pouze ke čtení

Spotřeba energie na CT svorce kanálu 2 -- kumulativní energie (kWh) a celková spotřeba (Wh)

numeric Jednotka: kWh
Servisní atributy
NapětíEfektivní napětí na kanálu 2 čtené z MQTT topicu emeter/1/voltage

Elektroměr - Kanál 2

Čtení celkové spotřeby
# 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");
Čtení odběru
# 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í atributy
voltage [V]
if parsejson(response, "Topic") = "shellies/shellyem-"+deviceID+"/emeter/1/voltage"
 return(parsejson(response, "Payload"));
end
Stykačové relé Přepínač

2A reléový výstup pro ovládání stykače -- čte stav relay/0 a publikuje příkazy on/off

boolean
Hodnoty / Stavy: ON · OFF

Stykačové relé

Čtení stavu přepínače
# 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 přepínače
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
Připojení: Packet Parser → MQTT
Možná vylepšení (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 jste problém s touto šablonou zařízení?

Napište nám, co nefunguje, co chybí, nebo jak by se měla šablona chovat. Vaše zpětná vazba nám pomáhá udržet katalog přesný.

Ověřeno TapHome

Chcete to použít ve svém TapHome jádře?

Otevřete tuto šablonu v zákaznickém portálu a použijte ji ve svém domově, nebo navrhněte úpravu a odešlete ji zpět do katalogu.

Otevřít v portálu