Řízení přebytků FTV (návrh)
[!WARNING] Toto je návrhová rozvaha, ne popis běžícího stavu. Řízení přebytků zatím NENÍ nasazené — dům se chová podle nativní regulace TČ a Victronu (Dynamic ESS nastavené instalační firmou). Tato stránka popisuje, jak to chceme řídit, a slouží jako podklad pro implementaci. Aktuální stav úkolů viz todos.
[!NOTE] Co dnes dělá nastavení firmy (a proč to nestačí), ověřeno 2026-06-19: baterie (64 kWh) se kvůli JV orientaci hlavního pole naplní na 100 % už k polednu; firma nastavila zákaz dodávky pod OTE 0,5 Kč/kWh, takže v levných polednech systém přetok zavře a plnou baterii + přebytek řeší curtailmentem PV (Victron sráží Fronius). Ta mařená výroba je přesně to, co má tahle kaskáda zachytit do tepla. Detaily: FTV → Dodávka do sítě a decision_log 2026-06-20.
Proč vůbec řídit
Od 13. 6. 2026 dům dodává přebytky FTV do sítě. Klíčová ekonomická asymetrie (viz Ceny a tarify):
- Odběr ze sítě = fix, a drahý: VT 4,92 / NT 3,98 Kč/kWh.
- Výkup přebytku = spot − 0,30 Kč/kWh: ve špičce ~3, v poledne klidně 0,2.
Z toho plyne jediné pravidlo, ze kterého všechno ostatní vychází: spotřebovat přebytek doma je skoro vždy cennější než ho dodat do sítě. Cílem řízení je posílat přebytek tam, kde má největší hodnotu, a dodávat do sítě jen to, co by se jinak zmařilo nebo co se prodá draho.
Hierarchie — kam s přebytkem (kaskáda)
Seřazeno podle hodnoty 1 kWh přebytku:
- Kompresor TČ (do tepla: dům / TV / bazén) — COP ~3–4, ušetří drahý fix. Příkon ~6 kW. Řízeno Modbus surplus registrem (2775/2777 — TČ si přebytek rozdělí samo).
- Baterie (64 kWh) — uloží na drahou večerní/noční spotřebu, nebo na ranní/večerní prodej.
- Patrony (EP1 3 kW v TV + EP2 5 kW v AK) — COP 1, neefektivní, jen jako přepad když kompresor nestíhá.
- Wallbox v PV režimu — když auto stojí a nespěchá, 22 kW pohltí i polední špičku celou; nejlepší dump přebytku.
- Chlazení (letní dump, je-li horko) — Daikin split; TČ active cooling k ověření zapojení.
- Dodávka do sítě ≤ 12,5 kW — jen v drahých hodinách, nebo proti curtailmentu.
- Curtailment (zaříznutí výroby) — poslední možnost; v levném poledni se nehoní.
Klíčové principy
- Proaktivní TČ, ne reaktivní. Kompresor (~6 kW) je nejpomalejší, ale nejefektivnější (COP) kanál vs pole 26 kWp. Pouštět ho do tepla brzy (dopoledne), jakmile přebytek spolehlivě převýší spotřebu domu, a držet nasycený celý den — ne čekat, až se nabije baterka, a pak nárazově zapínat TČ + hned patrony. Důsledek: víc přebytku jímáno efektivně, baterka se plní pomaleji (polední špička má pořád kam → míň mařené výroby), a kompresor míň startuje (šetrnější).
- Přetok 12,5 kW je vzácný zdroj. Dům smí do sítě dodávat max 12,5 kW (limit připojení/dotace, viz FTV → Dodávka do sítě). Tenhle omezený „kanál" se vyplatí používat v nejdražších hodinách (ranní/večerní špička), ne v levném poledni. Baterie slouží k časovému posunu výroby z levného poledne do drahé dodávky.
- Teplo je denní buffer, ne sezónní zásoba. Bazén má strop 32 °C, akumulačka a TV jsou malé. Po prvním slunném dni jsou nahřáté a další dny pojmou jen málo. Ve vícedenním slunci proto teplo nestačí a rozhoduje dodávka + baterka; část poledního přebytku se zamaří — a to je v pořádku, protože polední kWh má hodnotu jen ~0,2 Kč.
- Akumulačka je noční buffer jen v topné sezóně. V zimě z ní topí vzduchotechnika bazénové haly (~2 kW v noci) → nahřát ji odpoledne přebytkem předzásobí noční spotřebu haly z FV místo z nočního nákupu. V létě je ale AK slepá ulička pro přebytek: kompresor ji nenatopí (gating stop-temp) a VZT z ní neodebírá (hala teplo nepotřebuje, okruh DG1 ventil neotevře) — ověřeno ~38 W standing-loss rozpadem, decision_log 2026-06-22. Patrona do AK v létě = zmařená elektřina (COP 1, teplo se nespotřebuje).
Cenově řízená dodávka — dnešní i zítřejší spot
Spotová křivka (OTE zveřejní dnešní i zítřejší ceny, zítřejší po ~14:00) je samostatný vstup řízení, vedle předpovědi výroby:
- Dodávej jen ve špičkách křivky nad prahem. Výkup = OTE − 0,30 Kč/kWh; má smysl jen v lokálních maximech ceny nad prahem, ne plošně. Omezený přetok 12,5 kW patří do nejdražších hodin.
- Záporná (nebo podprahová) cena → „cpát vše do domu". Když je výkup záporný, dodávka tě stojí peníze — platíš za to, že dodáváš. Tehdy:
- Maximalizuj domácí spotřebu — TČ na plno, patrony, wallbox, nabíjení baterky, v létě i chlazení — pohlť přebytek doma, i kdyby to bylo „neefektivní" (patrona COP 1, přetopení nad obvyklou potřebu). Každá nedodaná kWh je ušetřená ztráta.
- Curtailment (zaříznutí) má přednost před dodávkou — nula je lepší než záporná cena. Pořadí za záporné ceny: domácí spotřeba (kamkoli to jde) → curtailment → nikdy dodávka.
- Pozor — na nákupní straně záporné ceny nehrají. Odběr máš za fix, takže levný/záporný spot nevyužiješ k „levnému nákupu ze sítě" (platíš fix vždy). Spotová cena tě zajímá jen na straně výkupu (kdy a zda dodávat).
- Zítřejší ceny řídí, kolik kapacity držet. Zítra drahá ranní/večerní špička → dnes večer drž baterku plnější (rezerva na zítřejší prodej). Zítra levné/záporné poledne → nemá smysl dnes šetřit kapacitu „na zítřejší prodej" (nebude co prodat) → dnes buď štědřejší se spotřebou i prodejem.
Tahle cenová vrstva se kombinuje s předpovědí výroby v defenzivním rozhodnutí níže.
Export módy — ruční přepínač dodávky (nasazeno 2026-06-22)
Dodávku do sítě řídí přepínač input_boolean.ftv_max_export na FTV dashboardu (sekce „↗️ Max prodej"). Píše Victron ESS grid setpoint přes HACS victron_mqtt (zapisovatelné number entity na Cerbu). Dva módy:
| Mód | Přepínač | Co dělá |
|---|---|---|
| 1 Samospotřeba | OFF (default) | grid setpoint 0 → PV nabíjí baterku, do sítě jde až přebytek po plné baterce. |
| 3 Max prodej | ON | grid setpoint −12500 → export 12,5 kW, vybíjí baterku do floor (input_number.ftv_export_min_soc, def. 20 %); přetok >12,5 kW → baterka. |
Mode 2 („export PV první, nikdy nevybíjet") záměrně NEEXISTUJE — v nativním Victron ESS je nedosažitelný (ESS vždy nabíjí baterku před exportem; jediná páka na export-first je záporný setpoint, který vybíjí baterku; min SoC=100 spustí nákup ze sítě). Detail decision_log 2026-06-22.
Kdy zapnout Mode 3 (přepínač je ruční — chytré prediktivní zvedání je Fáze 3):
- Výkup = OTE − 0,30 Kč/kWh (marže EnerSpot, ne distribuce). Pod OTE 0,30 je výkup ≤ 0 → cenová pojistka
ftv_export_guardpřepínač sama vypne (práhinput_number.ftv_export_prah_vykup, def. 0). - Mode 3 vybíjí baterku (~1,2 Kč/kWh opotřebení), takže reálně dává smysl až od OTE ≳ 1,5 Kč/kWh (ranní/večerní špička). V poledne ne.
- Ranní prodej se vyplatí, jen když je jistota odpoledního dobití z jinak-mařeného přebytku (slunný den, baterka míří na 100 % před polednem). Bez té jistoty prodáváš energii, kterou večer dokoupíš za fix (OTE by musel přes 4,28 = vzácné). Viz „Defenzivní rozhodnutí" níže.
Bezpečnostní obálka (grid setpoint je perzistentní na Cerbu — drží i bez HA):
- Reset na Mode 1 ve 23:00 a na startu HA (
ftv_export_reset) — Mode 3 nikdy nezůstane zaseknutý přes noc (jinak by vybíjel baterku do sítě i za nevýhodnou cenu). - Read-back zapsaného setpointu + notifikace při neshodě; Mode 3 vypne TČ boost (aby TČ nežral energii určenou k prodeji).
- Reziduální riziko: když HA leží přes noc v Mode 3, baterka se vybíjí do floor (20 %) — chrání jen ten floor. Pro větší rezervu zvyš
ftv_export_min_soc.
Počítadlo výdělku: sensor.vykup_vydelek_dnes (Kč) = denní integrál export × výkupní cena (sensor.vykup_cena_aktualni = OTE−0,30). Na dashboardu vedle „Dodáno dnes".
Defenzivní rozhodnutí o ranním prodeji
Jádro „chytré" části: ráno se rozhodnout, kolik se vyplatí prodat v ranní (drahé) špičce, aniž by dům večer skončil na drahém nákupu. Rozhodnutí závisí na zítřejším počasí:
| Zítřek (pesimistický odhad) | Kolik nechat v baterce večer |
|---|---|
| Špatné počasí | hodně — přežít noc + celý zatažený zítřek z baterky (skoro plná) |
| Přebytky | málo — stačí přežít do zítřejšího náběhu FV (~25 kWh, ~40 % baterky) |
Pravidlo:
rezerva = závisí na zítřku (viz tabulka)
dobiji_dnes = odhad zbytku dnešní výroby, PESIMISTICKY
prodatelné_ráno = aktuální_SOC + dobiji_dnes − rezerva − bezpečnostní_floor
když prodatelné_ráno > 0 a ranní spot je vysoký:
prodávej ráno (do 12,5 kW), a TČ pusť AŽ PO ranní špičce
Pojistky:
- Pesimistický odhad výroby u obou dnů — když se spleteme, spleteme se ve prospěch rezervy.
- TČ až po ranní špičce — během prodeje kompresor nepouštět, jinak žere výrobu/baterku určenou k drahému prodeji.
- Tvrdý SOC floor pod vším — úroveň, pod kterou se nevybíjí nikdy (pokrytí noci, i kdyby předpověď úplně selhala). Brání scénáři „prodal jsem ráno, odpoledne přišly mraky, večer kupuju za VT".
Nepravidelné velké spotřebiče
- Wallbox (až 22 kW) — dvojí povaha. Flexibilní (auto má čas) = nejlepší dump přebytku, řídit PV-trackingem. Urgentní (musí nabít na ráno) = velký odběr, časovat do levného okna (NT/HDO nebo levný spot), ne sežrat baterku určenou na noc. Řízení musí znát stav wallboxu (připojeno / kolik dobít / deadline).
- Sauna — večerní/víkendový nárazový odběr mimo sluneční okno, na přebytky nemá vliv, ale zvedá noční spotřebu. Řešení: manuální přepínač „dnes sauna" zvedne večerní rezervu; SOC floor pojistí i bez něj.
- Princip: předpověď řeší obvyklý den; manuální přepínače (plánovaná sauna / odjezd autem) řeší výjimky; SOC floor + watchdog pojišťují nepředvídatelné odběry.
Údržbové omezení: full charge baterky ≥ 1× za 14 dní
LiFePO4 baterie potřebuje pravidelné nabití na 100 % — BMS jen tam vyrovnává články a rekalibruje hlášený stav nabití. Má přednost před arbitráží: když se blíží 14 dní od posledního 100 %, vybrat nejbližší slunný den jako „kalibrační" (ten den ráno neprodávat, dobít na plno z přebytku zadarmo). Když slunce nepřijde včas, vynutit i za cenu nákupu.
Signál přebytku — jak poznat, že se maří (revize po review 2026-06-20)
Detekce „teď se curtailuje, je co odklonit" je dvoustupňová — samotný MPPT flag nestačí (fíruje i při běžném CC/CV dobíjení plné baterie, kdy se nic nemaří):
- Stupeň 1 — hypotéza (
binary_sensor.ftv_surplus_curtailed, nový template,for: 180s). ON, když platí VŠE (defenzivní Jinjastates()|float(0)+ guard naunavailable): - SOC ≥ ~97 % (
sensor.victron_mqtt_system_0_system_dc_battery_soc) - battery_power < ~300 W — baterie se už nenabíjí (
…dc_battery_power, + = nabíjení) - slunce nad obzorem (
sun.sunelevation > 5°) → v noci automaticky OFF - aspoň jeden MPPT v
voltage_current_limited(…solarcharger_{0,1,279}_…_mppt_operation_mode) - export nedostupný/nevýhodný: OTE < 0,50 (HW práh firmy, ne 0,30) NEBO N0 % blokace (
…digitalinput_1_…_state) - balancing interlock: NE (
dní_od_plného > 14ASOC < 100) — když je balancing po termínu, nech PV nejdřív dorovnat baterii na 100 % - Stupeň 2 — potvrzení (reaktivně, ne v template): po zapnutí prvního sinku sleduj, zda PV reálně vzrostlo o smysluplnou marži do ~90 s. PV-rise je jediný jednoznačný důkaz, že curtailment existoval. Když PV nevzroste → curtailment byl falešný → sink vypni.
Známé pasti (z review): spotová cena se čte přes
states('sensor.current_spot_electricity_price_15min'), ne přes atributtoday/now()(vracíNone). Grid-overflow guard počítej z 2–5 min průměruvictron_grid_power_total(+ import / − export), ne z denních utility_meter čítačů (bugují na resetu Cerba).
Pásmo OTE 0,30–0,50 (firma neexportuje, ale výkup OTE−0,30 by byl ještě kladný): přebytek jímej doma (rozhodnutí 2026-06-20) — bezpečnější než nechat panely ořezávat.
Jak se to bude řídit (architektura)
- v1 = nativní HA YAML (automatizace
choose/for+ fail-safe automatizace). Řídí jen patrony (switch.ftv_do_akumulacky5 kW →switch.ftv_do_boileru3 kW) a voláscript.klima_pv_soak(léto). Na dvě relé a jeden script netřeba AppDaemon — KISS. - Fáze 2 = AppDaemon appka (
appdaemon/apps/ftv_surplus.py, vzordaikin_modbus.py) pro kompresorovou modulaci přes Modbus 2775/2777 se spojitým setpointem + watchdog + debounce. Mozek pro spojité řízení dává smysl; pro binární relé ne. Staví se až po ověření zapisovatelnosti (Fáze 0). - Fail-safe nezávislý na mozku: patrony řídí nativní automatizace s force-OFF na (master-off / signál
unavailable/ slunce pod obzorem / start HA). OFF je default po startu — žádné zaseklé 5+3 kW přes noc, i kdyby appka spadla. - Charakterizace (kapacity, COP, rychlosti jímání, noční spotřeba) → Python skript v
scripts/.
Pozor: AppDaemon je tu jen nástroj. Dům musí fungovat i bez něj — když appka neběží, TČ i Victron jedou ve své nativní regulaci, jen bez optimalizace.
Stav a další kroky — fázovaný rollout (revize 2026-06-20)
Klíčová realita (Fáze 0 dokončena 2026-06-21): Modbus 2775/2777 jsou zapisovatelné a drží, ale kompresor přes ně NEnaskočí — surplus-by-BUS je součást e-Manager funkce, která není zapnutá (+ chybí CEM elektroměr; projekt je vynechal). Registry jsou inertní. Kompresor proto čeká na A-BUS (Veskom zapne e-Manager) nebo B (HA řídí setpointy přímo, bez e-Manageru) — viz Fáze 2. Buildovatelná v1 = patrony (COP 1) přes HA relé + léto klima ≈ 60–70 % hodnoty, funguje dnes bez TČ commissioningu. Detail decision_log 2026-06-21.
- Fáze 0 — verification gate. HOTOVO 2026-06-21: 2775/2777 + offsety 2725/2727 zapisovatelné a drží (Bus control v menu zapnutý), ale kompresor inertní — e-Manager „Surplus control" není zapnutý a chybí CEM elektroměr (control manuál 3.2.7). Read-only diagnostika
scripts/ecoforest_surplus_probe.py. Lekce: zápisy do TČ jen přes HAmodbus.write_register(single master) — pymodbus jako druhý master kolidoval a shodil rollback. Detail decision_log 2026-06-21. - Fáze 1a — signál + helpery (read-only, nulový dopad):
binary_sensor.ftv_surplus_curtailed,sensor.ftv_surplus_state, helpery (input_boolean.ftv_surplus_rizeni_enabledmaster,…_patrony_povoleny,input_number…strop). Pozorovat v slunné poledne, jestli signál + PV-rise sedí na realitu. - Fáze 1b — minimální živé řízení (jeden sink): nativní automatizace řídící POUZE EP2 (5 kW) na potvrzeném signálu + fail-safe + master kill-switch. Pár dní sledovat: žádný limit-cycling, žádné zaseklé relé, balancing interlock funguje.
- Fáze 1c — rozšířit kaskádu: přidat EP1 (3 kW) s global dwell po EP2 a
script.klima_pv_soak(léto). Tím je v1 hotová. - Fáze 2 — kompresor (špičková COP hodnota; blokováno na e-Manageru, viz Fáze 0). Dvě cesty, obě s HA jako mozkem (jen HA ví o baterii/spotu) a přes HA
modbus.write_register: - B — HA řídí setpointy přímo (preferováno k testu): při přebytku HA píše
2705=1 (DHW demand by bus) +2720=600 (TV 60 °C),2713+2722(AK 48 °C); při konci přebytku stáhne zpět. Bez e-Manageru/CEM, funguje hned. Watchdog povinný (stáhne setpoint při zastaralých datech, jinak TČ dotápí ze sítě — downside ohraničený: nádrže cappnou, 60 °C cutoff + směšovač). - A-BUS — Veskom zapne e-Manager, krmený z HA přes
2777(TČ samo moduluje + distribuuje). Elegantnější, čeká na firmu + potvrzení BUS-only bez CEM. (A-CEM zamítnuto — autonomní honění bilance by se pralo s Victron ESS.) - Offsety rozhodnuty: TV +12 → 60 °C (2725=120), AK +18 → 48 °C (2727=180). Bazén přes kompresor (ne přímý switch — souboj s Aseko); filtrace běží ~12 h/den + lze přes relé → reálné.
- Fáze 3 — prediktivní + wallbox: Forecast.Solar (orientace doložena 2026-06-20 — dům JV 121°/35° → Fronius; carport 26 ks ~2° split J/S → Victron MPPT; konfigurace rovin v FTV → Vstupy pro Forecast.Solar), wallbox PV-tracking (22 kW, OCPP), defenzivní ranní arbitráž.
Bazén je v1 vyřazen z aktivního řízení (na stropu 32 °C + dual-writer s Aseko mirror) — vrací se s kompresorem ve Fázi 2; filtraci surplus nikdy neforsuje (chemie/dávkování řídí Aseko).
Souvislosti: Ceny a tarify · FTV · Tepelné čerpadlo · rozhodnutí v decision_log.