From 803f5b1957837aa23f9bbd3f7dca16f6663b6bbd Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Fri, 5 Dec 2025 14:12:45 +0100 Subject: [PATCH] pv filter peaks: fix --- packages/modules/common/store/_inverter.py | 4 +-- .../modules/common/store/_inverter_test.py | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/packages/modules/common/store/_inverter.py b/packages/modules/common/store/_inverter.py index 2b9ecbf0ae..0cfab0a947 100644 --- a/packages/modules/common/store/_inverter.py +++ b/packages/modules/common/store/_inverter.py @@ -56,8 +56,8 @@ def update(self) -> None: def filter_peaks(self, state: InverterState) -> InverterState: inverter = data.data.pv_data[f"pv{self.delegate.delegate.num}"] max_ac_out = inverter.data.config.max_ac_out - if max_ac_out > 0 and state.power > max_ac_out: - state.power = max_ac_out + if max_ac_out > 0 and abs(state.power) > max_ac_out: + state.power = max_ac_out if state.power > 0 else -max_ac_out return state def fix_hybrid_values(self, state: InverterState) -> InverterState: diff --git a/packages/modules/common/store/_inverter_test.py b/packages/modules/common/store/_inverter_test.py index 46b2c58092..380c0820c3 100644 --- a/packages/modules/common/store/_inverter_test.py +++ b/packages/modules/common/store/_inverter_test.py @@ -50,3 +50,33 @@ def test_fix_hybrid_values(params): # evaluation assert vars(state) == vars(params.expected_state) + + +FilterPeaksParams = NamedTuple("FilterPeaksParams", [( + "name", str), ("max_ac_out", int), ("input_power", float), ("expected_power", float)]) +filter_peaks_cases = [ + FilterPeaksParams("no_limit", 0, -5000, -5000), # max_ac_out = 0 -> keine Begrenzung + FilterPeaksParams("within_limit", 10000, -5000, -5000), # innerhalb der Grenze + FilterPeaksParams("exceeds_positive", 3000, 5000, 3000), # überschreitet positive Grenze + FilterPeaksParams("exceeds_negative", 3000, -5000, -3000), # überschreitet negative Grenze (behält Vorzeichen) + FilterPeaksParams("at_limit_positive", 5000, 5000, 5000), # genau an der positiven Grenze + FilterPeaksParams("at_limit_negative", 5000, -5000, -5000), # genau an der negativen Grenze +] + + +@pytest.mark.parametrize("params", filter_peaks_cases, ids=[c.name for c in filter_peaks_cases]) +def test_filter_peaks(params): + # setup + mock_inverter = Mock() + mock_inverter.data.config.max_ac_out = params.max_ac_out + data.data.pv_data = {"pv1": mock_inverter} + + purge = PurgeInverterState(delegate=Mock(delegate=Mock(num=1))) + + # execution + input_state = InverterState(power=params.input_power, exported=1000) + result_state = purge.filter_peaks(input_state) + + # evaluation + assert result_state.power == params.expected_power + assert result_state.exported == 1000 # exported sollte unverändert bleiben