fix home-01 prodej pri zaporu
Some checks failed
CI and deploy / migration-check (push) Failing after 13s
CI and deploy / deploy (push) Has been skipped

This commit is contained in:
Dusan Vojacek
2026-05-24 18:15:24 +02:00
parent 747a5bed08
commit 9a15a4c618
5 changed files with 93 additions and 13 deletions

View File

@@ -50,7 +50,7 @@ DEFAULT_PLANNER_DISCHARGE_RELAX_PREWINDOW_SLOTS = 8
# Penalizace je v Kč/Wh (např. 0.20 = 200 Kč/kWh). Musí být dost velká, aby přebila
# bezpečnostní SoC buffer + terminal shadow cenu a solver skutečně „dovylil“ před sell<0.
PRENEG_SELL_SOC_ANCHOR_SLACK_PENALTY_CZK_PER_WH = 0.20
PEAK_EXPORT_SHORTFALL_PENALTY_CZK_KWH = 40.0
PEAK_EXPORT_SHORTFALL_PENALTY_CZK_KWH = 80.0
# Měkký tlak: v okně sell<0 + block_export využít PV přebytek do baterie (ne curtail).
PV_CHARGE_SHORTFALL_PENALTY_CZK_KWH = 120.0
# Curtailment při sell<0 + allow_charge: nesmí být téměř zdarma oproti nabíjení (BA81).
@@ -59,7 +59,7 @@ NEG_SELL_CURTAIL_PENALTY_CZK_KWH = 1.0
NEG_SELL_PV_CHARGE_REWARD_CZK_KWH = 0.8
# Měkký tlak: v okně sell<0 dobít na soc_max (ne zastavit na ~94 % kvůli curtail).
NEG_SELL_SOC_UNDERFILL_PENALTY_CZK_PER_WH = 0.35
PLANNER_BUILD_TAG = "2026-05-25-purchase-fixed-neg-sell-v9"
PLANNER_BUILD_TAG = "2026-05-25-home01-neg-sell-evening-v10"
CORRECTION_WINDOW_H = 1 # hodina zpět pro výpočet korekčního faktoru
CORRECTION_MIN_CLAMP = 0.5 # spodní limit korekčního faktoru
CORRECTION_MAX_CLAMP = 1.5 # horní limit korekčního faktoru
@@ -1475,10 +1475,7 @@ def solve_dispatch(
for t_peak in morning_pre_neg_export_ts:
if t_peak in profitable_export_ts:
prob += ge_bat[t_peak] >= float(PRENEG_MORNING_EXPORT_MIN_W) * z_export[t_peak]
evening_export_push_w = min(
export_push_w,
float(battery.max_discharge_power_w) * 0.5,
)
evening_export_push_w = export_push_w
evening_push_ts = _evening_battery_export_push_indices(
slots,
profitable_export_ts=profitable_export_ts,
@@ -1657,6 +1654,18 @@ def solve_dispatch(
# Přebytek FVE → baterie / curtail A; B přes z_gen_cutoff nebo bc_pv.
prob += ge[t] == 0
prob += ge_pv[t] == 0
elif not purchase_fixed_pre and pv_surplus_neg_w > 500:
# Spot (home-01): při sell<0 neexportovat, dokud není baterie plná (curtailable A).
# Dříve skip_pv_store_block + pv_b vynucoval export i při prázdné baterii.
soc_prev_neg = current_soc_wh if t == 0 else soc[t - 1]
w_pv_full = pulp.LpVariable(f"w_pv_full_neg_{t}", cat=pulp.LpBinary)
prob += soc_prev_neg >= (
float(battery.soc_max_wh)
- soc_headroom_wh
- float(battery.soc_max_wh) * (1 - w_pv_full)
)
prob += ge_pv[t] <= float(pv_surplus_neg_w) * w_pv_full
prob += ge[t] <= float(grid.max_export_power_w) * w_pv_full
soc_prev_expr = current_soc_wh if t == 0 else soc[t - 1]
arb_t = arb_floor_series[t]