TapHome

Yeelight Color

Packet Parser → TCP
Eingereicht von
Zuletzt aktualisiert: 06. 2026
Yeelight Color

Die Yeelight-Color-Vorlage erweitert die reine Dimmer-Vorlage Yeelight um volle HSB-Farbsteuerung und einstellbares Weiß (Farbtemperatur). Sie richtet sich an dieselbe Familie von Wi-Fi-Smart-LEDs — Farblampen, Streifen und Deckenleuchten — und nutzt das identische Yeelight Inter-Operation Protocol auf TCP-Port 55443. Der Hauptunterschied ist das Gerätemodell: Statt eines einfachen Dimmers stellt die Vorlage einen PacketParserHSBLight bereit, der TapHome native Eigenschaften für Farbton, Sättigung, Helligkeit und Farbtemperatur in einem Gerät gibt.

TapHome kommuniziert mit der Lampe direkt im lokalen Netzwerk über JSON-RPC — nach Aktivierung von LAN Control auf der Lampe ist keine Cloud-Verbindung erforderlich. Die Vorlage pollt alle sechs Farbeigenschaften gleichzeitig und reagiert auf props-Benachrichtigungen der Lampe, sodass Änderungen aus der Yeelight-App oder einem anderen Controller nahezu sofort in TapHome erscheinen.

Hardwareanschluss

Yeelight-Lampen werden aus dem Standardnetz gespeist (typisch E27, E14, GU10 oder 24-V-Netzteil für LED-Streifen je nach Produkt). Zwischen TapHome und der Lampe ist keine Verkabelung nötig — die gesamte Kommunikation läuft über Wi-Fi. Die Lampe muss sich im gleichen LAN / VLAN wie die TapHome CCU befinden, da das JSON-RPC-Protokoll keine Authentifizierung und keine Verschlüsselung hat und der Datenverkehr nie über die Yeelight-Cloud geleitet wird.

Das Yeelight-LAN-Protokoll ist unverschlüsselt. Setzen Sie den TCP-Port 55443 nicht dem öffentlichen Internet aus und platzieren Sie die Lampen in einem vertrauenswürdigen Netzwerksegment — jeder mit Zugang zum LAN kann Befehle an die Lampe senden.

Konfiguration

LAN Control aktivieren

LAN Control (in manchen Regionen als Developer Mode bezeichnet) ist auf der Lampe standardmäßig deaktiviert. Ohne ihn werden TCP-Verbindungen auf Port 55443 abgelehnt.

  1. Öffnen Sie die mobile Yeelight-App und koppeln Sie die Lampe mit dem lokalen Wi-Fi-Netzwerk über die SmartConfig-/QuickConnect-Prozedur, falls noch nicht geschehen.
  2. Wählen Sie die Ziel-Lampe in der App aus.
  3. Tippen Sie auf das Einstellungssymbol (oben rechts) und öffnen Sie LAN Control (in manchen Firmware-Versionen als Developer Mode bezeichnet).
  4. Schalten Sie LAN Control auf ON.
  5. Notieren Sie die IP-Adresse der Lampe — sie wird in den Geräteinformationen der Yeelight-App angezeigt oder kann aus der DHCP-Lease-Tabelle des Routers abgelesen werden.

Nach Aktivierung von LAN Control lauscht die Lampe auf TCP-Port 55443 und kündigt sich regelmäßig über UDP-Multicast 239.255.255.250:1982 an.

Netzwerkkonfiguration
  • IP-Adresse — die TapHome-Vorlage erkennt Lampen nicht automatisch. Weisen Sie eine statische IP oder eine DHCP-Reservierung im Router zu, damit sich die Adresse der Lampe nach einer Lease-Erneuerung nicht ändert.
  • Gleiches LAN-Segment — die TapHome CCU und die Lampe müssen sich in derselben Broadcast-Domäne befinden. Wenn Wi-Fi- und kabelgebundene Clients in getrennten VLANs sind, fügen Sie eine Firewall-Regel hinzu, die TCP 55443 zwischen ihnen erlaubt.
Importparameter

Beim Template-Import in TapHome gibt der Benutzer drei Werte ein:

ParameterBeschreibungStandard
ipAddressIP-Adresse der Yeelight-Lampe im LAN192.168.0.1 (Platzhalter — durch echte IP ersetzen)
PortTCP-Steuerungsport auf der Lampe55443
Internal poll intervalWie oft die Vorlage get_prop sendet (in Millisekunden)10000 (10 s)

Der Standard-Port 55443 ist der Standard-Yeelight-LAN-Control-Port und sollte nicht geändert werden, es sei denn, die Lampe ist auf einen nicht-standardmäßigen Port konfiguriert.

Zwischen den Polls reagiert die Vorlage auch auf props-Benachrichtigungen, die die Lampe bei Statusänderungen sendet. In der Praxis bedeutet dies, dass Farb-, Helligkeits- und Ein/Aus-Änderungen aus der Yeelight-App, einem Wandschalteradapter oder einem anderen Controller nahezu sofort in TapHome erscheinen, ohne auf den nächsten Poll zu warten.

Gerätefunktionen

HSB-Farblicht (Farbton, Sättigung, Helligkeit und Ein/Aus)

Die Vorlage stellt ein einzelnes HSB-Lichtgerät bereit. In jedem Poll-Zyklus sendet sie eine get_prop-Anfrage für alle sechs Eigenschaften gleichzeitig:

1
{"id":951,"method":"get_prop","params":["hue","sat","bright","power","ct","color_mode"]}

Das Listener-Skript parst die Antwort und bildet sie auf native TapHome-Eigenschaften ab:

  • Hue (Hd) — result[0], Ganzzahl 0–359 Grad
  • Saturation (Sa) — result[1], Prozent 0–100, geteilt durch 100 auf den TapHome-Bereich 0,0–1,0
  • Brightness (Hb) — result[2], Prozent 1–100, geteilt durch 100 auf den TapHome-Bereich 0,0–1,0
  • Power (St) — result[3], "on" wird auf 1 abgebildet, "off" auf 0 (Helligkeit wird ebenfalls auf 0 gesetzt, wenn ausgeschaltet)
  • Color temperature (Ct) — result[4], Kelvin-Wert, nur gesetzt wenn color_mode = 2 (Weiß-Modus); sonst auf NaN gesetzt
  • Color moderesult[5], bestimmt, ob Ct geschrieben wird (1 = RGB, 2 = Temperature, 3 = HSV)
Farbmodus-Umschaltung

Die Vorlage verwendet die Ct-Eigenschaft zur Bestimmung des aktiven Farbmodus:

  • Ct = NaN — die Lampe ist im HSV-Farbmodus. Schreibvorgänge verwenden set_hsv für Farbton und Sättigung.
  • Ct = Zahl — die Lampe ist im Weiß-Modus (Farbtemperatur). Schreibvorgänge verwenden set_ct_abx.

TapHome sendet keinen expliziten Modusumschaltbefehl. Stattdessen setzt der Benutzer die Farbtemperatur auf einen numerischen Wert, um in den Weiß-Modus zu wechseln, oder auf NaN (durch Auswahl einer Farbe im HSB-Picker), um in den HSV-Modus zu wechseln. Die Schreibskripte prüfen Ct vor dem Senden und überspringen den irrelevanten Befehl — writesaturation kehrt sofort zurück wenn Ct nicht NaN ist, und writecct kehrt sofort zurück wenn Ct NaN ist.

Schreibbefehle

Drei Schreibskripte steuern verschiedene Aspekte des Lichts:

  • Helligkeit / Strom (writebrightness) — bei Helligkeit > 0 sendet es set_power ["on","smooth",300] gefolgt von set_bright [Level,"smooth",300]. Bei Helligkeit = 0 sendet es set_power ["off","smooth",300].
  • Farbton und Sättigung (writesaturation) — sendet set_power ["on","smooth",300] gefolgt von set_hsv [Farbton, Sättigung,"smooth",300]. Läuft nur wenn Ct = NaN (HSV-Modus).
  • Farbtemperatur (writecct) — sendet set_power ["on","smooth",300] gefolgt von set_ct_abx [ct,"smooth",300]. Läuft nur wenn Ct eine Zahl ist (Weiß-Modus). Gültiger Bereich: 1700–6500 K (genaue Grenzen hängen vom Lampenmodell ab).

Alle Schreibvorgänge verwenden einen 300-ms-Smooth-Übergang für ein sanftes Dimmen statt eines harten Sprungs. Nach jedem Schreibvorgang wird die Debounce-Variable auf 1 gesetzt, wodurch der nächste Poll-Zyklus übersprungen wird — dies verhindert das Lesen veralteter Zustände während des Übergangs der Lampe.

Service-Diagnose

Zwei Service-Attribute auf Modulebene werden über eine separate get_prop-Anfrage (id=981) gelesen:

  • FarbmodusRGB, Temperature oder HSV, dekodiert aus der numerischen color_mode-Eigenschaft (1 / 2 / 3) mittels eines SWITCH-Ausdrucks im Modul-Listener-Skript.
  • Farbtemperatur — Kelvin-Wert, gemeldet als "{ct}K" (z. B. "4000K"). Nur aussagekräftig, wenn die Lampe im Temperature-Modus ist.

Diese Attribute sind reine Lese-Diagnose — die eigentliche Farbtemperatursteuerung erfolgt über die Ct-Eigenschaft auf Geräteebene und das oben beschriebene writecct-Skript.

Fehlerbehebung

Lampe reagiert nicht auf Befehle
  1. Überprüfen Sie, dass LAN Control auf der Lampe aktiviert ist (Yeelight-App → Lampeneinstellungen → LAN Control). Ohne ihn lehnt die Lampe alle TCP-Verbindungen auf Port 55443 ab.

  2. Bestätigen Sie die Lampen-IP in der Yeelight-App oder in der DHCP-Lease-Tabelle des Routers und stellen Sie sicher, dass sie mit dem Importparameter ipAddress übereinstimmt. Yeelight-Lampen behalten standardmäßig keine feste IP — der Lease kann abgelaufen und die IP geändert worden sein.

  3. Weisen Sie der Lampe eine statische IP oder DHCP-Reservierung zu, um Adressänderungen zu verhindern.

  4. Prüfen Sie, dass TapHome CCU und Lampe im gleichen LAN / VLAN sind und TCP 55443 nicht von einer Firewall zwischen ihnen blockiert wird.

  5. Testen Sie die Konnektivität manuell: telnet {bulb-ip} 55443 und senden Sie eine rohe Anfrage gefolgt von \r\n:

    1
    
    {"id":1,"method":"get_prop","params":["hue","sat","bright","power","ct","color_mode"]}
    

    Eine funktionierende Lampe antwortet mit {"id":1,"result":["<hue>","<sat>","<bright>","<power>","<ct>","<color_mode>"]}.

Farbbefehle werden ignoriert (Farbton/Sättigung ändert sich nicht)

Das writesaturation-Skript prüft Ct vor dem Senden von set_hsv. Wenn Ct auf einen numerischen Wert gesetzt ist (Weiß-Modus), kehrt das Skript zurück ohne einen Befehl zu senden. Um HSV-Farbe zu steuern, setzen Sie die Farbtemperatur zuerst auf NaN, indem Sie eine Farbe im TapHome-HSB-Picker auswählen.

Ebenso kehrt writecct ohne Senden zurück wenn Ct = NaN (HSV-Modus). Um eine Farbtemperatur zu schreiben, muss die Lampe bereits im Weiß-Modus sein.

Lesefehler: client quota exceeded

Jede TCP-Verbindung zu einer Yeelight-Lampe ist auf 60 Befehle pro Minute begrenzt, und die Lampe akzeptiert maximal 4 gleichzeitige Verbindungen insgesamt. Wenn ein anderes System die Lampe gleichzeitig pollt — Home Assistant, eine Yeelight-Cloud-Sitzung, ein benutzerdefiniertes Skript — kann der kombinierte Datenverkehr Rate-Limit-Fehler auslösen.

  1. Deaktivieren oder verlangsamen Sie andere Integrationen, die die Lampe teilen.
  2. Belassen Sie das TapHome-Poll-Intervall bei den Standard-10000 ms oder höher. Die Farbvorlage sendet ein get_prop pro Poll plus bis zu drei set_*-Schreibvorgänge pro Änderung, was deutlich unter der 60-cmd/min-Quote liegt.
  3. Schließen Sie ungenutzte telnet-Debug-Sitzungen — sie zählen zum 4-Verbindungslimit.
HueSat- oder Farbtemperatur-Schreibfehler

Das Listener-Skript verfolgt Schreibfehler separat für jeden Befehlstyp — writeErrorBrightness für Strom-/Helligkeitsschreibvorgänge, writeErrorHueSat für set_hsv-Schreibvorgänge und writeErrorCt für set_ct_abx-Schreibvorgänge. Wenn ein Fehler auftritt:

  1. Bestätigen Sie, dass die Lampe eingeschaltet ist — alle set_*-Befehle außer set_power werden nur akzeptiert, wenn die Lampe im on-Zustand ist.
  2. Überprüfen Sie, dass der Farbtemperaturwert im modellspezifischen Bereich liegt (typisch 1700–6500 K für Farblampen, 2700–6500 K für Deckenleuchten, 2700–6000 K für ceiling3).
  3. Prüfen Sie die rohe Fehlermeldung in der TapHome-Service-Diagnose für den spezifischen Fehlercode der Lampe.
Änderungen aus der Yeelight-App werden nicht übernommen

Die Vorlage reagiert auf props-Benachrichtigungen der Lampe, sodass externe Änderungen normalerweise innerhalb einer Sekunde erscheinen. Falls nicht:

  1. Die Benachrichtigung kann eingetroffen sein, während der TCP-Socket wiederhergestellt wurde — der nächste Poll (Standard 10 s) synchronisiert den Zustand.
  2. Einige ältere Firmware-Versionen senden Benachrichtigungen nur, wenn aktiv ein Befehl gesendet wird. Aktualisieren Sie die Lampen-Firmware über die Yeelight-App.
  3. Die Lampe hat möglicherweise das 4-Verbindungslimit erreicht — reduzieren Sie die Anzahl gleichzeitiger Clients im LAN.

Yeelight-Geräte unterstützen nur 4 gleichzeitige TCP-Verbindungen und 60 Befehle pro Minute pro Verbindung. Wenn TapHome und ein anderes System (z. B. Home Assistant) dieselbe Lampe gleichzeitig pollen, kann die Kommunikation unzuverlässig werden. Verwenden Sie ein Poll-Intervall von 10 Sekunden oder höher.

Verfügbare Geräte

Yeelight-Color-Modul Modul
Serviceattribute
FarbmodusAktueller Farbmodus der Lampe — RGB, Temperature oder HSV — aus der color_mode-Eigenschaft dekodiert
FarbtemperaturFarbtemperatur in Kelvin, nur gemeldet wenn die Lampe im Temperature-Modus ist (color_mode=2)

Yeelight color module

Listener
VAR jsonResponse := TOSTRING(RECEIVEDBYTES);
VAR id := PARSEJSON(jsonResponse, "id", 1);

IF(id = 981)
   VAR error := PARSEJSON(jsonResponse, "error.message", 1);
   
   IF(!ISNULL(error))
      COMPLETESERVICEATTRIBUTE("Color mode", "", "error");
      COMPLETESERVICEATTRIBUTE("Color temperature", "", "error");
   ELSE
      VAR colorMode := PARSEJSON(jsonResponse, "result[0]", 1);
      VAR colorTemp := PARSEJSON(jsonResponse, "result[1]", 1);
      
      IF(!ISNULL(colorMode))
         VAR colorModeValue := SWITCH(TODOUBLE(colorMode), 1, "RGB", 2, "Temperature", 3, "HSV", "Unknown");
         COMPLETESERVICEATTRIBUTE("Color mode", colorModeValue, "");
      ELSE
         COMPLETESERVICEATTRIBUTE("Color mode", "", "error");
      END
      
      IF(!ISNULL(colorTemp))
         COMPLETESERVICEATTRIBUTE("Color temperature", colorTemp + "K", "");
      ELSE
         COMPLETESERVICEATTRIBUTE("Color temperature", "", "error");
      END
   END
END
Serviceattribute
Color mode
VAR json := "{\"id\":981, \"method\":\"get_prop\", \"params\":[\"color_mode\", \"ct\"]}";
SENDDATA(json);

RETURN(NULL);
Color temperature
HSB-Leuchte HSB-Licht

HSB-Vollfarbsteuerung mit Farbtemperatur — steuert Farbton, Sättigung, Helligkeit und Ein/Aus über set_hsv, set_ct_abx und set_bright mit weichen Übergängen

numeric Einheit: hue 0-359, sat/bright 0-100 %, CCT 2700-6500 K

HSB-Leuchte

Lesen (Modul)
IF(debounce > 0)
    debounce := 0;
ELSE
    VAR json := "{\"id\":951, \"method\":\"get_prop\", \"params\":[\"hue\", \"sat\", \"bright\", \"power\", \"ct\", \"color_mode\"]}";
    SENDDATA(json);
END
Listener
VAR jsonResponse := TOSTRING(RECEIVEDBYTES);
VAR method := PARSEJSON(jsonResponse, "method", 1);
VAR id := PARSEJSON(jsonResponse, "id", 1);
VAR error := PARSEJSON(jsonResponse, "error.message", 1);

#response to ReadScript
IF(id = 951)
   receiveError1 := error;
   
   IF(LENGTH(receiveError1) = 0)
      VAR hueStr := PARSEJSON(jsonResponse, "result[0]", 1);
      VAR satStr := PARSEJSON(jsonResponse, "result[1]", 1);
      VAR brightnessStr := PARSEJSON(jsonResponse, "result[2]", 1);
      VAR onOffStr := PARSEJSON(jsonResponse, "result[3]", 1);
      VAR ctStr := PARSEJSON(jsonResponse, "result[4]", 1);
      VAR colorModeStr := PARSEJSON(jsonResponse, "result[5]", 1);
      
      IF(!ISNULL(hueStr))
         Hd := TODOUBLE(hueStr);
      END

      IF(!ISNULL(satStr))
        Sa := TODOUBLE(satStr) / 100.0;
      END
      
      IF(!ISNULL(brightnessStr))
        Hb := TODOUBLE(brightnessStr) / 100.0;
      END
   
      VAR cm := TODOUBLE(colorModeStr);
      IF(!ISNULL(ctStr) AND cm = 2)
        Ct := TODOUBLE(ctStr);
      ELSE
        Ct := NaN;
      END
      
      IF(onOffStr = "on")
         St := 1;
      ELSEIF(onOffStr = "off")
         Hb := 0;
         St := 0;
      END
   END
ELSEIF(id = 952)
   receiveError2 := error;
   
   IF(LENGTH(receiveError2) = 0)
      brightnessStr := PARSEJSON(jsonResponse, "result[0]", 1);
      
      IF(!ISNULL(brightnessStr))
        Hb := TODOUBLE(brightnessStr) / 100.0;
      END
   END
END

IF(id >= 941 AND id <= 942)
   writeErrorBrightness := error;
ELSEIF(id = 943)
   writeErrorHueSat := error;
ELSEIF(id = 944)
   writeErrorCt := error;
END

#general notification
IF(method = "props")
   notificationError := error;
   
   IF(LENGTH(notificationError) = 0)
      VAR brightJson := PARSEJSON(jsonResponse, "params.bright", 1);
      VAR onOffJson := PARSEJSON(jsonResponse, "params.power", 1);
      VAR hue := PARSEJSON(jsonResponse, "params.hue", 1);
      VAR sat := PARSEJSON(jsonResponse, "params.sat", 1);
      VAR colorMode := PARSEJSON(jsonResponse, "params.color_mode", 1);
      VAR ctJson := PARSEJSON(jsonResponse, "params.ct", 1);
      
      IF(!ISNULL(brightJson))
         Hb := brightJson / 100.0;
      END
      
      IF(!ISNULL(hue))
         Hd := hue;
         Ct := NaN;
      END      

      IF(!ISNULL(sat))
        Sa := sat / 100;
        Ct := NaN;
      END 
      
      IF(!ISNULL(ctJson))
        Ct := ctJson;
      END 
      
      IF(onOffJson = "on")
         St := 1;
         IF(ISNULL(brightJson))
            SENDDATA("{\"id\":952, \"method\":\"get_prop\", \"params\":[\"bright\"]}");
         END
      ELSEIF(onOffJson = "off")
         Hb := 0;
         St := 0;
      END
   END
END

IF(LENGTH(receiveError1) > 0)
   ADDERROR(951, "Read error: " + receiveError1);
END

IF(LENGTH(receiveError2) > 0)
   ADDERROR(952, "Read error: " + receiveError2);
END

IF(LENGTH(writeErrorBrightness) > 0)
   ADDERROR(941, "Brightness write error: " + writeErrorBrightness);
END

IF(LENGTH(writeErrorHueSat) > 0)
   ADDERROR(943, "HueSat write error: " + writeErrorHueSat);
END

IF(LENGTH(writeErrorCt) > 0)
   ADDERROR(944, "Color temperature write error: " + writeErrorCt);
END

IF(LENGTH(notificationError) > 0)
   ADDERROR(1, notificationError);
END
Helligkeit schreiben
IF(Hb > 0)
    VAR jsonBrightness := "{\"id\":941,\"method\":\"set_power\",\"params\":[\"on\", \"smooth\", 300]}\r\n{\"id\":942,\"method\":\"set_bright\",\"params\":[" + ROUND(Hb*100) + ",\"smooth\", 300]}";
    SENDDATA(jsonBrightness);
ELSE
    VAR jsonPowerOff := "{\"id\":942,\"method\":\"set_power\",\"params\":[\"off\", \"smooth\", 300]}";
    SENDDATA(jsonPowerOff);
END

debounce := 1;
Sättigung schreiben
#do not send HUESAT when COLOR mode is active
IF !ISNAN(Ct)
    RETURN(0);
END

VAR hueSatJson := "{\"id\":941,\"method\":\"set_power\",\"params\":[\"on\", \"smooth\", 300]}\r\n{\"id\":943,\"method\":\"set_hsv\",\"params\":[" + ROUND(MOD(Hd, 360)) + ", " + ROUND(Sa*100) + ", \"smooth\", 300]}";

SENDDATA(hueSatJson);
debounce := 1;
Farbtemperatur schreiben
#do not set CT in COLOR mode
IF ISNAN(Ct)
    RETURN(0);
END

VAR ctJson := "{\"id\":941,\"method\":\"set_power\",\"params\":[\"on\", \"smooth\", 300]}\r\n{\"id\":944,\"method\":\"set_ct_abx\",\"params\":[" + Ct + ", \"smooth\", 300]}";
SENDDATA(ctJson);

debounce := 1;
Verbindung: Packet Parser → TCP
Mögliche Verbesserungen (12)
  • Set RGB color — Write full RGB color (0-16777215). Template uses set_hsv instead, which maps naturally to the HSBLight device model.
  • Color flow — Scripted sequences of brightness / color / CT changes (sunrise effect, strobe, ambient cycles). Not exposed by this template.
  • Set scene — Jump directly to a predefined state (color, hsv, ct, cf, auto_delay_off). Not exposed by this template.
  • Toggle power — Single-parameter power toggle. Not exposed — TapHome writes explicit on/off via set_power instead.
  • Sleep timer (cron) — On-device auto-off timer in minutes. Not exposed — TapHome uses its own Smart Rules for scheduling instead.
  • Music mode — Reverse-TCP channel bypassing the 60 cmd/min rate limit. Not used by TapHome.
  • Relative adjustments — Relative +/- changes without knowing the current value. Not exposed — TapHome always writes absolute values.
  • Save current state as power-on default — Persist current brightness/color to flash so it survives a hard power cut. Not exposed by this template.
  • Set device name — Set device name (max 64 bytes). Not exposed by this template.
  • Background light control — Secondary light channel on dual-light fixtures (e.g., some ceiling lights). Not exposed by this template.
  • Extended notification properties — Additional properties pushed via props notifications. Template consumes hue, sat, bright, power, color_mode and ct — remaining properties (rgb, flowing, delayoff, music_on, name) are ignored.
  • LAN auto-discovery — User must enter the bulb IP manually during import — template does not perform SSDP discovery. A static DHCP lease is strongly recommended.

Quellen

Haben Sie ein Problem mit dieser Gerätevorlage gefunden?

Sagen Sie uns, was nicht funktioniert, was fehlt oder wie sich die Vorlage verhalten sollte. Ihr Feedback hilft uns, den Katalog genau zu halten.

Von TapHome verifiziert

Möchtest du das in deinem TapHome Core verwenden?

Öffne diese Vorlage im Kundenportal, um sie auf eine deiner Wohnungen anzuwenden, oder entwirf eine Anpassung und reiche sie an den Katalog ein.

Im Portal öffnen