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
73 lines
1.9 KiB
JSON
73 lines
1.9 KiB
JSON
{
|
|
"arbitrage_enabled": false,
|
|
"arbitrage_soc_ceiling": 95,
|
|
"arbitrage_soc_floor": 20,
|
|
"auto_start": false,
|
|
"batt_entity": "sensor.test23_battery_power",
|
|
"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": "ha_signed",
|
|
"p1_export_entity": "",
|
|
"p1_host": "",
|
|
"p1_import_entity": "",
|
|
"p1_net_entity": "sensor.test23_p1_meter_active_power",
|
|
"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": "https://api.energy-charts.info/price?bzn=BE",
|
|
"price_horizon_h": 48,
|
|
"price_markup_eur_kwh": 0.03,
|
|
"price_now_entity": "",
|
|
"price_provider": "generic_dayahead",
|
|
"price_taxes_eur_kwh": 0.06,
|
|
"price_timeout_s": 10,
|
|
"saturation_cycles": 3,
|
|
"saturation_w": 500,
|
|
"setpoint_entity": "number.test23_setpoint_w",
|
|
"sign_disagree_s": 180,
|
|
"sign_disagree_w": 300,
|
|
"site_sign_disagree_s": 325,
|
|
"site_sign_disagree_w": 300,
|
|
"slew_w": 0,
|
|
"soc_entity": "sensor.test23_soc",
|
|
"stale_input_s": 15,
|
|
"static_profile": "",
|
|
"step_w": 10,
|
|
"target_grid_w": -10,
|
|
"unit_sign_disagree_s": 85,
|
|
"unit_sign_disagree_w": 250
|
|
} |