TapHome

Shelly DUO

Packet Parser → HTTP
Přidal
Poslední aktualizace: 03. 2026
Shelly DUO

Shelly DUO je Wi-Fi LED žárovka s paticí E27, která podporuje stmívání jasu a nastavitelnou teplotu chromatičnosti bílého světla (CCT) v rozsahu 2700 K (teplá bílá) až 6500 K (denní světlo). TapHome se se žárovkou integruje lokálně přes Wi-Fi pomocí HTTP REST API nebo MQTT. Cloudové připojení není potřeba.

K dispozici jsou dvě TapHome šablony: HTTP šablona pro jednu žárovku a MQTT šablona, která může ovládat až 5 DUO žárovek přes jedno MQTT broker připojení. Obě šablony vystavují stejné typy zařízení na žárovku — světlo s ovládáním jasu a CCT a elektroměr pro měření spotřeby.

Konfigurace

HTTP šablona

HTTP šablona vyžaduje IP adresu žárovky (nebo mDNS hostname ShellyBulbDuo-{MAC}.local). TapHome dotazuje endpoint /status každé 2,5 sekundy a ukládá JSON odpověď do vlastní proměnné jsonStatus. Jednotlivé skripty zařízení parsují uloženou odpověď bez zbytečných HTTP volání.

Šablona přijímá dva importní parametry:

  • IP adresa — lokální IP žárovky (výchozí 192.168.0.1)
  • Čas přechodu — délka světelného přechodu v milisekundách (výchozí 300 ms)
MQTT šablona

MQTT šablona vyžaduje IP brokeru, port a Device ID pro každou žárovku (formát: ShellyBulbDuo-DEVICEID). Device ID najdete ve webovém rozhraní Shelly v části Settings > Device Info, nebo přes GET http://{bulb-ip}/settings v poli mqtt.id.

Šablona podporuje až 5 DUO žárovek přes jeden modul. Každá žárovka se identifikuje vlastní topic proměnnou (bulb1topicbulb5topic). Nepoužité sloty žárovek mohou zůstat na výchozí placeholder hodnotě.

Šablona přijímá tři importní parametry:

  • MQTT Broker IP — adresa brokeru (výchozí 192.168.0.1)
  • MQTT Broker port — port brokeru (výchozí 1883)
  • Čas přechodu — délka světelného přechodu v milisekundách (výchozí 300 ms)

Na zařízeních Shelly Gen1 zapnutí MQTT vypne Shelly Cloud. Obojí nemůže běžet současně.

Funkce zařízení

Ovládání světla

Šablona vystavuje DUO jako zařízení bílého světla se dvěma ovladatelnými parametry:

  • Jas — čtený z lights[0].brightness (0–100, interně konvertovaný na 0,0–1,0) a lights[0].ison; ovládaný přes /light/0?turn=on|off&brightness=N (HTTP) nebo publikováním JSON do topicu light/0/set (MQTT)
  • Teplota chromatičnosti — čtená z lights[0].temp (2700–6500 K); ovládaná přes /light/0?temp=K (HTTP) nebo polem temp v JSON payload (MQTT)

Oba parametry se odesílají společně v jednom příkazu zápisu. Parametr čas přechodu ovládá délku plynulého přechodu pro všechny změny.

Když se světlo vypne (jas nastaven na 0), šablona odešle turn=off (HTTP) nebo publikuje off do topicu light/0/command (MQTT).

Debounce mechanismus

HTTP šablona obsahuje debounce ochranu pro prevenci zastaralých údajů během světelných přechodů. Po každém příkazu zápisu šablona ignoruje čtení /status po dobu trvání přechodu plus 500 ms. Během tohoto období skripty čtení vracejí poslední známé hodnoty místo dotazování zařízení. Tím se zabrání krátkému zobrazení mezistavu v UI, zatímco žárovka přechází.

MQTT šablona debounce nepotřebuje — přijímá aktualizace stavu přímo ze žárovky, když nastanou.

Měření spotřeby

Vestavěný elektroměr čte dvě hodnoty:

  • Okamžitý výkonmeters[0].power ve wattech, konvertovaný na kW (dělený 1000)
  • Celková spotřebameters[0].total ve watt-minutách, konvertovaný na kWh (dělený 60 000)

Elektroměr je pouze pro čtení a aktualizuje se automaticky při každém cyklu dotazování (HTTP) nebo při každé MQTT zprávě.

Pro zapnutí monitorování spotřeby musí být model zařízení nakonfigurován v aplikaci Shelly nebo webovém prohlížeči v části Settings > Device Model. Pokud je žárovka zapnutá, ale výkon ukazuje nulu, šablona zobrazí varování o tomto konfiguračním kroku.

Servisní diagnostika (HTTP šablona)

HTTP šablona vystavuje 10 servisních atributů:

  • Síťové info — IP adresa, MAC adresa (formátovaná s dvojtečkovými oddělovači), síla Wi-Fi signálu (dB)
  • Připojitelnost — cloud povolen/připojen, MQTT připojen
  • Info o zařízení — čas zařízení, doba provozu (formátovaná jako dny/hodiny/minuty), využití RAM
  • Firmware — dostupná aktualizace firmwaru
Servisní akce (HTTP šablona)

K dispozici jsou dvě servisní akce:

  • Povolit cloud — zapne nebo vypne připojení Shelly Cloud
  • Restart — spustí restart zařízení
Další funkce

Shelly DUO také vystavuje světelný časovač (aktivní příznak a zbývající sekundy), automatický časovač vypnutí na světelném endpointu, interní teplotu zařízení, sílu Wi-Fi signálu jako samostatné senzorové zařízení a MQTT online/offline LWT topic pro detekci stavu připojení. Tyto funkce mohou být přidány v budoucí aktualizaci šablony.

Řešení problémů

Žárovka neodpovídá (HTTP)
  1. Ověřte, že DUO je připojena k Wi-Fi a má platnou IP adresu
  2. Zkuste použít mDNS hostname (ShellyBulbDuo-AABBCCDDEE.local) místo IP adresy — IP se mohla změnit po obnovení DHCP
  3. Otevřete http://{bulb-ip}/shelly v prohlížeči — pokud odpovídá JSON obsahující "type":"SHBDUO-1", žárovka je dostupná
  4. Zkontrolujte, že TapHome CCU a DUO jsou ve stejné síti / VLAN
Výkon ukazuje nulu
  1. Potvrďte, že model zařízení je nakonfigurován v aplikaci Shelly (Settings > Device Model)
  2. Zkontrolujte, že žárovka je zapnutá — elektroměr měří pouze když protéká proud
  3. Zavolejte /status manuálně a ověřte, že meters[0].power vrací nenulovou hodnotu
MQTT žárovka neodpovídá
  1. Ověřte, že MQTT je zapnuto ve webovém rozhraní Shelly (Internet & Security > Advanced — MQTT)
  2. Potvrďte, že adresa brokeru a port jsou správné v nastavení zařízení Shelly i modulu TapHome
  3. Zkontrolujte, že vlastní proměnná bulbNtopic se přesně shoduje s Device ID žárovky (např. ShellyBulbDuo-B929CC)
  4. Použijte MQTT klienta (např. MQTT Explorer) pro odběr shellies/# a ověřte, že žárovka publikuje zprávy
Světelné přechody působí trhaně
  1. Zvyšte parametr čas přechodu — výchozích 300 ms může být příliš málo pro velké změny jasu
  2. Pokud používáte HTTP, ujistěte se, že žádný jiný systém nedotazuje žárovku současně — zařízení Gen1 podporují pouze 2 souběžná připojení

Zařízení Shelly Gen1 podporují pouze 2 souběžná HTTP připojení. Pokud TapHome a jiný systém (např. Home Assistant) dotazují stejné zařízení současně, komunikace může být nespolehlivá. Zvažte přechod na MQTT šablonu pro prostředí s více systémy.

Jak nainstalovat v TapHome

Předpoklady

  • Zařízení Shelly nainstalované a zapnuté
  • Lokální Wi-Fi síť (2,4 GHz)
  • TapHome CCU ve stejné síti

Krok 1 — Připojte Shelly k Wi-Fi

Možnost A — Aplikace Shelly (doporučeno):

  1. Stáhněte si aplikaci Shelly (iOS / Android)
  2. Klepněte na +Add Device a postupujte podle průvodce Bluetooth párováním
  3. Po výzvě zadejte své Wi-Fi přihlašovací údaje

Možnost B — AP režim (bez aplikace):

  1. Při prvním zapnutí zařízení vytvoří hotspot: ShellyXXX-AABBCCDDEE
  2. Připojte telefon/PC k tomuto hotspotu
  3. Otevřete http://192.168.33.1Internet & SecurityWi-Fi Mode - Client
  4. Zadejte SSID a heslo → Save

Shelly podporuje pouze 2,4 GHz sítě. 5 GHz sítě se při skenování nezobrazí.

Krok 2 — Zjistěte IP adresu

Po připojení k Wi-Fi zjistěte přiřazenou IP adresu jedním z následujících způsobů:

  • Aplikace Shelly: Detail zařízení → Device info → IP adresa
  • Webové rozhraní Shelly: Připojte se k AP zařízení před nastavením Wi-Fi — IP se zobrazí po uložení
  • DHCP tabulka routeru: Hledejte hostname jako shelly1pm-AABBCCDDEE
  • mDNS: Pingněte shelly<model>-<mac>.local (např. shelly1pm-AABBCCDDEE.local) ze stejné sítě

Přiřaďte zařízení Shelly statickou IP (DHCP rezervaci) ve vašem routeru, aby se adresa nezměnila po restartu routeru.

Krok 3 — Konfigurace v TapHome

  1. V TapHome přidejte nový modul Packet Parser (HTTP)
  2. IP Address: zadejte IP z kroku 2 (např. 192.168.1.50)
  3. Port: 80 (výchozí, není potřeba měnit)
  4. Importujte šablonu — TapHome bude pravidelně číst /status pro zjištění stavu zařízení

HTTP autentifikace je na zařízeních Shelly standardně vypnutá. Pokud jste povolili ochranu přihlášením, TapHome momentálně nepodporuje HTTP Basic Auth — pro integraci s TapHome ponechte autentifikaci vypnutou.

Dostupná zařízení

Shelly DUO Modul
Servisní atributy
IP adresa
MAC adresa
WiFi signál
Cloud povolen
Cloud připojen
MQTT připojen
Čas zařízení
Dostupná aktualizace FW
Doba provozu
RAM
Servisní akce
Povolit cloud
Restart
Vlastní proměnné
transitionTime (numeric) = TransitionTimeLight transition duration in milliseconds (import parameter, default 300 ms)

Shelly DUO Module

Čtení (modul)
VAR now := NOW();

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

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

IF response.IsSuccess
    jsonStatus := response.Content;
ELSE
    jsonStatus := NULL;
END
Servisní atributy
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
Servisní akce
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");
Světlo Bílé světlo

CCT bílé světlo (2700–6500 K) — stmívání jasu a ovládání teploty chromatičnosti

numeric Jednotka: %, K json_path

Světlo

Čtení jasu
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);
Zápis jasu
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;
Čtení barevné teploty
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
Zápis barevné teploty
SENDHTTPREQUEST("light/0?transition=" + transitionTime + "&brightness=" + ROUND(Hb*100) + "&temp=" + Ct);

VAR now := NOW();
debounceTimestamp := now.Ticks + transitionTime + 500;
Elektroměr Elektroměr Pouze ke čtení

Měření spotřeby energie — okamžitý výkon (kW) a celková spotřeba (kWh)

numeric Jednotka: W / kWh json_path

Elektroměr

Čtení celkové spotřeby
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
Čtení odběru
IF LENGTH(jsonStatus) = 0
    RETURN(NaN);
END

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

IF ISNULL(power)
    RETURN(NaN);
END

power / 1000.0
Připojení: Packet Parser → HTTP
Možná vylepšení (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.

Zdroje