From 6b853be8ce7b6a98cce407f6037fff5a853fddb2 Mon Sep 17 00:00:00 2001 From: cr0i Date: Wed, 12 Mar 2025 02:25:23 +0100 Subject: [PATCH 01/10] Update bat.py --- .../devices/solaredge/solaredge/bat.py | 135 +++++++++++++++--- 1 file changed, 116 insertions(+), 19 deletions(-) diff --git a/packages/modules/devices/solaredge/solaredge/bat.py b/packages/modules/devices/solaredge/solaredge/bat.py index 59483aefa0..17df7b9eac 100644 --- a/packages/modules/devices/solaredge/solaredge/bat.py +++ b/packages/modules/devices/solaredge/solaredge/bat.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 import logging -from typing import Dict, Tuple, Union +from typing import Dict, Tuple, Union, Optional from pymodbus.constants import Endian @@ -14,13 +14,23 @@ from modules.common.simcount import SimCounter from modules.common.store import get_bat_value_store from modules.devices.solaredge.solaredge.config import SolaredgeBatSetup +import pymodbus log = logging.getLogger(__name__) FLOAT32_UNSUPPORTED = -0xffffff00000000000000000000000000 - class SolaredgeBat(AbstractBat): + # Define all possible registers with their data types + REGISTERS = { + "Battery1StateOfEnergy": (0xe184, ModbusDataType.FLOAT_32,), + "Battery1InstantaneousPower": (0xe174, ModbusDataType.FLOAT_32,), + "StorageControlMode": (0xe004, ModbusDataType.UINT_16,), + "StorageChargeDischargeDefaultMode": (0xe00a, ModbusDataType.UINT_16,), + "RemoteControlCommandMode": (0xe00d, ModbusDataType.UINT_16,), + "RemoteControlCommandDischargeLimit": (0xe010, ModbusDataType.FLOAT_32,), + } + def __init__(self, device_id: int, component_config: Union[Dict, SolaredgeBatSetup], @@ -31,32 +41,119 @@ def __init__(self, self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="speicher") self.store = get_bat_value_store(self.component_config.id) self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) + self.last_mode = None def update(self) -> None: self.store.set(self.read_state()) - def read_state(self): - power, soc = self.get_values() - imported, exported = self.get_imported_exported(power) - return BatState( - power=power, - soc=soc, + def read_state(self) -> BatState: + unit = self.component_config.configuration.modbus_id + + registers_to_read = [ + "Battery1InstantaneousPower", + "Battery1StateOfEnergy", + ] + values = self._read_registers(registers_to_read, unit) + + if values["Battery1InstantaneousPower"] == FLOAT32_UNSUPPORTED: + values["Battery1InstantaneousPower"] = 0 + + imported, exported = self.sim_counter.sim_count(values["Battery1InstantaneousPower"]) + + bat_state = BatState( + power=values["Battery1InstantaneousPower"], + soc=values["Battery1StateOfEnergy"], imported=imported, exported=exported ) + log.debug(f"Bat {self.__tcp_client.address}: {bat_state}") + return bat_state - def get_values(self) -> Tuple[float, float]: + def set_power_limit(self, power_limit: Optional[int]) -> None: unit = self.component_config.configuration.modbus_id - soc = self.__tcp_client.read_holding_registers( - 62852, ModbusDataType.FLOAT_32, wordorder=Endian.Little, unit=unit) - power = self.__tcp_client.read_holding_registers( - 62836, ModbusDataType.FLOAT_32, wordorder=Endian.Little, unit=unit) - if power == FLOAT32_UNSUPPORTED: - power = 0 - return power, soc - def get_imported_exported(self, power: float) -> Tuple[float, float]: - return self.sim_counter.sim_count(power) + if power_limit is None and self.last_mode is None: + # Kein Powerlimit gefordert, externe Steuerung bereits inaktiv + log.debug(f"Keine Batteriesteuerung gefordert, externe Steuerung inaktiv.") + + elif power_limit is None and self.last_mode is not None: + # Kein Powerlimit gefordert, externe Steuerung aktiv, externe Steuerung deaktivieren, Standardwerte setzen. + log.debug(f"Keine Batteriesteuerung mehr gefordert, deaktiviere externe Steuerung, LastMode={self.last_mode}.") + values_to_write = { + "RemoteControlCommandDischargeLimit": 5000, + "StorageChargeDischargeDefaultMode": 0, + "RemoteControlCommandMode": 0, + "StorageControlMode": 2, + } + self._write_registers(values_to_write, unit) + self.last_mode = None + + elif power_limit == 0 and self.last_mode != 'stop': + # externe Steuerung aktivieren, Speichermodus "Mit PV-Überschuss laden", Speicher wird nicht entladen. + values_to_write = { + "StorageControlMode": 4, + "StorageChargeDischargeDefaultMode": 1, + "RemoteControlCommandMode": 1, + } + self._write_registers(values_to_write, unit) + log.debug(f"Batteriesteuerung aktiviert. Modus 'Mit PV-Überschuss laden'.") + self.last_mode = 'stop' + + elif power_limit > 0: + # Powerlimit gefordert, ggf. externe Steuerung aktivieren, Limit setzen. + if self.last_mode != 'limited': + # externe Steuerung aktivieren, Modus "Maximaler Eigenverbrauch", Speicher laden und entladen erlaubt. + values_to_write = { + "StorageControlMode": 4, + "StorageChargeDischargeDefaultMode": 7, + "RemoteControlCommandMode": 7, + } + self._write_registers(values_to_write, unit) + log.debug(f"Batteriesteuerung aktiviert. Modus 'Maximaler Eigenverbrauch'.") + self.last_mode = 'limited' + + values_to_write = { + "RemoteControlCommandDischargeLimit": int(min(power_limit, 5000)) + } + self._write_registers(values_to_write, unit) + log.debug(f"Powerlimit gesetzt {power_limit} W") + + def _read_registers(self, register_names: list, unit: int) -> Dict[str, Union[int, float]]: + values = {} + for key in register_names: + log.debug(f"Bat raw values {self.__tcp_client.address}: {values}") + address, data_type = self.REGISTERS[key] + values[key] = self.__tcp_client.read_holding_registers( + address, data_type, wordorder=Endian.Little, unit=unit + ) + log.debug(f"Bat raw values {self.__tcp_client.address}: {values}") + return values + + def _write_registers(self, values_to_write: Dict[str, Union[int, float]], unit: int) -> None: + for key, value in values_to_write.items(): + address, data_type = self.REGISTERS[key] + encoded_value = self._encode_value(value, data_type) + self.__tcp_client.write_registers(address, encoded_value, unit=unit) + log.debug(f"Neuer Wert {encoded_value} in Register {address} geschrieben.") + + def _encode_value(self, value: Union[int, float], data_type: ModbusDataType) -> list: + builder = pymodbus.payload.BinaryPayloadBuilder( + byteorder=pymodbus.constants.Endian.Big, + wordorder=pymodbus.constants.Endian.Little + ) + encode_methods = { + ModbusDataType.UINT_32: builder.add_32bit_uint, + ModbusDataType.INT_32: builder.add_32bit_int, + ModbusDataType.UINT_16: builder.add_16bit_uint, + ModbusDataType.INT_16: builder.add_16bit_int, + ModbusDataType.FLOAT_32: builder.add_32bit_float, + } + + if data_type in encode_methods: + encode_methods[data_type](int(value)) + else: + raise ValueError(f"Unsupported data type: {data_type}") + return builder.to_registers() -component_descriptor = ComponentDescriptor(configuration_factory=SolaredgeBatSetup) +component_descriptor = ComponentDescriptor(configuration_factory=SolaredgeBatSetup) \ No newline at end of file From 333813d14f0fdc293c589fb41eb4df620e61f225 Mon Sep 17 00:00:00 2001 From: cr0i Date: Wed, 12 Mar 2025 05:45:36 +0100 Subject: [PATCH 02/10] Update bat.py --- packages/modules/devices/solaredge/solaredge/bat.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/modules/devices/solaredge/solaredge/bat.py b/packages/modules/devices/solaredge/solaredge/bat.py index 17df7b9eac..2d75647f0e 100644 --- a/packages/modules/devices/solaredge/solaredge/bat.py +++ b/packages/modules/devices/solaredge/solaredge/bat.py @@ -88,7 +88,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: self._write_registers(values_to_write, unit) self.last_mode = None - elif power_limit == 0 and self.last_mode != 'stop': + elif power_limit >= 0 and self.last_mode != 'stop': # externe Steuerung aktivieren, Speichermodus "Mit PV-Überschuss laden", Speicher wird nicht entladen. values_to_write = { "StorageControlMode": 4, @@ -99,6 +99,10 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: log.debug(f"Batteriesteuerung aktiviert. Modus 'Mit PV-Überschuss laden'.") self.last_mode = 'stop' + """ + Wegen Problemen bei mehrfachem Auslesen bzw. Schreiben von Registern deaktivert. + Modus Gesperrt und Hausverbrauch sperren daher den Speicher zunächst komplett gegen entladen. + elif power_limit > 0: # Powerlimit gefordert, ggf. externe Steuerung aktivieren, Limit setzen. if self.last_mode != 'limited': @@ -117,6 +121,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: } self._write_registers(values_to_write, unit) log.debug(f"Powerlimit gesetzt {power_limit} W") + """ def _read_registers(self, register_names: list, unit: int) -> Dict[str, Union[int, float]]: values = {} From a54937de64647a8992bd4069c6bb818c82871d0a Mon Sep 17 00:00:00 2001 From: cr0i Date: Wed, 12 Mar 2025 05:51:08 +0100 Subject: [PATCH 03/10] Update bat.py --- packages/modules/devices/solaredge/solaredge/bat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/devices/solaredge/solaredge/bat.py b/packages/modules/devices/solaredge/solaredge/bat.py index 2d75647f0e..a9837fea0d 100644 --- a/packages/modules/devices/solaredge/solaredge/bat.py +++ b/packages/modules/devices/solaredge/solaredge/bat.py @@ -161,4 +161,4 @@ def _encode_value(self, value: Union[int, float], data_type: ModbusDataType) -> return builder.to_registers() -component_descriptor = ComponentDescriptor(configuration_factory=SolaredgeBatSetup) \ No newline at end of file +component_descriptor = ComponentDescriptor(configuration_factory=SolaredgeBatSetup) From d42f283f24ab5b79b76308e2df6f016e61e4c97d Mon Sep 17 00:00:00 2001 From: cr0i Date: Thu, 13 Mar 2025 18:48:42 +0100 Subject: [PATCH 04/10] Update bat.py --- .../devices/solaredge/solaredge/bat.py | 28 ++----------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/packages/modules/devices/solaredge/solaredge/bat.py b/packages/modules/devices/solaredge/solaredge/bat.py index a9837fea0d..6ce3fc2f9f 100644 --- a/packages/modules/devices/solaredge/solaredge/bat.py +++ b/packages/modules/devices/solaredge/solaredge/bat.py @@ -74,11 +74,11 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: if power_limit is None and self.last_mode is None: # Kein Powerlimit gefordert, externe Steuerung bereits inaktiv - log.debug(f"Keine Batteriesteuerung gefordert, externe Steuerung inaktiv.") + pass elif power_limit is None and self.last_mode is not None: # Kein Powerlimit gefordert, externe Steuerung aktiv, externe Steuerung deaktivieren, Standardwerte setzen. - log.debug(f"Keine Batteriesteuerung mehr gefordert, deaktiviere externe Steuerung, LastMode={self.last_mode}.") + log.debug(f"Keine Batteriesteuerung mehr gefordert, deaktiviere externe Steuerung.") values_to_write = { "RemoteControlCommandDischargeLimit": 5000, "StorageChargeDischargeDefaultMode": 0, @@ -99,30 +99,6 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: log.debug(f"Batteriesteuerung aktiviert. Modus 'Mit PV-Überschuss laden'.") self.last_mode = 'stop' - """ - Wegen Problemen bei mehrfachem Auslesen bzw. Schreiben von Registern deaktivert. - Modus Gesperrt und Hausverbrauch sperren daher den Speicher zunächst komplett gegen entladen. - - elif power_limit > 0: - # Powerlimit gefordert, ggf. externe Steuerung aktivieren, Limit setzen. - if self.last_mode != 'limited': - # externe Steuerung aktivieren, Modus "Maximaler Eigenverbrauch", Speicher laden und entladen erlaubt. - values_to_write = { - "StorageControlMode": 4, - "StorageChargeDischargeDefaultMode": 7, - "RemoteControlCommandMode": 7, - } - self._write_registers(values_to_write, unit) - log.debug(f"Batteriesteuerung aktiviert. Modus 'Maximaler Eigenverbrauch'.") - self.last_mode = 'limited' - - values_to_write = { - "RemoteControlCommandDischargeLimit": int(min(power_limit, 5000)) - } - self._write_registers(values_to_write, unit) - log.debug(f"Powerlimit gesetzt {power_limit} W") - """ - def _read_registers(self, register_names: list, unit: int) -> Dict[str, Union[int, float]]: values = {} for key in register_names: From 3c855a706417776b5bf3fe06b2dbc618d692c983 Mon Sep 17 00:00:00 2001 From: cr0i Date: Thu, 13 Mar 2025 19:05:54 +0100 Subject: [PATCH 05/10] Update bat.py --- .../devices/solaredge/solaredge/bat.py | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/modules/devices/solaredge/solaredge/bat.py b/packages/modules/devices/solaredge/solaredge/bat.py index 6ce3fc2f9f..a8d7e85e7f 100644 --- a/packages/modules/devices/solaredge/solaredge/bat.py +++ b/packages/modules/devices/solaredge/solaredge/bat.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 import logging -from typing import Dict, Tuple, Union, Optional +from typing import Dict, Union, Optional from pymodbus.constants import Endian @@ -20,6 +20,7 @@ FLOAT32_UNSUPPORTED = -0xffffff00000000000000000000000000 + class SolaredgeBat(AbstractBat): # Define all possible registers with their data types REGISTERS = { @@ -78,12 +79,12 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: elif power_limit is None and self.last_mode is not None: # Kein Powerlimit gefordert, externe Steuerung aktiv, externe Steuerung deaktivieren, Standardwerte setzen. - log.debug(f"Keine Batteriesteuerung mehr gefordert, deaktiviere externe Steuerung.") + log.debug("Keine Batteriesteuerung mehr gefordert, deaktiviere externe Steuerung.") values_to_write = { - "RemoteControlCommandDischargeLimit": 5000, - "StorageChargeDischargeDefaultMode": 0, - "RemoteControlCommandMode": 0, - "StorageControlMode": 2, + "RemoteControlCommandDischargeLimit": 5000, + "StorageChargeDischargeDefaultMode": 0, + "RemoteControlCommandMode": 0, + "StorageControlMode": 2, } self._write_registers(values_to_write, unit) self.last_mode = None @@ -91,12 +92,12 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: elif power_limit >= 0 and self.last_mode != 'stop': # externe Steuerung aktivieren, Speichermodus "Mit PV-Überschuss laden", Speicher wird nicht entladen. values_to_write = { - "StorageControlMode": 4, - "StorageChargeDischargeDefaultMode": 1, - "RemoteControlCommandMode": 1, + "StorageControlMode": 4, + "StorageChargeDischargeDefaultMode": 1, + "RemoteControlCommandMode": 1, } self._write_registers(values_to_write, unit) - log.debug(f"Batteriesteuerung aktiviert. Modus 'Mit PV-Überschuss laden'.") + log.debug("Batteriesteuerung aktiviert. Modus 'Mit PV-Überschuss laden'.") self.last_mode = 'stop' def _read_registers(self, register_names: list, unit: int) -> Dict[str, Union[int, float]]: @@ -105,7 +106,7 @@ def _read_registers(self, register_names: list, unit: int) -> Dict[str, Union[in log.debug(f"Bat raw values {self.__tcp_client.address}: {values}") address, data_type = self.REGISTERS[key] values[key] = self.__tcp_client.read_holding_registers( - address, data_type, wordorder=Endian.Little, unit=unit + address, data_type, wordorder=Endian.Little, unit=unit ) log.debug(f"Bat raw values {self.__tcp_client.address}: {values}") return values @@ -137,4 +138,5 @@ def _encode_value(self, value: Union[int, float], data_type: ModbusDataType) -> return builder.to_registers() + component_descriptor = ComponentDescriptor(configuration_factory=SolaredgeBatSetup) From 21b12af1c45debf2d173dad27b2415e2d03f0b0b Mon Sep 17 00:00:00 2001 From: cr0i Date: Thu, 13 Mar 2025 20:21:22 +0100 Subject: [PATCH 06/10] Update bat.py --- packages/modules/devices/solaredge/solaredge/bat.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/solaredge/solaredge/bat.py b/packages/modules/devices/solaredge/solaredge/bat.py index a8d7e85e7f..0ad4205756 100644 --- a/packages/modules/devices/solaredge/solaredge/bat.py +++ b/packages/modules/devices/solaredge/solaredge/bat.py @@ -24,8 +24,8 @@ class SolaredgeBat(AbstractBat): # Define all possible registers with their data types REGISTERS = { - "Battery1StateOfEnergy": (0xe184, ModbusDataType.FLOAT_32,), - "Battery1InstantaneousPower": (0xe174, ModbusDataType.FLOAT_32,), + "Battery1StateOfEnergy": (0xf584, ModbusDataType.FLOAT_32,), # Dezimal 62852 + "Battery1InstantaneousPower": (0xf574, ModbusDataType.FLOAT_32,), # Dezimal 62836 "StorageControlMode": (0xe004, ModbusDataType.UINT_16,), "StorageChargeDischargeDefaultMode": (0xe00a, ModbusDataType.UINT_16,), "RemoteControlCommandMode": (0xe00d, ModbusDataType.UINT_16,), From 9c9c4728a5c12579a9c854c314940a1d75c6d61f Mon Sep 17 00:00:00 2001 From: cr0i Date: Thu, 13 Mar 2025 20:26:25 +0100 Subject: [PATCH 07/10] Update bat.py --- packages/modules/devices/solaredge/solaredge/bat.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/solaredge/solaredge/bat.py b/packages/modules/devices/solaredge/solaredge/bat.py index 0ad4205756..fe9c79df9c 100644 --- a/packages/modules/devices/solaredge/solaredge/bat.py +++ b/packages/modules/devices/solaredge/solaredge/bat.py @@ -24,8 +24,8 @@ class SolaredgeBat(AbstractBat): # Define all possible registers with their data types REGISTERS = { - "Battery1StateOfEnergy": (0xf584, ModbusDataType.FLOAT_32,), # Dezimal 62852 - "Battery1InstantaneousPower": (0xf574, ModbusDataType.FLOAT_32,), # Dezimal 62836 + "Battery1StateOfEnergy": (0xf584, ModbusDataType.FLOAT_32,), # Dezimal 62852 + "Battery1InstantaneousPower": (0xf574, ModbusDataType.FLOAT_32,), # Dezimal 62836 "StorageControlMode": (0xe004, ModbusDataType.UINT_16,), "StorageChargeDischargeDefaultMode": (0xe00a, ModbusDataType.UINT_16,), "RemoteControlCommandMode": (0xe00d, ModbusDataType.UINT_16,), From e81274bcf6bbf1cf54a167ee6b80d448a1ddfe8d Mon Sep 17 00:00:00 2001 From: cr0i Date: Mon, 17 Mar 2025 19:56:57 +0100 Subject: [PATCH 08/10] Update bat.py --- .../devices/solaredge/solaredge/bat.py | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/modules/devices/solaredge/solaredge/bat.py b/packages/modules/devices/solaredge/solaredge/bat.py index fe9c79df9c..a9a232f01c 100644 --- a/packages/modules/devices/solaredge/solaredge/bat.py +++ b/packages/modules/devices/solaredge/solaredge/bat.py @@ -4,6 +4,7 @@ from pymodbus.constants import Endian +from control import data from dataclass_utils import dataclass_from_dict from modules.common import modbus from modules.common.abstract_device import AbstractBat @@ -42,7 +43,7 @@ def __init__(self, self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="speicher") self.store = get_bat_value_store(self.component_config.id) self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) - self.last_mode = None + self.last_mode = 'undefined' def update(self) -> None: self.store.set(self.read_state()) @@ -72,14 +73,15 @@ def read_state(self) -> BatState: def set_power_limit(self, power_limit: Optional[int]) -> None: unit = self.component_config.configuration.modbus_id + PowerLimitMode = data.data.bat_all_data.data.config.power_limit_mode - if power_limit is None and self.last_mode is None: - # Kein Powerlimit gefordert, externe Steuerung bereits inaktiv - pass + if PowerLimitMode == 'no_limit': + # Keine Speichersteuerung, ggf. können andere Steuerungen aktiv sein (SolarEdge One, ioBroker, Node-Red etc.). + return - elif power_limit is None and self.last_mode is not None: - # Kein Powerlimit gefordert, externe Steuerung aktiv, externe Steuerung deaktivieren, Standardwerte setzen. - log.debug("Keine Batteriesteuerung mehr gefordert, deaktiviere externe Steuerung.") + if power_limit is None and self.last_mode is not None: + # Keine Ladung mit Speichersteuerung aktiv, Steuerung deaktivieren. + log.debug("Keine Speichersteuerung gefordert, Steuerung deaktivieren.") values_to_write = { "RemoteControlCommandDischargeLimit": 5000, "StorageChargeDischargeDefaultMode": 0, @@ -90,14 +92,14 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: self.last_mode = None elif power_limit >= 0 and self.last_mode != 'stop': - # externe Steuerung aktivieren, Speichermodus "Mit PV-Überschuss laden", Speicher wird nicht entladen. + # Speichersteuerung aktivieren, Speicher-Entladung sperren. + log.debug("Speichersteuerung aktivieren. Speicher-Entladung sperren.") values_to_write = { "StorageControlMode": 4, "StorageChargeDischargeDefaultMode": 1, "RemoteControlCommandMode": 1, } self._write_registers(values_to_write, unit) - log.debug("Batteriesteuerung aktiviert. Modus 'Mit PV-Überschuss laden'.") self.last_mode = 'stop' def _read_registers(self, register_names: list, unit: int) -> Dict[str, Union[int, float]]: From 9e97a0258c5be1206181241584c55693b71be64c Mon Sep 17 00:00:00 2001 From: cr0i Date: Mon, 17 Mar 2025 20:02:56 +0100 Subject: [PATCH 09/10] Update bat.py --- packages/modules/devices/solaredge/solaredge/bat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/devices/solaredge/solaredge/bat.py b/packages/modules/devices/solaredge/solaredge/bat.py index a9a232f01c..e94bb8e8aa 100644 --- a/packages/modules/devices/solaredge/solaredge/bat.py +++ b/packages/modules/devices/solaredge/solaredge/bat.py @@ -76,7 +76,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: PowerLimitMode = data.data.bat_all_data.data.config.power_limit_mode if PowerLimitMode == 'no_limit': - # Keine Speichersteuerung, ggf. können andere Steuerungen aktiv sein (SolarEdge One, ioBroker, Node-Red etc.). + # Keine Speichersteuerung, andere Steuerungen ermöglichen (SolarEdge ONE, ioBroker, Node-RED etc.). return if power_limit is None and self.last_mode is not None: From 15aad3f1a872262cd89da74aab8131342995033d Mon Sep 17 00:00:00 2001 From: cr0i Date: Mon, 17 Mar 2025 21:44:13 +0100 Subject: [PATCH 10/10] Update bat.py --- .../devices/solaredge/solaredge/bat.py | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/modules/devices/solaredge/solaredge/bat.py b/packages/modules/devices/solaredge/solaredge/bat.py index e94bb8e8aa..5a936256b9 100644 --- a/packages/modules/devices/solaredge/solaredge/bat.py +++ b/packages/modules/devices/solaredge/solaredge/bat.py @@ -79,17 +79,21 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: # Keine Speichersteuerung, andere Steuerungen ermöglichen (SolarEdge ONE, ioBroker, Node-RED etc.). return - if power_limit is None and self.last_mode is not None: - # Keine Ladung mit Speichersteuerung aktiv, Steuerung deaktivieren. - log.debug("Keine Speichersteuerung gefordert, Steuerung deaktivieren.") - values_to_write = { - "RemoteControlCommandDischargeLimit": 5000, - "StorageChargeDischargeDefaultMode": 0, - "RemoteControlCommandMode": 0, - "StorageControlMode": 2, - } - self._write_registers(values_to_write, unit) - self.last_mode = None + if power_limit is None: + if self.last_mode is not None: + # Keine Ladung mit Speichersteuerung aktiv, Steuerung deaktivieren. + log.debug("Keine Speichersteuerung gefordert, Steuerung deaktivieren.") + values_to_write = { + "RemoteControlCommandDischargeLimit": 5000, + "StorageChargeDischargeDefaultMode": 0, + "RemoteControlCommandMode": 0, + "StorageControlMode": 2, + } + self._write_registers(values_to_write, unit) + self.last_mode = None + else: + # Keine Ladung mit Speichersteuerung aktiv, Steuerung bereits inaktiv. + return elif power_limit >= 0 and self.last_mode != 'stop': # Speichersteuerung aktivieren, Speicher-Entladung sperren.