From 4083947811b40be7b245c4c3e53ff7119364249c Mon Sep 17 00:00:00 2001 From: Thomas aus Welkers <14850347+tpd-opitz@users.noreply.github.com> Date: Thu, 16 Apr 2026 13:10:30 +0200 Subject: [PATCH 1/2] let deviation not exceed charge current change limit --- .../control/algorithm/surplus_controlled.py | 1 + .../algorithm/surplus_controlled_test.py | 23 ++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/control/algorithm/surplus_controlled.py b/packages/control/algorithm/surplus_controlled.py index d7239b9696..131201e01a 100644 --- a/packages/control/algorithm/surplus_controlled.py +++ b/packages/control/algorithm/surplus_controlled.py @@ -120,6 +120,7 @@ def _fix_deviating_evse_current(self, chargepoint: Chargepoint) -> float: evse_current = chargepoint.data.get.evse_current if evse_current and chargepoint.data.set.current != chargepoint.data.set.current_prev: offset = evse_current - get_medium_charging_current(chargepoint.data.get.currents) + offset = min(offset, chargepoint.data.set.charging_ev_data.ev_template.data.nominal_difference) current_with_offset = chargepoint.data.set.current + offset current = min(current_with_offset, chargepoint.data.control_parameter.required_current) if current != chargepoint.data.set.current: diff --git a/packages/control/algorithm/surplus_controlled_test.py b/packages/control/algorithm/surplus_controlled_test.py index 6251148004..946fb4f390 100644 --- a/packages/control/algorithm/surplus_controlled_test.py +++ b/packages/control/algorithm/surplus_controlled_test.py @@ -100,18 +100,24 @@ def test_set_required_current_to_max(phases: int, @pytest.mark.parametrize( - "evse_current, limited_current, expected_current", + "evse_current, limited_current, max_current_change, expected_current", [ - pytest.param(None, 6, 6, id="Kein Soll-Strom aus der EVSE ausgelesen"), - pytest.param(13, 13, 13, id="Auto lädt mit Soll-Stromstärke"), - pytest.param(12.5, 12.5, 12.0, id="Auto lädt mit 0.5A Abweichung von der Soll-Stromstärke"), - pytest.param(11.8, 11.8, 10.600000000000001, id="Auto lädt mit mehr als Soll-Stromstärke"), - pytest.param(14.2, 14.2, 15.399999999999999, id="Auto lädt mit weniger als Soll-Stromstärke"), - pytest.param(15, 15, 16, + pytest.param(None, 6, 2, 6, id="Kein Soll-Strom aus der EVSE ausgelesen"), + pytest.param(13, 13, 2, 13, id="Auto lädt mit Soll-Stromstärke"), + pytest.param(12.5, 12.5, 2, 12.0, id="Auto lädt mit 0.5A Abweichung von der Soll-Stromstärke"), + pytest.param(11.8, 11.8, 2, 10.600000000000001, id="Auto lädt mit mehr als Soll-Stromstärke"), + pytest.param(14.2, 14.2, 2, 15.399999999999999, + id="Auto lädt mit weniger als Soll-Stromstärke, " + "diff kleiner als max_current_change, aber EVSE-Begrenzung ist nicht erreicht."), + pytest.param(14.2, 14.2, 1, 15.2, + id="Auto lädt mit weniger als Soll-Stromstärke, " + "diff größer als max_current_change, aber EVSE-Begrenzung ist nicht erreicht."), + pytest.param(15, 15, 2, 16, id="Auto lädt mit weniger als Soll-Stromstärke, aber EVSE-Begrenzung ist erreicht.") ]) def test_add_unused_evse_current(evse_current: float, limited_current: float, + max_current_change: float, expected_current: float): # setup c = Chargepoint(0, None) @@ -120,6 +126,7 @@ def test_add_unused_evse_current(evse_current: float, c.data.get.evse_current = evse_current c.data.control_parameter.required_current = 16 c.data.set.current = limited_current + c.data.set.charging_ev_data.ev_template.data.nominal_difference = max_current_change # execution SurplusControlled()._fix_deviating_evse_current(c) @@ -145,7 +152,7 @@ def setup_cp(cp: Chargepoint, submode: str) -> Chargepoint: cp.data.control_parameter.submode = submode cp.data.control_parameter.required_current = 6 return cp - data.data.cp_data = {"cp1": setup_cp(mock_cp1, submode_1), + data.Data.cp_data = {"cp1": setup_cp(mock_cp1, submode_1), "cp2": setup_cp(mock_cp2, submode_2)} # evaluation From c5213055d6c8ff89b79c04f0e1d71fa73576e819 Mon Sep 17 00:00:00 2001 From: Thomas aus Welkers <14850347+tpd-opitz@users.noreply.github.com> Date: Tue, 21 Apr 2026 21:10:32 +0200 Subject: [PATCH 2/2] max current change is constant rather then configuration --- .../control/algorithm/surplus_controlled.py | 6 ++++-- .../algorithm/surplus_controlled_test.py | 18 ++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/control/algorithm/surplus_controlled.py b/packages/control/algorithm/surplus_controlled.py index 131201e01a..5771ce232e 100644 --- a/packages/control/algorithm/surplus_controlled.py +++ b/packages/control/algorithm/surplus_controlled.py @@ -1,5 +1,5 @@ import logging -from typing import List, Optional, Tuple +from typing import List, Optional, Tuple, Final from control import data from control.algorithm import common @@ -20,6 +20,8 @@ log = logging.getLogger(__name__) +MAX_EVSE_CURRENT_CHANGE: Final[float] = 2 # Ampere + class SurplusControlled: @@ -120,7 +122,7 @@ def _fix_deviating_evse_current(self, chargepoint: Chargepoint) -> float: evse_current = chargepoint.data.get.evse_current if evse_current and chargepoint.data.set.current != chargepoint.data.set.current_prev: offset = evse_current - get_medium_charging_current(chargepoint.data.get.currents) - offset = min(offset, chargepoint.data.set.charging_ev_data.ev_template.data.nominal_difference) + offset = min(offset, MAX_EVSE_CURRENT_CHANGE) current_with_offset = chargepoint.data.set.current + offset current = min(current_with_offset, chargepoint.data.control_parameter.required_current) if current != chargepoint.data.set.current: diff --git a/packages/control/algorithm/surplus_controlled_test.py b/packages/control/algorithm/surplus_controlled_test.py index 946fb4f390..a77060c8b0 100644 --- a/packages/control/algorithm/surplus_controlled_test.py +++ b/packages/control/algorithm/surplus_controlled_test.py @@ -100,24 +100,23 @@ def test_set_required_current_to_max(phases: int, @pytest.mark.parametrize( - "evse_current, limited_current, max_current_change, expected_current", + "evse_current, limited_current, expected_current", [ - pytest.param(None, 6, 2, 6, id="Kein Soll-Strom aus der EVSE ausgelesen"), - pytest.param(13, 13, 2, 13, id="Auto lädt mit Soll-Stromstärke"), - pytest.param(12.5, 12.5, 2, 12.0, id="Auto lädt mit 0.5A Abweichung von der Soll-Stromstärke"), - pytest.param(11.8, 11.8, 2, 10.600000000000001, id="Auto lädt mit mehr als Soll-Stromstärke"), - pytest.param(14.2, 14.2, 2, 15.399999999999999, + pytest.param(None, 6, 6, id="Kein Soll-Strom aus der EVSE ausgelesen"), + pytest.param(13, 13, 13, id="Auto lädt mit Soll-Stromstärke"), + pytest.param(12.5, 12.5, 12.0, id="Auto lädt mit 0.5A Abweichung von der Soll-Stromstärke"), + pytest.param(11.8, 11.8, 10.600000000000001, id="Auto lädt mit mehr als Soll-Stromstärke"), + pytest.param(14.2, 14.2, 15.399999999999999, id="Auto lädt mit weniger als Soll-Stromstärke, " "diff kleiner als max_current_change, aber EVSE-Begrenzung ist nicht erreicht."), - pytest.param(14.2, 14.2, 1, 15.2, + pytest.param(14.5, 14.2, 15.7, id="Auto lädt mit weniger als Soll-Stromstärke, " "diff größer als max_current_change, aber EVSE-Begrenzung ist nicht erreicht."), - pytest.param(15, 15, 2, 16, + pytest.param(15, 15, 16, id="Auto lädt mit weniger als Soll-Stromstärke, aber EVSE-Begrenzung ist erreicht.") ]) def test_add_unused_evse_current(evse_current: float, limited_current: float, - max_current_change: float, expected_current: float): # setup c = Chargepoint(0, None) @@ -126,7 +125,6 @@ def test_add_unused_evse_current(evse_current: float, c.data.get.evse_current = evse_current c.data.control_parameter.required_current = 16 c.data.set.current = limited_current - c.data.set.charging_ev_data.ev_template.data.nominal_difference = max_current_change # execution SurplusControlled()._fix_deviating_evse_current(c)