Cuts 0.16.0: config.yamlversion 0.15.0 -> 0.16.0 and a closed ## 0.16.0 CHANGELOG section. No code change.
Version: 0.16.0 (minor). Behaviour changes from SAFETY-90, SAFETY-95, SAFETY-96 and MAINT-10, plus one changed default.
Option diff vs 0.15.0 (3ed3302): 83 options, 83 schema keys, none added, removed or renamed. app/validate.py is unchanged. maintenance_start_hour: default 10 -> 19, and it is now a local hour (was UTC). Name and description in translations/en.yaml and nl.yaml say "local time". A saved hour is kept and now means local time.
Offline checks (goodwe-addon-checks:1, --network none): test_version_gate (part 11), test_docs, test_defaults_pin, test_validate, test_tool_inputs all pass. predeploy_check.py --deployed-version 0.15.0 --options scratch/STAGE5/settings-v4.json: REFUSED before the bump (no-op), CLEARED after it.
Deviations from docs/RELEASE.md (same as 0.13.0 to 0.15.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)
0.16.0
A minor bump: changed behaviour, no option added or removed, and one default
and its meaning changed. There are still 83 options. maintenance_start_hour
used to be read as UTC and its default was 10. It is now a local hour (in Home
Assistant's time zone) and its default is 19. The other changes below apply
with one inverter or two, unless a line says "Two inverters".
Before you update (MAINT-10). A saved maintenance_start_hour is kept, and
it now means local time. If you set it in UTC to get an evening start (for
example 17 for 19:00 in summer), set it back to the local hour (19). A saved
10 now starts at 10:00, not 12:00 in summer. The new default 19 only reaches
installs that have no hour saved.
Contents of this release, in merge order since 0.15.0 (3ed3302):
7ef7347
After a gap in the P1 meter, the peak guard counts the missed time as high use and keeps the 15-minute period near the limit; before, it was blind until the next period. In the test, a 5 min meter silence at one inverter ended the period at 3.3 kW, against 4.8 kW on 0.15.0 (SAFETY-90)
1bf6b7f
The maintenance start hour is now a local hour, and its default is 19 (was 10, read as UTC). The log says which time zone it used; with two inverters, both use that hour and still cycle one at a time (MAINT-10)
b2f5573
Two inverters: when one battery's link drops, the other takes over in small steps, and control no longer stalls. The battery that comes back rejoins within 2 s, without a false "battery refuses" (SAFETY-96)
340c7ee
Two inverters: when a drain ends (done, switched Off, timeout, lost link), the other battery covers the house right away, without jumping to 1.6 kW, and then moves in small steps. It no longer gives into a solar surplus (SAFETY-95)
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 ±170 W is still not caught when it refuses, as in 0.14.0 (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).
A charge to 100 % can time out at 98 %. The add-on then counts the cycle as failed and drains the battery again the next day (MAINT-13).
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: after a drain ends, the other battery can swing by about 800 W for about 5 s, because some readings are old (SAFETY-103).
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).
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.16.0**: `config.yaml` `version` 0.15.0 -> 0.16.0 and a closed `## 0.16.0` CHANGELOG section. No code change.
**Version: 0.16.0 (minor).** Behaviour changes from SAFETY-90, SAFETY-95, SAFETY-96 and MAINT-10, plus one changed default.
**Option diff vs 0.15.0 (`3ed3302`):** 83 options, 83 schema keys, none added, removed or renamed. `app/validate.py` is unchanged. `maintenance_start_hour`: default 10 -> 19, and it is now a local hour (was UTC). Name and description in `translations/en.yaml` and `nl.yaml` say "local time". A saved hour is kept and now means local time.
**Offline checks (`goodwe-addon-checks:1`, `--network none`):** test_version_gate (part 11), test_docs, test_defaults_pin, test_validate, test_tool_inputs all pass. `predeploy_check.py --deployed-version 0.15.0 --options scratch/STAGE5/settings-v4.json`: REFUSED before the bump (no-op), CLEARED after it.
## Deviations from docs/RELEASE.md (same as 0.13.0 to 0.15.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)
## 0.16.0
**A minor bump: changed behaviour, no option added or removed, and one default
and its meaning changed.** There are still 83 options. `maintenance_start_hour`
used to be read as UTC and its default was 10. It is now a local hour (in Home
Assistant's time zone) and its default is 19. The other changes below apply
with one inverter or two, unless a line says "Two inverters".
**Before you update (MAINT-10).** A saved `maintenance_start_hour` is kept, and
it now means local time. If you set it in UTC to get an evening start (for
example 17 for 19:00 in summer), set it back to the local hour (19). A saved
10 now starts at 10:00, not 12:00 in summer. The new default 19 only reaches
installs that have no hour saved.
Contents of this release, in merge order since 0.15.0 (`3ed3302`):
| | |
|---|---|
| `7ef7347` | After a gap in the P1 meter, the peak guard counts the missed time as high use and keeps the 15-minute period near the limit; before, it was blind until the next period. In the test, a 5 min meter silence at one inverter ended the period at 3.3 kW, against 4.8 kW on 0.15.0 ([[SAFETY-90]]) |
| `1bf6b7f` | The maintenance start hour is now a local hour, and its default is 19 (was 10, read as UTC). The log says which time zone it used; with two inverters, both use that hour and still cycle one at a time ([[MAINT-10]]) |
| `b2f5573` | Two inverters: when one battery's link drops, the other takes over in small steps, and control no longer stalls. The battery that comes back rejoins within 2 s, without a false "battery refuses" ([[SAFETY-96]]) |
| `340c7ee` | Two inverters: when a drain ends (done, switched Off, timeout, lost link), the other battery covers the house right away, without jumping to 1.6 kW, and then moves in small steps. It no longer gives into a solar surplus ([[SAFETY-95]]) |
### 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 ±170 W is still not caught when it refuses, as in 0.14.0 ([[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]]).
- A charge to 100 % can time out at 98 %. The add-on then counts the cycle as failed and drains the battery again the next day ([[MAINT-13]]).
- 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: after a drain ends, the other battery can swing by about 800 W for about 5 s, because some readings are old ([[SAFETY-103]]).
- 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]]).
- 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)
Diff is only config.yaml (version 0.15.0 -> 0.16.0) and a new ## 0.16.0 CHANGELOG section; heading matches.
Minor bump is right. 3ed3302..340c7ee: 83 options, 83 schema keys, same key sets; the only option change is maintenance_start_hour 10 -> 19; schema int(0,23) unchanged; app/validate.py unchanged; en/nl translations say "local time". No code rewrites a saved option (MAINT-10 test check 3: options.json sha256 unchanged, 17 now means 17:00 local), so a site that set 17 for UTC must set 19.
Known issues: 90/95/96 dropped (Done); 92/74/88/98 still To Do; the ±170 W line stands (IDLE_MAX_W 75 + 100 W band); 99/101/102/103/104 and MAINT-13 match their cards.
Upgrade note and the "older than 0.10.0" part are present and correct.
To fix:
SAFETY-103 line. "swing up to about 800 W for a few seconds" reads as if B reaches 800 W. The card: B went 860 -> 1650 -> 870 W from E+13 to E+18 (a 790 W swing, about 5 s). New: "can swing by about 800 W for about 5 s".
SAFETY-99 line. "a few seconds late": the card says late by less than 30 s (tests 5–29 s). New: "when a meter reading is late, by less than 30 s". "lose its boost" -> "back off", plainer.
MAINT-10 row. "With two inverters, one battery cycles at a time" reads as new. arbitrate() is unchanged (DECISIONS/MAINT-10 §4); it was already one at a time. New: both use the same local hour and still cycle one at a time.
SAFETY-96 row. "no longer stalls at 800 W": 800 W is one test's figure (c4s stalled at 1200 W). New: "no longer stalls".
Row length (UX-08: 1–2 sentences). SAFETY-90 has 4 sentences, MAINT-10 has 3. Trimmed to 2.
SAFETY-90 row and the 4.2 W quarter (dev's question): it does not overstate. The row says "near the limit", not "under the aim". The worst quarter in the test (check 3, N=1, the period ending while the meter was still silent) was 3454.2 W, which is 4.2 W over the 3450 W aim and 46 W under the 3500 W limit. That is near the limit. The 5 min figure is a real result (check 2, N=1: 3300.9 W against 4769.2 W). I keep the figure and the wording "near the limit".
I am pushing the fixes to release-0.16.0 and updating the verbatim section in the PR body.
**Review round 1 (REL-0.16.0)** on 756b50d.
Checked and fine:
- Diff is only `config.yaml` (version 0.15.0 -> 0.16.0) and a new `## 0.16.0` CHANGELOG section; heading matches.
- Minor bump is right. 3ed3302..340c7ee: 83 options, 83 schema keys, same key sets; the only option change is `maintenance_start_hour` 10 -> 19; schema `int(0,23)` unchanged; `app/validate.py` unchanged; en/nl translations say "local time". No code rewrites a saved option (MAINT-10 test check 3: options.json sha256 unchanged, 17 now means 17:00 local), so a site that set 17 for UTC must set 19.
- Contents table = the four first-parent merges 7ef7347, 1bf6b7f, b2f5573, 340c7ee.
- Known issues: 90/95/96 dropped (Done); 92/74/88/98 still To Do; the ±170 W line stands (`IDLE_MAX_W` 75 + 100 W band); 99/101/102/103/104 and MAINT-13 match their cards.
- Upgrade note and the "older than 0.10.0" part are present and correct.
To fix:
1. **SAFETY-103 line.** "swing up to about 800 W for a few seconds" reads as if B reaches 800 W. The card: B went 860 -> 1650 -> 870 W from E+13 to E+18 (a 790 W swing, about 5 s). New: "can swing by about 800 W for about 5 s".
2. **SAFETY-99 line.** "a few seconds late": the card says late by less than 30 s (tests 5–29 s). New: "when a meter reading is late, by less than 30 s". "lose its boost" -> "back off", plainer.
3. **MAINT-10 row.** "With two inverters, one battery cycles at a time" reads as new. `arbitrate()` is unchanged (DECISIONS/MAINT-10 §4); it was already one at a time. New: both use the same local hour and still cycle one at a time.
4. **SAFETY-96 row.** "no longer stalls at 800 W": 800 W is one test's figure (c4s stalled at 1200 W). New: "no longer stalls".
5. **Row length (UX-08: 1–2 sentences).** SAFETY-90 has 4 sentences, MAINT-10 has 3. Trimmed to 2.
**SAFETY-90 row and the 4.2 W quarter (dev's question): it does not overstate.** The row says "near the limit", not "under the aim". The worst quarter in the test (check 3, N=1, the period ending while the meter was still silent) was 3454.2 W, which is 4.2 W over the 3450 W aim and 46 W under the 3500 W limit. That is near the limit. The 5 min figure is a real result (check 2, N=1: 3300.9 W against 4769.2 W). I keep the figure and the wording "near the limit".
I am pushing the fixes to `release-0.16.0` and updating the verbatim section in the PR body.
SAFETY-103 swing 'by about 800 W for about 5 s'; SAFETY-99 'late, by less
than 30 s'; MAINT-10 row: one-at-a-time is not new; SAFETY-96: drop the
test-only 800 W; SAFETY-90 and MAINT-10 rows trimmed to two sentences.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SAFETY-103: "can swing by about 800 W for about 5 s".
SAFETY-99: "can still back off near the end of a 15-minute period when a meter reading is late, by less than 30 s".
MAINT-10 row: "both use that hour and still cycle one at a time"; 2 sentences.
SAFETY-96 row: "control no longer stalls" (no 800 W).
SAFETY-90 row: 2 sentences, same figures, still "near the limit".
The verbatim section in the PR body is updated to match.
Offline on 1c607a9 (goodwe-addon-checks:1, --network none): test_version_gate, test_docs, test_defaults_pin, test_validate and test_tool_inputs all pass. Mutation: heading ## 0.16.1 -> test_version_gate FAILS; version "0.16.1" -> FAILS; restored -> passes.
Every point is fixed or refuted. I will merge once checks / unit is green on 1c607a9.
**Fixes pushed: 1c607a9** (ls-remote `release-0.16.0` = 1c607a961a58). CHANGELOG only, 5 lines:
1. SAFETY-103: "can swing by about 800 W for about 5 s".
2. SAFETY-99: "can still back off near the end of a 15-minute period when a meter reading is late, by less than 30 s".
3. MAINT-10 row: "both use that hour and still cycle one at a time"; 2 sentences.
4. SAFETY-96 row: "control no longer stalls" (no 800 W).
5. SAFETY-90 row: 2 sentences, same figures, still "near the limit".
The verbatim section in the PR body is updated to match.
Offline on 1c607a9 (`goodwe-addon-checks:1`, `--network none`): test_version_gate, test_docs, test_defaults_pin, test_validate and test_tool_inputs all pass. Mutation: heading `## 0.16.1` -> test_version_gate FAILS; version "0.16.1" -> FAILS; restored -> passes.
Every point is fixed or refuted. I will merge once `checks / unit` is green on 1c607a9.
admin
merged commit 451729c9b5 into release/1.02026-10-08 01:02:21 +02:00
Merged as 451729c (parents 340c7ee, 1c607a9), pinned head_commit_id1c607a9. checks / unit (pull_request) succeeded on 1c607a9 (run 1201, 00:09 -> 00:42, a real run); infra-pin / fresh succeeded (run 1202). The merge tree is identical to the PR head.
ls-remote: release/1.0451729c, release-0.16.01c607a9, master2159993 (unchanged). No tag, no master PR, nothing deployed.
Deploy note: the live site's maintenance_start_hour 17 (set for UTC) must be set to 19 as part of the 0.16.0 deploy.
**Merged** as 451729c (parents 340c7ee, 1c607a9), pinned `head_commit_id` 1c607a9. `checks / unit (pull_request)` succeeded on 1c607a9 (run 1201, 00:09 -> 00:42, a real run); `infra-pin / fresh` succeeded (run 1202). The merge tree is identical to the PR head.
ls-remote: `release/1.0` 451729c, `release-0.16.0` 1c607a9, `master` 2159993 (unchanged). No tag, no master PR, nothing deployed.
Deploy note: the live site's `maintenance_start_hour` 17 (set for UTC) must be set to 19 as part of the 0.16.0 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.16.0:
config.yamlversion0.15.0 -> 0.16.0 and a closed## 0.16.0CHANGELOG section. No code change.Version: 0.16.0 (minor). Behaviour changes from SAFETY-90, SAFETY-95, SAFETY-96 and MAINT-10, plus one changed default.
Option diff vs 0.15.0 (
3ed3302): 83 options, 83 schema keys, none added, removed or renamed.app/validate.pyis unchanged.maintenance_start_hour: default 10 -> 19, and it is now a local hour (was UTC). Name and description intranslations/en.yamlandnl.yamlsay "local time". A saved hour is kept and now means local time.Offline checks (
goodwe-addon-checks:1,--network none): test_version_gate (part 11), test_docs, test_defaults_pin, test_validate, test_tool_inputs all pass.predeploy_check.py --deployed-version 0.15.0 --options scratch/STAGE5/settings-v4.json: REFUSED before the bump (no-op), CLEARED after it.Deviations from docs/RELEASE.md (same as 0.13.0 to 0.15.0)
release/1.0is protected, so the bump goes through this PR.CHANGELOG section (verbatim)
0.16.0
A minor bump: changed behaviour, no option added or removed, and one default
and its meaning changed. There are still 83 options.
maintenance_start_hourused to be read as UTC and its default was 10. It is now a local hour (in Home
Assistant's time zone) and its default is 19. The other changes below apply
with one inverter or two, unless a line says "Two inverters".
Before you update (MAINT-10). A saved
maintenance_start_houris kept, andit now means local time. If you set it in UTC to get an evening start (for
example 17 for 19:00 in summer), set it back to the local hour (19). A saved
10 now starts at 10:00, not 12:00 in summer. The new default 19 only reaches
installs that have no hour saved.
Contents of this release, in merge order since 0.15.0 (
3ed3302):7ef73471bf6b7fb2f5573340c7eeKnown 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
Review round 1 (REL-0.16.0) on
756b50d.Checked and fine:
config.yaml(version 0.15.0 -> 0.16.0) and a new## 0.16.0CHANGELOG section; heading matches.maintenance_start_hour10 -> 19; schemaint(0,23)unchanged;app/validate.pyunchanged; en/nl translations say "local time". No code rewrites a saved option (MAINT-10 test check 3: options.json sha256 unchanged, 17 now means 17:00 local), so a site that set 17 for UTC must set 19.7ef7347,1bf6b7f,b2f5573,340c7ee.IDLE_MAX_W75 + 100 W band); 99/101/102/103/104 and MAINT-13 match their cards.To fix:
arbitrate()is unchanged (DECISIONS/MAINT-10 §4); it was already one at a time. New: both use the same local hour and still cycle one at a time.SAFETY-90 row and the 4.2 W quarter (dev's question): it does not overstate. The row says "near the limit", not "under the aim". The worst quarter in the test (check 3, N=1, the period ending while the meter was still silent) was 3454.2 W, which is 4.2 W over the 3450 W aim and 46 W under the 3500 W limit. That is near the limit. The 5 min figure is a real result (check 2, N=1: 3300.9 W against 4769.2 W). I keep the figure and the wording "near the limit".
I am pushing the fixes to
release-0.16.0and updating the verbatim section in the PR body.Fixes pushed:
1c607a9(ls-remoterelease-0.16.0=1c607a961a). CHANGELOG only, 5 lines:The verbatim section in the PR body is updated to match.
Offline on
1c607a9(goodwe-addon-checks:1,--network none): test_version_gate, test_docs, test_defaults_pin, test_validate and test_tool_inputs all pass. Mutation: heading## 0.16.1-> test_version_gate FAILS; version "0.16.1" -> FAILS; restored -> passes.Every point is fixed or refuted. I will merge once
checks / unitis green on1c607a9.Merged as
451729c(parents340c7ee,1c607a9), pinnedhead_commit_id1c607a9.checks / unit (pull_request)succeeded on1c607a9(run 1201, 00:09 -> 00:42, a real run);infra-pin / freshsucceeded (run 1202). The merge tree is identical to the PR head.ls-remote:
release/1.0451729c,release-0.16.01c607a9,master2159993(unchanged). No tag, no master PR, nothing deployed.Deploy note: the live site's
maintenance_start_hour17 (set for UTC) must be set to 19 as part of the 0.16.0 deploy.