prekopani SELL
This commit is contained in:
@@ -109,27 +109,28 @@ def apply_overrides(plan, overrides) -> Setpoints:
|
||||
|
||||
## Zápis do Deye (Modbus)
|
||||
|
||||
### Fyzický režim (`get_deye_mode`)
|
||||
**Princip:** držet mapování plán → Deye **jednoduché**; detail a zdůvodnění v [`operating-modes.md`](operating-modes.md) (sekce *Keep it simple*).
|
||||
|
||||
Solver rozlišuje **čtyři typy slotů**: **Charge**, **Pass-through**, **Discharge-export**, **Self-consumption**. Na úrovni Deye se mapují na tři fyzické režimy:
|
||||
### Fyzický režim (`get_deye_mode`)
|
||||
|
||||
| Fyzický režim | Podmínka z `ControlSetpoints` |
|
||||
|---|---|
|
||||
| **SELL** | `battery_w` < −500 **a** `grid_setpoint_w` < −200 (záměrné vybíjení baterie do sítě) |
|
||||
| **SELL** | `grid_setpoint_w` < 0 **a** `battery_w` < 0 **a** **\|battery_w\| ≥ \|grid_setpoint_w\|** — plán počítá s výdejem z baterie do sítě alesvěň tak velkým jako plánovaný čistý export. |
|
||||
| **CHARGE** | `battery_w` > 500 **a** `grid_setpoint_w` > 200 (nabíjení ze sítě) |
|
||||
| **PASSIVE** | vše ostatní (pass-through, self-consumption, SELF_SUSTAIN) |
|
||||
| **PASSIVE** | vše ostatní |
|
||||
|
||||
**Pass-through** (PV → síť, baterie idle) zůstává **PASSIVE** — fyzicky se realizuje nastavením reg 108 = 0 (zákaz nabíjení) + reg 145 = 1 (solar sell), takže PV přebytky tečou do sítě.
|
||||
**PASSIVE** (včetně FVE přetoku do sítě): reg. **108/109** škálované podle `battery_w` z plánu, reg. **145** = 1 (solar sell), reg. **142** = `deye_zero_export_mode`.
|
||||
|
||||
**SELF_SUSTAIN** (záložní režim po Modbus mismatch apod.) zůstává **PASSIVE** z hlediska `get_deye_mode`, ale `write_inverter_setpoints` nastaví **reg. 108 i 109 na maximum z DB** (`self_sustain_local_use=True` v `ControlSetpoints`), **reg. 142** na `asset_inverter.deye_zero_export_mode` (1 = zero export to load, 2 = zero export to CT) a **TOU SOC** na **`min_soc_percent`** (typicky 12 %), aby střídač maximalizoval využití baterie lokálně místo zákazu nabíjení při `battery_w=None`.
|
||||
|
||||
### Klíčové registry podle typu slotu
|
||||
|
||||
| Registr | Charge | Pass-through | Discharge-export | Self-consumption |
|
||||
| Registr | Charge | Pass-through / PASSIVE | SELL (battery-led) | Self-consumption |
|
||||
|---|---|---|---|---|
|
||||
| **108** (charge A) | max z DB | **0** | 0 | **0** |
|
||||
| **109** (discharge A) | max | max | max | max |
|
||||
| **108** (charge A) | škálo dle `battery_w` | škálo dle `battery_w` (>0) / **0** | **0** | **0** |
|
||||
| **109** (discharge A) | **0** | škálo dle `\|battery_w\|` (<0) / **0** | **max z DB** | škálo dle `\|battery_w\|` |
|
||||
| **142** (limit control) | `deye_zero_export_mode` | `deye_zero_export_mode` | **0** (selling first) | `deye_zero_export_mode` |
|
||||
| **143** (export cap) | max z DB | max z DB | `min(max_site, max(200, \|grid_setpoint_w\|))` | max z DB |
|
||||
| **145** (solar sell) | 1 | 1 | 1 | 1 |
|
||||
| **178** (peak shaving) | 48 | 48 | **32** | 48 |
|
||||
|
||||
|
||||
@@ -50,13 +50,13 @@ Vychází z **`grid_setpoint_w`** a **`battery_w`** z `ControlSetpoints` (aktivn
|
||||
|
||||
| Režim | Podmínka |
|
||||
|-------|----------|
|
||||
| **SELL** | `battery_w` < −500 **a** `grid_setpoint_w` < −200 (aktivní vybíjení baterie pro export) |
|
||||
| **SELL** | `grid_setpoint_w` < 0 **a** `battery_w` < 0 **a** **\|battery_w\| ≥ \|grid_setpoint_w\|** (výdej z baterie alesvěň tak velký jako plánovaný export) |
|
||||
| **CHARGE** | `battery_w` > 500 **a** `grid_setpoint_w` > 200 |
|
||||
| **PASSIVE** | vše ostatní (včetně pass-through, self-consumption, SELF_SUSTAIN, IDLE, …) |
|
||||
|
||||
Režim **CHARGE_CHEAP** v EMS nastaví `grid_setpoint_w` tak, aby platila podmínka importu (> 200 W), jinak by fyzicky zůstal PASSIVE.
|
||||
|
||||
**Důležité:** SELL se aktivuje **pouze** při záměrném vybíjení baterie do sítě (`bat_w < −500`). Pass-through (PV → síť, baterie idle) zůstává v PASSIVE s reg 108 = 0.
|
||||
**Důležité:** **SELL** jen pro záměr **vylít baterku do sítě** (viz `operating-modes.md`, *Keep it simple*). FVE přetok / malý doplněk z baterie vůči většímu exportu zůstává **PASSIVE** (reg. **108/109** škálované podle plánu).
|
||||
|
||||
### Provozní režim EMS SELF_SUSTAIN
|
||||
|
||||
@@ -70,12 +70,12 @@ Z hlediska `get_deye_mode` je **SELF_SUSTAIN** stále **PASSIVE** (`battery_w` z
|
||||
|
||||
Solver předvybírá sloty pro nabíjení a export-vybíjení (`_select_charge_slots`, `_select_discharge_export_slots`). Nabíjení: vždy povoleno v slotech s PV-surplus; zbytek rozpočtu (`charge_slot_buffer × (soc_max − current_soc) − PV přínos`) doplněn nejlevnějšími sloty podle **`buy_price`** (nákupní cena ze sítě). Export-vybíjení: top-N slotů podle nejvyšší **`sell_price`**. Výsledné setpointy pak určují typ slotu:
|
||||
|
||||
| | **Charge** | **Pass-through** | **Discharge-export** | **Self-consumption** |
|
||||
| | **Charge** | **Pass-through** | **Battery→grid (SELL)** | **Self-consumption** |
|
||||
|---|---|---|---|---|
|
||||
| **Kdy** | Solver: `bat_w > 0` | Solver: `bat_w == 0`, PV > spotřeba | Solver: `bat_w < −500`, `grid_w < −200` | Noc / PV < spotřeba |
|
||||
| **Kdy** | Solver: `bat_w > 0` | Solver: typicky export z FVE; `\|bat\| < \|grid\|` při exportu | `grid_w < 0`, `bat_w < 0`, `\|bat\| ≥ \|grid\|` | Noc / PV < spotřeba |
|
||||
| **Deye mode** | PASSIVE | PASSIVE | SELL | PASSIVE |
|
||||
| **108** charge A | **max** (z DB) | **0** | 0 | **0** |
|
||||
| **109** discharge A | max | **max** | **max** | **max** |
|
||||
| **108** charge A | škálo dle `bat_w` | škálo / **0** | **0** | **0** |
|
||||
| **109** discharge A | **0** | škálo dle `\|bat_w\|` | **max** | škálo dle `\|bat_w\|` |
|
||||
| **142** limit control | `deye_zero_export_mode` (1 nebo 2) | `deye_zero_export_mode` (1 nebo 2) | **0** (selling first) | `deye_zero_export_mode` (1 nebo 2) |
|
||||
| **145** solar sell | **1** (enabled) | **1** (enabled) | **1** (enabled) | **1** (enabled) |
|
||||
| **178** peak shaving | 48 (PASSIVE) | 48 (PASSIVE) | **32** (SELL) | 48 (PASSIVE) |
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# Provozní režimy EMS
|
||||
|
||||
## Keep it simple
|
||||
|
||||
- **Méně heuristik a pevných wattových práhů v řízení** — každá magická konstanta je místo, kde se rodí neshody s plánem a ekonomikou.
|
||||
- **SELL na Deye** používej jen tam, kde produktově opravdu chceme režim „**vylít baterii do sítě**“ (selling first). Vše ostatní patří do **PASSIVE** a tok FVE ↔ baterie ↔ síť se řeší **reg. 108 / 109 / 142** podle plánu a instalace.
|
||||
- Novou logiku vždy ověřit proti **reálnému řádku plánu** (audit / `planning_interval`) a typické chybě „plán říká kW, měnič jede na MW“.
|
||||
|
||||
## Přehled
|
||||
|
||||
| Mode | Solver constraints | Deye fyzický režim | Baterie |
|
||||
@@ -14,13 +20,13 @@ Implementace: omezení LP v `planning_engine.solve_dispatch()` podle `mode_code`
|
||||
|
||||
## Fyzické režimy Deye (výstup control_exporteru)
|
||||
|
||||
Detekce z `battery_w` a `grid_setpoint_w` (`get_deye_mode`):
|
||||
Detekce v `get_deye_mode` (`battery_w` = `battery_setpoint_w` z plánu, záporné = vybíjení; `grid_setpoint_w` záporné = export do sítě):
|
||||
|
||||
- **PASSIVE:** `grid_setpoint_w >= -200` → reg **142** = `deye_zero_export_mode`, reg **178** = 48; **108** = max jen při plánovaném nabíjení (`battery_w` > 0), jinak typicky **108 = 0** a **109** = max — **výjimka SELF_SUSTAIN:** příznak `self_sustain_local_use` → **108 i 109 = max** (viz `control_exporter.py`). **0/0** jen při `lock_battery` (PRESERVE).
|
||||
- **SELL:** `grid_setpoint_w < -200` → reg142=0, reg178=32, 108/109=max
|
||||
- **CHARGE:** `grid_setpoint_w > 200` **a** `battery_w > 500` → reg142=1, reg178=48
|
||||
- **CHARGE:** `battery_w` > 500 **a** `grid_setpoint_w` > 200 → nabíjení ze sítě; reg. **142** dle CHARGE větve v exporteru, **178** = 48.
|
||||
- **SELL:** `grid_setpoint_w` < 0 **a** `battery_w` < 0 **a** `|battery_w| ≥ |grid_setpoint_w|` → záměr **vybíjet baterii do sítě** (selling first); reg. **142** = 0, **178** = 32, **108** = 0, **109** = max, reg. **143** omezen podle `|grid_setpoint_w|` (viz `control_exporter.py`).
|
||||
- **PASSIVE:** vše ostatní — tok FVE a baterie řídí **reg. 108** (nabíjení) a **109** (vybíjení, škálované podle `|battery_w|`), **142** = `deye_zero_export_mode`, **145** = 1, **178** = 48.
|
||||
|
||||
`battery_w = None` a `self_sustain_local_use=True` (**SELF_SUSTAIN**) ⇒ pro `get_deye_mode` se bere jako 0 ⇒ při `grid_setpoint_w = 0` je **PASSIVE**; v `write_inverter_setpoints` se ale zapíše **108 = max** a **109 = max**, reg **142** = zero export dle DB, TOU SOC = **`min_soc_percent`** (ne ekonomická větev 100 % z ceny).
|
||||
**SELF_SUSTAIN:** `battery_w = None` ⇒ v `get_deye_mode` jako 0 ⇒ typicky **PASSIVE**; v `write_inverter_setpoints` při `self_sustain_local_use=True` → **108 i 109 = max**, reg. **142** = zero export dle DB, TOU SOC = **`min_soc_percent`**. **PRESERVE:** `lock_battery` → **108 = 0**, **109 = 0**.
|
||||
|
||||
## EMS politiky (nejsou fyzické stavy Deye)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user