diff --git a/packages/modules/devices/kostal/kostal_plenticore/bat.py b/packages/modules/devices/kostal/kostal_plenticore/bat.py index 92202b51df..bec16469fe 100644 --- a/packages/modules/devices/kostal/kostal_plenticore/bat.py +++ b/packages/modules/devices/kostal/kostal_plenticore/bat.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 import logging -from typing import TypedDict, Any +from typing import TypedDict, Any, Optional from pymodbus.constants import Endian from modules.common.abstract_device import AbstractBat @@ -54,5 +54,36 @@ def update(self) -> None: ) self.store.set(bat_state) + # 0x40A 1034 Battery charge power (DC) setpoint, absolute - W Float 2 RW + # negative Werte: laden, positive Werte: entladen + # Kostal setzt das Register autmatisch nach Timeout zurück auf Eigensteuerung. + # Timeout kann im Kostal UI geändert werden. Standardwert 30s + + def set_power_limit(self, power_limit: Optional[int]) -> None: + unit = self.device_config.configuration.modbus_id + log.debug(f'last_mode: {self.last_mode}') + + if power_limit is None: + # Wert wird nur einmal gesetzt damit die Eigenregelung nach Timeout greift + log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter") + if self.last_mode is not None: + self.__tcp_client.write_registers(1034, [0], data_type=ModbusDataType.FLOAT_32, unit=unit) + self.last_mode = None + elif power_limit == 0: + # wiederholt auf Stop setzen damit sich Register nicht zurücksetzt + log.debug("Aktive Batteriesteuerung. Batterie wird auf Stop gesetzt und nicht entladen") + self.__tcp_client.write_registers(1034, [0], data_type=ModbusDataType.FLOAT_32, unit=unit) + self.last_mode = 'stop' + elif power_limit < 0: + log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_limit} W entladen für den Hausverbrauch") + # Die maximale Entladeleistung begrenzen auf 7000W + power_value = int(min(abs(power_limit), 7000)) * -1 + log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W entladen für den Hausverbrauch") + self.__tcp_client.write_registers(1034, [power_value], data_type=ModbusDataType.FLOAT_32, unit=unit) + self.last_mode = 'discharge' + + def power_limit_controllable(self) -> bool: + return True + component_descriptor = ComponentDescriptor(configuration_factory=KostalPlenticoreBatSetup)