Commit Graph
17 Commits
Author SHA1 Message Date
Michael Sauer b482f84131 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.
2026-09-26 18:13:03 +02:00
Michael Sauer 83618b19fd feat: IP-Adresse standardmaessig als Entitaet aktiv
Die IP ist der Wert, den man beim Suchen einer Lampe zuerst braucht - als
abgeschaltete Diagnose-Entitaet war sie genau dann nicht da.
2026-09-22 23:20:14 +02:00
Michael Sauer ac60428fdb feat: sACN-Einstellungen und -Status als Entitaeten
Die Firmware kann seit dieser Woche sACN/E1.31. Einstellen liess sich das nur
per REST - jetzt steht es in Home Assistant: Schalter fuer den Empfang, Zahlen
fuer Universe und Startslot, Auswahlen fuer das Verhalten nach dem Timeout und
die Slotbelegung, dazu zwei Diagnose-Binaersensoren.

Die sACN-Einstellungen liegen hinter system/settings, nicht in device/state -
der Koordinator liest sie deshalb jetzt mit, eine dritte Anfrage je Zyklus. Der
Schreibweg liest die Einstellungen danach frisch zurueck statt den gesetzten
Wert anzunehmen: die Lampe validiert selbst (die Startslot-Grenze haengt an der
Slotbelegung), und eine Entitaet, die das Gewuenschte statt des Gespeicherten
zeigt, luegt in genau dem Moment, in dem es darauf ankommt.

Aeltere Firmware antwortet ohne den sacn-Block. Die Entitaeten entstehen
trotzdem und melden sich als nicht verfuegbar - so werden sie nach einem Update
der Lampe beim naechsten Poll von selbst lebendig, ohne Neuladen.

Die Obergrenze des Startslots kommt aus dem "slots"-Feld der Lampe, nicht aus
einer festen 512: sie haengt an Board UND Slotbelegung, und eine feste Grenze
wuerde Werte anbieten, die die Lampe dann ablehnt.

Der Multicast-Sensor ist ab Werk deaktiviert wie die uebrigen Diagnosewerte. Er
meldet im Normalbetrieb schlicht "beigetreten" - aber eine falsche
Gruppenadresse hat zwei Abende gekostet, und genau dort waere sie aufgefallen.

test_update.py misst seine Zusage jetzt um den Rescan herum statt nach dem
Install: dort pollt der Koordinator ohnehin wieder und liest seitdem auch die
Einstellungen mit.
2026-09-21 23:35:54 +02:00
Michael Sauer 5781e723ab docs: Werksreset beim Token-Schutz nennen 2026-09-16 19:44:36 +02:00
Michael Sauer ad165e18b3 docs: Token-Schutz richtig beschreiben, Verfügbarkeit dokumentieren 2026-09-16 19:37:11 +02:00
Michael Sauer 1026f427ca fix(coordinator): kurze Aussetzer machen die Lampe nicht unbedienbar 2026-09-16 18:38:45 +02:00
Michael Sauer fc29b0befe fix: Katalog-SSID-Cache threadsicher, Sicherheitshinweis zu mDNS/MAC
scan() konnte den SSID-Cache filtern, während contains_ssid() aus einem
anderen Executor-Thread gleichzeitig hineinschrieb ("dictionary changed
size during iteration"). Ein Lock schützt jetzt beide Zugriffe.

README ergänzt: mDNS-Updates auf eine bekannte MAC laufen ungeprüft: Ein
Gerät, das dieselbe MAC ankündigt, übernimmt den Host-Eintrag und könnte
so an Anfragen mit Token gelangen (nur in einem bereits kompromittierten
Netz relevant).
2026-09-16 17:40:21 +02:00
Michael Sauer b8f3c94278 fix(update): Lampe bekommt genau die geprüften Bytes
Die Registry für Einmal-URLs speicherte bisher nur einen Pfad; View und
verify() lasen die Datei getrennt und zu unterschiedlichen Zeitpunkten
erneut ein. Wurde die Datei zwischen Prüfung und Abruf ersetzt (z. B.
gleicher Dateiname in build/ und build-nocreds/), erreichte ein nie
geprüftes Image die Lampe und hebelte damit die WLAN-Sicherung aus.

Jetzt werden die Bytes einmal im Install-Pfad gelesen, Gerätetyp/Version
und WLAN-SSID auf genau diesen Bytes geprüft (FirmwareCatalog.verify_and_read,
firmware.contains_ssid) und exakt diese Bytes in der Registry hinterlegt;
die View serviert nur noch das, was tatsächlich geprüft wurde.

Außerdem: Bewertungen (Katalog-Rescan-Signal) werden nicht mehr angestoßen,
während ein Update läuft - das würde eine gerade flashende Lampe zusätzlich
anfragen und Angebot/Issue unter dem laufenden Update verändern; nach jedem
Update wird stattdessen genau einmal neu bewertet. Kommentar zum Install-Lock
korrigiert (der eigentliche Lücke liegt vor dem Setzen der Flags, nicht in
HAs eigener "bereits läuft"-Prüfung). Testlücke geschlossen: die View liefert
jetzt nachweislich nur die zu ihrem Schlüssel gehörenden Bytes. Timeout in
einem WLAN-Regressionstest verkürzt, damit er bei einem Rückfall nicht
12 Minuten hängt.
2026-09-16 17:40:10 +02:00
Michael Sauer 06dd04e8fe docs: README, Abnahmeprotokoll, Brand-Bilder; Gitea statt GitHub/HACS 2026-09-16 17:13:31 +02:00
Michael Sauer 8ab03012f9 fix(update): kein Downgrade und keine parallelen Installs pro Lampe 2026-09-16 17:07:04 +02:00
Michael Sauer ccc31d3286 feat(update): Firmware-Update aus dem Ordner mit Einmal-URLs und WLAN-Sicherung 2026-09-16 16:45:24 +02:00
Michael Sauer cc318c9d25 feat: Einstellungen, Neustart, Diagnose-Sensoren und Diagnose-Download 2026-09-16 16:08:47 +02:00
Michael Sauer be0a8e21b6 feat(config_flow): Einrichtung per IP und mDNS, Neuanmeldung, Neukonfiguration, Optionen 2026-09-16 15:52:44 +02:00
Michael Sauer 40186d95d1 feat: Coordinator, Geraet und Licht-Entitaet 2026-09-16 15:32:07 +02:00
Michael Sauer 75dc2b7dd6 feat(firmware): Trailer, Versionsordnung, WLAN-Pruefung und Firmware-Katalog 2026-09-16 15:11:28 +02:00
Michael Sauer d3688b5a2e feat(api): HTTP-Client fuer die ninlight-Lampen 2026-09-16 15:01:06 +02:00
Michael Sauer 18583c6593 chore: Projektgeruest, Manifest, Konstanten und CI 2026-09-16 14:50:01 +02:00