fix(zwave-gateway): zwave-js-ui 11.25.2 (Server-Schema 51), Renovate für edge_*_image #1562

Merged
k.renner merged 1 commits from fix/zwave-js-ui-11.25.2-renovate into main 2026-11-04 20:54:37 +00:00
Member

Was

Z-Wave ist seit dem Flux-Bump auf Home Assistant 2026.11.0 (1643b305, 2026-11-04 17:55Z) aus: der Config Entry zwave_js steht auf setup_retry mit Z-Wave JS Server version (3.10.0) is incompatible ... at least api schema 51.

  • zwave-js-ui 11.21.1 → 11.25.2 (aktuelle Release, 2026-10-26), Tag + Digest (sha256:ac4874a3… = OCI-Index, multi-arch). 11.21.1 hängt an @zwave-js/server ^3.10.0 (Schema 50). Schema 51 kommt mit zwave-js-server 3.11.0 („add endpoint groups to node state (schema 51)“); die erste zwave-js-ui-Release mit ^3.11.0 ist v11.24.2. Release Notes 11.22–11.25: keine Breaking Changes, Node 24 im Image.
  • Alpine-Basis: das neue Image ist Alpine 3.23 (/etc/alpine-release = 3.23.7 aus dem amd64-Base-Layer gelesen; Dockerfile ALPINE_IMAGE=alpine:3.23), das alte war 3.22. Abweichung von der Vorgabe („Variable anpassen“): edge_zwave_alpine_base entfällt. Die Rolle liest die Alpine-Release jetzt aus dem Image selbst und benennt die musl-libeatmydata.so danach (libeatmydata-alpine3.23.so). Grund: Renovate bumpt das Image ab jetzt automatisch; eine handgepflegte Alpine-Variable würde dabei still auseinanderlaufen, und das bisherige creates: libeatmydata.so hätte die 3.22-Lib nie erneuert. Neuer Name ⇒ Extraktion, Container-Recreate, alte .so wird gelöscht. Kein manueller rm mehr.
  • Renovate: renovate.json hat enabledManagers = flux/kubernetes/woodpecker/dockerfile und keine customManagers (auch nicht im Preset konairius/renovate-config, auch nicht in der Git-History). Darum hat nichts ansible/roles/*/defaults/main.yml gelesen. Die Vorgabe „an bestehende customManagers halten“ ging also ins Leere; neu: custom.regex in enabledManagers und ein customManagers-Eintrag für edge_<name>_image: <image>:<tag>[@<digest>] in ansible/roles/*/defaults/main.yml (Datasource/Versioning docker). Dazu eine packageRule: ansible/**-Updates bekommen einen eigenen PR („edge hosts (ansible)“) statt der Wochengruppe, weil Merge und Play-Lauf zusammengehören. Kein Cron, kein Polling – läuft im normalen Renovate-Schedule des Presets.
  • Doku ansible/docs/edge-host.md (Day-2 Image-Bumps, libeatmydata) nachgezogen.

Geprüft

  • renovate-config-validator renovate.json: OK.
  • renovate --platform=local --dry-run=lookup mit dem neuen customManager auf der Defaults-Datei: extrahiert ghcr.io/zwave-js/zwave-js-ui 11.25.2 + Digest; mit dem alten Stand (11.21.1@sha256:1193b9…) schlägt er minor → 11.25.2 / sha256:ac4874a3… vor, also genau diesen Pin.
  • ansible-playbook --syntax-check plays/install-zwave-gateway.yml: OK. Fact-Ableitung und Compose-Template lokal gerendert: 3.23 → ./libeatmydata-alpine3.23.so:/usr/lib/libeatmydata.so:ro.
  • Nicht geprüft: der Play-Lauf gegen edge-1 (von hier kein SSH).

Rollout

.woodpecker/deploy-infrastructure.yml deployt edge-1 nicht: es läuft nur bei opentofu/** und macht nur tofu plan/apply. Die Ansible-Pipelines und der CI-SSH-Key wurden in 0c1fb0a2 (2026-10-27) entfernt; Plays laufen seitdem vom Workstation (bf8e972a, ansible/site.yml). Das ist eine Owner-Entscheidung, darum bleibt ein manueller Schritt nach dem Merge:

cd ansible
ansible-playbook plays/install-zwave-gateway.yml

(auf einer mesh-verbundenen Workstation, Inventory aus ansible.cfg, YubiKey-PIN). Kein --limit nötig: die Gruppe zwave_gateway enthält nur edge-1.iot.renner.uno. Alternativ läuft es mit ansible-playbook site.yml mit.

HA-Impact

  • Merge selbst: keiner (nichts unter kubernetes/, Flux wendet nichts an).
  • Play-Lauf: zwave-js-Container auf edge-1 wird neu erstellt (Sekunden). Z-Wave ist ohnehin schon komplett aus; danach sollte zwave_js von setup_retry auf loaded gehen. Kein HA-Restart, keine verlorene Historie (Entity-IDs unverändert), kein Re-Interview (Store bleibt).
  • Nicht unter kubernetes/apps/home-assistant/ und kein Punkt der README-Liste; als Incident-Fix entscheidet der Owner das Timing. Ich schaue nach dem Lauf auf zwave_js = loaded und die Nodes alive/asleep.

Hermes-Card: t_4d98bd0b (hestia)

## Was Z-Wave ist seit dem Flux-Bump auf Home Assistant 2026.11.0 (`1643b305`, 2026-11-04 17:55Z) aus: der Config Entry `zwave_js` steht auf `setup_retry` mit `Z-Wave JS Server version (3.10.0) is incompatible ... at least api schema 51`. - **zwave-js-ui 11.21.1 → 11.25.2** (aktuelle Release, 2026-10-26), Tag + Digest (`sha256:ac4874a3…` = OCI-Index, multi-arch). 11.21.1 hängt an `@zwave-js/server ^3.10.0` (Schema 50). Schema 51 kommt mit zwave-js-server 3.11.0 („add endpoint groups to node state (schema 51)“); die erste zwave-js-ui-Release mit `^3.11.0` ist **v11.24.2**. Release Notes 11.22–11.25: keine Breaking Changes, Node 24 im Image. - **Alpine-Basis:** das neue Image ist Alpine **3.23** (`/etc/alpine-release` = `3.23.7` aus dem amd64-Base-Layer gelesen; Dockerfile `ALPINE_IMAGE=alpine:3.23`), das alte war 3.22. **Abweichung von der Vorgabe** („Variable anpassen“): `edge_zwave_alpine_base` entfällt. Die Rolle liest die Alpine-Release jetzt aus dem Image selbst und benennt die musl-`libeatmydata.so` danach (`libeatmydata-alpine3.23.so`). Grund: Renovate bumpt das Image ab jetzt automatisch; eine handgepflegte Alpine-Variable würde dabei still auseinanderlaufen, und das bisherige `creates: libeatmydata.so` hätte die 3.22-Lib nie erneuert. Neuer Name ⇒ Extraktion, Container-Recreate, alte `.so` wird gelöscht. Kein manueller `rm` mehr. - **Renovate:** `renovate.json` hat `enabledManagers` = flux/kubernetes/woodpecker/dockerfile und **keine** `customManagers` (auch nicht im Preset `konairius/renovate-config`, auch nicht in der Git-History). Darum hat nichts `ansible/roles/*/defaults/main.yml` gelesen. Die Vorgabe „an bestehende customManagers halten“ ging also ins Leere; neu: `custom.regex` in `enabledManagers` und ein `customManagers`-Eintrag für `edge_<name>_image: <image>:<tag>[@<digest>]` in `ansible/roles/*/defaults/main.yml` (Datasource/Versioning `docker`). Dazu eine packageRule: `ansible/**`-Updates bekommen einen eigenen PR („edge hosts (ansible)“) statt der Wochengruppe, weil Merge und Play-Lauf zusammengehören. Kein Cron, kein Polling – läuft im normalen Renovate-Schedule des Presets. - Doku `ansible/docs/edge-host.md` (Day-2 Image-Bumps, libeatmydata) nachgezogen. ## Geprüft - `renovate-config-validator renovate.json`: OK. - `renovate --platform=local --dry-run=lookup` mit dem neuen customManager auf der Defaults-Datei: extrahiert `ghcr.io/zwave-js/zwave-js-ui` `11.25.2` + Digest; mit dem alten Stand (11.21.1@sha256:1193b9…) schlägt er `minor` → `11.25.2` / `sha256:ac4874a3…` vor, also genau diesen Pin. - `ansible-playbook --syntax-check plays/install-zwave-gateway.yml`: OK. Fact-Ableitung und Compose-Template lokal gerendert: `3.23` → `./libeatmydata-alpine3.23.so:/usr/lib/libeatmydata.so:ro`. - Nicht geprüft: der Play-Lauf gegen edge-1 (von hier kein SSH). ## Rollout `.woodpecker/deploy-infrastructure.yml` deployt edge-1 **nicht**: es läuft nur bei `opentofu/**` und macht nur `tofu plan/apply`. Die Ansible-Pipelines und der CI-SSH-Key wurden in `0c1fb0a2` (2026-10-27) entfernt; Plays laufen seitdem vom Workstation (`bf8e972a`, `ansible/site.yml`). Das ist eine Owner-Entscheidung, darum bleibt **ein manueller Schritt nach dem Merge**: ``` cd ansible ansible-playbook plays/install-zwave-gateway.yml ``` (auf einer mesh-verbundenen Workstation, Inventory aus `ansible.cfg`, YubiKey-PIN). Kein `--limit` nötig: die Gruppe `zwave_gateway` enthält nur `edge-1.iot.renner.uno`. Alternativ läuft es mit `ansible-playbook site.yml` mit. ## HA-Impact - Merge selbst: keiner (nichts unter `kubernetes/`, Flux wendet nichts an). - Play-Lauf: zwave-js-Container auf edge-1 wird neu erstellt (Sekunden). Z-Wave ist ohnehin schon komplett aus; danach sollte `zwave_js` von `setup_retry` auf `loaded` gehen. Kein HA-Restart, keine verlorene Historie (Entity-IDs unverändert), kein Re-Interview (Store bleibt). - Nicht unter `kubernetes/apps/home-assistant/` und kein Punkt der README-Liste; als Incident-Fix entscheidet der Owner das Timing. Ich schaue nach dem Lauf auf `zwave_js` = `loaded` und die Nodes `alive`/`asleep`. Hermes-Card: t_4d98bd0b (hestia)
hermes-bot added 1 commit 2026-11-04 20:46:04 +00:00
fix(zwave-gateway): zwave-js-ui 11.25.2, Renovate for edge images
ci/woodpecker/pr/ci-scripts-test Pipeline was successful
826042f3ea
Home Assistant 2026.11.0 requires Z-Wave JS Server schema 51. zwave-js-ui
11.21.1 ships @zwave-js/server 3.10 (schema 50), so the zwave_js entry is
stuck in setup_retry. 11.24.2 is the first release on @zwave-js/server
^3.11.0 (schema 51); bump to the current 11.25.2, pinned by digest.

11.25.2 is built on Alpine 3.23 (was 3.22). The role now reads the
Alpine release from the image and names the musl libeatmydata.so after
it, instead of a hand-synced edge_zwave_alpine_base: Renovate bumps the
image from now on, and the old `creates:` never refreshed the .so.
Builds for other Alpine releases are removed.

Renovate never read ansible/roles/*/defaults/main.yml: enabledManagers
had no custom.regex and there were no customManagers. Add one for
edge_<name>_image (docker datasource and versioning), and give ansible/**
updates their own PR, since the play runs from a workstation after the
merge (no Ansible pipeline since 0c1fb0a2).
k.renner requested review from review-bot 2026-11-04 20:50:28 +00:00
review-bot approved these changes 2026-11-04 20:54:23 +00:00
review-bot left a comment
Member

🤖 Automated review — model claude-sonnet-5-5, commit 826042f3eac2858406a82f742dd43ef53cef946c.

Automated review by the review-bot: it approves only when it found nothing red or yellow, and a human still merges. Request a review from review-bot again for a fresh one.


Summary

The PR bumps zwave-js-ui to 11.25.2, pinned by digest. The Ansible role now reads the image's Alpine release and names the musl libeatmydata.so after it. Renovate gets a customManagers entry for edge_*_image in the role defaults. I read the diff only and found no defects.

⚪ Unverified

  • I did not check the claim that 11.25.2 uses zwave-js-server schema 51, or the digest. I also could not check the Renovate regex or the play run. I took these from the PR's own dry-run notes.
  • ansible/roles/zwave-gateway/tasks/main.yml (new "Find libeatmydata.so builds…" task): excludes is a pattern match on the file name. That is fine for libeatmydata-alpine3.23.so, since . is literal in the pattern. I did not run it.

🟡 Suggestions

  • ansible/roles/zwave-gateway/tasks/main.yml (the "Read the Alpine release" task): docker run pulls the image on the play run itself. A transient registry failure aborts the play before any change, which is the safe direction. A short retries/until would make the play more robust.
  • renovate.json: the new rule covers patch, minor, digest and pin, so majors fall through to the other rules. That seems intended. Say so in the rule description so it doesn't read as an oversight.

🟢 Nits

  • zwave_alpine_minor is computed in one expression and the same split is repeated for zwave_libeatmydata. The second could reuse the first variable.

Tests

There are no automated tests for the Ansible role in this repo, so none are expected. A manual run against edge-1 is still pending. The PR says so itself, and after the run zwave_js should go to loaded.

Recommendation

Looks reasonable — no blocking issues; comments above are optional.

🤖 **Automated review** — model `claude-sonnet-5-5`, commit `826042f3eac2858406a82f742dd43ef53cef946c`. > Automated review by the `review-bot`: it approves only when it found nothing red or yellow, and a human still merges. Request a review from `review-bot` again for a fresh one. --- ## Summary The PR bumps zwave-js-ui to 11.25.2, pinned by digest. The Ansible role now reads the image's Alpine release and names the musl `libeatmydata.so` after it. Renovate gets a `customManagers` entry for `edge_*_image` in the role defaults. I read the diff only and found no defects. ## ⚪ Unverified - I did not check the claim that 11.25.2 uses zwave-js-server schema 51, or the digest. I also could not check the Renovate regex or the play run. I took these from the PR's own dry-run notes. - `ansible/roles/zwave-gateway/tasks/main.yml` (new "Find libeatmydata.so builds…" task): `excludes` is a pattern match on the file name. That is fine for `libeatmydata-alpine3.23.so`, since `.` is literal in the pattern. I did not run it. ## 🟡 Suggestions - `ansible/roles/zwave-gateway/tasks/main.yml` (the "Read the Alpine release" task): `docker run` pulls the image on the play run itself. A transient registry failure aborts the play before any change, which is the safe direction. A short `retries`/`until` would make the play more robust. - `renovate.json`: the new rule covers patch, minor, digest and pin, so majors fall through to the other rules. That seems intended. Say so in the rule description so it doesn't read as an oversight. ## 🟢 Nits - `zwave_alpine_minor` is computed in one expression and the same split is repeated for `zwave_libeatmydata`. The second could reuse the first variable. ## Tests There are no automated tests for the Ansible role in this repo, so none are expected. A manual run against edge-1 is still pending. The PR says so itself, and after the run `zwave_js` should go to `loaded`. ## Recommendation Looks reasonable — no blocking issues; comments above are optional. <!-- pr-review:sha=826042f3eac2858406a82f742dd43ef53cef946c -->
k.renner merged commit 796d8459b6 into main 2026-11-04 20:54:37 +00:00
Sign in to join this conversation.