EaSun · ESP32-Grid-Load-Vypocet900

PWM opravy a optimalizace provozu

Dokumentace řešení známých rizik PWM regulace, bezpečného pořadí AI limitů, vylepšení simulace /solar-sim a optimalizace paměti při zapnutí/vypnutí simulace. Projekt: ESP32-Grid-Load-Vypocet900 · logika vypocet01.h, AI mix vypocet02.h, limity spotove_ceny.h, UI /pwm + /solar-sim.

4/4rizika PWM v kódu
AI limityvždy po mixu
SPIFFSthrottle + RAM log
E2Ematice na zařízení
Shrnutí

1. Přehled změn v aplikaci

Stav dokumentace: 2026-08-08 · cíl: stabilní PWM, čitelné důvody, rychlá simulace.

Oblast Problém Řešení Stav
Vyhlazování pwm_smoothing nevstupovalo do rampy UI muted + text, že platí speed / delay / slow Hotovo
Distr. = 2 Při FVE přebytku Dist.2 zvedal PWM a blokoval Prebytek Prebytek i při Distr1=2; Dist.2 jen hold/− / hold+FVE Hotovo
Baterie Neviditelný cut, příliš agresivní BATT_CHARGE_CUT, sim override, měkčí %/s, spareOk Hotovo
AI ASSIST/AUTO Obava, že limity ČEZ/Amax neplatí po AI Telemetrie + hard limity vždy po AI; sync final Hotovo · E2E na zařízení
Solar-sim UX Chybějící Min/Max W, override FVE/V, ruční PWM Sekce ŘÍZENÍ…LOG, override MQTT, PWM speed, ECO, batt Hotovo
Výkon sim Zpomalení při zap/vyp a během simulace Throttle SPIFFS, RAM log, řidší poll UI Hotovo
Architektura

2. Pipeline PWM — pořadí výpočtu

Klíčové zjištění auditu: hard limity applySolarAmaxPwmLimit a applyCezWMaxPwmLimit běží až po AI mixu. Soft cez uvnitř AI (÷80) není ekvivalent hard cutu.

MQTT / sim override solarW · load · cez · batt OvladaniPwmSSR VypocetSolar… Klasika → fallbackPwm FVE · Dist · batt · ECO aiResolveFinalPwm (ASSIST/AUTO/SHADOW) mix · safety ÷80 · step · Spot Gate applySolarAmaxPwmLimit hard Amax applyCezWMaxPwmLimit hard CEZ_MAX_CUT VypocetProcenta + sync AI final mute heat · analogWrite Hard limity vždy po AI — stejná agresivita Original i ASSIST
Obr. 1 — Call chain z OvladaniPwmSSR po výstup PWM
Hotovo

3. Vyhlazování z /pwm — pwm_smoothing

UI /pwm · SPIFFS /pwm_smoothing.ea · alias userPwmSmoothingFactor

Řešení

Volitelné napojení na cap kroku nebylo potřeba — méně rizikový diff.

Hotovo Ověřit Distr=2 vs 0 na zařízení

4. Distr. Ano-Min-Max (distributor = 2)

RegulacePwmPodleDistributoraFunkce() · warning distr2Active

Problém před opravou

Při distributor1==2 neběžel Prebytek/deficit; Dist.2 sám zvedal PWM i při vysokém FVE — na /solar-sim to vypadalo jako „matoucí“ chování oproti Distr=0.

Řešení

solarSurplusOk? ANO → Prebytek vždy Dist.2: hold / − / hold+FVE NE → Dist / batt / síť Dist.2 smí + (Ano-Min-Max) ano ne Min W = Dist Ano-Min-Max · Max W = CEZ_MAX_CUT vždy
Obr. 2 — Dist.2 po opravě: Prebytek není blokován
Hotovo

5. Baterie — BATT_CHARGE_CUT

RegulacePwmPodleBaterieFunkce() · sim battOn / W / V / MaxW

Chování (5 bodů)

  1. Vstup: batteryV > 10, batteryMaxWatt ≠ 0, batteryW < batteryMaxWatt.
  2. Skip (neubírá): spareOk = solarSurplusOkNow() || FVE > loadNet+30.
  3. Cut: ~0.35× speed (slow) / ~0.5 %/s (fast), strop 1.5 %/s.
  4. Vypnuto: MaxW=0 nebo V≤10 → cut=0.
  5. Viditelnost: reason BATT_CHARGE_CUT má prioritu před SURPLUS_RAMP.
PředPo
Pomalý režim ~plná pwm_speed (např. 2 %/s) ~0.35 × speed (2 → ~0.7 %/s)
Rychlý režim ≈ 1.5 %/s, strop 5 %/s ≈ 0.5 %/s, strop 1.5 %/s
Při surplus často ještě ubíral cut skip (spareOk)

Sim: checkbox „Přepsat baterii“ (default OFF) pro test bez reálné baterie.

Telemetrie + limity E2E checklist

6. AI ASSIST / AUTO vs fallback

aiResolveFinalPwm() · JSON: fallbackPwm, aiSuggestedPwm, finalPwm, aiMode, assistMixPercent, usedFallback, mqttFresh, luxFresh

Řešení

Očekávané chování režimů

UX + API

7. Simulace /solar-sim — funkční změny

Stránka slouží k bezpečnému ladění bez ovlivnění reálného distributora po rebootu (sim ON / heat out / ruční PWM po startu vždy OFF).

UI /solar-sim slidery · režimy /api/solar-sim-set RAM + dirty cfg applySolarSim… override W/V/batt PWM pipeline /api/solar-sim · LIVE JSON reason · AI fb/sug/final · alerts
Obr. 3 — Tok nastavení simulace a live telemetrie
Optimalizace

8. Paměť a rychlost při simulaci

Zpomalení při zapnutí/vypnutí sim a během posouvání sliderů nebylo v samotném PWM výpočtu, ale v častých zápisech SPIFFS, velkých String dumpů logu a hustém pollu UI.

Úzká místa (před)

Úpravy (po)

OblastZměnaEfekt
Cfg SPIFFS Force jen při zap/vyp sim; slidery throttle 3 s + dirty v loop Méně flash wear, méně zasekávání
Log náhled solarSimLogDumpTail z RAM bez SPIFFS Lehký HTTP response
Log flush ~40 řádků nebo 20 s; download flushne jednou Méně heap fragmentace
Ring 60×128 B (~polovina BSS) Úspora statické RAM
Interval log 350–800 ms mezi řádky Méně CPU při rampě
UI poll LIVE 2 s; log tail ~6 s Méně zátěže Wi‑Fi/Async
Default log Vypnuto (zapnout jen při ladění) Nejrychlejší provoz sim
PŘED set → SPIFFS vždy view log → dump + flush PO set → RAM; SPIFFS throttle view → RAM tail Zap/vyp sim = jediný force cfg Log OFF = maximální rychlost během testu
Obr. 4 — Minimalizace SPIFFS během simulace
Na zařízení

9. Ověření — checklist

Distr.2

Baterie

AI (Distr=0, batt OFF) — Original → ASSIST → AUTO

  1. Velký surplus — ASSIST final mezi fb a AI; AUTO ≈ AI při fresh
  2. FVE 0 + slow OFF → cut k 0; ASSIST/AUTO nesmí držet vysoké PWM
  3. cez ≥ Max → CEZ_MAX_CUT ve všech režimech
  4. Proud u Amax → AMAX_* cut
  5. Spot Gate NE → AI final ≤ fallback bez silného surplus
  6. AUTO bez mqttFresh → usedFallback=true

Výkon sim

Reference

10. Soubory projektu

Doporučené limity distributora (provoz)
  • Max W: typicky 800–1500 W (často 1000) — hard cut odberu ze sítě
  • Min W: 100–200 / 150–300 — hlavně Dist Ano-Min-Max