TapHome

Shelly EM MQTT

Packet Parser → MQTT
Dodane przez
Ostatnia aktualizacja: 06. 2026
Shelly EM MQTT

Shelly EM to jednofazowy licznik energii z dwoma niezależnymi kanałami pomiarowymi i wyjściem przekaźnikowym 2A do sterowania stycznikiem. Każdy kanał łączy si�� z zewnętrznym przekładnikiem prądowym (klamrą CT) – dostępnym w wariantach 50A i 120A – umożliwiając nieinwazyjny monitoring dwóch oddzielnych obwodów jednocześnie. Ten szablon łączy się z urządzeniem przez broker MQTT w sieci lokalnej. Połączenie z chmurą nie jest wymagane.

Szablon tworzy trzy urządzenia: dwa liczniki energii (po jednym na kanał CT) śledzące kumulatywne zużycie energii oraz przełącznik dla przekaźnika stycznikowego.

Konfiguracja

Device ID

Shelly EM używa Device ID w formacie shellyem-XXXXXX, gdzie XXXXXX to ostatnie 6 znaków adresu MAC w formacie szesnastkowym (np. shellyem-B929CC). Podczas importu szablonu wpisz tylko część szesnastkową (np. B929CC) w parametrze Device ID.

Device ID można znaleźć:

  • W interfejsie webowym Shelly: Settings > Device Info
  • Przez API: GET http://<device-ip>/settings – pole mqtt.id

To urządzenie obsługuje odkrywanie mDNS. Zamiast adresu IP możesz użyć nazwy hosta shellyem-{MAC}.local podczas konfiguracji brokera MQTT. Zamień {MAC} na pełny adres MAC w formacie szesnastkowym (np. shellyem-b929cc.local). Użycie nazwy hosta zapobiega problemom z łącznością przy zmianie adresu IP urządzenia.

Konfiguracja MQTT

Przed importem szablonu włącz MQTT na urządzeniu Shelly EM:

  1. Otwórz interfejs webowy Shelly pod adresem http://<device-ip>
  2. Przejdź do Internet & Security > Advanced — Developer Settings
  3. Zaznacz Enable action execution via MQTT
  4. W polu Server wpisz adres brokera MQTT w formacie broker-ip:1883
  5. Naciśnij SAVE

W urządzeniach Shelly Gen1 włączenie MQTT wyłącza Shelly Cloud. Obie funkcje nie mogą działać jednocześnie.

Konfiguracja szablonu

Po zaimportowaniu szablonu w TapHome:

  1. Ustaw MQTT Broker IP na adres Twojego brokera MQTT
  2. Ustaw MQTT Broker Port (domyślnie 1883)
  3. Ustaw Device ID na szesnastkową część Device ID urządzenia Shelly EM (np. B929CC)

Moduł subskrybuje topic shellies/#, a skrypty listener na każdym urządzeniu filtrują wiadomości według skonfigurowanego Device ID.

Możliwości urządzenia

Pomiar energii (na kanał)

Każdy kanał jest w TapHome widoczny jako niezależne urządzenie Licznik energii. Skrypt listener subskrybuje dwa topiki MQTT na kanał:

TopicJednostkaOpis
emeter/{i}/energywatominutyKumulatywna energia od ostatniego restartu – dzielona przez 60 000 do konwersji na kWh
emeter/{i}/totalWhTrwałe całkowite zużycie energii – przetrwa restarty

Szablon przechowuje obie wartości: Ed (energia z topiku watominut, skonwertowana na kWh) i To (całkowite zużycie w Wh z trwałego topiku).

Topic energy zeruje się przy restarcie urządzenia. Dla trwałego śledzenia energii szablon odczytuje również topic total, który przetrwa restarty.

Każdy kanał udostępnia również atrybut serwisowy Napięcie, który odczytuje napięcie sieciowe RMS z topiku MQTT emeter/{i}/voltage.

Skrypty readtotalconsumption i readdemand to zakomentowany boilerplate szablonu – wszystkie dane energetyczne przychodzą przez listener MQTT. Oznacza to, że szablon nie zapewnia odczytów mocy chwilowej (W). Śledzona jest tylko energia kumulatywna (kWh) i całkowite zużycie (Wh). Chwilowa moc czynna jest dostępna przez topic MQTT emeter/{i}/power, ale ten szablon go nie subskrybuje.

Przekaźnik stycznikowy

Wyjście przekaźnikowe jest widoczne jako przełącznik w TapHome. Przekaźnik jest wymiarowany na 2A / 230 VAC – jest przeznaczony wyłącznie do sterowania stycznikiem, nie do bezpośredniego przełączania obciążeń.

  • Odczyt: subskrybuje topic shellies/shellyem-{id}/relay/0 – payload on = włączony, off = wyłączony
  • Zapis: publikuje on lub off do shellies/shellyem-{id}/relay/0/command

Przekaźnik jest wymiarowany tylko na 2A. Dla obciążeń przekraczających ten limit zawsze używaj zewnętrznego stycznika. Bezpośrednie podłączenie obciążeń dużej mocy uszkodzi przekaźnik.

Rozwiązywanie problemów

Brak danych energetycznych
  1. Sprawdź, czy MQTT jest włączone w interfejsie webowym Shelly (Internet & Security > Advanced – MQTT)
  2. Sprawdź, czy adres i port brokera MQTT są poprawne zarówno w ustawieniach urządzenia Shelly, jak i modułu TapHome
  3. Sprawdź, czy zmienna niestandardowa Device ID dokładnie odpowiada Device ID urządzenia Shelly (np. B929CC)
  4. Za pomocą klienta MQTT (np. MQTT Explorer) zasubskrybuj topic shellies/# i sprawdź, czy urządzenie publikuje topiki emeter/0/energy i emeter/1/energy
Dane tylko z jednego kanału
  1. Sprawdź, czy klamra CT jest podłączona do właściwego gniazda 3,5 mm (kanał 0 lub kanał 1)
  2. Sprawdź, czy przez monitorowany przewód płynie prąd – klamra CT musi obejmować pojedynczy przewód, nie cały kabel
  3. Osobno zasubskrybuj topiki shellies/shellyem-{id}/emeter/0/# i shellies/shellyem-{id}/emeter/1/# i sprawdź, czy oba kanały publikują dane
Przekaźnik nie reaguje
  1. Sprawdź, czy Shelly EM jest zasilane i połączone z brokerem MQTT
  2. Ręcznie opublikuj on lub off do shellies/shellyem-{id}/relay/0/command przez klienta MQTT, aby przetestować działanie przekaźnika niezależnie od TapHome
  3. Sprawdź prawidłowe okablowanie wyjścia przekaźnikowego (sprawd�� oznaczenia zacisków na urządzeniu)

Urządzenia Shelly Gen1 nie obsługują MQTT przez TLS. Komunikacja między urządzeniem a brokerem MQTT jest nieszyfrowana (plain MQTT, port 1883). Upewnij się, że broker MQTT znajduje się w zaufanej sieci lokalnej.

Jak zainstalować w TapHome

Wymagania wstępne

  • Urządzenie Shelly połączone z Wi-Fi (jeśli jeszcze nie, zobacz przewodnik po połączeniu HTTP)
  • Broker MQTT działający w sieci lokalnej (np. Mosquitto, Home Assistant lub wbudowany broker TapHome)
  • TapHome CCU w tej samej sieci co broker

Na urządzeniach Gen1 włączenie MQTT wyłącza Shelly Cloud. Oba nie mogą działać jednocześnie. Na urządzeniach Gen2/Plus to ograniczenie nie obowiązuje.

Krok 1 — Włącz MQTT na urządzeniu Shelly

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

  1. Otwórz interfejs webowy Shelly: http://<device-ip>/
  2. Przejdź do Internet & SecurityAdvanced — MQTT
  3. Włącz MQTT
  4. Ustaw MQTT Server: <broker-ip>:<port> (np. 192.168.1.10:1883)
  5. Opcjonalnie ustaw MQTT User i MQTT Password, jeśli broker wymaga uwierzytelniania
  6. Kliknij Save — urządzenie zrestartuje się i połączy z brokerem

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

  1. Otwórz interfejs webowy Shelly: http://<device-ip>/
  2. Przejdź do SettingsMQTT
  3. Włącz MQTT
  4. Ustaw Server: <broker-ip>:<port> (np. 192.168.1.10:1883)
  5. Client ID jest wstępnie wypełnione identyfikatorem urządzenia (np. shellyplus1pm-AABBCCDDEE) — pozostaw bez zmian, chyba że masz konkretny powód do zmiany
  6. Kliknij Save i zrestartuj urządzenie

Aby sprawdzić, czy MQTT działa, użyj klienta MQTT (np. MQTT Explorer) i zasubskrybuj shellies/# (Gen1) lub <device-id>/# (Gen2). Powinieneś zobaczyć komunikaty o stanie z urządzenia.

Krok 2 — Znajdź Device ID / MQTT Client ID

Niektóre szablony wymagają parametru Device ID lub MQTT Client ID. Jest to unikalny identyfikator używany w topikach MQTT.

  • Gen1: znajduje się na etykiecie jako adres MAC (np. AABBCCDDEE). Device ID = shelly<model>-<mac>, np. shelly1pm-AABBCCDDEE
  • Gen2/Plus: znajduje się w interfejsie webowym Shelly w sekcji SettingsDevice InfoDevice ID lub na etykiecie urządzenia

Krok 3 — Konfiguracja w TapHome

  1. W TapHome dodaj nowy moduł Packet Parser (MQTT)
  2. IP Address: wprowadź adres IP brokera MQTT (np. 192.168.1.10)
  3. Port: 1883 (domyślny; użyj 8883 dla TLS)
  4. Device ID / MQTT Client ID: wprowadź wartość z kroku 2 (jeśli wymagane przez szablon)
  5. Zaimportuj szablon — TapHome automatycznie zasubskrybuje topiki urządzenia

Dostępne urządzenia

Shelly EM MQTT Moduł
Zmienne niestandardowe
deviceID (string)MQTT Device ID urządzenia Shelly EM — format to 'shellyem-DEVICEID', gdzie DEVICEID to ostatnie 6 znaków szesnastkowych adresu MAC (np. B929CC)
Open http://shellyIpAddress → Settings → Device Info → copy Device ID
Licznik energii - Kanał 1 Licznik energii Tylko do odczytu

Zużycie energii na klamrze CT kanału 1 -- energia kumulatywna (kWh) i całkowite zużycie (Wh)

numeric Jednostka: kWh
Atrybuty serwisowe
NapięcieNapięcie RMS na kanale 1 odczytywane z topiku MQTT emeter/0/voltage

Licznik energii - Kanał 1

Odczyt całkowitego zużycia
# 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");
Odczyt zapotrzebowania
# 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");
Nasłuchiwanie
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
Atrybuty serwisowe
Voltage [V]
if parsejson(response, "Topic") = "shellies/shellyem-"+deviceID+"/emeter/0/voltage"
 return(todouble(parsejson(response, "Payload")));
end
Licznik energii - Kanał 2 Licznik energii Tylko do odczytu

Zużycie energii na klamrze CT kanału 2 -- energia kumulatywna (kWh) i całkowite zużycie (Wh)

numeric Jednostka: kWh
Atrybuty serwisowe
NapięcieNapięcie RMS na kanale 2 odczytywane z topiku MQTT emeter/1/voltage

Licznik energii - Kanał 2

Odczyt całkowitego zużycia
# 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");
Odczyt zapotrzebowania
# 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");
Nasłuchiwanie
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
Atrybuty serwisowe
voltage [V]
if parsejson(response, "Topic") = "shellies/shellyem-"+deviceID+"/emeter/1/voltage"
 return(parsejson(response, "Payload"));
end
Przekaźnik stycznikowy Przełącznik

Wyjście przekaźnikowe 2A do sterowania stycznikiem -- odczytuje stan relay/0 i publikuje polecenia on/off

boolean
Wartości / Stany: ON · OFF

Przekaźnik stycznikowy

Odczyt stanu przełącznika
# 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");
Zapis stanu przełącznika
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
Nasłuchiwanie
VAR whatSt := "shellies/shellyem-"+deviceID+"/relay/0";
IF (whatSt = RECEIVEDMSG.TOPIC)
 IF (TOSTRING(RECEIVEDMSG.PAYLOAD) = "on")
  St := 1;
 ELSE
  St := 0;
 END
END
Połączenie: Packet Parser → MQTT
Możliwe ulepszenia (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.

Źródła

Znalazłeś problem z tym szablonem urządzenia?

Napisz nam, co nie działa, czego brakuje lub jak powinien zachowywać się szablon. Twoja opinia pomaga nam utrzymać katalog dokładnym.

Zweryfikowane przez TapHome

Chcesz tego użyć w swoim TapHome Core?

Otwórz ten szablon w portalu klienta, aby zastosować go w swoim domu, lub zaproponuj modyfikację i wyślij ją z powrotem do katalogu.

Otwórz w portalu