The WS90 reporting configuration (zigbee2mqtt-ws90-reporting.md) only lived on the device and in database.db. Every interview or device/configure reset it to the converter defaults, and zero frames came back (2026-09-25..29).
New external converter zigbee2mqtt-ws90-converter.js: the built-in WS90 definition plus a configure step that sets the ten documented reporting values. version: ws90-reporting-1 makes Z2M reconfigure the device once after load.
seed-data copies converters from the new ConfigMap zigbee2mqtt-external-converters into /app/data/external_converters on every start. Not mounted, because Z2M writes a temp copy into that directory while loading (dist/extension/externalJS.js).
Reporting doc updated.
Tested in the running pod (no state change) against a mocked device: the definition is picked over the built-in one, and configure ends with the ten documented values (5/3600/…, Shelly clusters with manufacturerCode 5264). Kustomize build + server dry-run: ok.
Merging restarts Z2M (deployment change). After rollout: expect Successfully configured 'Wetterstation' (definition vws90-reporting-1) in the log and min=5 in database.db.
The WS90 reporting configuration (`zigbee2mqtt-ws90-reporting.md`) only lived on the device and in `database.db`. Every interview or `device/configure` reset it to the converter defaults, and zero frames came back (2026-09-25..29).
- New external converter `zigbee2mqtt-ws90-converter.js`: the built-in WS90 definition plus a configure step that sets the ten documented reporting values. `version: ws90-reporting-1` makes Z2M reconfigure the device once after load.
- `seed-data` copies converters from the new ConfigMap `zigbee2mqtt-external-converters` into `/app/data/external_converters` on every start. Not mounted, because Z2M writes a temp copy into that directory while loading (`dist/extension/externalJS.js`).
- Reporting doc updated.
Tested in the running pod (no state change) against a mocked device: the definition is picked over the built-in one, and configure ends with the ten documented values (`5/3600/…`, Shelly clusters with manufacturerCode 5264). Kustomize build + server dry-run: ok.
Merging restarts Z2M (deployment change). After rollout: expect `Successfully configured 'Wetterstation' (definition vws90-reporting-1)` in the log and min=5 in `database.db`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
The WS90 reporting configuration (zigbee2mqtt-ws90-reporting.md) only
lived on the device and in database.db; every interview or
device/configure reset it to the converter defaults (2026-09-24..28,
zero frames recurred).
New external converter extends the built-in WS90 definition with a
configure step that sets the documented values. Its version
(ws90-reporting-1) makes Z2M reconfigure the device once after load.
seed-data copies converters from a ConfigMap into
/app/data/external_converters on every start; not mounted because Z2M
writes a temp copy into that directory while loading.
Tested in the running pod against a mocked device: the definition is
picked over the built-in one, and configure ends with the ten
documented reporting values.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
🤖Automated review — model claude-sonnet-5 (complexity: normal), commit 025423b342680dccedfd2624e56c24523cae96f9.
Advisory review by the review-bot pipeline. It never approves; a human merges. Push new commits to get a fresh review.
Summary
This PR fixes the WS90 weather-station reporting config getting reset on every Z2M configure by shipping a new external converter (zigbee2mqtt-ws90-converter.js) that extends the built-in WS90 definition with the ten documented reporting values, and wires it into the Z2M pod via a new ConfigMap copied into /app/data/external_converters on every pod start. The mechanics (ConfigMap generator, init-container copy-not-mount, volume wiring) are consistent with the rest of the file and the stated rationale (Z2M writes a temp file into that directory while loading a converter, which a read-only mount would reject) is plausible and matches the PR's own testing notes. No blocking issues found; one doc inconsistency is worth fixing before merge.
🟡 Suggestions
kubernetes/apps/home-assistant/zigbee2mqtt-config.yaml:182-187 — this comment block (pre-existing, not touched by the diff) still says the WS90 reporting config "is lost whenever Z2M re-runs configure on the device, and a fresh PVC will not have it" because "Z2M has no settings field for it." That is now false once this PR merges: with the converter loaded, configure re-applies the documented values instead of losing them, and a fresh PVC picks up the converter from the ConfigMap too (the init container copies it unconditionally, unlike the PVC-seeded configuration.yaml/coordinator_backup.json). zigbee2mqtt-ws90-reporting.md was correctly updated to reflect this, but this comment — a second copy of the same claim — was missed and now directly contradicts it. Worth updating so there isn't a third, drifting copy of this fact (the reporting doc already asks you to keep two in sync: the table and REPORTING).
kubernetes/apps/home-assistant/zigbee2mqtt-deployment.yaml:139-141 — cp /external-converters/*.js /app/data/external_converters/ copies forward but never removes stale files. If a converter is ever renamed or deleted from kustomization.yaml's zigbee2mqtt-external-converters generator, the old file left behind on the PVC keeps being picked up by Z2M's directory auto-load on every future start (nothing here or in the ConfigMap removes it). Not a problem today with a single converter file, but it's a latent trap for the next change in this area — consider clearing the destination directory (e.g. rm -f /app/data/external_converters/*.js) before the copy.
Tests
No automated tests exist for this repo's GitOps YAML/JS, consistent with the rest of the codebase. The PR body describes manual verification (pod testing against a mocked device, kustomize build + server dry-run) which is the right level of diligence for this kind of change; the actual device-facing behavior (built-in definition overridden, configure produces the ten documented values) can only be confirmed post-rollout as the PR body itself notes.
Recommendation
Looks reasonable — no blocking issues; comments above are optional (though the stale doc comment is worth fixing before merge to avoid two documents actively disagreeing).
🤖 **Automated review** — model `claude-sonnet-5` (complexity: normal), commit `025423b342680dccedfd2624e56c24523cae96f9`.
> Advisory review by the `review-bot` pipeline. It never approves; a human merges. Push new commits to get a fresh review.
---
## Summary
This PR fixes the WS90 weather-station reporting config getting reset on every Z2M `configure` by shipping a new external converter (`zigbee2mqtt-ws90-converter.js`) that extends the built-in WS90 definition with the ten documented reporting values, and wires it into the Z2M pod via a new ConfigMap copied into `/app/data/external_converters` on every pod start. The mechanics (ConfigMap generator, init-container copy-not-mount, volume wiring) are consistent with the rest of the file and the stated rationale (Z2M writes a temp file into that directory while loading a converter, which a read-only mount would reject) is plausible and matches the PR's own testing notes. No blocking issues found; one doc inconsistency is worth fixing before merge.
## 🟡 Suggestions
- `kubernetes/apps/home-assistant/zigbee2mqtt-config.yaml:182-187` — this comment block (pre-existing, not touched by the diff) still says the WS90 reporting config "is lost whenever Z2M re-runs `configure` on the device, and a fresh PVC will not have it" because "Z2M has no settings field for it." That is now false once this PR merges: with the converter loaded, `configure` re-applies the documented values instead of losing them, and a fresh PVC picks up the converter from the ConfigMap too (the init container copies it unconditionally, unlike the PVC-seeded `configuration.yaml`/`coordinator_backup.json`). `zigbee2mqtt-ws90-reporting.md` was correctly updated to reflect this, but this comment — a second copy of the same claim — was missed and now directly contradicts it. Worth updating so there isn't a third, drifting copy of this fact (the reporting doc already asks you to keep two in sync: the table and `REPORTING`).
- `kubernetes/apps/home-assistant/zigbee2mqtt-deployment.yaml:139-141` — `cp /external-converters/*.js /app/data/external_converters/` copies forward but never removes stale files. If a converter is ever renamed or deleted from `kustomization.yaml`'s `zigbee2mqtt-external-converters` generator, the old file left behind on the PVC keeps being picked up by Z2M's directory auto-load on every future start (nothing here or in the ConfigMap removes it). Not a problem today with a single converter file, but it's a latent trap for the next change in this area — consider clearing the destination directory (e.g. `rm -f /app/data/external_converters/*.js`) before the copy.
## Tests
No automated tests exist for this repo's GitOps YAML/JS, consistent with the rest of the codebase. The PR body describes manual verification (pod testing against a mocked device, `kustomize build` + server dry-run) which is the right level of diligence for this kind of change; the actual device-facing behavior (built-in definition overridden, configure produces the ten documented values) can only be confirmed post-rollout as the PR body itself notes.
## Recommendation
Looks reasonable — no blocking issues; comments above are optional (though the stale doc comment is worth fixing before merge to avoid two documents actively disagreeing).
<!-- pr-review:sha=025423b342680dccedfd2624e56c24523cae96f9 -->
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The WS90 reporting configuration (
zigbee2mqtt-ws90-reporting.md) only lived on the device and indatabase.db. Every interview ordevice/configurereset it to the converter defaults, and zero frames came back (2026-09-25..29).zigbee2mqtt-ws90-converter.js: the built-in WS90 definition plus a configure step that sets the ten documented reporting values.version: ws90-reporting-1makes Z2M reconfigure the device once after load.seed-datacopies converters from the new ConfigMapzigbee2mqtt-external-convertersinto/app/data/external_converterson every start. Not mounted, because Z2M writes a temp copy into that directory while loading (dist/extension/externalJS.js).Tested in the running pod (no state change) against a mocked device: the definition is picked over the built-in one, and configure ends with the ten documented values (
5/3600/…, Shelly clusters with manufacturerCode 5264). Kustomize build + server dry-run: ok.Merging restarts Z2M (deployment change). After rollout: expect
Successfully configured 'Wetterstation' (definition vws90-reporting-1)in the log and min=5 indatabase.db.🤖 Generated with Claude Code
Requested by the owner (2026-10-01) in a direct session; the owner merges this directly.
🤖 Automated review — model
claude-sonnet-5(complexity: normal), commit025423b342680dccedfd2624e56c24523cae96f9.Summary
This PR fixes the WS90 weather-station reporting config getting reset on every Z2M
configureby shipping a new external converter (zigbee2mqtt-ws90-converter.js) that extends the built-in WS90 definition with the ten documented reporting values, and wires it into the Z2M pod via a new ConfigMap copied into/app/data/external_converterson every pod start. The mechanics (ConfigMap generator, init-container copy-not-mount, volume wiring) are consistent with the rest of the file and the stated rationale (Z2M writes a temp file into that directory while loading a converter, which a read-only mount would reject) is plausible and matches the PR's own testing notes. No blocking issues found; one doc inconsistency is worth fixing before merge.🟡 Suggestions
kubernetes/apps/home-assistant/zigbee2mqtt-config.yaml:182-187— this comment block (pre-existing, not touched by the diff) still says the WS90 reporting config "is lost whenever Z2M re-runsconfigureon the device, and a fresh PVC will not have it" because "Z2M has no settings field for it." That is now false once this PR merges: with the converter loaded,configurere-applies the documented values instead of losing them, and a fresh PVC picks up the converter from the ConfigMap too (the init container copies it unconditionally, unlike the PVC-seededconfiguration.yaml/coordinator_backup.json).zigbee2mqtt-ws90-reporting.mdwas correctly updated to reflect this, but this comment — a second copy of the same claim — was missed and now directly contradicts it. Worth updating so there isn't a third, drifting copy of this fact (the reporting doc already asks you to keep two in sync: the table andREPORTING).kubernetes/apps/home-assistant/zigbee2mqtt-deployment.yaml:139-141—cp /external-converters/*.js /app/data/external_converters/copies forward but never removes stale files. If a converter is ever renamed or deleted fromkustomization.yaml'szigbee2mqtt-external-convertersgenerator, the old file left behind on the PVC keeps being picked up by Z2M's directory auto-load on every future start (nothing here or in the ConfigMap removes it). Not a problem today with a single converter file, but it's a latent trap for the next change in this area — consider clearing the destination directory (e.g.rm -f /app/data/external_converters/*.js) before the copy.Tests
No automated tests exist for this repo's GitOps YAML/JS, consistent with the rest of the codebase. The PR body describes manual verification (pod testing against a mocked device,
kustomize build+ server dry-run) which is the right level of diligence for this kind of change; the actual device-facing behavior (built-in definition overridden, configure produces the ten documented values) can only be confirmed post-rollout as the PR body itself notes.Recommendation
Looks reasonable — no blocking issues; comments above are optional (though the stale doc comment is worth fixing before merge to avoid two documents actively disagreeing).