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.
This commit is contained in:
@@ -5,7 +5,10 @@
|
||||
"user": {
|
||||
"title": "ninlight-Lampe einrichten",
|
||||
"description": "Adresse der Lampe eingeben. Das Token ist mit dem öffentlichen Vorgabe-Token vorbelegt – wer es kennt, kann die Lampe in deinem Netz steuern und neu flashen.",
|
||||
"data": { "host": "Host", "token": "Token" },
|
||||
"data": {
|
||||
"host": "Host",
|
||||
"token": "Token"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "IP-Adresse oder ninlight-xxxx.local-Name der Lampe.",
|
||||
"token": "Autorisierungs-Token der Lampe."
|
||||
@@ -14,16 +17,23 @@
|
||||
"zeroconf_confirm": {
|
||||
"title": "{name} einrichten",
|
||||
"description": "ninlight-Lampe {name} unter {host} gefunden. Das Token ist mit dem öffentlichen Vorgabe-Token vorbelegt – wer es kennt, kann die Lampe in deinem Netz steuern und neu flashen.",
|
||||
"data": { "token": "Token" }
|
||||
"data": {
|
||||
"token": "Token"
|
||||
}
|
||||
},
|
||||
"reauth_confirm": {
|
||||
"title": "{name} neu anmelden",
|
||||
"description": "Die Lampe hat das gespeicherte Token abgelehnt. Gib ihr aktuelles Token ein.",
|
||||
"data": { "token": "Token" }
|
||||
"data": {
|
||||
"token": "Token"
|
||||
}
|
||||
},
|
||||
"reconfigure": {
|
||||
"title": "Lampe neu konfigurieren",
|
||||
"data": { "host": "Host", "token": "Token" }
|
||||
"data": {
|
||||
"host": "Host",
|
||||
"token": "Token"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
@@ -60,38 +70,111 @@
|
||||
},
|
||||
"entity": {
|
||||
"number": {
|
||||
"fade_in": { "name": "Einblenden" },
|
||||
"fade_out": { "name": "Ausblenden" },
|
||||
"transition_default": { "name": "Standardübergang" }
|
||||
"fade_in": {
|
||||
"name": "Einblenden"
|
||||
},
|
||||
"fade_out": {
|
||||
"name": "Ausblenden"
|
||||
},
|
||||
"transition_default": {
|
||||
"name": "Standardübergang"
|
||||
},
|
||||
"sacn_universe": {
|
||||
"name": "sACN-Universe"
|
||||
},
|
||||
"sacn_start_slot": {
|
||||
"name": "sACN-Startslot"
|
||||
}
|
||||
},
|
||||
"select": {
|
||||
"power_on_behaviour": {
|
||||
"name": "Einschaltverhalten",
|
||||
"state": { "last": "Letzter Zustand", "on": "Ein", "off": "Aus" }
|
||||
"state": {
|
||||
"last": "Letzter Zustand",
|
||||
"on": "Ein",
|
||||
"off": "Aus"
|
||||
}
|
||||
},
|
||||
"sacn_on_timeout": {
|
||||
"name": "sACN nach Timeout",
|
||||
"state": {
|
||||
"release": "Zurück zu Home Assistant",
|
||||
"hold": "Letzte Werte halten"
|
||||
}
|
||||
},
|
||||
"sacn_layout": {
|
||||
"name": "sACN-Slotbelegung",
|
||||
"state": {
|
||||
"dimmer": "Dimmer voran",
|
||||
"rgb": "Nur RGB"
|
||||
}
|
||||
}
|
||||
},
|
||||
"switch": {
|
||||
"wake_on_change": { "name": "Bei Änderung einschalten" }
|
||||
"wake_on_change": {
|
||||
"name": "Bei Änderung einschalten"
|
||||
},
|
||||
"sacn_enabled": {
|
||||
"name": "sACN-Empfang"
|
||||
}
|
||||
},
|
||||
"sensor": {
|
||||
"ip_address": { "name": "IP-Adresse" },
|
||||
"free_heap": { "name": "Freier Speicher" },
|
||||
"last_ota_error": { "name": "Letzter Update-Fehler" },
|
||||
"boot_time": { "name": "Letzter Start" }
|
||||
"ip_address": {
|
||||
"name": "IP-Adresse"
|
||||
},
|
||||
"free_heap": {
|
||||
"name": "Freier Speicher"
|
||||
},
|
||||
"last_ota_error": {
|
||||
"name": "Letzter Update-Fehler"
|
||||
},
|
||||
"boot_time": {
|
||||
"name": "Letzter Start"
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
"sacn_active": {
|
||||
"name": "Ferngesteuert"
|
||||
},
|
||||
"sacn_multicast": {
|
||||
"name": "Multicast-Gruppe"
|
||||
}
|
||||
}
|
||||
},
|
||||
"exceptions": {
|
||||
"cannot_connect": { "message": "Die Lampe ist nicht erreichbar." },
|
||||
"auth_failed": { "message": "Die Lampe hat das Token abgelehnt." },
|
||||
"request_failed": { "message": "Die Lampe hat die Anfrage abgelehnt: {message}" },
|
||||
"update_busy": { "message": "Auf der Lampe läuft bereits ein Update." },
|
||||
"no_update": { "message": "Kein Firmware-Update verfügbar." },
|
||||
"no_http_url": { "message": "Lampen erreichen Home Assistant nur über reines http. Setze die Adresse in den Optionen der Integration." },
|
||||
"lamp_url_too_long": { "message": "Die Firmware-URL ist länger als die 255 Zeichen, die die Lampe akzeptiert." },
|
||||
"image_invalid": { "message": "Die Firmware-Datei hat sich geändert oder ist nicht mehr gültig." },
|
||||
"wifi_guard": { "message": "Diese Firmware enthält keine WLAN-Zugangsdaten für {ssid}; die Lampe wäre danach nicht mehr im Netz." },
|
||||
"update_failed": { "message": "Das Update ist fehlgeschlagen: {reason}" },
|
||||
"update_timeout": { "message": "Die Lampe hat die neue Firmware nicht innerhalb von 12 Minuten gemeldet." }
|
||||
"cannot_connect": {
|
||||
"message": "Die Lampe ist nicht erreichbar."
|
||||
},
|
||||
"auth_failed": {
|
||||
"message": "Die Lampe hat das Token abgelehnt."
|
||||
},
|
||||
"request_failed": {
|
||||
"message": "Die Lampe hat die Anfrage abgelehnt: {message}"
|
||||
},
|
||||
"update_busy": {
|
||||
"message": "Auf der Lampe läuft bereits ein Update."
|
||||
},
|
||||
"no_update": {
|
||||
"message": "Kein Firmware-Update verfügbar."
|
||||
},
|
||||
"no_http_url": {
|
||||
"message": "Lampen erreichen Home Assistant nur über reines http. Setze die Adresse in den Optionen der Integration."
|
||||
},
|
||||
"lamp_url_too_long": {
|
||||
"message": "Die Firmware-URL ist länger als die 255 Zeichen, die die Lampe akzeptiert."
|
||||
},
|
||||
"image_invalid": {
|
||||
"message": "Die Firmware-Datei hat sich geändert oder ist nicht mehr gültig."
|
||||
},
|
||||
"wifi_guard": {
|
||||
"message": "Diese Firmware enthält keine WLAN-Zugangsdaten für {ssid}; die Lampe wäre danach nicht mehr im Netz."
|
||||
},
|
||||
"update_failed": {
|
||||
"message": "Das Update ist fehlgeschlagen: {reason}"
|
||||
},
|
||||
"update_timeout": {
|
||||
"message": "Die Lampe hat die neue Firmware nicht innerhalb von 12 Minuten gemeldet."
|
||||
}
|
||||
},
|
||||
"issues": {
|
||||
"default_token": {
|
||||
|
||||
@@ -5,7 +5,10 @@
|
||||
"user": {
|
||||
"title": "Set up ninlight lamp",
|
||||
"description": "Enter the address of the lamp. The token is prefilled with the public default token – anyone on your network who knows it can control and reflash the lamp.",
|
||||
"data": { "host": "Host", "token": "Token" },
|
||||
"data": {
|
||||
"host": "Host",
|
||||
"token": "Token"
|
||||
},
|
||||
"data_description": {
|
||||
"host": "IP address or ninlight-xxxx.local name of the lamp.",
|
||||
"token": "Authorization token of the lamp."
|
||||
@@ -14,16 +17,23 @@
|
||||
"zeroconf_confirm": {
|
||||
"title": "Set up {name}",
|
||||
"description": "Found the ninlight lamp {name} at {host}. The token is prefilled with the public default token – anyone on your network who knows it can control and reflash the lamp.",
|
||||
"data": { "token": "Token" }
|
||||
"data": {
|
||||
"token": "Token"
|
||||
}
|
||||
},
|
||||
"reauth_confirm": {
|
||||
"title": "Re-authenticate {name}",
|
||||
"description": "The lamp rejected the stored token. Enter its current token.",
|
||||
"data": { "token": "Token" }
|
||||
"data": {
|
||||
"token": "Token"
|
||||
}
|
||||
},
|
||||
"reconfigure": {
|
||||
"title": "Reconfigure lamp",
|
||||
"data": { "host": "Host", "token": "Token" }
|
||||
"data": {
|
||||
"host": "Host",
|
||||
"token": "Token"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
@@ -60,38 +70,111 @@
|
||||
},
|
||||
"entity": {
|
||||
"number": {
|
||||
"fade_in": { "name": "Fade-in" },
|
||||
"fade_out": { "name": "Fade-out" },
|
||||
"transition_default": { "name": "Default transition" }
|
||||
"fade_in": {
|
||||
"name": "Fade-in"
|
||||
},
|
||||
"fade_out": {
|
||||
"name": "Fade-out"
|
||||
},
|
||||
"transition_default": {
|
||||
"name": "Default transition"
|
||||
},
|
||||
"sacn_universe": {
|
||||
"name": "sACN universe"
|
||||
},
|
||||
"sacn_start_slot": {
|
||||
"name": "sACN start slot"
|
||||
}
|
||||
},
|
||||
"select": {
|
||||
"power_on_behaviour": {
|
||||
"name": "Power-on behaviour",
|
||||
"state": { "last": "Last state", "on": "On", "off": "Off" }
|
||||
"state": {
|
||||
"last": "Last state",
|
||||
"on": "On",
|
||||
"off": "Off"
|
||||
}
|
||||
},
|
||||
"sacn_on_timeout": {
|
||||
"name": "sACN after timeout",
|
||||
"state": {
|
||||
"release": "Back to Home Assistant",
|
||||
"hold": "Hold last values"
|
||||
}
|
||||
},
|
||||
"sacn_layout": {
|
||||
"name": "sACN slot layout",
|
||||
"state": {
|
||||
"dimmer": "Dimmer first",
|
||||
"rgb": "RGB only"
|
||||
}
|
||||
}
|
||||
},
|
||||
"switch": {
|
||||
"wake_on_change": { "name": "Turn on when changed" }
|
||||
"wake_on_change": {
|
||||
"name": "Turn on when changed"
|
||||
},
|
||||
"sacn_enabled": {
|
||||
"name": "sACN reception"
|
||||
}
|
||||
},
|
||||
"sensor": {
|
||||
"ip_address": { "name": "IP address" },
|
||||
"free_heap": { "name": "Free memory" },
|
||||
"last_ota_error": { "name": "Last update error" },
|
||||
"boot_time": { "name": "Last start" }
|
||||
"ip_address": {
|
||||
"name": "IP address"
|
||||
},
|
||||
"free_heap": {
|
||||
"name": "Free memory"
|
||||
},
|
||||
"last_ota_error": {
|
||||
"name": "Last update error"
|
||||
},
|
||||
"boot_time": {
|
||||
"name": "Last start"
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
"sacn_active": {
|
||||
"name": "Remote controlled"
|
||||
},
|
||||
"sacn_multicast": {
|
||||
"name": "Multicast group"
|
||||
}
|
||||
}
|
||||
},
|
||||
"exceptions": {
|
||||
"cannot_connect": { "message": "Cannot reach the lamp." },
|
||||
"auth_failed": { "message": "The lamp rejected the token." },
|
||||
"request_failed": { "message": "The lamp rejected the request: {message}" },
|
||||
"update_busy": { "message": "An update is already running on the lamp." },
|
||||
"no_update": { "message": "No firmware update is available." },
|
||||
"no_http_url": { "message": "Lamps can only reach Home Assistant over plain http. Set the address in the integration options." },
|
||||
"lamp_url_too_long": { "message": "The firmware URL is longer than the 255 characters the lamp accepts." },
|
||||
"image_invalid": { "message": "The firmware file changed or is no longer valid." },
|
||||
"wifi_guard": { "message": "This firmware does not contain the Wi-Fi credentials for {ssid}; the lamp would lose its network connection." },
|
||||
"update_failed": { "message": "The update failed: {reason}" },
|
||||
"update_timeout": { "message": "The lamp did not report the new firmware within 12 minutes." }
|
||||
"cannot_connect": {
|
||||
"message": "Cannot reach the lamp."
|
||||
},
|
||||
"auth_failed": {
|
||||
"message": "The lamp rejected the token."
|
||||
},
|
||||
"request_failed": {
|
||||
"message": "The lamp rejected the request: {message}"
|
||||
},
|
||||
"update_busy": {
|
||||
"message": "An update is already running on the lamp."
|
||||
},
|
||||
"no_update": {
|
||||
"message": "No firmware update is available."
|
||||
},
|
||||
"no_http_url": {
|
||||
"message": "Lamps can only reach Home Assistant over plain http. Set the address in the integration options."
|
||||
},
|
||||
"lamp_url_too_long": {
|
||||
"message": "The firmware URL is longer than the 255 characters the lamp accepts."
|
||||
},
|
||||
"image_invalid": {
|
||||
"message": "The firmware file changed or is no longer valid."
|
||||
},
|
||||
"wifi_guard": {
|
||||
"message": "This firmware does not contain the Wi-Fi credentials for {ssid}; the lamp would lose its network connection."
|
||||
},
|
||||
"update_failed": {
|
||||
"message": "The update failed: {reason}"
|
||||
},
|
||||
"update_timeout": {
|
||||
"message": "The lamp did not report the new firmware within 12 minutes."
|
||||
}
|
||||
},
|
||||
"issues": {
|
||||
"default_token": {
|
||||
|
||||
Reference in New Issue
Block a user