diff --git a/CHANGELOG.de.md b/CHANGELOG.de.md index 98f8c3e..16d79d2 100644 --- a/CHANGELOG.de.md +++ b/CHANGELOG.de.md @@ -5,6 +5,60 @@ Alle nennenswerten Änderungen an dieser Integration werden hier dokumentiert. Format lehnt sich an [Keep a Changelog](https://keepachangelog.com/) an. +## [1.20.0] – Steuerungsmodus, LOCAL-Modus und sparsameres Abfragen + +### Inkompatible Änderungen +- **Home Assistant 2026.10.0 oder neuer ist Voraussetzung** (Python 3.14). + Auf älteren Versionen installiert HACS diese Version nicht +- **Der Steuerungsmodus ist jetzt ein Sensor statt einer Auswahl.** Beide + Testlautsprecher lehnen Schreibzugriffe darauf ab: Er folgt dem + CONTROL-Schalter auf der Rückseite (KH 750 DSP: CONTROL MODE), die Auswahl + konnte also nie etwas ändern. Die alte Auswahl-Entität wird aus der + Entitätsregistrierung entfernt; Automationen, Skripte und Dashboards, die + sie nutzen, müssen auf den neuen Sensor umgestellt werden, der + standardmäßig aktiviert ist +- **„Backup wiederherstellen“ schreibt den Steuerungsmodus nicht mehr** + +### Geändert +- Auf `LOCAL` nennt eine abgelehnte Änderung den CONTROL-Schalter als Grund + und sagt, was zu tun ist, statt einer allgemeinen Ablehnung. Eine + Wiederherstellung bricht mit derselben Meldung ab und nennt, wie viele Werte + sie bis dahin geschrieben hatte +- Ein Backup wird abgelehnt, solange der Lautsprecher auf `LOCAL` steht: Er + meldet dann seine lokalen Einstellungen, und ein solches Backup ersetzte das + letzte gute. Ein gespeichertes Backup, das eine frühere Version auf `LOCAL` + angelegt hat, wird nicht zurückgeschrieben +- „Backup wiederherstellen“ schreibt die Stummschaltung vor den Pegeln und + das Aufheben danach. Die Benachrichtigung zählt Werte, die der Lautsprecher + abgelehnt oder nicht bestätigt hat, getrennt, und jeder davon wird + protokolliert (eine Ablehnung mit ihrem Fehlercode). Ein Lauf, in dem der + Lautsprecher keinen Wert bestätigt hat, wird als unbestätigt gemeldet statt + als „nichts geändert“ +- Werte, die nur standardmäßig deaktivierte Entitäten anzeigen (Pegel, + Verzögerung und Stummschaltung der Ausgänge 1 und 2, Ausgangspegel- und + Clip-Anzeige, Standby-Countdown), werden nur abgefragt, solange eine solche + Entität aktiviert ist. Bei einer KH 750 sind das 9 der 21 Werte, die bisher + in jedem Zyklus gelesen wurden +- Wertabfragen tragen eine Transaktions-ID (`osc/xid`); eine verspätete + Antwort auf eine frühere Anfrage kann nicht mehr für die aktuelle gehalten + werden. EQ-Schreibvorgänge mit 20 Bändern und die Schema-Abfrage der + Geräte-Discovery laufen weiter ohne +- Einen Lautsprecher von Hand oder aus der Netzwerksuche hinzuzufügen klappt + auch, während für ihn noch eine Discovery-Karte offen ist; Home Assistant + schließt die Karte, sobald der Eintrag existiert. Bisher brach die + Einrichtung ab +- Auto-Standby-Zeit und Standby-Countdown sind als Dauer gekennzeichnet +- Die EQ-Schalter und der EQ-Reset schreiben so viele Bänder, wie der + Lautsprecher meldet, statt einer festen Zahl je Modell +- Ist ein Lautsprecher an eine neue Adresse gezogen, werden Kandidaten, die + ihre Seriennummer per mDNS ankündigen, nicht mehr nur zum Auslesen der + Seriennummer verbunden + +### Behoben +- Eine Antwortzeile, die der JSON-Parser ablehnt (eine übergroße Zahl, + extreme Verschachtelung), wird übersprungen, statt den Abfragezyklus mit + einer unübersetzten Fehlermeldung scheitern zu lassen + ## [1.19.1] – Die Fehlercodes der Lautsprecher lesen ### Behoben diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bd527c..02aa3da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,52 @@ All notable changes to this integration are documented here. The format is loosely based on [Keep a Changelog](https://keepachangelog.com/). +## [1.20.0] – Control mode, LOCAL mode and leaner polling + +### Breaking changes +- **Home Assistant 2026.10.0 or newer is required** (Python 3.14). HACS + does not install this version on older releases +- **Control mode is now a sensor instead of a select.** Both test speakers + refuse writes to it: it follows the CONTROL switch on the back + (KH 750 DSP: CONTROL MODE), so the select could never change anything. The + old select entity is removed from the entity registry; automations, + scripts and dashboards that use it have to be pointed at the new sensor, + which is enabled by default +- **Restore backup no longer writes the control mode** + +### Changed +- On `LOCAL` a refused change says that the CONTROL switch is the reason and + how to fix it, instead of a generic rejection. A restore stops with the same + message and says how many values it had written +- A backup is refused while the speaker is on `LOCAL`: it then reports its + local settings, and such a backup replaced the last good one. A stored + backup taken on `LOCAL` by an earlier version is not written back +- Restore backup writes mute before the levels and unmute after them. The + notification counts values the speaker refused or did not confirm + separately, and each of them is logged (a refusal with its error code). A + run in which the speaker confirmed no value is reported as unconfirmed + instead of "nothing changed" +- Values that only entities disabled by default show (level, delay and mute + of outputs 1 and 2, output meter and clip, standby countdown) are only + polled while such an entity is enabled. On a KH 750 that is 9 of the 21 + values that were read every cycle +- Value requests carry a transaction id (`osc/xid`), so a late answer to an + earlier request can no longer be taken for the current one. EQ writes of + 20 bands and the schema walk of the device discovery still go without one +- Adding a speaker by hand or from the network scan works while a discovery + card for the same speaker is still open; Home Assistant closes the card + once the entry exists. The setup used to abort +- Auto standby time and standby countdown are marked as durations +- The EQ on/off switches and the EQ reset write as many bands as the speaker + reports, instead of a fixed count per model +- When a speaker has moved to a new address, candidates that announce their + serial number over mDNS are no longer connected to just to read it + +### Fixed +- A reply line the JSON parser refuses (an oversized number, extreme + nesting) is skipped instead of failing the poll cycle with an untranslated + error + ## [1.19.1] – Reading the speakers' error codes ### Fixed diff --git a/README.de.md b/README.de.md index 8cd5586..6d861d5 100644 --- a/README.de.md +++ b/README.de.md @@ -268,7 +268,8 @@ alles geholt: Selten wechselnde Werte (Identität, die meisten Rückseiten-Einstellungen, Gerätename) werden nur in jedem zehnten Zyklus abgefragt, also alle 5 Minuten. Steuerungsmodus und Auto-Standby-Schalter werden in jedem Zyklus gelesen. Werte, die nur standardmäßig deaktivierte Entities -anzeigen (Ausgang 1 und 2, Ausgangspegel- und Clip-Anzeige, Standby-Countdown), +anzeigen (Pegel, Verzögerung und Stummschaltung von Ausgang 1 und 2, +Ausgangspegel- und Clip-Anzeige, Standby-Countdown), werden nur abgefragt, solange eine solche Entity aktiviert ist. Abgefragt wird **jeder Wert einzeln** (ein Blattpfad pro SSC-Nachricht), nicht als Sammelnachricht und nicht als Container-Abfrage: Eine Container-Abfrage wie diff --git a/README.md b/README.md index af3b1b6..4b73a34 100644 --- a/README.md +++ b/README.md @@ -258,8 +258,8 @@ A loudspeaker is polled every 30 seconds. Not everything is fetched on every cycle: rarely changing values (identity, most rear-panel settings, device name) are only queried on every tenth cycle, so every 5 minutes. The control mode and auto standby switches are read on every cycle. Values that only entities -disabled by default show (outputs 1 and 2, output meter and clip, standby -countdown) are only polled while such an entity is enabled. Each value is fetched +disabled by default show (level, delay and mute of outputs 1 and 2, output +meter and clip, standby countdown) are only polled while such an entity is enabled. Each value is fetched **individually** (one leaf path per SSC message), not as a combined message and not as a container query: a container query such as `{"device":null}` is answered with an error, and a combined message only diff --git a/custom_components/neumann_kh/manifest.json b/custom_components/neumann_kh/manifest.json index fc29319..0ff200e 100644 --- a/custom_components/neumann_kh/manifest.json +++ b/custom_components/neumann_kh/manifest.json @@ -9,6 +9,6 @@ "iot_class": "local_polling", "issue_tracker": "https://github.com/Varitras/neumann-connect/issues", "requirements": [], - "version": "1.19.1", + "version": "1.20.0b1", "zeroconf": ["_ssc._tcp.local."] }