From 6c980e87b0b063b708819adb4a7a32f64e428777 Mon Sep 17 00:00:00 2001 From: glenn schrooyen Date: Tue, 25 Aug 2026 10:33:17 +0200 Subject: [PATCH] DEPLOY-01: bump version to 0.3.0, changelog for SAFETY-04 and TEL-01 Fixes the version collision noticed while planning DEPLOY-01: release/1.0 still carried version 0.2.1, identical to what is already running on the live system, so Home Assistant would not have offered the update at all. - config.yaml: version 0.2.1 -> 0.3.0 (minor: TEL-01 adds a feature, SAFETY-04 changes the control law's internals) - CHANGELOG.md: 0.3.0 entry for SAFETY-04 and TEL-01, in the existing voice No code under app/ touched, no option defaults changed. Verified: meter_source: off, integrator_max_w: 0, target_grid_w: -10 all unchanged. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Du77usMj8XNKNFZGmUiWDa --- goodwe_controller/CHANGELOG.md | 36 ++++++++++++++++++++++++++++++++++ goodwe_controller/config.yaml | 2 +- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/goodwe_controller/CHANGELOG.md b/goodwe_controller/CHANGELOG.md index 1b14451..4939667 100644 --- a/goodwe_controller/CHANGELOG.md +++ b/goodwe_controller/CHANGELOG.md @@ -1,5 +1,41 @@ # Changelog +## 0.3.0 + +**SAFETY-04.** The control law's integrator is now an explicit accumulator, +bounded independently of the output clamp instead of inheriting whatever +headroom the clamp happened to leave. It also freezes while the inverter is +not tracking, rather than continuing to wind up against a command nothing is +acting on. `integrator_max_w` (default `0`) governs the bound; `0` means +"follow `max_w`", which is the existing behaviour. + +Behaviour is unchanged at the defaults - a 4,928-case equivalence sweep +against the previous control law confirms it decides identically at +`integrator_max_w: 0`. + +**TEL-01.** P1 meter ingestion, so a Belgian P1's two unsigned registers +(consumption, injection) no longer need a hand-written signed template +sensor: the subtraction moves into the add-on, done once and tested. Two +transports, chosen with the new `meter_source` option: `ha_dsmr` subscribes +to the DSMR integration over the HA WebSocket, `mqtt_p1` reads a topic. +Defaults to `off`, which keeps the existing `meter_entity` path untouched - +nothing changes for an install that does not opt in. + +Enabling it publishes `sensor.p1_sample_age_s`: seconds since the newest +accepted telegram, recomputed against the clock and republished roughly once +a second rather than only when a telegram lands. That is deliberate - Home +Assistant only pushes a state on change, so a meter sitting at a genuinely +constant reading would otherwise look identical to a dead one. Watching the +age instead means a frozen meter shows a climbing age, not a flat line. The +firmware watchdog subscribes to this exact entity id. + +Known limits, both already in DOCS.md: on `mqtt_p1`, a bridge stuck +republishing its last telegram still "arrives", so the age cannot detect +that particular failure - prefer `ha_dsmr` where both are available. And a +dead P1 meter takes 45 s to reach 0 W commanded (30 s for `meter_max_age_s` +to call the reading stale, then 15 s of `stale_input_s` on top), which is +`meter_max_age_s` and `stale_input_s` stacking, not either one alone. + ## 0.2.1 `target_grid_w` (default -10 W): what the meter should rest at. The deadband diff --git a/goodwe_controller/config.yaml b/goodwe_controller/config.yaml index 82c3499..ffd18e6 100644 --- a/goodwe_controller/config.yaml +++ b/goodwe_controller/config.yaml @@ -1,5 +1,5 @@ name: GoodWe RS485 Controller -version: "0.2.1" +version: "0.3.0" slug: goodwe_controller description: >- Drives a GoodWe ES/BP battery inverter over RS485 by emulating its smart