From 315bd0ca46cee3420ef01500cf5fa9cdc7fa8b57 Mon Sep 17 00:00:00 2001 From: Dusan Vojacek Date: Fri, 12 Jun 2026 12:22:56 +0200 Subject: [PATCH] =?UTF-8?q?v2=20test:=20levn=C3=BD=20sell=20( sell 0.3 → auto vyhraje), test to dokládá: plná domácí baterka + 9 kW PV → ~17 kWh do auta, minimální export. Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/tests/test_solver_v2.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/backend/tests/test_solver_v2.py b/backend/tests/test_solver_v2.py index efbaa07..890b33b 100644 --- a/backend/tests/test_solver_v2.py +++ b/backend/tests/test_solver_v2.py @@ -273,6 +273,20 @@ class EvOpportunisticTests(unittest.TestCase): self.assertLess(delivered, 4000.0 + 200.0) self.assertLess(snap["objective_terms"]["ev_opp_wh"][0], 100.0) + def test_cheap_sell_prefers_car_over_grid(self) -> None: + # sell 0.3 < opp 1.0, plná domácí baterka, velký PV přebytek + # → přebytek do auta, ne za babku do sítě + bat = _battery() + slots = [_slot(_BASE, i, buy=3.0, sell=0.3, pv_a=9000, load=500, ev1=True) for i in range(16)] + results, _, snap = _solve( + slots, battery=bat, soc0=bat.soc_max_wh, # baterka plná + ev_sessions=(self._session(needed=2000.0, headroom=25000.0), None), + ) + delivered = sum((r.ev1_setpoint_w or 0) * 0.25 for r in results) + exported = sum(-r.grid_setpoint_w * 0.25 for r in results if r.grid_setpoint_w < 0) + self.assertGreater(delivered, 15000.0, "přebytek má téct do auta") + self.assertLess(exported, delivered, "prodej za 0.3 nemá vyhrát nad autem") + def test_total_energy_capped_even_at_negative_buy(self) -> None: # fix latentního bugu: bez headroom (opp=0) nesmí buy<0 pumpovat nad needed slots = [_slot(_BASE, i, buy=-2.0, sell=-1.0, ev1=True, load=300) for i in range(16)]