TapHome

Shelly Motion 2

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

Acest dispozitiv acceptă mDNS

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

shellymotion2-{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 Motion 2

Shelly Motion 2 (SHMOS-02) este un senzor de mișcare PIR Wi-Fi alimentat cu baterie (Li-ion 6500 mAh, reîncărcabilă prin USB-C). TapHome comunică cu dispozitivul prin MQTT — protocolul recomandat pentru dispozitivele Shelly cu baterii, deoarece senzorul se află în repaus cea mai mare parte a timpului și publică date doar la trezire (detectarea mișcării sau temporizatorul periodic).

Spre deosebire de dispozitivele Shelly Gen1 de tip releu, care publică topicuri de stare individuale, Motion 2 publică la trezire întreaga stare printr-un singur payload JSON /info. Scriptul de ascultare TapHome analizează acest JSON pentru a extrage starea mișcării, iluminarea, temperatura, nivelul bateriei și atributele de diagnosticare.

Șablonul acceptă până la 5 senzori Shelly Motion 2 per modul. Fiecare senzor este identificat prin variabila personalizată sensorN_topic, care indică ID-ul de client MQTT al dispozitivului.

Configurare

ID-ul dispozitivului

Fiecare Shelly Motion 2 are un ID de dispozitiv MQTT unic în formatul shellymotion2-<MAC>, unde <MAC> reprezintă adresa MAC completă de 12 caractere, în hexazecimal cu litere mari (de ex. shellymotion2-AABBCCDDEEFF).

ID-ul dispozitivului se găsește:

  • Pe eticheta dispozitivului (adresa MAC)
  • În interfața web Shelly: Settings → Device Info
  • Prin API: GET http://<device-ip>/settings → câmpul device.hostname
Configurarea șablonului

După importul șablonului în TapHome:

  1. Deschideți modulul Shelly Motion 2 MQTT
  2. Setați MQTT Broker IP și Port (implicit 1883)
  3. Pentru fiecare senzor, setați variabila personalizată sensorN_topic la ID-ul dispozitivului Shelly Motion 2 corespunzător (de ex. shellymotion2-AABBCCDDEEFF)

Modulul se abonează la shellies/#, iar scripturile de ascultare filtrează mesajele după prefixul de topic configurat.

Configurați doar sloturile de senzori pe care le folosiți efectiv. Sloturile neconfigurate (cu valoarea implicită shellymotion2-deviceid) afișează un mesaj de eroare care vă solicită să setați topicul corect.

Setările senzorului de mișcare

Shelly Motion 2 are mai mulți parametri configurabili care influențează detectarea. Aceștia se configurează direct pe dispozitiv, din interfața sa web (http://<device-ip>/), nu din TapHome:

ParametruIntervalDescriere
Sensibilitate1–256Sensibilitatea detectării mișcării (valoare mai mică = mai sensibil)
Timp de blocare1–1440 minMinutele în care mișcarea este ignorată după o detectare
Număr de impulsuri1–4Mișcările consecutive necesare pentru confirmarea mișcării
Mod de funcționareANY / DARK / TWILIGHT / BRIGHTCând este activă detectarea, în funcție de lumina ambientală
Timp de repaus0–86400 sIntervalul periodic de trezire, în secunde

Timpii de repaus mai scurți asigură date mai recente, dar reduc autonomia bateriei. Intervalul de trezire implicit este suficient pentru majoritatea utilizărilor. Evenimentele de mișcare declanșează întotdeauna o trezire imediată, indiferent de temporizatorul de repaus.

Funcțiile dispozitivului

Detectarea mișcării

Fiecare senzor este mapat în TapHome ca dispozitiv de tip contact reed cu funcția „security”. Starea mișcării se extrage din topicul shellies/<id>/info — mai exact din câmpul $.sensor.motion al payloadului JSON:

  • true → Alarmă (mișcare detectată)
  • false → OK (fără mișcare)

Senzorul se trezește și își publică starea atunci când detectează mișcare (în funcție de setările de sensibilitate, timp de blocare și număr de impulsuri), precum și la intervalele periodice de trezire.

Atribute de service

Fiecare senzor oferă 14 atribute de service la nivelul dispozitivului, toate extrase din payloadul JSON /info:

AtributCâmp sursăDescriere
Adresă IP$.wifi_sta.ipAdresa IP Wi-Fi a senzorului
Adresă MAC$.macAdresa MAC hardware
Baterie$.bat.voltage, $.bat.valueTensiunea și procentul bateriei (de ex. 3.83V (97%))
Semnal$.wifi_sta.rssiPuterea semnalului Wi-Fi în dB
Cloud activat$.cloud.enabledIndică dacă Shelly Cloud este activat
Cloud conectat$.cloud.connectedIndică dacă dispozitivul este conectat la Shelly Cloud
Ora dispozitivului$.timeOra curentă pe dispozitiv
Iluminare$.lux.valueNivelul luminii ambientale în lucși
Temperatură$.tmp.value, $.tmp.unitsCitirea temperaturii interne
Timp de funcționare$.uptimeTimpul scurs de la ultima repornire
Versiune FW$.fw_info.fwVersiunea curentă de firmware
Actualizare FW$.update.has_updateIndică dacă este disponibilă o actualizare de firmware
RAM liberă$.ram_total, $.ram_freeMemoria disponibilă
Spațiu liber FS$.fs_size, $.fs_freeSpațiul de stocare disponibil în sistemul de fișiere

Avertizarea de baterie descărcată se declanșează automat când nivelul bateriei scade sub 20 %.

Funcții suplimentare (neimplementate)

Shelly Motion 2 publică prin payloadul JSON /info și detectarea vibrațiilor/tentativelor de sabotaj ($.sensor.vibration, sensibilitate configurabilă 0–80), categoria de iluminare ($.lux.illumination — dark/twilight/bright) și starea încărcătorului USB ($.charger). Starea online/offline este disponibilă prin topicul LWT (shellies/<id>/online). Aceste funcții sunt disponibile în datele MQTT ale dispozitivului, dar nu sunt mapate în șablonul TapHome actual. Pot fi adăugate într-o actualizare viitoare a șablonului.

Rezolvarea problemelor

Senzorul nu raportează date
  1. Verificați dacă Shelly Motion 2 este conectat la Wi-Fi și dacă MQTT este activat în setările dispozitivului
  2. Verificați dacă variabila personalizată sensorN_topic corespunde exact ID-ului dispozitivului (de ex. shellymotion2-AABBCCDDEEFF)
  3. Folosiți un client MQTT (de ex. MQTT Explorer) pentru a vă abona la shellies/# și verificați dacă senzorul publică mesaje la trezire
  4. Motion 2 funcționează cu baterie și publică date doar când se trezește — declanșați un eveniment de mișcare pentru a forța trezirea
Starea mișcării nu se actualizează
  1. Verificați dacă lentila senzorului PIR nu este obturată și dacă senzorul este montat la înălțimea recomandată (1,8–2,5 m)
  2. Dacă senzorul a fost instalat recent, verificați setările de sensibilitate și de timp de blocare din interfața web a dispozitivului — un timp de blocare mare înseamnă că senzorul ignoră mișcarea pentru perioade mai lungi după fiecare detectare
  3. Ajustați numărul de impulsuri dacă senzorul se declanșează prea rar (valoare mai mică = sunt necesare mai puține mișcări consecutive)
  4. Verificați în TapHome starea dispozitivului de tip contact reed — 1 = mișcare detectată (alarmă), 0 = fără mișcare (OK)
Bateria se descarcă rapid
  1. Shelly Motion 2 folosește o baterie Li-ion reîncărcabilă încorporată (6500 mAh), încărcată prin USB-C, cu o durată de funcționare tipică de 12–18 luni
  2. Trezirile frecvente din cauza activității intense de mișcare sau a intervalelor de repaus scurte descarcă bateria mai repede
  3. Activarea SSL pentru MQTT reduce semnificativ autonomia bateriei — folosiți MQTT simplu (portul 1883) într-o rețea locală de încredere
  4. Asigurați un semnal Wi-Fi puternic în locul în care este montat senzorul — un semnal slab înseamnă timpi de conectare mai lungi la fiecare trezire

Dispozitivele Shelly Gen1 nu acceptă MQTT prin TLS fără un impact semnificativ asupra bateriei. Comunicația dintre senzor și brokerul MQTT este de obicei necriptată (MQTT simplu, portul 1883). Asigurați-vă că brokerul MQTT se află într-o rețea locală de încredere.

Activarea MQTT pe dispozitivele Shelly Gen1 dezactivează conectivitatea Cloud. MQTT și Cloud nu pot funcționa simultan pe același dispozitiv.

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 Motion 2 MQTT Modul
Variabile personalizate
sensor1_topic (string) = shellymotion2-deviceidID-ul de dispozitiv MQTT al senzorului de mișcare 1 — formatul este 'shellymotion2-DEVICEID' (ID-ul dispozitivului se găsește în interfața web Shelly → Settings → Device Info)
Open http://shellyIpAddress → Settings → Device info → copy Device ID. Format: shellymotion2-<last6MAC>
sensor2_topic (string) = shellymotion2-deviceidID-ul de dispozitiv MQTT al senzorului de mișcare 2
sensor3_topic (string) = shellymotion2-deviceidID-ul de dispozitiv MQTT al senzorului de mișcare 3
sensor4_topic (string) = shellymotion2-deviceidID-ul de dispozitiv MQTT al senzorului de mișcare 4
sensor5_topic (string) = shellymotion2-deviceidID-ul de dispozitiv MQTT al senzorului de mișcare 5
Detector de mișcare 1 Contact reed Doar citire

Detectarea mișcării PIR — raportează alarmă când se detectează mișcare și OK când nu există mișcare; extrage $.sensor.motion din payloadul JSON /info

boolean
Atribute de service
Adresă IP
Adresă MAC
Baterie
Semnal
Cloud activat
Cloud conectat
Ora dispozitivului
Iluminare
Temperatură
Timp de funcționare
Versiune FW
Actualizare FW
RAM liberă
Spațiu liber FS

Detector de mișcare 1

Ascultător
IF (INDEXOF(sensor1_topic, "shellymotion2-deviceid") = 0)
    ADDERROR("Set correct 'sensor1_topic' value in module variables. Topic format is 'shellymotion2-<deviceid>'. The Device ID can be found by opening url 'http://shellyIpAddress', in Settings -> Device info.");
    RETURN(-1);
END

VAR topicPrefix := "shellies/" + sensor1_topic;

IF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/info") = 0)
    BOOL status := PARSEJSON(RECEIVEDMSG.PAYLOAD, "$.sensor.motion", 1);
    
    IF ISNULL(status)
        Rc := NaN;
    ELSE
        Rc := status;
    END
    
    VAR battery := PARSEJSON(RECEIVEDMSG.PAYLOAD, "$.bat.value");
    IF battery < 20
        ADDWARNING("Battery low (" + battery + "%)");
    END
END
Atribute de service
IP Address
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.ip"));
END
MAC Address
IF(LENGTH(infoJson) = 0, "-", PARSEJSON(infoJson, "$.mac"));

IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.mac"));
END
Battery
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR voltage := PARSEJSON(infoJson, "$.bat.voltage");
    VAR percentage := PARSEJSON(infoJson, "$.bat.value");

    RETURN(voltage + "V (" + percentage + "%)");
END
Signal
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.rssi", 1) + "db");
END
Cloud enabled
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.enabled"));
END
Cloud connected
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.connected"));
END
Device time
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.time"));
END
Luminance
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.lux.value", 1) + "lux");
END
Temperature
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.tmp.value", 1) + PARSEJSON(infoJson, "$.tmp.units", 1));
END
Uptime
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR upTimeSeconds := PARSEJSON(infoJson, "$.uptime", 1);
    VAR days := FLOOR(upTimeSeconds/86400, 1);
    uptimeSeconds := MOD(upTimeSeconds, 86400);
    var hours := FLOOR(upTimeSeconds/3600, 1);
    uptimeSeconds := MOD(upTimeSeconds, 3600);
    var minutes := FLOOR(upTimeSeconds/60, 1);
    RETURN(days + "day(s) " + hours + "h " + minutes + "m");
END
FW version
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.fw_info.fw"));
END
FW update
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.update.has_update", 1));
END
Free RAM
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR total := PARSEJSON(infoJson, "$.ram_total");
    VAR free := PARSEJSON(infoJson, "$.ram_free");
    RETURN(free + "/" + total + "(B)");
END
Free FS space
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR total := PARSEJSON(infoJson, "$.fs_size");
    VAR free := PARSEJSON(infoJson, "$.fs_free");
    RETURN(free + "/" + total + "(B)");
END
Detector de mișcare 2 Contact reed Doar citire

Detectarea mișcării PIR — raportează alarmă când se detectează mișcare și OK când nu există mișcare; extrage $.sensor.motion din payloadul JSON /info

boolean
Atribute de service
Adresă IP
Adresă MAC
Baterie
Semnal
Cloud activat
Cloud conectat
Ora dispozitivului
Iluminare
Temperatură
Timp de funcționare
Versiune FW
Actualizare FW
RAM liberă
Spațiu liber FS

Detector de mișcare 2

Ascultător
IF (INDEXOF(sensor2_topic, "shellymotion2-deviceid") = 0)
    ADDERROR("Set correct 'sensor2_topic' value in module variables. Topic format is 'shellymotion2-<deviceid>'. The Device ID can be found by opening url 'http://shellyIpAddress', in Settings -> Device info.");
    RETURN(-1);
END

VAR topicPrefix := "shellies/" + sensor2_topic;

IF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/info") = 0)
    BOOL status := PARSEJSON(RECEIVEDMSG.PAYLOAD, "$.sensor.motion", 1);
    
    IF ISNULL(status)
        Rc := NaN;
    ELSE
        Rc := status;
    END
    
    VAR battery := PARSEJSON(RECEIVEDMSG.PAYLOAD, "$.bat.value");
    IF battery < 20
        ADDWARNING("Battery low (" + battery + "%)");
    END
END
Atribute de service
IP Address
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.ip"));
END
MAC Address
IF(LENGTH(infoJson) = 0, "-", PARSEJSON(infoJson, "$.mac"));

IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.mac"));
END
Battery
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR voltage := PARSEJSON(infoJson, "$.bat.voltage");
    VAR percentage := PARSEJSON(infoJson, "$.bat.value");

    RETURN(voltage + "V (" + percentage + "%)");
END
Signal
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.rssi", 1) + "db");
END
Cloud enabled
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.enabled"));
END
Cloud connected
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.connected"));
END
Device time
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.time"));
END
Luminance
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.lux.value", 1) + "lux");
END
Temperature
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.tmp.value", 1) + PARSEJSON(infoJson, "$.tmp.units", 1));
END
Uptime
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR upTimeSeconds := PARSEJSON(infoJson, "$.uptime", 1);
    VAR days := FLOOR(upTimeSeconds/86400, 1);
    uptimeSeconds := MOD(upTimeSeconds, 86400);
    var hours := FLOOR(upTimeSeconds/3600, 1);
    uptimeSeconds := MOD(upTimeSeconds, 3600);
    var minutes := FLOOR(upTimeSeconds/60, 1);
    RETURN(days + "day(s) " + hours + "h " + minutes + "m");
END
FW version
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.fw_info.fw"));
END
FW update
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.update.has_update", 1));
END
Free RAM
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR total := PARSEJSON(infoJson, "$.ram_total");
    VAR free := PARSEJSON(infoJson, "$.ram_free");
    RETURN(free + "/" + total + "(B)");
END
Free FS space
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR total := PARSEJSON(infoJson, "$.fs_size");
    VAR free := PARSEJSON(infoJson, "$.fs_free");
    RETURN(free + "/" + total + "(B)");
END
Detector de mișcare 3 Contact reed Doar citire

Detectarea mișcării PIR — raportează alarmă când se detectează mișcare și OK când nu există mișcare; extrage $.sensor.motion din payloadul JSON /info

boolean
Atribute de service
Adresă IP
Adresă MAC
Baterie
Semnal
Cloud activat
Cloud conectat
Ora dispozitivului
Iluminare
Temperatură
Timp de funcționare
Versiune FW
Actualizare FW
RAM liberă
Spațiu liber FS

Detector de mișcare 3

Ascultător
IF (INDEXOF(sensor3_topic, "shellymotion2-deviceid") = 0)
    ADDERROR("Set correct 'sensor3_topic' value in module variables. Topic format is 'shellymotion2-<deviceid>'. The Device ID can be found by opening url 'http://shellyIpAddress', in Settings -> Device info.");
    RETURN(-1);
END

VAR topicPrefix := "shellies/" + sensor3_topic;

IF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/info") = 0)
    BOOL status := PARSEJSON(RECEIVEDMSG.PAYLOAD, "$.sensor.motion", 1);
    
    IF ISNULL(status)
        Rc := NaN;
    ELSE
        Rc := status;
    END
    
    VAR battery := PARSEJSON(RECEIVEDMSG.PAYLOAD, "$.bat.value");
    IF battery < 20
        ADDWARNING("Battery low (" + battery + "%)");
    END
END
Atribute de service
IP Address
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.ip"));
END
MAC Address
IF(LENGTH(infoJson) = 0, "-", PARSEJSON(infoJson, "$.mac"));

IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.mac"));
END
Battery
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR voltage := PARSEJSON(infoJson, "$.bat.voltage");
    VAR percentage := PARSEJSON(infoJson, "$.bat.value");

    RETURN(voltage + "V (" + percentage + "%)");
END
Signal
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.rssi", 1) + "db");
END
Cloud enabled
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.enabled"));
END
Cloud connected
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.connected"));
END
Device time
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.time"));
END
Luminance
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.lux.value", 1) + "lux");
END
Temperature
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.tmp.value", 1) + PARSEJSON(infoJson, "$.tmp.units", 1));
END
Uptime
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR upTimeSeconds := PARSEJSON(infoJson, "$.uptime", 1);
    VAR days := FLOOR(upTimeSeconds/86400, 1);
    uptimeSeconds := MOD(upTimeSeconds, 86400);
    var hours := FLOOR(upTimeSeconds/3600, 1);
    uptimeSeconds := MOD(upTimeSeconds, 3600);
    var minutes := FLOOR(upTimeSeconds/60, 1);
    RETURN(days + "day(s) " + hours + "h " + minutes + "m");
END
FW version
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.fw_info.fw"));
END
FW update
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.update.has_update", 1));
END
Free RAM
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR total := PARSEJSON(infoJson, "$.ram_total");
    VAR free := PARSEJSON(infoJson, "$.ram_free");
    RETURN(free + "/" + total + "(B)");
END
Free FS space
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR total := PARSEJSON(infoJson, "$.fs_size");
    VAR free := PARSEJSON(infoJson, "$.fs_free");
    RETURN(free + "/" + total + "(B)");
END
Detector de mișcare 4 Contact reed Doar citire

Detectarea mișcării PIR — raportează alarmă când se detectează mișcare și OK când nu există mișcare; extrage $.sensor.motion din payloadul JSON /info

boolean
Atribute de service
Adresă IP
Adresă MAC
Baterie
Semnal
Cloud activat
Cloud conectat
Ora dispozitivului
Iluminare
Temperatură
Timp de funcționare
Versiune FW
Actualizare FW
RAM liberă
Spațiu liber FS

Detector de mișcare 4

Ascultător
IF (INDEXOF(sensor4_topic, "shellymotion2-deviceid") = 0)
    ADDERROR("Set correct 'sensor4_topic' value in module variables. Topic format is 'shellymotion2-<deviceid>'. The Device ID can be found by opening url 'http://shellyIpAddress', in Settings -> Device info.");
    RETURN(-1);
END

VAR topicPrefix := "shellies/" + sensor4_topic;

IF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/info") = 0)
    BOOL status := PARSEJSON(RECEIVEDMSG.PAYLOAD, "$.sensor.motion", 1);
    
    IF ISNULL(status)
        Rc := NaN;
    ELSE
        Rc := status;
    END
    
    VAR battery := PARSEJSON(RECEIVEDMSG.PAYLOAD, "$.bat.value");
    IF battery < 20
        ADDWARNING("Battery low (" + battery + "%)");
    END
END
Atribute de service
IP Address
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.ip"));
END
MAC Address
IF(LENGTH(infoJson) = 0, "-", PARSEJSON(infoJson, "$.mac"));

IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.mac"));
END
Battery
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR voltage := PARSEJSON(infoJson, "$.bat.voltage");
    VAR percentage := PARSEJSON(infoJson, "$.bat.value");

    RETURN(voltage + "V (" + percentage + "%)");
END
Signal
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.rssi", 1) + "db");
END
Cloud enabled
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.enabled"));
END
Cloud connected
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.connected"));
END
Device time
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.time"));
END
Luminance
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.lux.value", 1) + "lux");
END
Temperature
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.tmp.value", 1) + PARSEJSON(infoJson, "$.tmp.units", 1));
END
Uptime
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR upTimeSeconds := PARSEJSON(infoJson, "$.uptime", 1);
    VAR days := FLOOR(upTimeSeconds/86400, 1);
    uptimeSeconds := MOD(upTimeSeconds, 86400);
    var hours := FLOOR(upTimeSeconds/3600, 1);
    uptimeSeconds := MOD(upTimeSeconds, 3600);
    var minutes := FLOOR(upTimeSeconds/60, 1);
    RETURN(days + "day(s) " + hours + "h " + minutes + "m");
END
FW version
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.fw_info.fw"));
END
FW update
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.update.has_update", 1));
END
Free RAM
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR total := PARSEJSON(infoJson, "$.ram_total");
    VAR free := PARSEJSON(infoJson, "$.ram_free");
    RETURN(free + "/" + total + "(B)");
END
Free FS space
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR total := PARSEJSON(infoJson, "$.fs_size");
    VAR free := PARSEJSON(infoJson, "$.fs_free");
    RETURN(free + "/" + total + "(B)");
END
Detector de mișcare 5 Contact reed Doar citire

Detectarea mișcării PIR — raportează alarmă când se detectează mișcare și OK când nu există mișcare; extrage $.sensor.motion din payloadul JSON /info

boolean
Atribute de service
Adresă IP
Adresă MAC
Baterie
Semnal
Cloud activat
Cloud conectat
Ora dispozitivului
Iluminare
Temperatură
Timp de funcționare
Versiune FW
Actualizare FW
RAM liberă
Spațiu liber FS

Detector de mișcare 5

Ascultător
IF (INDEXOF(sensor5_topic, "shellymotion2-deviceid") = 0)
    ADDERROR("Set correct 'sensor5_topic' value in module variables. Topic format is 'shellymotion2-<deviceid>'. The Device ID can be found by opening url 'http://shellyIpAddress', in Settings -> Device info.");
    RETURN(-1);
END

VAR topicPrefix := "shellies/" + sensor5_topic;

IF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/info") = 0)
    BOOL status := PARSEJSON(RECEIVEDMSG.PAYLOAD, "$.sensor.motion", 1);
    
    IF ISNULL(status)
        Rc := NaN;
    ELSE
        Rc := status;
    END
    
    VAR battery := PARSEJSON(RECEIVEDMSG.PAYLOAD, "$.bat.value");
    IF battery < 20
        ADDWARNING("Battery low (" + battery + "%)");
    END
END
Atribute de service
IP Address
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.ip"));
END
MAC Address
IF(LENGTH(infoJson) = 0, "-", PARSEJSON(infoJson, "$.mac"));

IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.mac"));
END
Battery
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR voltage := PARSEJSON(infoJson, "$.bat.voltage");
    VAR percentage := PARSEJSON(infoJson, "$.bat.value");

    RETURN(voltage + "V (" + percentage + "%)");
END
Signal
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.rssi", 1) + "db");
END
Cloud enabled
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.enabled"));
END
Cloud connected
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.connected"));
END
Device time
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.time"));
END
Luminance
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.lux.value", 1) + "lux");
END
Temperature
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.tmp.value", 1) + PARSEJSON(infoJson, "$.tmp.units", 1));
END
Uptime
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR upTimeSeconds := PARSEJSON(infoJson, "$.uptime", 1);
    VAR days := FLOOR(upTimeSeconds/86400, 1);
    uptimeSeconds := MOD(upTimeSeconds, 86400);
    var hours := FLOOR(upTimeSeconds/3600, 1);
    uptimeSeconds := MOD(upTimeSeconds, 3600);
    var minutes := FLOOR(upTimeSeconds/60, 1);
    RETURN(days + "day(s) " + hours + "h " + minutes + "m");
END
FW version
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.fw_info.fw"));
END
FW update
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.update.has_update", 1));
END
Free RAM
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR total := PARSEJSON(infoJson, "$.ram_total");
    VAR free := PARSEJSON(infoJson, "$.ram_free");
    RETURN(free + "/" + total + "(B)");
END
Free FS space
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR total := PARSEJSON(infoJson, "$.fs_size");
    VAR free := PARSEJSON(infoJson, "$.fs_free");
    RETURN(free + "/" + total + "(B)");
END
Conexiune: Packet Parser → MQTT • Nume gazdă: shellymotion2-{MAC}.local
Îmbunătățiri posibile (4)
  • Vibration / Tamper Detection — Vibration/tamper detection (bool). Available in the /info JSON but not parsed by the listener script. Configurable sensitivity 0-80.
  • Illumination Category — Light category string — dark/twilight/bright. Available in /info but only numeric lux is parsed via service attributes.
  • USB Charger Connected — Whether USB-C charger is plugged in. Available in /info JSON.
  • Connection Status — LWT topic — true on connect, false on disconnect. Could detect offline sensors.

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