From d3384ffab94ccd9b752d126f736e2d7e737e834d Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Tue, 12 May 2026 09:37:45 +0200 Subject: [PATCH 1/3] fix calculation of dimming surplus --- .../controllable_consumers/dimming/api_io.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/modules/io_actions/controllable_consumers/dimming/api_io.py b/packages/modules/io_actions/controllable_consumers/dimming/api_io.py index bfb3bd6802..076cbd430b 100644 --- a/packages/modules/io_actions/controllable_consumers/dimming/api_io.py +++ b/packages/modules/io_actions/controllable_consumers/dimming/api_io.py @@ -42,15 +42,19 @@ def __init__(self, config: DimmingSetup): super().__init__() + def calc_dimming_surplus(self) -> float: + surplus = data.data.pv_all_data.data.get.power + if data.data.bat_all_data.data.get.power < 0: + surplus += -data.data.bat_all_data.data.get.power + return surplus + def setup(self) -> None: - surplus = data.data.counter_data[data.data.counter_all_data.get_evu_counter_str()].calc_raw_surplus() - if surplus > 0: - self.import_power_left = self.config.configuration.max_import_power + surplus - else: - self.import_power_left = self.config.configuration.max_import_power + surplus = self.calc_dimming_surplus() + self.import_power_left = self.config.configuration.max_import_power + surplus self.import_power_left -= self.config.configuration.fixed_import_power - log.debug(f"Dimmen: {self.import_power_left}W inkl. Überschuss") + log.debug( + f"Dimmen: Überschuss von {surplus}W berücksichtigt, verbleibende Dimm-Leistung: {self.import_power_left}W") with ModifyLoglevelContext(control_command_log, logging.DEBUG): if self.dimming_active() or check_fault_state_io_device(self.config.configuration.io_device): From 73acae5477628a78d84d9a1379f06499e13e335d Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Tue, 12 May 2026 10:01:14 +0200 Subject: [PATCH 2/3] fix --- .../modules/io_actions/controllable_consumers/dimming/api_io.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/io_actions/controllable_consumers/dimming/api_io.py b/packages/modules/io_actions/controllable_consumers/dimming/api_io.py index 076cbd430b..43131c930e 100644 --- a/packages/modules/io_actions/controllable_consumers/dimming/api_io.py +++ b/packages/modules/io_actions/controllable_consumers/dimming/api_io.py @@ -43,7 +43,7 @@ def __init__(self, config: DimmingSetup): super().__init__() def calc_dimming_surplus(self) -> float: - surplus = data.data.pv_all_data.data.get.power + surplus = data.data.pv_all_data.data.get.power * -1 if data.data.bat_all_data.data.get.power < 0: surplus += -data.data.bat_all_data.data.get.power return surplus From 24ff4adf45e24fd9d234cab466b41edbbe67200d Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Tue, 12 May 2026 10:56:16 +0200 Subject: [PATCH 3/3] improve --- .../dimming/api_eebus.py | 11 ++++---- .../controllable_consumers/dimming/api_io.py | 9 ++----- .../dimming/test_utils.py | 26 +++++++++++++++++++ .../controllable_consumers/dimming/utils.py | 8 ++++++ 4 files changed, 41 insertions(+), 13 deletions(-) create mode 100644 packages/modules/io_actions/controllable_consumers/dimming/test_utils.py create mode 100644 packages/modules/io_actions/controllable_consumers/dimming/utils.py diff --git a/packages/modules/io_actions/controllable_consumers/dimming/api_eebus.py b/packages/modules/io_actions/controllable_consumers/dimming/api_eebus.py index 1679fdf6c3..8b841ed464 100644 --- a/packages/modules/io_actions/controllable_consumers/dimming/api_eebus.py +++ b/packages/modules/io_actions/controllable_consumers/dimming/api_eebus.py @@ -11,6 +11,7 @@ from modules.common.utils.component_parser import get_io_name_by_id from modules.io_actions.common import check_fault_state_io_device from modules.io_actions.controllable_consumers.dimming.config import DimmingSetup +from modules.io_actions.controllable_consumers.dimming.utils import calc_dimming_surplus from modules.io_devices.eebus.config import AnalogInputMapping, DigitalInputMapping log = logging.getLogger(__name__) @@ -37,13 +38,11 @@ def __init__(self, config: DimmingSetup): def setup(self) -> None: lpc_value = data.data.io_states[f"io_states{self.config.configuration.io_device}" ].data.get.analog_input[AnalogInputMapping.LPC_VALUE.name] - surplus = data.data.counter_data[data.data.counter_all_data.get_evu_counter_str()].calc_raw_surplus() - if surplus > 0: - self.import_power_left = lpc_value + surplus - else: - self.import_power_left = lpc_value + surplus = calc_dimming_surplus() + self.import_power_left = lpc_value + surplus self.import_power_left -= self.config.configuration.fixed_import_power - log.debug(f"Dimmen: {self.import_power_left}W inkl. Überschuss") + log.debug( + f"Dimmen: Überschuss von {surplus}W berücksichtigt, verbleibende Dimm-Leistung: {self.import_power_left}W") with ModifyLoglevelContext(control_command_log, logging.DEBUG): if self.dimming_active() or check_fault_state_io_device(self.config.configuration.io_device): diff --git a/packages/modules/io_actions/controllable_consumers/dimming/api_io.py b/packages/modules/io_actions/controllable_consumers/dimming/api_io.py index 43131c930e..f92a08bff9 100644 --- a/packages/modules/io_actions/controllable_consumers/dimming/api_io.py +++ b/packages/modules/io_actions/controllable_consumers/dimming/api_io.py @@ -11,6 +11,7 @@ from modules.common.utils.component_parser import get_io_name_by_id from modules.io_actions.common import check_fault_state_io_device from modules.io_actions.controllable_consumers.dimming.config import DimmingSetup +from modules.io_actions.controllable_consumers.dimming.utils import calc_dimming_surplus log = logging.getLogger(__name__) control_command_log = logging.getLogger("steuve_control_command") @@ -42,14 +43,8 @@ def __init__(self, config: DimmingSetup): super().__init__() - def calc_dimming_surplus(self) -> float: - surplus = data.data.pv_all_data.data.get.power * -1 - if data.data.bat_all_data.data.get.power < 0: - surplus += -data.data.bat_all_data.data.get.power - return surplus - def setup(self) -> None: - surplus = self.calc_dimming_surplus() + surplus = calc_dimming_surplus() self.import_power_left = self.config.configuration.max_import_power + surplus self.import_power_left -= self.config.configuration.fixed_import_power diff --git a/packages/modules/io_actions/controllable_consumers/dimming/test_utils.py b/packages/modules/io_actions/controllable_consumers/dimming/test_utils.py new file mode 100644 index 0000000000..7a699fd2a6 --- /dev/null +++ b/packages/modules/io_actions/controllable_consumers/dimming/test_utils.py @@ -0,0 +1,26 @@ +import pytest +from unittest.mock import Mock + +from control import data +from .utils import calc_dimming_surplus + + +@pytest.fixture() +def mock_data() -> None: + data.data_init(Mock()) + + +@pytest.mark.parametrize( + "pv_power,bat_power,expected", + [ + pytest.param(-1000, 0, 1000, id="nur PV-Überschuss"), + pytest.param(200, 0, 0, id="WR gibt Eigenverbrauch aus"), + pytest.param(-500, -300, 800, id="PV & Speicher-Entladung"), + pytest.param(-500, 400, 500, id="Speicher wird geladen"), + pytest.param(-500, 0, 500, id="Speicher gesperrt"), + ] +) +def test_calc_dimming_surplus(mock_data, pv_power, bat_power, expected): + data.data.pv_all_data.data.get.power = pv_power + data.data.bat_all_data.data.get.power = bat_power + assert calc_dimming_surplus() == expected diff --git a/packages/modules/io_actions/controllable_consumers/dimming/utils.py b/packages/modules/io_actions/controllable_consumers/dimming/utils.py new file mode 100644 index 0000000000..8aae174fef --- /dev/null +++ b/packages/modules/io_actions/controllable_consumers/dimming/utils.py @@ -0,0 +1,8 @@ +from control import data + + +def calc_dimming_surplus() -> float: + surplus = min(data.data.pv_all_data.data.get.power, 0) * -1 + if data.data.bat_all_data.data.get.power < 0: + surplus += -data.data.bat_all_data.data.get.power + return surplus