TapHome

Shelly EM MQTT

Packet Parser → MQTT
Trimis de
Ultima actualizare: 10. 2026

Acest dispozitiv acceptă mDNS

În loc să folosiți o adresă IP, puteți accesa dispozitivul la:

shellyem-{MAC}.local

Înlocuiți {MAC} cu adresa MAC a dispozitivului dvs. (majuscule, fără două puncte).

TapHome acceptă mDNS — folosirea unui nume de gazdă este mai fiabilă decât un IP static.

Shelly EM MQTT

Shelly EM este un contor electric monofazat cu două canale de măsurare independente și o ieșire de releu de 2 A pentru comanda unui contactor. Fiecare canal se conectează la un clește CT (transformator de curent) extern — disponibil în variantele de 50 A și 120 A —, ceea ce permite monitorizarea neinvazivă a două circuite separate în același timp. Acest șablon se conectează la dispozitiv printr-un broker MQTT în rețeaua locală. Nu este necesară conexiunea la cloud.

Șablonul oferă trei dispozitive: două contoare electrice (câte unul pentru fiecare canal CT), care urmăresc consumul cumulat de energie, și un întrerupător pentru releul contactorului.

Configurare

ID-ul dispozitivului

Shelly EM folosește un ID de dispozitiv în formatul shellyem-XXXXXX, unde XXXXXX reprezintă ultimele 6 caractere ale adresei MAC, în hexazecimal cu litere mari (de ex. shellyem-B929CC). La importul șablonului, introduceți în parametrul Device ID doar partea hexazecimală (de ex. B929CC).

ID-ul dispozitivului se găsește:

  • În interfața web Shelly: Settings > Device Info
  • Prin API: GET http://<device-ip>/settings — câmpul mqtt.id

Acest dispozitiv acceptă descoperirea mDNS. La configurarea brokerului MQTT puteți folosi numele de gazdă shellyem-{MAC}.local în locul adresei IP. Înlocuiți {MAC} cu aceeași parte hexazecimală ca în Device ID (de ex. shellyem-B929CC.local). Folosirea numelui de gazdă previne problemele de conectivitate atunci când adresa IP a dispozitivului se schimbă.

Configurarea MQTT

Înainte de importul șablonului, activați MQTT pe Shelly EM:

  1. Deschideți interfața web Shelly la http://<device-ip>
  2. Accesați Internet & Security > Advanced — Developer Settings
  3. Bifați Enable action execution via MQTT
  4. În câmpul Server, introduceți adresa brokerului MQTT în formatul broker-ip:1883
  5. Apăsați SAVE

La dispozitivele Shelly Gen1, activarea MQTT dezactivează Shelly Cloud. Cele două nu pot funcționa simultan.

Configurarea șablonului

După importul șablonului în TapHome:

  1. Setați MQTT Broker IP la adresa brokerului MQTT
  2. Setați MQTT Broker Port (implicit 1883)
  3. Setați Device ID la partea hexazecimală a ID-ului dispozitivului Shelly EM (de ex. B929CC)

Modulul se abonează la shellies/#, iar scripturile de ascultare ale fiecărui dispozitiv filtrează mesajele după ID-ul dispozitivului configurat.

Funcțiile dispozitivului

Contorizarea energiei (pe fiecare canal)

Fiecare canal apare în TapHome ca dispozitiv independent de tip contor electric. Scriptul de ascultare se abonează la două topicuri MQTT pentru fiecare canal:

TopicUnitateDescriere
emeter/{i}/energywați-minutEnergia cumulată de la ultima repornire — împărțită la 60 000 pentru conversia în kWh
emeter/{i}/totalWhEnergia totală consumată, persistentă — se păstrează după repornire

Șablonul memorează ambele valori: Ed (energia din topicul în wați-minut, convertită în kWh) și To (totalul în Wh din topicul persistent).

Topicul energy se resetează la zero la repornirea dispozitivului. Pentru urmărirea persistentă a energiei, șablonul citește și topicul total, care se păstrează după repornire.

Fiecare canal oferă și atributul de service Tensiune, care citește tensiunea RMS a liniei din topicul MQTT emeter/{i}/voltage.

Scripturile readtotalconsumption și readdemand conțin doar cod-șablon dezactivat prin comentarii — toate datele despre energie sosesc prin scriptul de ascultare MQTT. Prin urmare, șablonul nu oferă citirea puterii instantanee (W). Se urmăresc doar energia cumulată (kWh) și totalul consumat (Wh). Puterea activă instantanee este disponibilă în topicul MQTT emeter/{i}/power, dar acest șablon nu se abonează la el.

Releul pentru contactor

Ieșirea releului apare în TapHome ca dispozitiv de tip întrerupător. Releul are un curent nominal de 2 A la 230 V AC — este destinat doar comenzii unui contactor, nu comutării directe a sarcinii.

  • Citire: abonare la shellies/shellyem-{id}/relay/0 — payloadul on corespunde stării PORNIT, off stării OPRIT
  • Scriere: publicarea on sau off pe shellies/shellyem-{id}/relay/0/command

Releul are un curent nominal de doar 2 A. Pentru sarcinile care depășesc această valoare folosiți întotdeauna un contactor extern. Conectarea directă a sarcinilor de putere mare va deteriora releul.

Rezolvarea problemelor

Lipsesc datele despre energie
  1. Verificați dacă MQTT este activat în interfața web Shelly (Internet & Security > Advanced — Developer Settings)
  2. Verificați dacă adresa și portul brokerului MQTT sunt corecte atât în dispozitivul Shelly, cât și în setările modulului TapHome
  3. Verificați dacă variabila personalizată Device ID corespunde exact ID-ului dispozitivului Shelly (de ex. B929CC)
  4. Folosiți un client MQTT (de ex. MQTT Explorer) pentru a vă abona la shellies/# și verificați dacă dispozitivul publică topicurile emeter/0/energy și emeter/1/energy
Doar un canal raportează date
  1. Verificați dacă cleștele CT este conectat la mufa jack de 3,5 mm corectă (canalul 0 sau canalul 1)
  2. Verificați dacă prin conductorul monitorizat trece curent — cleștele CT trebuie să cuprindă un singur conductor, nu întregul cablu
  3. Abonați-vă separat la shellies/shellyem-{id}/emeter/0/# și shellies/shellyem-{id}/emeter/1/# pentru a confirma că ambele canale publică date
Releul nu răspunde
  1. Verificați dacă Shelly EM este alimentat și conectat la brokerul MQTT
  2. Publicați manual on sau off pe shellies/shellyem-{id}/relay/0/command cu un client MQTT, pentru a testa funcționarea releului independent de TapHome
  3. Verificați dacă ieșirea releului este conectată corect (verificați marcajele bornelor de pe dispozitiv)

Dispozitivele Shelly Gen1 nu acceptă MQTT prin TLS. Comunicația dintre dispozitiv și brokerul MQTT nu este criptată (MQTT simplu, portul 1883). Asigurați-vă că brokerul MQTT se află într-o rețea locală de încredere.

Cum se instalează în TapHome

Cerințe preliminare

  • Dispozitiv Shelly conectat la Wi-Fi (2,4 GHz), de ex. prin aplicația Shelly sau prin punctul de acces propriu al dispozitivului
  • Broker MQTT care rulează în rețeaua dvs. locală (de ex. Mosquitto, Home Assistant sau brokerul integrat TapHome)
  • TapHome CCU în aceeași rețea cu brokerul

La dispozitivele Gen1, activarea MQTT dezactivează Shelly Cloud. Cele două nu pot funcționa simultan. La dispozitivele Gen2/Plus această limitare nu se aplică.

Pasul 1 — Activați MQTT pe dispozitivul Shelly

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

  1. Deschideți interfața web Shelly: http://<device-ip>/
  2. Accesați Internet & Security → Advanced — MQTT
  3. Activați MQTT
  4. Setați MQTT Server: <broker-ip>:<port> (de ex. 192.168.1.10:1883)
  5. Opțional, setați MQTT User și MQTT Password, dacă brokerul dvs. necesită autentificare
  6. Faceți clic pe Save — dispozitivul repornește și se conectează la broker

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

  1. Deschideți interfața web Shelly: http://<device-ip>/
  2. Accesați Settings → MQTT
  3. Activați MQTT
  4. Setați Server: <broker-ip>:<port> (de ex. 192.168.1.10:1883)
  5. Câmpul Client ID este precompletat cu ID-ul dispozitivului (de ex. shellyplus1pm-AABBCCDDEE) — lăsați-l neschimbat, dacă nu aveți un motiv anume să îl modificați
  6. Faceți clic pe Save și reporniți dispozitivul

Pentru a verifica funcționarea MQTT, folosiți un client MQTT (de ex. MQTT Explorer) și abonați-vă la shellies/# (Gen1) sau <device-id>/# (Gen2). Ar trebui să vedeți mesajele de stare trimise de dispozitiv.

Pasul 2 — Aflați Device ID / MQTT Client ID

Unele șabloane necesită parametrul Device ID sau MQTT Client ID. Acesta este identificatorul unic folosit în topicurile MQTT.

  • Gen1: se găsește pe etichetă, ca adresă MAC (de ex. AABBCCDDEE). Device ID = shelly<model>-<mac>, de ex. shelly1pm-AABBCCDDEE
  • Gen2/Plus: se găsește în interfața web Shelly, la Settings → Device Info → Device ID, sau pe eticheta dispozitivului

Pasul 3 — Configurați dispozitivul în TapHome

  1. În TapHome adăugați un nou modul Packet Parser (MQTT)
  2. IP Address: introduceți adresa IP a brokerului MQTT (de ex. 192.168.1.10)
  3. Port: 1883 (implicit; pentru TLS folosiți 8883)
  4. Device ID / MQTT Client ID: introduceți valoarea de la pasul 2 (dacă șablonul o necesită)
  5. Importați șablonul — TapHome se abonează automat la topicurile dispozitivului

Dispozitive disponibile

Shelly EM MQTT Modul
Variabile personalizate
deviceID (string)ID-ul de dispozitiv MQTT al Shelly EM — formatul este 'shellyem-DEVICEID', unde DEVICEID reprezintă ultimele 6 caractere hexazecimale ale adresei MAC (de ex. B929CC)
Open http://shellyIpAddress → Settings → Device Info → copy Device ID
Contor electric - canalul 1 Contor electric Doar citire

Consumul de energie pe canalul CT 1 — energie cumulată (kWh) și total consumat (Wh)

numeric Unitate: kWh
Atribute de service
TensiuneTensiunea RMS pe canalul 1, citită din topicul MQTT emeter/0/voltage

Contor electric - canalul 1

Citirea consumului total
# 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");
Citirea cererii
# 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");
Ascultător
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
Atribute de service
Voltage [V]
if parsejson(response, "Topic") = "shellies/shellyem-"+deviceID+"/emeter/0/voltage"
 return(todouble(parsejson(response, "Payload")));
end
Contor electric - canalul 2 Contor electric Doar citire

Consumul de energie pe canalul 2 al cleștelui CT — energie cumulată (kWh) și total consumat (Wh)

numeric Unitate: kWh
Atribute de service
TensiuneTensiunea RMS pe canalul 2, citită din topicul MQTT emeter/1/voltage

Contor electric - canalul 2

Citirea consumului total
# 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");
Citirea cererii
# 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");
Ascultător
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
Atribute de service
voltage [V]
if parsejson(response, "Topic") = "shellies/shellyem-"+deviceID+"/emeter/1/voltage"
 return(parsejson(response, "Payload"));
end
Releu pentru contactor Comutator

Ieșire de releu de 2 A pentru comanda contactorului — citește starea relay/0 și publică comenzile on/off

boolean
Valori / Stări: ON · OFF

Releu pentru contactor

Citirea stării comutatorului
# 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");
Scrierea stării comutatorului
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
Ascultător
VAR whatSt := "shellies/shellyem-"+deviceID+"/relay/0";
IF (whatSt = RECEIVEDMSG.TOPIC)
 IF (TOSTRING(RECEIVEDMSG.PAYLOAD) = "on")
  St := 1;
 ELSE
  St := 0;
 END
END
Conexiune: Packet Parser → MQTT • Nume gazdă: shellyem-{MAC}.local
Îmbunătățiri posibile (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.

Surse

Ați găsit o problemă la acest șablon de dispozitiv?

Spuneți-ne ce nu funcționează, ce lipsește sau cum ar trebui să se comporte șablonul. Feedbackul dvs. ne ajută să păstrăm catalogul corect.

Verificat de TapHome

Doriți să folosiți acest șablon în TapHome Core?

Deschideți acest șablon în Customer Portal pentru a-l aplica într-una dintre locuințele dvs. sau pentru a propune o îmbunătățire și a o trimite înapoi în catalog.

Deschideți în portal