SAFETY-91: a held battery is drawn only after the others are full
checks / unit (pull_request) Successful in 26m19s
infra-pin / fresh (pull_request) Successful in 1s

At N>=2 a battery at or under its own peak reserve now weighs 0 whenever
the site gives (not only for the peak), a draining battery's pin becomes
a floor at its drain rate so it rises before the held one gives, and a
quarter's edge is graded on the next quarter when its first telegram is
late. SAFETY-25 option A stays: the held battery is still drawn once the
others are full. N=1 unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-02 14:03:54 +02:00
co-authored by Claude Opus 5.5
parent 8c438ab2e6
commit 6872353e2e
10 changed files with 564 additions and 12 deletions
+4
View File
@@ -3132,6 +3132,10 @@ check("...and between them the nineteen appends account for exactly the "
# through this file's reading of main.py. It grades three of the eight appends.
# The static pin above is what covers the other five.
_b2, _restore_b2 = second_inverter(c_src)
# SAFETY-91: B states a cut-out, as every roster entry must (rule 8). Without
# one it is held back at its reserve and gives last, so A alone would carry
# this cycle's 500 W and the broadcast check below could not see a split.
_b2.bms_soc_floor = c_src.inverters[0].bms_soc_floor
_n2_writes_before = len(c_src.hass.per_entity)
try:
_, _cl2 = cycle_claims(lambda: run_cycle(c_src))