---
title: "Shelly Motion 2"
description: "Detekcja ruchu PIR z natężeniem oświetlenia, temperaturą i monitorowaniem baterii przez MQTT. Szablon TapHome dla Shelly Motion 2 (SHMOS-02)."
url: "https://taphome.com/pl/compatibility/shelly-motion-2-mqtt/"
language: pl
lastmod: 2026-03-30
generator: hugo
ai:
  topics: ["mqtt","sensor","wifi","motion-detection","battery-powered","pir-sensor"]
  questions: ["Jak zintegrować Shelly Motion 2 z TapHome przez MQTT?","Co wykrywa szablon Shelly Motion 2 w TapHome?","Jak skonfigurować wiele czujników Shelly Motion w jednym szablonie TapHome?","Dlaczego Shelly Motion 2 nie raportuje zdarzeń ruchu?","Jak znaleźć MQTT Device ID czujnika Shelly Motion 2?","Czy Shelly Motion 2 raportuje poziom baterii, natężenie oświetlenia i temperaturę w TapHome?","Czy można dostosować czułość Shelly Motion 2 z TapHome?"]
---

# Shelly Motion 2

Komunikacja: Packet Parser → MQTT

- [Shelly Motion 2 Knowledge Base](https://kb.shelly.cloud/knowledge-base/shelly-motion-2)

> Adres w sieci
> 
> Przy brokerze MQTT wbudowanym w TapHome wpisz w TapHome jako adres brokera `127.0.0.1`. W urządzeniu wpisz adres IP TapHome Core i nadaj jednostce Core rezerwację IP w routerze.
> 
> [Przygotowanie sieci](https://taphome.com/pl/docs/setup/network-preparation/)

## Poradnik integracji

Shelly Motion 2 (SHMOS-02) to bateryjny (Li-ion 6500 mAh, ładowalny przez USB-C) czujnik ruchu PIR Wi-Fi. TapHome komunikuje się z urządzeniem przez MQTT — zalecany protokół dla bateryjnych urządzeń Shelly, ponieważ czujnik przez większość czasu jest w trybie uśpienia i publikuje dane tylko przy zdarzeniach wybudzenia (wykrycie ruchu lub okresowy timer).

W odróżnieniu od przekaźnikowych urządzeń Gen1 Shelly, które publikują indywidualne topiki stanów, Motion 2 publikuje pełny stan za pośrednictwem jednego payloadu JSON `/info` przy wybudzeniu. Skrypt nasłuchujący TapHome parsuje ten JSON w celu wyodrębnienia stanu ruchu, natężenia oświetlenia, temperatury, poziomu baterii i atrybutów diagnostycznych.

Szablon obsługuje do 5 czujników Shelly Motion 2 na moduł. Każda instancja czujnika jest rozróżniana zmienną niestandardową `sensorN_topic` wskazującą na MQTT Client ID urządzenia.

## Konfiguracja

### Device ID

Każdy Shelly Motion 2 ma unikalne MQTT Device ID w formacie `shellymotion2-<MAC>`, gdzie `<MAC>` to pełny 12-znakowy adres MAC w formacie szesnastkowym wielkimi literami (np. `shellymotion2-AABBCCDDEEFF`).

Device ID można znaleźć:

- Na etykiecie urządzenia (adres MAC)
- W interfejsie webowym Shelly: **Settings** → **Device Info**
- Przez API: `GET http://<device-ip>/settings` → pole `device.hostname`

### Konfiguracja szablonu

Po zaimportowaniu szablonu w TapHome:

1. Otwórz moduł **Shelly Motion 2 MQTT**
2. Ustaw **MQTT Broker IP** i **Port** (domyślnie `1883`)
3. Dla każdej instancji czujnika ustaw zmienną niestandardową `sensorN_topic` na Device ID odpowiedniego Shelly Motion 2 (np. `shellymotion2-AABBCCDDEEFF`)

Moduł subskrybuje `shellies/#`, a skrypty nasłuchujące filtrują wiadomości według skonfigurowanego prefiksu topiku.

> [!TIP]
> Konfiguruj tylko te sloty czujników, których faktycznie używasz. Nieskonfigurowane sloty (z domyślną wartością `shellymotion2-deviceid`) wyświetlą komunikat błędu wzywający do ustawienia prawidłowego topiku.

### Ustawienia czujnika ruchu

Shelly Motion 2 ma kilka konfigurowalnych parametrów wpływających na zachowanie detekcji. Konfiguruje się je bezpośrednio na urządzeniu przez jego interfejs webowy (`http://<device-ip>/`), nie przez TapHome:

| Parametr | Zakres | Opis |
|----------|--------|------|
| Czułość | 1–256 | Czułość wykrywania ruchu (niższa = bardziej czuły) |
| Czas ślepy | 1–1440 min | Minuty ignorowania ruchu po wykryciu |
| Liczba impulsów | 1–4 | Kolejne ruchy wymagane do potwierdzenia |
| Tryb pracy | ANY / DARK / TWILIGHT / BRIGHT | Kiedy detekcja jest aktywna na podstawie oświetlenia otoczenia |
| Czas uśpienia | 0–86400 s | Okresowy interwał wybudzenia w sekundach |

> [!TIP]
> Krótsze czasy uśpienia zwiększają aktualność danych, ale zmniejszają żywotność baterii. Domyślny interwał wybudzenia jest wystarczający dla większości przypadków użycia. Zdarzenia ruchu zawsze wywołują natychmiastowe wybudzenie niezależnie od timera uśpienia.

## Możliwości urządzenia

### Wykrywanie ruchu

Każda instancja czujnika jest mapowana jako urządzenie Reed Contact z możliwością „security" w TapHome. Stan ruchu jest parsowany z topiku `shellies/<id>/info` — konkretnie pole `$.sensor.motion` w payloadzie JSON:

- `true` → **Alarm** (wykryto ruch)
- `false` → **OK** (brak ruchu)

Czujnik budzi się i publikuje swój stan po wykryciu ruchu (zgodnie z ustawieniami czułości, czasu ślepego i liczby impulsów), a także podczas okresowych interwałów wybudzenia.

### Atrybuty serwisowe

Każda instancja czujnika udostępnia 14 atrybutów serwisowych na poziomie urządzenia, wszystkie parsowane z payloadu JSON `/info`:

| Atrybut | Pole źródłowe | Opis |
|---------|---------------|------|
| Adres IP | `$.wifi_sta.ip` | Adres IP Wi-Fi czujnika |
| Adres MAC | `$.mac` | Sprzętowy adres MAC |
| Bateria | `$.bat.voltage`, `$.bat.value` | Napięcie i procent baterii (np. 3,83V (97%)) |
| Sygnał | `$.wifi_sta.rssi` | Siła sygnału Wi-Fi w dB |
| Cloud włączony | `$.cloud.enabled` | Czy Shelly Cloud jest włączony |
| Połączony z cloudem | `$.cloud.connected` | Czy urządzenie jest połączone z Shelly Cloud |
| Czas urządzenia | `$.time` | Bieżący czas na urządzeniu |
| Natężenie oświetlenia | `$.lux.value` | Poziom oświetlenia otoczenia w luksach |
| Temperatura | `$.tmp.value`, `$.tmp.units` | Wewnętrzny odczyt temperatury |
| Czas pracy | `$.uptime` | Czas od ostatniego restartu |
| Wersja FW | `$.fw_info.fw` | Aktualna wersja firmware |
| Aktualizacja FW | `$.update.has_update` | Czy dostępna jest aktualizacja firmware |
| Wolna RAM | `$.ram_total`, `$.ram_free` | Dostępna pamięć |
| Wolne miejsce FS | `$.fs_size`, `$.fs_free` | Dostępna przestrzeń systemu plików |

Ostrzeżenie o niskim poziomie baterii jest automatycznie wywoływane, gdy poziom baterii spadnie poniżej 20%.

### Dodatkowe możliwości (niezaimplementowane)

Shelly Motion 2 publikuje również **wykrywanie wibracji/ingerencji** (`$.sensor.vibration`, konfigurowalna czułość 0–80), **kategorię oświetlenia** (`$.lux.illumination` — dark/twilight/bright) oraz **stan ładowarki USB** (`$.charger`) przez payload JSON `/info`. Status online/offline jest dostępny przez topik LWT (`shellies/<id>/online`). Te możliwości są dostępne w wyjściu MQTT urządzenia, ale nie są mapowane w bieżącym szablonie TapHome. Mogą zostać dodane w przyszłej aktualizacji szablonu.

## Rozwiązywanie problemów

### Czujnik nie raportuje danych

1. Sprawdź, czy Shelly Motion 2 jest połączony z Wi-Fi i MQTT jest włączone w ustawieniach urządzenia
2. Sprawdź, czy zmienna niestandardowa `sensorN_topic` dokładnie odpowiada Device ID (np. `shellymotion2-AABBCCDDEEFF`)
3. Użyj klienta MQTT (np. MQTT Explorer) do subskrypcji `shellies/#` i sprawdź, czy czujnik publikuje wiadomości przy wybudzeniu
4. Motion 2 jest zasilany bateryjnie i publikuje dane tylko przy wybudzeniu — wywołaj zdarzenie ruchu, aby wymusić wybudzenie

### Stan ruchu nie aktualizuje się

1. Sprawdź, czy soczewka czujnika PIR nie jest zasłonięta i czujnik jest zamontowany na zalecanej wysokości (1,8–2,5 m)
2. Jeśli czujnik został niedawno zainstalowany, sprawdź ustawienia czułości i czasu ślepego w interfejsie webowym urządzenia — wysoki czas ślepy oznacza, że czujnik ignoruje ruch przez dłuższy okres po każdym wykryciu
3. Dostosuj liczbę impulsów, jeśli czujnik wyzwala się zbyt rzadko (niższa = mniej kolejnych ruchów wymaganych)
4. Sprawdź w TapHome stan urządzenia Reed Contact — 1 = wykryto ruch (alarm), 0 = brak ruchu (OK)

### Bateria szybko się rozładowuje

1. Shelly Motion 2 używa wbudowanego akumulatora Li-ion (6500 mAh) ładowanego przez USB-C, z typowym aktywnym czasem pracy 12–18 miesięcy
2. Częste wybudzenia z powodu wysokiej aktywności ruchu lub krótkich interwałów uśpienia szybciej rozładowują baterię
3. Włączenie SSL na MQTT znacząco zmniejsza żywotność baterii — używaj zwykłego MQTT (port 1883) w zaufanej sieci lokalnej
4. Zapewnij silny sygnał Wi-Fi w lokalizacji czujnika — słaby sygnał oznacza dłuższe czasy połączenia przy każdym wybudzeniu

> [!WARNING]
> Urządzenia Gen1 Shelly **nie obsługują** MQTT przez TLS bez znaczącego wpływu na baterię. Komunikacja między czujnikiem a brokerem MQTT jest zazwyczaj niezaszyfrowana (zwykły MQTT, port 1883). Upewnij się, że broker MQTT znajduje się w zaufanej sieci lokalnej.

> [!WARNING]
> Włączenie MQTT na urządzeniach Gen1 Shelly **wyłącza łączność Cloud**. MQTT i Cloud nie mogą współistnieć na tym samym urządzeniu.

## Jak zainstalować w TapHome

### Wymagania wstępne

- Urządzenie Shelly połączone z Wi-Fi (2,4 GHz), np. przez aplikację Shelly lub własny punkt dostępowy urządzenia
- Broker MQTT działający w sieci lokalnej (np. Mosquitto, Home Assistant lub wbudowany broker TapHome)
- TapHome CCU w tej samej sieci co broker

> [!WARNING]
> Na urządzeniach **Gen1** włączenie MQTT **wyłącza Shelly Cloud**. Oba nie mogą działać jednocześnie. Na urządzeniach Gen2/Plus to ograniczenie nie obowiązuje.

### Krok 1 — Włącz MQTT na urządzeniu Shelly

#### Urządzenia Gen1 (Shelly 1, 1PM, 2.5, EM, 3EM, Plug S, RGBW2, Dimmer, TRV…)

1. Otwórz interfejs webowy Shelly: `http://<device-ip>/`
2. Przejdź do **Internet & Security** → **Advanced — MQTT**
3. Włącz **MQTT**
4. Ustaw **MQTT Server**: `<broker-ip>:<port>` (np. `192.168.1.10:1883`)
5. Opcjonalnie ustaw **MQTT User** i **MQTT Password**, jeśli broker wymaga uwierzytelniania
6. Kliknij **Save** — urządzenie zrestartuje się i połączy z brokerem

#### Urządzenia Gen2 / Plus (Shelly Plus 1, Plus 1PM, Plus 2PM, Plus Plug S, Plus H&T, Pro 3EM…)

1. Otwórz interfejs webowy Shelly: `http://<device-ip>/`
2. Przejdź do **Settings** → **MQTT**
3. Włącz **MQTT**
4. Ustaw **Server**: `<broker-ip>:<port>` (np. `192.168.1.10:1883`)
5. **Client ID** jest wstępnie wypełnione identyfikatorem urządzenia (np. `shellyplus1pm-AABBCCDDEE`) — pozostaw bez zmian, chyba że masz konkretny powód do zmiany
6. Kliknij **Save** i zrestartuj urządzenie

Przy wbudowanym brokerze TapHome `<broker-ip>` to adres IP TapHome Core. Nadaj jednostce Core rezerwację IP w routerze, w przeciwnym razie urządzenie straci brokera, gdy router zmieni adres → [Przygotowanie sieci](https://taphome.com/pl/docs/setup/network-preparation/).

> [!TIP]
> Aby sprawdzić, czy MQTT działa, użyj klienta MQTT (np. MQTT Explorer) i zasubskrybuj `shellies/#` (Gen1) lub `<device-id>/#` (Gen2). Powinieneś zobaczyć komunikaty o stanie z urządzenia.

### Krok 2 — Znajdź Device ID / MQTT Client ID

Niektóre szablony wymagają parametru **Device ID** lub **MQTT Client ID**. Jest to unikalny identyfikator używany w topikach MQTT.

- **Gen1:** znajduje się na etykiecie jako adres MAC (np. `AABBCCDDEE`). Device ID = `shelly<model>-<mac>`, np. `shelly1pm-AABBCCDDEE`
- **Gen2/Plus:** znajduje się w interfejsie webowym Shelly w sekcji **Settings** → **Device Info** → **Device ID** lub na etykiecie urządzenia

### Krok 3 — Konfiguracja w TapHome

1. W TapHome dodaj nowy moduł **Packet Parser (MQTT)**
2. **IP Address:** dla wbudowanego brokera TapHome `127.0.0.1` (jednostka łączy się sama ze sobą, adres nigdy się nie zmienia); dla zewnętrznego brokera jego adres IP (np. `192.168.1.10`)
3. **Port:** `1883` (domyślny; użyj `8883` dla TLS)
4. **Device ID / MQTT Client ID:** wprowadź wartość z kroku 2 (jeśli wymagane przez szablon)
5. Zaimportuj szablon — TapHome automatycznie zasubskrybuje topiki urządzenia

## Dostępne urządzenia 5

Te urządzenia pojawią się w TapHome po imporcie.

Shelly Motion 2 MQTT Moduł

Zmienne niestandardowe

`sensor1_topic` (string) = shellymotion2-deviceid Identyfikator MQTT czujnika ruchu 1 — format: 'shellymotion2-DEVICEID' (w interfejsie webowym Shelly → Settings → Device Info)

Open http://shellyIpAddress → Settings → Device info → copy Device ID. Format: shellymotion2-&lt;last6MAC&gt;

`sensor2_topic` (string) = shellymotion2-deviceid Identyfikator MQTT czujnika ruchu 2 

`sensor3_topic` (string) = shellymotion2-deviceid Identyfikator MQTT czujnika ruchu 3 

`sensor4_topic` (string) = shellymotion2-deviceid Identyfikator MQTT czujnika ruchu 4 

`sensor5_topic` (string) = shellymotion2-deviceid Identyfikator MQTT czujnika ruchu 5

Czujnik ruchu 1 Kontakt reed Tylko do odczytu

Detekcja ruchu PIR — zgłasza alarm przy wykryciu ruchu, OK bez ruchu; parsuje $.sensor.motion z payloadu JSON /info

boolean

Atrybuty serwisowe

|                       |
|-----------------------|
| Adres IP              |
| Adres MAC             |
| Bateria               |
| Sygnał                |
| Cloud włączony        |
| Połączony z chmurą    |
| Czas urządzenia       |
| Natężenie oświetlenia |
| Temperatura           |
| Czas pracy            |
| Wersja FW             |
| Aktualizacja FW       |
| Wolna RAM             |
| Wolne miejsce FS      |

Nasłuchiwanie

```taphome
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
```

Atrybuty serwisowe

IP Address

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.ip"));
END
```

MAC Address

```taphome
IF(LENGTH(infoJson) = 0, "-", PARSEJSON(infoJson, "$.mac"));

IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.mac"));
END
```

Battery

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

    RETURN(voltage + "V (" + percentage + "%)");
END
```

Signal

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.rssi", 1) + "db");
END
```

Cloud enabled

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.enabled"));
END
```

Cloud connected

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.connected"));
END
```

Device time

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.time"));
END
```

Luminance

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.lux.value", 1) + "lux");
END
```

Temperature

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.tmp.value", 1) + PARSEJSON(infoJson, "$.tmp.units", 1));
END
```

Uptime

```taphome
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

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.fw_info.fw"));
END
```

FW update

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.update.has_update", 1));
END
```

Free RAM

```taphome
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

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR total := PARSEJSON(infoJson, "$.fs_size");
    VAR free := PARSEJSON(infoJson, "$.fs_free");
    RETURN(free + "/" + total + "(B)");
END
```

Czujnik ruchu 2 Kontakt reed Tylko do odczytu

Detekcja ruchu PIR — zgłasza alarm przy wykryciu ruchu, OK bez ruchu; parsuje $.sensor.motion z payloadu JSON /info

boolean

Atrybuty serwisowe

|                       |
|-----------------------|
| Adres IP              |
| Adres MAC             |
| Bateria               |
| Sygnał                |
| Cloud włączony        |
| Połączony z chmurą    |
| Czas urządzenia       |
| Natężenie oświetlenia |
| Temperatura           |
| Czas pracy            |
| Wersja FW             |
| Aktualizacja FW       |
| Wolna RAM             |
| Wolne miejsce FS      |

Nasłuchiwanie

```taphome
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
```

Atrybuty serwisowe

IP Address

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.ip"));
END
```

MAC Address

```taphome
IF(LENGTH(infoJson) = 0, "-", PARSEJSON(infoJson, "$.mac"));

IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.mac"));
END
```

Battery

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

    RETURN(voltage + "V (" + percentage + "%)");
END
```

Signal

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.rssi", 1) + "db");
END
```

Cloud enabled

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.enabled"));
END
```

Cloud connected

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.connected"));
END
```

Device time

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.time"));
END
```

Luminance

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.lux.value", 1) + "lux");
END
```

Temperature

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.tmp.value", 1) + PARSEJSON(infoJson, "$.tmp.units", 1));
END
```

Uptime

```taphome
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

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.fw_info.fw"));
END
```

FW update

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.update.has_update", 1));
END
```

Free RAM

```taphome
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

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR total := PARSEJSON(infoJson, "$.fs_size");
    VAR free := PARSEJSON(infoJson, "$.fs_free");
    RETURN(free + "/" + total + "(B)");
END
```

Czujnik ruchu 3 Kontakt reed Tylko do odczytu

Detekcja ruchu PIR — zgłasza alarm przy wykryciu ruchu, OK bez ruchu; parsuje $.sensor.motion z payloadu JSON /info

boolean

Atrybuty serwisowe

|                       |
|-----------------------|
| Adres IP              |
| Adres MAC             |
| Bateria               |
| Sygnał                |
| Cloud włączony        |
| Połączony z chmurą    |
| Czas urządzenia       |
| Natężenie oświetlenia |
| Temperatura           |
| Czas pracy            |
| Wersja FW             |
| Aktualizacja FW       |
| Wolna RAM             |
| Wolne miejsce FS      |

Nasłuchiwanie

```taphome
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
```

Atrybuty serwisowe

IP Address

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.ip"));
END
```

MAC Address

```taphome
IF(LENGTH(infoJson) = 0, "-", PARSEJSON(infoJson, "$.mac"));

IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.mac"));
END
```

Battery

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

    RETURN(voltage + "V (" + percentage + "%)");
END
```

Signal

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.rssi", 1) + "db");
END
```

Cloud enabled

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.enabled"));
END
```

Cloud connected

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.connected"));
END
```

Device time

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.time"));
END
```

Luminance

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.lux.value", 1) + "lux");
END
```

Temperature

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.tmp.value", 1) + PARSEJSON(infoJson, "$.tmp.units", 1));
END
```

Uptime

```taphome
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

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.fw_info.fw"));
END
```

FW update

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.update.has_update", 1));
END
```

Free RAM

```taphome
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

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR total := PARSEJSON(infoJson, "$.fs_size");
    VAR free := PARSEJSON(infoJson, "$.fs_free");
    RETURN(free + "/" + total + "(B)");
END
```

Czujnik ruchu 4 Kontakt reed Tylko do odczytu

Detekcja ruchu PIR — zgłasza alarm przy wykryciu ruchu, OK bez ruchu; parsuje $.sensor.motion z payloadu JSON /info

boolean

Atrybuty serwisowe

|                       |
|-----------------------|
| Adres IP              |
| Adres MAC             |
| Bateria               |
| Sygnał                |
| Cloud włączony        |
| Połączony z chmurą    |
| Czas urządzenia       |
| Natężenie oświetlenia |
| Temperatura           |
| Czas pracy            |
| Wersja FW             |
| Aktualizacja FW       |
| Wolna RAM             |
| Wolne miejsce FS      |

Nasłuchiwanie

```taphome
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
```

Atrybuty serwisowe

IP Address

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.ip"));
END
```

MAC Address

```taphome
IF(LENGTH(infoJson) = 0, "-", PARSEJSON(infoJson, "$.mac"));

IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.mac"));
END
```

Battery

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

    RETURN(voltage + "V (" + percentage + "%)");
END
```

Signal

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.rssi", 1) + "db");
END
```

Cloud enabled

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.enabled"));
END
```

Cloud connected

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.connected"));
END
```

Device time

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.time"));
END
```

Luminance

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.lux.value", 1) + "lux");
END
```

Temperature

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.tmp.value", 1) + PARSEJSON(infoJson, "$.tmp.units", 1));
END
```

Uptime

```taphome
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

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.fw_info.fw"));
END
```

FW update

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.update.has_update", 1));
END
```

Free RAM

```taphome
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

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR total := PARSEJSON(infoJson, "$.fs_size");
    VAR free := PARSEJSON(infoJson, "$.fs_free");
    RETURN(free + "/" + total + "(B)");
END
```

Czujnik ruchu 5 Kontakt reed Tylko do odczytu

Detekcja ruchu PIR — zgłasza alarm przy wykryciu ruchu, OK bez ruchu; parsuje $.sensor.motion z payloadu JSON /info

boolean

Atrybuty serwisowe

|                       |
|-----------------------|
| Adres IP              |
| Adres MAC             |
| Bateria               |
| Sygnał                |
| Cloud włączony        |
| Połączony z chmurą    |
| Czas urządzenia       |
| Natężenie oświetlenia |
| Temperatura           |
| Czas pracy            |
| Wersja FW             |
| Aktualizacja FW       |
| Wolna RAM             |
| Wolne miejsce FS      |

Nasłuchiwanie

```taphome
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
```

Atrybuty serwisowe

IP Address

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.ip"));
END
```

MAC Address

```taphome
IF(LENGTH(infoJson) = 0, "-", PARSEJSON(infoJson, "$.mac"));

IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.mac"));
END
```

Battery

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

    RETURN(voltage + "V (" + percentage + "%)");
END
```

Signal

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.wifi_sta.rssi", 1) + "db");
END
```

Cloud enabled

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.enabled"));
END
```

Cloud connected

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.cloud.connected"));
END
```

Device time

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.time"));
END
```

Luminance

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.lux.value", 1) + "lux");
END
```

Temperature

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.tmp.value", 1) + PARSEJSON(infoJson, "$.tmp.units", 1));
END
```

Uptime

```taphome
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

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.fw_info.fw"));
END
```

FW update

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    RETURN(PARSEJSON(infoJson, "$.update.has_update", 1));
END
```

Free RAM

```taphome
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

```taphome
IF LENGTH(infoJson) = 0
    RETURN("-");
ELSE
    VAR total := PARSEJSON(infoJson, "$.fs_size");
    VAR free := PARSEJSON(infoJson, "$.fs_free");
    RETURN(free + "/" + total + "(B)");
END
```

**Połączenie:** Packet Parser → MQTT • Hostname: `shellymotion2-{MAC}.local`

Możliwe ulepszenia (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.

## Parametry importu

Te wartości podajesz podczas importu pliku XML.

| Pytanie w aplikacji  | Domyślnie     |
|----------------------|---------------|
| Mqtt Broker Adres IP | `192.168.0.1` |
| Mqtt Broker port     | `1883`        |

## Źródła

- Shelly Gen1 API Reference
  
  [shelly-api-docs.shelly.cloud](https://shelly-api-docs.shelly.cloud/gen1/) 2026-03-12
- Home Assistant Shelly Integration
  
  [www.home-assistant.io](https://www.home-assistant.io/integrations/shelly/) 2026-03-12
- Shelly Motion 2 — Device-Specific API
  
  [shelly-api-docs.shelly.cloud](https://shelly-api-docs.shelly.cloud/gen1/#shelly-motion-2) 2026-03-30
- Shelly Motion 2 — Knowledge Base
  
  [kb.shelly.cloud](https://kb.shelly.cloud/knowledge-base/shelly-motion-2) 2026-03-30

## Powiązana dokumentacja

- [MQTT Integration](https://taphome.com/pl/compatibility/mqtt-guide/)
- [Packet Parser (HTTP, TCP, UDP, FTP, MQTT)](https://taphome.com/pl/docs/integration/packet-parser/)
- [Funkcje Packet parser](https://taphome.com/pl/docs/script/packet-parser/)
- [Funkcje parsowania](https://taphome.com/pl/docs/script/parsing-functions/)
- [Broker MQTT](https://taphome.com/pl/docs/integration/packet-parser/mqtt-broker/)
- [Skrypty listener](https://taphome.com/pl/docs/script/listener-scripts/)

