TapHome

Shelly Door/Window 2

Packet Parser → MQTT
Inviato da
Ultimo aggiornamento: 03. 2026
Shelly Door/Window 2

Lo Shelly Door/Window 2 (SHDW-2) è un sensore di contatto Wi-Fi alimentato a batteria (2x CR123A). TapHome comunica con il dispositivo tramite MQTT — il protocollo consigliato per dispositivi Shelly a batteria, poiché il sensore è in modalità sleep la maggior parte del tempo e pubblica dati solo al risveglio (cambio stato magnete, vibrazione, cambio luminosità o timer periodico).

Il template supporta fino a 5 sensori Shelly Door/Window per modulo. Ogni istanza del sensore è distinta da una variabile personalizzata sensorN_topic che punta al MQTT Client ID del dispositivo.

Configurazione

Device ID

Ogni sensore Shelly Door/Window 2 ha un MQTT Device ID univoco nel formato shellydw2-<MAC6>, dove <MAC6> sono gli ultimi 6 caratteri dell’indirizzo MAC in esadecimale minuscolo (es. shellydw2-A1B2C3).

Il Device ID si trova:

  • Sull’etichetta del dispositivo (indirizzo MAC)
  • Nell’interfaccia web Shelly: SettingsDevice Info
  • Tramite API: GET http://<device-ip>/settings → campo device.hostname

Questo dispositivo supporta la scoperta mDNS. Puoi usare l’hostname shellydw2-{MAC}.local invece dell’indirizzo IP nella configurazione TapHome. Sostituisci {MAC} con gli ultimi 6 caratteri dell’indirizzo MAC in minuscolo (es. shellydw2-A1B2C3.local). L’uso dell’hostname previene problemi di connettività al cambio dell’indirizzo IP.

Configurazione del template

Dopo l’importazione del template in TapHome:

  1. Apri il modulo Shelly Door/Window MQTT
  2. Imposta l’MQTT Broker IP e la Port (predefinita 1883)
  3. Per ogni istanza del sensore, imposta la variabile sensorN_topic sul Device ID dello Shelly Door/Window 2 corrispondente (es. shellydw2-A1B2C3)

Il modulo si iscrive a shellies/# e gli script listener filtrano i messaggi in base al prefisso topic configurato.

Configura solo gli slot sensore che utilizzi effettivamente. Gli slot non configurati (con il valore predefinito shellydw2-deviceid) mostreranno un messaggio di errore che invita a impostare il topic corretto.

Capacità del dispositivo

Rilevamento apertura/chiusura

Ogni istanza del sensore è mappata come dispositivo Reed Contact in TapHome. Lo stato porta/finestra viene letto dal topic shellies/<id>/sensor/state:

  • openAllarme (porta/finestra aperta)
  • closeOK (porta/finestra chiusa)

Il sensore si sveglia e pubblica il suo stato al movimento del magnete (porta o finestra si apre o chiude), e anche durante gli intervalli di segnalazione periodici (predefinito ogni 3 minuti).

Monitoraggio batteria, temperatura e luminanza

Ogni istanza espone tre attributi di servizio:

  • Batteria — livello percentuale batteria da shellies/<id>/sensor/battery. Avviso batteria scarica sotto il 20%.
  • Temperatura — temperatura ambiente in °C da shellies/<id>/sensor/temperature.
  • Luminanza — livello luce ambiente in lux da shellies/<id>/sensor/lux.

Tutti gli attributi sono in sola lettura e si aggiornano ad ogni risveglio del sensore.

Capacità aggiuntive (non implementate)

Lo Shelly Door/Window 2 pubblica anche angolo di inclinazione (0–180 gradi) e rilevamento vibrazioni tramite MQTT, nonché stato online/offline tramite il topic LWT. Queste capacità sono disponibili nell’output MQTT del dispositivo ma non sono mappate nel template TapHome attuale. Possono essere aggiunte in un futuro aggiornamento.

Risoluzione dei problemi

Il sensore non segnala dati
  1. Verifica che lo Shelly Door/Window 2 sia connesso al Wi-Fi e MQTT sia abilitato nelle impostazioni
  2. Controlla che la variabile sensorN_topic corrisponda esattamente al Device ID (es. shellydw2-A1B2C3)
  3. Se l’indirizzo del broker MQTT è cambiato, prova l’hostname mDNS (shellydw2-A1B2C3.local) per verificare la raggiungibilità
  4. Usa un client MQTT (es. MQTT Explorer) per iscriverti a shellies/# e verifica che il sensore pubblichi messaggi al risveglio
Lo stato apertura/chiusura non si aggiorna
  1. Assicurati che il magnete sia allineato correttamente con l’unità principale — a porta/finestra chiusa, il magnete deve essere entro 15 mm dal sensore
  2. Se il sensore è stato spostato recentemente, usa l’endpoint di calibrazione (GET http://<device-ip>/calibrate?opened=1) con porta/finestra in posizione aperta
  3. Controlla lo stato del dispositivo Reed Contact in TapHome — 1 = aperto (allarme), 0 = chiuso (OK)
La batteria si scarica rapidamente
  1. Shelly Door/Window 2 usa 2x CR123A (non ricaricabili), durata tipica circa 18 mesi
  2. Risvegli frequenti (Wi-Fi instabile o periodo di sleep molto breve) possono scaricare la batteria più velocemente
  3. Il periodo di sleep predefinito è 3 minuti — aumentarlo tramite sleep_mode.period riduce il consumo
  4. Assicura un segnale Wi-Fi forte nella posizione del sensore

I dispositivi Shelly Gen1 non supportano MQTT su TLS. La comunicazione tra sensore e broker MQTT non è crittografata (plain MQTT, porta 1883). Assicurati che il broker MQTT sia su una rete locale affidabile.

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 Door/Window MQTT Modulo
Variabili personalizzate
sensor1_topic (string) = shellydw2-deviceidID dispositivo MQTT del sensore porta/finestra 1 — formato: 'shellydw2-DEVICEID' (nell'interfaccia web Shelly → Settings → Device Info)
Open http://shellyIpAddress → Settings → Device info → copy Device ID. Format: shellydw2-<last6MAC>
sensor2_topic (string) = shellydw2-deviceidID dispositivo MQTT del sensore porta/finestra 2
sensor3_topic (string) = shellydw2-deviceidID dispositivo MQTT del sensore porta/finestra 3
sensor4_topic (string) = shellydw2-deviceidID dispositivo MQTT del sensore porta/finestra 4
sensor5_topic (string) = shellydw2-deviceidID dispositivo MQTT del sensore porta/finestra 5
Sensore porta/finestra 1 Contatto reed Solo lettura

Rilevamento apertura/chiusura tramite contatto reed — segnala allarme quando porta/finestra aperta, OK quando chiusa

boolean
Attributi di servizio
Batteria
Temperatura
Luminanza

Sensore porta/finestra 1

Listener
IF (INDEXOF(sensor1_topic, "shellydw2-deviceid") = 0)
    ADDERROR("Set correct 'sensor1_topic' value in module variables. Topic format is 'shellydw2-<deviceid>'. The Device ID can be found by opening url 'http://shellyIpAddress', in Settings -> Device info.");
    RETURN(-1);
END

VAR topicPrefix := "shellies/" + sensor1_topic;

IF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/state") = 0)
    VAR value := TOSTRING(RECEIVEDMSG.PAYLOAD);

    IF (COMPARE(value, "open", CompareOptions.IgnoreCase) = 0)
        Rc := 1;
    ELSEIF (COMPARE(value, "close", CompareOptions.IgnoreCase) = 0)
        Rc := 0;
    ELSE
        Rc := NaN;
    END
ELSEIF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/temperature") = 0)
    temp := TODOUBLE(TOSTRING(RECEIVEDMSG.PAYLOAD));
ELSEIF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/battery") = 0)
    battery := TODOUBLE(TOSTRING(RECEIVEDMSG.PAYLOAD));
    IF battery < 20
        ADDWARNING("Battery low (" + battery + "%)");
    END
ELSEIF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/lux") = 0)
    luminance := TODOUBLE(TOSTRING(RECEIVEDMSG.PAYLOAD));
END
Attributi di servizio
Battery
battery + "%"
Temperature
temp + "°C"
Luminance
luminance + " lux"
Sensore porta/finestra 2 Contatto reed Solo lettura

Rilevamento apertura/chiusura tramite contatto reed — segnala allarme quando porta/finestra aperta, OK quando chiusa

boolean
Attributi di servizio
Batteria
Temperatura
Luminanza

Sensore porta/finestra 2

Listener
IF (INDEXOF(sensor2_topic, "shellydw2-deviceid") = 0)
    ADDERROR("Set correct 'sensor2_topic' value in module variables. Topic format is 'shellydw2-<deviceid>'. The Device ID can be found by opening url 'http://shellyIpAddress', in Settings -> Device info.");
    RETURN(-1);
END

VAR topicPrefix := "shellies/" + sensor2_topic;

IF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/state") = 0)
    VAR value := TOSTRING(RECEIVEDMSG.PAYLOAD);

    IF (COMPARE(value, "open", CompareOptions.IgnoreCase) = 0)
        Rc := 1;
    ELSEIF (COMPARE(value, "close", CompareOptions.IgnoreCase) = 0)
        Rc := 0;
    ELSE
        Rc := NaN;
    END
ELSEIF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/temperature") = 0)
    temp := TODOUBLE(TOSTRING(RECEIVEDMSG.PAYLOAD));
ELSEIF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/battery") = 0)
    battery := TODOUBLE(TOSTRING(RECEIVEDMSG.PAYLOAD));
    IF battery < 20
        ADDWARNING("Battery low (" + battery + "%)");
    END
ELSEIF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/lux") = 0)
    luminance := TODOUBLE(TOSTRING(RECEIVEDMSG.PAYLOAD));
END
Attributi di servizio
Battery
battery + "%"
Temperature
temp + "°C"
Luminance
luminance + " lux"
Sensore porta/finestra 3 Contatto reed Solo lettura

Rilevamento apertura/chiusura tramite contatto reed — segnala allarme quando porta/finestra aperta, OK quando chiusa

boolean
Attributi di servizio
Batteria
Temperatura
Luminanza

Sensore porta/finestra 3

Listener
IF (INDEXOF(sensor3_topic, "shellydw2-deviceid") = 0)
    ADDERROR("Set correct 'sensor3_topic' value in module variables. Topic format is 'shellydw2-<deviceid>'. The Device ID can be found by opening url 'http://shellyIpAddress', in Settings -> Device info.");
    RETURN(-1);
END

VAR topicPrefix := "shellies/" + sensor3_topic;

IF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/state") = 0)
    VAR value := TOSTRING(RECEIVEDMSG.PAYLOAD);

    IF (COMPARE(value, "open", CompareOptions.IgnoreCase) = 0)
        Rc := 1;
    ELSEIF (COMPARE(value, "close", CompareOptions.IgnoreCase) = 0)
        Rc := 0;
    ELSE
        Rc := NaN;
    END
ELSEIF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/temperature") = 0)
    temp := TODOUBLE(TOSTRING(RECEIVEDMSG.PAYLOAD));
ELSEIF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/battery") = 0)
    battery := TODOUBLE(TOSTRING(RECEIVEDMSG.PAYLOAD));
    IF battery < 20
        ADDWARNING("Battery low (" + battery + "%)");
    END
ELSEIF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/lux") = 0)
    luminance := TODOUBLE(TOSTRING(RECEIVEDMSG.PAYLOAD));
END
Attributi di servizio
Battery
battery + "%"
Temperature
temp + "°C"
Luminance
luminance + " lux"
Sensore porta/finestra 4 Contatto reed Solo lettura

Rilevamento apertura/chiusura tramite contatto reed — segnala allarme quando porta/finestra aperta, OK quando chiusa

boolean
Attributi di servizio
Batteria
Temperatura
Luminanza

Sensore porta/finestra 4

Listener
IF (INDEXOF(sensor4_topic, "shellydw2-deviceid") = 0)
    ADDERROR("Set correct 'sensor4_topic' value in module variables. Topic format is 'shellydw2-<deviceid>'. The Device ID can be found by opening url 'http://shellyIpAddress', in Settings -> Device info.");
    RETURN(-1);
END

VAR topicPrefix := "shellies/" + sensor4_topic;

IF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/state") = 0)
    VAR value := TOSTRING(RECEIVEDMSG.PAYLOAD);

    IF (COMPARE(value, "open", CompareOptions.IgnoreCase) = 0)
        Rc := 1;
    ELSEIF (COMPARE(value, "close", CompareOptions.IgnoreCase) = 0)
        Rc := 0;
    ELSE
        Rc := NaN;
    END
ELSEIF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/temperature") = 0)
    temp := TODOUBLE(TOSTRING(RECEIVEDMSG.PAYLOAD));
ELSEIF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/battery") = 0)
    battery := TODOUBLE(TOSTRING(RECEIVEDMSG.PAYLOAD));
    IF battery < 20
        ADDWARNING("Battery low (" + battery + "%)");
    END
ELSEIF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/lux") = 0)
    luminance := TODOUBLE(TOSTRING(RECEIVEDMSG.PAYLOAD));
END
Attributi di servizio
Battery
battery + "%"
Temperature
temp + "°C"
Luminance
luminance + " lux"
Sensore porta/finestra 5 Contatto reed Solo lettura

Rilevamento apertura/chiusura tramite contatto reed — segnala allarme quando porta/finestra aperta, OK quando chiusa

boolean
Attributi di servizio
Batteria
Temperatura
Luminanza

Sensore porta/finestra 5

Listener
IF (INDEXOF(sensor5_topic, "shellydw2-deviceid") = 0)
    ADDERROR("Set correct 'sensor5_topic' value in module variables. Topic format is 'shellydw2-<deviceid>'. The Device ID can be found by opening url 'http://shellyIpAddress', in Settings -> Device info.");
    RETURN(-1);
END

VAR topicPrefix := "shellies/" + sensor5_topic;

IF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/state") = 0)
    VAR value := TOSTRING(RECEIVEDMSG.PAYLOAD);

    IF (COMPARE(value, "open", CompareOptions.IgnoreCase) = 0)
        Rc := 1;
    ELSEIF (COMPARE(value, "close", CompareOptions.IgnoreCase) = 0)
        Rc := 0;
    ELSE
        Rc := NaN;
    END
ELSEIF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/temperature") = 0)
    temp := TODOUBLE(TOSTRING(RECEIVEDMSG.PAYLOAD));
ELSEIF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/battery") = 0)
    battery := TODOUBLE(TOSTRING(RECEIVEDMSG.PAYLOAD));
    IF battery < 20
        ADDWARNING("Battery low (" + battery + "%)");
    END
ELSEIF (INDEXOF(RECEIVEDMSG.TOPIC, topicPrefix + "/sensor/lux") = 0)
    luminance := TODOUBLE(TOSTRING(RECEIVEDMSG.PAYLOAD));
END
Attributi di servizio
Battery
battery + "%"
Temperature
temp + "°C"
Luminance
luminance + " lux"
Connessione: Packet Parser → MQTT
Possibili miglioramenti (4)
  • Tilt Angle — Tilt angle in degrees (0-180), DW2 only. Available in MQTT but not mapped in the TapHome listener script.
  • Vibration Detection — Vibration detection (0=none, 1=detected). Configurable sensitivity (high/medium/low). Available in MQTT but not mapped in the TapHome listener script.
  • Connection Status — LWT topic — true on connect, false on disconnect. Could detect offline sensors.
  • Full Status JSON — Complete /status as JSON (fw >=1.8.0). Could parse wifi_sta.rssi, battery, act_reasons.

Fonti