TapHome

Shelly Motion 2

Packet Parser → MQTT
Autor
Posljednje ažuriranje: 03. 2026

Ovaj uređaj podržava mDNS

Umjesto IP adrese uređaju možete pristupiti na adresi:

shellymotion2-{MAC}.local

Zamijenite {MAC} MAC adresom svog uređaja (velika slova, bez dvotočaka).

TapHome podržava mDNS. Naziv računala (hostname) pouzdaniji je od statične IP adrese.

Shelly Motion 2

Shelly Motion 2 (SHMOS-02) je Wi-Fi PIR senzor pokreta na bateriju (Li-ion 6500 mAh, punjiva preko USB-C). TapHome s uređajem komunicira preko MQTT-a, što je preporučeni protokol za uređaje Shelly na baterije: senzor većinu vremena spava i podatke objavljuje samo kada se probudi (otkrivanje pokreta ili periodički timer).

Za razliku od relejnih uređaja Shelly Gen1 koji objavljuju pojedinačne teme stanja, Motion 2 kada se probudi objavljuje cijelo svoje stanje u jednom JSON payloadu /info. Skripta TapHome za primanje poruka raščlanjuje taj JSON i iz njega izdvaja stanje pokreta, osvijetljenost, temperaturu, razinu baterije i dijagnostičke atribute.

Predložak podržava do 5 senzora Shelly Motion 2 po modulu. Svaki se senzor razlikuje po korisničkoj varijabli sensorN_topic koja upućuje na MQTT Client ID uređaja.

Konfiguracija

Device ID

Svaki Shelly Motion 2 ima jedinstveni MQTT Device ID u obliku shellymotion2-<MAC>, gdje je <MAC> cijela MAC adresa od 12 znakova velikim slovima u heksadecimalnom zapisu (npr. shellymotion2-AABBCCDDEEFF).

Device ID možete pronaći:

  • Na naljepnici uređaja (MAC adresa)
  • U web-sučelju Shelly: Settings → Device Info
  • Preko API-ja: GET http://<device-ip>/settings → polje device.hostname
Postavljanje predloška

Nakon uvoza predloška u TapHome:

  1. Otvorite modul Shelly Motion 2 MQTT
  2. Postavite MQTT Broker IP i Port (zadano 1883)
  3. Za svaki senzor postavite korisničku varijablu sensorN_topic na Device ID odgovarajućeg senzora Shelly Motion 2 (npr. shellymotion2-AABBCCDDEEFF)

Modul se pretplaćuje na shellies/#, a skripte za primanje poruka filtriraju poruke prema postavljenom prefiksu teme.

Konfigurirajte samo mjesta za senzore koja stvarno koristite. Nekonfigurirana mjesta (sa zadanom vrijednošću shellymotion2-deviceid) prikazat će poruku o pogrešci s upozorenjem da treba postaviti ispravnu temu.

Postavke senzora pokreta

Shelly Motion 2 ima nekoliko podesivih parametara koji utječu na prepoznavanje. Postavljaju se izravno na uređaju u njegovu web-sučelju (http://<device-ip>/), a ne preko sustava TapHome:

ParametarRasponOpis
Osjetljivost1–256Osjetljivost otkrivanja pokreta (niža vrijednost = veća osjetljivost)
Vrijeme neosjetljivosti (blind time)1–1440 minBroj minuta tijekom kojih se nakon otkrivanja pokret zanemaruje
Broj impulsa1–4Broj uzastopnih pokreta potrebnih za potvrdu pokreta
Način radaANY / DARK / TWILIGHT / BRIGHTKada je prepoznavanje aktivno, ovisno o osvijetljenosti okoline
Vrijeme spavanja0–86400 sInterval periodičkog buđenja u sekundama

Kraće vrijeme spavanja daje svježije podatke, ali skraćuje trajanje baterije. Zadani interval buđenja dovoljan je za većinu primjena. Pokret uvijek odmah budi senzor, bez obzira na timer spavanja.

Mogućnosti uređaja

Otkrivanje pokreta

Svaki je senzor u sustavu TapHome prikazan kao uređaj vrste „Magnetski kontakt” (Reed Contact) sa sigurnosnom namjenom („security”). Stanje pokreta čita se iz teme shellies/<id>/info, točnije iz polja $.sensor.motion u JSON payloadu:

  • true → Alarm (otkriven pokret)
  • false → OK (nema pokreta)

Senzor se budi i objavljuje stanje kada otkrije pokret (ovisno o postavkama osjetljivosti, vremena neosjetljivosti i broja impulsa), a i u periodičkim intervalima buđenja.

Servisni atributi

Svaki senzor ima 14 servisnih atributa na razini uređaja, a svi se čitaju iz JSON payloada /info:

AtributIzvorno poljeOpis
IP adresa$.wifi_sta.ipWi-Fi IP adresa senzora
MAC adresa$.macHardverska MAC adresa
Baterija$.bat.voltage, $.bat.valueNapon baterije i razina napunjenosti u postocima (npr. 3,83 V (97 %))
Signal$.wifi_sta.rssiJačina Wi-Fi signala u dB
Oblak omogućen$.cloud.enabledJe li Shelly Cloud omogućen
Spojeno na oblak$.cloud.connectedJe li uređaj spojen na Shelly Cloud
Vrijeme uređaja$.timeTrenutačno vrijeme na uređaju
Osvijetljenost$.lux.valueRazina svjetla u okolini u luksima
Temperatura$.tmp.value, $.tmp.unitsOčitanje unutarnje temperature
Vrijeme rada$.uptimeVrijeme od zadnjeg ponovnog pokretanja
Verzija firmvera$.fw_info.fwTrenutačna verzija firmvera
Ažuriranje firmvera$.update.has_updateJe li dostupno ažuriranje firmvera
Slobodni RAM$.ram_total, $.ram_freeDostupna memorija
Slobodan prostor datotečnog sustava$.fs_size, $.fs_freeDostupan prostor za pohranu u datotečnom sustavu

Upozorenje o slaboj bateriji javlja se automatski kada razina baterije padne ispod 20 %.

Dodatne mogućnosti (nisu implementirane)

Shelly Motion 2 u JSON payloadu /info objavljuje i prepoznavanje vibracija / sabotaže ($.sensor.vibration, podesiva osjetljivost 0–80), kategoriju osvijetljenosti ($.lux.illumination: dark/twilight/bright) i stanje USB punjača ($.charger). Stanje online/offline dostupno je preko teme LWT (shellies/<id>/online). Te su mogućnosti dostupne u MQTT porukama uređaja, ali nisu mapirane u trenutačnom predlošku TapHome. Mogu se dodati u budućem ažuriranju predloška.

Rješavanje problema

Senzor ne šalje podatke
  1. Provjerite je li Shelly Motion 2 spojen na Wi-Fi i je li MQTT uključen u postavkama uređaja
  2. Provjerite odgovara li korisnička varijabla sensorN_topic točno Device ID-u (npr. shellymotion2-AABBCCDDEEFF)
  3. MQTT klijentom (npr. MQTT Explorer) pretplatite se na shellies/# i provjerite objavljuje li senzor poruke kada se probudi
  4. Motion 2 radi na bateriju i podatke objavljuje samo kada se probudi: pokretom ispred senzora prisilite buđenje
Stanje pokreta se ne ažurira
  1. Provjerite da leća PIR senzora nije zaklonjena i da je senzor postavljen na preporučenu visinu (1,8–2,5 m)
  2. Ako je senzor nedavno ugrađen, u web-sučelju uređaja provjerite postavke osjetljivosti i vremena neosjetljivosti: dugo vrijeme neosjetljivosti znači da senzor nakon svakog prepoznavanja dulje zanemaruje pokret
  3. Ako se senzor aktivira prerijetko, podesite broj impulsa (niža vrijednost = potrebno je manje uzastopnih pokreta)
  4. U sustavu TapHome provjerite stanje uređaja magnetski kontakt: 1 = otkriven pokret (alarm), 0 = nema pokreta (OK)
Baterija se brzo prazni
  1. Shelly Motion 2 ima ugrađenu punjivu Li-ion bateriju (6500 mAh) koja se puni preko USB-C, s uobičajenim trajanjem rada od 12 do 18 mjeseci
  2. Česta buđenja zbog puno pokreta ili kratkih intervala spavanja brže prazne bateriju
  3. Uključivanje SSL-a na MQTT-u znatno skraćuje trajanje baterije: koristite obični MQTT (port 1883) u pouzdanoj lokalnoj mreži
  4. Osigurajte jak Wi-Fi signal na mjestu senzora: slab signal znači dulje spajanje pri svakom buđenju

Uređaji Shelly Gen1 ne podržavaju MQTT preko TLS-a bez znatnog utjecaja na bateriju. Komunikacija između senzora i MQTT brokera obično nije šifrirana (obični MQTT, port 1883). Pobrinite se da je MQTT broker u pouzdanoj lokalnoj mreži.

Uključivanje MQTT-a na uređajima Shelly Gen1 isključuje vezu s oblakom. MQTT i oblak ne mogu istodobno raditi na istom uređaju.

Kako ga instalirati u TapHome

Preduvjeti

  • Uređaj Shelly spojen na Wi-Fi (2,4 GHz), npr. putem aplikacije Shelly ili vlastite pristupne točke uređaja
  • MQTT broker koji radi u vašoj lokalnoj mreži (npr. Mosquitto, Home Assistant ili ugrađeni broker TapHome)
  • TapHome CCU u istoj mreži kao broker

Na uređajima Gen1 uključivanje MQTT-a isključuje Shelly Cloud. MQTT i Shelly Cloud ne mogu raditi istodobno. Na uređajima Gen2/Plus to ograničenje ne vrijedi.

Korak 1 — Uključite MQTT na uređaju Shelly

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

  1. Otvorite web-sučelje Shelly: http://<device-ip>/
  2. Idite na Internet & Security → Advanced — MQTT
  3. Uključite MQTT
  4. Postavite MQTT Server: <broker-ip>:<port> (npr. 192.168.1.10:1883)
  5. Ako vaš broker zahtijeva autentifikaciju, postavite MQTT User i MQTT Password
  6. Kliknite Save — uređaj će se ponovno pokrenuti i spojiti na broker

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

  1. Otvorite web-sučelje Shelly: http://<device-ip>/
  2. Idite na Settings → MQTT
  3. Uključite MQTT
  4. Postavite Server: <broker-ip>:<port> (npr. 192.168.1.10:1883)
  5. Client ID je unaprijed popunjen ID-jem uređaja (npr. shellyplus1pm-AABBCCDDEE) — ostavite ga takvim, osim ako ga iz određenog razloga trebate promijeniti
  6. Kliknite Save i ponovno pokrenite uređaj

Za provjeru rada MQTT-a koristite MQTT klijent (npr. MQTT Explorer) i pretplatite se na shellies/# (Gen1) ili <device-id>/# (Gen2). Trebali biste vidjeti statusne poruke uređaja.

Korak 2 — Pronađite Device ID / MQTT Client ID

Neki predlošci zahtijevaju parametar Device ID ili MQTT Client ID. To je jedinstveni identifikator koji se koristi u MQTT temama (topics).

  • Gen1: nalazi se na naljepnici kao MAC adresa (npr. AABBCCDDEE). Device ID = shelly<model>-<mac>, npr. shelly1pm-AABBCCDDEE
  • Gen2/Plus: nalazi se u web-sučelju Shelly pod Settings → Device Info → Device ID ili na naljepnici uređaja

Korak 3 — Konfiguracija u sustavu TapHome

  1. U sustavu TapHome dodajte novi modul Packet Parser (MQTT)
  2. IP adresa: unesite IP adresu MQTT brokera (npr. 192.168.1.10)
  3. Port: 1883 (zadano; za TLS koristite 8883)
  4. Device ID / MQTT Client ID: unesite vrijednost iz koraka 2 (ako je predložak zahtijeva)
  5. Uvezite predložak — TapHome će se automatski pretplatiti na teme uređaja

Dostupni uređaji

Shelly Motion 2 MQTT Modul
Prilagođene varijable
sensor1_topic (string) = shellymotion2-deviceidMQTT Device ID senzora pokreta 1 — oblik je „shellymotion2-DEVICEID” (Device ID pronađite u web-sučelju Shelly → Settings → Device Info)
Open http://shellyIpAddress → Settings → Device info → copy Device ID. Format: shellymotion2-<last6MAC>
sensor2_topic (string) = shellymotion2-deviceidMQTT Device ID senzora pokreta 2
sensor3_topic (string) = shellymotion2-deviceidMQTT Device ID senzora pokreta 3
sensor4_topic (string) = shellymotion2-deviceidMQTT Device ID senzora pokreta 4
sensor5_topic (string) = shellymotion2-deviceidMQTT Device ID senzora pokreta 5
Senzor pokreta 1 Magnetski kontakt Samo za čitanje

PIR otkrivanje pokreta — javlja alarm kada je otkriven pokret, OK kada nema pokreta; čita $.sensor.motion iz JSON payloada /info

boolean
Servisni atributi
IP adresa
MAC adresa
Baterija
Signal
Oblak omogućen
Spojeno na oblak
Vrijeme uređaja
Osvijetljenost
Temperatura
Vrijeme rada
Verzija firmvera
Ažuriranje firmvera
Slobodni RAM
Slobodan prostor datotečnog sustava

Senzor pokreta 1

Listener
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
Servisni atributi
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
Senzor pokreta 2 Magnetski kontakt Samo za čitanje

PIR otkrivanje pokreta — javlja alarm kada je otkriven pokret, OK kada nema pokreta; čita $.sensor.motion iz JSON payloada /info

boolean
Servisni atributi
IP adresa
MAC adresa
Baterija
Signal
Oblak omogućen
Spojeno na oblak
Vrijeme uređaja
Osvijetljenost
Temperatura
Vrijeme rada
Verzija firmvera
Ažuriranje firmvera
Slobodni RAM
Slobodan prostor datotečnog sustava

Senzor pokreta 2

Listener
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
Servisni atributi
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
Senzor pokreta 3 Magnetski kontakt Samo za čitanje

PIR otkrivanje pokreta — javlja alarm kada je otkriven pokret, OK kada nema pokreta; čita $.sensor.motion iz JSON payloada /info

boolean
Servisni atributi
IP adresa
MAC adresa
Baterija
Signal
Oblak omogućen
Spojeno na oblak
Vrijeme uređaja
Osvijetljenost
Temperatura
Vrijeme rada
Verzija firmvera
Ažuriranje firmvera
Slobodni RAM
Slobodan prostor datotečnog sustava

Senzor pokreta 3

Listener
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
Servisni atributi
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
Senzor pokreta 4 Magnetski kontakt Samo za čitanje

PIR otkrivanje pokreta — javlja alarm kada je otkriven pokret, OK kada nema pokreta; čita $.sensor.motion iz JSON payloada /info

boolean
Servisni atributi
IP adresa
MAC adresa
Baterija
Signal
Oblak omogućen
Spojeno na oblak
Vrijeme uređaja
Osvijetljenost
Temperatura
Vrijeme rada
Verzija firmvera
Ažuriranje firmvera
Slobodni RAM
Slobodan prostor datotečnog sustava

Senzor pokreta 4

Listener
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
Servisni atributi
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
Senzor pokreta 5 Magnetski kontakt Samo za čitanje

PIR otkrivanje pokreta — javlja alarm kada je otkriven pokret, OK kada nema pokreta; čita $.sensor.motion iz JSON payloada /info

boolean
Servisni atributi
IP adresa
MAC adresa
Baterija
Signal
Oblak omogućen
Spojeno na oblak
Vrijeme uređaja
Osvijetljenost
Temperatura
Vrijeme rada
Verzija firmvera
Ažuriranje firmvera
Slobodni RAM
Slobodan prostor datotečnog sustava

Senzor pokreta 5

Listener
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
Servisni atributi
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
Povezivanje: Packet Parser → MQTT • Naziv računala (hostname): shellymotion2-{MAC}.local
Moguća poboljšanja (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.

Izvori

Pronašli ste problem s ovim predloškom uređaja?

Recite nam što ne radi, što nedostaje ili kako bi se predložak trebao ponašati. Vaše povratne informacije pomažu nam da katalog bude točan.

Provjerio TapHome

Želite ovo koristiti u svojoj centralnoj jedinici TapHome Core?

Otvorite ovaj predložak na portalu Customer Portal kako biste ga primijenili na jedan od svojih domova ili predložili poboljšanje i poslali ga natrag u katalog.

Otvorite na portalu