EaSun · ESP32-Grid-Load-Vypocet700 · placené AI
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.
| 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) |
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.
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.
AIza…).
explainCs). Poll držte nízký: 1× denně nebo max
6× denně — Free tier má nižší RPM / denní limity.
| 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 |
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í.
| Vrstva | Odpově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 |
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.
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.
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í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.
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.
Č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í).
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í.
| Prio | Use-case | Proč |
|---|---|---|
| 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 |
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.
| FW zdroj | Co 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é |
| 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 |
spot.available=false →
plán bez Spot oken (to je OK — Spot je volitelný); AI zdarma bez Spot korekce.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).
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.
| Stránka v aplikaci | Co z Gemini | Co 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 |
validUntil): text zašedlý / „neaktuální“; neaplikovat bias.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é.
…):
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).
/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).
/ai-live. Ostatní stránky max. 1 krátký řádek + odkaz
na /ai-live (ne kopírovat explainCs třikrát).
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).
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.
| Stránka | Max. 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ů |
/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).
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.
/ai-live (hlavní cloud blok)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)
| PWM | navrženo 42 % · po safety 38 % · systém 38 % |
| Zdroj AI | ASSIST · mqttFresh |
| LUX | 820 lx — jasné |
…). Plný / historický obsah patří na server.
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).
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 UI | api.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) |
heatBias/chargeBias = 0.| Stav | Co 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) |
Proč (staré): Dopoledne nabít, večer topit z baterie…
Text může být neúplný / neaktuální
Počkejte 15–60 min, neklikejte testy; nebo billing. Lokální AI běží dál.
Neplatný nebo chybějící Gemini klíč — uložte nový. Lokální AI běží dál.
Proč: (zašedlý starý text) …
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.
| 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 |
| 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 |
spot.available=false / Spot vypnutý → žádná Spot okna v plánu.| 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 |
| Volba uživatele | Jak 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) |
{
"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"
}
}
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.
{
"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"]
}
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.
| Gemini pole | Kam 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 |
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é pro | Pozná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 |
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×.
| Režim poll | Sloty / den | Dotazy / 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 |
| 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č |
| 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č |
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é.
| Poll | Callů / měsíc | ≈ USD | ≈ Kč |
|---|---|---|---|
| 1×/den | 3 000 | $3.4 | ≈ 78 Kč |
| 6×/den | 18 000 | $20 | ≈ 470 Kč |
| 16×/den | 48 000 | $54 | ≈ 1 240 Kč |
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.
confidence → ignorovat plán.Fáze G0 — průzkum HOTOVO (návrh promptů)
AI Studio prototypFáze G1 — backend stub HOTOVO localhost
Endpoint bez zásahu do PWMPOST /api_ai_cloud_plan.php (lokální Analýza /
localhost):
telemetrie + weather; Spot hourly* jen pokud available.api_key (esp_api); Gemini klíč jen ze zařízení
(geminiApiKey v POST — ne server env.spot.available=false → neutral (ne 422).geminiApiKey=TEST pro localhost.Fáze G2 — ESP read-only HOTOVO (FW)
Premium UI bez řízeníaiCloudEnabled + geminiApiKey; poll 1–2×/den (ai_cloud.h)./ai-live; /weather//spot 1 řádek; Home badge;
/system-modes ON/OFF+klíč bez briefingu.Fáze G3 — soft bias HOTOVO (FW)
Napojení na lokální AI (+ Spot okna)aiResolveFinalPwm před safety: ΔPWM = heatBias×1.5 + okna, clamp ±3 %.cloudBias v AI LIVE / AI20 (PWM=fallback).Fáze G4 — vyhodnocení + produkt POSTUP HOTOV
A/B 14 dní + CSVcloudOn + g4seg + cloudBiasEVT type=G4_DAY (importWh, minSoc, t1Min, highImportWh, costCzk)api_ai_g4_csv.php?device_ip=…&from=&to=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.
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.
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.
{
"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"]
}
{
"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"]
}
{
"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"]
}
{
"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"]
}
{
"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"]
}
{
"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"]
}
"spot":{"available":false}; u bez baterie vynechte soc nebo
pošlete "hasBattery":false v prefs (backend může mapovat).
forecast.todayWh, now.tempMax,
spotCzkMwh / hourlyToday (ty hodnoty ve výstupu vůbec nejsou jako autorita).
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"]
}
}
hourlyToday volitelně
(24 int) jen při ladění. Bez Spotu celý objekt spot = {"available":false}.
respectLocalGate: true vždy.spot.available=false → spotStrategy=neutral, prázdné Spot okna, žádné Kč v textu.chargeBias=0, preferChargeWindows=[], targetSocBeforeHighSpot=null.{
"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.
{
"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.
{
"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.
{
"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.
{
"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.)
{
"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.
{
"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.
{
"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“.
| ID | Spot | Baterie | Očekávané spotStrategy | Zákaz |
|---|---|---|---|---|
| T01 | ne | ano | surplus_heat | Kč, Spot okna |
| T02 | ne | ano | hold_battery / neutral | Kč, Spot okna |
| T03 | ne | ne | surplus_heat | SOC cíle, Kč |
| T04 | ano | ano | charge_before_high | měnit hourly/Wh |
| T05 | ano | ano | charge_before_high / hold | měnit Wh/Kč |
| T06 | ano | ne | surplus_heat | preferCharge, targetSoc |
| T07 | ano Gate NE | ano | hold_battery | tip grid-heat |
| T08 | ne | ano | neutral | halucinovat forecast |
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.
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.
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.
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).
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.
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.
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.
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.
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.
a — Spot ON + baterieb — Spot OFF + bateriec — bez baterie (Spot libovolně)EVT type=G4_DAY v AI run logu / CSV.https://api.easun.eu/api_ai_g4_csv.php?device_ip=…&from=YYYYMMDD&to=YYYYMMDD&format=html| Metrika | Zdroj | Poznámka |
|---|---|---|
importWh | G4_DAY | Integrace cezW>0 (Spot ON); bez Spotu často 0 / qualitative |
minSoc | G4_DAY | Jen segment a/b — nesmí klesat „díky“ biasu pod safety |
t1Min | G4_DAY | Komfort — min teplota místnosti za den |
highImportWh | G4_DAY | Jen se Spotem — import ve high pásmu |
costCzk | G4_DAY | Jen se Spotem — OTE × import (app, ne Gemini) |
cloudOn / g4seg | AI20 | Průběžná kontrola periody A/B a segmentu |
| Segment | A avg importWh | B avg importWh | Δ % | minSoc A/B | t1Min A/B | highImport / cost (jen Spot) | Verdikt |
|---|---|---|---|---|---|---|---|
| a Spot+bat | — | — | — | — / — | — / — | — / — | □ go □ no-go |
| b bez Spotu | — | — | — | — / — | — / — | n/a | □ go □ no-go |
| c bez bat | — | — | — | n/a | — / — | (jen pokud Spot) | □ go □ no-go |
| Varianta | Plus | Mí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é |
explainCs (subjektivní feedback)./app/apikeyapi_ai_cloud_plan.php); dry-run TEST OKaiCloudEnabled=0)/ai-liveavailable=false bez Spotu); bez baterie bez fiktivního SOC