Align evening push with peak-band candidates and dynamic Wh budget.
Restore _evening_peak_export_indices filter so push slots are chosen from profitable peak-band nights, then ranked by sell until the Wh budget is exhausted—not all profitable night slots and not a fixed top-3. Docs and tests match v39 SoC balance tag. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -85,7 +85,7 @@ Cíl zůstává **maximální ekonomický užitek v celém horizontu**: prodat (
|
||||
flowchart TD
|
||||
A[LP: globální optimum v horizontu] --> B{slot >= 17h a profitable export?}
|
||||
B -->|sell pod nocnim max - 0.05| C[ge_bat = 0: baterie ne pred spickou]
|
||||
B -->|profitable + nocni okno| D[push: sell desc az do Wh rozpoctu]
|
||||
B -->|profitable + peak band noc| D[push: sell desc az do Wh rozpoctu]
|
||||
D --> F[ge_bat >= plny vykon na cap v kazdem push slotu]
|
||||
C --> G[Vysledek: energie zustane na nejdrazsi vecer]
|
||||
F --> G
|
||||
@@ -99,9 +99,9 @@ flowchart TD
|
||||
- **nezakazuje** přebytek FVE do sítě (`ge_pv`).
|
||||
|
||||
3. **v38 — plný výkon v top večerních slotech** (`evening_push_ts`):
|
||||
- kandidáti: profitable ∩ noční okno ∩ `sell ≥ 0`;
|
||||
- push = nejdražší sloty **seřazené `sell` desc**, dokud `kumulované_Wh ≤ push_budget` (`min(available_soc, exportable_full × discharge_slot_buffer)`; `per_slot` ≈ max_discharge × účinnost × 0,25 h) — **počet slotů dynamický** (ne pevné top-3);
|
||||
- při vysokém SoC může být push slotů víc než 3 (např. 40+ kWh rozpočet → ~9–12 slotů podle `per_slot`);
|
||||
- kandidáti: profitable ∩ noční okno ∩ **peak pásmo** (`max sell v úseku − degrad`, shodně s R__063);
|
||||
- push = nejdražší kandidáti **`sell` desc**, dokud `kumulované_Wh ≤ push_budget`; `per_slot` ≈ min(BMS, export cap) × účinnost × 0,25 h;
|
||||
- **počet slotů dynamický** — např. ~40 kWh rozpočet a 3,4 kWh/slot (13,5 kW export) → ~11 slotů, ne pevné 3;
|
||||
- **rolling hysteresis:** při `|Δ peak sell| < 0,5` Kč a `|Δ SoC| < 5 %` držet `evening_push_ts` z předchozího aktivního runu (`_rolling_evening_push_override`);
|
||||
- **v28 push fyzika:** cap `ge_bat ≈ min(export_cap, max_discharge − load)` a v push slotech BMS `load + ge_bat ≤ max_discharge` (ne `bd+ge_bat`, které dvojí započítávalo export); odpovídá Deye SELL — load z baterie, zbytek do sítě až po site cap;
|
||||
- **výsledek:** jeden nejdražší slot → export řádově kW; další drahé sloty **po** prvním push mohou exportovat dle ekonomiky LP.
|
||||
|
||||
@@ -15,7 +15,7 @@ Formát: **datum (ISO)** · stručný důvod · soubory · chování / ověřen
|
||||
|
||||
**Problém:** `_evening_battery_export_push_indices` bral jen **málo slotů** v úzkém pásmu `max−0,05` a při řazení podle rozpočtu mohl vynechat dražší 15min (9,5 Kč) a exportovat později levněji (4,8 Kč). `evening_early` zákaz `ge_bat` platil jen **před** prvním push slotem.
|
||||
|
||||
**Změna (v38):** Kandidáti = **profitable ∩ noční okno**; push = nejdražší sloty **sell desc**, dokud `kumulované_Wh ≤ push_budget` (`discharge_slot_buffer`, SoC nad `min_soc`) — **žádné pevné top-3** (počet slotů závisí na SoC, typ. ~4,3 kWh/slot při 17 kW BMS, home-01 export cap 13,5 kW × 0,25 h ≈ 3,4 kWh/slot v LP). `evening_early` = `ge_bat=0` pro profitable noční sloty pod `peak−0,05` mimo `evening_push_ts` (i po prvním push). Rolling **hysteresis** při malé změně peak sell / SoC.
|
||||
**Změna (v38):** Kandidáti = **profitable ∩ peak pásmo v nočním okně** (`_evening_peak_export_indices`, max sell v úseku − degrad — shodně s R__063); push = nejdražší **sell desc**, dokud `kumulované_Wh ≤ push_budget` (`discharge_slot_buffer`, SoC nad `min_soc`); `per_slot` = min(BMS, export cap) × účinnost × 0,25 h — **počet slotů dynamický** (např. ~40 kWh / ~3,4 kWh ≈ 11 slotů u home-01), **ne pevné top-3**. `evening_early` = `ge_bat=0` pro profitable noční sloty pod `peak−0,05` mimo `evening_push_ts` (i po prvním push). Rolling **hysteresis** při malé změně peak sell / SoC. (Doplněno ve v39: stejná logika, tag `evening-export-soc-balance-v39`.)
|
||||
|
||||
**Soubory:** `backend/services/planning_engine.py`, `backend/tests/test_planning_dispatch_milp.py`, `docs/04-modules/planning.md`.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user