Cuts 0.17.0: config.yamlversion 0.16.0 -> 0.17.0 and a closed ## 0.17.0 CHANGELOG section. No code change.
Version: 0.17.0 (minor). Behaviour changes from SAFETY-103, MAINT-13, MAINT-14, SAFETY-107 and MAINT-15. No option change.
Option diff vs 0.16.0 (451729c):config.yaml, app/validate.py and translations/ have no diff. 83 options before and after. The code diff adds no option read and no default (new numbers are constants in app/maintenance.py; last_failed is a saved-state key, not an option).
Offline checks (goodwe-addon-checks:1, --network none): test_version_gate, test_docs, test_defaults_pin, test_validate, test_tool_inputs pass. predeploy_check.py --deployed-version 0.16.0 --options scratch/STAGE5/settings-v4.json: REFUSED before the bump (no-op), CLEARED after it.
Deviations from docs/RELEASE.md (same as 0.16.0)
release/1.0 is protected, so the bump goes through this PR.
The CHANGELOG section is written to the CI gate (test_version_gate part 11).
No tag made.
predeploy_check was run at cut time, offline only.
CHANGELOG section (verbatim, after review fixes in 808ec04)
0.17.0
A minor bump: changed behaviour, and no option changes. No option was
added, removed or renamed, and no default changed (83 options). Options you
saved work as before. The changes below apply with one inverter or two, unless
a line says "Two inverters".
Maintenance with no battery level. When the battery level is missing,
battery maintenance now ends on its own time limits instead of waiting for the
level to come back (MAINT-14, MAINT-15). You do not need to change any option.
Contents of this release, in merge order since 0.16.0 (451729c):
b527e99
Two inverters: after a drain ends, the other battery no longer swings on old readings. In the test, it held steady for 23 s where 0.16.0 moved it by 720 W (SAFETY-103)
8a17711
A full battery that stops at 98 or 99 % no longer counts as a failed charge. After 60 min with no new high, the charge counts as done; a charge that truly fails now waits 7 days and shows one notice (MAINT-13)
bf3ac79
With no battery level, a maintenance charge still ends at its time limit and a drain waits at 0 W. The log no longer repeats a line every second (MAINT-14)
db9e231
One inverter: when maintenance charges a battery that is already full, the log no longer repeats "The battery refuses to give power" every second. In the test, 1 line in 16 min where the code before this fix wrote about 1,700 in 15 min; the power does not change (SAFETY-107)
580c200
The balancing hold after a charge now ends on time when the battery level is missing. Before, it waited until the level came back (MAINT-15)
Known issues
A false "Battery is not keeping up" can still show when the peak guard pauses a maintenance charge (SAFETY-92).
A battery capped at a low limit with a perfectly flat reading can still trip the stale check (SAFETY-74).
A battery whose reading at rest is beyond about ±175 W is still not caught when it refuses (SAFETY-97).
The peak guard can still back off near the end of a 15-minute period when a meter reading is late, by less than 30 s (SAFETY-99).
Two inverters: the maintenance charge can switch on and off while the house is above the peak aim (SAFETY-88).
Two inverters: the "circulating" figure counts a battery's reading at rest (SAFETY-98).
Two inverters: a drain that starts during a big step in house use can send the other battery to full power, and about 1 kW goes to the grid for about 10 s (SAFETY-104).
Two inverters: when a battery comes back during a maintenance charge, the grid can step by several kW at once (SAFETY-101).
Two inverters: when a battery drops out during a solar surplus, the others can swing by up to 1.5 kW in a simulation (SAFETY-105).
Two inverters: after a drain ends, a change in house use can go unanswered for about 9 s, because some readings are old (SAFETY-106).
Two inverters: when one battery's level is missing, both batteries are held at 0 W, and for about 15 s the last command stays on (SAFETY-108).
Two inverters: if one battery's level stays missing for 12 h, the other battery's cycle can be marked failed, with a 7-day wait and a notice, though it is healthy. This comes from reading the code; it has not been seen on a site (MAINT-17).
One inverter: after a link drop, the battery's own safety stop to 0 W can be taken as a refusal, and the site stays at 0 W for up to 15 min (SAFETY-102).
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.17.0**: `config.yaml` `version` 0.16.0 -> 0.17.0 and a closed `## 0.17.0` CHANGELOG section. No code change.
**Version: 0.17.0 (minor).** Behaviour changes from SAFETY-103, MAINT-13, MAINT-14, SAFETY-107 and MAINT-15. No option change.
**Option diff vs 0.16.0 (`451729c`):** `config.yaml`, `app/validate.py` and `translations/` have no diff. 83 options before and after. The code diff adds no option read and no default (new numbers are constants in `app/maintenance.py`; `last_failed` is a saved-state key, not an option).
**Offline checks (`goodwe-addon-checks:1`, `--network none`):** test_version_gate, test_docs, test_defaults_pin, test_validate, test_tool_inputs pass. `predeploy_check.py --deployed-version 0.16.0 --options scratch/STAGE5/settings-v4.json`: REFUSED before the bump (no-op), CLEARED after it.
## Deviations from docs/RELEASE.md (same as 0.16.0)
1. `release/1.0` is protected, so the bump goes through this PR.
2. The CHANGELOG section is written to the CI gate (test_version_gate part 11).
3. No tag made.
4. predeploy_check was run at cut time, offline only.
## CHANGELOG section (verbatim, after review fixes in 808ec04)
## 0.17.0
**A minor bump: changed behaviour, and no option changes.** No option was
added, removed or renamed, and no default changed (83 options). Options you
saved work as before. The changes below apply with one inverter or two, unless
a line says "Two inverters".
**Maintenance with no battery level.** When the battery level is missing,
battery maintenance now ends on its own time limits instead of waiting for the
level to come back (MAINT-14, MAINT-15). You do not need to change any option.
Contents of this release, in merge order since 0.16.0 (`451729c`):
| | |
|---|---|
| `b527e99` | Two inverters: after a drain ends, the other battery no longer swings on old readings. In the test, it held steady for 23 s where 0.16.0 moved it by 720 W ([[SAFETY-103]]) |
| `8a17711` | A full battery that stops at 98 or 99 % no longer counts as a failed charge. After 60 min with no new high, the charge counts as done; a charge that truly fails now waits 7 days and shows one notice ([[MAINT-13]]) |
| `bf3ac79` | With no battery level, a maintenance charge still ends at its time limit and a drain waits at 0 W. The log no longer repeats a line every second ([[MAINT-14]]) |
| `db9e231` | One inverter: when maintenance charges a battery that is already full, the log no longer repeats "The battery refuses to give power" every second. In the test, 1 line in 16 min where the code before this fix wrote about 1,700 in 15 min; the power does not change ([[SAFETY-107]]) |
| `580c200` | The balancing hold after a charge now ends on time when the battery level is missing. Before, it waited until the level came back ([[MAINT-15]]) |
### Known issues
- A false "Battery is not keeping up" can still show when the peak guard pauses a maintenance charge ([[SAFETY-92]]).
- A battery capped at a low limit with a perfectly flat reading can still trip the stale check ([[SAFETY-74]]).
- A battery whose reading at rest is beyond about ±175 W is still not caught when it refuses ([[SAFETY-97]]).
- The peak guard can still back off near the end of a 15-minute period when a meter reading is late, by less than 30 s ([[SAFETY-99]]).
- Two inverters: the maintenance charge can switch on and off while the house is above the peak aim ([[SAFETY-88]]).
- Two inverters: the "circulating" figure counts a battery's reading at rest ([[SAFETY-98]]).
- Two inverters: a drain that starts during a big step in house use can send the other battery to full power, and about 1 kW goes to the grid for about 10 s ([[SAFETY-104]]).
- Two inverters: when a battery comes back during a maintenance charge, the grid can step by several kW at once ([[SAFETY-101]]).
- Two inverters: when a battery drops out during a solar surplus, the others can swing by up to 1.5 kW in a simulation ([[SAFETY-105]]).
- Two inverters: after a drain ends, a change in house use can go unanswered for about 9 s, because some readings are old ([[SAFETY-106]]).
- Two inverters: when one battery's level is missing, both batteries are held at 0 W, and for about 15 s the last command stays on ([[SAFETY-108]]).
- Two inverters: if one battery's level stays missing for 12 h, the other battery's cycle can be marked failed, with a 7-day wait and a notice, though it is healthy. This comes from reading the code; it has not been seen on a site ([[MAINT-17]]).
- One inverter: after a link drop, the battery's own safety stop to 0 W can be taken as a refusal, and the site stays at 0 W for up to 15 min ([[SAFETY-102]]).
### 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_01Bdqr7PiaHcBnzPituu2yTC
Bump version to 0.17.0 and add the closed 0.17.0 CHANGELOG section.
No code change, no option change.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Release cut round 1 (2026-10-11): head 35432ce, CI run 1241 green. model-router T23 (Sonnet dev, Opus verifier): PASS. There is no Trello card for the release cut, so the verdict is recorded here. Next: Opus review.
Release cut round 1 (2026-10-11): head 35432ce, CI run 1241 green. model-router T23 (Sonnet dev, Opus verifier): PASS. There is no Trello card for the release cut, so the verdict is recorded here. Next: Opus review.
REL-0.17.0 review, round 1 (head 35432ce). Diff, bump kind, contents list, option diff, offline tests and the version-gate mutations are all fine. Text findings in goodwe_controller/CHANGELOG.md. I am pushing fixes for all of them:
F1 (low, line 22, SAFETY-107 row): "where 0.16.0 wrote about 1,700". The test's base was bf3ac79 (0.16.0 plus SAFETY-103, MAINT-13 and MAINT-14), not 0.16.0, and the 874 + 873 lines were counted over 15 min. New text: "where the code before this fix wrote about 1,700 in 15 min".
F2 (medium, line 38, MAINT-17): the line did not say it comes from code reading. The card says the 12 h case was not run. Added: "This comes from reading the code; it has not been seen on a site."
F3 (low, line 35, SAFETY-105): the 1.5 kW figure comes from one simulated plant (the SAFETY-103 dev's). Added "in a simulation".
F4 (low, line 29, SAFETY-97): the edge in code is 75 W (IDLE_MAX_W, app/idle.py:22) plus 100 W (REFUSED_BELOW_W = PROBE_W/2, app/control.py:288-293), so ±175 W. "As in 0.14.0" was misleading: 0.14.0 missed everything beyond ±100 W. New text: "beyond about ±175 W ... (SAFETY-97)". The line stays: the card is Done, but the limit is still in the code.
F5 (low, lines 10-13, maintenance note): it named MAINT-13 as a change when the battery level is missing. MAINT-13 is about a full pack at 98-99 %. Missing-level endings come from MAINT-14 (charge and drain) and MAINT-15 (hold). Reworded to two sentences citing MAINT-14 and MAINT-15.
F6 (info, line 37, SAFETY-108): "for the first 15 s" became "for about 15 s" (the card says ~15-16 s).
No change: the bump kind (minor), the other rows, the other known-issue lines, the three left-out cards (SAFETY-109, SAFETY-110, MAINT-16) and the "older than 0.10.0" part.
**REL-0.17.0 review, round 1 (head 35432ce).** Diff, bump kind, contents list, option diff, offline tests and the version-gate mutations are all fine. Text findings in `goodwe_controller/CHANGELOG.md`. I am pushing fixes for all of them:
- **F1 (low, line 22, SAFETY-107 row):** "where 0.16.0 wrote about 1,700". The test's base was bf3ac79 (0.16.0 plus SAFETY-103, MAINT-13 and MAINT-14), not 0.16.0, and the 874 + 873 lines were counted over 15 min. New text: "where the code before this fix wrote about 1,700 in 15 min".
- **F2 (medium, line 38, MAINT-17):** the line did not say it comes from code reading. The card says the 12 h case was not run. Added: "This comes from reading the code; it has not been seen on a site."
- **F3 (low, line 35, SAFETY-105):** the 1.5 kW figure comes from one simulated plant (the SAFETY-103 dev's). Added "in a simulation".
- **F4 (low, line 29, SAFETY-97):** the edge in code is 75 W (`IDLE_MAX_W`, app/idle.py:22) plus 100 W (`REFUSED_BELOW_W` = `PROBE_W`/2, app/control.py:288-293), so ±175 W. "As in 0.14.0" was misleading: 0.14.0 missed everything beyond ±100 W. New text: "beyond about ±175 W ... ([[SAFETY-97]])". The line stays: the card is Done, but the limit is still in the code.
- **F5 (low, lines 10-13, maintenance note):** it named MAINT-13 as a change when the battery level is missing. MAINT-13 is about a full pack at 98-99 %. Missing-level endings come from MAINT-14 (charge and drain) and MAINT-15 (hold). Reworded to two sentences citing MAINT-14 and MAINT-15.
- **F6 (info, line 37, SAFETY-108):** "for the first 15 s" became "for about 15 s" (the card says ~15-16 s).
No change: the bump kind (minor), the other rows, the other known-issue lines, the three left-out cards (SAFETY-109, SAFETY-110, MAINT-16) and the "older than 0.10.0" part.
SAFETY-107 row names the tested base; MAINT-17 says code reading only;
SAFETY-105 figure is from a simulation; SAFETY-97 edge is 175 W; the
maintenance note cites MAINT-14 and MAINT-15; SAFETY-108 "about 15 s".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
admin
merged commit e36565fe39 into release/1.02026-10-11 00:58:30 +02:00
REL-0.17.0 review: merged. Fixes F1-F6 are in 808ec04 (CHANGELOG text only; the PR body's verbatim section is updated). Offline checks pass on 808ec04: test_version_gate, test_docs, test_defaults_pin, test_validate and test_tool_inputs. The version-gate mutations (heading 0.17.1, version 0.17.1) both fail as they should. checks / unit (pull_request) passed on 808ec04 in run 1243, a real run of 35m16s. I merged with head_commit_id pinned to 808ec04.
ls-remote after the merge:
release/1.0 e36565f (parents 580c200 and 808ec04; the tree is identical to the PR head)
**REL-0.17.0 review: merged.** Fixes F1-F6 are in 808ec04 (CHANGELOG text only; the PR body's verbatim section is updated). Offline checks pass on 808ec04: test_version_gate, test_docs, test_defaults_pin, test_validate and test_tool_inputs. The version-gate mutations (heading 0.17.1, version 0.17.1) both fail as they should. `checks / unit (pull_request)` passed on 808ec04 in run 1243, a real run of 35m16s. I merged with `head_commit_id` pinned to 808ec04.
ls-remote after the merge:
- release/1.0 e36565f (parents 580c200 and 808ec04; the tree is identical to the PR head)
- release-0.17.0 808ec04
- master df154a2 (unchanged)
No tag, no master PR, no deploy.
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.17.0:
config.yamlversion0.16.0 -> 0.17.0 and a closed## 0.17.0CHANGELOG section. No code change.Version: 0.17.0 (minor). Behaviour changes from SAFETY-103, MAINT-13, MAINT-14, SAFETY-107 and MAINT-15. No option change.
Option diff vs 0.16.0 (
451729c):config.yaml,app/validate.pyandtranslations/have no diff. 83 options before and after. The code diff adds no option read and no default (new numbers are constants inapp/maintenance.py;last_failedis a saved-state key, not an option).Offline checks (
goodwe-addon-checks:1,--network none): test_version_gate, test_docs, test_defaults_pin, test_validate, test_tool_inputs pass.predeploy_check.py --deployed-version 0.16.0 --options scratch/STAGE5/settings-v4.json: REFUSED before the bump (no-op), CLEARED after it.Deviations from docs/RELEASE.md (same as 0.16.0)
release/1.0is protected, so the bump goes through this PR.CHANGELOG section (verbatim, after review fixes in
808ec04)0.17.0
A minor bump: changed behaviour, and no option changes. No option was
added, removed or renamed, and no default changed (83 options). Options you
saved work as before. The changes below apply with one inverter or two, unless
a line says "Two inverters".
Maintenance with no battery level. When the battery level is missing,
battery maintenance now ends on its own time limits instead of waiting for the
level to come back (MAINT-14, MAINT-15). You do not need to change any option.
Contents of this release, in merge order since 0.16.0 (
451729c):b527e998a17711bf3ac79db9e231580c200Known 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_01Bdqr7PiaHcBnzPituu2yTC
Release cut round 1 (2026-10-11): head
35432ce, CI run 1241 green. model-router T23 (Sonnet dev, Opus verifier): PASS. There is no Trello card for the release cut, so the verdict is recorded here. Next: Opus review.REL-0.17.0 review, round 1 (head
35432ce). Diff, bump kind, contents list, option diff, offline tests and the version-gate mutations are all fine. Text findings ingoodwe_controller/CHANGELOG.md. I am pushing fixes for all of them:bf3ac79(0.16.0 plus SAFETY-103, MAINT-13 and MAINT-14), not 0.16.0, and the 874 + 873 lines were counted over 15 min. New text: "where the code before this fix wrote about 1,700 in 15 min".IDLE_MAX_W, app/idle.py:22) plus 100 W (REFUSED_BELOW_W=PROBE_W/2, app/control.py:288-293), so ±175 W. "As in 0.14.0" was misleading: 0.14.0 missed everything beyond ±100 W. New text: "beyond about ±175 W ... (SAFETY-97)". The line stays: the card is Done, but the limit is still in the code.No change: the bump kind (minor), the other rows, the other known-issue lines, the three left-out cards (SAFETY-109, SAFETY-110, MAINT-16) and the "older than 0.10.0" part.
REL-0.17.0 review: merged. Fixes F1-F6 are in
808ec04(CHANGELOG text only; the PR body's verbatim section is updated). Offline checks pass on808ec04: test_version_gate, test_docs, test_defaults_pin, test_validate and test_tool_inputs. The version-gate mutations (heading 0.17.1, version 0.17.1) both fail as they should.checks / unit (pull_request)passed on808ec04in run 1243, a real run of 35m16s. I merged withhead_commit_idpinned to808ec04.ls-remote after the merge:
e36565f(parents580c200and 808ec04; the tree is identical to the PR head)808ec04df154a2(unchanged)No tag, no master PR, no deploy.