UX-13 P5: Dutch text, STYLE check, DOCS screenshots, period editor
checks / unit (pull_request) Successful in 10m45s
infra-pin / fresh (pull_request) Successful in 1s

- app/ui_text/nl.json and app/uitext.py: every page word in Dutch, English
  fallback per key; the page picks by browser language. Home's sentences
  move into ui_text `home_words`, so /status?lang=nl builds them in Dutch.
- test_ui_text.py: EN/NL key and placeholder parity, STYLE limits, jargon
  lists for both languages, no inline details, untranslated Dutch caught.
  Shared rules moved unchanged to tools/style_rules.py.
- tools/ux13_screenshots.sh/.py: DOCS screenshots from the demo fixtures in
  headless Chromium; docs/img/ux13/. Battery modes (P3): no screenshot.
- "Other time windows": a list editor (ui.periods) that builds
  static_profile and names bad times, empty prices, overlaps and gaps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Claude dev agent
2026-09-28 16:33:32 +02:00
parent 8c34647d05
commit 667b8e9145
38 changed files with 1633 additions and 300 deletions
+28 -1
View File
@@ -10,7 +10,8 @@ own validator run over them.
The wizard edits the page model one step at a time and saves it through
uipage.to_options(), like the Installer view. `blobs()` walks each step's
choices (meter source and sign, one to three inverters, solar rows, every
contract and price source, region, peak limit, shadow mode) from a new
contract and price source, time windows (P5), region, peak limit, shadow
mode) from a new
install as shipped, one with a power request entity, and the TEST-23 sites, and keeps what the shipped validator
accepts, because the wizard saves nothing it refuses. test_setup.py checks
the set; `--supervisor` runs it through Supervisor 2026.08.0's `AppOptions`
@@ -103,6 +104,29 @@ PRICES = {
"csv": {"ui.contract": "dynamic", "price_provider": "manual_csv",
"price_csv_path": "/share/prices.csv", "ui.fallback": "fixed",
"ui.fixed_price": 0.3},
# P5: the time-window editor, odd windows the day/night preset cannot say.
"periods": {"ui.contract": "custom", "ui.fallback": "custom",
"ui.periods": [
{"from": "06:30", "to": "21:15", "days": "mon-fri",
"price": 0.31},
{"from": "21:15", "to": "06:30", "days": "mon-fri",
"price": 0.19},
{"from": "00:00", "to": "12:00", "days": "sat",
"price": 0.2},
{"from": "12:00", "to": "24:00", "days": "sat",
"price": 0.25},
{"from": "00:00", "to": "24:00", "days": "sun",
"price": 0.18}]},
"periods_one": {"ui.contract": "custom", "ui.fallback": "custom",
"ui.periods": [{"from": "00:00", "to": "00:00",
"days": "mon-sun", "price": 0.29}]},
"dynamic_periods": {"ui.contract": "dynamic",
"price_provider": "generic_dayahead",
"ui.fallback": "custom", "ui.periods": [
{"from": "07:00", "to": "23:00",
"days": "mon-sun", "price": 0.32},
{"from": "23:00", "to": "07:00",
"days": "mon-sun", "price": 0.21}]},
}
REGIONS = {"flanders": {"ui.region": "flanders"},
"own": {"ui.region": "own", "price_taxes_eur_kwh": 0.15}}
@@ -139,6 +163,9 @@ def plans():
"shadow": "on"},
{"meter": "mqtt", "roster": "two", "solar": "none",
"prices": "formula", "region": "flanders", "peak": "low",
"shadow": "on"},
{"meter": "dsmr", "roster": "two", "solar": "one",
"prices": "periods", "region": "flanders", "peak": "forecast",
"shadow": "on"}):
seen.append(plan)
return seen