diff --git a/apps/predbat/inverter.py b/apps/predbat/inverter.py index 23d49f7e2..7689fa5de 100644 --- a/apps/predbat/inverter.py +++ b/apps/predbat/inverter.py @@ -472,7 +472,7 @@ def __init__(self, base, id=0, quiet=False, rest_postCommand=None, rest_getData= self.reserve_min = battery_min_soc self.base.log("Reserve min: {}%, battery_min: {}%".format(self.reserve_min, dp0(battery_min_soc))) - if self.base.set_reserve_enable and self.inv_has_reserve_soc: + if (self.base.set_reserve_enable and self.inv_has_reserve_soc) or not self.inv_has_reserve_soc: self.reserve_percent = self.reserve_min else: self.reserve_percent = self.reserve_percent_current diff --git a/apps/predbat/tests/test_inverter.py b/apps/predbat/tests/test_inverter.py index 3e6ee62fa..e6d1346e7 100644 --- a/apps/predbat/tests/test_inverter.py +++ b/apps/predbat/tests/test_inverter.py @@ -220,7 +220,7 @@ def test_adjust_charge_window( return failed -def test_adjust_reserve(test_name, ha, inv, dummy_rest, prev_reserve, reserve, expect_reserve=None, reserve_min=4, reserve_max=100): +def test_adjust_reserve(test_name, ha, inv, dummy_rest, prev_reserve, reserve, expect_reserve=None, reserve_min=4, reserve_max=100, reserve_percent=None): """ Test inv.adjust_reserve(self, reserve): @@ -229,7 +229,12 @@ def test_adjust_reserve(test_name, ha, inv, dummy_rest, prev_reserve, reserve, e if expect_reserve is None: expect_reserve = reserve - inv.reserve_percent = reserve_min + # reserve_percent simulates the current planning floor (may differ from reserve_min for + # inverters where inv_has_reserve_soc is False, e.g. SolisCloud where the sensor can be "stuck" high) + if reserve_percent is None: + reserve_percent = reserve_min + inv.reserve_percent = reserve_percent + inv.reserve_min = reserve_min inv.reserve_max = reserve_max print("Test: {}".format(test_name))