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 bfb3bd6802..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") @@ -43,14 +44,12 @@ def __init__(self, config: DimmingSetup): super().__init__() 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 = 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): 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