TapHome

Shelly Plus i4

Packet Parser → MQTT
Přidal
Poslední aktualizace: 03. 2026
Shelly Plus i4

Shelly Plus i4 je kompaktní Wi-Fi 4kanálový digitální vstupní modul. Nemá žádná relé ani výstupy — funguje čistě jako vstupní zařízení, které detekuje stisknutí tlačítek a stavy přepínačů na čtyřech nezávislých svorkách (SW1–SW4). Vejde se za standardní nástěnný vypínač (37 x 42 x 16 mm) a napájí se 110–240 VAC. TapHome komunikuje se zařízením přes MQTT pomocí Gen2+ JSON-RPC 2.0 notifikací v lokální síti — cloudové připojení není potřeba.

Každý ze čtyř vstupů lze nezávisle nakonfigurovat jako režim tlačítka (detekce jednoduchého stisknutí, dvojitého stisknutí, dlouhého stisknutí) nebo režim přepínače (detekce stavu zapnuto/vypnuto). Šablona TapHome vytváří pro každý vstup zařízení tlačítka i jazýčkového kontaktu — používáte to, které odpovídá konfiguraci vstupu ve webovém rozhraní Shelly.

Konfigurace

Nastavení MQTT brokera

Shelly Plus i4 komunikuje přes MQTT. Potřebujete MQTT broker běžící ve vaší síti (např. Mosquitto). Ve webovém rozhraní Shelly (http://{ip-zarizeni}) přejděte do Nastavení → MQTT a aktivujte MQTT, zadejte IP adresu a port brokera.

Parametry importu šablony

Během importu šablony v TapHome zadejte tři parametry:

ParametrPopisPříklad
MQTT Broker IPIP adresa MQTT brokera192.168.1.10
MQTT Broker PortPort brokera (výchozí 1883)1883
Shelly IDMQTT client ID z webového rozhraní Shelly → Nastavení → MQTTshellyplusi4-xxxxxxxxxxxx
Konfigurace režimu vstupu

Po importování šablony nakonfigurujte každý vstup ve webovém rozhraní Shelly (http://{ip-zarizeni}) → Vstupy:

  • Režim tlačítka — pro impulzní tlačítka. Použijte odpovídající zařízení Tlačítko 1–4 v TapHome.
  • Režim přepínače — pro páčkové přepínače nebo jazýčkové kontakty. Použijte odpovídající zařízení Přepínač 1–4 v TapHome.

Každý fyzický vstup může být naráz pouze jednoho typu. Pokud je vstup nastaven v režimu přepínače, ale TapHome přijme událost tlačítka (nebo naopak), listener skript vyhlásí chybu o nesouladu.

Možnosti zařízení

Detekce stisknutí tlačítek (Tlačítko 1–4)

Čtyři zařízení tlačítek naslouchají MQTT NotifyEvent zprávám na topiku {device_id}/events/rpc. Každé tlačítko detekuje tři typy stisknutí a mapuje je na číselné hodnoty:

Typ stisknutíHodnota
Jednoduché stisknutí1
Dlouhé stisknutí2
Dvojité stisknutí3

Zařízení tlačítek jsou pouze ke čtení — hlásí poslední detekovanou událost. Každé tlačítko naslouchá událostem ze svého odpovídajícího vstupního komponentu (input:0input:3).

Detekce přepínače/jazýčkového kontaktu (Přepínač 1–4)

Čtyři zařízení jazýčkových kontaktů naslouchají MQTT NotifyStatus zprávám. Každý přepínač čte binární stav svého odpovídajícího vstupu:

StavHodnota
Zavřený (aktivní)1
Otevřený (neaktivní)0

Zařízení přepínačů jsou pouze ke čtení s intervalem dotazování 2,5 sekundy. Jsou vhodná pro páčkové přepínače, magnetické jazýčkové kontakty nebo jakýkoli binární on/off senzor připojený ke vstupním svorkám.

Další možnosti

Shelly Plus i4 API také podporuje detekci trojitého stisknutí, surové události button-down/button-up a programatickou metodu Input.Trigger (unikátní pro zařízení i4), která dokáže emitovat události bez fyzického vstupu. Systémová diagnostika (uptime, MAC, WiFi RSSI) je dostupná přes HTTP RPC, ale není zpřístupněna v této šabloně určené pouze pro MQTT. Tyto možnosti mohou být doplněny v budoucí aktualizaci šablony.

Řešení problémů

Stisknutí tlačítek nejsou detekována
  1. Ověřte, že vstup je nakonfigurován v režimu tlačítka ve webovém rozhraní Shelly → Vstupy
  2. Zkontrolujte, že TapHome je připojen k MQTT brokeru a Shelly ID odpovídá MQTT client ID zařízení
  3. Pokud TapHome zobrazuje chybu “Device is set as switch”, vstup je v režimu přepínače — změňte ho na režim tlačítka ve webovém rozhraní Shelly nebo místo toho použijte zařízení Přepínač 1–4
Stav přepínače se neaktualizuje
  1. Ověřte, že vstup je nakonfigurován v režimu přepínače ve webovém rozhraní Shelly → Vstupy
  2. Pokud TapHome zobrazuje chybu “Device is set as button”, vstup je v režimu tlačítka — změňte ho na režim přepínače nebo místo toho použijte zařízení Tlačítko 1–4
  3. Přepněte fyzický přepínač a zkontrolujte MQTT broker, zda přicházejí NotifyStatus zprávy na topiku shellyplusi4-{id}/events/rpc
Zařízení není dostupné
  1. Ověřte, že Shelly je připojen k Wi-Fi — modrá LED dioda by měla svítit nepřerušovaně
  2. Potvrďte, že MQTT je aktivováno ve webovém rozhraní Shelly → Nastavení → MQTT a adresa brokera je správná
  3. Zkuste použít mDNS hostname (shellyplusi4-AABBCCDDEE.local) pro přístup k webovému rozhraní Shelly
  4. Zkontrolujte, že MQTT broker běží a je přístupný z TapHome Core i ze zařízení Shelly

Shelly Plus i4 má MQTT limit 80 notifikací za 60sekundové okno. Rychlé opakované stisknutí tlačítek může tento limit překročit a způsobit ztrátu některých událostí. Jedná se o omezení na úrovni firmwaru.

Jak nainstalovat v TapHome

Předpoklady

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

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

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

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

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

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

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

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

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

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

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

Krok 3 — Konfigurace v TapHome

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

Dostupná zařízení

Shelly Plus i4 Modul
Vlastní proměnné
ID (string)
Tlačítko 1 Tlačítko Pouze ke čtení

Tlačítko na vstupu input:0 — detekuje jedno stisknutí (1), dlouhé stisknutí (2), dvojité stisknutí (3)

numeric JSON-RPC event
Proměnná: Button

Tlačítko 1

Listener
Bp := 0;
#index of shelly
if INDEXOF(RECEIVEDMSG.TOPIC, ID) = 0
    VAR method := PARSEJSON(RECEIVEDMSG.PAYLOAD, "method", true);
    VAR params := PARSEJSON(RECEIVEDMSG.PAYLOAD, "params", true);

    IF method = "NotifyEvent"
        VAR zero := PARSEJSON(PARSEJSON(params, "events"),"[0]");
        VAR component := PARSEJSON(zero, "component");
        VAR event := PARSEJSON(zero, "event");
    
        if component = "input:0"
            Bp := SWITCH(event, "single_push", Bp := 1, "double_push", Bp :=3,  "long_push", Bp := 2, Bp := 0 );
            #RETURN(Bp);
        END
    elseif method = "NotifyStatus"
        IF( INDEXOF(params, "input:0") > -1, ADDERROR("Device is set as switch"));
    END
END
Tlačítko 2 Tlačítko Pouze ke čtení

Tlačítko na vstupu input:1 — detekuje jedno stisknutí (1), dlouhé stisknutí (2), dvojité stisknutí (3)

numeric JSON-RPC event

Tlačítko 2

Listener
Bp := 0;

#index of shelly
if INDEXOF(RECEIVEDMSG.TOPIC, ID) = 0

    VAR method := PARSEJSON(RECEIVEDMSG.PAYLOAD, "method", true);
    VAR params := PARSEJSON(RECEIVEDMSG.PAYLOAD, "params", true);

    IF method = "NotifyEvent"
        VAR zero := PARSEJSON(PARSEJSON(params, "events"),"[0]");
        VAR component := PARSEJSON(zero, "component");
        VAR event := PARSEJSON(zero, "event");
    
        if component = "input:1"
            Bp := SWITCH(event, "single_push", Bp := 1, "double_push", Bp :=3,  "long_push", Bp := 2, Bp := 0 );
            #RETURN(Bp);
        END
    elseif method = "NotifyStatus"
        IF( INDEXOF(params, "input:0") > -1, ADDERROR("Device is set as switch"));
    END
END
Tlačítko 3 Tlačítko Pouze ke čtení

Tlačítko na vstupu input:2 — detekuje jedno stisknutí (1), dlouhé stisknutí (2), dvojité stisknutí (3)

numeric JSON-RPC event

Tlačítko 3

Listener
Bp := 0;

#index of shelly
if INDEXOF(RECEIVEDMSG.TOPIC, ID) = 0

    VAR method := PARSEJSON(RECEIVEDMSG.PAYLOAD, "method", true);
    VAR params := PARSEJSON(RECEIVEDMSG.PAYLOAD, "params", true);

    IF method = "NotifyEvent"
        VAR zero := PARSEJSON(PARSEJSON(params, "events"),"[0]");
        VAR component := PARSEJSON(zero, "component");
        VAR event := PARSEJSON(zero, "event");
    
        if component = "input:2"
            Bp := SWITCH(event, "single_push", Bp := 1, "double_push", Bp :=3,  "long_push", Bp := 2, Bp := 0 );
            #RETURN(Bp);
        END
    elseif method = "NotifyStatus"
        IF( INDEXOF(params, "input:0") > -1, ADDERROR("Device is set as switch"));
    END
END
Tlačítko 4 Tlačítko Pouze ke čtení

Tlačítko na vstupu input:3 — detekuje jedno stisknutí (1), dlouhé stisknutí (2), dvojité stisknutí (3)

numeric JSON-RPC event

Tlačítko 4

Listener
Bp := 0;

#index of shelly
if INDEXOF(RECEIVEDMSG.TOPIC, ID) = 0

    VAR method := PARSEJSON(RECEIVEDMSG.PAYLOAD, "method", true);
    VAR params := PARSEJSON(RECEIVEDMSG.PAYLOAD, "params", true);

    IF method = "NotifyEvent"
        VAR zero := PARSEJSON(PARSEJSON(params, "events"),"[0]");
        VAR component := PARSEJSON(zero, "component");
        VAR event := PARSEJSON(zero, "event");
    
        if component = "input:3"
            Bp := SWITCH(event, "single_push", Bp := 1, "double_push", Bp :=3,  "long_push", Bp := 2, Bp := 0 );
            #RETURN(Bp);
        END
    elseif method = "NotifyStatus"
        IF( INDEXOF(params, "input:0") > -1, ADDERROR("Device is set as switch"));
    END
END
Spínač 1 Jazýčkový kontakt Pouze ke čtení

Jazýčkový kontakt na vstupu input:0 — zavřený (1), otevřený (0)

boolean JSON-RPC status

Spínač 1

Listener
#index of shelly
if INDEXOF(RECEIVEDMSG.TOPIC, ID) = 0

    VAR method := PARSEJSON(RECEIVEDMSG.PAYLOAD, "method", true);
    VAR params := PARSEJSON(RECEIVEDMSG.PAYLOAD, "params", true);

    IF(method ="NotifyEvent")
    VAR zero := PARSEJSON(PARSEJSON(params, "events"),"[0]");
    VAR component := PARSEJSON(zero, "component");
    
    if component = "input:0"
    ADDERROR("Device is set as button");
    END
    
    IF(method = "NotifyStatus")
    IF( INDEXOF(params, "input:0") > -1)
        VAR input := PARSEJSON(params, "input:0");
        SWITCH(PARSEJSON(input, "state"), true, Rc := 1, Rc := 0);
    END  
    END
END
END
Spínač 2 Jazýčkový kontakt Pouze ke čtení

Jazýčkový kontakt na vstupu input:1 — zavřený (1), otevřený (0)

boolean JSON-RPC status

Spínač 2

Listener
#index of shelly
if INDEXOF(RECEIVEDMSG.TOPIC, ID) = 0

    VAR method := PARSEJSON(RECEIVEDMSG.PAYLOAD, "method", true);
    VAR params := PARSEJSON(RECEIVEDMSG.PAYLOAD, "params", true);

    IF(method ="NotifyEvent")
    VAR zero := PARSEJSON(PARSEJSON(params, "events"),"[0]");
    VAR component := PARSEJSON(zero, "component");
    
    if component = "input:1"
    ADDERROR("Device is set as button");
    END
    
    IF(method = "NotifyStatus")
    IF( INDEXOF(params, "input:1") > -1)
    VAR input := PARSEJSON(params, "input:1");
        SWITCH(PARSEJSON(input, "state"), true, Rc := 1, Rc := 0);
    END  
    END
END
END
Spínač 3 Jazýčkový kontakt Pouze ke čtení

Jazýčkový kontakt na vstupu input:2 — zavřený (1), otevřený (0)

boolean JSON-RPC status

Spínač 3

Listener
#index of shelly
if INDEXOF(RECEIVEDMSG.TOPIC, ID) = 0

    VAR method := PARSEJSON(RECEIVEDMSG.PAYLOAD, "method", true);
    VAR params := PARSEJSON(RECEIVEDMSG.PAYLOAD, "params", true);

    IF(method ="NotifyEvent")
    VAR zero := PARSEJSON(PARSEJSON(params, "events"),"[0]");
    VAR component := PARSEJSON(zero, "component");
    
    if component = "input:2"
    ADDERROR("Device is set as button");
    END
    
    IF(method = "NotifyStatus")
    IF( INDEXOF(params, "input:2") > -1)
    VAR input := PARSEJSON(params, "input:2");
        SWITCH(PARSEJSON(input, "state"), true, Rc := 1, Rc := 0);
    END  
    END
END
END
Spínač 4 Jazýčkový kontakt Pouze ke čtení

Jazýčkový kontakt na vstupu input:3 — zavřený (1), otevřený (0)

boolean JSON-RPC status

Spínač 4

Listener
#index of shelly
if INDEXOF(RECEIVEDMSG.TOPIC, ID) = 0

    VAR method := PARSEJSON(RECEIVEDMSG.PAYLOAD, "method", true);
    VAR params := PARSEJSON(RECEIVEDMSG.PAYLOAD, "params", true);

    IF(method ="NotifyEvent")
    VAR zero := PARSEJSON(PARSEJSON(params, "events"),"[0]");
    VAR component := PARSEJSON(zero, "component");
    
    if component = "input:3"
    ADDERROR("Device is set as button");
    END
    
    IF(method = "NotifyStatus")
    IF( INDEXOF(params, "input:3") > -1)
    VAR input := PARSEJSON(params, "input:3");
        SWITCH(PARSEJSON(input, "state"), true, Rc := 1, Rc := 0);
    END  
    END
END
END
Připojení: Packet Parser → MQTT
Možná vylepšení (7)
  • Triple Push Detection — Input component supports triple_push events but template only maps single_push, double_push, long_push
  • Button Press/Release Events — Raw button-down and button-up events available via MQTT but not captured by template
  • Programmatic Input Trigger — Input.Trigger method allows emitting events without physical input — unique to i4/i4 Gen3 devices
  • System Status (uptime, RAM, MAC, time) — Available via HTTP /rpc/Sys.GetStatus but template uses MQTT only — no HTTP polling configured
  • WiFi Status (SSID, IP, RSSI) — Available via HTTP /rpc/WiFi.GetStatus but template uses MQTT only
  • Analog Input Mode — Input component supports analog mode (0-100%) but template does not implement it — Plus i4 hardware supports digital inputs only
  • Counter/Pulse Input Mode — Input component supports pulse counting mode but template does not implement it

Zdroje