deye ridi maximalni flow do baterie hlavne z gridu
This commit is contained in:
@@ -54,6 +54,15 @@ Solver optimalizuje celý horizont (typicky 36h) najednou, čímž přirozeně z
|
||||
- Max import ze sítě: dle `site_grid_connection.max_import_power_w`
|
||||
- Konfigurovatelné per site v DB
|
||||
|
||||
#### Plánovací strop `gi[t]` vs. fyzický jistič
|
||||
|
||||
V LP má `grid_import[t]` (proměnná `gi`) horní mez **`max_import_power_w + battery.max_charge_power_w`**, ne jen `max_import_power_w`. Důvod:
|
||||
|
||||
- Ceny se mění co 15 min a cílem je nabíjet baterii v **cenově nejlepších oknech** na BMS max (17–18 kW), i když baseline zátěž doma navíc sežere část jističe.
|
||||
- O fyzické dodržení jističe se stará **Deye reg 128** (grid charge current) + firmware — v reálném čase sníží `bc`, když `load + bc` přesáhne breaker.
|
||||
- Pokud bychom `gi[t] ≤ max_import_power_w` nechali jako tvrdé LP omezení, LP by v slotech s vyšší `load_baseline_w` zbytečně osekával `bc` dolů (viděno např. 2026-04-19 13:30: load 3.7 kW, breaker 17 kW → `bc ≤ 17 − 3.7 + pv_b ≈ 14.7 kW`, i když BMS zvládne 18 kW). Optimistický `gi` horní strop umožní plánovat plné využití BMS v cenových oknech; reálný HW nikdy nepřetáhne jistič.
|
||||
- **Trade-off**: `expected_cost` v plánu může být mírně optimistický (LP spočítá s ~20 kW importem, reálně občas míň kvůli skokům domácí zátěže). Rozdíl se automaticky dohání rolling replanem co 15 min.
|
||||
|
||||
---
|
||||
|
||||
## Energetická bilance (pro každý 15min slot t)
|
||||
@@ -82,7 +91,7 @@ kde:
|
||||
|
||||
| Proměnná | Typ | Rozsah | Popis |
|
||||
|---|---|---|---|
|
||||
| `grid_import[t]` | kontinuální | 0 – max_import | Nákup ze sítě v W |
|
||||
| `grid_import[t]` | kontinuální | 0 – (max_import + bms_max_charge) | Nákup ze sítě v W; breaker fyzicky drží Deye reg 128 |
|
||||
| `grid_export[t]` | kontinuální | 0 – max_export (13500) | Prodej do sítě v W |
|
||||
| `battery_charge[t]` | kontinuální | 0 – max_charge | Nabíjení baterie v W |
|
||||
| `battery_discharge[t]` | kontinuální | 0 – max_discharge | Vybíjení baterie v W |
|
||||
@@ -200,7 +209,7 @@ soc_min_wh <= soc[t] <= soc_max_wh # min_soc_percent z DB (provozní podlaha,
|
||||
```python
|
||||
0 <= battery_charge[t] <= battery.max_charge_power_w
|
||||
0 <= battery_discharge[t] <= battery.max_discharge_power_w
|
||||
0 <= grid_import[t] <= grid.max_import_power_w
|
||||
0 <= grid_import[t] <= grid.max_import_power_w + battery.max_charge_power_w # LP soft; fyzicky drží Deye reg 128
|
||||
0 <= grid_export[t] <= grid.max_export_power_w # = 13500 pro home-01
|
||||
0 <= pv_a_curtailed[t] <= pv_a_forecast[t]
|
||||
0 <= ev_charge[t] <= ev_max_total_w
|
||||
@@ -271,7 +280,9 @@ def solve_dispatch(
|
||||
prob = pulp.LpProblem("ems_dispatch", pulp.LpMinimize)
|
||||
|
||||
# --- Proměnné ---
|
||||
grid_import = [pulp.LpVariable(f"gi_{t}", 0, grid.max_import_power_w) for t in range(T)]
|
||||
# gi horní mez = breaker + BMS max_charge (LP optimistický strop, Deye reg 128 chrání fyzicky)
|
||||
gi_upper = grid.max_import_power_w + battery.max_charge_power_w
|
||||
grid_import = [pulp.LpVariable(f"gi_{t}", 0, gi_upper) for t in range(T)]
|
||||
grid_export = [pulp.LpVariable(f"ge_{t}", 0, grid.max_export_power_w) for t in range(T)]
|
||||
batt_charge = [pulp.LpVariable(f"bc_{t}", 0, battery.max_charge_power_w) for t in range(T)]
|
||||
batt_discharge = [pulp.LpVariable(f"bd_{t}", 0, battery.max_discharge_power_w) for t in range(T)]
|
||||
|
||||
Reference in New Issue
Block a user