oprava ranniho nabijeni a oprava bodu T
Some checks failed
CI and deploy / migration-check (push) Failing after 13s
CI and deploy / deploy (push) Has been skipped

This commit is contained in:
Dusan Vojacek
2026-05-26 14:09:19 +02:00
parent 58b0a2f882
commit d1ba864fc0
6 changed files with 415 additions and 76 deletions

View File

@@ -130,7 +130,7 @@ Navazuje na [`planning.md`](planning.md), [`planning-arbitrage-accounting.md`](p
### 4.4 v35 — rampa SoC z PV B, bod T, přebytek ✅
**Tag:** `2026-05-28-neg-sell-b-ramp-v35`
**Tag:** `2026-05-28-neg-sell-b-ramp-v35` (bod T opraven v **v36** — viz níže).
**Kód:** `_neg_sell_pv_b_charge_wh`, `_neg_sell_day_phases` (rampa), `_neg_sell_e_surplus_after_t_wh`, `_neg_sell_day_pv_b_usable_wh` (cushion v33).
@@ -141,6 +141,27 @@ Navazuje na [`planning.md`](planning.md), [`planning-arbitrage-accounting.md`](p
**Ověření:** `NegSellSocPhaseTests::test_b_ramp_t_detach_and_surplus_meta`, MCP `solver_params`.
### 4.5 v36 — přípravné okno neg dne ✅
**Tag:** `2026-05-28-neg-prep-window-v36`
| Problém v35 | Oprava v36 |
|-------------|------------|
| **T** hned na 1. `sell<0` → celý den curtail A | `t_detach``soc_need[t] ≥ 85 % soc_max` + suffix B ≥ zbytek do 100 % |
| Ráno 2. neg dne nabíjí místo exportu | **Pre-neg per den** + cushion **A+B**; `pre_neg_pv_export_slots` pro každý pražský den zvlášť |
| Večer nevybije před zítřejším neg | `neg_evening_before_neg_slots` — výboj večer **D1** |
**Cílová časová osa (např. 27. 5.):**
```text
0709:30 sell ≥ 0 → export FVE (pre-neg, cushion OK)
09:45+ sell < 0 → nabíjení A+B po rampě
~1113 bod T → uvolnění / curtail A, B do domu nebo export
večer 26.5 → vybít bat před neg 27.5 (headroom)
```
**Ověření:** `NegSellPrepWindowV36Tests`, `solver_params.inputs.pre_neg_cushion_by_day`, `neg_evening_before_neg_slots`.
---
## 5. Specifikace rampy (v35 — reference)
@@ -185,18 +206,16 @@ soc_need[t-1] = soc_need[t] - charge_b[t] # clamp ≥ min_soc_wh
Výsledkem je **`soc_need[t]`** — požadované SoC na **konci** slotu `t`, kdyby stačilo jen B.
### 5.3 Bod T (`t_detach`)
### 5.3 Bod T (`t_detach`) — v36
**Definice:** nejmenší `t` v prep části, kde:
**Definice (implementováno v36):** první prep slot `t`, kde současně:
```text
soc_need[t] ≤ soc_detach_wh
soc_need[t] ≥ max(0,85 × soc_max, 0,92 × soc_need[tail_start])
Σ charge_b[t..konec] ≥ (soc_max soc_need[t]) × 1,05
```
kde `soc_detach_wh` může být:
- konfigurovatelné % (náhrada za fixních 80 %), nebo
- odvozené z `soc_need` v okamžiku přechodu („natural“ detach).
**Zrušeno (chyba v35):** `soc_need[t] ≤ soc_need[tail_start]` — platilo vždy na začátku okna.
**Interpretace:**

View File

@@ -50,7 +50,7 @@
**Planner tag v26:** v25 + upřesnění večerního exportu — viz sekce **Večerní export z baterie** níže a changelog v26.
**Planner tag v23:** v22b + **výboj baterie do sítě** před `buy<0` (`_pre_neg_buy_discharge_indices`, sell≥1 Kč/kWh, push `ge_bat` z DB limitů). Viz changelog v23.
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`** (legacy): safety deficit cílí **`soc_max_wh`**; po posledním **`sell < 0`**: **`post_neg_pv_topup`**. **Planner tag v32:** fázované SoC — viz níže.
- **Záporný výkup — strategie home-01 (v32v35 hotovo, v36+ návrh):** Kompletní specifikace (rampa SoC z PV B, bod **T**, termika, bazén, UI curtail): **[`planning-neg-sell-strategy.md`](planning-neg-sell-strategy.md)**. Stručně — **v32:** fáze prep/tail, curtail A. **v33:** export FVE před `sell<0` s forecast pojistkou (B usable). **v34:** tvrdý load-first. **v35:** rampa `soc_need` z PV B, **t_detach**, `E_surplus_after_t` (tag `2026-05-28-neg-sell-b-ramp-v35`).
- **Záporný výkup — strategie home-01 (v32v36 prep hotovo):** **[`planning-neg-sell-strategy.md`](planning-neg-sell-strategy.md)**. **v35:** rampa B. **v36 prep:** oprava **T**, pre-neg per den (cushion A+B), večer D1 (`2026-05-28-neg-prep-window-v36`). **v36 termika** (TČ/TUV) — otevřeno.
- **Před sell&lt;0 — export FVE s forecast pojistkou (v33):** `_pre_neg_pv_export_forecast_cushion_ok` — export FVE v kladných slotech před prvním `sell<0` jen pokud součet predikovaného PV přebytku v sell&lt;0 okně (týž pražský den) pokryje dobítí na prep SoC (× **1,15**). Jinak LP raději nabíjí z FVE (riziko deště). Při splněné pojistce: `bc_pv=0` v `pre_neg_pv_export_ts`, shortfall na `ge_pv`, penalizace `bc_pv`. `solver_params.inputs.pre_neg_pv_export_forecast_ok`, `pre_neg_pv_export_slots`. Testy `PreNegPvExportForecastTests`. U **fixního tarifu** s polem B: **`ge_pv ≤ pv_b`** (ne pv_store **`ge_pv = 0`**). Při **`deye_gen_microinverter_cutoff_enabled`**: **`ge == 0` jen** pokud **`block_export_on_negative_sell`** (KV1), ne kvůli samotnému `z_gen_cutoff` (BA81 musí moci exportovat B při plné baterii). Vstupní **`soc_wh`** z telemetrie se před MILP omezí přes **`_planner_soc_for_solver`** (rezerva ~650 Wh pod `soc_max`, jinak Infeasible při 100 % SoC a dlouhém záporném výkupu). **`planner_build_tag`** v `solver_params`. 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).