MAINT-11: start or stop the maintenance cycle per battery
checks / unit (pull_request) Successful in 38m46s
infra-pin / fresh (pull_request) Successful in 1s

maint_start and maint_abort take an optional unit. With two or more batteries
each Batteries card has Start cycle and Stop cycle buttons. One slot per site
stays: a start while a battery cycles is refused and names it (no queue). A
battery that is switched off, an unknown unit, and a stop on a battery that is
not cycling are refused with a plain message. A request with no unit is the
old call. The scheduler and the phase machine are unchanged.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bdqr7PiaHcBnzPituu2yTC
This commit is contained in:
glenn schrooyen
2026-10-13 21:37:36 +02:00
co-authored by Claude
parent 79dd0770f9
commit 21d8a944bc
9 changed files with 521 additions and 1 deletions
@@ -0,0 +1,34 @@
# MAINT-11 - start or stop the maintenance cycle per battery
**Status: for review.** Tests: `test_maint11.py`. No option added.
**The fault.** At two or more batteries the page had one "start a battery cycle"
button, and `_maint_button()` chose the battery. An operator could not cycle a
chosen one (inverter B, new after storage, needed its first cycle).
## Rule
1. `maint_start` and `maint_abort` take an optional `unit`. With no unit they
run the old code unchanged. The Batteries screen sends the unit from a
per-battery Start cycle and Stop cycle button, at two or more batteries only.
2. **A start while any battery holds the maintenance slot is refused, not
queued.** The message names the battery that is cycling. One slot per site
stays the rule, and the scheduler is untouched.
3. Also refused, with a plain message: an unknown unit, a start on a battery
that is switched off (battery modes on), and a stop on a battery that is not
cycling. Nothing changes on a refusal.
4. A stop on the cycling battery is today's abort: the cycle ends, then every
inverter goes to 0 W.
## Why refuse and not queue
A queued start is a cycle that begins hours later, unseen, after the operator
has moved on. A refusal is immediate and says why. The scheduler already
queues by waiting time, so nothing is lost.
## What this does not cover
- Today's bare button never refused a battery that is refusing to give power
(SAFETY-73); its drain waits. The per-battery start does the same.
- A start on the battery that is already cycling is refused as "busy", where
the bare button restarts its drain. The bare button is unchanged.