refactor-control-monolith #4

Merged
vojacekd merged 3 commits from refactor-control-monolith into main 2026-05-04 19:07:19 +02:00
Owner

Hotovo. Shrnutí implementace podle plánu:

  1. Deye PASSIVE + PV přebytek (reg108)
    deye_battery_charge_discharge_amps() v backend/services/control/setpoints.py – při bat_w > 0 vždy nenulový nabíjecí proud a discharge_a = 0 (i při grid_w < 0).
    write_inverter_setpoints v inverter.py to volá místo rozvetvené logiky.
    Testy: backend/tests/test_control_deye_passive_pv_charge.py.
  2. SQL + DB (V077, R__063, R__039, R__037, R__087)
    V077__planner_safety_charge_asset_battery.sql: planner_daytime_charge_target_enabled, planner_night_baseload_buffer_percent, planner_daytime_charge_price_quantile, planner_charge_commitment_penalty_czk_kwh.
    fn_load_planning_slots_full: nové sloupce (noční baseload 20–06 Praha, safety_soc_target_wh, lookahead buy/sell, is_daytime_pv_surplus_slot).
    fn_planning_site_context: nové klíče v JSON baterie.
    fn_planning_run_commit: ukládá solver_params z p_run_meta->'solver_params'.
    fn_planning_run_debug(p_run_id) v R__087_fn_planning_run_debug.sql.
  3. Planner (planning_engine.py)
    PlanningSlot + _load_slots + _slot_float_nullable.
    solve_dispatch: měkké safety deficity, rolling charge commitment, návrat (results, ms, solver_snapshot).
    _load_previous_plan_charge_commitment_prev_w, volání z run_rolling_replan.
    _save_planning_run(..., solver_snapshot=...) → run_meta["solver_params"].
    Testy: backend/tests/test_planning_safety_commitment.py; všechna volání v test_planning_dispatch_milp.py rozšířena o třetí návratovou hodnotu.
  4. Dokumentace
    docs/04-modules/control.md, docs/04-modules/planning.md, docs/03-data-model.md, docs/07-mcp-postgres-ems.md.
  5. Ověření
    python3 -m pytest na zmíněné testy + test_planning_dispatch_milp.py: 25 passed.
    ./scripts/flyway_validate_local.sh: u tebe spadlo na neaplikovaných repeatable v lokální DB (očekávatelné bez migrate), ne na syntaxi nových souborů.
    Po deployi (MCP user-postgres-ems, nástroj query)
    select pr.id, pr.solver_params is not null as has_snap from ems.planning_run pr order by pr.id desc limit 5;
    select ems.fn_planning_run_debug(<run_id>);
    U slotů s plánem battery_setpoint_w > 0 a grid_setpoint_w < 0: v ems.modbus_command pro register = 108 hodnota > 0 po exportu.
    Úkol tune-small-site-terminal-soc (migrace 0.9 na BA81/KV1) je zrušený v souladu s plánem („ne slepé 0.9“); v planning.md je doplněná poznámka, že terminal faktor nestačí sám o sobě.
Hotovo. Shrnutí implementace podle plánu: 1. Deye PASSIVE + PV přebytek (reg108) deye_battery_charge_discharge_amps() v backend/services/control/setpoints.py – při bat_w > 0 vždy nenulový nabíjecí proud a discharge_a = 0 (i při grid_w < 0). write_inverter_setpoints v inverter.py to volá místo rozvetvené logiky. Testy: backend/tests/test_control_deye_passive_pv_charge.py. 2. SQL + DB (V077, R__063, R__039, R__037, R__087) V077__planner_safety_charge_asset_battery.sql: planner_daytime_charge_target_enabled, planner_night_baseload_buffer_percent, planner_daytime_charge_price_quantile, planner_charge_commitment_penalty_czk_kwh. fn_load_planning_slots_full: nové sloupce (noční baseload 20–06 Praha, safety_soc_target_wh, lookahead buy/sell, is_daytime_pv_surplus_slot). fn_planning_site_context: nové klíče v JSON baterie. fn_planning_run_commit: ukládá solver_params z p_run_meta->'solver_params'. fn_planning_run_debug(p_run_id) v R__087_fn_planning_run_debug.sql. 3. Planner (planning_engine.py) PlanningSlot + _load_slots + _slot_float_nullable. solve_dispatch: měkké safety deficity, rolling charge commitment, návrat (results, ms, solver_snapshot). _load_previous_plan_charge_commitment_prev_w, volání z run_rolling_replan. _save_planning_run(..., solver_snapshot=...) → run_meta["solver_params"]. Testy: backend/tests/test_planning_safety_commitment.py; všechna volání v test_planning_dispatch_milp.py rozšířena o třetí návratovou hodnotu. 4. Dokumentace docs/04-modules/control.md, docs/04-modules/planning.md, docs/03-data-model.md, docs/07-mcp-postgres-ems.md. 5. Ověření python3 -m pytest na zmíněné testy + test_planning_dispatch_milp.py: 25 passed. ./scripts/flyway_validate_local.sh: u tebe spadlo na neaplikovaných repeatable v lokální DB (očekávatelné bez migrate), ne na syntaxi nových souborů. Po deployi (MCP user-postgres-ems, nástroj query) select pr.id, pr.solver_params is not null as has_snap from ems.planning_run pr order by pr.id desc limit 5; select ems.fn_planning_run_debug(<run_id>); U slotů s plánem battery_setpoint_w > 0 a grid_setpoint_w < 0: v ems.modbus_command pro register = 108 hodnota > 0 po exportu. Úkol tune-small-site-terminal-soc (migrace 0.9 na BA81/KV1) je zrušený v souladu s plánem („ne slepé 0.9“); v planning.md je doplněná poznámka, že terminal faktor nestačí sám o sobě.
vojacekd added 3 commits 2026-05-04 19:07:13 +02:00
planner battery tuning
Some checks failed
CI and deploy / migration-check (pull_request) Failing after 15s
CI and deploy / deploy (pull_request) Has been skipped
335c413232
vojacekd merged commit 87fc9b41cf into main 2026-05-04 19:07:19 +02:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vojacekd/ems#4