---
title: "Shelly Motion 2"
description: "PIR detekce pohybu s osvětlením, teplotou a monitorováním baterie přes MQTT. TapHome šablona pro Shelly Motion 2 (SHMOS-02)."
url: "https://taphome.com/cs/compatibility/shelly-motion-2-mqtt/"
language: cs
lastmod: 2026-03-30
generator: hugo
ai:
  topics: ["mqtt","sensor","wifi","motion-detection","battery-powered","pir-sensor"]
  questions: ["Jak integrovat Shelly Motion 2 s TapHome přes MQTT?","Co detekuje šablona Shelly Motion 2 v TapHome?","Jak nakonfigurovat více Shelly Motion senzorů v jedné TapHome šabloně?","Proč Shelly Motion 2 nehlásí pohybové události?","Jak najít MQTT Device ID senzoru Shelly Motion 2?","Hlásí Shelly Motion 2 stav baterie, osvětlení a teplotu v TapHome?","Dá se nastavit citlivost Shelly Motion 2 z TapHome?"]
---

# Shelly Motion 2

Komunikace: Packet Parser → MQTT

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

> Adresa v síti
> 
> U MQTT brokeru vestavěného v TapHome zadejte v TapHome jako adresu brokeru `127.0.0.1`. V zařízení zadejte IP adresu TapHome Core a jednotce Core dejte rezervaci IP v routeru.
> 
> [Příprava sítě](https://taphome.com/cs/docs/setup/network-preparation/)

## Návod na integraci

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: **Settings** → **Device 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.

> [!TIP]
> 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:

| Parametr | Rozsah | Popis |
|----------|--------|-------|
| Citlivost | 1–256 | Citlivost detekce pohybu (nižší = citlivější) |
| Slepý čas | 1–1440 min | Minuty ignorování pohybu po detekci |
| Počet impulzů | 1–4 | Počet po sobě jdoucích pohybů k potvrzení |
| Provozní režim | ANY / DARK / TWILIGHT / BRIGHT | Kdy je detekce aktivní na základě okolního světla |
| Čas spánku | 0–86400 s | Periodický interval probuzení v sekundách |

> [!TIP]
> 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:

- `true` → **Alarm** (detekován pohyb)
- `false` → **OK** (žá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:

| Atribut | Zdrojové pole | Popis |
|---------|---------------|-------|
| IP adresa | `$.wifi_sta.ip` | Wi-Fi IP adresa senzoru |
| MAC adresa | `$.mac` | Hardwarová MAC adresa |
| Baterie | `$.bat.voltage`, `$.bat.value` | Napětí a procenta baterie (např. 3,83V (97%)) |
| Signál | `$.wifi_sta.rssi` | Síla Wi-Fi signálu v dB |
| Cloud povolen | `$.cloud.enabled` | Zda je Shelly Cloud povolen |
| Připojen ke cloudu | `$.cloud.connected` | Zda je zařízení připojeno k Shelly Cloud |
| Čas zařízení | `$.time` | Aktuální čas na zařízení |
| Osvětlení | `$.lux.value` | Úroveň okolního světla v luxech |
| Teplota | `$.tmp.value`, `$.tmp.units` | Interní měření teploty |
| Doba provozu | `$.uptime` | Čas od posledního restartu |
| Verze FW | `$.fw_info.fw` | Aktuální verze firmwaru |
| Aktualizace FW | `$.update.has_update` | Zda je dostupná aktualizace firmwaru |
| Volná RAM | `$.ram_total`, `$.ram_free` | Dostupná paměť |
| Volné místo FS | `$.fs_size`, `$.fs_free` | Dostupné ú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í

> [!WARNING]
> 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.

> [!WARNING]
> 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 (2,4 GHz), např. přes aplikaci Shelly nebo vlastní přístupový bod zařízení
- 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

> [!WARNING]
> 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 & Security** → **Advanced — 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 **Settings** → **MQTT**
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í

U vestavěného brokeru TapHome je `<broker-ip>` IP adresa TapHome Core. Dejte jednotce Core rezervaci IP v routeru, jinak zařízení ztratí broker, když router adresu změní → [Příprava sítě](https://taphome.com/cs/docs/setup/network-preparation/).

> [!TIP]
> 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 **Settings** → **Device Info** → **Device 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:** pro vestavěný broker TapHome `127.0.0.1` (jednotka se připojuje sama k sobě, adresa se nikdy nezmění); pro externí broker jeho IP adresa (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í 5

Tato zařízení se po importu zobrazí v TapHome.

Shelly Motion 2 MQTT Modul

Vlastní proměnné

`sensor1_topic` (string) = shellymotion2-deviceid MQTT 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-&lt;last6MAC&gt;

`sensor2_topic` (string) = shellymotion2-deviceid MQTT identifikátor pohybového senzoru 2 

`sensor3_topic` (string) = shellymotion2-deviceid MQTT identifikátor pohybového senzoru 3 

`sensor4_topic` (string) = shellymotion2-deviceid MQTT identifikátor pohybového senzoru 4 

`sensor5_topic` (string) = shellymotion2-deviceid MQTT 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      |

Listener

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

Servisní atributy

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

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      |

Listener

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

Servisní atributy

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

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      |

Listener

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

Servisní atributy

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

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      |

Listener

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

Servisní atributy

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

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      |

Listener

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

Servisní atributy

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

**Připojení:** Packet Parser → MQTT • Hostname: `shellymotion2-{MAC}.local`

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.

## Parametry importu

Tyto hodnoty zadáte při importu XML.

| Ptá se v aplikaci     | Výchozí       |
|-----------------------|---------------|
| Mqtt Broker IP adresa | `192.168.0.1` |
| Mqtt Broker port      | `1883`        |

## Zdroje

- 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

## Související dokumentace

- [MQTT Integration](https://taphome.com/cs/compatibility/mqtt-guide/)
- [Packet Parser (HTTP, TCP, UDP, FTP, MQTT)](https://taphome.com/cs/docs/integration/packet-parser/)
- [Funkce Packet parser](https://taphome.com/cs/docs/script/packet-parser/)
- [Funkce pro parsování](https://taphome.com/cs/docs/script/parsing-functions/)
- [Broker MQTT](https://taphome.com/cs/docs/integration/packet-parser/mqtt-broker/)
- [Listener skripty](https://taphome.com/cs/docs/script/listener-scripts/)

