TapHome

Shelly Motion 2

Packet Parser → MQTT
Pridal
Posledná aktualizácia: 03. 2026
Shelly Motion 2

Shelly Motion 2 (SHMOS-02) je batériový (Li-ion 6500 mAh, nabíjateľný cez USB-C) Wi-Fi PIR pohybový senzor. TapHome komunikuje so zariadením cez MQTT — odporúčaný protokol pre batériové Shelly zariadenia, keďže senzor väčšinu času spí a publikuje dáta len pri udalostiach prebudenia (detekcia pohybu alebo periodický časovač).

Na rozdiel od reléových Gen1 Shelly zariadení, ktoré publikujú individuálne stavové topicy, Motion 2 publikuje kompletný stav cez jeden /info JSON payload pri prebudení. TapHome listenerový skript parsuje tento JSON na extrakciu stavu pohybu, osvetlenia, teploty, stavu batérie a diagnostických atribútov.

Šablóna podporuje až 5 Shelly Motion 2 senzorov na modul. Každá inštancia senzora sa rozlišuje custom premennou sensorN_topic ukazujúcou na MQTT Client ID zariadenia.

Konfigurácia

Device ID

Každý Shelly Motion 2 má unikátne MQTT Device ID vo formáte shellymotion2-<MAC>, kde <MAC> je plná 12-znaková MAC adresa v hexadecimálnom tvare veľkými písmenami (napr. shellymotion2-AABBCCDDEEFF).

Device ID nájdete:

  • Na štítku zariadenia (MAC adresa)
  • Vo webovom rozhraní Shelly: SettingsDevice Info
  • Cez API: GET http://<device-ip>/settings → pole device.hostname
Nastavenie šablóny

Po importe šablóny v TapHome:

  1. Otvorte modul Shelly Motion 2 MQTT
  2. Nastavte MQTT Broker IP a Port (predvolene 1883)
  3. Pre každú inštanciu senzora nastavte custom premennú sensorN_topic na Device ID zodpovedajúceho Shelly Motion 2 (napr. shellymotion2-AABBCCDDEEFF)

Modul sa prihlási na odber shellies/# a listenerové skripty filtrujú správy podľa nakonfigurovaného prefixu topicu.

Konfigurujte len sloty senzorov, ktoré skutočne používate. Nenakonfigurované sloty (s predvolenou hodnotou shellymotion2-deviceid) zobrazia chybovú správu vyzývajúcu na nastavenie správneho topicu.

Nastavenia pohybového senzora

Shelly Motion 2 má niekoľko konfigurovateľných parametrov ovplyvňujúcich správanie detekcie. Tieto sa konfigurujú priamo na zariadení cez jeho webové rozhranie (http://<device-ip>/), nie cez TapHome:

ParameterRozsahPopis
Citlivosť1–256Citlivosť detekcie pohybu (nižšia = citlivejšia)
Slepý čas1–1440 minMinúty ignorovania pohybu po detekcii
Počet impulzov1–4Počet po sebe idúcich pohybov na potvrdenie
Prevádzkový režimANY / DARK / TWILIGHT / BRIGHTKedy je detekcia aktívna podľa okolitého svetla
Čas spánku0–86400 sPeriodický interval prebudenia v sekundách

Kratšie časy spánku zvyšujú aktuálnosť dát, ale znižujú výdrž batérie. Predvolený interval prebudenia je dostatočný pre väčšinu prípadov použitia. Pohybové udalosti vždy vyvolajú okamžité prebudenie bez ohľadu na časovač spánku.

Schopnosti zariadenia

Detekcia pohybu

Každá inštancia senzora je mapovaná ako zariadenie Reed Contact s „security" schopnosťou v TapHome. Stav pohybu sa parsuje z topicu shellies/<id>/info — konkrétne pole $.sensor.motion v JSON payloade:

  • trueAlarm (detekovaný pohyb)
  • falseOK (žiadny pohyb)

Senzor sa prebudí a publikuje svoj stav pri detekcii pohybu (podľa nastavení citlivosti, slepého času a počtu impulzov) a tiež počas periodických intervalov prebudenia.

Servisné atribúty

Každá inštancia senzora poskytuje 14 servisných atribútov na úrovni zariadenia, všetky parsované z /info JSON payloadu:

AtribútZdrojové polePopis
IP adresa$.wifi_sta.ipWi-Fi IP adresa senzora
MAC adresa$.macHardvérová MAC adresa
Batéria$.bat.voltage, $.bat.valueNapätie a percentá batérie (napr. 3,83V (97%))
Signál$.wifi_sta.rssiSila Wi-Fi signálu v dB
Cloud povolený$.cloud.enabledČi je Shelly Cloud povolený
Pripojený ku cloudu$.cloud.connectedČi je zariadenie pripojené k Shelly Cloud
Čas zariadenia$.timeAktuálny čas na zariadení
Osvetlenie$.lux.valueÚroveň okolitého svetla v luxoch
Teplota$.tmp.value, $.tmp.unitsInterné meranie teploty
Doba prevádzky$.uptimeČas od posledného reštartu
Verzia FW$.fw_info.fwAktuálna verzia firmvéru
Aktualizácia FW$.update.has_updateČi je dostupná aktualizácia firmvéru
Voľná RAM$.ram_total, $.ram_freeDostupná pamäť
Voľné miesto FS$.fs_size, $.fs_freeDostupné úložisko súborového systému

Varovanie o nízkej batérii sa automaticky spustí, keď úroveň batérie klesne pod 20 %.

Ďalšie schopnosti (neimplementované)

Shelly Motion 2 tiež publikuje detekciu vibrácií/neoprávnenej manipulácie ($.sensor.vibration, nastaviteľná citlivosť 0–80), kategóriu osvetlenia ($.lux.illumination — dark/twilight/bright) a stav USB nabíjačky ($.charger) cez /info JSON payload. Stav online/offline je dostupný cez LWT topic (shellies/<id>/online). Tieto schopnosti sú dostupné vo výstupe MQTT zariadenia, ale nie sú mapované v aktuálnej TapHome šablóne. Môžu byť pridané v budúcej aktualizácii šablóny.

Riešenie problémov

Senzor nehlási dáta
  1. Overte, že Shelly Motion 2 je pripojený k Wi-Fi a MQTT je povolené v nastaveniach zariadenia
  2. Skontrolujte, že custom premenná sensorN_topic presne zodpovedá Device ID (napr. shellymotion2-AABBCCDDEEFF)
  3. Použite MQTT klienta (napr. MQTT Explorer) na prihlásenie odberu shellies/# a overte, že senzor publikuje správy pri prebudení
  4. Motion 2 je napájaný z batérie a publikuje dáta len pri prebudení — vyvolajte pohybovú udalosť pre vynútenie prebudenia
Stav pohybu sa neaktualizuje
  1. Skontrolujte, že šošovka PIR senzora nie je prekrytá a senzor je namontovaný v odporúčanej výške (1,8–2,5 m)
  2. Ak bol senzor nedávno nainštalovaný, overte nastavenia citlivosti a slepého času vo webovom rozhraní zariadenia — vysoký slepý čas znamená, že senzor ignoruje pohyb dlhšie obdobie po každej detekcii
  3. Upravte počet impulzov, ak sa senzor spúšťa príliš zriedka (nižší = menej po sebe idúcich pohybov)
  4. Skontrolujte v TapHome stav zariadenia Reed Contact — 1 = detekovaný pohyb (alarm), 0 = žiadny pohyb (OK)
Batéria sa rýchlo vybíja
  1. Shelly Motion 2 používa vstavaný nabíjateľný Li-ion akumulátor (6500 mAh) nabíjaný cez USB-C, s typickou aktívnou výdržou 12–18 mesiacov
  2. Časté prebúdzania kvôli vysokej pohybovej aktivite alebo krátkym intervalom spánku vybíjajú batériu rýchlejšie
  3. Povolenie SSL na MQTT výrazne znižuje výdrž batérie — používajte plain MQTT (port 1883) v dôveryhodnej lokálnej sieti
  4. Zabezpečte silný Wi-Fi signál na mieste senzora — slabý signál znamená dlhšie časy pripojenia pri každom prebudení

Gen1 Shelly zariadenia nepodporujú MQTT cez TLS bez výrazného dopadu na batériu. Komunikácia medzi senzorom a MQTT brokerom je typicky nešifrovaná (plain MQTT, port 1883). Zabezpečte, aby bol MQTT broker v dôveryhodnej lokálnej sieti.

Povolenie MQTT na Gen1 Shelly zariadeniach zakáže Cloud konektivitu. MQTT a Cloud nemôžu koexistovať na tom istom zariadení.

Ako nainštalovať v TapHome

Predpoklady

  • Zariadenie Shelly pripojené k Wi-Fi (ak ešte nie, pozrite návod na HTTP pripojenie)
  • MQTT broker bežiaci vo vašej lokálnej sieti (napr. Mosquitto, Home Assistant alebo vstavaný broker TapHome)
  • TapHome CCU v rovnakej sieti ako broker

Na zariadeniach Gen1 povolenie MQTT vypne Shelly Cloud. Oboje nemôže bežať súčasne. Na zariadeniach Gen2/Plus toto obmedzenie neplatí.

Krok 1 — Povoľte MQTT na zariadení Shelly

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

  1. Otvorte webové rozhranie Shelly: http://<device-ip>/
  2. Prejdite na Internet & SecurityAdvanced — MQTT
  3. Povoľte MQTT
  4. Nastavte MQTT Server: <broker-ip>:<port> (napr. 192.168.1.10:1883)
  5. Voliteľne nastavte MQTT User a MQTT Password, ak váš broker vyžaduje autentifikáciu
  6. Kliknite na Save — zariadenie sa reštartuje a pripojí k brokeru

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

  1. Otvorte webové rozhranie Shelly: http://<device-ip>/
  2. Prejdite na SettingsMQTT
  3. Povoľte MQTT
  4. Nastavte Server: <broker-ip>:<port> (napr. 192.168.1.10:1883)
  5. Client ID je predvyplnené ID zariadenia (napr. shellyplus1pm-AABBCCDDEE) — ponechajte tak, pokiaľ nemáte konkrétny dôvod na zmenu
  6. Kliknite na Save a reštartujte zariadenie

Na overenie funkčnosti MQTT použite MQTT klienta (napr. MQTT Explorer) a prihláste sa na odber shellies/# (Gen1) alebo <device-id>/# (Gen2). Mali by ste vidieť stavové správy zo zariadenia.

Krok 2 — Zistite Device ID / MQTT Client ID

Niektoré šablóny vyžadujú parameter Device ID alebo MQTT Client ID. Ide o jedinečný identifikátor používaný v MQTT topicoch.

  • Gen1: nachádza sa na štítku ako MAC adresa (napr. AABBCCDDEE). Device ID = shelly<model>-<mac>, napr. shelly1pm-AABBCCDDEE
  • Gen2/Plus: nachádza sa vo webovom rozhraní Shelly v časti SettingsDevice InfoDevice ID, alebo na štítku zariadenia

Krok 3 — Konfigurácia v TapHome

  1. V TapHome pridajte nový modul Packet Parser (MQTT)
  2. IP Address: zadajte IP adresu MQTT brokera (napr. 192.168.1.10)
  3. Port: 1883 (predvolený; pre TLS použite 8883)
  4. Device ID / MQTT Client ID: zadajte hodnotu z kroku 2 (ak to šablóna vyžaduje)
  5. Importujte šablónu — TapHome sa automaticky prihlási na odber topicov zariadenia

Dostupné zariadenia

Shelly Motion 2 MQTT Modul
Vlastné premenné
sensor1_topic (string) = shellymotion2-deviceidMQTT identifikátor pohybového senzora 1 — formát je 'shellymotion2-DEVICEID' (nájdete vo webovom 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 senzora 2
sensor3_topic (string) = shellymotion2-deviceidMQTT identifikátor pohybového senzora 3
sensor4_topic (string) = shellymotion2-deviceidMQTT identifikátor pohybového senzora 4
sensor5_topic (string) = shellymotion2-deviceidMQTT identifikátor pohybového senzora 5
Detektor pohybu 1 Jazýčkový kontakt Len na čítanie

PIR detekcia pohybu — hlási alarm pri detekcii pohybu, OK bez pohybu; parsuje $.sensor.motion z /info JSON payloadu

boolean
Servisné atribúty
IP adresa
MAC adresa
Batéria
Signál
Cloud povolený
Pripojený ku cloudu
Čas zariadenia
Osvetlenie
Teplota
Doba prevádzky
Verzia FW
Aktualizácia FW
Voľná RAM
Voľné miesto 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é atribúty
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 Len na čítanie

PIR detekcia pohybu — hlási alarm pri detekcii pohybu, OK bez pohybu; parsuje $.sensor.motion z /info JSON payloadu

boolean
Servisné atribúty
IP adresa
MAC adresa
Batéria
Signál
Cloud povolený
Pripojený ku cloudu
Čas zariadenia
Osvetlenie
Teplota
Doba prevádzky
Verzia FW
Aktualizácia FW
Voľná RAM
Voľné miesto 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é atribúty
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 Len na čítanie

PIR detekcia pohybu — hlási alarm pri detekcii pohybu, OK bez pohybu; parsuje $.sensor.motion z /info JSON payloadu

boolean
Servisné atribúty
IP adresa
MAC adresa
Batéria
Signál
Cloud povolený
Pripojený ku cloudu
Čas zariadenia
Osvetlenie
Teplota
Doba prevádzky
Verzia FW
Aktualizácia FW
Voľná RAM
Voľné miesto 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é atribúty
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 Len na čítanie

PIR detekcia pohybu — hlási alarm pri detekcii pohybu, OK bez pohybu; parsuje $.sensor.motion z /info JSON payloadu

boolean
Servisné atribúty
IP adresa
MAC adresa
Batéria
Signál
Cloud povolený
Pripojený ku cloudu
Čas zariadenia
Osvetlenie
Teplota
Doba prevádzky
Verzia FW
Aktualizácia FW
Voľná RAM
Voľné miesto 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é atribúty
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 Len na čítanie

PIR detekcia pohybu — hlási alarm pri detekcii pohybu, OK bez pohybu; parsuje $.sensor.motion z /info JSON payloadu

boolean
Servisné atribúty
IP adresa
MAC adresa
Batéria
Signál
Cloud povolený
Pripojený ku cloudu
Čas zariadenia
Osvetlenie
Teplota
Doba prevádzky
Verzia FW
Aktualizácia FW
Voľná RAM
Voľné miesto 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é atribúty
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
Pripojenie: Packet Parser → MQTT
Možné vylepšenia (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