Cuts 0.14.0: config.yamlversion 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.yamloptions 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)
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).
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.
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.
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:
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.
Wait for checks / unit (pull_request) to be green (a skipped is not green).
Merge it, pinning head_commit_id, only after the owner's go. A merge to master is a deployment.
Before the update, export fresh live data.options and run predeploy_check.py with the deployed version read from the box.
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.
Watchdog stays on (SAFETY-61 / DOC-5).
Inverter B: Stage 5 of admin/goodwedocs/commissioning-b.md, only after 0.14.0 is live.
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.
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
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>
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.
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/goodwerelease/1.0 @ 0c04488, with "Stage 5 — raise the ceiling, deliberately".
Findings:
"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".
"four of them are about two inverters": the list has three "Two inverters:" items (SAFETY-95, -96, -88). Suggest "three of them".
"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."
"(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)".
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".
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.
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>
FIXED. Points to the whole of docs/commissioning-b.md, and says Stage 5 (the add-on takes control) needs 0.14.0.
FIXED. The example is now "above 21 % for a 20 % reserve".
FIXED. SAFETY-95 now reads "the other battery can jump to about 1.6 kW at once, and the surplus goes to the grid".
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.02026-10-03 11:29:13 +02:00
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.
Cuts 0.14.0:
config.yamlversion0.13.0 -> 0.14.0 and a closed## 0.14.0CHANGELOG 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.mdinadmin/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.yamloptionsandschemaare identical apart fromversion(83 options, 83 schema keys). No option added, removed or renamed, no default changed.app/validate.pyandtranslations/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)
version:onrelease/1.0".release/1.0is protected, so the bump goes through this PR (branchrelease-0.14.0).test_version_gate.pypart 11): the heading equals config.yaml's version, there is exactly one "in merge order since" table, and the three withdrawnprice_providerids are named.v0.14.0(v0.13.0 sits on master) is left to the manager.predeploy_check.pyat 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:deploy-0.14.0branch at the release merge commit and open a PRdeploy-0.14.0->master. No push tomaster.checks / unit (pull_request)to be green (askippedis not green).head_commit_id, only after the owner's go. A merge tomasteris a deployment.data.optionsand runpredeploy_check.pywith the deployed version read from the box.ha store reload && ha addons update 68285ac7_goodwe_controlleron the live HA. This needs the owner's go, which lifts the standing "noha addons update" rule.admin/goodwedocs/commissioning-b.md, only after 0.14.0 is live.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.mdin theadmin/goodwerepo. Read the knownissues below first: four of them are about two inverters.
Contents of this release, in merge order since 0.13.0 (
8c438ab):f3e409c858f77ce51e3e0admin/goodwe(CI only) (CI-13)Known issues
If you are crossing from a version older than 0.10.0
## 0.10.0below can refuse an old config:slew_wabove its limit, and thewithdrawn
price_provideridsengie_dynamic,totalenergies_dynamicandeneco_eddy. Read it before you update. Runtools/predeploy_check.pywith thebare options (
jq '.data.options') first.🤖 Generated with Claude Code
https://claude.ai/code/session_019DBUfvndgHwaV339Fvd2gr
Review round 1 (REL-0.14.0)
Checked and OK:
config.yamlvs 0.13.0 (8c438ab) differs only inversion;validate.pyandtranslations/are untouched. No option added, removed, renamed or re-defaulted.8c438ab(f3e409c#165,858f77c#167,e51e3e0#168), in order, one line each._held_back(),_drain_rise(),_charge_track(),_reseed_charge_end()and thenext_quarter()call all return early at N<2. At N=1_peak_on_able()never setsheld, so the old_peak_reserve()was already empty there; swapping it for_held_back()changes nothing. DOCS.md changes are text only.main.py_held_back), so "freed above reserve + 1" is right.docs/commissioning-b.mdexists onadmin/goodwerelease/1.0@ 0c04488, with "Stage 5 — raise the ceiling, deliberately".Findings:
slew_w. The default isslew_w: 0, where the step comes from the power range instead. Suggest: "control hands over in small steps".docs/commissioning-b.mdin theadmin/goodwerepo. Its Stage 5, where the add-on takes control of it, needs 0.14.0."soc > reserve + 1, so a sensor with decimals frees it at 21.1 %. Suggest "(e.g. above 21 % for a 20 % reserve)".I'll push these to the branch myself.
Round 1 fixes pushed:
f13dab1(CHANGELOG only)docs/commissioning-b.md, and says Stage 5 (the add-on takes control) needs 0.14.0.Run locally (offline,
goodwe-addon-checks:1):test_version_gate,test_docs,test_defaults_pinandtest_validateall pass. The heading matches config.yaml (0.14.0).Not in this PR, a doc fix for later:
docs/RELEASE.mdstep 5 nameslocal_goodwe_controller. On the owner's box the live add-on is68285ac7_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 fromha addonsfirst.I'll merge once
checks / unitis green onf13dab1.