Files
ems/docs/04-modules/provozni-rezimy-checklist.md
Dusan Vojacek 7490ac3d70
Some checks failed
CI and deploy / migration-check (push) Failing after 20s
CI and deploy / deploy (push) Has been skipped
planner v2 vc. porovnani
2026-05-15 23:03:32 +02:00

306 lines
7.3 KiB
Markdown

# Provozní režimy EMS - praktický přehled
Tenhle dokument je zkrácený provozní cheat sheet. Cíl je jednoduchý:
- rychle poznat, co EMS v daném slotu dělá
- umět to porovnat s `planning_interval`
- ověřit to na live registrech Deye a ve FE
## 1. Co je zdroj pravdy
- EMS provozní režim lokality: `ems.site_operating_mode.mode_code`
- aktivní plán: `ems.planning_interval`
- fyzická konfigurace invertoru: `asset_inverter` + `site_grid_connection`
- live stav Deye: registry 108, 109, 141, 142, 143, 145, 178, 340
Když něco nesedí, porovnávej vždy v tomto pořadí:
1. `planning_interval`
2. `control/registers` na FE
3. `modbus_command` journal
## 2. EMS režimy lokality
### AUTO
Normální provoz. EMS bere sloty z `planning_interval` a podle nich řídí Deye, EV, TČ a signály.
V AUTO se pak mohou objevit sloty s různým exportním záměrem:
- `PV_SURPLUS`
- `BATTERY_SELL`
- `NONE`
### SELF_SUSTAIN
Bezpečný provoz bez obchodní logiky.
- Deye fyzicky běží v PASSIVE
- baterie se nechává pro vlastní spotřebu
- export je jen nouzový ventil, pokud je potřeba kvůli feasibility
### CHARGE_CHEAP
- nabíjení ze sítě
- export se nepoužívá
- fyzicky CHARGE
### PRESERVE
- baterie je uzamčená
- žádné nabíjení ani vybíjení
- fyzicky PASSIVE
### MANUAL
- EMS setpointy nezapisuje
- vše je ruční řízení
## 3. Tvoje 5 provozních archetypů
### 1. Standardní režim s přetokem
Co tím myslíme:
- baterie se normálně nabíjí i vybíjí podle plánu
- přetok do sítě je povolený
- exportní limit je jen tvrdý site / inverter cap
- když je baterie plná, přebytek FVE jde do sítě
Jak to je v implementaci:
- `export_mode = PV_SURPLUS`
- `export_limit_w = hard cap`
- `solar_sell = 1`
- `deye_physical_mode = PASSIVE`
- v PASSIVE se pro exportní slot (bez plánovaného nabíjení z baterie) používají typicky **`108` i `109` na max** z invertoru; přebytek do sítě řeší **142/145** a firmware, ne umělé **108 = 0** (to dřív matlo měnič jako „baterie plná“)
Poznámka:
- exportní limit se už netipuje z forecastu
- neomezuješ tedy výkon do sítě podle předpovědi, jen podle hard capu
### 2. Standardní režim s vypnutým přetokem
Co tím myslíme:
- `solar_sell = false`
- přebytek FVE se nesmí posílat do sítě
- jakmile je baterie plná, FVE se utlumí
Jak to je v implementaci:
- tohle není samostatný fyzický Deye režim
- většinou jde o kombinaci:
- `reg 143 = 0` nebo site `no_export`
- případně `export_ban = true` a `reg 145 = 0`
- fyzicky to pořád bývá PASSIVE
Poznámka:
- tohle je důležité ověřovat na `reg 143` a `reg 145`, ne jen na `grid_setpoint_w`
### 3. Prodej přebytku do sítě bez nabíjení baterie
Co tím myslíme:
- baterie není cílem
- nechci ji nabíjet
- chci prodávat celou výrobu do sítě
Jak to je v implementaci:
- `export_mode = PV_SURPLUS`
- `solar_sell = 1`
- `export_limit_w = hard cap`
Poznámka k implementaci:
- tohle je v kódu garantované až ve chvíli, kdy planner dá `battery_setpoint_w = 0`
- pokud je `battery_setpoint_w > 0`, tak současná implementace už dovoluje i nabíjení baterie, i když exportní záměr zůstává `PV_SURPLUS`
- jinými slovy: čisté „prodávám výrobu, ale baterii nechci nabíjet“ ještě není samostatný fyzický Deye režim, je to kombinace plánovacího setpointu a exportního záměru
Použití:
- vhodné, když je výkupní cena vysoká
- baterii chceš šetřit na jiný slot
### 4. Šetření baterie
Co tím myslíme:
- když je kupní cena nízká
- nechci brát energii z baterie
- raději budu kupovat ze sítě
Jak to je v implementaci:
- `battery discharge A = 0`
- fyzicky PASSIVE
- baterie se nevybíjí, ale podle slotu se může pořád nabíjet nebo držet
Poznámka:
- tohle je jiné než SELL
- tady jen chráníš baterii, neprodáváš ji
### 5. Aktivní prodej do sítě z baterie
Co tím myslíme:
- `selling first`
- baterie prodává do sítě plným výkonem, co dovolí střídač / baterie / síť
Jak to je v implementaci:
- `export_mode = BATTERY_SELL`
- `deye_physical_mode = SELL`
- `reg 142 = 0`
- `reg 178 = 32`
- `reg 109` na max, `reg 108 = 0` (jen ve fyzickém **SELL** — aktivní výdej baterie do sítě; u **PASSIVE** + přetoku FVE už **108** typicky **max**)
## 4. Další režimy, které v praxi existují
### CHARGE_CHEAP
- nabíjení ze sítě
- fyzicky CHARGE
### SELF_SUSTAIN
- vlastní spotřeba
- fyzicky PASSIVE
- export jen jako nouzový ventil
### PRESERVE
- baterie uzamčená
- žádné řízení baterie
### MANUAL
- EMS nezasahuje
## 5. Registry, které má smysl kontrolovat
### 108
Max charge current.
### 109
Max discharge current.
### 142
Limit control:
- `0` = selling first
- `1` = zero export to load
- `2` = zero export to CT
### 143
Export cap.
- tvrdý site / inverter limit
- neforecastuje se
### 145
Solar sell:
- `1` = povoleno
- `0` = zakázáno
### 178
Bitové pole:
- bits 4-5 = peak shaving switch
- bits 0-1 = GEN export cut-off u BA81
### 340
Max solar power pro řízenou FVE A.
- není to exportní cap
- je to strop výroby pole A
## 6. Co kontrolovat na FE
### Planning page
Zkontroluj:
- `deye_physical_mode`
- `grid_setpoint_w`
- `export_limit_w`
- `export_mode`
- `deye_gen_cutoff_enabled`
- `effective_buy_price`
- `effective_sell_price`
### Control panel
Na živém panelu porovnej:
- reg 142
- reg 143
- reg 145
- reg 178
Reg 143 musí být vidět jako hard cap.
## 7. Rychlá kontrola nesrovnalostí
1. Najdi slot v `Planning`
2. Podívej se na:
- `battery_setpoint_w`
- `grid_setpoint_w`
- `export_limit_w`
- `export_mode`
- `deye_physical_mode`
3. Otevři `ControlPanel`
4. Porovnej live registry:
- 142
- 143
- 145
- 178
5. Podívej se do `modbus_command`
## 8. Co je v implementaci důležité vědět
Tady jsou dva praktické detaily:
- `export_limit_w` se bere jako hard cap z lokality / invertoru
- export se už netipuje z forecastu
To znamená:
- při `PV_SURPLUS` se má pustit maximum, které dovoluje distribuce a HW
- při `BATTERY_SELL` se použije SELL a prodej z baterie
- při běžném importu / šetření baterie se exportní logika nemá „uhádnout“ z ceny nebo forecastu
## 9. Kde hledat v kódu
- plánování: `backend/services/planning_engine.py`
- mapování plánu na setpointy: `backend/services/control/setpoints.py`
- zápis Deye: `backend/services/control/inverter.py`
- live registry: `backend/app/routers/sites.py`
- FE plánování: `frontend/src/pages/Planning.tsx`
- FE live registry: `frontend/src/components/ControlPanel.tsx`
## 10. Planner v2
Pro přesné zadání nové verze planneru se řiď sekcí **Planner v2** v [`docs/04-modules/planning.md`](/home/dusan.vojacek@triglav.local/Documents/AI-projekty/ems-cursor/docs/04-modules/planning.md).
Krátké shrnutí:
- `reserve_soc_percent` = ranní cílová rezerva
- `min_soc_percent` = tvrdá TOU / fyzická podlaha
- PV A je řiditelná, PV B je neřiditelná
- při záporné prodejní ceně se zakazuje export
- v BA81 se cutoff mikroinvertoru řeší přímo v planneru
- pokud je zapnuté `PLANNING_ENGINE_COMPARE_ENABLED`, backend spočítá i druhou verzi nad stejným vstupem, uloží ji jako read-only `planning_run` se stavem `comparison`, napáruje ji na aktivní run přes `comparison_of_run_id` a FE ji ukáže v `/plan/compare`; fyzicky se aplikuje jen aktivní plán