From dd3bd55c0ea9d1be5dc188c8e1f1e731e1810f5a Mon Sep 17 00:00:00 2001 From: Dusan Vojacek Date: Fri, 12 Jun 2026 15:19:10 +0200 Subject: [PATCH] =?UTF-8?q?Fix=20reg=20340:=20z=C3=A1porn=C3=BD=20buy+sell?= =?UTF-8?q?=20m=C3=A1=20p=C5=99ednost=20p=C5=99ed=20=C3=BAsvitovou=20v?= =?UTF-8?q?=C3=BDjimkou?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Větev 'slabý úsvit (forecast<1500 W) → reg 340 neposílat' zastínila větev 'buy<0 a sell<0 + pole B → pv_a_allowed=0' — při hluboce záporných cenách za úsvitu by se pole A nezavřelo. Prohozeno pořadí; opravuje pre-existing fail test_neg_buy_and_sell_with_pv_b_forces_pv_a_off (293 passed, 4 xfail). Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/services/control/setpoints.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/backend/services/control/setpoints.py b/backend/services/control/setpoints.py index bc5c932..5fa66ab 100644 --- a/backend/services/control/setpoints.py +++ b/backend/services/control/setpoints.py @@ -137,15 +137,10 @@ def _build_setpoints( buy_raw = pi.get("effective_buy_price") buy_f: float | None = float(buy_raw) if buy_raw is not None else None pv_b = int(pi.get("pv_b_forecast_solver_w") or 0) - # Slabý úsvit: neposílat reg 340 — forecast nepřesný, Deye řídí sám (108/109/142). + # Záporný buy i sell + pole B: pole A = 0 MÁ PŘEDNOST před úsvitovou + # výjimkou (při hluboce záporných cenách se reg 340 posílá vždy). _low_pv_no_reg340_w = 1500 if ( - forecast < _low_pv_no_reg340_w - and curtail <= 0 - and pv_b > 0 - ): - pv_a_allowed = None - elif ( buy_f is not None and sell_f is not None and float(buy_f) < 0.0 @@ -153,6 +148,13 @@ def _build_setpoints( and pv_b > 0 ): pv_a_allowed = 0 + elif ( + # Slabý úsvit: neposílat reg 340 — forecast nepřesný, Deye řídí sám (108/109/142). + forecast < _low_pv_no_reg340_w + and curtail <= 0 + and pv_b > 0 + ): + pv_a_allowed = None elif plan_skips_deye_reg340_write( battery_setpoint_w=bat_w, grid_setpoint_w=grid_sp,