TapHome

Shelly DUO

Packet Parser → HTTP
Dodane przez
Ostatnia aktualizacja: 03. 2026
Shelly DUO

Shelly DUO to żarówka LED Wi-Fi z gwintem E27, obsługująca ściemnianie jasności i regulowaną temperaturę barwową białego światła (CCT) w zakresie od 2700 K (ciepła biel) do 6500 K (światło dzienne). TapHome integruje się z żarówką lokalnie przez Wi-Fi za pomocą HTTP REST API lub MQTT. Połączenie z chmurą nie jest wymagane.

Dostępne są dwa szablony TapHome: szablon HTTP dla pojedynczej żarówki i szablon MQTT, który może sterować do 5 żarówek DUO przez jedno połączenie z brokerem MQTT. Oba szablony udostępniają te same typy urządzeń na żarówkę — urządzenie świetlne ze sterowaniem jasnością i CCT oraz licznik energii do pomiaru mocy.

Konfiguracja

Szablon HTTP

Szablon HTTP wymaga adresu IP żarówki (lub nazwy hosta mDNS ShellyBulbDuo-{MAC}.local). TapHome odpytuje endpoint /status co 2,5 sekundy i zapisuje odpowiedź JSON do zmiennej niestandardowej jsonStatus. Poszczególne skrypty urządzeń parsują zapisaną odpowiedź bez zbędnych wywołań HTTP.

Szablon akceptuje dwa parametry importu:

  • Adres IP — lokalny IP żarówki (domyślny 192.168.0.1)
  • Czas przejścia — czas trwania przejścia światła w milisekundach (domyślne 300 ms)
Szablon MQTT

Szablon MQTT wymaga IP brokera, portu i Device ID dla każdej żarówki (format: ShellyBulbDuo-DEVICEID). Device ID można znaleźć w interfejsie web Shelly w Settings > Device Info lub przez GET http://{bulb-ip}/settings w polu mqtt.id.

Szablon obsługuje do 5 żarówek DUO przez jeden moduł. Każda żarówka jest identyfikowana przez własną zmienną topic (bulb1topic do bulb5topic). Nieużywane sloty żarówek mogą pozostać na domyślnej wartości placeholder.

Szablon akceptuje trzy parametry importu:

  • MQTT Broker IP — adres brokera (domyślny 192.168.0.1)
  • MQTT Broker port — port brokera (domyślny 1883)
  • Czas przejścia — czas trwania przejścia światła w milisekundach (domyślne 300 ms)

Na urządzeniach Shelly Gen1 włączenie MQTT wyłącza Shelly Cloud. Oba nie mogą działać jednocześnie.

Funkcje urządzenia

Sterowanie światłem

Szablon udostępnia DUO jako urządzenie białego światła z dwoma sterowalnymi parametrami:

  • Jasność — odczytywana z lights[0].brightness (0–100, wewnętrznie konwertowana na 0,0–1,0) i lights[0].ison; sterowana przez /light/0?turn=on|off&brightness=N (HTTP) lub publikowanie JSON do topicu light/0/set (MQTT)
  • Temperatura barwowa — odczytywana z lights[0].temp (2700–6500 K); sterowana przez /light/0?temp=K (HTTP) lub pole temp w payloadzie JSON (MQTT)

Oba parametry są wysyłane razem w jednym poleceniu zapisu. Parametr czas przejścia steruje czasem trwania płynnego przejścia dla wszystkich zmian.

Gdy światło jest wyłączane (jasność ustawiona na 0), szablon wysyła turn=off (HTTP) lub publikuje off do topicu light/0/command (MQTT).

Mechanizm debounce

Szablon HTTP zawiera ochronę debounce zapobiegającą nieaktualnym odczytom podczas przejść świetlnych. Po każdym poleceniu zapisu szablon ignoruje odczyty /status przez czas trwania przejścia plus 500 ms. W tym okresie skrypty odczytu zwracają ostatnie znane wartości zamiast odpytywać urządzenie. Zapobiega to krótkotrwałemu wyświetlaniu stanów pośrednich w interfejsie, podczas gdy żarówka przechodzi.

Szablon MQTT nie wymaga debounce — otrzymuje aktualizacje stanu bezpośrednio z żarówki, gdy się pojawiają.

Pomiar mocy

Wbudowany licznik energii odczytuje dwie wartości:

  • Moc chwilowameters[0].power w watach, konwertowana na kW (dzielona przez 1000)
  • Całkowite zużyciemeters[0].total w watominutach, konwertowane na kWh (dzielone przez 60 000)

Licznik jest tylko do odczytu i aktualizuje się automatycznie z każdym cyklem odpytywania (HTTP) lub z każdą wiadomością MQTT.

Aby włączyć monitorowanie mocy, model urządzenia musi być skonfigurowany w aplikacji Shelly lub przeglądarce web w Settings > Device Model. Jeśli żarówka jest włączona, ale moc pokazuje zero, szablon wyświetla ostrzeżenie o tym kroku konfiguracji.

Diagnostyka serwisowa (szablon HTTP)

Szablon HTTP udostępnia 10 atrybutów serwisowych:

  • Info sieciowe — adres IP, adres MAC (formatowany z separatorami dwukropkowymi), siła sygnału Wi-Fi (dB)
  • Łączność — chmura włączona/połączona, MQTT połączony
  • Info o urządzeniu — czas urządzenia, czas pracy (formatowany jako dni/godziny/minuty), użycie RAM
  • Firmware — dostępna aktualizacja firmware
Akcje serwisowe (szablon HTTP)

Dostępne są dwie akcje serwisowe:

  • Włącz chmurę — włącza lub wyłącza łączność Shelly Cloud
  • Restart — wyzwala restart urządzenia
Dodatkowe funkcje

Shelly DUO udostępnia również timer światła (flaga aktywna i pozostałe sekundy), automatyczny timer wyłączenia na endpoincie światła, temperaturę wewnętrzną urządzenia, siłę sygnału Wi-Fi jako samodzielne urządzenie czujnikowe oraz topic MQTT online/offline LWT do wykrywania stanu połączenia. Te funkcje mogą zostać dodane w przyszłej aktualizacji szablonu.

Rozwiązywanie problemów

Żarówka nie odpowiada (HTTP)
  1. Sprawdź, czy DUO jest podłączona do Wi-Fi i ma prawidłowy adres IP
  2. Spróbuj użyć nazwy hosta mDNS (ShellyBulbDuo-AABBCCDDEE.local) zamiast adresu IP — IP mógł się zmienić po odnowieniu DHCP
  3. Otwórz http://{bulb-ip}/shelly w przeglądarce — jeśli odpowiada JSON zawierającym "type":"SHBDUO-1", żarówka jest dostępna
  4. Sprawdź, czy TapHome CCU i DUO są w tej samej sieci / VLAN
Moc pokazuje zero
  1. Potwierdź, że model urządzenia jest skonfigurowany w aplikacji Shelly (Settings > Device Model)
  2. Sprawdź, czy żarówka jest włączona — licznik mierzy tylko gdy przepływa prąd
  3. Odpytaj /status ręcznie i zweryfikuj, że meters[0].power zwraca wartość różną od zera
Żarówka MQTT nie odpowiada
  1. Sprawdź, czy MQTT jest włączone w interfejsie web Shelly (Internet & Security > Advanced — MQTT)
  2. Potwierdź, że adres brokera i port są poprawne zarówno w urządzeniu Shelly, jak i w ustawieniach modułu TapHome
  3. Sprawdź, czy zmienna niestandardowa bulbNtopic dokładnie odpowiada Device ID żarówki (np. ShellyBulbDuo-B929CC)
  4. Użyj klienta MQTT (np. MQTT Explorer) do subskrypcji shellies/# i sprawdź, czy żarówka publikuje wiadomości
Przejścia świetlne wydają się szarpane
  1. Zwiększ parametr czas przejścia — domyślne 300 ms może być za krótkie dla dużych zmian jasności
  2. Jeśli używasz HTTP, upewnij się, że żaden inny system nie odpytuje żarówki jednocześnie — urządzenia Gen1 obsługują tylko 2 jednoczesne połączenia

Urządzenia Shelly Gen1 obsługują tylko 2 jednoczesne połączenia HTTP. Jeśli TapHome i inny system (np. Home Assistant) odpytują to samo urządzenie jednocześnie, komunikacja może być zawodna. Rozważ przejście na szablon MQTT dla środowisk z wieloma systemami.

Jak zainstalować w TapHome

Wymagania wstępne

  • Urządzenie Shelly zainstalowane i włączone
  • Lokalna sieć Wi-Fi (2,4 GHz)
  • TapHome CCU w tej samej sieci

Krok 1 — Podłącz Shelly do Wi-Fi

Opcja A — Aplikacja Shelly (zalecana):

  1. Pobierz aplikację Shelly (iOS / Android)
  2. Dotknij +Add Device i postępuj zgodnie z kreatorem parowania Bluetooth
  3. Wprowadź dane logowania Wi-Fi, gdy zostaniesz o to poproszony

Opcja B — Tryb AP (bez aplikacji):

  1. Przy pierwszym uruchomieniu urządzenie tworzy hotspot: ShellyXXX-AABBCCDDEE
  2. Połącz telefon/PC z tym hotspotem
  3. Otwórz http://192.168.33.1Internet & SecurityWi-Fi Mode - Client
  4. Wprowadź SSID i hasło → Save

Shelly obsługuje tylko sieci 2,4 GHz. Sieci 5 GHz nie pojawią się podczas skanowania.

Krok 2 — Znajdź adres IP

Po połączeniu z Wi-Fi znajdź przypisany adres IP za pomocą jednej z poniższych metod:

  • Aplikacja Shelly: Szczegóły urządzenia → Device info → Adres IP
  • Interfejs webowy Shelly: Połącz się z AP urządzenia przed konfiguracją Wi-Fi — IP zostanie wyświetlone po zapisaniu
  • Tabela DHCP routera: Szukaj nazwy hosta takiej jak shelly1pm-AABBCCDDEE
  • mDNS: Pinguj shelly<model>-<mac>.local (np. shelly1pm-AABBCCDDEE.local) z tej samej sieci

Przypisz urządzeniu Shelly statyczny IP (rezerwację DHCP) w routerze, aby adres nie zmieniał się po ponownym uruchomieniu routera.

Krok 3 — Konfiguracja w TapHome

  1. W TapHome dodaj nowy moduł Packet Parser (HTTP)
  2. IP Address: wprowadź IP z kroku 2 (np. 192.168.1.50)
  3. Port: 80 (domyślny, nie wymaga zmiany)
  4. Zaimportuj szablon — TapHome będzie okresowo odpytywać /status w celu odczytu stanu urządzenia

Uwierzytelnianie HTTP jest domyślnie wyłączone na urządzeniach Shelly. Jeśli włączyłeś ochronę logowaniem, TapHome obecnie nie obsługuje HTTP Basic Auth — pozostaw uwierzytelnianie wyłączone dla integracji z TapHome.

Dostępne urządzenia

Shelly DUO Moduł
Atrybuty serwisowe
Adres IP
Adres MAC
Sygnał WiFi
Chmura włączona
Chmura połączona
MQTT połączony
Czas urządzenia
Dostępna aktualizacja FW
Czas pracy
RAM
Akcje serwisowe
Włącz chmurę
Restart
Zmienne niestandardowe
transitionTime (numeric) = TransitionTimeLight transition duration in milliseconds (import parameter, default 300 ms)

Shelly DUO Module

Odczyt (moduł)
VAR now := NOW();

IF now.Ticks < debounceTimestamp
    RETURN(0);
END

VAR response := SENDHTTPREQUEST("/status");

IF response.IsSuccess
    jsonStatus := response.Content;
ELSE
    jsonStatus := NULL;
END
Atrybuty serwisowe
IP Address
VAR response := SENDHTTPREQUEST("/status");

IF response.IsSuccess
    jsonStatus := response.Content;
ELSE
    jsonStatus := NULL;
END

VAR address := PARSEJSON(jsonStatus, "$.wifi_sta.ip", 1);
IF (ISNULL(address), "-", address)
MAC Address
VAR value := PARSEJSON(jsonStatus, "$.mac", 1);
IF ISNULL(value)
    RETURN("-");
END;

STRING mac;
INT i := 0;
INT len := LENGTH(value);

WHILE i < len
    mac += GETAT(value, i);
    i += 1;
    
    IF MOD(i, 2) = 0 AND i < len
        mac += ":";
    END
LOOP

mac
WIFI signal
VAR signal := PARSEJSON(jsonStatus, "$.wifi_sta.rssi", 1);
IF (ISNULL(signal), "-", signal + "db");
Cloud enabled
VAR value := PARSEJSON(jsonStatus, "$.cloud.enabled", 1);
IF (ISNULL(value), "-", value)
Cloud connected
VAR value := PARSEJSON(jsonStatus, "$.cloud.connected", 1);
IF (ISNULL(value), "-", value)
MQTT connected
VAR value := PARSEJSON(jsonStatus, "$.mqtt.connected", 1);
IF (ISNULL(value), "-", value)
Device time
VAR value := PARSEJSON(jsonStatus, "$.time", 1);
IF (ISNULL(value), "-", value)
FW update available
VAR value := PARSEJSON(jsonStatus, "$.has_update");
IF (ISNULL(value), "-", value)
Uptime
VAR value := PARSEJSON(jsonStatus, "$.uptime", 1);
IF ISNULL(value)
    RETURN("-");
END

VAR days := FLOOR(value/86400, 1);
value := MOD(value, 86400);
VAR hours := FLOOR(value/3600, 1);
value := MOD(value, 3600);
VAR minutes := FLOOR(value/60, 1);

days + "day(s) " + hours + "h " + minutes + "m"
RAM
VAR ramFree := PARSEJSON(jsonStatus, "$.ram_free", 1);
VAR ramTotal := PARSEJSON(jsonStatus, "$.ram_total", 1);

IF ISNULL(ramFree) OR ISNULL(ramTotal)
    RETURN("-");
END

ramFree + " bytes free of " + ramTotal
Akcje serwisowe
Enable cloud
Parametry: Enable (Enable / Disable)
VAR response := SENDHTTPREQUEST("/settings/cloud?enabled=" + enable);
VAR contentJson := response.Content;
VAR wasEnabled := PARSEJSON(contentJson, "enabled");

IF(wasEnabled, "Cloud enabled", "Cloud disabled");
Reboot
VAR response := SENDHTTPREQUEST("/reboot");
VAR contentJson := response.Content;
VAR wasRebooted := PARSEJSON(contentJson, "ok");

IF(wasRebooted, "Reboot successful", "Error");
Światło Białe światło

Białe światło CCT (2700–6500 K) — ściemnianie jasności i sterowanie temperaturą barwową

numeric Jednostka: %, K json_path

Światło

Odczyt jasności
VAR now := NOW();

IF now.Ticks < debounceTimestamp
    RETURN(Hb);
END

VAR value := PARSEJSON(jsonStatus, "$.lights[0].brightness", 1);

IF ISNULL(value)
    RETURN(NaN);
END

BOOL isOn := PARSEJSON(jsonStatus, "$.lights[0].ison", 1);

IF ISNULL(isOn)
    RETURN(NaN);
END

IF(isOn, value/100.0, 0);
Zapis jasności
IF St > 0.5
    SENDHTTPREQUEST("light/0?turn=on&transition=" + transitionTime + "&brightness=" + ROUND(Hb*100.0));
ELSE
    SENDHTTPREQUEST("light/0?turn=off&transition=" + transitionTime);
END

VAR now := NOW();
debounceTimestamp := now.Ticks + transitionTime + 500;
Odczyt temperatury barwowej
VAR now := NOW();

IF now.Ticks < debounceTimestamp
    RETURN(Ct);
END

VAR value := PARSEJSON(jsonStatus, "$.lights[0].temp", 1);

IF ISNULL(value)
    RETURN(NaN);
END
 
value
Zapis temperatury barwowej
SENDHTTPREQUEST("light/0?transition=" + transitionTime + "&brightness=" + ROUND(Hb*100) + "&temp=" + Ct);

VAR now := NOW();
debounceTimestamp := now.Ticks + transitionTime + 500;
Licznik energii Licznik energii Tylko do odczytu

Pomiar zużycia energii — moc chwilowa (kW) i energia skumulowana (kWh)

numeric Jednostka: W / kWh json_path

Licznik energii

Odczyt całkowitego zużycia
IF LENGTH(jsonStatus) = 0
    RETURN(NaN);
END

VAR power := PARSEJSON(jsonStatus, "$.meters[0].power");
VAR total := PARSEJSON(jsonStatus, "$.meters[0].total");
BOOL isOn := PARSEJSON(jsonStatus, "$.lights[0].ison");

IF ISNULL(power) OR ISNULL(total) OR (ison AND power=0)
	ADDWARNING("To enable power monitoring, open device settings in Shelly app or web browser and configure device model in Settings->Device Model");
	
    RETURN(NaN);
END

total / 60000.0
Odczyt zapotrzebowania
IF LENGTH(jsonStatus) = 0
    RETURN(NaN);
END

VAR power := PARSEJSON(jsonStatus, "$.meters[0].power", 1);

IF ISNULL(power)
    RETURN(NaN);
END

power / 1000.0
Połączenie: Packet Parser → HTTP
Możliwe ulepszenia (7)
  • Light Timer Active — Boolean — whether a countdown timer is currently active on the light output.
  • Timer Remaining — Seconds remaining on active timer. Available in /status response.
  • Auto-off Timer — Auto-off timer in seconds, could be added as service action or light parameter.
  • WiFi Signal Strength (as device) — WiFi RSSI in dBm. HTTP template exposes it as service attribute but not as a standalone sensor device.
  • Internal Device Temperature — Internal temperature in celsius. Available in /status for Gen1 devices. Not exposed in DUO template.
  • MQTT Real-time Power (as device attribute) — MQTT template reads power in electric meter device but does not expose it as a service attribute on the light device.
  • Connection Status — LWT topic — true on connect, false on disconnect. Could detect offline bulbs.

Źródła