Skip to content

Releases: bausi2k/loxone-hue-bridge

v2.5.0

Choose a tag to compare

@bausi2k bausi2k released this 12 Aug 12:56
8ef9034

Ereignisverarbeitung & Farbtreue – Ausgelöst durch die Auswertung von 5000 Logzeilen aus 18 Stunden Dauerbetrieb. Sie brachte zwei Fehler ans Licht, die im Alltag ständig auftraten: der Watchdog startete die Ereignisverbindung 48-mal ohne Grund neu, und dabei gingen vereinzelt Zustandsmeldungen verloren. Dazu ein sauberes Herunterfahren, korrigierte Farbumrechnung und eine abgesicherte Auslieferung.

🐞 Bugfixes

  • Watchdog startete die Ereignisverbindung ständig ohne Grund neu: Die Schwelle lag bei 60 Sekunden ohne Daten. Ein Mitschnitt am Eventstream zeigt, dass die Bridge nur beim Verbindungsaufbau ein Lebenszeichen sendet und danach ausschließlich echte Ereignisse – in ruhigen Phasen ist Stille also völlig normal. Die Folge waren 48 Neustarts in 18 Stunden, nachts im Takt von 5 Minuten, jeder mit einer vollständigen Neuabfrage aller Geräte. Während des Neuaufbaus war die Bridge jeweils kurz taub. Die Schwelle liegt jetzt bei 5 Minuten.
  • Verlorene Zustandsmeldungen bei großen Ereignissen (Datenverlust): Ereignisse, die größer als ein Netzwerkpaket sind, treffen in mehreren Stücken ein. Sie wurden bisher stückweise ausgewertet – die erste Hälfte scheiterte als ungültiges JSON, die zweite verschwand kommentarlos. Zweimal in 18 Stunden ist damit ein Zustandswechsel nie bei Loxone angekommen. Die Daten werden jetzt über Paketgrenzen hinweg zusammengesetzt.
  • Ein fehlender Endpunkt riss die gesamte Geräteabfrage ab: Beim Start werden sieben Ressourcen parallel geladen. Fehlte eine einzige – ältere Firmware, kein Kontaktsensor – ging der komplette Abgleich verloren und der Statusspeicher blieb bis zum ersten Ereignis leer. Im Dashboard blieb aus demselben Grund die Geräteliste leer. Ausfälle werden jetzt einzeln behandelt und protokolliert.
  • Doppelte Ereignisverbindung nach einem Neustart: Die abgebrochene Verbindung konnte ihrerseits noch einen Neuaufbau anstoßen, während der neue bereits lief – mit doppelten UDP-Paketen an Loxone und doppelten MQTT-Meldungen als Folge. Jede Verbindung kennt jetzt ihre Generation und überholte Verbindungen werden ignoriert.
  • Kein sauberes Herunterfahren: Es gab keine Behandlung von SIGTERM. Jedes docker stop beendete den Prozess mitten im Schreibvorgang und ließ die Logdatenbank in einem Zustand zurück, den SQLite beim nächsten Start erst wiederherstellen musste. Server, Ereignisverbindung, MQTT, UDP und Datenbank werden jetzt in fester Reihenfolge geschlossen.
  • Datenordner hing am Arbeitsverzeichnis: Ein Start aus einem anderen Verzeichnis legte dort einen leeren data/-Ordner an – Bridge-IP, App-Key und sämtliche Zuordnungen wirkten verloren. Der Ordner liegt jetzt fest beim Projekt und lässt sich über DATA_DIR bewusst umlenken.
  • Farbumrechnung war in sich widersprüchlich: Hin- und Rückrichtung nutzten Matrizen aus unterschiedlichen Quellen, die nicht zueinander passten. Schwerer wog, dass neutrales Weiß nicht auf dem Weißpunkt D65 landete – Weiß aus Loxone kam grünstichig an der Lampe an. Beide Matrizen sind jetzt aus den Primärfarben der Hue-Farblampen (Gamut C) neu berechnet und exakt zueinander invers. Die Sättigung bleibt erhalten, der Grünstich verschwindet.

🔧 Auslieferung

  • Die Testsuite läuft jetzt vor jedem Release-Build. Bisher wurde das Image gebaut und als latest veröffentlicht, ohne dass je ein Test gelaufen war.
  • Der Release-Workflow lässt sich von Hand starten. Bei v2.4.3 erzeugte der Tag-Push keinen Lauf, und ohne manuellen Start blieb nur, den Tag zu löschen und neu zu pushen.

🧪 Tests

  • Abdeckung von 60 auf 113 Tests erweitert. Neu abgedeckt: Zusammensetzen der Ereignisdaten über Paketgrenzen, Ausfall einzelner Ressourcen, Generationswechsel der Ereignisverbindung, Herunterfahren samt Reihenfolge und Zeitgrenze, Farbmatrizen mit Weißpunkt- und Rundlaufprüfung sowie die Release-Konfiguration selbst.

v2.4.3

Choose a tag to compare

@bausi2k bausi2k released this 12 Aug 08:31
8ef9034

Dauerbetrieb & Einstellungen – Behebt einen Fehler, der die Bridge bis zum Neustart komplett lahmlegen konnte, dazu drei Stellen, an denen ein einmaliger Fehler zu einem dauerhaften Ausfall führte, und vier Fehler beim Speichern der Einstellungen.

🐞 Bugfixes

  • Queue-Blockade bei hängender Bridge (kritisch): Keiner der Befehls-Requests hatte ein Timeout gesetzt – der Standardwert von axios ist „unbegrenzt". Antwortete die Hue Bridge nicht mehr (Verbindung steht, aber keine Antwort), blieb die Warteschlange dauerhaft stehen und die Bridge nahm zwar weiter Loxone-Befehle an, leitete aber nichts mehr weiter. Nur ein Neustart half. Mit einer Test-Bridge nachgewiesen: nach der Wiederherstellung kamen vorher 0 von 5 Befehlen an, jetzt erholt sich die Verbindung selbstständig. Zusätzlich abgesichert durch eine Zeitgrenze in der Warteschlange, eine Obergrenze für gepufferte Befehle und das Verfallen verwaister Gerätesperren.
  • MQTT-Passwort wurde bei jedem Speichern gelöscht: Da das Passwort aus Sicherheitsgründen nicht an das Dashboard ausgeliefert wird, blieb das Eingabefeld leer und überschrieb beim Speichern den hinterlegten Wert. Jeder Klick auf „Speichern" im System-Tab hat damit die MQTT-Anmeldung zerstört. Ein leeres Feld bedeutet jetzt „unverändert lassen", und das Dashboard zeigt an, ob ein Passwort hinterlegt ist.
  • Drosselung wirkte nach einem Neustart nicht: Der eingestellte Wert wurde nur zur Laufzeit übernommen; nach jedem Neustart galten wieder die Standardwerte. Außerdem sank das Intervall für Gruppenbefehle beim ersten Speichern von 1100 ms auf 100 ms und provozierte genau die Überlastung (HTTP 429), die die Drosselung verhindern soll. Untergrenze für Gruppen ist jetzt 1000 ms.
  • MQTT gab nach einem Anmeldefehler endgültig auf: Ein vorübergehend nicht erreichbarer oder neu startender Broker legte MQTT bis zum Neustart still. Jetzt wird mit wachsendem Abstand erneut versucht (ab 30 s, maximal 15 Minuten).
  • UDP-Verbindung zu Loxone wurde nach einem Fehler nie wiederhergestellt: Schloss das Betriebssystem den Socket, schlugen alle weiteren Statusmeldungen still fehl – Loxone bekam dauerhaft keine Werte mehr, ohne dass es auffiel. Der Socket wird jetzt neu aufgebaut.
  • Falscher Aus-Status an Loxone: Ein Befehl ohne Schaltanteil meldete fälschlich „Licht aus". Bislang latent, wäre mit den geplanten relativen Dimmbefehlen real geworden.
  • Farbton bei gesättigten Farben: Blau wurde als #38b1ff, Magenta als #ff51ff an Loxone und MQTT gemeldet. Ursache war ein Abschneiden statt eines gemeinsamen Herunterskalierens der Farbkanäle.
  • Debug-Modus wirkte erst nach einem Neustart, wenn er über den Einrichtungsassistenten gesetzt wurde.
  • Leere Zahlenfelder in den Einstellungen landeten als null in der Konfiguration und machten UDP-Versand bzw. Drosselung unbrauchbar, ohne dass die Einrichtung als unvollständig galt.
  • Unbekannte API-Pfade lieferten HTTP 200 und tauchten als vermeintlich neuer Loxone-Befehl im Dashboard auf; jetzt HTTP 404.
  • Absturzursachen werden vollständig protokolliert: Unbehandelte Promise-Fehler beendeten den Prozess bisher, ohne den Grund zu hinterlassen – nach dem automatischen Neustart war die Ursache verloren.

🧪 Tests

  • Abdeckung von 34 auf 60 Tests erweitert. Neu abgedeckt: Verhalten der Warteschlange bei hängender Bridge, Selbstheilung von MQTT und UDP, Farbumrechnung gesättigter Farben und das Speichern der Einstellungen. Eine Quelltext-Prüfung verhindert, dass künftig wieder Anfragen ohne Timeout entstehen.

v2.4.2

Choose a tag to compare

@bausi2k bausi2k released this 12 Aug 08:27
8ef9034

Stabilität & Datenhygiene – Behebt vier Fehler, die im laufenden Betrieb auftreten: fehlerhafte Farbwerte Richtung Loxone, ein funktionsloser Löschen-Button, eine unbegrenzt wachsende Logdatenbank und versehentlich versionierte Laufzeitdaten.

🐞 Bugfixes

  • Division durch Null in der Farbumrechnung: xyToHex() teilte durch die Leuchtdichte-Komponente y, ohne den Nenner zu prüfen. Bei y=0 – von der Hue-Bridge bei nicht initialisierten Leuchten gemeldet – entstand #NaNNaNNaN, das per UDP an Loxone und an MQTT ausgeliefert wurde. Zusätzlich fängt componentToHex() nicht-endliche Werte ab. Gültige Farben bleiben unverändert.
  • Löschen-Button und Modal-Checkboxen funktionslos bei Apostroph im Namen: Die Inline-Handler bauten den Loxone-Namen als JavaScript-String-Literal in ein HTML-Attribut. Ein Name wie anna's lampe erzeugte ungültiges JavaScript (SyntaxError: missing ) after argument list). Die Handler werden jetzt programmatisch gebunden, der Name ist nie mehr Teil eines Attributs.
  • HTML-Escaping im gesamten Dashboard: Gerätenamen, Log-Meldungen und erkannte Befehle wurden ungeescaped gerendert. Namen mit spitzen Klammern verloren Teile (Küche & Esszimmer "Decke" <1><1> verschwand), und Fremdinhalt aus eingehenden Requests landete ausführbar im DOM. Betrifft Log-Konsole, Mapping-Liste, Details-Modal, Diagnose-Tab, Einstellungen und Export-Liste.
  • Log-Rotation: logs.db wuchs unbegrenzt – es gab weder ein DELETE noch einen WAL-Checkpoint. Die Datenbank wird jetzt auf 50.000 Einträge begrenzt (Gegenstück zum bestehenden MAX_RAM_LOGS des RAM-Modus), gebündelt alle 1.000 Schreibvorgänge und einmalig beim Start. PRAGMA wal_checkpoint(TRUNCATE) gibt den Speicher tatsächlich frei.
  • XML-Export: Namen werden beim Herunterladen der Loxone-Vorlagen einzeln URL-kodiert, ein & im Namen schnitt die Anfrage vorher ab.

🔄 Verbesserungen

  • Repository-Hygiene: data/logs.db war versioniert und wurde aus dem Tracking genommen; ein wirkungsloses .gitignore-Fragment entfernt.
  • Schlankeres Docker-Image: .dockerignore schließt jetzt data/, lokale Konfigurationsdateien, Doku-Assets und Testdateien aus. Das Image enthält nur noch Anwendungscode und Abhängigkeiten.
  • Längenbegrenzung für erkannte Befehle: Namen aus dem Request-Pfad werden auf 64 Zeichen gekürzt.
  • Datenbank-Index auf die Spalte category, nach der die Logabfrage filtert.

🧪 Tests

  • Abdeckung von 18 auf 34 Tests erweitert: Randwerte der Farbumrechnung, Escaping-Verhalten (geprüft gegen den echten Quelltext), Log-Rotation und die Längenbegrenzung. Ein Regressionstest verhindert, dass künftig wieder Inline-Handler mit interpolierten Werten entstehen.

v2.4.1

Choose a tag to compare

@bausi2k bausi2k released this 23 Jun 11:07
c20335e

🌟 New Features

  • Hue Effekte & Alert: Lampen können jetzt per einfachem Befehl in spezielle Effektmodi versetzt werden – vollständig rückwärtskompatibel zu allen bestehenden Steuerungen.
    • /{name}/alert → Einmaliges Breathe-Blinken (ideal für Alarmierung, Türklingel-Bestätigung, etc.)
    • /{name}/candle → Kerzenflackern 🕯️ (persistent bis zum Stoppen)
    • /{name}/fire → Feuereffekt 🔥 (persistent, nur neuere Lampen)
    • /{name}/prism → Regenbogen-Farbwechsel 🌈 (persistent, nur Farblampen)
    • /{name}/sparkle, /opal, /glisten → weitere atmosphärische Effekte
    • /{name}/noeffect → Aktiven Effekt stoppen
    • /{name}/sunrise/30 → 30-Sekunden Sonnenaufgang-Simulation 🌅 (oder beliebige Dauer in Sekunden)
  • Erweiterter Diagnose-Tab: Der Diagnose-Tab zeigt jetzt drei Abschnitte:
    1. 📋 Geräte & Batterien (bekannt)
    2. 🌐 Bridge & Zigbee Netzwerk – Verbindungsstatus (connected / connectivity_issue) jedes einzelnen Zigbee-Geräts, Bridge-ID und Zeitzone
    3. 🎭 Lampen-Fähigkeiten – Übersichtstabelle zeigt pro Lampe, ob Dimmen ✅, Farbe ✅ und Weißton ✅ unterstützt werden, sowie alle verfügbaren Effekte.
  • Nativer "Alles" Befehl: Der Befehl /all (bzw. /alles) nutzt nun die native bridge_home Ressource der Hue Bridge, um das gesamte Zuhause nahezu verzögerungsfrei zu schalten. Im UI ist die Option „🏠 Alle Lichter (bridge_home)" jetzt im Dropdown wählbar.
  • Batterie-Warnsystem: Geräte mit einem Batteriestand von ≤ 10 % werden im Dashboard optisch hervorgehoben (rotes Badge + Leer-Symbol 🪫).
  • Automatisierte Tests: Einführung einer robusten Test-Infrastruktur basierend auf dem nativen Node.js Test-Runner (node:test) mit 16 Tests und > 85 % Abdeckung der Kernmodule.

🔄 Verbesserungen & Refactoring

  • Backend-Modularisierung: Komplette Neustrukturierung der server.js. Die Logik wurde in saubere Module im Ordner lib/ (logger, config, loxone, mqtt, hue, routes) ausgelagert, was die Wartbarkeit und Stabilität massiv erhöht.
  • Frontend-Cleanup: Trennung von HTML, CSS und JavaScript. Die index.html wurde bereinigt, Styles wanderten in style.css und die Logik in app.js.
  • Smarte Listen: Die Liste der „Neu erkannten Befehle" filtert nun automatisch Duplikate.
  • Robustheit: Zuvor leere catch-Blöcke loggen nun detaillierte Fehlermeldungen.