Files
glenn schrooyenandClaude 5ee1061398
checks / unit (pull_request) Successful in 38m43s
infra-pin / fresh (pull_request) Successful in 1s
MAINT-11 round 2: disable the cycle buttons that cannot work
Stop cycle is disabled on a battery that is not cycling. Start cycle is
disabled while any battery cycles and on a switched-off battery. Page only;
the add-on still refuses each of these. DECISIONS notes the one-battery case.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bdqr7PiaHcBnzPituu2yTC
2026-10-13 23:18:21 +02:00

1.8 KiB

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.
  • At one battery, a request that names the battery uses the new path, so a second start is refused instead of restarting the drain. Nothing sends a name at one battery, and the bare request is unchanged.