From 03ebc6246d38ebffe68eb33e064242774f89bf6b Mon Sep 17 00:00:00 2001 From: Dusan Vojacek Date: Wed, 29 Apr 2026 15:45:23 +0200 Subject: [PATCH] fxi ba81 maximum price sell --- .../R__063_fn_load_planning_slots_full.sql | 22 ++----------------- docs/04-modules/planning.md | 1 + 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/db/routines/R__063_fn_load_planning_slots_full.sql b/db/routines/R__063_fn_load_planning_slots_full.sql index 46daec2..3f9dd45 100644 --- a/db/routines/R__063_fn_load_planning_slots_full.sql +++ b/db/routines/R__063_fn_load_planning_slots_full.sql @@ -309,6 +309,7 @@ begin v_discharge_target_wh := v_exportable * v_discharge_buf; -- Rozpočet na půl dne (Europe/Prague): 00:00–12:00 vs 12:00–24:00; chybějící segment dostane celý budget. + -- Nabíjecí rozpočet dál dělíme 50/50 (kvůli rozprostření v rámci dne), ale exportní vybíjení volíme globálně podle sell_price. select coalesce( count(*) filter ( @@ -328,18 +329,12 @@ begin if v_n_am <= 0 then v_chg_am_wh := 0; v_chg_pm_wh := v_grid_target_wh; - v_dis_am_wh := 0; - v_dis_pm_wh := v_discharge_target_wh; elsif v_n_pm <= 0 then v_chg_am_wh := v_grid_target_wh; v_chg_pm_wh := 0; - v_dis_am_wh := v_discharge_target_wh; - v_dis_pm_wh := 0; else v_chg_am_wh := v_grid_target_wh / 2.0; v_chg_pm_wh := v_grid_target_wh - v_chg_am_wh; - v_dis_am_wh := v_discharge_target_wh / 2.0; - v_dis_pm_wh := v_discharge_target_wh - v_dis_am_wh; end if; -- charge mask (sloupce temp tabulky kvalifikujeme: RETURNS TABLE dělá PL proměnné stejných jmen) @@ -390,22 +385,9 @@ begin for r_slot in select wk.slot_ord from _ems_plan_slot_wk wk - where extract(hour from wk.interval_start at time zone 'Europe/Prague') < 12 order by wk.sell_price desc, wk.slot_ord desc loop - exit when v_cum >= v_dis_am_wh; - exit when v_per_slot_discharge_wh <= 0; - update _ems_plan_slot_wk wk set allow_discharge_export = true where wk.slot_ord = r_slot.slot_ord; - v_cum := v_cum + v_per_slot_discharge_wh; - end loop; - v_cum := 0; - for r_slot in - select wk.slot_ord - from _ems_plan_slot_wk wk - where extract(hour from wk.interval_start at time zone 'Europe/Prague') >= 12 - order by wk.sell_price desc, wk.slot_ord desc - loop - exit when v_cum >= v_dis_pm_wh; + exit when v_cum >= v_discharge_target_wh; exit when v_per_slot_discharge_wh <= 0; update _ems_plan_slot_wk wk set allow_discharge_export = true where wk.slot_ord = r_slot.slot_ord; v_cum := v_cum + v_per_slot_discharge_wh; diff --git a/docs/04-modules/planning.md b/docs/04-modules/planning.md index 6004df6..034c59b 100644 --- a/docs/04-modules/planning.md +++ b/docs/04-modules/planning.md @@ -24,6 +24,7 @@ - měkký cíl na konci 24h přes `_soc_security_profile` + tvrdé dvouúrovňové pravidlo výše. - **Dynamická ekonomická podlaha (fáze 2):** - `_dynamic_arb_floor_wh_series`: podle součtu FVE výkonu v dalších ~8 h (`ARB_LOOKAHEAD_SLOTS`) se `arb_floor_wh[t]` posouvá mezi `min_soc_wh` a rezervou z DB – silné očekávané slunce ji sníží (ráno / po obloze); vynutit konstantní chování lze `battery.disable_dynamic_arb_floor=True` jen pro testy / ladění. +- **Výběr exportních slotů (`allow_discharge_export`):** `ems.fn_load_planning_slots_full` omezuje, ve kterých slotech smí solver vybíjet baterii „nad rámec spotřeby“ pro export do sítě (anti-mikrocyklování). Aktuálně se sloty pro exportní vybíjení vybírají **globálně** podle `sell_price desc` přes celé okno (ne 50/50 AM/PM), aby solver neodkládal vybíjení do levnějších ranních slotů, pokud jsou dražší sloty už večer. - **Záporná nákupní cena:** - horní mez `grid_import` zahrnuje `load_baseline_w` + nabíjení/EV/TČ (bez nekonečného importu). - **Uložené vstupy plánu** (`planning_interval`): `load_baseline_w`, `pv_*_forecast_raw_w`, `pv_*_forecast_solver_w` pro UI a audit.