TapHome

Shelly Door/Window 2

Packet Parser → MQTT
Dodane przez
Ostatnia aktualizacja: 03. 2026
Shelly Door/Window 2

Shelly Door/Window 2 (SHDW-2) to bateryjny (2x CR123A) czujnik kontaktowy Wi-Fi. TapHome komunikuje się z urządzeniem przez MQTT — zalecany protokół dla bateryjnych urządzeń Shelly, ponieważ czujnik większość czasu pozostaje w trybie uśpienia i publikuje dane tylko przy zdarzeniach wybudzenia (zmiana stanu magnetu, wibracja, zmiana jasności lub timer okresowy).

Szablon obsługuje do 5 czujników Shelly Door/Window na moduł. Każda instancja czujnika jest rozróżniana zmienną niestandardową sensorN_topic wskazującą na MQTT Client ID urządzenia.

Konfiguracja

Device ID

Każdy czujnik Shelly Door/Window 2 ma unikalny MQTT Device ID w formacie shellydw2-<MAC6>, gdzie <MAC6> to ostatnie 6 znaków adresu MAC w szesnastkowym zapisie małymi literami (np. shellydw2-A1B2C3).

Device ID można znaleźć:

  • Na etykiecie urządzenia (adres MAC)
  • W interfejsie webowym Shelly: SettingsDevice Info
  • Przez API: GET http://<device-ip>/settings → pole device.hostname

To urządzenie obsługuje wykrywanie mDNS. Możesz użyć nazwy hosta shellydw2-{MAC}.local zamiast adresu IP podczas konfiguracji TapHome. Zamień {MAC} na ostatnie 6 znaków adresu MAC małymi literami (np. shellydw2-A1B2C3.local). Użycie nazwy hosta zapobiega problemom z łącznością przy zmianie adresu IP.

Konfiguracja szablonu

Po zaimportowaniu szablonu w TapHome:

  1. Otwórz moduł Shelly Door/Window MQTT
  2. Ustaw MQTT Broker IP i Port (domyślnie 1883)
  3. Dla każdej instancji czujnika ustaw zmienną sensorN_topic na Device ID odpowiedniego Shelly Door/Window 2 (np. shellydw2-A1B2C3)

Moduł subskrybuje shellies/#, a skrypty nasłuchujące filtrują wiadomości według skonfigurowanego prefiksu topicu.

Konfiguruj tylko sloty czujników, których faktycznie używasz. Nieskonfigurowane sloty (z domyślną wartością shellydw2-deviceid) wyświetlą komunikat błędu zachęcający do ustawienia prawidłowego topicu.

Możliwości urządzenia

Wykrywanie otwarcia/zamknięcia

Każda instancja czujnika jest zmapowana jako urządzenie Reed Contact w TapHome. Stan drzwi/okna odczytywany jest z topicu shellies/<id>/sensor/state:

  • openAlarm (drzwi/okno otwarte)
  • closeOK (drzwi/okno zamknięte)

Czujnik budzi się i publikuje swój stan przy ruchu magnetu (drzwi lub okno otwierają się lub zamykają), a także podczas okresowych interwałów raportowania (domyślnie co 3 minuty).

Monitorowanie baterii, temperatury i oświetlenia

Każda instancja udostępnia trzy atrybuty serwisowe:

  • Bateria — procentowy poziom baterii z shellies/<id>/sensor/battery. Ostrzeżenie o niskim poziomie baterii poniżej 20%.
  • Temperatura — temperatura otoczenia w °C z shellies/<id>/sensor/temperature.
  • Natężenie oświetlenia — poziom światła otoczenia w luksach z shellies/<id>/sensor/lux.

Wszystkie atrybuty są tylko do odczytu i aktualizują się przy każdym wybudzeniu czujnika.

Dodatkowe możliwości (niezaimplementowane)

Shelly Door/Window 2 publikuje również kąt przechyłu (0–180 stopni) i wykrywanie wibracji przez MQTT, a także status online/offline przez topic LWT. Te możliwości są dostępne w wyjściu MQTT urządzenia, ale nie są zmapowane w aktualnym szablonie TapHome. Mogą zostać dodane w przyszłej aktualizacji.

Rozwiązywanie problemów

Czujnik nie raportuje danych
  1. Sprawdź, czy Shelly Door/Window 2 jest podłączony do Wi-Fi i MQTT jest włączone w ustawieniach
  2. Upewnij się, że zmienna sensorN_topic dokładnie odpowiada Device ID (np. shellydw2-A1B2C3)
  3. Jeśli adres brokera MQTT się zmienił, spróbuj nazwy hosta mDNS (shellydw2-A1B2C3.local) do weryfikacji dostępności
  4. Użyj klienta MQTT (np. MQTT Explorer) do subskrypcji shellies/# i sprawdź, czy czujnik publikuje wiadomości po wybudzeniu
Stan otwarcia/zamknięcia nie aktualizuje się
  1. Upewnij się, że magnes jest prawidłowo wyrównany z główną jednostką — przy zamkniętych drzwiach/oknie magnes powinien być w odległości do 15 mm od czujnika
  2. Jeśli czujnik został niedawno przeniesiony, użyj endpointu kalibracji (GET http://<device-ip>/calibrate?opened=1) z drzwiami/oknem w pozycji otwartej
  3. Sprawdź stan urządzenia Reed Contact w TapHome — 1 = otwarte (alarm), 0 = zamknięte (OK)
Bateria szybko się rozładowuje
  1. Shelly Door/Window 2 używa 2x CR123A (niełdowalne), typowa żywotność ok. 18 miesięcy
  2. Częste wybudzenia (np. niestabilne Wi-Fi lub bardzo krótki okres uśpienia) mogą szybciej rozładować baterię
  3. Domyślny okres uśpienia to 3 minuty — zwiększenie go przez sleep_mode.period zmniejsza zużycie energii
  4. Zapewnij silny sygnał Wi-Fi w lokalizacji czujnika

Urządzenia Shelly Gen1 nie obsługują MQTT przez TLS. Komunikacja między czujnikiem a brokerem MQTT jest nieszyfrowana (plain MQTT, port 1883). Upewnij się, że broker MQTT jest w zaufanej sieci lokalnej.

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 Door/Window MQTT Moduł
Zmienne niestandardowe
sensor1_topic (string) = shellydw2-deviceidIdentyfikator MQTT czujnika drzwi/okna 1 — format: 'shellydw2-DEVICEID' (w interfejsie webowym Shelly → Settings → Device Info)
Open http://shellyIpAddress → Settings → Device info → copy Device ID. Format: shellydw2-<last6MAC>
sensor2_topic (string) = shellydw2-deviceidIdentyfikator MQTT czujnika drzwi/okna 2
sensor3_topic (string) = shellydw2-deviceidIdentyfikator MQTT czujnika drzwi/okna 3
sensor4_topic (string) = shellydw2-deviceidIdentyfikator MQTT czujnika drzwi/okna 4
sensor5_topic (string) = shellydw2-deviceidIdentyfikator MQTT czujnika drzwi/okna 5
Czujnik drzwi/okna 1 Kontakt reed Tylko do odczytu

Wykrywanie otwarcia/zamknięcia przez kontaktron — zgłasza alarm gdy drzwi/okno otwarte, OK gdy zamknięte

boolean
Atrybuty serwisowe
Bateria
Temperatura
Natężenie oświetlenia

Czujnik drzwi/okna 1

Nasłuchiwanie
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
Atrybuty serwisowe
Battery
battery + "%"
Temperature
temp + "°C"
Luminance
luminance + " lux"
Czujnik drzwi/okna 2 Kontakt reed Tylko do odczytu

Wykrywanie otwarcia/zamknięcia przez kontaktron — zgłasza alarm gdy drzwi/okno otwarte, OK gdy zamknięte

boolean
Atrybuty serwisowe
Bateria
Temperatura
Natężenie oświetlenia

Czujnik drzwi/okna 2

Nasłuchiwanie
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
Atrybuty serwisowe
Battery
battery + "%"
Temperature
temp + "°C"
Luminance
luminance + " lux"
Czujnik drzwi/okna 3 Kontakt reed Tylko do odczytu

Wykrywanie otwarcia/zamknięcia przez kontaktron — zgłasza alarm gdy drzwi/okno otwarte, OK gdy zamknięte

boolean
Atrybuty serwisowe
Bateria
Temperatura
Natężenie oświetlenia

Czujnik drzwi/okna 3

Nasłuchiwanie
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
Atrybuty serwisowe
Battery
battery + "%"
Temperature
temp + "°C"
Luminance
luminance + " lux"
Czujnik drzwi/okna 4 Kontakt reed Tylko do odczytu

Wykrywanie otwarcia/zamknięcia przez kontaktron — zgłasza alarm gdy drzwi/okno otwarte, OK gdy zamknięte

boolean
Atrybuty serwisowe
Bateria
Temperatura
Natężenie oświetlenia

Czujnik drzwi/okna 4

Nasłuchiwanie
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
Atrybuty serwisowe
Battery
battery + "%"
Temperature
temp + "°C"
Luminance
luminance + " lux"
Czujnik drzwi/okna 5 Kontakt reed Tylko do odczytu

Wykrywanie otwarcia/zamknięcia przez kontaktron — zgłasza alarm gdy drzwi/okno otwarte, OK gdy zamknięte

boolean
Atrybuty serwisowe
Bateria
Temperatura
Natężenie oświetlenia

Czujnik drzwi/okna 5

Nasłuchiwanie
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
Atrybuty serwisowe
Battery
battery + "%"
Temperature
temp + "°C"
Luminance
luminance + " lux"
Połączenie: Packet Parser → MQTT
Możliwe ulepszenia (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.

Źródła