From 620fa002f3972a0cc25d72a3c4b786c91ced52ec Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Thu, 27 Aug 2026 15:50:20 +0200 Subject: [PATCH 1/3] add bat control --- .../devices/huawei/huawei_smartlogger/bat.py | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/packages/modules/devices/huawei/huawei_smartlogger/bat.py b/packages/modules/devices/huawei/huawei_smartlogger/bat.py index d2faab252b..0df8ad7461 100644 --- a/packages/modules/devices/huawei/huawei_smartlogger/bat.py +++ b/packages/modules/devices/huawei/huawei_smartlogger/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 @@ -47,5 +50,47 @@ def update(self) -> None: ) self.store.set(bat_state) + def set_power_limit(self, power_limit: Optional[int]) -> None: + modbus_id = self.component_config.configuration.modbus_id + if power_limit is None: + log.debug("Keine Batteriesteuerung, Selbstregelung durch Speicher") + if self.last_mode is not None: + self.__tcp_client.write_register(47100, 0, data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.last_mode = None + elif power_limit == 0: + log.debug("Aktive Batteriesteuerung. Batterie wird auf Stop gesetzt und nicht entladen") + if self.last_mode != 'stop': + self.last_mode = 'stop' + # discharge + self.__tcp_client.write_register(47100, 2, data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_register(47246, 0, data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_register(47083, 1, data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_register(47249, 0, data_type=ModbusDataType.UINT_16, unit=modbus_id) + elif power_limit < 0: + log.debug(f"Aktive Batteriesteuerung Victron:" + f"Speicher soll mit {power_limit} W entladen werden.") + if self.last_mode != 'discharge': + self.last_mode = 'discharge' + # discharge + self.__tcp_client.write_register(47100, 2, data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_register(47246, 0, data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_register(47083, 1, data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_register(47249, -power_limit, data_type=ModbusDataType.UINT_16, unit=modbus_id) + elif power_limit > 0: + log.debug(f"Aktive Batteriesteuerung Victron:" + f"Speicher soll mit {power_limit} W geladen werden.") + if self.last_mode != 'charge': + self.last_mode = 'charge' + # charge + self.__tcp_client.write_register(47100, 1, data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_register(47246, 0, data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_register(47083, 1, data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_register(47247, power_limit, data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_register(47087, 1, data_type=ModbusDataType.UINT_16, unit=modbus_id) + + + def power_limit_controllable(self) -> bool: + return True + component_descriptor = ComponentDescriptor(configuration_factory=Huawei_SmartloggerBatSetup) From 113666abe82a9dbc2b0782313a6038eb5de0af9c Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Thu, 27 Aug 2026 15:51:13 +0200 Subject: [PATCH 2/3] fix whitespaces --- packages/modules/devices/huawei/huawei_smartlogger/bat.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/modules/devices/huawei/huawei_smartlogger/bat.py b/packages/modules/devices/huawei/huawei_smartlogger/bat.py index 0df8ad7461..57b77856d2 100644 --- a/packages/modules/devices/huawei/huawei_smartlogger/bat.py +++ b/packages/modules/devices/huawei/huawei_smartlogger/bat.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 import logging -from typing import TypedDict, Any, Optional +from typing import TypedDict, Any, Optional from modules.common import modbus from modules.common.abstract_device import AbstractBat @@ -88,7 +88,6 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: self.__tcp_client.write_register(47247, power_limit, data_type=ModbusDataType.UINT_16, unit=modbus_id) self.__tcp_client.write_register(47087, 1, data_type=ModbusDataType.UINT_16, unit=modbus_id) - def power_limit_controllable(self) -> bool: return True From 8e875b14ae4d446f2fd87d591c009b85fb8ca785 Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Thu, 27 Aug 2026 15:53:43 +0200 Subject: [PATCH 3/3] fix typos --- packages/modules/devices/huawei/huawei_smartlogger/bat.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/modules/devices/huawei/huawei_smartlogger/bat.py b/packages/modules/devices/huawei/huawei_smartlogger/bat.py index 57b77856d2..29cafc17f8 100644 --- a/packages/modules/devices/huawei/huawei_smartlogger/bat.py +++ b/packages/modules/devices/huawei/huawei_smartlogger/bat.py @@ -58,7 +58,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: self.__tcp_client.write_register(47100, 0, data_type=ModbusDataType.UINT_16, unit=modbus_id) self.last_mode = None elif power_limit == 0: - log.debug("Aktive Batteriesteuerung. Batterie wird auf Stop gesetzt und nicht entladen") + log.debug("Aktive Batteriesteuerung Huawei Smartlogger. Batterie wird auf Stop gesetzt und nicht entladen") if self.last_mode != 'stop': self.last_mode = 'stop' # discharge @@ -67,7 +67,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: self.__tcp_client.write_register(47083, 1, data_type=ModbusDataType.UINT_16, unit=modbus_id) self.__tcp_client.write_register(47249, 0, data_type=ModbusDataType.UINT_16, unit=modbus_id) elif power_limit < 0: - log.debug(f"Aktive Batteriesteuerung Victron:" + log.debug(f"Aktive Batteriesteuerung Huawei Smartlogger:" f"Speicher soll mit {power_limit} W entladen werden.") if self.last_mode != 'discharge': self.last_mode = 'discharge' @@ -77,7 +77,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: self.__tcp_client.write_register(47083, 1, data_type=ModbusDataType.UINT_16, unit=modbus_id) self.__tcp_client.write_register(47249, -power_limit, data_type=ModbusDataType.UINT_16, unit=modbus_id) elif power_limit > 0: - log.debug(f"Aktive Batteriesteuerung Victron:" + log.debug(f"Aktive Batteriesteuerung Huawei Smartlogger:" f"Speicher soll mit {power_limit} W geladen werden.") if self.last_mode != 'charge': self.last_mode = 'charge'