UX-08 phase 2b: short, plain status rows and page banners
Every Commissioning row and every page banner is now worded in app/messages.py (row_*, banner_*): one sentence of at most 15 words, a red row up to three sentences so a latch still says how it clears, banners at most 12 words. No row names a Home Assistant entity: sensors by their setting, solar sources by their place in the list. Reason codes and limits stay on the log line and event list; rows keep the numbers a reader acts on. UX-07 item 1: ClampWatchdog counts over-rating and integrator-bound engagements separately, and after an episode each count shows under its own alarm's title instead of both under "output clamp". No row colour, visibility or banner order changed. Rows carry an "id" so the tests pin meaning rather than wording. The row and banner kinds leave the allowlist (200 -> 168, cap equal). DOCS.md gains "Status page"; choices are in DECISIONS/UX-08-short-notifications.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LyR88rXETvwhTgx6yHE39p
This commit is contained in:
@@ -337,15 +337,19 @@ def rows_for(pass_age):
|
||||
|
||||
r_new, r_29, r_31 = rows_for(None), rows_for(29), rows_for(31)
|
||||
print(f" {r_new[0]} | {r_29[0]} | {r_31[0]}")
|
||||
# UX-08: the wording is app/messages.py's; these pin the meaning - which row,
|
||||
# its colour, and the two numbers (age, veto) an operator acts on.
|
||||
check("before the first pass the row is ok and says 'starting'",
|
||||
r_new[0] == {"ok": True, "warn": False, "text": "control loop: starting"})
|
||||
r_new[0]["id"] == "controller" and r_new[0]["ok"] and not r_new[0]["warn"]
|
||||
and "starting" in r_new[0]["text"])
|
||||
check("29 s after a pass it is ok",
|
||||
r_29[0] == {"ok": True, "warn": False,
|
||||
"text": "control loop: last pass 29 s ago"})
|
||||
r_29[0]["id"] == "controller" and r_29[0]["ok"] and not r_29[0]["warn"]
|
||||
and "29 seconds ago" in r_29[0]["text"])
|
||||
check("31 s after a pass it is RED and first, naming the age and the veto",
|
||||
r_31[0] == {"ok": False, "warn": False,
|
||||
"text": "control loop: NO PASS FOR 31 s (layer 1 zeroes the "
|
||||
"inverter after 30 s without a heartbeat)"})
|
||||
r_31[0]["id"] == "controller" and not r_31[0]["ok"]
|
||||
and not r_31[0]["warn"]
|
||||
and "not run for 31 seconds" in r_31[0]["text"]
|
||||
and "0 W after 30 seconds" in r_31[0]["text"])
|
||||
|
||||
|
||||
async def one_pass():
|
||||
|
||||
Reference in New Issue
Block a user