TapHome

Shelly EM MQTT

Packet Parser → MQTT
Eingereicht von
Zuletzt aktualisiert: 06. 2026
Shelly EM MQTT

Der Shelly EM ist ein einphasiger Energiezähler mit zwei unabhängigen Messkanälen und einem 2A-Relaisausgang zur Schützsteuerung. Jeder Kanal wird an einen externen Stromwandler (CT-Klemme) angeschlossen – erhältlich in 50A- und 120A-Varianten – was die nicht-invasive Überwachung von zwei separaten Stromkreisen gleichzeitig ermöglicht. Diese Vorlage verbindet sich über einen MQTT-Broker im lokalen Netzwerk mit dem Gerät. Eine Cloud-Verbindung ist nicht erforderlich.

Die Vorlage erstellt drei Geräte: zwei Stromzähler (einer pro CT-Kanal) zur Erfassung des kumulativen Energieverbrauchs und einen Schalter für das Schützrelais.

Konfiguration

Device ID

Der Shelly EM verwendet eine Device ID im Format shellyem-XXXXXX, wobei XXXXXX die letzten 6 Zeichen der MAC-Adresse in Hexadezimalformat sind (z. B. shellyem-B929CC). Beim Import der Vorlage geben Sie nur den Hexadezimalteil (z. B. B929CC) im Parameter Device ID ein.

Die Device ID finden Sie:

  • In der Shelly-Weboberfläche: Settings > Device Info
  • Über die API: GET http://<device-ip>/settings – Feld mqtt.id

Dieses Gerät unterstützt mDNS Discovery. Sie können bei der MQTT-Broker-Konfiguration den Hostnamen shellyem-{MAC}.local anstelle einer IP-Adresse verwenden. Ersetzen Sie {MAC} durch die vollständige MAC-Adresse in Hexadezimalformat (z. B. shellyem-b929cc.local). Die Verwendung eines Hostnamens verhindert Konnektivitätsprobleme bei Änderung der IP-Adresse des Geräts.

MQTT-Einrichtung

Aktivieren Sie vor dem Import der Vorlage MQTT auf dem Shelly EM:

  1. Öffnen Sie die Shelly-Weboberfläche unter http://<device-ip>
  2. Navigieren Sie zu Internet & Security > Advanced — Developer Settings
  3. Aktivieren Sie Enable action execution via MQTT
  4. Geben Sie im Feld Server die MQTT-Broker-Adresse im Format broker-ip:1883 ein
  5. Klicken Sie auf SAVE

Bei Shelly Gen1-Geräten deaktiviert die Aktivierung von MQTT die Shelly Cloud. Beide Funktionen können nicht gleichzeitig betrieben werden.

Vorlagen-Einrichtung

Nach dem Import der Vorlage in TapHome:

  1. Setzen Sie die MQTT Broker IP auf die Adresse Ihres MQTT-Brokers
  2. Setzen Sie den MQTT Broker Port (Standard 1883)
  3. Setzen Sie die Device ID auf den Hexadezimalteil der Device ID des Shelly EM (z. B. B929CC)

Das Modul abonniert shellies/# und die Listener-Skripte auf jedem Gerät filtern Nachrichten nach der konfigurierten Device ID.

Gerätefunktionen

Energiemessung (pro Kanal)

Jeder Kanal wird in TapHome als unabhängiges Stromzähler-Gerät dargestellt. Das Listener-Skript abonniert zwei MQTT-Topics pro Kanal:

TopicEinheitBeschreibung
emeter/{i}/energyWattminutenKumulative Energie seit dem letzten Neustart – geteilt durch 60 000 zur Umrechnung in kWh
emeter/{i}/totalWhPersistenter Gesamtenergieverbrauch – übersteht Neustarts

Die Vorlage speichert beide Werte: Ed (Energie aus dem Wattminuten-Topic, umgerechnet in kWh) und To (Gesamtverbrauch in Wh aus dem persistenten Topic).

Das Topic energy wird beim Neustart des Geräts auf Null zurückgesetzt. Für die persistente Energieerfassung liest die Vorlage auch das Topic total, das Neustarts übersteht.

Jeder Kanal stellt außerdem ein Spannung-Serviceattribut bereit, das die RMS-Netzspannung aus dem MQTT-Topic emeter/{i}/voltage ausliest.

Die Skripte readtotalconsumption und readdemand sind auskommentierter Vorlagen-Boilerplate – alle Energiedaten kommen über den MQTT-Listener. Das bedeutet, die Vorlage liefert keine Echtzeit-Leistungsmessungen (W). Es werden nur kumulative Energie (kWh) und Gesamtverbrauch (Wh) erfasst. Die momentane Wirkleistung ist über das MQTT-Topic emeter/{i}/power verfügbar, wird aber von dieser Vorlage nicht abonniert.

Schützrelais

Der Relaisausgang wird in TapHome als Schalter dargestellt. Das Relais ist für 2A / 230 VAC ausgelegt – es ist nur zur Schützsteuerung vorgesehen, nicht zum direkten Schalten von Lasten.

  • Lesen: abonniert shellies/shellyem-{id}/relay/0 – Payload on = ein, off = aus
  • Schreiben: veröffentlicht on oder off auf shellies/shellyem-{id}/relay/0/command

Das Relais ist nur für 2A ausgelegt. Verwenden Sie bei Lasten über diesem Wert immer ein externes Schütz. Der direkte Anschluss von Hochleistungslasten beschädigt das Relais.

Fehlerbehebung

Keine Energiedaten
  1. Überprüfen Sie, ob MQTT in der Shelly-Weboberfläche aktiviert ist (Internet & Security > Advanced – MQTT)
  2. Prüfen Sie, ob die MQTT-Broker-Adresse und der Port sowohl in den Shelly-Geräteeinstellungen als auch in den TapHome-Moduleinstellungen korrekt sind
  3. Prüfen Sie, ob die benutzerdefinierte Variable Device ID genau mit der Device ID des Shelly übereinstimmt (z. B. B929CC)
  4. Abonnieren Sie mit einem MQTT-Client (z. B. MQTT Explorer) das Topic shellies/# und überprüfen Sie, ob das Gerät die Topics emeter/0/energy und emeter/1/energy veröffentlicht
Daten nur von einem Kanal
  1. Überprüfen Sie, ob die CT-Klemme in die richtige 3,5-mm-Buchse eingesteckt ist (Kanal 0 oder Kanal 1)
  2. Prüfen Sie, ob Strom durch den überwachten Leiter fließt – die CT-Klemme muss einen einzelnen Leiter umschließen, nicht das gesamte Kabel
  3. Abonnieren Sie die Topics shellies/shellyem-{id}/emeter/0/# und shellies/shellyem-{id}/emeter/1/# separat und überprüfen Sie, ob beide Kanäle Daten veröffentlichen
Relais reagiert nicht
  1. Prüfen Sie, ob der Shelly EM mit Strom versorgt ist und mit dem MQTT-Broker verbunden ist
  2. Veröffentlichen Sie manuell on oder off auf shellies/shellyem-{id}/relay/0/command über einen MQTT-Client, um die Relaisfunktion unabhängig von TapHome zu testen
  3. Überprüfen Sie die korrekte Verdrahtung des Relaisausgangs (kontrollieren Sie die Klemmenbeschriftung am Gerät)

Shelly Gen1-Geräte unterstützen kein MQTT über TLS. Die Kommunikation zwischen dem Gerät und dem MQTT-Broker ist unverschlüsselt (Plain MQTT, Port 1883). Stellen Sie sicher, dass der MQTT-Broker sich in einem vertrauenswürdigen lokalen Netzwerk befindet.

Installation in TapHome

Voraussetzungen

  • Shelly-Gerät mit Wi-Fi verbunden (siehe HTTP-Verbindungsanleitung, falls noch nicht geschehen)
  • MQTT-Broker in Ihrem lokalen Netzwerk aktiv (z. B. Mosquitto, Home Assistant oder der integrierte TapHome-Broker)
  • TapHome CCU im selben Netzwerk wie der Broker

Auf Gen1-Geräten deaktiviert das Aktivieren von MQTT die Shelly Cloud. Beides kann nicht gleichzeitig betrieben werden. Auf Gen2/Plus-Geräten gilt diese Einschränkung nicht.

Schritt 1 — MQTT auf dem Shelly-Gerät aktivieren

Gen1-Geräte (Shelly 1, 1PM, 2.5, EM, 3EM, Plug S, RGBW2, Dimmer, TRV…)

  1. Öffnen Sie die Shelly-Weboberfläche: http://<device-ip>/
  2. Navigieren Sie zu Internet & SecurityAdvanced — MQTT
  3. Aktivieren Sie MQTT
  4. Setzen Sie MQTT Server: <broker-ip>:<port> (z. B. 192.168.1.10:1883)
  5. Optional setzen Sie MQTT User und MQTT Password, falls Ihr Broker eine Authentifizierung erfordert
  6. Klicken Sie auf Save — das Gerät startet neu und verbindet sich mit dem Broker

Gen2 / Plus-Geräte (Shelly Plus 1, Plus 1PM, Plus 2PM, Plus Plug S, Plus H&T, Pro 3EM…)

  1. Öffnen Sie die Shelly-Weboberfläche: http://<device-ip>/
  2. Navigieren Sie zu SettingsMQTT
  3. Aktivieren Sie MQTT
  4. Setzen Sie Server: <broker-ip>:<port> (z. B. 192.168.1.10:1883)
  5. Die Client ID ist mit der Geräte-ID vorausgefüllt (z. B. shellyplus1pm-AABBCCDDEE) — belassen Sie sie so, es sei denn, Sie haben einen bestimmten Grund zur Änderung
  6. Klicken Sie auf Save und starten Sie das Gerät neu

Um zu überprüfen, ob MQTT funktioniert, verwenden Sie einen MQTT-Client (z. B. MQTT Explorer) und abonnieren Sie shellies/# (Gen1) oder <device-id>/# (Gen2). Sie sollten Statusnachrichten vom Gerät sehen.

Schritt 2 — Device ID / MQTT Client ID ermitteln

Einige Vorlagen erfordern einen Parameter Device ID oder MQTT Client ID. Dies ist die eindeutige Kennung, die in MQTT-Topics verwendet wird.

  • Gen1: auf dem Etikett als MAC-Adresse zu finden (z. B. AABBCCDDEE). Device ID = shelly<model>-<mac>, z. B. shelly1pm-AABBCCDDEE
  • Gen2/Plus: in der Shelly-Weboberfläche unter SettingsDevice InfoDevice ID zu finden, oder auf dem Geräteetikett

Schritt 3 — Konfiguration in TapHome

  1. Fügen Sie in TapHome ein neues Modul Packet Parser (MQTT) hinzu
  2. IP Address: Geben Sie die IP-Adresse des MQTT-Brokers ein (z. B. 192.168.1.10)
  3. Port: 1883 (Standard; verwenden Sie 8883 für TLS)
  4. Device ID / MQTT Client ID: Geben Sie den Wert aus Schritt 2 ein (falls von der Vorlage benötigt)
  5. Importieren Sie die Vorlage — TapHome abonniert automatisch die Geräte-Topics

Verfügbare Geräte

Shelly EM MQTT Modul
Benutzerdefinierte Variablen
deviceID (string)MQTT Device ID des Shelly EM — Format ist 'shellyem-DEVICEID', wobei DEVICEID die letzten 6 Hex-Zeichen der MAC-Adresse sind (z. B. B929CC)
Open http://shellyIpAddress → Settings → Device Info → copy Device ID
Stromzähler - Kanal 1 Stromzähler Nur lesen

Energieverbrauch am CT-Klemme Kanal 1 -- kumulative Energie (kWh) und Gesamtverbrauch (Wh)

numeric Einheit: kWh
Serviceattribute
SpannungRMS-Spannung auf Kanal 1, gelesen aus dem MQTT-Topic emeter/0/voltage

Stromzähler - Kanal 1

Gesamtverbrauch lesen
# 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");
Bedarf lesen
# 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
Serviceattribute
Voltage [V]
if parsejson(response, "Topic") = "shellies/shellyem-"+deviceID+"/emeter/0/voltage"
 return(todouble(parsejson(response, "Payload")));
end
Stromzähler - Kanal 2 Stromzähler Nur lesen

Energieverbrauch am CT-Klemme Kanal 2 -- kumulative Energie (kWh) und Gesamtverbrauch (Wh)

numeric Einheit: kWh
Serviceattribute
SpannungRMS-Spannung auf Kanal 2, gelesen aus dem MQTT-Topic emeter/1/voltage

Stromzähler - Kanal 2

Gesamtverbrauch lesen
# 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");
Bedarf lesen
# 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
Serviceattribute
voltage [V]
if parsejson(response, "Topic") = "shellies/shellyem-"+deviceID+"/emeter/1/voltage"
 return(parsejson(response, "Payload"));
end
Schützrelais Schalter

2A-Relaisausgang zur Schützsteuerung -- liest relay/0-Status und veröffentlicht Ein/Aus-Befehle

boolean
Werte / Zustände: ON · OFF

Schützrelais

Schaltzustand lesen
# 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");
Schaltzustand schreiben
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
Verbindung: Packet Parser → MQTT
Mögliche Verbesserungen (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.

Quellen

Haben Sie ein Problem mit dieser Gerätevorlage gefunden?

Sagen Sie uns, was nicht funktioniert, was fehlt oder wie sich die Vorlage verhalten sollte. Ihr Feedback hilft uns, den Katalog genau zu halten.

Von TapHome verifiziert

Möchtest du das in deinem TapHome Core verwenden?

Öffne diese Vorlage im Kundenportal, um sie auf eine deiner Wohnungen anzuwenden, oder entwirf eine Anpassung und reiche sie an den Katalog ein.

Im Portal öffnen