narovnani spravneho rezimu - nastavenim charge A
This commit is contained in:
@@ -37,7 +37,6 @@ from services.control.modbus_journal import (
|
||||
from services.control.models import ControlSetpoints
|
||||
from services.control.repository import _get_current_soc, _load_inverter_config
|
||||
from services.control.setpoints import (
|
||||
_deye_reg142_limit_control,
|
||||
_deye_reg143_export_w,
|
||||
_deye_system_time_register_rows,
|
||||
_deye_time_point_rows,
|
||||
@@ -89,16 +88,12 @@ async def write_inverter_setpoints(
|
||||
grid_w=grid_w,
|
||||
max_charge_a=int(inv.max_charge_a),
|
||||
max_discharge_a=int(inv.max_discharge_a),
|
||||
export_mode=setpoints_now.export_mode,
|
||||
export_ban=bool(setpoints_now.export_ban),
|
||||
)
|
||||
|
||||
zero_exp_mode = int(inv.deye_zero_export_mode or 1)
|
||||
selling_mode = _deye_reg142_limit_control(
|
||||
deye_mode=deye_mode,
|
||||
grid_w=grid_w,
|
||||
export_ban=bool(setpoints_now.export_ban),
|
||||
export_mode=setpoints_now.export_mode,
|
||||
zero_export_mode=zero_exp_mode,
|
||||
)
|
||||
selling_mode = 0 if deye_mode == "SELL" else zero_exp_mode
|
||||
solar_sell = 0 if (setpoints_now.export_ban and deye_mode != "SELL") else 1
|
||||
export_limit = export_lim
|
||||
reg178_val = REG178_SELL if deye_mode == "SELL" else REG178_PASSIVE
|
||||
|
||||
@@ -217,28 +217,25 @@ def _deye_reg143_export_w(no_export: bool, max_export_power_w: int | None) -> in
|
||||
return max(0, int(max_export_power_w or 0))
|
||||
|
||||
|
||||
def _deye_reg142_limit_control(
|
||||
def _is_passive_pv_surplus_export(
|
||||
*,
|
||||
deye_mode: str,
|
||||
grid_w: int,
|
||||
export_ban: bool,
|
||||
export_mode: str | None,
|
||||
zero_export_mode: int,
|
||||
) -> int:
|
||||
export_ban: bool,
|
||||
grid_w: int,
|
||||
) -> bool:
|
||||
"""
|
||||
Reg 142: 0 = selling first, 1/2 = zero export (load / CT).
|
||||
Plán s exportem (záporný grid_setpoint, bez export_ban) musí povolit prodej FVE do sítě
|
||||
i v PASSIVE — jinak CT instalace (deye_zero_export_mode=2) drží přebytek v baterii.
|
||||
Přetok FVE do sítě v PASSIVE (ne SELL z baterie): reg 142 zůstane zero-export (1/2),
|
||||
nabíjení se blokuje přes **108 = 0** — baterie nemá kam brát přebytek → jde do sítě (145).
|
||||
"""
|
||||
if deye_mode == "SELL":
|
||||
return 0
|
||||
if deye_mode != "PASSIVE" or export_ban:
|
||||
return False
|
||||
em = (export_mode or "").strip().upper()
|
||||
if export_ban or em == "NONE" or grid_w >= 0:
|
||||
return int(zero_export_mode)
|
||||
if em in {"PV_SURPLUS", "BATTERY_SELL"}:
|
||||
return 0
|
||||
# starší řádky bez export_mode: záporný grid_setpoint = export záměr
|
||||
return 0
|
||||
if em == "PV_SURPLUS":
|
||||
return True
|
||||
if em in {"NONE", "BATTERY_SELL"}:
|
||||
return False
|
||||
return grid_w < 0
|
||||
|
||||
|
||||
def _clamp_deye_tou_soc_pct(pct: int) -> int:
|
||||
@@ -273,8 +270,8 @@ def _deye_zero_export_amps_for_passive(
|
||||
"""
|
||||
PASSIVE (zero export k CT/zátěži): asymetrie jen tam, kde dává smysl pro import.
|
||||
|
||||
Export do sítě (grid_w < 0) už směr toku řeší režim / 142 / 145 — **108** jako strop zbytečně
|
||||
nenulovat na 0 (viz home-01). Jediná speciální větev: import bez nabíjení → vypnout vybíjení.
|
||||
Přetok FVE do sítě řeší větev ``_is_passive_pv_surplus_export`` (**108 = 0**). Zde jen import
|
||||
bez nabíjení → vypnout vybíjení (**109 = 0**).
|
||||
"""
|
||||
if grid_w > 0 and bat_w <= 0:
|
||||
return max_charge_a, 0
|
||||
@@ -290,14 +287,17 @@ def deye_battery_charge_discharge_amps(
|
||||
grid_w: int,
|
||||
max_charge_a: int,
|
||||
max_discharge_a: int,
|
||||
export_mode: str | None = None,
|
||||
export_ban: bool = False,
|
||||
) -> tuple[int, int]:
|
||||
"""
|
||||
Proud nabíjení / vybíjení (reg 108 / 109) pro zápis Deye.
|
||||
|
||||
PASSIVE + plán chce nabíjet (typicky z FVE, i při exportu zbytku do sítě): **108 = max_charge_a**
|
||||
z invertoru — reg. 108 je strop, ne příkaz k proudu; průměrný `battery_w` ze slotu nesmí špičku FVE
|
||||
stíhat do baterie omezovat. **109 = max_discharge_a** (domácnost z baterie při výpadku PV).
|
||||
**CHARGE** (import ze sítě + nabíjení): 108 dál z `battery_w` (řízený importní okamžik). **SELL** beze změny.
|
||||
**PV_SURPLUS** (PASSIVE, export FVE): **108 = 0**, **109 = max** — baterie se přes limit
|
||||
nabíjení neplní, přebytek jde do sítě (142 = zero-export dle instalace, 145 = 1).
|
||||
|
||||
PASSIVE + nabíjení bez exportního záměru (`battery_w > 0`, export_mode NONE): **108 = max**.
|
||||
**CHARGE** ze sítě: 108 z `battery_w`. **SELL**: 108 = 0, 109 = max.
|
||||
"""
|
||||
if lock_battery:
|
||||
return 0, 0
|
||||
@@ -307,6 +307,13 @@ def deye_battery_charge_discharge_amps(
|
||||
return 0, int(max_discharge_a)
|
||||
if self_sustain_local_use:
|
||||
return int(max_charge_a), int(max_discharge_a)
|
||||
if _is_passive_pv_surplus_export(
|
||||
deye_mode=deye_mode,
|
||||
export_mode=export_mode,
|
||||
export_ban=export_ban,
|
||||
grid_w=grid_w,
|
||||
):
|
||||
return 0, int(max_discharge_a)
|
||||
if bat_w > 0:
|
||||
return int(max_charge_a), int(max_discharge_a)
|
||||
return _deye_zero_export_amps_for_passive(
|
||||
|
||||
Reference in New Issue
Block a user