fix(light): kein Farbtemperaturmodus ohne echten Bereich

Das Montana-Black-Shield (neues Ziel ledshield_rgb in der Firmware) steuert
analoge RGB-Streifen und hat keinen eigenen Weisskanal. Sein Board meldet
deshalb ct_min == ct_max (nl_board.c: 4000/4000) - die Konvention der Firmware
fuer "weiss entsteht als RGB-Mischung".

supported_color_modes bot COLOR_TEMP bisher IMMER an. Beim Shield bekaeme Home
Assistant damit einen Farbtemperaturregler, dessen Grenzen zusammenfallen.
Jetzt entscheidet der gemeldete Bereich: nur wenn oben > unten, gibt es
COLOR_TEMP. Dieselbe Regel benutzt ninlight_core schon (device_state.dart,
hasColorTemp), dort faellt der Regler beim Shield von selbst weg.

Die Menge darf nie leer werden - HA verlangt mindestens einen Modus -, deshalb
faellt sie im Grenzfall auf BRIGHTNESS zurueck: ein Geraet ohne Farbe und ohne
Bereich kann immer noch dimmen.
This commit is contained in:
Michael Sauer
2026-09-26 18:13:03 +02:00
parent 83618b19fd
commit b482f84131
2 changed files with 57 additions and 4 deletions
+22 -3
View File
@@ -68,11 +68,30 @@ class NinlightLight(NinlightEntity, LightEntity):
def brightness(self) -> int:
return lamp_to_ha_brightness(int(self._state["brightness"]))
def _has_ct_range(self) -> bool:
"""Ob das Geraet einen echten Farbtemperaturbereich hat.
Das Montana-Black-Shield steuert analoge RGB-Streifen ohne eigenen
Weisskanal und meldet deshalb ct_min == ct_max (nl_board.c,
"ledshield_rgb": 4000/4000) - die Konvention der Firmware fuer "weiss
entsteht als RGB-Mischung". Ein Bereich ohne Spielraum ist keiner;
wuerde er hier als COLOR_TEMP durchgehen, bekaeme Home Assistant einen
Regler mit min == max.
"""
unten, oben = self._kelvin_range()
return oben > unten
@property
def supported_color_modes(self) -> set[ColorMode]:
if self._state["capabilities"].get("color"):
return {ColorMode.RGB, ColorMode.COLOR_TEMP}
return {ColorMode.COLOR_TEMP}
farbe = bool(self._state["capabilities"].get("color"))
modi: set[ColorMode] = set()
if farbe:
modi.add(ColorMode.RGB)
if self._has_ct_range():
modi.add(ColorMode.COLOR_TEMP)
# Leer darf die Menge nie sein - HA verlangt mindestens einen Modus.
# Ein Geraet ohne Farbe und ohne Bereich kann immer noch dimmen.
return modi or {ColorMode.BRIGHTNESS}
@property
def color_mode(self) -> ColorMode: