TapHome

Shelly Motion 2

Packet Parser → MQTT
Beküldő
Utoljára frissítve: 03. 2026
Shelly Motion 2

A Shelly Motion 2 (SHMOS-02) egy elemes (Li-ion 6500 mAh, USB-C-vel tölthető) Wi-Fi PIR mozgásérzékelő. A TapHome MQTT-n keresztül kommunikál az eszközzel — ez a javasolt protokoll az elemes Shelly eszközökhöz, mivel az érzékelő az idő nagy részében alszik, és csak ébredési események (mozgásérzékelés vagy periodikus időzítő) alkalmával küld adatokat.

A relétípusú Gen1 Shelly eszközöktől eltérően, amelyek egyedi állapot-topicokat publikálnak, a Motion 2 a teljes állapotát egyetlen /info JSON payloadban publikálja ébredéskor. A TapHome listener szkript elemzi ezt a JSON-t a mozgásállapot, fényerősség, hőmérséklet, akkumulátorszint és diagnosztikai attribútumok kinyeréséhez.

A sablon modulonként legfeljebb 5 Shelly Motion 2 érzékelőt támogat. Minden érzékelőpéldány a sensorN_topic egyéni változóval különböztethető meg, amely az eszköz MQTT Client ID-jára mutat.

Konfiguráció

Device ID

Minden Shelly Motion 2 egyedi MQTT Device ID-val rendelkezik shellymotion2-<MAC> formátumban, ahol a <MAC> a teljes 12 karakteres MAC-cím nagybetűs hexadecimális formában (pl. shellymotion2-AABBCCDDEEFF).

A Device ID megtalálható:

  • Az eszköz címkéjén (MAC-cím)
  • A Shelly webes felületén: SettingsDevice Info
  • API-n keresztül: GET http://<device-ip>/settingsdevice.hostname mező
Sablon beállítása

A sablon TapHome-ba történő importálása után:

  1. Nyisd meg a Shelly Motion 2 MQTT modult
  2. Állítsd be az MQTT Broker IP-t és a Port-ot (alapértelmezett 1883)
  3. Minden érzékelőpéldányhoz állítsd be a sensorN_topic egyéni változót a megfelelő Shelly Motion 2 Device ID-jára (pl. shellymotion2-AABBCCDDEEFF)

A modul feliratkozik a shellies/# topicra, és a listener szkriptek a konfigurált topic-előtag alapján szűrik az üzeneteket.

Csak azokat az érzékelőhelyeket konfiguráld, amelyeket ténylegesen használsz. A nem konfigurált helyek (az alapértelmezett shellymotion2-deviceid értékkel) hibaüzenetet jelenítenek meg, amely a helyes topic beállítására szólít fel.

Mozgásérzékelő beállításai

A Shelly Motion 2 több konfigurálható paraméterrel rendelkezik, amelyek befolyásolják az érzékelési viselkedést. Ezeket közvetlenül az eszközön kell konfigurálni a webes felületén (http://<device-ip>/) keresztül, nem a TapHome-on:

ParaméterTartományLeírás
Érzékenység1–256Mozgásérzékelési érzékenység (alacsonyabb = érzékenyebb)
Vakidő1–1440 percPercek, amíg az érzékelés után a mozgás figyelmen kívül marad
Impulzusszám1–4Egymás utáni mozgások száma a megerősítéshez
Működési módANY / DARK / TWILIGHT / BRIGHTMikor aktív az érzékelés a környezeti fény alapján
Alvási idő0–86400 mpPeriodikus ébredési intervallum másodpercben

A rövidebb alvási idők növelik az adatok frissességét, de csökkentik az akkumulátor élettartamát. Az alapértelmezett ébredési intervallum a legtöbb felhasználási esethez elegendő. A mozgáseseményeket mindig azonnali ébredés kíséri, az alvási időzítőtől függetlenül.

Eszközképességek

Mozgásérzékelés

Minden érzékelőpéldány Reed Contact eszközként van leképezve „security" képességgel a TapHome-ban. A mozgásállapot a shellies/<id>/info topicból kerül kiolvasásra — konkrétan a JSON payload $.sensor.motion mezőjéből:

  • trueRiasztás (mozgás érzékelve)
  • falseOK (nincs mozgás)

Az érzékelő felébred és közzéteszi állapotát mozgásérzékeléskor (az érzékenységi, vakidő- és impulzusszám-beállítások szerint), valamint a periodikus ébredési intervallumoknál.

Szervizattribútumok

Minden érzékelőpéldány 14 eszközszintű szervizattribútumot biztosít, amelyek mind az /info JSON payloadból kerülnek kiolvasásra:

AttribútumForrásmezőLeírás
IP-cím$.wifi_sta.ipAz érzékelő Wi-Fi IP-címe
MAC-cím$.macHardveres MAC-cím
Akkumulátor$.bat.voltage, $.bat.valueAkkumulátorfeszültség és százalék (pl. 3,83V (97%))
Jel$.wifi_sta.rssiWi-Fi jelerősség dB-ben
Cloud engedélyezve$.cloud.enabledEngedélyezve van-e a Shelly Cloud
Cloudhoz csatlakozva$.cloud.connectedCsatlakozik-e az eszköz a Shelly Cloudhoz
Eszközidő$.timeAz eszköz aktuális ideje
Fényerősség$.lux.valueKörnyezeti fényszint luxban
Hőmérséklet$.tmp.value, $.tmp.unitsBelső hőmérsékletmérés
Üzemidő$.uptimeAz utolsó újraindítás óta eltelt idő
FW verzió$.fw_info.fwAktuális firmware verzió
FW frissítés$.update.has_updateElérhető-e firmware frissítés
Szabad RAM$.ram_total, $.ram_freeSzabad memória
Szabad FS terület$.fs_size, $.fs_freeSzabad fájlrendszer-tárterület

Alacsony akkumulátorszint figyelmeztetés automatikusan aktiválódik, ha az akkumulátorszint 20 % alá esik.

További képességek (nem implementált)

A Shelly Motion 2 emellett közzéteszi a rezgés/illetéktelen beavatkozás érzékelését ($.sensor.vibration, beállítható érzékenység 0–80), a megvilágítási kategóriát ($.lux.illumination — dark/twilight/bright) és az USB töltő állapotát ($.charger) az /info JSON payloadon keresztül. Az online/offline állapot az LWT topicon (shellies/<id>/online) keresztül érhető el. Ezek a képességek elérhetők az eszköz MQTT kimenetében, de az aktuális TapHome sablonban nincsenek leképezve. Egy jövőbeli sablonfrissítésben hozzáadhatók.

Hibaelhárítás

Az érzékelő nem jelez adatokat
  1. Ellenőrizd, hogy a Shelly Motion 2 csatlakozik a Wi-Fi-hez, és az MQTT engedélyezve van az eszközbeállításokban
  2. Ellenőrizd, hogy a sensorN_topic egyéni változó pontosan megegyezik a Device ID-val (pl. shellymotion2-AABBCCDDEEFF)
  3. Használj MQTT klienst (pl. MQTT Explorer) a shellies/# topicra való feliratkozáshoz, és ellenőrizd, hogy az érzékelő ébredéskor üzeneteket küld
  4. A Motion 2 elemről üzemel, és csak ébredéskor küld adatokat — válts ki mozgáseseményt az ébredés kényszerítéséhez
A mozgásállapot nem frissül
  1. Ellenőrizd, hogy a PIR érzékelő lencséje nincs eltakarva, és az érzékelő az ajánlott magasságban (1,8–2,5 m) van felszerelve
  2. Ha az érzékelő nemrég lett telepítve, ellenőrizd az érzékenységi és vakidő-beállításokat az eszköz webes felületén — a magas vakidő azt jelenti, hogy az érzékelő minden érzékelés után hosszabb ideig figyelmen kívül hagyja a mozgást
  3. Állítsd be az impulzusszámot, ha az érzékelő túl ritkán aktiválódik (alacsonyabb = kevesebb egymást követő mozgás szükséges)
  4. Ellenőrizd a TapHome-ban a Reed Contact eszköz állapotát — 1 = mozgás érzékelve (riasztás), 0 = nincs mozgás (OK)
Az akkumulátor gyorsan merül
  1. A Shelly Motion 2 beépített újratölthető Li-ion akkumulátort használ (6500 mAh), USB-C-vel töltve, 12–18 hónapos tipikus aktív élettartammal
  2. A magas mozgásaktivitás vagy a rövid alvási intervallumok miatti gyakori ébredések gyorsabban merítik az akkumulátort
  3. Az SSL engedélyezése az MQTT-n jelentősen csökkenti az akkumulátor élettartamát — használj sima MQTT-t (1883-as port) megbízható helyi hálózaton
  4. Biztosíts erős Wi-Fi jelet az érzékelő helyén — a gyenge jel hosszabb csatlakozási időt jelent minden ébredésnél

A Gen1 Shelly eszközök nem támogatják az MQTT-t TLS-en keresztül jelentős akkumulátor-hatás nélkül. Az érzékelő és az MQTT broker közötti kommunikáció jellemzően titkosítatlan (sima MQTT, 1883-as port). Győződj meg róla, hogy az MQTT broker megbízható helyi hálózaton működik.

Az MQTT engedélyezése Gen1 Shelly eszközökön letiltja a Cloud-kapcsolatot. Az MQTT és a Cloud nem létezhet együtt ugyanazon az eszközön.

Telepítés a TapHome-ban

Előfeltételek

  • Shelly eszköz csatlakoztatva a Wi-Fi-hez (ha még nem, lásd a HTTP kapcsolódási útmutatót)
  • MQTT broker fut a helyi hálózaton (pl. Mosquitto, Home Assistant vagy a TapHome beépített brokere)
  • TapHome CCU ugyanazon a hálózaton, mint a broker

A Gen1 eszközökön az MQTT engedélyezése letiltja a Shelly Cloudot. A kettő nem futhat egyszerre. A Gen2/Plus eszközökön ez a korlátozás nem érvényes.

1. lépés — MQTT engedélyezése a Shelly eszközön

Gen1 eszközök (Shelly 1, 1PM, 2.5, EM, 3EM, Plug S, RGBW2, Dimmer, TRV…)

  1. Nyissa meg a Shelly webes felületet: http://<device-ip>/
  2. Navigáljon az Internet & SecurityAdvanced — MQTT menüpontra
  3. Engedélyezze az MQTT-t
  4. Állítsa be az MQTT Server-t: <broker-ip>:<port> (pl. 192.168.1.10:1883)
  5. Opcionálisan állítsa be az MQTT User és MQTT Password mezőket, ha a broker hitelesítést igényel
  6. Kattintson a Save gombra — az eszköz újraindul és csatlakozik a brokerhez

Gen2 / Plus eszközök (Shelly Plus 1, Plus 1PM, Plus 2PM, Plus Plug S, Plus H&T, Pro 3EM…)

  1. Nyissa meg a Shelly webes felületet: http://<device-ip>/
  2. Navigáljon a SettingsMQTT menüpontra
  3. Engedélyezze az MQTT-t
  4. Állítsa be a Server-t: <broker-ip>:<port> (pl. 192.168.1.10:1883)
  5. A Client ID előre ki van töltve az eszköz azonosítójával (pl. shellyplus1pm-AABBCCDDEE) — hagyja így, hacsak nincs konkrét oka a változtatásra
  6. Kattintson a Save gombra és indítsa újra az eszközt

Az MQTT működésének ellenőrzéséhez használjon egy MQTT klienst (pl. MQTT Explorer), és iratkozzon fel a shellies/# (Gen1) vagy <device-id>/# (Gen2) topikra. Látnia kell az eszköz állapotüzeneteit.

2. lépés — Device ID / MQTT Client ID megkeresése

Egyes sablonok Device ID vagy MQTT Client ID paramétert igényelnek. Ez az egyedi azonosító, amelyet az MQTT topikokban használnak.

  • Gen1: a címkén MAC-címként található (pl. AABBCCDDEE). Device ID = shelly<model>-<mac>, pl. shelly1pm-AABBCCDDEE
  • Gen2/Plus: a Shelly webes felületén a SettingsDevice InfoDevice ID alatt található, vagy az eszköz címkéjén

3. lépés — Konfigurálás a TapHome-ban

  1. A TapHome-ban adjon hozzá egy új Packet Parser (MQTT) modult
  2. IP Address: adja meg az MQTT broker IP-címét (pl. 192.168.1.10)
  3. Port: 1883 (alapértelmezett; TLS esetén használjon 8883-at)
  4. Device ID / MQTT Client ID: adja meg a 2. lépésben kapott értéket (ha a sablon megköveteli)
  5. Importálja a sablont — a TapHome automatikusan feliratkozik az eszköz topikjaira

Elérhető eszközök

Shelly Motion 2 MQTT Modul
Egyéni változók
sensor1_topic (string) = shellymotion2-deviceidMozgásérzékelő 1 MQTT eszközazonosítója — formátum: 'shellymotion2-DEVICEID' (Shelly webes felület → Settings → Device Info)
Open http://shellyIpAddress → Settings → Device info → copy Device ID. Format: shellymotion2-<last6MAC>
sensor2_topic (string) = shellymotion2-deviceidMozgásérzékelő 2 MQTT eszközazonosítója
sensor3_topic (string) = shellymotion2-deviceidMozgásérzékelő 3 MQTT eszközazonosítója
sensor4_topic (string) = shellymotion2-deviceidMozgásérzékelő 4 MQTT eszközazonosítója
sensor5_topic (string) = shellymotion2-deviceidMozgásérzékelő 5 MQTT eszközazonosítója
Mozgásérzékelő 1 Reed kontaktus Csak olvasható

PIR mozgásérzékelés — riasztást jelez mozgás érzékelésekor, OK mozgás nélkül; $.sensor.motion feldolgozása az /info JSON payloadból

boolean
Szerviz attribútumok
IP-cím
MAC-cím
Akkumulátor
Jel
Felhő engedélyezve
Felhő csatlakoztatva
Eszköz idő
Megvilágítás
Hőmérséklet
Üzemidő
FW verzió
FW frissítés
Szabad RAM
Szabad FS terület

Mozgásérzékelő 1

Figyelő
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
Szerviz attribútumok
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
Mozgásérzékelő 2 Reed kontaktus Csak olvasható

PIR mozgásérzékelés — riasztást jelez mozgás érzékelésekor, OK mozgás nélkül; $.sensor.motion feldolgozása az /info JSON payloadból

boolean
Szerviz attribútumok
IP-cím
MAC-cím
Akkumulátor
Jel
Felhő engedélyezve
Felhő csatlakoztatva
Eszköz idő
Megvilágítás
Hőmérséklet
Üzemidő
FW verzió
FW frissítés
Szabad RAM
Szabad FS terület

Mozgásérzékelő 2

Figyelő
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
Szerviz attribútumok
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
Mozgásérzékelő 3 Reed kontaktus Csak olvasható

PIR mozgásérzékelés — riasztást jelez mozgás érzékelésekor, OK mozgás nélkül; $.sensor.motion feldolgozása az /info JSON payloadból

boolean
Szerviz attribútumok
IP-cím
MAC-cím
Akkumulátor
Jel
Felhő engedélyezve
Felhő csatlakoztatva
Eszköz idő
Megvilágítás
Hőmérséklet
Üzemidő
FW verzió
FW frissítés
Szabad RAM
Szabad FS terület

Mozgásérzékelő 3

Figyelő
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
Szerviz attribútumok
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
Mozgásérzékelő 4 Reed kontaktus Csak olvasható

PIR mozgásérzékelés — riasztást jelez mozgás érzékelésekor, OK mozgás nélkül; $.sensor.motion feldolgozása az /info JSON payloadból

boolean
Szerviz attribútumok
IP-cím
MAC-cím
Akkumulátor
Jel
Felhő engedélyezve
Felhő csatlakoztatva
Eszköz idő
Megvilágítás
Hőmérséklet
Üzemidő
FW verzió
FW frissítés
Szabad RAM
Szabad FS terület

Mozgásérzékelő 4

Figyelő
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
Szerviz attribútumok
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
Mozgásérzékelő 5 Reed kontaktus Csak olvasható

PIR mozgásérzékelés — riasztást jelez mozgás érzékelésekor, OK mozgás nélkül; $.sensor.motion feldolgozása az /info JSON payloadból

boolean
Szerviz attribútumok
IP-cím
MAC-cím
Akkumulátor
Jel
Felhő engedélyezve
Felhő csatlakoztatva
Eszköz idő
Megvilágítás
Hőmérséklet
Üzemidő
FW verzió
FW frissítés
Szabad RAM
Szabad FS terület

Mozgásérzékelő 5

Figyelő
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
Szerviz attribútumok
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
Kapcsolat: Packet Parser → MQTT
Lehetséges fejlesztések (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.

Források