fix soc v TOU (ne 100) pri ne-grid-charge
Some checks failed
CI and deploy / migration-check (push) Failing after 15s
CI and deploy / deploy (push) Has been skipped

This commit is contained in:
Dusan Vojacek
2026-05-02 12:15:40 +02:00
parent fffe6c7185
commit b20cb6e0f9
5 changed files with 47 additions and 49 deletions

View File

@@ -158,8 +158,8 @@ class DeyeTouParamsTests(unittest.TestCase):
self.assertFalse(g)
self.assertEqual(s, 12)
def test_passive_negative_sell_steers_tou_above_current_soc(self) -> None:
"""Záporná vykupní → TOU SOC = 100 % (priorita akumulace vs. přetok)."""
def test_passive_negative_sell_tou_stays_min_soc(self) -> None:
"""PASSIVE: záporná vykupní nenastavuje TOU na 100 — zůstává min_soc (145/export_ban řeší síť)."""
sp = ControlSetpoints(
battery_w=-400,
grid_export_limit=0,
@@ -175,9 +175,10 @@ class DeyeTouParamsTests(unittest.TestCase):
self.assertEqual(get_deye_mode(sp), "PASSIVE")
_p, s, g = _deye_tou_params(sp, _inv(min_soc=12, reserve_soc=20))
self.assertFalse(g)
self.assertEqual(s, 100)
self.assertEqual(s, 12)
def test_passive_planned_charge_steers_tou(self) -> None:
def test_passive_planned_pv_charge_tou_stays_min_soc(self) -> None:
"""PASSIVE s kladným battery_w bez grid importu: CHARGE to není — TOU je stále min_soc."""
sp = ControlSetpoints(
battery_w=800,
grid_export_limit=0,
@@ -193,7 +194,7 @@ class DeyeTouParamsTests(unittest.TestCase):
self.assertEqual(get_deye_mode(sp), "PASSIVE")
_p, s, g = _deye_tou_params(sp, _inv(min_soc=12, reserve_soc=20))
self.assertFalse(g)
self.assertEqual(s, 100)
self.assertEqual(s, 12)
def test_charge_unchanged_grid_charge(self) -> None:
sp = ControlSetpoints(
@@ -212,6 +213,24 @@ class DeyeTouParamsTests(unittest.TestCase):
self.assertTrue(g)
self.assertEqual(s, 95)
def test_charge_target_soc_respects_max_soc_100(self) -> None:
sp = ControlSetpoints(
battery_w=5000,
grid_export_limit=0,
ev1_current_a=0,
ev2_current_a=0,
heat_pump_enable=False,
grid_setpoint_w=5000,
ev1_power_w=0,
ev2_power_w=0,
target_soc_pct=80,
)
self.assertEqual(get_deye_mode(sp), "CHARGE")
inv = replace(_inv(), max_soc_percent=100)
_p, s, g = _deye_tou_params(sp, inv)
self.assertTrue(g)
self.assertEqual(s, 100)
def test_charge_any_positive_pair_without_w_threshold(self) -> None:
sp = ControlSetpoints(
battery_w=50,