Přeskočit obsah

Ří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:

  1. 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).
  2. Baterie (64 kWh) — uloží na drahou večerní/noční spotřebu, nebo na ranní/večerní prodej.
  3. Patrony (EP1 3 kW v TV + EP2 5 kW v AK) — COP 1, neefektivní, jen jako přepad když kompresor nestíhá.
  4. Wallbox v PV režimu — když auto stojí a nespěchá, 22 kW pohltí i polední špičku celou; nejlepší dump přebytku.
  5. Chlazení (letní dump, je-li horko) — Daikin split; TČ active cooling k ověření zapojení.
  6. Dodávka do sítě ≤ 12,5 kW — jen v drahých hodinách, nebo proti curtailmentu.
  7. 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_guard přepínač sama vypne (práh input_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í Jinja states()|float(0) + guard na unavailable):
  • 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.sun elevation > 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 > 14 A SOC < 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 atribut today/now() (vrací None). Grid-overflow guard počítej z 2–5 min průměru victron_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_akumulacky 5 kW → switch.ftv_do_boileru 3 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, vzor daikin_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.

  1. 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 HA modbus.write_register (single master) — pymodbus jako druhý master kolidoval a shodil rollback. Detail decision_log 2026-06-21.
  2. 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_enabled master, …_patrony_povoleny, input_number…strop). Pozorovat v slunné poledne, jestli signál + PV-rise sedí na realitu.
  3. 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.
  4. 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á.
  5. 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:
  6. 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č).
  7. 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.)
  8. 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é.
  9. 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.