TapHome

Shelly DUO RGBW

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

Shelly DUO RGBW to inteligentna żarówka LED Wi-Fi Gen1 w formacie GU10. Obsługuje pełne kolory RGB i regulowaną biel (CCT 3000–6500 K) z płynnymi efektami przejść. TapHome komunikuje się z urządzeniem przez sieć lokalną — połączenie z chmurą nie jest wymagane.

Dostępne są dwa szablony TapHome: szablon HTTP do sterowania pojedynczą żarówką przez REST API i szablon MQTT, który może sterować do 5 żarówek przez współdzielony broker MQTT. Oba szablony udostępniają pełne sterowanie światłem i pomiar mocy.

Konfiguracja

Szablon HTTP

Szablon HTTP wymaga adresu IP żarówki (domyślny placeholder 192.168.0.1) i opcjonalnego czasu przejścia w milisekundach (domyślne 300 ms). TapHome odpytuje endpoint /status co 2,5 sekundy w celu odczytu stanu światła, wartości kolorów i danych pomiarowych energii.

Skrypt odczytu na poziomie modułu zapisuje odpowiedź /status do zmiennej niestandardowej jsonStatus, dzięki czemu skrypty poszczególnych urządzeń mogą parsować dane bez zbędnych wywołań HTTP.

Szablon MQTT

Szablon MQTT wymaga danych połączenia z brokerem i jednego lub więcej Device ID — jednego na żarówkę. Device ID każdej żarówki jest konfigurowane przez zmienną niestandardową bulbNtopic (format: shellycolorbulb-DEVICEID). Device ID można znaleźć w interfejsie web Shelly w Settings > Device Info.

Szablon obsługuje do 5 żarówek jednocześnie. Konfiguruj zmienne bulbNtopic tylko dla żarówek, które faktycznie posiadasz — nieużywane sloty mogą pozostać na domyślnych wartościach placeholder.

Po włączeniu MQTT na Shelly DUO RGBW (Internet & Security > Advanced — MQTT), TapHome subskrybuje shellies/# i kieruje wiadomości do właściwej instancji żarówki na podstawie prefiksu topicu.

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

Żarówka działa w dwóch wzajemnie wykluczających się trybach:

  • Tryb kolorowy — pełne sterowanie RGB przez kanały czerwony, zielony i niebieski (0–255 każdy) plus gain (jasność, 0–100 %). TapHome reprezentuje to jako światło HSB — barwa (0–360), nasycenie (0,0–1,0) i jasność (0,0–1,0) są konwertowane z RGB za pomocą funkcji RGBTOHSV.
  • Tryb biały — regulowana biel przez temperaturę barwową (3000–6500 K) i jasność (0–100 %). Ustawienie wartości CCT w TapHome automatycznie przełącza żarówkę w tryb biały.

Tryb przełącza się automatycznie w zależności od ustawianej właściwości:

  • Ustawienie barwy lub nasycenia wysyła polecenie /light/0?mode=color (HTTP) lub payload JSON z "mode":"color" przez color/0/set (MQTT)
  • Ustawienie CCT wysyła polecenie /light/0?mode=white (HTTP) lub payload z "mode":"white" (MQTT)

Wszystkie polecenia zapisu zawierają skonfigurowany parametr transitionTime dla płynnego wygaszania między stanami. Mechanizm debounce zapobiega nieaktualnym odczytom podczas przejść — szablon ignoruje odpowiedzi /status przez krótki okres po każdym zapisie.

W trybie MQTT okno debounce wynosi 3 sekundy po każdym zapisie (dłuższe niż szablon HTTP) w celu uwzględnienia opóźnienia dostarczania wiadomości MQTT.

Pomiar mocy

Oba szablony udostępniają licznik energii odczytujący dwie wartości:

  • Moc chwilowa — w watach, konwertowana na kW przez dzielenie przez 1000
  • Całkowite zużycie — w watominutach, konwertowane na kWh przez dzielenie przez 60 000

Szablon HTTP odczytuje meters[0].power i meters[0].total z odpowiedzi /status. Szablon MQTT nasłuchuje na topicach shellies/{id}/light/0/power i shellies/{id}/light/0/energy dla każdej żarówki niezależnie.

Monitorowanie mocy wymaga skonfigurowania modelu urządzenia w aplikacji Shelly lub interfejsie web w Settings > Device Model. Jeśli model nie jest ustawiony, a żarówka jest włączona, ale moc pokazuje zero, szablon wyświetla ostrzeżenie.

Diagnostyka serwisowa (tylko HTTP)

Szablon HTTP udostępnia 10 atrybutów serwisowych do monitorowania urządzenia:

  • Info sieciowe — adres IP, adres MAC, siła sygnału WiFi (dB)
  • Łączność — chmura włączona/połączona, MQTT połączony
  • System — czas urządzenia, dostępna aktualizacja firmware, czas pracy, użycie RAM
Akcje serwisowe (tylko HTTP)

Dwie akcje serwisowe są dostępne w szablonie HTTP:

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

Shelly DUO RGBW obsługuje również efekty świetlne (meteor shower, gradual change, breath, flash, on/off gradual, red/green change), dedykowany biały kanał LED w trybie kolorowym i status połączenia MQTT (LWT). Te funkcje mogą zostać dodane w przyszłej aktualizacji szablonu.

Rozwiązywanie problemów

Żarówka nie odpowiada (HTTP)
  1. Sprawdź, czy żarówka jest podłączona do Wi-Fi i ma prawidłowy adres IP
  2. Spróbuj użyć nazwy hosta mDNS (shellycolorbulb-AABBCCDDEE.local) zamiast adresu IP — IP mógł się zmienić po odnowieniu DHCP
  3. Otwórz http://{device-ip}/shelly w przeglądarce — jeśli odpowiada, urządzenie jest dostępne
  4. Sprawdź, czy TapHome CCU i żarówka są w tej samej sieci / VLAN
Kolory wyświetlają się nieprawidłowo
  1. Sprawdź, czy żarówka jest w prawidłowym trybie — kolory RGB działają tylko w trybie kolorowym, nie w trybie białym
  2. Przy ustawianiu koloru przez TapHome upewnij się, że nasycenie jest większe od zera — nasycenie 0 daje białe światło niezależnie od barwy
  3. Sprawdź, czy gain (jasność w trybie kolorowym) nie jest ustawiony na zero
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ówki MQTT nie odpowiadają
  1. Sprawdź, czy MQTT jest włączone w interfejsie web każdej żarówki (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. shellycolorbulb-B929CC)
  4. Użyj klienta MQTT (np. MQTT Explorer) do subskrypcji shellies/# i sprawdź, czy każda żarówka publikuje wiadomości

Urządzenia Shelly Gen1 obsługują tylko 2 jednoczesne połączenia HTTP. Jeśli TapHome i inny system (np. Home Assistant) odpytują tę samą żarówkę 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 RGBW Module Moduł
Atrybuty serwisowe
IP Address
MAC Address
WIFI signal
Cloud enabled
Cloud connected
MQTT connected
Device time
FW update available
Uptime
RAM
Akcje serwisowe
Enable cloud
Reboot
Zmienne niestandardowe
jsonStatus (string)
debounceTimestamp (numeric)
transitionTime (numeric) = TransitionTime

Shelly DUO RGBW 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");
Shelly DUO RGBW ${deviceType_Light} Światło HSB

Shelly DUO RGBW ${deviceType_Light}

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

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

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

IF mode = "white"
    value := PARSEJSON(jsonStatus, "$.lights[0].brightness", 1);
ELSE
    value := PARSEJSON(jsonStatus, "$.lights[0].gain", 1);
END

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
    VAR mode := PARSEJSON(jsonStatus, "$.lights[0].mode", 1);
    
    IF mode = "white"
        SENDHTTPREQUEST("light/0?turn=on&transition=" + transitionTime + "&brightness=" + ROUND(Hb*100.0));
    ELSE
        SENDHTTPREQUEST("light/0?turn=on&transition=" + transitionTime + "&gain=" + ROUND(Hb*100.0));
    END
ELSE
    SENDHTTPREQUEST("light/0?turn=off&transition=" + transitionTime);
END

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

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

INT r := PARSEJSON(jsonStatus, "$.lights[0].red", 1);
INT g := PARSEJSON(jsonStatus, "$.lights[0].green", 1);
INT b := PARSEJSON(jsonStatus, "$.lights[0].blue", 1);
 
VAR HSVColor := RGBTOHSV(r, g, b);
ROUND(HSVColor.Hue);
Zapis odcienia
IF !ISNAN(Ct)
    RETURN(0);
END

VAR color := HSVTORGB(Hd, Sa, 1);

SENDHTTPREQUEST("light/0?mode=color&transition=" + transitionTime + "&gain=" + ROUND(Hb*100) + "&red=" + color.RED + "&green=" + color.GREEN + "&blue=" + color.BLUE);


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

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

INT r := PARSEJSON(jsonStatus, "$.lights[0].red", 1);
INT g := PARSEJSON(jsonStatus, "$.lights[0].green", 1);
INT b := PARSEJSON(jsonStatus, "$.lights[0].blue", 1);
 
VAR HSVColor := RGBTOHSV(r, g, b);
ROUND(HSVColor.Saturation * 100.0) / 100.0;
Zapis nasycenia
IF !ISNAN(Ct)
    RETURN(0);
END

VAR color := HSVTORGB(Hd, Sa, 1);

SENDHTTPREQUEST("light/0?mode=color&transition=" + transitionTime + "&gain=" + ROUND(Hb*100) + "&red=" + color.RED + "&green=" + color.GREEN + "&blue=" + color.BLUE);


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

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

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

IF ISNULL(value) OR mode != "white"
    RETURN(NaN);
END
 
value
Zapis temperatury barwowej
IF Ct = NaN
    RETURN(0);
END

VAR temp := MIN(Ct, 6500);
temp := MAX(temp, 3000);

SENDHTTPREQUEST("light/0?mode=white&transition=" + transitionTime + "&brightness=" + ROUND(Hb*100) + "&temp=" + temp);

VAR now := NOW();
debounceTimestamp := now.Ticks + transitionTime + 500;
Shelly DUO RGBW Electric meter Licznik energii

Shelly DUO RGBW Electric meter

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 (4)
  • Light Effect — Effect index (0=Off, 1=Meteor Shower, 2=Gradual Change, 3=Breath, 4=Flash, 5=On/Off Gradual, 6=Red/Green Change). Available in both /light/0 and MQTT color/0/set.
  • WiFi Signal Strength — WiFi RSSI in dBm, available in /status response (HTTP only; MQTT template reads it as service attribute already)
  • White Channel — Dedicated white LED channel (0–255) in color mode, separate from CCT. Available in /light/0?white=N.
  • Connection Status (MQTT) — LWT topic — true on connect, false on disconnect. Could detect offline bulbs.

Źródła