diff --git a/packages/modules/devices/saxpower/saxpower/bat.py b/packages/modules/devices/saxpower/saxpower/bat.py index f7d7bd4761..132e490028 100644 --- a/packages/modules/devices/saxpower/saxpower/bat.py +++ b/packages/modules/devices/saxpower/saxpower/bat.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 -from typing import TypedDict, Any +import logging +from typing import TypedDict, Any, Optional from modules.common import modbus from modules.common.abstract_device import AbstractBat @@ -13,6 +14,8 @@ from modules.common.utils.peak_filter import PeakFilter from modules.common.component_type import ComponentType +log = logging.getLogger(__name__) + class KwargsDict(TypedDict): device_id: int @@ -49,5 +52,38 @@ def update(self) -> None: ) self.store.set(bat_state) + def set_power_limit(self, power_limit: Optional[int]) -> None: + unit = self.__modbus_id + + if power_limit is None: + # Kein Powerlimit gefordert, erlaubte Entladeleistung auf Maximalwert setzen + max_power = 4600 + log.debug("Saxpower: Keine Batteriesteuerung gefordert, deaktiviere externe Steuerung.") + if self.last_mode is not None: + self.__tcp_client.write_register(43, max_power, data_type=ModbusDataType.UINT_16, unit=unit) + self.last_mode = None + elif power_limit == 0: + # Erlaubte Entladeleistung auf 0 setzen + log.debug("Saxpower: Aktive Batteriesteuerung angestoßen. Setze Entladesperre.") + if self.last_mode != 'stop': + self.__tcp_client.write_register(43, 0, data_type=ModbusDataType.UINT_16, unit=unit) + self.last_mode = 'stop' + elif power_limit < 0: + # Erlaubte Entladeleistung auf power_limit setzen + log.debug("Saxpower: Aktive Batteriesteuerung angestoßen. Erlaubte Entladeleistung " + f"auf {power_limit}W setzen.") + if self.last_mode != 'stop': + self.__tcp_client.write_register(43, power_limit, data_type=ModbusDataType.UINT_16, unit=unit) + self.last_mode = 'stop' + else: + # Aktive Ladung + log.debug("Saxpower: Aktive Batterieladung nicht möglich. Setze stattdessen Entladesperre.") + if self.last_mode != 'charge': + self.__tcp_client.write_register(43, 0, data_type=ModbusDataType.UINT_16, unit=unit) + self.last_mode = 'charge' + + def power_limit_controllable(self) -> bool: + return True + component_descriptor = ComponentDescriptor(configuration_factory=SaxpowerBatSetup)