v2 test: levný sell (<opp hodnota) posílá přebytek do auta, ne do sítě
All checks were successful
CI and deploy / migration-check (push) Successful in 5m31s
CI and deploy / deploy (push) Has been skipped

Postřeh uživatele — pásma nízkého výkupu před zápornými okny: mechanismus
měkkého cíle to už řeší (opp 1 Kč/kWh > 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) <noreply@anthropic.com>
This commit is contained in:
Dusan Vojacek
2026-06-12 12:22:56 +02:00
parent 85dff7f13e
commit 315bd0ca46

View File

@@ -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)]