TapHome

Shelly DUO

Packet Parser → HTTP
Eingereicht von
Zuletzt aktualisiert: 03. 2026
Shelly DUO

Die Shelly DUO ist eine WLAN-LED-Birne mit E27-Fassung, die Helligkeitsdimmung und einstellbare weiße Farbtemperatur (CCT) im Bereich von 2700 K (warmweiß) bis 6500 K (Tageslicht) unterstützt. TapHome integriert sich lokal über WLAN mit der Birne per HTTP REST API oder MQTT. Keine Cloud-Verbindung erforderlich.

Zwei TapHome-Vorlagen sind verfügbar: eine HTTP-Vorlage für eine einzelne Birne und eine MQTT-Vorlage, die bis zu 5 DUO-Birnen über eine einzelne MQTT-Broker-Verbindung steuern kann. Beide Vorlagen stellen die gleichen Gerätetypen pro Birne bereit — ein Lichtgerät mit Helligkeits- und CCT-Steuerung und einen Energiezähler für die Leistungsmessung.

Konfiguration

HTTP-Vorlage

Die HTTP-Vorlage benötigt die IP-Adresse der Birne (oder den mDNS-Hostnamen ShellyBulbDuo-{MAC}.local). TapHome fragt den /status-Endpoint alle 2,5 Sekunden ab und speichert die JSON-Antwort in der benutzerdefinierten Variable jsonStatus. Einzelne Geräteskripte parsen die gespeicherte Antwort ohne redundante HTTP-Aufrufe.

Die Vorlage akzeptiert zwei Importparameter:

  • IP-Adresse — die lokale IP der Birne (Standard 192.168.0.1)
  • Übergangszeit — Dauer des Lichtübergangs in Millisekunden (Standard 300 ms)
MQTT-Vorlage

Die MQTT-Vorlage benötigt die Broker-IP, den Port und die Device ID für jede Birne (Format: ShellyBulbDuo-DEVICEID). Die Device ID finden Sie in der Shelly-Weboberfläche unter Settings > Device Info oder über GET http://{bulb-ip}/settings im Feld mqtt.id.

Die Vorlage unterstützt bis zu 5 DUO-Birnen über ein einzelnes Modul. Jede Birne wird durch ihre eigene Topic-Variable identifiziert (bulb1topic bis bulb5topic). Ungenutzte Birnenplätze können auf ihrem Standard-Platzhalterwert belassen werden.

Die Vorlage akzeptiert drei Importparameter:

  • MQTT Broker IP — die Broker-Adresse (Standard 192.168.0.1)
  • MQTT Broker Port — der Broker-Port (Standard 1883)
  • Übergangszeit — Dauer des Lichtübergangs in Millisekunden (Standard 300 ms)

Bei Gen1 Shelly-Geräten deaktiviert das Aktivieren von MQTT die Shelly Cloud. Beides kann nicht gleichzeitig laufen.

Gerätefunktionen

Lichtsteuerung

Die Vorlage stellt die DUO als Weißlichtgerät mit zwei steuerbaren Parametern bereit:

  • Helligkeit — gelesen aus lights[0].brightness (0–100, intern auf 0,0–1,0 konvertiert) und lights[0].ison; gesteuert über /light/0?turn=on|off&brightness=N (HTTP) oder durch Veröffentlichung von JSON zum Topic light/0/set (MQTT)
  • Farbtemperatur — gelesen aus lights[0].temp (2700–6500 K); gesteuert über /light/0?temp=K (HTTP) oder das temp-Feld im JSON-Payload (MQTT)

Beide Parameter werden zusammen in einem einzigen Schreibbefehl gesendet. Der Übergangszeit-Parameter steuert die Überblendungsdauer für alle Änderungen.

Wenn das Licht ausgeschaltet wird (Helligkeit auf 0 gesetzt), sendet die Vorlage turn=off (HTTP) oder veröffentlicht off zum Topic light/0/command (MQTT).

Debounce-Mechanismus

Die HTTP-Vorlage enthält einen Debounce-Schutz zur Vermeidung veralteter Messwerte während Lichtübergängen. Nach jedem Schreibbefehl ignoriert die Vorlage /status-Lesungen für die Dauer der Übergangszeit plus 500 ms. Während dieser Zeit geben die Leseskripte die zuletzt bekannten Werte zurück, anstatt das Gerät abzufragen. Dies verhindert das kurzzeitige Anzeigen von Zwischenzuständen in der Benutzeroberfläche, während die Birne übergeht.

Die MQTT-Vorlage benötigt keinen Debounce — sie empfängt Statusaktualisierungen direkt von der Birne, sobald sie auftreten.

Leistungsmessung

Der eingebaute Energiezähler liest zwei Werte:

  • Aktuelle Leistungmeters[0].power in Watt, auf kW konvertiert (geteilt durch 1000)
  • Gesamtverbrauchmeters[0].total in Wattminuten, auf kWh konvertiert (geteilt durch 60 000)

Der Zähler ist schreibgeschützt und aktualisiert sich automatisch bei jedem Abfragezyklus (HTTP) oder bei jeder MQTT-Nachricht.

Um die Leistungsüberwachung zu aktivieren, muss das Gerätemodell in der Shelly-App oder im Webbrowser unter Settings > Device Model konfiguriert sein. Wenn die Birne eingeschaltet ist, aber die Leistung null anzeigt, zeigt die Vorlage eine Warnung zu diesem Konfigurationsschritt an.

Service-Diagnose (HTTP-Vorlage)

Die HTTP-Vorlage stellt 10 Service-Attribute bereit:

  • Netzwerkinfo — IP-Adresse, MAC-Adresse (mit Doppelpunkttrennern formatiert), WLAN-Signalstärke (dB)
  • Konnektivität — Cloud aktiviert/verbunden, MQTT verbunden
  • Geräteinfo — Gerätezeit, Betriebszeit (als Tage/Stunden/Minuten formatiert), RAM-Auslastung
  • Firmware — Firmware-Update verfügbar
Service-Aktionen (HTTP-Vorlage)

Zwei Service-Aktionen sind verfügbar:

  • Cloud aktivieren — aktiviert oder deaktiviert die Shelly-Cloud-Verbindung
  • Neustart — löst einen Geräteneustart aus
Weitere Funktionen

Die Shelly DUO stellt auch einen Lichttimer (Aktiv-Flag und verbleibende Sekunden), einen Auto-Off-Timer am Lichtendpunkt, interne Gerätetemperatur, WLAN-Signalstärke als eigenständiges Sensorgerät und ein MQTT-Online/Offline-LWT-Topic zur Verbindungsstatuserkennung bereit. Diese Funktionen können in einem zukünftigen Vorlagen-Update hinzugefügt werden.

Fehlerbehebung

Birne antwortet nicht (HTTP)
  1. Überprüfen Sie, ob die DUO mit dem WLAN verbunden ist und eine gültige IP-Adresse hat
  2. Versuchen Sie den mDNS-Hostnamen (ShellyBulbDuo-AABBCCDDEE.local) statt der IP-Adresse — die IP kann sich nach einer DHCP-Erneuerung geändert haben
  3. Öffnen Sie http://{bulb-ip}/shelly im Browser — wenn ein JSON mit "type":"SHBDUO-1" zurückkommt, ist die Birne erreichbar
  4. Prüfen Sie, dass TapHome CCU und DUO im selben Netzwerk / VLAN sind
Leistung zeigt null an
  1. Bestätigen Sie, dass das Gerätemodell in der Shelly-App konfiguriert ist (Settings > Device Model)
  2. Prüfen Sie, ob die Birne eingeschaltet ist — der Zähler misst nur bei Stromfluss
  3. Rufen Sie /status manuell auf und prüfen Sie, ob meters[0].power einen Wert ungleich null zurückgibt
MQTT-Birne antwortet nicht
  1. Überprüfen Sie, ob MQTT in der Shelly-Weboberfläche aktiviert ist (Internet & Security > Advanced — MQTT)
  2. Bestätigen Sie, dass Broker-Adresse und Port sowohl im Shelly-Gerät als auch in den TapHome-Moduleinstellungen korrekt sind
  3. Prüfen Sie, ob die benutzerdefinierte Variable bulbNtopic exakt mit der Device ID der Birne übereinstimmt (z. B. ShellyBulbDuo-B929CC)
  4. Verwenden Sie einen MQTT-Client (z. B. MQTT Explorer), um shellies/# zu abonnieren und zu verifizieren, dass die Birne Nachrichten veröffentlicht
Lichtübergänge wirken ruckelig
  1. Erhöhen Sie den Übergangszeit-Parameter — die standardmäßigen 300 ms können für große Helligkeitsänderungen zu kurz sein
  2. Bei HTTP-Nutzung stellen Sie sicher, dass kein anderes System die Birne gleichzeitig abfragt — Gen1-Geräte unterstützen nur 2 gleichzeitige Verbindungen

Shelly Gen1-Geräte unterstützen nur 2 gleichzeitige HTTP-Verbindungen. Wenn TapHome und ein anderes System (z. B. Home Assistant) dasselbe Gerät gleichzeitig abfragen, kann die Kommunikation unzuverlässig werden. Erwägen Sie den Wechsel zur MQTT-Vorlage für Umgebungen mit mehreren Systemen.

Installation in TapHome

Voraussetzungen

  • Shelly-Gerät installiert und eingeschaltet
  • Lokales Wi-Fi-Netzwerk (2,4 GHz)
  • TapHome CCU im selben Netzwerk

Schritt 1 — Shelly mit Wi-Fi verbinden

Option A — Shelly-App (empfohlen):

  1. Laden Sie die Shelly-App herunter (iOS / Android)
  2. Tippen Sie auf +Add Device und folgen Sie dem Bluetooth-Kopplungsassistenten
  3. Geben Sie Ihre Wi-Fi-Zugangsdaten ein, wenn Sie dazu aufgefordert werden

Option B — AP-Modus (ohne App):

  1. Beim ersten Einschalten erstellt das Gerät einen Hotspot: ShellyXXX-AABBCCDDEE
  2. Verbinden Sie Ihr Telefon/PC mit diesem Hotspot
  3. Öffnen Sie http://192.168.33.1Internet & SecurityWi-Fi Mode - Client
  4. Geben Sie SSID und Passwort ein → Save

Shelly unterstützt nur 2,4 GHz-Netzwerke. 5 GHz-Netzwerke werden beim Scannen nicht angezeigt.

Schritt 2 — IP-Adresse ermitteln

Nach der Verbindung mit Wi-Fi ermitteln Sie die zugewiesene IP-Adresse auf eine der folgenden Arten:

  • Shelly-App: Gerätedetail → Device info → IP-Adresse
  • Shelly-Weboberfläche: Verbinden Sie sich mit dem Geräte-AP vor der Wi-Fi-Einrichtung — die IP wird nach dem Speichern angezeigt
  • Router-DHCP-Tabelle: Suchen Sie nach einem Hostnamen wie shelly1pm-AABBCCDDEE
  • mDNS: Pingen Sie shelly<model>-<mac>.local (z. B. shelly1pm-AABBCCDDEE.local) aus dem selben Netzwerk

Weisen Sie dem Shelly-Gerät eine statische IP (DHCP-Reservierung) in Ihrem Router zu, damit sich die Adresse nach einem Router-Neustart nicht ändert.

Schritt 3 — Konfiguration in TapHome

  1. Fügen Sie in TapHome ein neues Modul Packet Parser (HTTP) hinzu
  2. IP Address: Geben Sie die IP aus Schritt 2 ein (z. B. 192.168.1.50)
  3. Port: 80 (Standard, keine Änderung erforderlich)
  4. Importieren Sie die Vorlage — TapHome fragt regelmäßig /status ab, um den Gerätestatus zu lesen

Die HTTP-Authentifizierung ist auf Shelly-Geräten standardmäßig deaktiviert. Wenn Sie den Anmeldeschutz aktiviert haben, unterstützt TapHome derzeit kein HTTP Basic Auth — lassen Sie die Authentifizierung für die TapHome-Integration deaktiviert.

Verfügbare Geräte

Shelly DUO Modul
Serviceattribute
IP-Adresse
MAC-Adresse
WLAN-Signal
Cloud aktiviert
Cloud verbunden
MQTT verbunden
Gerätezeit
FW-Update verfügbar
Betriebszeit
RAM
Serviceaktionen
Cloud aktivieren
Neustart
Benutzerdefinierte Variablen
transitionTime (numeric) = TransitionTimeLight transition duration in milliseconds (import parameter, default 300 ms)

Shelly DUO Module

Lesen (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
Serviceattribute
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
Serviceaktionen
Enable cloud
Parameter: 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");
Licht Weißlicht

CCT-Weißlicht (2700–6500 K) — Helligkeitsdimmung und Farbtemperatursteuerung

numeric Einheit: %, K json_path

Licht

Helligkeit lesen
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);
Helligkeit schreiben
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;
Farbtemperatur lesen
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
Farbtemperatur schreiben
SENDHTTPREQUEST("light/0?transition=" + transitionTime + "&brightness=" + ROUND(Hb*100) + "&temp=" + Ct);

VAR now := NOW();
debounceTimestamp := now.Ticks + transitionTime + 500;
Stromzähler Stromzähler Nur lesen

Leistungs- und Energiemessung — momentane Leistung (kW) und kumulierter Energieverbrauch (kWh)

numeric Einheit: W / kWh json_path

Stromzähler

Gesamtverbrauch lesen
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
Bedarf lesen
IF LENGTH(jsonStatus) = 0
    RETURN(NaN);
END

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

IF ISNULL(power)
    RETURN(NaN);
END

power / 1000.0
Verbindung: Packet Parser → HTTP
Mögliche Verbesserungen (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.

Quellen