fix spravneho prodeje do site
This commit is contained in:
@@ -68,7 +68,7 @@ NEG_BUY_CHARGE_SHORTFALL_PENALTY_CZK_KWH = 100.0
|
||||
PRE_NEG_CHARGE_PENALTY_CZK_KWH = 400.0
|
||||
PRE_NEG_BATT_EXPORT_SHORTFALL_PENALTY_CZK_KWH = 80.0
|
||||
PRE_NEG_BATT_EXPORT_MIN_SELL_CZK_KWH = 1.0
|
||||
PLANNER_BUILD_TAG = "2026-05-28-evening-peak-full-export-v27"
|
||||
PLANNER_BUILD_TAG = "2026-05-28-evening-peak-full-export-v28"
|
||||
POS_SELL_PRE_NEG_SOC_SHORTFALL_PENALTY_CZK_PER_WH = 0.30
|
||||
PRE_NEG_BUY_SOC_CEILING_SLACK_PENALTY_CZK_PER_WH = 0.25
|
||||
PRE_NEG_BUY_EMPTY_EXPORT_SHORTFALL_PENALTY_CZK_KWH = 80.0
|
||||
@@ -820,8 +820,9 @@ def _evening_push_battery_export_w(
|
||||
grid: Any,
|
||||
) -> float:
|
||||
"""
|
||||
Nejvyšší ge_bat v push slotu při drahém importu (gi≈0): bilance dá bd ≈ load + ge_bat,
|
||||
tedy ge_bat + bd ≤ max_discharge → ge_bat ≤ (max_discharge − load) / 2.
|
||||
Tvrdý push ge_bat: min(site/inverter export cap, BMS − load).
|
||||
Stejná fyzika jako Deye SELL — load pokryje baterie, zbytek výkonu jde do sítě
|
||||
(ne (max−load)/2 z dvojího započtení bd+ge_bat v LP).
|
||||
"""
|
||||
cap = _battery_export_cap_w(battery, grid)
|
||||
load_w = max(0.0, float(slot.load_baseline_w))
|
||||
@@ -829,10 +830,7 @@ def _evening_push_battery_export_w(
|
||||
0.0,
|
||||
float(battery.max_discharge_power_w) - load_w,
|
||||
)
|
||||
if discharge_headroom <= 0.0:
|
||||
return 0.0
|
||||
export_from_balance = discharge_headroom / 2.0
|
||||
return min(cap, discharge_headroom, export_from_balance)
|
||||
return min(cap, discharge_headroom)
|
||||
|
||||
|
||||
def _dispatch_grid_setpoint_w(
|
||||
@@ -2013,11 +2011,8 @@ def solve_dispatch(
|
||||
slots[t_peak], battery, grid
|
||||
)
|
||||
if push_floor_w >= GE_MIN_EXPORT_W:
|
||||
load_push_w = float(slots[t_peak].load_baseline_w)
|
||||
prob += z_export[t_peak] == 1
|
||||
prob += ge_bat[t_peak] >= push_floor_w
|
||||
# Drahý import (gi≈0): bez bd ≥ load + ge_bat zůstane jen vybíjení do domu.
|
||||
prob += bd[t_peak] + ge_bat[t_peak] >= load_push_w + push_floor_w
|
||||
# Ostatní profitable sloty: měkká shortfall penalizace (ne večerní push).
|
||||
if (
|
||||
last_pos_sell_pre_neg_buy is not None
|
||||
@@ -2054,13 +2049,16 @@ def solve_dispatch(
|
||||
|
||||
# Součet nabíjení z FVE + ze sítě nesmí překročit max_charge_power_w baterie.
|
||||
prob += bc_pv[t] + bc_gi[t] <= battery.max_charge_power_w
|
||||
# Vybíjení do domu (bd) + export z baterie (ge_bat) sdílí jeden BMS limit.
|
||||
prob += bd[t] + ge_bat[t] <= battery.max_discharge_power_w
|
||||
# Breaker: import ze site je tvrdě omezen (gi_over jen numerická pojistka).
|
||||
prob += gi[t] <= gi_upper
|
||||
|
||||
if om == "AUTO":
|
||||
load_site_expr = float(s.load_baseline_w) + ev_total_t + hp[t]
|
||||
# BMS: jedno vybíjení — bilance při gi≈0 dá bd≈load+ge_bat; bd+ge_bat≤max by export
|
||||
# započítalo dvakrát ((max−load)/2). Exportní sloty: load+ge_bat; jinak bd≤max.
|
||||
prob += bd[t] <= battery.max_discharge_power_w
|
||||
if t in discharge_export_slots:
|
||||
prob += load_site_expr + ge_bat[t] <= battery.max_discharge_power_w
|
||||
prob += pv_ld[t] + pv_sp[t] == pv_a_net + pv_b_effective
|
||||
prob += pv_ld[t] <= load_site_expr
|
||||
prob += pv_ld[t] <= pv_a_net + pv_b_effective
|
||||
@@ -2090,6 +2088,7 @@ def solve_dispatch(
|
||||
pv_a_net + pv_b_effective + gi[t] + bd[t]
|
||||
== s.load_baseline_w + ev_total_t + hp[t] + bc_pv[t] + bc_gi[t] + ge[t]
|
||||
)
|
||||
prob += bd[t] + ge_bat[t] <= battery.max_discharge_power_w
|
||||
|
||||
prob += ge[t] == ge_pv[t] + ge_bat[t]
|
||||
# Baterie nesmí „přestrojit“ FVE export: jen z pv_sp (po load-first).
|
||||
|
||||
Reference in New Issue
Block a user