---
title: "Shelly Plus i4"
description: "Shelly Plus i4 modulo di ingresso digitale Wi-Fi a 4 canali. Rileva pressioni pulsanti e stati interruttori via MQTT da TapHome — senza relè, puro ingresso."
url: "https://taphome.com/it/compatibility/shelly-plus-i4/"
language: it
lastmod: 2026-03-29
generator: hugo
ai:
  topics: ["mqtt","i/o-module","wifi","digital-input","push-button","reed-contact","4-channel"]
  questions: ["Come integrare Shelly Plus i4 con TapHome?","Come rilevare le pressioni dei pulsanti con Shelly Plus i4 in TapHome?","Come collegare Shelly Plus i4 tramite MQTT a TapHome?","Qual è la differenza tra modalità pulsante e interruttore su Shelly Plus i4?","Come configurare gli ingressi Shelly Plus i4 come pulsanti o interruttori?","Perché Shelly Plus i4 mostra l'errore \"Device is set as switch\" in TapHome?","Shelly Plus i4 può controllare relè direttamente?"]
---

# Shelly Plus i4

Comunicazione: Packet Parser → MQTT

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

> Indirizzo di rete
> 
> Con il broker MQTT integrato in TapHome, inserisci `127.0.0.1` come indirizzo del broker in TapHome. Nel dispositivo inserisci l’indirizzo IP del TapHome Core e assegna al Core una prenotazione IP nel router.
> 
> [Preparazione della rete](https://taphome.com/it/docs/setup/network-preparation/)

## Guida all'integrazione

Lo Shelly Plus i4 è un modulo di ingresso digitale Wi-Fi compatto a 4 canali. Non ha relè né uscite — funziona esclusivamente come dispositivo di ingresso che rileva pressioni di pulsanti e stati degli interruttori su quattro morsetti indipendenti (SW1–SW4). Si installa dietro un interruttore a parete standard (37 x 42 x 16 mm) ed è alimentato a 110–240 VAC. TapHome comunica con il dispositivo tramite MQTT utilizzando notifiche Gen2+ JSON-RPC 2.0 sulla rete locale — non è richiesta alcuna connessione cloud.

Ciascuno dei quattro ingressi può essere configurato indipendentemente in **modalità pulsante** (rileva pressione singola, pressione doppia, pressione lunga) o **modalità interruttore** (rileva stato aperto/chiuso). Il template TapHome crea per ogni ingresso sia un dispositivo pulsante che un dispositivo contatto reed — si utilizza quello che corrisponde alla configurazione dell'ingresso nell'interfaccia web dello Shelly.

## Configurazione

### Configurazione del broker MQTT

Lo Shelly Plus i4 comunica tramite MQTT. È necessario un broker MQTT nella propria rete (ad es. Mosquitto). Nell'interfaccia web dello Shelly (`http://{ip-dispositivo}`), andare in Impostazioni → MQTT e abilitare MQTT, inserendo l'indirizzo IP e la porta del broker.

### Parametri di importazione del template

Durante l'importazione del template in TapHome, inserire tre parametri:

| Parametro | Descrizione | Esempio |
|-----------|-------------|---------|
| **MQTT Broker IP** | Indirizzo IP del broker MQTT | `192.168.1.10` |
| **MQTT Broker Port** | Porta del broker (predefinita 1883) | `1883` |
| **Shelly ID** | MQTT client ID dall'interfaccia web dello Shelly → Impostazioni → MQTT | `shellyplusi4-xxxxxxxxxxxx` |

### Configurazione della modalità di ingresso

Dopo l'importazione del template, configurare ciascun ingresso nell'interfaccia web dello Shelly (`http://{ip-dispositivo}`) → Ingressi:

- **Modalità pulsante** — per pulsanti a impulso. Utilizzare il corrispondente dispositivo Pulsante 1–4 in TapHome.
- **Modalità interruttore** — per interruttori a levetta o contatti reed. Utilizzare il corrispondente dispositivo Interruttore 1–4 in TapHome.

Ogni ingresso fisico può essere di un solo tipo alla volta. Se un ingresso è impostato in modalità interruttore ma TapHome riceve un evento pulsante (o viceversa), lo script listener segnala un errore di mancata corrispondenza.

## Funzionalità del dispositivo

### Rilevamento pressione pulsante (Pulsante 1–4)

Quattro dispositivi pulsante ascoltano i messaggi MQTT `NotifyEvent` sul topic `{device_id}/events/rpc`. Ogni pulsante rileva tre tipi di pressione e li mappa a valori numerici:

| Tipo di pressione | Valore |
|-------------------|--------|
| Pressione singola | 1 |
| Pressione lunga | 2 |
| Pressione doppia | 3 |

I dispositivi pulsante sono di sola lettura — riportano l'ultimo evento rilevato. Ogni pulsante ascolta gli eventi dal suo componente di ingresso corrispondente (`input:0` fino a `input:3`).

### Rilevamento interruttore/contatto reed (Interruttore 1–4)

Quattro dispositivi contatto reed ascoltano i messaggi MQTT `NotifyStatus`. Ogni interruttore legge lo stato binario del suo ingresso corrispondente:

| Stato | Valore |
|-------|--------|
| Chiuso (attivo) | 1 |
| Aperto (inattivo) | 0 |

I dispositivi interruttore sono di sola lettura con un intervallo di polling di 2,5 secondi. Sono adatti per interruttori a levetta, contatti reed magnetici o qualsiasi sensore binario on/off collegato ai morsetti di ingresso.

### Funzionalità aggiuntive

L'API dello Shelly Plus i4 supporta anche il rilevamento della tripla pressione, eventi raw button-down/button-up e un metodo programmatico `Input.Trigger` (unico per i dispositivi i4) che può emettere eventi senza ingresso fisico. La diagnostica di sistema (uptime, MAC, WiFi RSSI) è disponibile tramite HTTP RPC ma non è esposta in questo template esclusivamente MQTT. Queste funzionalità potranno essere aggiunte in un futuro aggiornamento del template.

## Risoluzione dei problemi

### Le pressioni dei pulsanti non vengono rilevate

1. Verificare che l'ingresso sia configurato in modalità **pulsante** nell'interfaccia web dello Shelly → Ingressi
2. Controllare che TapHome sia connesso al broker MQTT e che lo Shelly ID corrisponda al MQTT client ID del dispositivo
3. Se TapHome mostra l'errore "Device is set as switch", l'ingresso è in modalità interruttore — cambiarlo in modalità pulsante nell'interfaccia web dello Shelly oppure utilizzare il dispositivo Interruttore 1–4

### Lo stato dell'interruttore non si aggiorna

1. Verificare che l'ingresso sia configurato in modalità **interruttore** nell'interfaccia web dello Shelly → Ingressi
2. Se TapHome mostra l'errore "Device is set as button", l'ingresso è in modalità pulsante — cambiarlo in modalità interruttore oppure utilizzare il dispositivo Pulsante 1–4
3. Azionare l'interruttore fisico e controllare il broker MQTT per messaggi `NotifyStatus` sul topic `shellyplusi4-{id}/events/rpc`

### Dispositivo non raggiungibile

1. Verificare che lo Shelly sia connesso al Wi-Fi — il LED blu dovrebbe essere acceso fisso
2. Confermare che MQTT è abilitato nell'interfaccia web dello Shelly → Impostazioni → MQTT e che l'indirizzo del broker è corretto
3. Provare a utilizzare l'hostname mDNS (`shellyplusi4-AABBCCDDEE.local`) per accedere all'interfaccia web dello Shelly
4. Controllare che il broker MQTT sia in esecuzione e raggiungibile sia da TapHome Core che dal dispositivo Shelly

> [!NOTE]
> Lo Shelly Plus i4 ha un limite MQTT di **80 notifiche per finestra di 60 secondi**. Pressioni rapide e ripetute dei pulsanti possono superare questo limite e causare la perdita di alcuni eventi. Si tratta di una limitazione a livello firmware.

## Come installare in TapHome

### Prerequisiti

- Dispositivo Shelly connesso al Wi-Fi (2,4 GHz), ad es. tramite l'app Shelly o l'access point del dispositivo stesso
- Broker MQTT attivo sulla rete locale (es. Mosquitto, Home Assistant o il broker integrato di TapHome)
- TapHome CCU sulla stessa rete del broker

> [!WARNING]
> Sui dispositivi **Gen1**, l'attivazione di MQTT **disabilita Shelly Cloud**. Entrambi non possono funzionare contemporaneamente. Sui dispositivi Gen2/Plus questa limitazione non si applica.

### Passaggio 1 — Abilitare MQTT sul dispositivo Shelly

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

1. Apri l'interfaccia web Shelly: `http://<device-ip>/`
2. Vai su **Internet & Security** → **Advanced — MQTT**
3. Abilita **MQTT**
4. Imposta **MQTT Server**: `<broker-ip>:<port>` (es. `192.168.1.10:1883`)
5. Opzionalmente imposta **MQTT User** e **MQTT Password** se il broker richiede l'autenticazione
6. Clicca su **Save** — il dispositivo si riavvierà e si connetterà al broker

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

1. Apri l'interfaccia web Shelly: `http://<device-ip>/`
2. Vai su **Settings** → **MQTT**
3. Abilita **MQTT**
4. Imposta **Server**: `<broker-ip>:<port>` (es. `192.168.1.10:1883`)
5. Il **Client ID** è precompilato con l'ID del dispositivo (es. `shellyplus1pm-AABBCCDDEE`) — lascialo così a meno che tu non abbia un motivo specifico per cambiarlo
6. Clicca su **Save** e riavvia il dispositivo

Con il broker integrato di TapHome, `<broker-ip>` è l'indirizzo IP del TapHome Core. Assegna al Core una prenotazione IP nel router, altrimenti il dispositivo perde il broker quando il router cambia l'indirizzo → [Preparazione della rete](https://taphome.com/it/docs/setup/network-preparation/).

> [!TIP]
> Per verificare che MQTT funzioni, usa un client MQTT (es. MQTT Explorer) e sottoscrivi `shellies/#` (Gen1) o `<device-id>/#` (Gen2). Dovresti vedere i messaggi di stato dal dispositivo.

### Passaggio 2 — Trovare il Device ID / MQTT Client ID

Alcuni template richiedono un parametro **Device ID** o **MQTT Client ID**. Questo è l'identificatore univoco utilizzato nei topic MQTT.

- **Gen1:** si trova sull'etichetta come indirizzo MAC (es. `AABBCCDDEE`). Device ID = `shelly<model>-<mac>`, es. `shelly1pm-AABBCCDDEE`
- **Gen2/Plus:** si trova nell'interfaccia web Shelly sotto **Settings** → **Device Info** → **Device ID**, oppure sull'etichetta del dispositivo

### Passaggio 3 — Configurazione in TapHome

1. In TapHome, aggiungi un nuovo modulo **Packet Parser (MQTT)**
2. **IP Address:** `127.0.0.1` per il broker integrato di TapHome (l'unità di controllo si connette a sé stessa, l'indirizzo non cambia mai); per un broker esterno il suo indirizzo IP (es. `192.168.1.10`)
3. **Port:** `1883` (predefinito; usa `8883` per TLS)
4. **Device ID / MQTT Client ID:** inserisci il valore dal passaggio 2 (se richiesto dal template)
5. Importa il template — TapHome si sottoscriverà automaticamente ai topic del dispositivo

## Dispositivi disponibili 8

Questi dispositivi compaiono in TapHome dopo l'importazione.

Shelly Plus i4 Modulo

Variabili personalizzate

|               |
|---------------|
| `ID` (string) |

Pulsante 1 Pulsante Solo lettura

Pulsante su input:0 — rileva pressione singola (1), pressione lunga (2), doppia pressione (3)

numeric JSON-RPC event

Variabile: `Button`

Listener

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

Pulsante 2 Pulsante Solo lettura

Pulsante su input:1 — rileva pressione singola (1), pressione lunga (2), doppia pressione (3)

numeric JSON-RPC event

Listener

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

Pulsante 3 Pulsante Solo lettura

Pulsante su input:2 — rileva pressione singola (1), pressione lunga (2), doppia pressione (3)

numeric JSON-RPC event

Listener

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

Pulsante 4 Pulsante Solo lettura

Pulsante su input:3 — rileva pressione singola (1), pressione lunga (2), doppia pressione (3)

numeric JSON-RPC event

Listener

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

Interruttore 1 Contatto reed Solo lettura

Contatto reed su input:0 — chiuso (1), aperto (0)

boolean JSON-RPC status

Listener

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

Interruttore 2 Contatto reed Solo lettura

Contatto reed su input:1 — chiuso (1), aperto (0)

boolean JSON-RPC status

Listener

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

Interruttore 3 Contatto reed Solo lettura

Contatto reed su input:2 — chiuso (1), aperto (0)

boolean JSON-RPC status

Listener

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

Interruttore 4 Contatto reed Solo lettura

Contatto reed su input:3 — chiuso (1), aperto (0)

boolean JSON-RPC status

Listener

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

**Connessione:** Packet Parser → MQTT • Hostname: `shellyplusi4-{MAC}.local`

Possibili miglioramenti (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

## Parametri di importazione

Inserisci questi valori quando importi l'XML.

| Richiesto nell'app       | Predefinito                 |
|--------------------------|-----------------------------|
| Mqtt Broker Indirizzo IP | `192.168.0.1`               |
| Mqtt Broker port         | `1883`                      |
| Shelly ID                | `shellyplusi4-xxxxxxxxxxxx` |

## Fonti

- 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

## Documentazione correlata

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

