fix ranniho neprodeje do site
This commit is contained in:
@@ -37,6 +37,7 @@ 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,
|
||||
@@ -66,7 +67,10 @@ async def write_inverter_setpoints(
|
||||
raw_bat = setpoints_now.battery_w
|
||||
grid_w = int(setpoints_now.grid_setpoint_w or 0)
|
||||
no_export = inv.no_export
|
||||
export_lim = _deye_reg143_export_w(no_export, inv.max_export_power_w)
|
||||
export_lim_hw = _deye_reg143_export_w(no_export, inv.max_export_power_w)
|
||||
export_lim = export_lim_hw
|
||||
if int(setpoints_now.grid_export_limit or 0) > 0:
|
||||
export_lim = min(export_lim_hw, int(setpoints_now.grid_export_limit))
|
||||
max_batt_w_discharge = int(inv.max_discharge_a * BATT_VOLTAGE_V)
|
||||
tp_discharge_w = 0 if setpoints_now.lock_battery else max_batt_w_discharge
|
||||
tou_min_pct = _deye_tou_min_soc_pct(inv)
|
||||
@@ -88,7 +92,13 @@ async def write_inverter_setpoints(
|
||||
)
|
||||
|
||||
zero_exp_mode = int(inv.deye_zero_export_mode or 1)
|
||||
selling_mode = 0 if deye_mode == "SELL" else zero_exp_mode
|
||||
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,
|
||||
)
|
||||
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
|
||||
|
||||
@@ -50,6 +50,8 @@ class ControlSetpoints:
|
||||
target_soc_pct: int | None = None
|
||||
#: Explicitní fyzický režim z plánu (PASSIVE/SELL/CHARGE).
|
||||
deye_physical_mode: str | None = None
|
||||
#: Záměr exportu z LP: NONE / PV_SURPLUS / BATTERY_SELL.
|
||||
export_mode: str | None = None
|
||||
#: True = zákaz exportu (BLOCK_EXPORT) pro daný slot.
|
||||
export_ban: bool = False
|
||||
#: True = odpojit GEN port (MI export cutoff) v tomto slotu dle plánu (reg 178 bits0-1).
|
||||
|
||||
@@ -96,6 +96,8 @@ def _build_setpoints(
|
||||
export_mode = str(export_mode_raw).strip().upper() if export_mode_raw is not None else None
|
||||
if export_mode == "NONE":
|
||||
export_limit = 0
|
||||
elif export_limit <= 0 and grid_sp < 0:
|
||||
export_limit = abs(grid_sp)
|
||||
# Záporný výkup sám o sobě neblokuje export, pokud plán export explicitně žádá.
|
||||
export_ban = sell_f is not None and float(sell_f) < 0 and grid_sp >= 0
|
||||
gen_cutoff_raw = pi.get("deye_gen_cutoff_enabled")
|
||||
@@ -127,6 +129,7 @@ def _build_setpoints(
|
||||
ev2_power_w=ev2_w,
|
||||
target_soc_pct=target_soc,
|
||||
deye_physical_mode=pm,
|
||||
export_mode=export_mode,
|
||||
export_ban=bool(export_ban),
|
||||
deye_gen_cutoff_enabled=bool(gen_cutoff),
|
||||
effective_sell_price_czk_kwh=sell_f,
|
||||
@@ -214,6 +217,30 @@ 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(
|
||||
*,
|
||||
deye_mode: str,
|
||||
grid_w: int,
|
||||
export_ban: bool,
|
||||
export_mode: str | None,
|
||||
zero_export_mode: int,
|
||||
) -> int:
|
||||
"""
|
||||
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.
|
||||
"""
|
||||
if deye_mode == "SELL":
|
||||
return 0
|
||||
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
|
||||
|
||||
|
||||
def _clamp_deye_tou_soc_pct(pct: int) -> int:
|
||||
return max(5, min(95, pct))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user