chjo2
This commit is contained in:
@@ -44,7 +44,7 @@
|
||||
1. **Globální rozpočet Wh** (`discharge_slot_buffer × exportovatelná kapacita`): sloty podle `sell_price desc`. Před prvním `sell < 0` se z rozpočtu **vynechají** sloty, kde **později tentýž den** existuje `sell` vyšší o více než `degradation` (OTE, ne pevné hodiny 00–04).
|
||||
2. **Večerní špičky per den:** `sell ≥ max(sell) − degradation` jen pro hodiny **≥ 17** (Prague), ne globální max horizontu (jinak by vyhrála půlnoc 3,7 Kč místo večera).
|
||||
3. **Ranní pásmo před prvním `sell < 0`:** hodiny **5–11** téhož kalendářního dne — všechny sloty s `sell ≥ lokální_max_ráno − degradation`; ostatní sloty mezi ranním pásmem a prvním `sell < 0` s nižším sell mají export **zakázán** (žádný dump v 07:30 za 2 Kč). **`charge_acquisition`:** vážený `buy` před prvním exportem **téhož dne** jako záporné výkupní okno.
|
||||
V `solve_dispatch` (AUTO): **`charge_slots`** zahrnuje **`buy < 0`** a při `block_export_on_negative_sell` i **`sell < 0`** s PV přebytkem. **`export_shortfall`** na **`ge_bat`** u všech discharge slotů s marží (`sell > acquisition` / u fixed `sell > buy + degrad`), ne jen u `high_sell_slot`. **`ge_bat` push** (~8 kW) ve všech takových slotech (+ ráno/večer seznam). **`pv_charge_shortfall`** při `sell < 0` + block export. Mimo exportní sloty: **`ge_bat = 0`**. Changelog: [`docs/planning-changelog.md`](../planning-changelog.md).
|
||||
V `solve_dispatch` (AUTO): **`charge_slots`** = `allow_charge` z DB + **`buy < 0`** + všechny sloty **`sell < 0`** s PV přebytkem > 500 W (i bez `block_export_on_negative_sell`, BA81). **`pv_charge_shortfall`** / **`NEG_SELL_CURTAIL_PENALTY`** platí v těchto slotech. Při **`sell < 0`**: safety deficit cílí min. na **92 % `soc_max`**; u **fixního tarifu** `ge_pv ≤ pv_b` (ne export celého přebytku A). **`planner_build_tag`** v `solver_params` pro ověření deploye. **`export_shortfall`** na **`ge_bat`** u discharge slotů s marží. Mimo exportní sloty: **`ge_bat = 0`**. Changelog: [`docs/planning-changelog.md`](../planning-changelog.md).
|
||||
- **Záporná nákupní cena:**
|
||||
- horní mez `grid_import` zahrnuje `load_baseline_w` + nabíjení/EV/TČ (bez nekonečného importu).
|
||||
- **Záporná prodejní cena → tvrdý zákaz vývozu (`ge = 0`)** (`planning_engine.solve_dispatch`): platí ve slotu kde `sell_price < 0`, pokud lokality zapne některou z opcí —
|
||||
|
||||
@@ -152,6 +152,41 @@ where pr.site_id = (select id from ems.site where code='BA81') and pr.status='ac
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-24 (g) — BA81: plateau ~51 % SoC + curtail (run 15848/15849)
|
||||
|
||||
**Problém:** Po replanu stále 06:15 ~6 kW, 06:30–07:30 ~1–2 kW, **07:45–08:45 0 kW + curtail ~9 kW**, SoC plán ~51 %, pak znovu ~3 kW. `solver_params` bez `planner_build_tag` → nasazený backend pravděpodobně **bez** oprav (e)/(f).
|
||||
|
||||
**Příčiny (MCP + kód):**
|
||||
|
||||
1. **`charge_slots` v Pythonu** doplňoval `sell<0` jen při `block_export_on_negative_sell` (KV1). U BA81 (`false`) platily jen masky z DB → bez shortfall penalizace, i když R__063 nastaví `allow_charge` později.
|
||||
2. **`safety_soc_target_wh`** z SQL roste jen k ~reserve + noční baseload (~50 % SoC v poledne). Jakmile `soc ≥ safety`, solver nemá motivaci dobít k `soc_max` v okně záporného výkupu (raději curtail / večerní export).
|
||||
3. **`skip_pv_store_block`** u `pv_b` + fixní tarif: LP smí exportovat FVE při `sell<0` místo nabíjení (home-01 logika nepatří na BA81).
|
||||
|
||||
**Oprava (`planning_engine.py`):**
|
||||
|
||||
- `charge_slots` |= všechny sloty `sell<0` + PV přebytek > 500 W (jako R__063 ř. 787–791).
|
||||
- V okně `sell<0` + `charge_slots`: safety deficit cílí na `max(safety_sql, 92 % soc_max)`.
|
||||
- Fixní tarif: `ge_pv ≤ pv_b_forecast_w` při `sell<0`; `skip_pv_store` jen pro spot, ne fixed.
|
||||
- Objective: odměna `bc_pv` při `sell<0` (`NEG_SELL_PV_CHARGE_REWARD`).
|
||||
- `solver_params.planner_build_tag` = `2026-05-24-neg-sell-v2` (ověření deploye).
|
||||
|
||||
**Deploy:** `docker compose build ems-api && docker compose up -d ems-api` + rolling replan BA81.
|
||||
|
||||
**Ověření MCP:**
|
||||
|
||||
```sql
|
||||
select pr.id, pr.solver_params->>'planner_build_tag' as tag,
|
||||
max(pi.battery_setpoint_w) filter (where pi.effective_sell_price < 0) as max_neg_chg
|
||||
from ems.planning_run pr
|
||||
join ems.planning_interval pi on pi.run_id = pr.id
|
||||
where pr.site_id = (select id from ems.site where code = 'BA81')
|
||||
order by pr.id desc limit 1;
|
||||
```
|
||||
|
||||
Očekáváno: `tag = 2026-05-24-neg-sell-v2`, v ranním okně `sell<0` více slotů s `battery_setpoint_w` ≥ 5000, SoC plán přes ~70 % směrem k 95 %.
|
||||
|
||||
---
|
||||
|
||||
## Šablona pro další záznamy
|
||||
|
||||
```markdown
|
||||
|
||||
Reference in New Issue
Block a user