Files
goodwe-addon/goodwe_controller/scenarios/ux13/test23/options.baseline.json
T
glenn schrooyenandClaude Opus 5.5 15627c38a6
checks / unit (pull_request) Successful in 9m32s
infra-pin / fresh (pull_request) Successful in 1s
UX-13 P0: layout table, page<->options derivation, warning tier, entity list
The foundation for the new settings page. No visible UI change.

- app/uilayout.py: screen -> group -> part -> field for every option in
  config.yaml (67 fields, 11 derived, 0 hidden), with control, unit, display
  scale, step, entity kind, show conditions, Simple/wizard placement and
  "applies after a restart". Ranges stay in the schema, words in
  translations and the new app/ui_text/en.json.
- app/uimodel.py: options_to_ui()/ui_to_options() for the derived keys (one
  inverter vs the list, solar rows, static_profile from simple prices, a
  year-stamped region preset for the levies figure, and an OPT-11 hook for
  arbitrage_enabled that changes nothing yet). Unchanged derivations write
  the stored values back, so the round trip is exact.
- validate.py: validate.Note, a warn/info tier. Each logged warning is also
  a note when a list is passed; config_notes() adds checks that need live
  data (missing entity, a kW sensor read as W, a limit below this month's
  peak). /config/validate returns them as "notes". No refusal changed: 261
  recorded validator calls, 0 differ (tools/ux13_validator_calls.py).
- GET ha/entities: Home Assistant's entity list for the picker, read through
  hass.states(), cached 30 s, 10 s timeout. When HA is down it answers 200
  with the old list marked old, or an empty list that says why.
- DECISIONS/UX-13-one-layout-table.md amends UX-02's "no option key in UI
  code": keys may appear in uilayout.py and uimodel.py only, both tested.
- Tests: test_uilayout, test_uimodel (round trip over the recorded calls,
  the TEST-23 option files and config.yaml defaults), test_haentities, a
  warning-tier part in test_validate; test_messages scans notes and
  ui_text; test_pv and test_selfconfig part 7 widened on purpose.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LyR88rXETvwhTgx6yHE39p
2026-09-27 23:11:31 +02:00

73 lines
1.8 KiB
JSON

{
"arbitrage_enabled": false,
"arbitrage_soc_ceiling": 95,
"arbitrage_soc_floor": 20,
"auto_start": false,
"batt_entity": "",
"batt_invert": false,
"bms_soc_floor": 10,
"circulation_hold_s": 75,
"circulation_w": 700,
"cycle_cost_threshold_eur": 0.1,
"cycle_floor_s": 15,
"deadband_w": 15,
"delivery_hold_s": 185,
"estop_fitted": false,
"export_price_eur_kwh": 0.04,
"gain": 0.6,
"heartbeat_s": 10,
"integrator_max_w": 0,
"inverters": [],
"log_level": "info",
"maintenance_charge_w": 2000,
"maintenance_discharge_w": 2000,
"maintenance_enabled": false,
"maintenance_hold_min": 120,
"maintenance_interval_days": 28,
"maintenance_soc_floor": 11,
"maintenance_soc_target": 99,
"maintenance_start_hour": 10,
"max_w": 2000,
"meter_entity": "sensor.p1_meter_active_power",
"meter_freeze_s": 300,
"meter_invert": false,
"meter_max_age_s": 30,
"meter_mqtt_topic": "",
"meter_phases": 1,
"meter_poll_s": 5,
"meter_source": "off",
"p1_export_entity": "",
"p1_host": "",
"p1_import_entity": "",
"p1_net_entity": "",
"p1_phase_export_entities": [],
"p1_phase_import_entities": [],
"p1_phase_net_entities": [],
"peak_cap_w": 3500,
"peak_forecast_entity": "",
"peak_soc_floor": 20,
"price_avg_entity": "",
"price_csv_path": "/share/goodwe_prices.csv",
"price_feed_url": "",
"price_horizon_h": 48,
"price_markup_eur_kwh": 0.03,
"price_now_entity": "",
"price_provider": "off",
"price_taxes_eur_kwh": 0.06,
"price_timeout_s": 10,
"saturation_cycles": 3,
"saturation_w": 500,
"setpoint_entity": "",
"sign_disagree_s": 180,
"sign_disagree_w": 300,
"site_sign_disagree_s": 325,
"site_sign_disagree_w": 300,
"slew_w": 0,
"soc_entity": "",
"stale_input_s": 15,
"static_profile": "",
"step_w": 10,
"target_grid_w": -10,
"unit_sign_disagree_s": 85,
"unit_sign_disagree_w": 250
}