---
title: "Shelly Plus i4"
description: "Shelly Plus i4 moduł wejścia cyfrowego Wi-Fi z 4 kanałami. Wykrywanie naciśnięć przycisków i stanów przełączników przez MQTT z TapHome — bez przekaźników."
url: "https://taphome.com/pl/compatibility/shelly-plus-i4/"
language: pl
lastmod: 2026-03-29
generator: hugo
ai:
  topics: ["mqtt","i/o-module","wifi","digital-input","push-button","reed-contact","4-channel"]
  questions: ["Jak zintegrować Shelly Plus i4 z TapHome?","Jak wykrywać naciśnięcia przycisków za pomocą Shelly Plus i4 w TapHome?","Jak podłączyć Shelly Plus i4 przez MQTT do TapHome?","Jaka jest różnica między trybem przycisku a przełącznika w Shelly Plus i4?","Jak skonfigurować wejścia Shelly Plus i4 jako przyciski lub przełączniki?","Dlaczego Shelly Plus i4 wyświetla błąd \"Device is set as switch\" w TapHome?","Czy Shelly Plus i4 może bezpośrednio sterować przekaźnikami?"]
---

# Shelly Plus i4

Komunikacja: Packet Parser → MQTT

- [Shelly Plus i4 strona produktu](https://www.shelly.com/en/products/shop/shelly-plus-i4)
- [Shelly Gen2+ Input Component API](https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/Input/)

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

| Parametr | Opis | Przykład |
|----------|------|---------|
| **MQTT Broker IP** | Adres IP brokera MQTT | `192.168.1.10` |
| **MQTT Broker Port** | Port brokera (domyślnie 1883) | `1883` |
| **Shelly ID** | MQTT client ID z interfejsu webowego Shelly → Ustawienia → MQTT | `shellyplusi4-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ęcia | Wartość |
|-----------------|---------|
| Pojedyncze naciśnięcie | 1 |
| Długie naciśnięcie | 2 |
| Podwójne naciśnięcie | 3 |

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:

| Stan | Wartość |
|------|---------|
| 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

> [!NOTE]
> 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 (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 8

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

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`

Nasłuchiwanie

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

Nasłuchiwanie

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

Nasłuchiwanie

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

Nasłuchiwanie

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

Nasłuchiwanie

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

Nasłuchiwanie

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

Nasłuchiwanie

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

Nasłuchiwanie

```taphome
#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 • Hostname: `shellyplusi4-{MAC}.local`

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

## 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`                      |
| Shelly ID            | `shellyplusi4-xxxxxxxxxxxx` |

## Źródła

- Shelly Gen2+ RPC API Reference
  
  [shelly-api-docs.shelly.cloud](https://shelly-api-docs.shelly.cloud/gen2/) 2026-03-29
- Shelly Gen2+ System Component API
  
  [shelly-api-docs.shelly.cloud](https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/Shelly/) 2026-03-29
- Shelly Gen2+ WiFi Component API
  
  [shelly-api-docs.shelly.cloud](https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/Wifi/) 2026-03-29
- Shelly Gen2+ MQTT Component API
  
  [shelly-api-docs.shelly.cloud](https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/Mqtt/) 2026-03-29
- Home Assistant Shelly Integration
  
  [www.home-assistant.io](https://www.home-assistant.io/integrations/shelly/) 2026-03-29
- Shelly Gen2+ Input Component API
  
  [shelly-api-docs.shelly.cloud](https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/Input/) 2026-03-29
- Shelly Plus i4 Knowledge Base
  
  [kb.shelly.cloud](https://kb.shelly.cloud/knowledge-base/shelly-plus-i4) 2026-03-29

## 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/)

