TapHome

Shelly Plus i4

Packet Parser → MQTT
Dodane przez
Ostatnia aktualizacja: 03. 2026
Shelly Plus i4

Shelly Plus i4 to kompaktowy moduł wejścia cyfrowego Wi-Fi z 4 kanałami. Nie posiada przekaźników ani wyjść — działa wyłącznie jako urządzenie wejściowe wykrywające naciśnięcia przycisków i stany przełączników na czterech niezależnych zaciskach (SW1–SW4). Mieści się za standardowym włącznikiem ściennym (37 x 42 x 16 mm) i jest zasilany napięciem 110–240 VAC. TapHome komunikuje się z urządzeniem przez MQTT za pomocą powiadomień Gen2+ JSON-RPC 2.0 w sieci lokalnej — połączenie z chmurą nie jest wymagane.

Każde z czterech wejść można niezależnie skonfigurować jako tryb przycisku (wykrywanie pojedynczego naciśnięcia, podwójnego naciśnięcia, długiego naciśnięcia) lub tryb przełącznika (wykrywanie stanu otwarty/zamknięty). Szablon TapHome tworzy dla każdego wejścia zarówno urządzenie przycisku, jak i kontaktu reedowego — używasz tego, które odpowiada konfiguracji wejścia w interfejsie webowym Shelly.

Konfiguracja

Konfiguracja brokera MQTT

Shelly Plus i4 komunikuje się przez MQTT. Potrzebujesz brokera MQTT działającego w sieci (np. Mosquitto). W interfejsie webowym Shelly (http://{ip-urzadzenia}) przejdź do Ustawienia → MQTT i włącz MQTT, podając adres IP i port brokera.

Parametry importu szablonu

Podczas importu szablonu w TapHome podaj trzy parametry:

ParametrOpisPrzykład
MQTT Broker IPAdres IP brokera MQTT192.168.1.10
MQTT Broker PortPort brokera (domyślnie 1883)1883
Shelly IDMQTT client ID z interfejsu webowego Shelly → Ustawienia → MQTTshellyplusi4-xxxxxxxxxxxx
Konfiguracja trybu wejścia

Po zaimportowaniu szablonu skonfiguruj każde wejście w interfejsie webowym Shelly (http://{ip-urzadzenia}) → Wejścia:

  • Tryb przycisku — dla przycisków chwilowych. Użyj odpowiedniego urządzenia Przycisk 1–4 w TapHome.
  • Tryb przełącznika — dla przełączników dźwigniowych lub kontaktów reedowych. Użyj odpowiedniego urządzenia Przełącznik 1–4 w TapHome.

Każde wejście fizyczne może być jednocześnie tylko jednego typu. Jeśli wejście jest ustawione w trybie przełącznika, ale TapHome otrzyma zdarzenie przycisku (lub odwrotnie), skrypt nasłuchujący zgłasza błąd niezgodności.

Możliwości urządzenia

Wykrywanie naciśnięć przycisków (Przycisk 1–4)

Cztery urządzenia przycisków nasłuchują komunikatów MQTT NotifyEvent na topiku {device_id}/events/rpc. Każdy przycisk wykrywa trzy typy naciśnięć i mapuje je na wartości numeryczne:

Typ naciśnięciaWartość
Pojedyncze naciśnięcie1
Długie naciśnięcie2
Podwójne naciśnięcie3

Urządzenia przycisków są tylko do odczytu — raportują ostatnio wykryte zdarzenie. Każdy przycisk nasłuchuje zdarzeń ze swojego odpowiedniego komponentu wejściowego (input:0 do input:3).

Wykrywanie przełącznika/kontaktu reedowego (Przełącznik 1–4)

Cztery urządzenia kontaktów reedowych nasłuchują komunikatów MQTT NotifyStatus. Każdy przełącznik odczytuje binarny stan swojego odpowiedniego wejścia:

StanWartość
Zamknięty (aktywny)1
Otwarty (nieaktywny)0

Urządzenia przełączników są tylko do odczytu z interwałem odpytywania 2,5 sekundy. Nadają się do przełączników dźwigniowych, magnetycznych kontaktów reedowych lub dowolnego binarnego czujnika włącz/wyłącz podłączonego do zacisków wejściowych.

Dodatkowe możliwości

API Shelly Plus i4 obsługuje również wykrywanie potrójnego naciśnięcia, surowe zdarzenia button-down/button-up oraz programową metodę Input.Trigger (unikalną dla urządzeń i4), która może emitować zdarzenia bez fizycznego wejścia. Diagnostyka systemowa (uptime, MAC, WiFi RSSI) jest dostępna przez HTTP RPC, ale nie jest udostępniona w tym szablonie opartym wyłącznie na MQTT. Te możliwości mogą zostać dodane w przyszłej aktualizacji szablonu.

Rozwiązywanie problemów

Naciśnięcia przycisków nie są wykrywane
  1. Sprawdź, czy wejście jest skonfigurowane w trybie przycisku w interfejsie webowym Shelly → Wejścia
  2. Sprawdź, czy TapHome jest podłączony do brokera MQTT i czy Shelly ID odpowiada MQTT client ID urządzenia
  3. Jeśli TapHome wyświetla błąd “Device is set as switch”, wejście jest w trybie przełącznika — zmień je na tryb przycisku w interfejsie webowym Shelly lub użyj zamiast tego urządzenia Przełącznik 1–4
Stan przełącznika się nie aktualizuje
  1. Sprawdź, czy wejście jest skonfigurowane w trybie przełącznika w interfejsie webowym Shelly → Wejścia
  2. Jeśli TapHome wyświetla błąd “Device is set as button”, wejście jest w trybie przycisku — zmień je na tryb przełącznika lub użyj zamiast tego urządzenia Przycisk 1–4
  3. Przełącz fizyczny przełącznik i sprawdź broker MQTT pod kątem komunikatów NotifyStatus na topiku shellyplusi4-{id}/events/rpc
Urządzenie nieosiągalne
  1. Sprawdź, czy Shelly jest połączony z Wi-Fi — niebieska dioda LED powinna świecić ciągle
  2. Potwierdź, że MQTT jest włączone w interfejsie webowym Shelly → Ustawienia → MQTT i adres brokera jest poprawny
  3. Spróbuj użyć nazwy hosta mDNS (shellyplusi4-AABBCCDDEE.local) do uzyskania dostępu do interfejsu webowego Shelly
  4. Sprawdź, czy broker MQTT działa i jest dostępny zarówno z TapHome Core, jak i z urządzenia Shelly

Shelly Plus i4 ma limit MQTT wynoszący 80 powiadomień na 60-sekundowe okno. Szybkie, powtarzające się naciskanie przycisków może przekroczyć ten limit i spowodować utratę niektórych zdarzeń. Jest to ograniczenie na poziomie firmware.

Jak zainstalować w TapHome

Wymagania wstępne

  • Urządzenie Shelly połączone z Wi-Fi (jeśli jeszcze nie, zobacz przewodnik po połączeniu HTTP)
  • Broker MQTT działający w sieci lokalnej (np. Mosquitto, Home Assistant lub wbudowany broker TapHome)
  • TapHome CCU w tej samej sieci co broker

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 & SecurityAdvanced — 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 SettingsMQTT
  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

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 SettingsDevice InfoDevice ID lub na etykiecie urządzenia

Krok 3 — Konfiguracja w TapHome

  1. W TapHome dodaj nowy moduł Packet Parser (MQTT)
  2. IP Address: wprowadź adres IP brokera MQTT (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

Shelly Plus i4 Moduł
Zmienne niestandardowe
ID (string)
Przycisk 1 Przycisk Tylko do odczytu

Przycisk na wejściu input:0 — wykrywa pojedyncze naciśnięcie (1), długie naciśnięcie (2), podwójne naciśnięcie (3)

numeric JSON-RPC event
Zmienna: Button

Przycisk 1

Nasłuchiwanie
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
Przycisk 2 Przycisk Tylko do odczytu

Przycisk na wejściu input:1 — wykrywa pojedyncze naciśnięcie (1), długie naciśnięcie (2), podwójne naciśnięcie (3)

numeric JSON-RPC event

Przycisk 2

Nasłuchiwanie
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
Przycisk 3 Przycisk Tylko do odczytu

Przycisk na wejściu input:2 — wykrywa pojedyncze naciśnięcie (1), długie naciśnięcie (2), podwójne naciśnięcie (3)

numeric JSON-RPC event

Przycisk 3

Nasłuchiwanie
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
Przycisk 4 Przycisk Tylko do odczytu

Przycisk na wejściu input:3 — wykrywa pojedyncze naciśnięcie (1), długie naciśnięcie (2), podwójne naciśnięcie (3)

numeric JSON-RPC event

Przycisk 4

Nasłuchiwanie
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
Przełącznik 1 Kontakt reed Tylko do odczytu

Kontakt reed na wejściu input:0 — zamknięty (1), otwarty (0)

boolean JSON-RPC status

Przełącznik 1

Nasłuchiwanie
#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
Przełącznik 2 Kontakt reed Tylko do odczytu

Kontakt reed na wejściu input:1 — zamknięty (1), otwarty (0)

boolean JSON-RPC status

Przełącznik 2

Nasłuchiwanie
#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
Przełącznik 3 Kontakt reed Tylko do odczytu

Kontakt reed na wejściu input:2 — zamknięty (1), otwarty (0)

boolean JSON-RPC status

Przełącznik 3

Nasłuchiwanie
#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
Przełącznik 4 Kontakt reed Tylko do odczytu

Kontakt reed na wejściu input:3 — zamknięty (1), otwarty (0)

boolean JSON-RPC status

Przełącznik 4

Nasłuchiwanie
#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
Połączenie: Packet Parser → MQTT
Możliwe ulepszenia (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

Źródła