TapHome

Shelly Plus i4

Packet Parser → MQTT
Inviato da
Ultimo aggiornamento: 03. 2026
Shelly Plus i4

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:

ParametroDescrizioneEsempio
MQTT Broker IPIndirizzo IP del broker MQTT192.168.1.10
MQTT Broker PortPorta del broker (predefinita 1883)1883
Shelly IDMQTT client ID dall’interfaccia web dello Shelly → Impostazioni → MQTTshellyplusi4-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 pressioneValore
Pressione singola1
Pressione lunga2
Pressione doppia3

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:

StatoValore
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

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 (vedi la guida alla connessione HTTP se non ancora fatto)
  • Broker MQTT attivo sulla rete locale (es. Mosquitto, Home Assistant o il broker integrato di TapHome)
  • TapHome CCU sulla stessa rete del broker

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

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 SettingsDevice InfoDevice ID, oppure sull’etichetta del dispositivo

Passaggio 3 — Configurazione in TapHome

  1. In TapHome, aggiungi un nuovo modulo Packet Parser (MQTT)
  2. IP Address: inserisci l’IP del broker MQTT (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

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

Pulsante 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
Pulsante 2 Pulsante Solo lettura

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

numeric JSON-RPC event

Pulsante 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
Pulsante 3 Pulsante Solo lettura

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

numeric JSON-RPC event

Pulsante 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
Pulsante 4 Pulsante Solo lettura

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

numeric JSON-RPC event

Pulsante 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
Interruttore 1 Contatto reed Solo lettura

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

boolean JSON-RPC status

Interruttore 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
Interruttore 2 Contatto reed Solo lettura

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

boolean JSON-RPC status

Interruttore 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
Interruttore 3 Contatto reed Solo lettura

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

boolean JSON-RPC status

Interruttore 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
Interruttore 4 Contatto reed Solo lettura

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

boolean JSON-RPC status

Interruttore 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
Connessione: Packet Parser → MQTT
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

Fonti