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