TapHome

Shelly Motion 2

Packet Parser → MQTT
Přidal
Poslední aktualizace: 03. 2026
Shelly Motion 2

Shelly Motion 2 (SHMOS-02) je bateriový (Li-ion 6500 mAh, nabíjecí přes USB-C) Wi-Fi PIR pohybový senzor. TapHome komunikuje se zařízením přes MQTT — doporučený protokol pro bateriová Shelly zařízení, protože senzor většinu času spí a publikuje data pouze při událostech probuzení (detekce pohybu nebo periodický časovač).

Na rozdíl od reléových Gen1 Shelly zařízení, která publikují individuální stavové topicy, Motion 2 publikuje kompletní stav přes jeden /info JSON payload při probuzení. TapHome listenerový skript parsuje tento JSON na extrakci stavu pohybu, osvětlení, teploty, stavu baterie a diagnostických atributů.

Šablona podporuje až 5 Shelly Motion 2 senzorů na modul. Každá instance senzoru se rozlišuje custom proměnnou sensorN_topic odkazující na MQTT Client ID zařízení.

Konfigurace

Device ID

Každý Shelly Motion 2 má unikátní MQTT Device ID ve formátu shellymotion2-<MAC>, kde <MAC> je plná 12znaková MAC adresa v hexadecimálním tvaru velkými písmeny (např. shellymotion2-AABBCCDDEEFF).

Device ID najdete:

  • Na štítku zařízení (MAC adresa)
  • Ve webovém rozhraní Shelly: SettingsDevice Info
  • Přes API: GET http://<device-ip>/settings → pole device.hostname
Nastavení šablony

Po importu šablony v TapHome:

  1. Otevřete modul Shelly Motion 2 MQTT
  2. Nastavte MQTT Broker IP a Port (výchozí 1883)
  3. Pro každou instanci senzoru nastavte custom proměnnou sensorN_topic na Device ID odpovídajícího Shelly Motion 2 (např. shellymotion2-AABBCCDDEEFF)

Modul se přihlásí k odběru shellies/# a listenerové skripty filtrují zprávy podle nakonfigurovaného prefixu topicu.

Konfigurujte pouze sloty senzorů, které skutečně používáte. Nenakonfigurované sloty (s výchozí hodnotou shellymotion2-deviceid) zobrazí chybovou zprávu vyzývající k nastavení správného topicu.

Nastavení pohybového senzoru

Shelly Motion 2 má několik konfigurovatelných parametrů ovlivňujících chování detekce. Tyto se konfigurují přímo na zařízení přes jeho webové rozhraní (http://<device-ip>/), ne přes TapHome:

ParametrRozsahPopis
Citlivost1–256Citlivost detekce pohybu (nižší = citlivější)
Slepý čas1–1440 minMinuty ignorování pohybu po detekci
Počet impulzů1–4Počet po sobě jdoucích pohybů k potvrzení
Provozní režimANY / DARK / TWILIGHT / BRIGHTKdy je detekce aktivní na základě okolního světla
Čas spánku0–86400 sPeriodický interval probuzení v sekundách

Kratší časy spánku zvyšují aktuálnost dat, ale snižují výdrž baterie. Výchozí interval probuzení je dostatečný pro většinu případů použití. Pohybové události vždy vyvolají okamžité probuzení bez ohledu na časovač spánku.

Schopnosti zařízení

Detekce pohybu

Každá instance senzoru je mapována jako zařízení Reed Contact se schopností „security" v TapHome. Stav pohybu se parsuje z topicu shellies/<id>/info — konkrétně pole $.sensor.motion v JSON payloadu:

  • trueAlarm (detekován pohyb)
  • falseOK (žádný pohyb)

Senzor se probudí a publikuje svůj stav při detekci pohybu (podle nastavení citlivosti, slepého času a počtu impulzů) a také během periodických intervalů probuzení.

Servisní atributy

Každá instance senzoru poskytuje 14 servisních atributů na úrovni zařízení, všechny parsované z /info JSON payloadu:

AtributZdrojové polePopis
IP adresa$.wifi_sta.ipWi-Fi IP adresa senzoru
MAC adresa$.macHardwarová MAC adresa
Baterie$.bat.voltage, $.bat.valueNapětí a procenta baterie (např. 3,83V (97%))
Signál$.wifi_sta.rssiSíla Wi-Fi signálu v dB
Cloud povolen$.cloud.enabledZda je Shelly Cloud povolen
Připojen ke cloudu$.cloud.connectedZda je zařízení připojeno k Shelly Cloud
Čas zařízení$.timeAktuální čas na zařízení
Osvětlení$.lux.valueÚroveň okolního světla v luxech
Teplota$.tmp.value, $.tmp.unitsInterní měření teploty
Doba provozu$.uptimeČas od posledního restartu
Verze FW$.fw_info.fwAktuální verze firmwaru
Aktualizace FW$.update.has_updateZda je dostupná aktualizace firmwaru
Volná RAM$.ram_total, $.ram_freeDostupná paměť
Volné místo FS$.fs_size, $.fs_freeDostupné úložiště souborového systému

Varování o nízké baterii se automaticky spustí, když úroveň baterie klesne pod 20 %.

Další schopnosti (neimplementované)

Shelly Motion 2 také publikuje detekci vibrací/neoprávněné manipulace ($.sensor.vibration, nastavitelná citlivost 0–80), kategorii osvětlení ($.lux.illumination — dark/twilight/bright) a stav USB nabíječky ($.charger) přes /info JSON payload. Stav online/offline je dostupný přes LWT topic (shellies/<id>/online). Tyto schopnosti jsou dostupné ve výstupu MQTT zařízení, ale nejsou mapovány v aktuální TapHome šabloně. Mohou být přidány v budoucí aktualizaci šablony.

Řešení problémů

Senzor nehlásí data
  1. Ověřte, že Shelly Motion 2 je připojen k Wi-Fi a MQTT je povoleno v nastavení zařízení
  2. Zkontrolujte, že custom proměnná sensorN_topic přesně odpovídá Device ID (např. shellymotion2-AABBCCDDEEFF)
  3. Použijte MQTT klienta (např. MQTT Explorer) pro přihlášení k odběru shellies/# a ověřte, že senzor publikuje zprávy při probuzení
  4. Motion 2 je napájen z baterie a publikuje data pouze při probuzení — vyvolejte pohybovou událost pro vynucení probuzení
Stav pohybu se neaktualizuje
  1. Zkontrolujte, že čočka PIR senzoru není zakrytá a senzor je namontován v doporučené výšce (1,8–2,5 m)
  2. Pokud byl senzor nedávno nainstalován, ověřte nastavení citlivosti a slepého času ve webovém rozhraní zařízení — vysoký slepý čas znamená, že senzor ignoruje pohyb delší dobu po každé detekci
  3. Upravte počet impulzů, pokud se senzor spouští příliš zřídka (nižší = méně po sobě jdoucích pohybů)
  4. Zkontrolujte v TapHome stav zařízení Reed Contact — 1 = detekován pohyb (alarm), 0 = žádný pohyb (OK)
Baterie se rychle vybíjí
  1. Shelly Motion 2 používá vestavěný nabíjecí Li-ion akumulátor (6500 mAh) nabíjený přes USB-C, s typickou aktivní výdrží 12–18 měsíců
  2. Časté probouzení kvůli vysoké pohybové aktivitě nebo krátkým intervalům spánku vybíjí baterii rychleji
  3. Povolení SSL na MQTT výrazně snižuje výdrž baterie — používejte plain MQTT (port 1883) v důvěryhodné lokální síti
  4. Zajistěte silný Wi-Fi signál na místě senzoru — slabý signál znamená delší časy připojení při každém probuzení

Gen1 Shelly zařízení nepodporují MQTT přes TLS bez výrazného dopadu na baterii. Komunikace mezi senzorem a MQTT brokerem je typicky nešifrovaná (plain MQTT, port 1883). Zajistěte, aby byl MQTT broker v důvěryhodné lokální síti.

Povolení MQTT na Gen1 Shelly zařízeních zakáže Cloud konektivitu. MQTT a Cloud nemohou koexistovat na stejném zařízení.

Jak nainstalovat v TapHome

Předpoklady

  • Zařízení Shelly připojené k Wi-Fi (pokud ještě ne, podívejte se na návod na HTTP připojení)
  • MQTT broker běžící ve vaší lokální síti (např. Mosquitto, Home Assistant nebo vestavěný broker TapHome)
  • TapHome CCU ve stejné síti jako broker

Na zařízeních Gen1 povolení MQTT vypne Shelly Cloud. Obojí nemůže běžet současně. Na zařízeních Gen2/Plus toto omezení neplatí.

Krok 1 — Povolte MQTT na zařízení Shelly

Zařízení Gen1 (Shelly 1, 1PM, 2.5, EM, 3EM, Plug S, RGBW2, Dimmer, TRV…)

  1. Otevřete webové rozhraní Shelly: http://<device-ip>/
  2. Přejděte na Internet & SecurityAdvanced — MQTT
  3. Povolte MQTT
  4. Nastavte MQTT Server: <broker-ip>:<port> (např. 192.168.1.10:1883)
  5. Volitelně nastavte MQTT User a MQTT Password, pokud váš broker vyžaduje autentifikaci
  6. Klikněte na Save — zařízení se restartuje a připojí k brokeru

Zařízení Gen2 / Plus (Shelly Plus 1, Plus 1PM, Plus 2PM, Plus Plug S, Plus H&T, Pro 3EM…)

  1. Otevřete webové rozhraní Shelly: http://<device-ip>/
  2. Přejděte na SettingsMQTT
  3. Povolte MQTT
  4. Nastavte Server: <broker-ip>:<port> (např. 192.168.1.10:1883)
  5. Client ID je předvyplněné ID zařízení (např. shellyplus1pm-AABBCCDDEE) — ponechte tak, pokud nemáte konkrétní důvod ke změně
  6. Klikněte na Save a restartujte zařízení

Pro ověření funkčnosti MQTT použijte MQTT klienta (např. MQTT Explorer) a přihlaste se k odběru shellies/# (Gen1) nebo <device-id>/# (Gen2). Měli byste vidět stavové zprávy ze zařízení.

Krok 2 — Zjistěte Device ID / MQTT Client ID

Některé šablony vyžadují parametr Device ID nebo MQTT Client ID. Jde o jedinečný identifikátor používaný v MQTT topicích.

  • Gen1: nachází se na štítku jako MAC adresa (např. AABBCCDDEE). Device ID = shelly<model>-<mac>, např. shelly1pm-AABBCCDDEE
  • Gen2/Plus: nachází se ve webovém rozhraní Shelly v části SettingsDevice InfoDevice ID, nebo na štítku zařízení

Krok 3 — Konfigurace v TapHome

  1. V TapHome přidejte nový modul Packet Parser (MQTT)
  2. IP Address: zadejte IP adresu MQTT brokeru (např. 192.168.1.10)
  3. Port: 1883 (výchozí; pro TLS použijte 8883)
  4. Device ID / MQTT Client ID: zadejte hodnotu z kroku 2 (pokud to šablona vyžaduje)
  5. Importujte šablonu — TapHome se automaticky přihlásí k odběru topiců zařízení

Dostupná zařízení

Shelly Motion 2 MQTT Modul
Vlastní proměnné
sensor1_topic (string) = shellymotion2-deviceidMQTT identifikátor pohybového senzoru 1 — formát je 'shellymotion2-DEVICEID' (najdete ve webovém rozhraní Shelly → Settings → Device Info)
Open http://shellyIpAddress → Settings → Device info → copy Device ID. Format: shellymotion2-<last6MAC>
sensor2_topic (string) = shellymotion2-deviceidMQTT identifikátor pohybového senzoru 2
sensor3_topic (string) = shellymotion2-deviceidMQTT identifikátor pohybového senzoru 3
sensor4_topic (string) = shellymotion2-deviceidMQTT identifikátor pohybového senzoru 4
sensor5_topic (string) = shellymotion2-deviceidMQTT identifikátor pohybového senzoru 5
Detektor pohybu 1 Jazýčkový kontakt Pouze ke čtení

PIR detekce pohybu — hlásí alarm při detekci pohybu, OK bez pohybu; parsuje $.sensor.motion z /info JSON payloadu

boolean
Servisní atributy
IP adresa
MAC adresa
Baterie
Signál
Cloud povolen
Připojeno ke cloudu
Čas zařízení
Osvětlení
Teplota
Doba provozu
Verze FW
Aktualizace FW
Volná RAM
Volné místo FS

Detektor pohybu 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
Servisní atributy
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
Detektor pohybu 2 Jazýčkový kontakt Pouze ke čtení

PIR detekce pohybu — hlásí alarm při detekci pohybu, OK bez pohybu; parsuje $.sensor.motion z /info JSON payloadu

boolean
Servisní atributy
IP adresa
MAC adresa
Baterie
Signál
Cloud povolen
Připojeno ke cloudu
Čas zařízení
Osvětlení
Teplota
Doba provozu
Verze FW
Aktualizace FW
Volná RAM
Volné místo FS

Detektor pohybu 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
Servisní atributy
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
Detektor pohybu 3 Jazýčkový kontakt Pouze ke čtení

PIR detekce pohybu — hlásí alarm při detekci pohybu, OK bez pohybu; parsuje $.sensor.motion z /info JSON payloadu

boolean
Servisní atributy
IP adresa
MAC adresa
Baterie
Signál
Cloud povolen
Připojeno ke cloudu
Čas zařízení
Osvětlení
Teplota
Doba provozu
Verze FW
Aktualizace FW
Volná RAM
Volné místo FS

Detektor pohybu 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
Servisní atributy
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
Detektor pohybu 4 Jazýčkový kontakt Pouze ke čtení

PIR detekce pohybu — hlásí alarm při detekci pohybu, OK bez pohybu; parsuje $.sensor.motion z /info JSON payloadu

boolean
Servisní atributy
IP adresa
MAC adresa
Baterie
Signál
Cloud povolen
Připojeno ke cloudu
Čas zařízení
Osvětlení
Teplota
Doba provozu
Verze FW
Aktualizace FW
Volná RAM
Volné místo FS

Detektor pohybu 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
Servisní atributy
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
Detektor pohybu 5 Jazýčkový kontakt Pouze ke čtení

PIR detekce pohybu — hlásí alarm při detekci pohybu, OK bez pohybu; parsuje $.sensor.motion z /info JSON payloadu

boolean
Servisní atributy
IP adresa
MAC adresa
Baterie
Signál
Cloud povolen
Připojeno ke cloudu
Čas zařízení
Osvětlení
Teplota
Doba provozu
Verze FW
Aktualizace FW
Volná RAM
Volné místo FS

Detektor pohybu 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
Servisní atributy
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
Připojení: Packet Parser → MQTT
Možná vylepšení (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.

Zdroje