EaSun · ESP32-Grid-Load-Vypocet700 · placené AI

AI placené — Google Gemini API

Návod pro cloudové Gemini (účet aistudio.google.com) jako volitelnou placenou vrstvu: denní plán a české vysvětlení nad daty z aplikace a lokálních měření (počasí/FVE Wh, spot OTE, telemetrie). Teplota / Wh / Kč/MWh se berou vždy z aplikace a měření — nikdy z Gemini. Lokální „AI zdarma“ (ASSIST/AUTO/SHADOW) zůstává v ai-rozvoj.html — toto je jiná větev.

1. Rozdíl: AI zdarma vs AI placené (Gemini)

AI zdarma (lokální)AI placené (Gemini)
Kde běží ESP32 (vypocet02.h) Google cloud → přes backend (api.easun.eu)
Frekvence každý výpočetní cyklus (sekundy) 1–24× denně (plán), případně hodinově
Vstup MQTT W, SOC, LUX, Spot, temp stejná telemetrie + weather app + historie + Spot den (čísla jen z ESP / aplikace)
Výstup target PWM (živě) JSON plán / text (okna, bias, vysvětlení) — bez vlastních teplot / Wh / Kč/MWh
Internet ne nutný pro řízení nutný (backend + Gemini)
Náklad 0 Kč / zařízení tokeny Gemini + volitelně Search grounding
UI režim SHADOW / ASSIST / AUTO nový volitelný „AI Cloud / Premium“ (zatím návrh)
Gemini neřídí SSR přímo. Vrací strukturovaný plán; ESP32 (nebo lokální AI) ho aplikuje jen pokud projde safety (teplota, Distr., SOC, Spot Gate, max krok PWM).

2. Google AI Studio — účet, klíč, placená vrstva

Portál Google AI Studio slouží k prototypování promptů a vytvoření API klíče. Samotné UI Studio je zdarma; API má Free tier (nižší limity, vhodné na testy) a po zapnutí billing Paid tier (pay-as-you-go). Oficiální docs: Getting started, Billing, Pricing, API keys.

Kroky (provozovatel EaSun / vývoj)

  1. Přihlášení na aistudio.google.com (Google účet).
  2. Create API key — klíč je vázaný na Google Cloud projekt.
  3. Nejdřív ověřit na Free tier; pro ostrý provoz více zařízení Set up billing (Tier 1+; často prepay min. ~10 USD).
  4. Klíč uložit vždy do zařízení (SPIFFS / konfigurace FW) — nikdy jen na server (env / secrets) ani do prohlížeče uživatele (localStorage).
  5. V AI Studio vyzkoušet prompt (počasí / denní plán) → teprve pak kódovat endpoint.

Co placený tier přináší (oproti free API)

Pozor: předplatné „Gemini“ v telefonu / Google One není totéž jako Gemini API kredity. Pro zařízení potřebujete API klíč z AI Studio (Free tier stačí na testy; billing až pro vyšší limity).

2b. Aktivace Gemini API klíče — postup pro uživatele

Níže je návod, co musí udělat koncový uživatel (majitel zařízení), aby Premium AI mohla volat Gemini. Klíč patří uživateli / jeho Google projektu a ukládá se do zařízení (SPIFFS), ne do prohlížeče.

Doporučení na start: začněte verzí pro testy na Free tier (bez platební karty). Billing zapněte až když Free limity nestačí (časté 429 / denní kvóta).

A. Verze pro testy (Free tier) — doporučeno nejdřív

  1. Otevřete v prohlížeči https://aistudio.google.com/ a přihlaste se svým Google účtem (Gmail).
  2. Poprvé přijměte podmínky služby (Terms of Service). U nových uživatelů AI Studio obvykle automaticky vytvoří projekt + API klíč.
  3. Přejděte na stránku klíčů: aistudio.google.com/app/apikey (nebo v menu: Dashboard → API keys).
  4. Pokud klíč ještě nemáte: klikněte Create API key → vyberte / vytvořte Google Cloud projekt → potvrďte. Klíč se zobrazí jednou — hned si ho zkopírujte (začíná typicky AIza…).
  5. V AI Studio v Playgroundu zkuste krátký prompt (např. „Napiš 1 větu o počasí“) a ověřte, že model odpoví — klíč/projekt funguje. Model pro testy: Flash-Lite nebo Flash (levnější / free limity).
  6. Na zařízení EaSun (web UI / Premium AI) vložte klíč do pole Gemini API key a Uložit — klíč se zapíše do SPIFFS. Neukládejte ho do poznámek na webu ani do localStorage prohlížeče.
  7. Zapněte Premium / AI Cloud (pokud je ve FW) a ověřte, že UI ukáže plán / text (explainCs). Poll držte nízký: 1× denně nebo max 6× denně — Free tier má nižší RPM / denní limity.
Free tier: klíč je zdarma; platíte 0 Kč, dokud nezapnete billing. Limity (požadavky za minutu / den) se liší podle modelu a času — aktuální hodnoty v AI Studio (Usage / rate limits) nebo na Rate limits. Při 429 (quota) snižte frekvenci pollu nebo přejděte na Paid (sekce B).

B. Ostrý provoz (Paid tier) — až Free nestačí

  1. Na stránce API keys / Projects klikněte u projektu Set up billing.
  2. Propojte nebo vytvořte Google Cloud Billing účet, přidejte platební metodu. Často je vyžadována prepay min. ~10 USD (nebo ekvivalent v jiné měně).
  3. Po aktivaci billing má stejný API klíč vyšší limity (Tier 1+). V Google Cloud nastavte budget alert (např. 5–20 USD / měsíc), ať vás překvapení nestojí.
  4. V zařízení klíč neměňte (pokud jste nepřegenerovali). Stačí ověřit, že polly už nevrací 429. Model držte u Flash-Lite / Flash — Pro je zbytečně drahý na denní plán.
Předplatné Gemini v telefonu / Google One neaktivuje API klíč. Musíte vždy projít AI Studio → Create API key (a případně Set up billing).

C. Co uživatel musí / nesmí

MusíNesmí
Mít vlastní Google účet a vytvořit klíč v AI Studio Sdílet klíč veřejně (GitHub, fórum, screenshot)
Uložit klíč do zařízení (SPIFFS) přes UI EaSun Vkládat klíč do prohlížeče jako „trvalé“ uložení (localStorage / cookies)
Na testy začít Free + 1–6 pollů / den + Flash-Lite Hned zapínat Search grounding / Pro model „pro jistotu“
Při kompromitaci klíče: v AI Studio klíč smazat / rotate + uložit nový do ESP Posílat klíč e-mailem / WhatsApp bez nutnosti

D. Rychlá kontrola „funguje to?“

  1. AI Studio Playground odpoví na krátký prompt se stejným projektem.
  2. Klíč je ve FW uložený (po reloadu stránky zůstane maskovaný / „nastaveno“).
  3. Premium ON → do UI přijde text plánu; čísla (temp / Wh / Spot) dál z aplikace, ne z Gemini.
  4. Premium OFF → žádný cloud request; lokální AI zdarma běží dál.

3. Doporučená architektura

ESP32 drží Gemini API klíč v zařízení (SPIFFS) a typicky nevolá generativelanguage.googleapis.com přímo — klíč pošle backendu (proxy). Důvod přímého volání nepoužívat: TLS/RAM, latence, účtování, centralizovaný limit a logování.
┌──────────────┐ telemetrie + lat/lon ┌─────────────────────┐ │ ESP32 │ ───────────────────────────► │ api.easun.eu │ │ (firmware) │ ◄─────────────────────────── │ (PHP / backend) │ │ │ JSON plán / forecast │ │ │ safety PWM │ │ • auth zařízení │ │ AI zdarma │ │ • quota / tarif │ │ Spot Gate │ │ • cache 1–6 h │ │ Gemini key │ │ • proxy Gemini │ │ (SPIFFS) │ │ (klíč z ESP) │ └──────────────┘ └──────────┬──────────┘ │ HTTPS ▼ ┌─────────────────────┐ │ Google Gemini API │ │ (+ volitelně │ │ Google Search) │ └─────────────────────┘ Jediný zdroj čísel (teplota, Wh, Spot Kč/MWh, W, SOC…): lokální měření ESP + stávající aplikace (weather_aplikace.h / OWM / Open-Meteo / OTE). Gemini tato čísla NIKDY nevytváří ani „neopravuje“ — jen z nich skládá plán a text.

Role jednotlivých vrstev

VrstvaOdpovědnost
ESP32 Měření, MQTT, lokální AI, safety, aplikace plánu (cíle, okna), UI Premium ON/OFF, Gemini API klíč v SPIFFS
Backend Proxy k Gemini (klíč přijatý ze zařízení / session), billing/tarif, rate-limit per device, cache, validace JSON schématu, audit log — klíč neukládá trvale
Gemini Jen reasoning a text: „dnes oblačno + drahý spot → nabij ráno…“ — žádná vlastní teplota / Wh / Kč/MWh
Aplikace + lokální měření Jediný zdroj čísel: teplota, W/Wh, Spot Kč/MWh, SOC — weather app, OTE, senzory ESP
Pevné pravidlo: teplota, Wh, Spot Kč/MWh (a vůbec všechna měřená / forecast čísla) se berou vždy z aplikace a z lokálních měření na zařízení — nikdy z Gemini. LLM může čísla vymyslet. Počasí = weather app / API ve FW; Spot = OTE (spotove_ceny.h); výkon/SOC/temp = MQTT / senzory. Gemini z těchto vstupů skládá jen plán a vysvětlení (§4b) — ne hodnoty.

4. Možnosti napojení (use-cases)

A. Denní briefing počasí + FVE

Ráno 1×: české shrnutí dne. Čísla (teplota, oblačnost, Wh dnes/zítra) berou UI / SPIFFS z weather app a lokálních dat; Gemini jen formuluje text kolem těchto hodnot.

B. Plán topení (PWM okna)

Doporučená okna „topit z přebytku“ / „šetřit“ podle forecastu a Spot pásem. ESP aplikuje jen jako bias na lokální AI (agresivita), ne jako přímé PWM.

C. Plán baterie (SOC cíle)

Cílový SOC před drahým pásmem / před zataženým odpolednem; doporučení solarWMin / režim nabíjení. Musí respektovat baterie1/2.

D. Spot + počasí kombinace

OTE křivka dne/zítra + FVE forecast → okna nabíjení, topení z přebytku, vyhnout se drahému grid-heat. Doplňuje lokální Spot Gate — podrobně §4b.

E. Vysvětlení pro laika

Česky 2–4 věty: proč dnes AI topí méně / proč nabíjí / proč „čekáme na levnější Spot“. Vhodné na /ai-live, /spot-config nebo push (budoucí).

F. Analýza logů (offline)

Periodický upload AI run logu na server → Gemini shrne týden: „často dPwm+ při importu“ / „grid-heat v pásmu high“. Pro vývojáře, ne real-time řízení.

Co dává smysl nejdřív (priorita)

PrioUse-caseProč
P0 A + E — briefing + vysvětlení (vč. Spot textu) Nízké riziko, okamžitá hodnota Premium, žádný zásah do PWM
P1 D + B + C — Spot×FVE plán + soft bias topení/baterie OTE data už jsou ve FW; Gemini jen skládá denní strategii
P2 Odhad „nákladů dne“ (Kč) z Spot × import Wh Výpočet vždy v aplikaci / na backendu (OTE × naměřené Wh); Gemini jen popíše výsledek
P3 F — týdenní analýza logů (+ Spot high incidenty) Batch API, levné, pro ladění heuristiky

4b. Spotové ceny a odhady přes Gemini — volitelně (možnost, ne pravidlo)

Spot je možnost, ne povinnost. Cloudová AI i lokální řízení fungují bez Spotu (FVE forecast, baterie, teploty). Zapnete-li Spot / OTE, Gemini může přidat okna low/high a respektovat Spot Gate — ale Spot data nejsou podmínkou Premium vrstvy.
Pokud Spot používáte: ceny samé vždy z OTE (spotove_ceny.h), ne z Gemini ani z Google Search. Bez Spotu: spot.available=false — plán bez Spot oken, nižší důraz na „drahý večer“, zbytek (FVE/baterie) beze změny.

Co už má firmware (vstup pro cloud)

FW zdrojCo poslat do Gemini
Spot_actualPriceCZK / pásmo / levelNum aktuální cena + band low/medium/high
Spot_quarterHourPrices[96] (+ zítra) komprimovaná denní křivka (ne nutně všech 96 bodů — viz §5.1)
limity Low/Med/High z /spot-config uživatelské prahy Gate (stejné jako lokální Spot Gate)
lokální AI Spot Gate (Fáze 3) aktuální gridHeatAllowed — cloud to nesmí přepsat na „ano“ tvrdé

Co Gemini smí odhadnout / doporučit

Ano (plán / text)Ne (čísla / hard)
Najít okna low/high z OTE křivky dodané z aplikace (např. „levné do 11:00…“) Vymyslet, „opravit“ nebo doplnit teplotu / Wh / OTE Kč/MWh
Doporučit nabít baterii před high pásmem (targetSocBeforeHighSpot) Obejít Spot Gate NE / Distr. zákaz importu
Doporučit okna topení z přebytku vs. vyhnout se grid-heat v high Nastavit absolutní PWM / vypnout safety; inventovat forecast Wh / temp
Popsat náklad už spočítaný v aplikaci (OTE × naměřené Wh) Spočítat nebo tvrdit Kč / úsporu X % bez naměřených dat z ESP
Srovnat scénáře „topit teď ze sítě“ vs „počkat na FVE / levný slot“ (text + bias) Brát Spot / počasí / Wh z webu přes Search — vždy data z aplikace; chybí-li → flag false
České vysvětlení pro laika (proč teď nenabíjet / netopit ze sítě) Nahradit lokální Spot Gate, weather app ani senzory jako zdroj čísel

Vrstvy: kdo rozhoduje o Spotu

Aplikace + lokální měření (ESP) → teplota, Wh, W, SOC, Spot Kč/MWh + band + limity │ ├─► Lokální Spot Gate (AI zdarma) = HARD: grid-heat ANO/NE teď │ └─► Gemini cloud plán = SOFT: okna dne, SOC cíl, heat/charge bias, explainCs (čísla jen cituje ze vstupu) Hard vždy vyhrává. Cloud smí být konzervativnější (více „šetřit“), nikdy agresivnější než Gate dovolí při importu ze sítě. Gemini nikdy nedodává vlastní teplotu / Wh / Kč/MWh.

Typické scénáře (pro odladění promptu)

  1. Levné ráno + slunce: chargeBias↑ dopoledne, heatBias↑ z přebytku, grid-heat jen pokud Gate OK.
  2. Drahý večer + zataženo: nabít do high; večer heatBias↓, preferovat baterii; explainCs varuje.
  3. Záporný / velmi low Spot + FVE deficit: soft tip „Gate může povolit grid-heat“ — ale finále = lokální Gate.
  4. OTE výpadek / Spot nepoužíván: spot.available=false → plán bez Spot oken (to je OK — Spot je volitelný); AI zdarma bez Spot korekce.
Odhad „Kolik dnes stojí topení ze sítě“ počítejte vždy v aplikaci / na backendu jako sum(importWh[i] * spotPrice[i]) z naměřených / archivovaných dat + OTE. Hotové číslo (nebo null) pošlete do Gemini jen jako kontext k textu. Gemini nesmí vymýšlet Kč, Wh ani teplotu — bez dat z aplikace jen kvalitativní text.

Související docs: ai-rozvoj.html (Spot Gate Fáze 3), spotové stránky projektu (spotove-ceny.html / /spot-config).

4c. Zobrazení dat Gemini v aplikaci (pro uživatele)

Uživatel na zařízení nevidí surový JSON. Vidí české texty a stav Premium. Čísla (W, °C, Wh, Kč/MWh) zůstávají na stávajících kartách z MQTT / senzorů / weather / OTE. Gemini doplní jen textový kontext a plán.

Priorita P0 (G2): read-only text — žádná změna PWM. Soft bias (G3) uživatel nevidí jako „Gemini PWM“, jen případně mírně jinou agresivitu lokální AI.

Kde co uvidí

Stránka v aplikaciCo z GeminiCo zůstává lokální
/ai-live (hlavní místo) Blok AI Cloud / Premium (RAM-limited, viz níže): krátké explainCs, spotSummaryCs, weatherSummaryCs, confidence, validUntil, 1 řádek tipů oken PWM návrh / safety, LUX, zdroj AI zdarma (SHADOW/ASSIST/AUTO) — stávající AI LIVE beze změny
/weather ≤ 1 ořezaný řádek + odkaz na /ai-live (ne celý briefing 2×) Teplota, oblačnost, Wh dnes/zítra z weather app — čísla nepřepisovat
/spot · /spot-config ≤ 1 ořezaný řádek Spot textu + odkaz na /ai-live OTE křivka, limity Gate, aktuální Kč/MWh — jen z Spot / OTE
/system-modes (nebo Premium nastavení) Přepínač AI Cloud ON/OFF, pole Gemini API key → SPIFFS, stav pollu — bez dlouhého briefing textu Režimy AI zdarma OFF / SHADOW / ASSIST / AUTO
Home (volitelně později) Jen badge / odkaz na /ai-live (žádný odstavec — šetří heap Home) Všechny výkonové a teplotní karty
Náklady dne (P2) costEstimate.commentCs — popis Kč spočítané v aplikaci (OTE × naměřené Wh); Gemini jen text

Jak to uživatel „čte“ na /ai-live (návrh bloku)

┌─ AI Cloud (Premium) ─────────────────────────────┐ │ Stav: ON · plán platný do 22:00 · jistota 0.78 │ │ Počasí: Zataženo, odpoledne přeháňky… │ ← weatherSummaryCs │ Spot: Levnější dopoledne, od 17:00 drahé pásmo… │ ← spotSummaryCs │ Proč: Dnes slabší FVE; Spot dražší večer — │ ← explainCs │ dopoledne nabít, večer topit z baterie. │ │ Tip okna: nabíjet 06–11 · vyhnout se síti 17–21 │ ← plan okna (text) │ [Čísla Wh / °C / Kč/MWh → viz Weather / Spot] │ ← odkaz, ne Gemini └──────────────────────────────────────────────────┘ Pod tím beze změny: AI LIVE (PWM, LUX, AI zdarma)…

Chování podle stavu

Omezení zobrazení kvůli RAM na ESP32 / ESP32-S3

Web UI na zařízení skládá HTML v heapu (AsyncWebServer + String). Cloudová AI proto nesmí přidat velké stránky, plný Gemini JSON ani duplicitní dlouhé texty na každou URL. Zobrazení je úmyslně úsporné.

Jak to bude provedeno

  1. Backend ořeže odpověď před odesláním na ESP: validace schématu, truncate textů, bez hourly křivek ve výstupu pro zařízení. ESP neukládá celý Gemini response — jen kompaktní „UI snapshot“.
  2. Pevné limity znaků (hard truncate + ): explainCs ≤ ~240 znaků (≈ 2–3 věty), spotSummaryCs ≤ ~120, weatherSummaryCs ≤ ~120, okna dne jako jeden krátký řádek ≤ ~80 (např. N06-11 S17-21 / „nabíjet 06–11 · síť ne 17–21“). Celý UI snapshot v RAM / SPIFFS typicky < 1 KB textu (+ pár bajtů stavu: confidence, validUntil, flags).
  3. Úložiště: jeden malý SPIFFS soubor (např. /ai_cloud_ui.ea nebo binární struct) — ne držení velkého String po celou dobu běhu. Po načtení stránky uvolnit dočasné buffery (stejný styl jako idle HTML cache).
  4. Jedno plné zobrazení: kompletní cloud blok jen na /ai-live. Ostatní stránky max. 1 krátký řádek + odkaz na /ai-live (ne kopírovat explainCs třikrát).
  5. HTML skladba: popisky v PROGMEM / F(), hodnoty z char bufferů; žádné vnořené tabulky, žádný Mermaid, žádný raw JSON v prohlížeči na ESP. Minimální CSS (stávající css_minimal styl).
  6. Nepřenášet na UI: celý hourlyToday[], alerts pole jako seznam, costEstimate detaily, system prompt, usageMetadata — to zůstane na backendu / v logu. Bias čísla (heatBias…) jen do řízení (G3), ne jako velký debug dump v HTML.
  7. Home: ideálně jen badge „Cloud OK / neaktuální“ + odkaz — bez vkládání odstavce do už velké Home stránky (kritická pro heap).
StránkaMax. cloud obsah (RAM-friendly)
/ai-live 1 kompaktní blok (~6–10 řádků textu), bez JSON
/weather ≤ 1 řádek (weatherSummaryCs ořez) + odkaz na /ai-live
/spot · /spot-config ≤ 1 řádek (spotSummaryCs ořez) + odkaz
/system-modes ON/OFF, maskovaný klíč, stav pollu (OK/429/err) — bez briefing textu
Home 0–1 krátký badge / odkaz — bez odstavců
ESP heap (zjednodušeně) ┌─ stávající stránka (/ai-live) ─┐ ┌─ cloud UI snapshot ─┐ │ PROGMEM CSS + menu │ │ explain ≤240 │ │ PWM / LUX řádky (malé) │+ │ spotSum ≤120 │ │ … │ │ weatherSum ≤120 │ └────────────────────────────────┘ │ windows ≤80 │ │ meta ~20 B │ └─ celkem ≪ 1–2 KB ───┘ Plný Gemini JSON a OTE 24h pole → NE do HTML; OTE už má vlastní stránky.
Cíl: cloudový blok nesmí způsobit OOM / WDT při otevření /ai-live vedle stávající AI LIVE tabulky. Při nízkém heapu: zobrazit jen stav „Cloud plán uložen — text zkrácen“ nebo přeskočit volitelné řádky (weather/spot sum).
Uživatel nesmí mít dojem, že Gemini „měří“ teplotu nebo Spot. U každého cloud textu držte vizuálně oddělená lokální čísla (nebo odkaz „hodnoty z měření / OTE / weather“).
Uživatelský popis stejného chování: kapitola návodu 21. Beta — cloudové AI. Vizuální ukázky obrazovek: §4d.

4d. Ukázky — co uživatel uvidí (ESP vs api.easun.eu)

Níže jsou wireframe ukázky (návrh vzhledu, ne finální CSS). Na ESP je text krátký (RAM). Na api.easun.eu se meze na délku / historii nekladou — server má archiv, grafy a delší texty.

A) ESP — stránka /ai-live (hlavní cloud blok)

EaSun · 192.168.x.x AI LIVE
HomeMěřeníMQTTSpot Režimy / AI LIVEWeather
AI Cloud ON Premium · plán dne

platné do 22:00 · jistota 0.78 · poll OK

Počasí: Zataženo, odpoledne přeháňky…

Spot: Levnější dopoledne, od 17:00 drahé pásmo…

Proč: Dnes slabší FVE; Spot dražší večer — dopoledne nabít, večer topit z baterie.

Tip: nabíjet 06–11 · síť ne 17–21

Čísla Wh / °C / Kč/MWh → Weather · Spot · Home (ne z tohoto textu)

AI LIVE (lokální — beze změny)
PWMnavrženo 42 % · po safety 38 % · systém 38 %
Zdroj AIASSIST · mqttFresh
LUX820 lx — jasné

B) ESP — Weather / Spot / Home / Režimy (úsporné řádky)

/weatherRAM: 1 řádek
Lokální forecast
Dnes 18,5 kWh · zítra 9,2 kWh · T_out 4,2 °C
Cloud Zataženo, odpoledne přeháňky… → AI LIVE
/spotRAM: 1 řádek
OTE teď 1850 Kč/MWh · pásmo medium · Gate ANO
Cloud Levnější dopoledne, od 17:00 drahé… → AI LIVE
Homejen badge
FVE 1200 W · Load 800 W · SOC 62 % · T1 48 °C
/system-modesnastavení
AI zdarma:
AI Cloud: ON
Gemini key:

Poslední poll: OK · 06:12 · bez briefing textu zde

ESP ukázky výše jsou maximální rozsah textu. Delší odpověď modelu se na zařízení ořízne (). Plný / historický obsah patří na server.

C) api.easun.eu — bez RAM limitů ESP (archiv + grafy + delší text)

Server přijímá telemetrii / AI run log / cloud plán ze zařízení. Zobrazení může být bohaté: historie dnů, grafy Spot×Wh, delší explainCs, srovnání týdnů, export — meze velikosti UI se tu nekladou (omezení jen disk / DB / GDPR).

api.easun.eu · Analýza zařízení EASUN-ABC123 · Premium Cloud
DomůAnalýzaÚčetNastaveníGuide
Dnes · Cloud plán platnost do 22:00 · confidence 0.78
strategie: charge_before_high
Spot × import (app) odhad 42 Kč · min/avg/max OTE
high okna: 17:00–21:00
AI zdarma ASSIST · mix 25 %
cloudBias heat −1 / charge +1
Denní vysvětlení (plná délka — ne ořez ESP)

Dnes je FVE forecast slabší (≈ 9 kWh vs. průměr zařízení), Spot odpoledne stoupá do high pásma. Doporučení: dopoledne nabít baterii v levnějších hodinách, večer topit z baterie a vyhnout se grid-heat po 17:00. Lokální Spot Gate zůstává rozhodující — cloud jen soft tip.

Okna: preferCharge 06:00–11:00 · avoidGridHeat 17:00–21:00 · surplusHeat 09:00–14:00

Ukázka grafu Spot / spotřeby na serveru · kalendář archivů · týdenní shrnutí · vzdálená správa (Off/Standby/On) — stávající Analýza + nový cloud panel

ESP web UIapi.easun.eu
Délka textu ořez ≈ < 1 KB snapshot plný text + historie
Grafy Spot / Wh ne (jen odkaz na lokální Spot) ano (archiv, srovnání dnů)
JSON / debug / tokeny ne ano (pro majitele / podporu)
Řízení PWM lokální AI + safety vzdálené příkazy stávající Analýzy (ne Gemini přímo)

4e. Když Gemini AI nefunguje — krizové stavy (velmi důležité)

Zlaté pravidlo: výpadek Gemini / cloudu / API klíče nikdy nesmí zastavit topení, safety ani lokální AI zdarma. Aplikace na ESP musí dál řídit PWM podle SHADOW / ASSIST / AUTO + teploty + SOC + Spot Gate. Cloud je volitelná informační vrstva — při chybě se jen vypne / zneplatní text a bias.

Co se v aplikaci vždy stane při selhání cloudu

  1. PWM a safety beze změny — lokální AI / klasika / limity běží dál.
  2. Cloud bias se neaplikuje (G3+) — jako by heatBias/chargeBias = 0.
  3. UI ukáže stav (OFF / chyba / neaktuální / limit) — ne prázdný pád stránky.
  4. Žádný restart / WDT kvůli Gemini — timeouty krátké, chyby logovat a jít dál.
  5. Další poll až podle plánu (ne flood retry každých 5 s).

Matice krizových stavů

StavCo se děje uvnitřCo vidí uživatel (ESP)Řízení topení
AI Cloud OFF / uživatel vypnul Žádný HTTPS k Gemini / proxy; snapshot se neobnovuje Blok skrytý nebo Cloud OFF Jen AI zdarma + limity
Chybí / neplatný API klíč Poll se nespouští nebo 401/403; klíč nepřepisovat z chybové odpovědi Klíč? + výzva na /system-modes Jen AI zdarma + limity
WiFi / internet pryč Poll skip; drží se poslední SPIFFS snapshot do validUntil Text „neaktuální / offline“ nebo poslední platný text + badge Offline Lokální AI dál (MQTT může být LAN)
DNS / TLS / timeout k proxy nebo Google Chyba po krátkém timeoutu; žádný dlouhý block loop Spojení · poslední plán pokud ještě platný Lokální AI dál
Backend api.easun.eu nedostupný Stejné jako síťová chyba; ESP nezkouší přímý Google fallback (RAM/TLS) Chyba proxy / server · Cloud bez obnovy Lokální AI dál
Gemini 429 / kvóta Free Backoff (např. další pokus až další slot / zítra); ne spam Limit 429 · kroky Free/Paid + odkaz návod kap. 21 Lokální AI dál
Gemini 5xx / výpadek Google 1–2 retry max s odstupem; pak skip do dalšího poll okna Cloud výpadek Lokální AI dál
Neplatný / poškozený JSON Backend nebo ESP plán zahodí; starý snapshot jen pokud ještě validUntil „Plán nepřijat“ / neaktuální — bez polovičních dat Lokální AI dál; bias ne
Nízké confidence / respectLocalGate=false Plán odmítnout (validace) Volitelně „plán odmítnut (bezpečnost)“ Lokální AI dál
Plán expiroval (validUntil) Bias=0; text označit neplatný; nesmazat hned (uživatel vidí proč) Neaktuální zašedlý text Lokální AI dál
Málo heapu při skládání UI Zobrazit jen badge stavu, ne celý blok; neuvolnit řízení „Cloud: OK/err (text zkrácen)“ Lokální AI dál
SPIFFS full / zápis snapshot selhal Plán jen v RAM do reboota nebo skip uložení; log Varování úložiště (stručné) Lokální AI dál
OTE / weather chybí Poll může proběhnout se flags unavailable; kratší text; nehalucinovat čísla Kratší briefing · Spot/Weather ukazují lokální výpadek čísel Lokální AI + Spot Gate dle dostupných dat
Billing / Premium odmítnut backendem 403/tarif; poll stop do změny „Premium / tarif“ hláška Lokální AI dál
Režim AI zdarma = OFF Cloud text smí zůstat read-only; bias se neaplikuje do neexistující AI Cloud text OK; PWM = klasika / optimalizace Bez AI řízení (jako dnes OFF)

Ukázka ESP — chybové stavy (co uživatel uvidí)

/ai-liveoffline
Offline poslední plán do 22:00

obnova až bude síť · topení řídí lokální AI

Proč (staré): Dopoledne nabít, večer topit z baterie…

Text může být neúplný / neaktuální

AI LIVE — ASSIST běží · PWM 38 %
/ai-live429
Limit 429 Free kvóta Google

proč nejede · kroky Free / placené · odkaz /navod kap. 21

Počkejte 15–60 min, neklikejte testy; nebo billing. Lokální AI běží dál.

AI LIVE — beze změny
/system-modesklíč
AI Cloud: Klíč?

Neplatný nebo chybějící Gemini klíč — uložte nový. Lokální AI běží dál.

/ai-liveexpirováno
Neaktuální plán propadl

bias vypnut · čeká se na další úspěšný poll

Proč: (zašedlý starý text) …

AI LIVE — lokální řízení 100 %

Chování pollu při chybách (ESP)

api.easun.eu při výpadku Gemini

Nikdy: při výpadku Gemini přepnout PWM na 0 „pro jistotu“, vypnout Spot Gate, inventovat ceny/teploty, blokovat Home stránku čekáním na cloud, nebo zkoušet přímé volání Google z ESP jako nouzový fallback (TLS/RAM riziko).
Uživatelský popis: navod · kap. 21 (sekce výpadky). Checklist testů chyb → §11.

4f. Příklady chování aplikace (denní situace)

Níže jsou typické dny: co aplikace bere z měření / předpovědi (a volitelně ze Spotu), co napíše cloud, a co řídí topení. Spot = možnost, ne pravidlo — bez Spotu platí stejná logika FVE/baterie/teplot.

Společné ve všech příkladech: čísla (°C, Wh, SOC; Kč/MWh jen se Spotem) z aplikace. Cloud jen vysvětlí a navrhne okna. Finální PWM = lokální AI + limity (teplo, SOC; Spot Gate jen pokud Spot používáte).

1) Mám baterii — předpověď říká, že bude svítit

Chování
Situace SOC např. 55 %, forecast Wh dnes vysoký, Spot spíš průměrný
Priorita Využít přebytek do bojleru, baterii nenechat zbytečně plnou přes poledne „bez užitku“
Cloud text (ESP) „Dnes slušné slunce — dopoledne dobít, kolem poledne topit z přebytku…“
Co řídí ESP Lokální AI zvedne topení při přebytku (ASSIST/AUTO); cloud soft tip okna 9–14
Neuvidíte Cloud nepřepíše Wh na Home — Wh zůstane z weather app

2) Mám baterii — bude zataženo (priorita baterie / úspora)

Chování
Situace Nízký forecast Wh, SOC klesá; se Spotem večer často dražší pásmo
Priorita Šetřit síť / baterii: se Spotem nabít v levnějším okně; bez Spotu šetřit SOC a topit z přebytku až bude
Cloud text Se Spotem: „slabší FVE; Spot večer vyšší…“ · Bez Spotu: „slabší FVE — šetřit baterii…“
Co řídí ESP SOC limity vždy; Spot Gate hard jen pokud Spot používáte

2b) Bez Spotu — běžný den

3) Levný Spot ráno + slunce odpoledne (jen se Spotem)

4) Drahý Spot večer + zataženo celý den (jen se Spotem)

5) Bez baterie + topím podle počasí + bez Spotu

Chování
Situace Jen FVE + bojler; žádná baterie; Spot vypnutý / spot.available=false
Vstup pro cloud weather forecast (Wh, oblaky, T_out) + telemetrie W + limity teploty — bez SOC / Spot křivky
Slunce Cloud: tip surplus heat (okna přebytku); lokální AI topí z FVE; žádné „nabíjení“
Zataženo Cloud: slabší FVE, méně přebytku; při komfortu lokální AI může topit ze sítě dle Distr./limitů — ne dle Spot Gate
„Musím topit“ Min/max teplota a režim AI zdarma vyhrávají; cloud jen vysvětlí, že FVE nestačí
UI AI LIVE bez Spot summary / bez tipů nabíjení; Weather řádek + explainCs k FVE

5b) Bez baterie + se Spotem (pro srovnání)

6) Priorita komfort vs úspora vs baterie

Volba uživateleJak se den typicky povede
Úspora Víc „počkej na slunce / levný Spot“; večer méně ze sítě; text vysvětlí proč bojler teď netopí
Komfort Teplo dřív, pokud limity dovolí; cloud méně tlačí na odklad; Gate a max T stále platí
Baterie Nejdřív SOC před drahým oknem; topení z přebytku až po dobití (soft)

7) Bojler u maxima / Distr. zakázán

8) Cloud vypadl uprostřed dne

Stejné příklady srozumitelně pro provoz: navod · kap. 21.

5. Datový kontrakt (JSON in / out)

5.1 Vstup na backend (z ESP nebo z telemetrie serveru)

{
  "deviceId": "EASUN-…",
  "lat": 49.2,
  "lon": 16.6,
  "tz": "Europe/Prague",
  "now": {
    "solarW": 1200,
    "loadW": 800,
    "gridW": -200,
    "soc": 62,
    "socMin": 40,
    "tempMax": 48.5,
    "pwm": 35,
    "spotCzkMwh": 1850,
    "spotBand": 2,
    "spotLevelNum": 14,
    "gridHeatAllowed": true
  },
  "forecast": {
    "source": "openweather|open-meteo|local",
    "todayWh": 18500,
    "tomorrowWh": 9200,
    "cloudAvgPct": 65,
    "tempOutC": 4.2
  },
  "spot": {
    "available": true,
    "tomorrowAvailable": true,
    "unit": "CZK/MWh",
    "limits": { "low": 1500, "med": 2500, "high": 4000 },
    "summaryToday": {
      "min": 420, "max": 5100, "avg": 2100,
      "lowWindows": ["00:00-06:00", "09:00-11:00"],
      "highWindows": ["17:00-21:00"]
    },
    "hourlyToday": [800, 750, 700, 680, 900, 1200, 1800, 2200, 1900, 1600, 1400, 1300,
                    1500, 1700, 2100, 2800, 3500, 4200, 3900, 3200, 2500, 1800, 1200, 900],
    "hourlyTomorrow": null,
    "note": "hourly* = 24 hodnot z OTE (agregace z 96×15min). Gemini nevymýšlí ani neopravuje."
  },
  "prefs": {
    "priority": "comfort|savings|battery",
    "lang": "cs"
  }
}
Všechna čísla ve vstupu pocházejí z aplikace / lokálních měření (ESP, weather app, OTE). Pro úsporu tokenů posílejte spíš summaryToday (min/max/avg + max 2+2 okna) než plných 96 čtvrthodin; hourlyToday (24) jen při ladění — viz zkrácený formát §8c. Backend může křivku sestavit z ESP JSON / archivu Spot. gridHeatAllowed = stav lokálního Gate.

5.2 Výstup od Gemini (striktní schéma — validovat na backendu)

{
  "validUntil": "2026-07-30T22:00:00+02:00",
  "confidence": 0.0-1.0,
  "weatherSummaryCs": "Zataženo, odpoledne přeháňky…",
  "spotSummaryCs": "Dnes levnější dopoledne, od 17:00 drahé pásmo (OTE).",
  "plan": {
    "heatBias": -1,
    "chargeBias": 1,
    "targetSocBeforeHighSpot": 75,
    "preferSurplusHeatWindows": ["09:00-14:00"],
    "preferChargeWindows": ["06:00-11:00"],
    "avoidGridHeatWindows": ["17:00-21:00"],
    "spotStrategy": "charge_before_high|surplus_heat|hold_battery|neutral",
    "respectLocalGate": true
  },
  "costEstimate": {
    "currency": "CZK",
    "method": "from_app_precomputed|qualitative_only",
    "importCostTodayEst": null,
    "commentCs": "Kč jen echo z aplikace; bez precompute = qualitative_only."
  },
  "explainCs": "Dnes slabší FVE; Spot dražší večer — dopoledne nabít, večer topit z baterie.",
  "alerts": ["low_tomorrow_solar", "high_spot_evening"]
}
Výstup neobsahuje solarTodayWh / teplotu / Kč/MWh jako „autoritativní“ hodnoty. Wh / temp / Spot zůstávají ve FW z aplikace a měření (forecast.todayWh, senzory, OTE). costEstimate.importCostTodayEst smí být jen echo čísla spočítaného v aplikaci — jinak null + qualitative.

heatBias / chargeBias: −2…+2 (soft korekce agresivity lokální AI), ne absolutní PWM. respectLocalGate musí být vždy true — backend odmítne plán, který by požadoval grid-heat při gridHeatAllowed=false. validUntil — po expiraci ESP ignoruje plán.

5.3 Mapování na existující firmware

Gemini poleKam na ESP
(žádné Wh / temp / Spot Kč) totalTodaySolar, temp, Spot ceny — vždy z aplikace / měření, Gemini je nepřepisuje
heatBias násobitel / offset u surplus boost / forecast agresivity v aiComputeLocalTargetPwm
chargeBias / preferChargeWindows auto-optimalizace baterie / dočasné zvýšení cíle nabíjení v okně
targetSocBeforeHighSpot SOC cíl před high oknem (nesmí pod baterie1)
avoidGridHeatWindows extra soft brzda (AND s lokálním Spot Gate — Gate zůstává hard)
spotSummaryCs / explainCs / weatherSummaryCs jen text na /ai-live, /weather nebo Spot UI — čísla vedle textu z lokálních polí
costEstimate jen zobrazení / archiv (echo z app výpočtu); neřídí PWM

6. Volba modelu a orientační náklady

Ceny se mění — vždy ověřte oficiální ceník Gemini API (Standard paid tier). Níže: sazby + přepočet na provoz aplikace 06:00–21:00 (§6b).

Model (rodina)Vhodné proPoznámka
Flash-Lite denní briefing, krátký JSON plán doporučeno pro Premium (1 zařízení)
Flash Spot×počasí reasoning, vysvětlení default, pokud Lite nestačí na JSON kvalitu
Pro týdenní analýza logů, složité scénáře ne pro hodinový poll; spíš Batch 1×/týden

6b. Srovnání sazeb (Paid Standard) + provoz 06:00–21:00

Sazby za 1 M tokenů (USD, Standard)

Zdroj: oficiální pricing Google (stav dokumentace ~červenec 2026). Batch / Flex ≈ −50 %. CZK přepočet orientačně 1 USD ≈ 23 Kč (kurz se mění).

Model Input / 1M Output / 1M 1 krátký dotaz* Vhodnost EaSun
gemini-2.5-flash-lite $0.10 $0.40 ≈ $0.00035 · 0,01 Kč nejlevnější (legacy); ověřit dostupnost
gemini-3.1-flash-lite $0.25 $1.50 ≈ $0.00113 · 0,03 Kč doporučeno denní plán / bias
gemini-3.5-flash-lite $0.30 $2.50 ≈ $0.00170 · 0,04 Kč silnější Lite; pořád levný poll
gemini-3.5-flash $1.50 $9.00 ≈ $0.00675 · 0,16 Kč lepší reasoning; 1×/h ještě OK
gemini-3.1-pro-preview $2.00 $12.00 ≈ $0.00900 · 0,21 Kč jen analýza logů / výjimky (ne poll)

*1 krátký dotaz = předpoklad pro denní plán EaSun: 1 500 tokenů vstup (systémový prompt + telemetrie + weather čísla) + 500 tokenů výstup (JSON plán + explainCs). Thinking tokeny u Flash/Pro se účtují jako output — při zapnutém „thinking“ násobte output 2–5×.

Počet dotazů za den (okno 06:00–21:00)

Režim pollSloty / denDotazy / měsíc (30 dní)Komentář
1× ráno (06:00) 1 30 briefing + denní plán — minimum Premium
každé 3 h (6, 9, 12, 15, 18, 21) 6 180 rozumný kompromis Spot/počasí
každou hodinu (6…21) 16 480 živější plán; cache stále dává smysl
každých 30 min 31 930 zbytečné — Wh/temp/Spot jsou z app, ne z častého Gemini pollu
každých 15 min 61 1 830 nedoporučeno — řízení ať dělá AI zdarma

Odhad nákladů — 1 zařízení / den (USD · Kč)

Poll 06–21 2.5 Flash-Lite 3.1 Flash-Lite 3.5 Flash-Lite 3.5 Flash 3.1 Pro
1×/den $0.0004 · 0,01 Kč $0.0011 · 0,03 Kč $0.0017 · 0,04 Kč $0.0068 · 0,16 Kč $0.009 · 0,21 Kč
6× (3 h) $0.002 · 0,05 Kč $0.007 · 0,16 Kč $0.010 · 0,24 Kč $0.041 · 0,93 Kč $0.054 · 1,24 Kč
16× (1 h) $0.006 · 0,13 Kč $0.018 · 0,41 Kč $0.027 · 0,63 Kč $0.108 · 2,48 Kč $0.144 · 3,31 Kč
31× (30 min) $0.011 · 0,25 Kč $0.035 · 0,80 Kč $0.053 · 1,21 Kč $0.209 · 4,81 Kč $0.279 · 6,42 Kč
61× (15 min) $0.021 · 0,49 Kč $0.069 · 1,58 Kč $0.104 · 2,39 Kč $0.412 · 9,47 Kč $0.549 · 12,63 Kč

Odhad nákladů — 1 zařízení / měsíc (30 dní, USD · Kč)

Poll 06–21 3.1 Flash-Lite 3.5 Flash-Lite 3.5 Flash 3.1 Pro
1×/den (30 call) $0.03 · 0,8 Kč $0.05 · 1,2 Kč $0.20 · 4,7 Kč $0.27 · 6,2 Kč
6×/den (180) $0.20 · 4,7 Kč $0.31 · 7,0 Kč $1.22 · 28 Kč $1.62 · 37 Kč
16×/den (480) $0.54 · 12 Kč $0.82 · 19 Kč $3.24 · 75 Kč $4.32 · 99 Kč
31×/den (930) $1.05 · 24 Kč $1.58 · 36 Kč $6.28 · 144 Kč $8.37 · 193 Kč
61×/den (1 830) $2.06 · 47 Kč $3.11 · 72 Kč $12.35 · 284 Kč $16.47 · 379 Kč
Praktické doporučení pro Premium: start na gemini-3.1-flash-lite, poll 1×/den nebo každé 3 h (6 callů) → řádově 1–5 Kč / zařízení / měsíc. Hodinový poll (16×) ≈ 12 Kč/měsíc na Lite — stále levné; 15min poll a Pro pro řízení neodůvodněné.

100 zařízení (měsíční rozpočet, 3.1 Flash-Lite)

PollCallů / měsíc≈ USD≈ Kč
1×/den3 000$3.4≈ 78 Kč
6×/den18 000$20≈ 470 Kč
16×/den48 000$54≈ 1 240 Kč

Google Search grounding (navíc k tokenům)

Odhad je bez thinking tokenů, bez Search a bez retry při chybě. Po G1 měřte reálné usageMetadata (prompt/candidates tokens) a tabulku aktualizujte. Ceník Google se může změnit — při tvorbě tarifu Premium vždy přepočítat z aktuálního pricing.
Doporučení: všechna čísla (počasí, Wh, Spot) z aplikace / OWM / Open-Meteo / OTE ve FW cestě. Gemini bez Search pro denní plán — jen plán + text nad dodanými čísly. Když weather/OTE chybí, nepřepínat na Gemini jako náhradu: flag unavailable + nižší confidence. Cache na backendu 1–6 h = méně callů než tabulka worst-case.

7. Bezpečnost a limity produktu

8. Roadmap vývoje (fáze)

Fáze G0 — průzkum HOTOVO (návrh promptů)

AI Studio prototyp
  • Vytvořit klíč (Free tier) + ověřit v Playgroundu; billing až při potřebě (§2b).
  • Hotovo: systémový + user prompt + 5 příkladů JSON → §8b.
  • Hotovo: testovací sada 8 JSON → §8c.
  • Další: Playground Flash-Lite na §8b/§8c; Search pro čísla = ne.
  • Ověřit, že model nehalucinuje teplotu / Wh / Kč — jen cituje vstup z aplikace.

Fáze G1 — backend stub HOTOVO localhost

Endpoint bez zásahu do PWM
  • POST /api_ai_cloud_plan.php (lokální Analýza / localhost): telemetrie + weather; Spot hourly* jen pokud available.
  • ☑ Auth: EaSun api_key (esp_api); Gemini klíč jen ze zařízení (geminiApiKey v POST — ne server env.
  • ☑ Validace §5.2 / §4c: strip Wh/temp/Kč; truncate; Gate=NE → reject tip síť; spot.available=false → neutral (ne 422).
  • ☑ Cache 3 h; Gemini/timeout/429 → error kód (nehalucinovaný plán); dry-run geminiApiKey=TEST pro localhost.
  • □ Deploy na api.easun.eu (produkce) — po field testech.

Fáze G2 — ESP read-only HOTOVO (FW)

Premium UI bez řízení
  • ☑ SPIFFS aiCloudEnabled + geminiApiKey; poll 1–2×/den (ai_cloud.h).
  • ☑ UI §4c: plný blok /ai-live; /weather//spot 1 řádek; Home badge; /system-modes ON/OFF+klíč bez briefingu.
  • ☑ PWM beze změny v G2; G3 soft bias napojen (viz níže).
  • ☑ Krizové stavy §4e: badge Offline/429/Klíč?/Neaktuální; žádný Google fallback; backoff.
  • □ Field test na zařízení + reálný Gemini klíč přes localhost proxy.

Fáze G3 — soft bias HOTOVO (FW)

Napojení na lokální AI (+ Spot okna)
  • ☑ Hook v aiResolveFinalPwm před safety: ΔPWM = heatBias×1.5 + okna, clamp ±3 %.
  • ☑ Podmínky: enabled + fresh + confidence≥0.5 + status OK + respectLocalGate.
  • ☑ Bez Spotu: jen heat + surplus okna; bez baterie: chargeBias=0.
  • ☑ Výpadek/STALE → bias=0; Spot Gate / Distr / SOC / T hard beze změny.
  • ☑ SHADOW: log cloudBias v AI LIVE / AI20 (PWM=fallback).
  • □ Field test ASSIST/AUTO se Spotem i bez; regrese Cloud OFF.

Fáze G4 — vyhodnocení + produkt POSTUP HOTOV

A/B 14 dní + CSV
  • ☑ Postup A (7 dní Cloud OFF) vs B (7 dní Cloud ON) — segmenty a/b/c nemíchat
  • ☑ AI20: cloudOn + g4seg + cloudBias
  • ☑ Denní EVT type=G4_DAY (importWh, minSoc, t1Min, highImportWh, costCzk)
  • ☑ CSV: api_ai_g4_csv.php?device_ip=…&from=&to=
  • □ Field test 14 dní → vyplnit tabulku go/no-go

8b. G0 výstup — systémový + user prompt + 5 příkladů

Stav: návrh hotov (2026-08-01). Prompty jsou v backendu G1 a ESP G2 (ai_cloud.h) je volá přes proxy. Soft bias do PWM = Fáze G3 (hotovo ve FW — max ±3 %; field test zbývá). Field test: Gemini klíč SPIFFS + host AI logu → text na /ai-live. AI Studio: Playground.

System prompt (kopírovat do modelu)

Jsi plánovač denního provozu EaSun (FVE + topení SSR, volitelně baterie, volitelně Spot OTE).
Dostaneš JSON telemetrii a forecast Z APLIKACE. Vrátíš POUZE jeden JSON objekt dle schématu — žádný markdown, žádný komentář mimo JSON.

ČÍSLA: Nikdy nevymýšlej ani neopravuj teplotu, Wh, W, SOC ani Spot Kč/MWh.
Cituj jen hodnoty ze vstupu now.* / forecast.* / spot.*. Do výstupu NEDÁVEJ solarTodayWh ani jiné „autoritativní“ Wh/temp/Kč.

SPOT: spot.available=false je PLATNÝ stav (Spot vypnutý nebo není OTE) — ne chyba.
Pak: spotStrategy="neutral", spotSummaryCs="" nebo vynech, preferChargeWindows/avoidGridHeatWindows prázdné nebo jen z FVE logiky bez Kč.
Plán skládej z FVE forecast + baterie (pokud je) + teplot.

BEZ BATERIE: pokud chybí now.soc nebo prefs říká bez baterie / soc null:
neřeš targetSocBeforeHighSpot ani preferChargeWindows jako hlavní cíl (null / []).
Fokus: preferSurplusHeatWindows podle forecast, heatBias, explainCs k topení z přebytku.

FORECAST: chybí-li forecast nebo todayWh, nesmíš halucinovat Wh/temp — nižší confidence, kratší text.

GATE: respectLocalGate vždy true.
Pokud je ve vstupu gridHeatAllowed=false, NEDOPORUČUJ topení ze sítě (žádný tip grid-heat).
Pokud Spot/Gate ve vstupu není, Gate nevymýšlej.

BIAS: heatBias a chargeBias jen celá čísla −2…+2. Žádné absolutní PWM.
Bez baterie: chargeBias=0.

COST: costEstimate.importCostTodayEst jen pokud vstup obsahuje precomputed hodnotu k echo;
jinak method="qualitative_only", importCostTodayEst=null.

SEARCH: nepoužívej web/Search jako zdroj čísel.

DÉLKA (ESP RAM): explainCs ≤ 240 znaků; weatherSummaryCs ≤ 120; spotSummaryCs ≤ 120;
okna v plan jako krátké "HH:MM-HH:MM", tip okna celkem ≤ ~80 znaků smyslu.
Jazyk: čeština (prefs.lang=cs).

spotStrategy (enum): charge_before_high | surplus_heat | hold_battery | neutral
alerts: krátké kódy z množiny např. low_tomorrow_solar, high_spot_evening, no_spot, no_battery, low_forecast — bez volných esejí.

validUntil: konec dne zařízení v tz (typicky dnes 22:00 místního času), ISO-8601 s offsetem.

User prompt (šablona — backend doplní JSON)

Sestav denní cloud plán EaSun. Vstup (čísla z aplikace, neměň je):

{{INPUT_JSON_5_1}}

Vrať jediný JSON objekt:
{
  "validUntil": "ISO-8601",
  "confidence": 0.0-1.0,
  "weatherSummaryCs": "≤120 znaků",
  "spotSummaryCs": "≤120 nebo \"\" když !spot.available",
  "plan": {
    "heatBias": -2..2,
    "chargeBias": -2..2,
    "targetSocBeforeHighSpot": null nebo číslo (jen s baterií+Spot high),
    "preferSurplusHeatWindows": ["HH:MM-HH:MM"],
    "preferChargeWindows": [],
    "avoidGridHeatWindows": [],
    "spotStrategy": "charge_before_high|surplus_heat|hold_battery|neutral",
    "respectLocalGate": true
  },
  "costEstimate": {
    "currency": "CZK",
    "method": "from_app_precomputed|qualitative_only",
    "importCostTodayEst": null,
    "commentCs": "≤120"
  },
  "explainCs": "≤240 znaků, česky",
  "alerts": []
}

Pravidla priority prefs.priority: savings=šetři síť/přebytek; comfort=teplo dřív v limitech; battery=nejdřív SOC (jen s baterií).
Spot jen možnost. Bez Spotu/baterie viz výše. Jen JSON.

Příklad 1 — slunce + baterie (bez Spotu)

{
  "validUntil": "2026-08-01T22:00:00+02:00",
  "confidence": 0.82,
  "weatherSummaryCs": "Slunečno, dobrá výroba FVE přes den.",
  "spotSummaryCs": "",
  "plan": {
    "heatBias": 1,
    "chargeBias": 1,
    "targetSocBeforeHighSpot": null,
    "preferSurplusHeatWindows": ["09:00-15:00"],
    "preferChargeWindows": ["07:00-11:00"],
    "avoidGridHeatWindows": [],
    "spotStrategy": "surplus_heat",
    "respectLocalGate": true
  },
  "costEstimate": {
    "currency": "CZK",
    "method": "qualitative_only",
    "importCostTodayEst": null,
    "commentCs": "Bez Spotu — bez odhadu Kč."
  },
  "explainCs": "Dnes slušné slunce — dopoledne dobít baterii, kolem poledne topit z přebytku FVE.",
  "alerts": ["no_spot"]
}

Příklad 2 — zataženo + baterie (bez Spotu)

{
  "validUntil": "2026-08-01T22:00:00+02:00",
  "confidence": 0.74,
  "weatherSummaryCs": "Zataženo, slabší výroba FVE.",
  "spotSummaryCs": "",
  "plan": {
    "heatBias": -1,
    "chargeBias": 1,
    "targetSocBeforeHighSpot": null,
    "preferSurplusHeatWindows": ["11:00-14:00"],
    "preferChargeWindows": ["08:00-12:00"],
    "avoidGridHeatWindows": [],
    "spotStrategy": "hold_battery",
    "respectLocalGate": true
  },
  "costEstimate": {
    "currency": "CZK",
    "method": "qualitative_only",
    "importCostTodayEst": null,
    "commentCs": "Bez Spotu — bez odhadu Kč."
  },
  "explainCs": "Dnes slabší FVE — šetřit baterii, topit hlavně z přebytku, až bude. Limity SOC platí.",
  "alerts": ["low_tomorrow_solar", "no_spot"]
}

Příklad 3 — bez baterie + bez Spotu + slunce

{
  "validUntil": "2026-08-01T22:00:00+02:00",
  "confidence": 0.80,
  "weatherSummaryCs": "Jasno, vysoký přebytek FVE dopoledne až odpoledne.",
  "spotSummaryCs": "",
  "plan": {
    "heatBias": 2,
    "chargeBias": 0,
    "targetSocBeforeHighSpot": null,
    "preferSurplusHeatWindows": ["09:00-15:00"],
    "preferChargeWindows": [],
    "avoidGridHeatWindows": [],
    "spotStrategy": "surplus_heat",
    "respectLocalGate": true
  },
  "costEstimate": {
    "currency": "CZK",
    "method": "qualitative_only",
    "importCostTodayEst": null,
    "commentCs": "Bez Spotu a bez baterie."
  },
  "explainCs": "Bez baterie — dnes topit z přebytku FVE hlavně 9–15, ať bojler chytí slunce.",
  "alerts": ["no_battery", "no_spot"]
}

Příklad 4 — se Spotem: low ráno + high večer

{
  "validUntil": "2026-08-01T22:00:00+02:00",
  "confidence": 0.86,
  "weatherSummaryCs": "Polojasno, výroba střední.",
  "spotSummaryCs": "Levnější dopoledne, od 17:00 drahé pásmo (OTE).",
  "plan": {
    "heatBias": 0,
    "chargeBias": 2,
    "targetSocBeforeHighSpot": 75,
    "preferSurplusHeatWindows": ["10:00-14:00"],
    "preferChargeWindows": ["06:00-11:00"],
    "avoidGridHeatWindows": ["17:00-21:00"],
    "spotStrategy": "charge_before_high",
    "respectLocalGate": true
  },
  "costEstimate": {
    "currency": "CZK",
    "method": "qualitative_only",
    "importCostTodayEst": null,
    "commentCs": "Kč jen pokud app pošle precompute."
  },
  "explainCs": "Ráno levnější Spot — nabít; odpoledne přebytek do tepla; večer netopit ze sítě 17–21.",
  "alerts": ["high_spot_evening"]
}

Příklad 5a — Gate=NE (se Spotem)

{
  "validUntil": "2026-08-01T22:00:00+02:00",
  "confidence": 0.88,
  "weatherSummaryCs": "Zataženo, málo přebytku.",
  "spotSummaryCs": "Drahé pásmo, Gate zakazuje topit ze sítě.",
  "plan": {
    "heatBias": -2,
    "chargeBias": 1,
    "targetSocBeforeHighSpot": 70,
    "preferSurplusHeatWindows": [],
    "preferChargeWindows": ["06:00-10:00"],
    "avoidGridHeatWindows": ["00:00-23:59"],
    "spotStrategy": "hold_battery",
    "respectLocalGate": true
  },
  "costEstimate": {
    "currency": "CZK",
    "method": "qualitative_only",
    "importCostTodayEst": null,
    "commentCs": "Gate=NE — bez tipu grid-heat."
  },
  "explainCs": "Spot Gate zakazuje síť — topit jen z FVE/baterie v limitech. Cloud Gate neobchází.",
  "alerts": ["high_spot_evening"]
}

Příklad 5b — spot.available=false (alternativa k 5a)

{
  "validUntil": "2026-08-01T22:00:00+02:00",
  "confidence": 0.70,
  "weatherSummaryCs": "Oblačno, střední výroba.",
  "spotSummaryCs": "",
  "plan": {
    "heatBias": 0,
    "chargeBias": 0,
    "targetSocBeforeHighSpot": null,
    "preferSurplusHeatWindows": ["10:00-14:00"],
    "preferChargeWindows": [],
    "avoidGridHeatWindows": [],
    "spotStrategy": "neutral",
    "respectLocalGate": true
  },
  "costEstimate": {
    "currency": "CZK",
    "method": "qualitative_only",
    "importCostTodayEst": null,
    "commentCs": "Spot nepoužíván — platný stav."
  },
  "explainCs": "Bez Spot dat — plán jen podle FVE a limitů. Žádná pásma Kč/MWh.",
  "alerts": ["no_spot"]
}
Vstupní JSON pro testy skládejte dle §5.1; u bez Spotu nastavte "spot":{"available":false}; u bez baterie vynechte soc nebo pošlete "hasBattery":false v prefs (backend může mapovat).

8c. G0b — testovací sada 8 user-message JSON

Stav: sada hotova (2026-08-01). Použití: AI Studio Playground — system prompt z §8b + user šablona s INPUT níže. Kontrola: model nesmí změnit forecast.todayWh, now.tempMax, spotCzkMwh / hourlyToday (ty hodnoty ve výstupu vůbec nejsou jako autorita).

Zkrácený summaryToday (Flash-Lite, méně tokenů)

Pro poll 1–6×/den posílejte spíš toto než plných 24 hodin (nebo 24h + summary). Okna max 2 low + 2 high. Hodiny v HH:MM-HH:MM.

{
  "summaryToday": {
    "min": 420,
    "max": 5100,
    "avg": 2100,
    "lowWindows": ["00:00-06:00", "09:00-11:00"],
    "highWindows": ["17:00-21:00"]
  }
}
Backend může spočítat min/max/avg + okna z OTE 96×15min na ESP/serveru. Do Gemini: summaryToday povinně když Spot je; hourlyToday volitelně (24 int) jen při ladění. Bez Spotu celý objekt spot = {"available":false}.

Invarianty (všechny testy)

T01 — bez Spotu · slunce + baterie

{
  "deviceId": "EASUN-T01",
  "lat": 49.2, "lon": 16.6, "tz": "Europe/Prague",
  "now": { "solarW": 2100, "loadW": 600, "gridW": -1400, "soc": 55, "socMin": 40,
           "tempMax": 46.0, "pwm": 40 },
  "forecast": { "source": "open-meteo", "todayWh": 22000, "tomorrowWh": 18000,
                "cloudAvgPct": 15, "tempOutC": 12.0 },
  "spot": { "available": false },
  "prefs": { "priority": "battery", "lang": "cs", "hasBattery": true }
}

Očekávané: spotStrategy=surplus_heat (nebo hold_battery+nabíjení ráno); spotSummaryCs=""; preferSurplusHeatWindows kolem 9–15; preferChargeWindows dopoledne; chargeBias ≥0; heatBias ≥0; explainCs o slunci/přebytku bez Kč/MWh; alerts obsahuje no_spot. Neměnit todayWh=22000, tempMax=46.0.

T02 — bez Spotu · zataženo + baterie

{
  "deviceId": "EASUN-T02",
  "lat": 49.2, "lon": 16.6, "tz": "Europe/Prague",
  "now": { "solarW": 180, "loadW": 700, "gridW": 200, "soc": 48, "socMin": 40,
           "tempMax": 44.0, "pwm": 15 },
  "forecast": { "source": "open-meteo", "todayWh": 4500, "tomorrowWh": 3800,
                "cloudAvgPct": 90, "tempOutC": 3.0 },
  "spot": { "available": false },
  "prefs": { "priority": "savings", "lang": "cs", "hasBattery": true }
}

Očekávané: spotStrategy=hold_battery nebo neutral; heatBias ≤0; chargeBias ≥0 (šetřit SOC); prázdné avoidGridHeat (bez Spotu); explainCs o slabé FVE bez Spot pásem; alert low_tomorrow_solar / no_spot. Neměnit todayWh=4500, tempMax=44.0.

T03 — bez Spotu · bez baterie · slunce (topit z přebytku)

{
  "deviceId": "EASUN-T03",
  "lat": 49.2, "lon": 16.6, "tz": "Europe/Prague",
  "now": { "solarW": 2500, "loadW": 500, "gridW": -1800, "tempMax": 42.0, "pwm": 55 },
  "forecast": { "source": "open-meteo", "todayWh": 19500, "tomorrowWh": 16000,
                "cloudAvgPct": 20, "tempOutC": 14.0 },
  "spot": { "available": false },
  "prefs": { "priority": "comfort", "lang": "cs", "hasBattery": false }
}

Očekávané: chargeBias=0; preferChargeWindows=[]; targetSocBeforeHighSpot=null; spotStrategy=surplus_heat; surplus okna 9–15; heatBias ≥1; explainCs bez nabíjení/SOC/Kč; alerts no_battery, no_spot. Neměnit todayWh=19500, tempMax=42.0.

T04 — se Spotem · low ráno + high večer + slušné FVE

{
  "deviceId": "EASUN-T04",
  "lat": 49.2, "lon": 16.6, "tz": "Europe/Prague",
  "now": { "solarW": 900, "loadW": 650, "gridW": -100, "soc": 58, "socMin": 40,
           "tempMax": 47.0, "pwm": 30, "spotCzkMwh": 1200, "spotBand": 1,
           "spotLevelNum": 8, "gridHeatAllowed": true },
  "forecast": { "source": "open-meteo", "todayWh": 14000, "tomorrowWh": 11000,
                "cloudAvgPct": 40, "tempOutC": 8.0 },
  "spot": {
    "available": true, "tomorrowAvailable": false, "unit": "CZK/MWh",
    "limits": { "low": 1500, "med": 2500, "high": 4000 },
    "summaryToday": {
      "min": 600, "max": 4800, "avg": 2000,
      "lowWindows": ["00:00-07:00", "09:00-11:00"],
      "highWindows": ["17:00-21:00"]
    },
    "hourlyToday": [700,650,620,600,750,900,1100,1400,1600,1500,1400,1350,
                    1500,1700,2000,2600,3400,4500,4200,3600,2800,1800,1100,800]
  },
  "prefs": { "priority": "battery", "lang": "cs", "hasBattery": true }
}

Očekávané: spotStrategy=charge_before_high; preferCharge ≈ low okna; avoidGridHeat ≈ 17–21; surplus kolem poledne; spotSummaryCs cituje low/high bez změny hourly/min/max; neměnit spotCzkMwh=1200, todayWh=14000, hourlyToday[17]≈4500.

T05 — se Spotem · zataženo + high večer

{
  "deviceId": "EASUN-T05",
  "lat": 49.2, "lon": 16.6, "tz": "Europe/Prague",
  "now": { "solarW": 120, "loadW": 800, "gridW": 400, "soc": 52, "socMin": 40,
           "tempMax": 43.0, "pwm": 10, "spotCzkMwh": 3200, "spotBand": 3,
           "spotLevelNum": 18, "gridHeatAllowed": true },
  "forecast": { "source": "open-meteo", "todayWh": 3200, "tomorrowWh": 2800,
                "cloudAvgPct": 95, "tempOutC": 2.0 },
  "spot": {
    "available": true, "tomorrowAvailable": true, "unit": "CZK/MWh",
    "limits": { "low": 1500, "med": 2500, "high": 4000 },
    "summaryToday": {
      "min": 900, "max": 5200, "avg": 2600,
      "lowWindows": ["02:00-06:00"],
      "highWindows": ["16:00-21:00"]
    }
  },
  "prefs": { "priority": "savings", "lang": "cs", "hasBattery": true }
}

Očekávané: charge_before_high nebo hold_battery; heatBias <0; avoidGridHeat večer; explainCs varuje před drahým večerem + slabou FVE; neměnit todayWh=3200, spotCzkMwh=3200. (Bez hourly — jen summaryToday.)

T06 — se Spotem · bez baterie + přebytek

{
  "deviceId": "EASUN-T06",
  "lat": 49.2, "lon": 16.6, "tz": "Europe/Prague",
  "now": { "solarW": 1800, "loadW": 550, "gridW": -1100, "tempMax": 45.0, "pwm": 48,
           "spotCzkMwh": 1600, "spotBand": 2, "spotLevelNum": 10, "gridHeatAllowed": true },
  "forecast": { "source": "open-meteo", "todayWh": 16000, "tomorrowWh": 12000,
                "cloudAvgPct": 35, "tempOutC": 10.0 },
  "spot": {
    "available": true, "tomorrowAvailable": false, "unit": "CZK/MWh",
    "limits": { "low": 1500, "med": 2500, "high": 4000 },
    "summaryToday": {
      "min": 800, "max": 4100, "avg": 1900,
      "lowWindows": ["00:00-08:00"],
      "highWindows": ["18:00-21:00"]
    }
  },
  "prefs": { "priority": "comfort", "lang": "cs", "hasBattery": false }
}

Očekávané: surplus_heat; chargeBias=0; preferCharge=[]; targetSoc=null; avoidGridHeat 18–21 soft; explainCs topení z přebytku + drahý večer bez SOC.

T07 — Gate=NE (se Spotem)

{
  "deviceId": "EASUN-T07",
  "lat": 49.2, "lon": 16.6, "tz": "Europe/Prague",
  "now": { "solarW": 200, "loadW": 900, "gridW": 500, "soc": 50, "socMin": 40,
           "tempMax": 41.0, "pwm": 5, "spotCzkMwh": 4500, "spotBand": 3,
           "spotLevelNum": 22, "gridHeatAllowed": false },
  "forecast": { "source": "open-meteo", "todayWh": 5000, "tomorrowWh": 6000,
                "cloudAvgPct": 80, "tempOutC": 5.0 },
  "spot": {
    "available": true, "tomorrowAvailable": false, "unit": "CZK/MWh",
    "limits": { "low": 1500, "med": 2500, "high": 4000 },
    "summaryToday": {
      "min": 1100, "max": 5500, "avg": 3000,
      "lowWindows": ["03:00-06:00"],
      "highWindows": ["15:00-22:00"]
    }
  },
  "prefs": { "priority": "savings", "lang": "cs", "hasBattery": true }
}

Očekávané: respectLocalGate=true; explainCs nesmí doporučit topit ze sítě; heatBias ≤0; avoidGridHeat široké / hold_battery; spotCzkMwh zůstává 4500 (jen citace). Backend reject, pokud by model tipoval grid-heat.

T08 — chybí forecast

{
  "deviceId": "EASUN-T08",
  "lat": 49.2, "lon": 16.6, "tz": "Europe/Prague",
  "now": { "solarW": 600, "loadW": 700, "gridW": 50, "soc": 60, "socMin": 40,
           "tempMax": 49.0, "pwm": 20 },
  "forecast": null,
  "spot": { "available": false },
  "prefs": { "priority": "savings", "lang": "cs", "hasBattery": true }
}

Očekávané: nízké confidence (např. <0.55); weatherSummaryCs bez fiktivních Wh; explainCs kvalitativní bez vymyšlených kWh; spotStrategy=neutral; žádné halucinované todayWh. tempMax=49.0 se ve výstupu „neopravuje“.

Rychlá kontrolní tabulka

IDSpotBaterieOčekávané spotStrategyZákaz
T01neanosurplus_heatKč, Spot okna
T02neanohold_battery / neutralKč, Spot okna
T03nenesurplus_heatSOC cíle, Kč
T04anoanocharge_before_highměnit hourly/Wh
T05anoanocharge_before_high / holdměnit Wh/Kč
T06anonesurplus_heatpreferCharge, targetSoc
T07ano Gate NEanohold_batterytip grid-heat
T08neanoneutralhalucinovat forecast

9. Prompty pro Cursor IDE

Kopírujte do Cursor Agentu spolu s odkazem na tento soubor a relevantní FW soubory (ESP32-Grid-Load-Vypocet800.ino, vypocet02.h, weather headery; spotove_ceny.h jen pokud Spot používáte). Po každé fázi: Compile → Upload → checklist §11.

Prompty musí respektovat aktuální dokument: klíč jen SPIFFS; čísla jen z app; Spot = možnost ne pravidlo; UI RAM-limited (§4c–4d); výpadky Gemini nikdy nestopnou řízení (§4e); scénáře i bez baterie / bez Spotu (§4f).
Prompt G0 — návrh promptu Gemini (provedeno → §8b)
PROVEDENO. Hotový systémový + user prompt a 5 příkladů JSON: viz ai-gemini-placene.html #g0-vystup.
Další: otestovat v AI Studio (Flash-Lite) na scénářích §8b; pak Fáze G1.
Prompt G0b — testovací sady (provedeno → §8c)
PROVEDENO. Testovací sada T01–T08 + zkrácený summaryToday + kontrolní tabulka:
viz ai-gemini-placene.html #g0b-testy.
Další: spustit T01–T08 v AI Studio proti system promptu §8b.
Prompt G1 — backend PHP stub (provedeno)
PROVEDENO (2026-08-01). Soubor: Easun-Analyza/api_ai_cloud_plan.php
(test: http://localhost/api_ai_cloud_plan.php — GET nápověda, ?probe=1).
Dry-run: api_key=LOCALTEST (jen localhost) + geminiApiKey=TEST.
Auth produkčně: esp_api; Gemini klíč vždy z requestu zařízení, ne env.
Cache 3 h; log cache/ai_cloud/plan.log (klíč maskovaný, Spot jen agregát).
Další: Fáze G2 (ESP read-only UI).
Prompt G2 — ESP read-only UI (provedeno)
PROVEDENO (2026-08-01). Modul ai_cloud.h + háčky v ESP32-Grid-Load-Vypocet800.ino.
- /system-modes: AI Cloud ON/OFF + Gemini key → SPIFFS
- Poll → http://{aiRunLogRemoteUrl}/api_ai_cloud_plan.php (ne Google přímo)
- /ai-live plný blok; /weather+/spot 1 řádek; Home badge; PWM read-only
- §4e stavy + backoff 6h/429→24h; snapshot /aiCloudSnap.ea
Další: field test; Fáze G3 soft bias.
Prompt G3 — soft bias (provedeno)
PROVEDENO (2026-08-01). Soft bias v ai_cloud.h + vypocet02.h (aiResolveFinalPwm).
ΔPWM max ±3 % před aiApplySafetyRules / Spot Gate.
SHADOW loguje cloudBias; ASSIST/AUTO aplikují. Výpadek → 0.
Další: field test; G3b costEstimate z app — hotovo; G4 A/B.
Prompt G3b — odhad nákladů (jen se Spotem) — provedeno
PROVEDENO (2026-08-01). §4b P2 v aplikaci (ai_cloud.h):
- Archiv import Wh po hodinách (cezW>0) × OTE CZK/MWh → costPrecomputed
- Bez Spotu / bez dat: qualitative_only, importCostTodayEst=null
- Proxy api_ai_cloud_plan.php jen echo; Gemini Kč nevymýšlí
- Premium UI /ai-live: řádek „Náklady import dnes“ (bez změny PWM)
Další: field test se Spotem; G4 A/B.
Prompt G4 — vyhodnocení přínosu (postup hotov)
PROVEDENO (2026-08-01) — postup + logování, ne finální go/no-go čísla.
A/B: 7 dní Cloud OFF (A) + 7 dní Cloud ON (B); režim ASSIST/AUTO stejný.
Segmenty: a=Spot+baterie, b=bez Spotu, c=bez baterie — průměry NEMÍCHAT.
Metriky: importWh; minSoc (jen a/b); t1Min; se Spotem highImportWh + costCzk.
Log: AI20 cloudOn/g4seg/cloudBias; o půlnoci EVT G4_DAY.
CSV: api_ai_g4_csv.php?device_ip=&from=&to= (± api_key).
Spot není povinný pro go/no-go — hodnotit v rámci stejného segmentu.
Další: 14denní běh → vyplnit tabulku v §10.
Prompt — bezpečnost + krizové stavy
Audit ai-gemini-placene.html §4b/§4e/§7:
1) Kde může cloud obejít Distr., SOC, teplotu, (volitelně) Spot Gate.
2) Checklist §4e: výpadek Gemini / 429 / offline / bad JSON / expirace / málo heapu —
   nesmí vynulovat PWM, blokovat Home, inventovat čísla, volat Google přímo z ESP.
3) Spot vypnutý ≠ chyba; plán bez Spot oken je validní.
4) Invarianty před biasem (G3). Žádný nový feature — body do HTML / komentářů FW.

10. Vyhodnocení G4 (A/B) + další produkt

G4 postup (2026-08-01): logování + CSV export připraveny. Go/no-go až po 14denním field testu (tabulka níže = šablona).

Postup A/B (14 dní, 1 zařízení = 1 segment)

  1. Určete segment (neměnit během testu):
    • a — Spot ON + baterie
    • b — Spot OFF + baterie
    • c — bez baterie (Spot libovolně)
  2. Stejný lokální režim obě periody: ASSIST nebo AUTO (ne míchat se SHADOW pro PWM metriky).
  3. Perioda A (7 dní): AI Cloud OFF → bez soft bias. AI log na Analýzu zapnutý.
  4. Perioda B (7 dní): AI Cloud ON + platný Gemini klíč → soft bias ±3 %. Stejné limity T / SOC / Gate.
  5. Po půlnoci kontrolujte EVT type=G4_DAY v AI run logu / CSV.
  6. Export: https://api.easun.eu/api_ai_g4_csv.php?device_ip=…&from=YYYYMMDD&to=YYYYMMDD&format=html

Metriky (v rámci jednoho segmentu)

MetrikaZdrojPoznámka
importWhG4_DAYIntegrace cezW>0 (Spot ON); bez Spotu často 0 / qualitative
minSocG4_DAYJen segment a/b — nesmí klesat „díky“ biasu pod safety
t1MinG4_DAYKomfort — min teplota místnosti za den
highImportWhG4_DAYJen se Spotem — import ve high pásmu
costCzkG4_DAYJen se Spotem — OTE × import (app, ne Gemini)
cloudOn / g4segAI20Průběžná kontrola periody A/B a segmentu

Šablona výsledků (vyplnit po 14 dnech)

SegmentA avg importWhB avg importWhΔ %minSoc A/Bt1Min A/BhighImport / cost (jen Spot)Verdikt
a Spot+bat— / —— / —— / —□ go □ no-go
b bez Spotu— / —— / —n/a□ go □ no-go
c bez batn/a— / —(jen pokud Spot)□ go □ no-go
Spot není povinný pro go/no-go. Segment b bez Spotu stačí na rozhodnutí o biasu z FVE/komfortu. Segment a přidává OTE×import a high-okna.

Kdy dává Premium smysl

Kdy Gemini nestačí / je zbytečný

Alternativy k vyhodnocení vedle Gemini

VariantaPlusMínus
Jen weather API + pravidla levné, deterministické, správný zdroj čísel slabší „lidské“ vysvětlení
Gemini Flash plán (nad daty z app) flexibilní policy, CS text náklad, závislost na cloudu
Gemini + Search grounding aktuální zprávy/alerty (ne čísla) dražší; zakázáno jako zdroj temp/Wh/Spot
Vlastní ML na serveru kontrola, bez tokenů vývoj a data náročné

Rozhodovací kritéria po G4 (go / no-go produkt)

  1. Import ze sítě při cloud bias ≤ bez cloudu (nebo −X % při stejném komfortu).
  2. Žádný nárůst safety incidentů (přehřátí, SOC pod min, Spot Gate bypass).
  3. Náklad Gemini / zařízení / měsíc < willingly-to-pay Premium (např. jednotky Kč).
  4. Uživatelé rozumí explainCs (subjektivní feedback).

11. Checklist

Po Fázi G0 (prompty)

Provozovatel (jednou)

Uživatel — aktivace klíče (§2b)

Po Fázi G1 (backend)

Po Fázi G2 (ESP read-only)

Krizové stavy (§4e) — povinné před G3

Po Fázi G3 (bias)