Release 0.14.0 #169

Merged
admin merged 2 commits from release-0.14.0 into release/1.0 2026-10-03 11:29:13 +02:00
Owner

Cuts 0.14.0: config.yaml version 0.13.0 -> 0.14.0 and a closed ## 0.14.0 CHANGELOG section. No code change.

This is the release that hands inverter B to the add-on. The section says two inverters are now supported for the monthly maintenance (drain, charge, hold) and the peak guard, and points to Stage 5 of docs/commissioning-b.md in admin/goodwe.

Version: 0.14.0 (minor). New behaviour (SAFETY-91, SAFETY-93, both N>=2 only).

Option diff vs 0.13.0 (8c438ab): none. config.yaml options and schema are identical apart from version (83 options, 83 schema keys). No option added, removed or renamed, no default changed. app/validate.py and translations/ are unchanged, so there are no new start-up refusals.

Checks run locally (offline, in goodwe-addon-checks:1, nothing live touched):

  • test_version_gate.py (part 11 included), test_docs.py, test_defaults_pin.py, test_validate.py, test_tool_inputs.py: all pass.
  • tools/predeploy_check.py --deployed-version 0.13.0 --options <REL-0.13.0 deploy snapshot, bare options>: REFUSED (no-op) before the bump (4 runtime commits behind an unchanged version), CLEARED after it. The snapshot was exported on 2026-10-02 from the live 0.12.0. It is still valid for 0.13.0's options because 0.13.0 only added options with defaults. The deploy step re-exports fresh options and runs the check again.

Deviations from docs/RELEASE.md (same as the 0.13.0 cut, #164)

  1. Step 1 says "bump version: on release/1.0". release/1.0 is protected, so the bump goes through this PR (branch release-0.14.0).
  2. RELEASE.md says nothing about the CHANGELOG. The section is written to the CI gate (test_version_gate.py part 11): the heading equals config.yaml's version, there is exactly one "in merge order since" table, and the three withdrawn price_provider ids are named.
  3. RELEASE.md says nothing about tags. No tag made here; tagging v0.14.0 (v0.13.0 sits on master) is left to the manager.
  4. RELEASE.md does not ask for predeploy_check.py at cut time. It was run anyway, offline only.

What the deploy needs (separate owner go)

Same pinned-branch flow as 0.13.0, after this PR is merged into release/1.0:

  1. Create a deploy-0.14.0 branch at the release merge commit and open a PR deploy-0.14.0 -> master. No push to master.
  2. Wait for checks / unit (pull_request) to be green (a skipped is not green).
  3. Merge it, pinning head_commit_id, only after the owner's go. A merge to master is a deployment.
  4. Before the update, export fresh live data.options and run predeploy_check.py with the deployed version read from the box.
  5. ha store reload && ha addons update 68285ac7_goodwe_controller on the live HA. This needs the owner's go, which lifts the standing "no ha addons update" rule.
  6. Watchdog stays on (SAFETY-61 / DOC-5).
  7. Inverter B: Stage 5 of admin/goodwe docs/commissioning-b.md, only after 0.14.0 is live.
  8. Rollback: revert on release/1.0, bump again, take the same path (RELEASE.md §3).

CHANGELOG section

0.14.0

A minor bump: new behaviour with two inverters, and no option changes.
No option was added, removed or renamed, and no default changed (83
options). Options that start 0.13.0 also start 0.14.0. With one inverter,
control is the same as in 0.13.0.

⭐ Two inverters are now supported for the monthly maintenance (drain,
charge, hold) and the peak guard. To add the second inverter, follow Stage 5
of docs/commissioning-b.md in the admin/goodwe repo. Read the known
issues below first: four of them are about two inverters.

Contents of this release, in merge order since 0.13.0 (8c438ab):

f3e409c Two batteries: one at or under its peak reserve gives last, after the others give their full power. It is freed again above reserve + 1 point (e.g. at 22 % for a 20 % reserve). At a quarter's edge the peak guard no longer drops out for a second (SAFETY-91)
858f77c Two batteries: when a maintenance charge ends, for any reason, the other battery no longer starts charging from the grid; control hands over in 400 W steps (SAFETY-93)
e51e3e0 CI tests against a newer admin/goodwe (CI only) (CI-13)

Known issues

  • A false "Battery is not keeping up" can still show when the peak guard pauses a maintenance charge (SAFETY-92).
  • A healthy battery that turns from charging to giving can be held at 0 W for up to 15 min (SAFETY-94).
  • After a gap in the P1 meter, the peak guard is blind for the rest of that quarter hour (SAFETY-90).
  • Two inverters: if one battery's drain stops early (e.g. switched Off), the other can briefly export up to about 1.6 kW (SAFETY-95).
  • Two inverters: after one battery's link drops, control can stall until a safety stop (SAFETY-96).
  • Two inverters: the maintenance charge can switch on and off while the house is above the peak aim (SAFETY-88).

If you are crossing from a version older than 0.10.0

## 0.10.0 below can refuse an old config: slew_w above its limit, and the
withdrawn price_provider ids engie_dynamic, totalenergies_dynamic and
eneco_eddy. Read it before you update. Run tools/predeploy_check.py with the
bare options (jq '.data.options') first.

🤖 Generated with Claude Code

https://claude.ai/code/session_019DBUfvndgHwaV339Fvd2gr

Cuts **0.14.0**: `config.yaml` `version` 0.13.0 -> 0.14.0 and a closed `## 0.14.0` CHANGELOG section. No code change. **This is the release that hands inverter B to the add-on.** The section says two inverters are now supported for the monthly maintenance (drain, charge, hold) and the peak guard, and points to Stage 5 of `docs/commissioning-b.md` in `admin/goodwe`. **Version: 0.14.0 (minor).** New behaviour (SAFETY-91, SAFETY-93, both N>=2 only). **Option diff vs 0.13.0 (`8c438ab`): none.** `config.yaml` `options` and `schema` are identical apart from `version` (83 options, 83 schema keys). No option added, removed or renamed, no default changed. `app/validate.py` and `translations/` are unchanged, so there are no new start-up refusals. **Checks run locally (offline, in `goodwe-addon-checks:1`, nothing live touched):** - `test_version_gate.py` (part 11 included), `test_docs.py`, `test_defaults_pin.py`, `test_validate.py`, `test_tool_inputs.py`: all pass. - `tools/predeploy_check.py --deployed-version 0.13.0 --options <REL-0.13.0 deploy snapshot, bare options>`: **REFUSED** (no-op) before the bump (4 runtime commits behind an unchanged version), **CLEARED** after it. The snapshot was exported on 2026-10-02 from the live 0.12.0. It is still valid for 0.13.0's options because 0.13.0 only added options with defaults. The deploy step re-exports fresh options and runs the check again. ## Deviations from docs/RELEASE.md (same as the 0.13.0 cut, #164) 1. Step 1 says "bump `version:` on `release/1.0`". `release/1.0` is protected, so the bump goes through this PR (branch `release-0.14.0`). 2. RELEASE.md says nothing about the CHANGELOG. The section is written to the CI gate (`test_version_gate.py` part 11): the heading equals config.yaml's version, there is exactly one "in merge order since" table, and the three withdrawn `price_provider` ids are named. 3. RELEASE.md says nothing about tags. No tag made here; tagging `v0.14.0` (v0.13.0 sits on master) is left to the manager. 4. RELEASE.md does not ask for `predeploy_check.py` at cut time. It was run anyway, offline only. ## What the deploy needs (separate owner go) Same pinned-branch flow as 0.13.0, after this PR is merged into `release/1.0`: 1. Create a `deploy-0.14.0` branch at the release merge commit and open a PR `deploy-0.14.0` -> `master`. No push to `master`. 2. Wait for `checks / unit (pull_request)` to be **green** (a `skipped` is not green). 3. Merge it, pinning `head_commit_id`, only after the owner's go. A merge to `master` is a deployment. 4. Before the update, export fresh live `data.options` and run `predeploy_check.py` with the deployed version read from the box. 5. `ha store reload && ha addons update 68285ac7_goodwe_controller` on the live HA. This needs the owner's go, which lifts the standing "no `ha addons update`" rule. 6. Watchdog stays on (SAFETY-61 / DOC-5). 7. Inverter B: Stage 5 of `admin/goodwe` `docs/commissioning-b.md`, only after 0.14.0 is live. 8. Rollback: revert on `release/1.0`, bump again, take the same path (RELEASE.md §3). ## CHANGELOG section ## 0.14.0 **A minor bump: new behaviour with two inverters, and no option changes.** No option was added, removed or renamed, and no default changed (83 options). Options that start 0.13.0 also start 0.14.0. With one inverter, control is the same as in 0.13.0. ⭐ **Two inverters are now supported** for the monthly maintenance (drain, charge, hold) and the peak guard. To add the second inverter, follow Stage 5 of `docs/commissioning-b.md` in the `admin/goodwe` repo. Read the known issues below first: four of them are about two inverters. Contents of this release, in merge order since 0.13.0 (`8c438ab`): | | | |---|---| | `f3e409c` | Two batteries: one at or under its peak reserve gives last, after the others give their full power. It is freed again above reserve + 1 point (e.g. at 22 % for a 20 % reserve). At a quarter's edge the peak guard no longer drops out for a second ([[SAFETY-91]]) | | `858f77c` | Two batteries: when a maintenance charge ends, for any reason, the other battery no longer starts charging from the grid; control hands over in 400 W steps ([[SAFETY-93]]) | | `e51e3e0` | CI tests against a newer `admin/goodwe` (CI only) ([[CI-13]]) | ### Known issues - A false "Battery is not keeping up" can still show when the peak guard pauses a maintenance charge ([[SAFETY-92]]). - A healthy battery that turns from charging to giving can be held at 0 W for up to 15 min ([[SAFETY-94]]). - After a gap in the P1 meter, the peak guard is blind for the rest of that quarter hour ([[SAFETY-90]]). - Two inverters: if one battery's drain stops early (e.g. switched Off), the other can briefly export up to about 1.6 kW ([[SAFETY-95]]). - Two inverters: after one battery's link drops, control can stall until a safety stop ([[SAFETY-96]]). - Two inverters: the maintenance charge can switch on and off while the house is above the peak aim ([[SAFETY-88]]). ### If you are crossing from a version older than 0.10.0 `## 0.10.0` below can refuse an old config: `slew_w` above its limit, and the withdrawn `price_provider` ids `engie_dynamic`, `totalenergies_dynamic` and `eneco_eddy`. Read it before you update. Run `tools/predeploy_check.py` with the bare options (`jq '.data.options'`) first. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_019DBUfvndgHwaV339Fvd2gr
admin added 1 commit 2026-10-03 10:30:46 +02:00
Release 0.14.0: version bump and changelog
checks / unit (pull_request) Successful in 27m2s
infra-pin / fresh (pull_request) Successful in 2s
b307db1049
Two inverters are now supported for maintenance and the peak guard
(SAFETY-91, SAFETY-93). No option changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Owner

Review round 1 (REL-0.14.0)

Checked and OK:

  • Version: minor is right. config.yaml vs 0.13.0 (8c438ab) differs only in version; validate.py and translations/ are untouched. No option added, removed, renamed or re-defaulted.
  • Contents: exactly the three first-parent merges since 8c438ab (f3e409c #165, 858f77c #167, e51e3e0 #168), in order, one line each.
  • One inverter: no change. _held_back(), _drain_rise(), _charge_track(), _reseed_charge_end() and the next_quarter() call all return early at N<2. At N=1 _peak_on_able() never sets held, so the old _peak_reserve() was already empty there; swapping it for _held_back() changes nothing. DOCS.md changes are text only.
  • Hysteresis: a battery is held while its SoC is at or under reserve + 1 point (main.py _held_back), so "freed above reserve + 1" is right.
  • docs/commissioning-b.md exists on admin/goodwe release/1.0 @ 0c04488, with "Stage 5 — raise the ceiling, deliberately".

Findings:

  1. "control hands over in 400 W steps" is one house's setting. 400 W is the live slew_w. The default is slew_w: 0, where the step comes from the power range instead. Suggest: "control hands over in small steps".
  2. "four of them are about two inverters": the list has three "Two inverters:" items (SAFETY-95, -96, -88). Suggest "three of them".
  3. "To add the second inverter, follow Stage 5" only fits this house, where Stages 0-4 are already done. A new install needs the whole document. Suggest: "To add a second inverter, follow docs/commissioning-b.md in the admin/goodwe repo. Its Stage 5, where the add-on takes control of it, needs 0.14.0."
  4. "(e.g. at 22 % for a 20 % reserve)" assumes the SoC sensor reports whole percent. The code tests soc > reserve + 1, so a sensor with decimals frees it at 21.1 %. Suggest "(e.g. above 21 % for a 20 % reserve)".
  5. SAFETY-95: "the other can briefly export up to about 1.6 kW" mixes up the battery's jump with the export. In the SAFETY-93 review (O1), B goes 0 -> +1600 W in one cycle at a 1200 W house, so the export is that minus the house. Suggest: "the other battery can jump to about 1.6 kW at once, and the surplus goes to the grid".
  6. Nit: the contents rows say "Two batteries:" and the known issues say "Two inverters:". Use "Two inverters:" in both, to match the headline.

I'll push these to the branch myself.

**Review round 1 (REL-0.14.0)** Checked and OK: - Version: minor is right. `config.yaml` vs 0.13.0 (`8c438ab`) differs only in `version`; `validate.py` and `translations/` are untouched. No option added, removed, renamed or re-defaulted. - Contents: exactly the three first-parent merges since `8c438ab` (f3e409c #165, 858f77c #167, e51e3e0 #168), in order, one line each. - One inverter: no change. `_held_back()`, `_drain_rise()`, `_charge_track()`, `_reseed_charge_end()` and the `next_quarter()` call all return early at N<2. At N=1 `_peak_on_able()` never sets `held`, so the old `_peak_reserve()` was already empty there; swapping it for `_held_back()` changes nothing. DOCS.md changes are text only. - Hysteresis: a battery is held while its SoC is at or under reserve + 1 point (`main.py` `_held_back`), so "freed above reserve + 1" is right. - `docs/commissioning-b.md` exists on `admin/goodwe` `release/1.0` @ 0c04488, with "Stage 5 — raise the ceiling, deliberately". Findings: 1. **"control hands over in 400 W steps" is one house's setting.** 400 W is the live `slew_w`. The default is `slew_w: 0`, where the step comes from the power range instead. Suggest: "control hands over in small steps". 2. **"four of them are about two inverters"**: the list has three "Two inverters:" items (SAFETY-95, -96, -88). Suggest "three of them". 3. **"To add the second inverter, follow Stage 5"** only fits this house, where Stages 0-4 are already done. A new install needs the whole document. Suggest: "To add a second inverter, follow `docs/commissioning-b.md` in the `admin/goodwe` repo. Its Stage 5, where the add-on takes control of it, needs 0.14.0." 4. **"(e.g. at 22 % for a 20 % reserve)"** assumes the SoC sensor reports whole percent. The code tests `soc > reserve + 1`, so a sensor with decimals frees it at 21.1 %. Suggest "(e.g. above 21 % for a 20 % reserve)". 5. **SAFETY-95: "the other can briefly export up to about 1.6 kW"** mixes up the battery's jump with the export. In the SAFETY-93 review (O1), B goes 0 -> +1600 W in one cycle at a 1200 W house, so the export is that minus the house. Suggest: "the other battery can jump to about 1.6 kW at once, and the surplus goes to the grid". 6. Nit: the contents rows say "Two batteries:" and the known issues say "Two inverters:". Use "Two inverters:" in both, to match the headline. I'll push these to the branch myself.
admin added 1 commit 2026-10-03 11:01:46 +02:00
Release 0.14.0: changelog review fixes
checks / unit (pull_request) Successful in 26m57s
infra-pin / fresh (pull_request) Successful in 1s
f13dab1407
Slew step not one house's 400 W; three two-inverter known issues, not
four; commissioning reference covers a new install; SoC example holds
for decimal sensors; SAFETY-95 states the jump, not the export.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Owner

Round 1 fixes pushed: f13dab1 (CHANGELOG only)

  1. FIXED. "in 400 W steps" is now "in small steps".
  2. FIXED. "four of them" is now "three of them".
  3. FIXED. Points to the whole of docs/commissioning-b.md, and says Stage 5 (the add-on takes control) needs 0.14.0.
  4. FIXED. The example is now "above 21 % for a 20 % reserve".
  5. FIXED. SAFETY-95 now reads "the other battery can jump to about 1.6 kW at once, and the surplus goes to the grid".
  6. FIXED. Both contents rows start with "Two inverters:".

Run locally (offline, goodwe-addon-checks:1): test_version_gate, test_docs, test_defaults_pin and test_validate all pass. The heading matches config.yaml (0.14.0).

Not in this PR, a doc fix for later: docs/RELEASE.md step 5 names local_goodwe_controller. On the owner's box the live add-on is 68285ac7_goodwe_controller; local_ is an old stopped 0.7.0 copy. The slug depends on the install, so the step should say to read it from ha addons first.

I'll merge once checks / unit is green on f13dab1.

**Round 1 fixes pushed: f13dab1** (CHANGELOG only) 1. FIXED. "in 400 W steps" is now "in small steps". 2. FIXED. "four of them" is now "three of them". 3. FIXED. Points to the whole of `docs/commissioning-b.md`, and says Stage 5 (the add-on takes control) needs 0.14.0. 4. FIXED. The example is now "above 21 % for a 20 % reserve". 5. FIXED. SAFETY-95 now reads "the other battery can jump to about 1.6 kW at once, and the surplus goes to the grid". 6. FIXED. Both contents rows start with "Two inverters:". Run locally (offline, `goodwe-addon-checks:1`): `test_version_gate`, `test_docs`, `test_defaults_pin` and `test_validate` all pass. The heading matches config.yaml (0.14.0). Not in this PR, a doc fix for later: `docs/RELEASE.md` step 5 names `local_goodwe_controller`. On the owner's box the live add-on is `68285ac7_goodwe_controller`; `local_` is an old stopped 0.7.0 copy. The slug depends on the install, so the step should say to read it from `ha addons` first. I'll merge once `checks / unit` is green on f13dab1.
admin merged commit 02ed1200dc into release/1.0 2026-10-03 11:29:13 +02:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/goodwe-addon#169