From c999306b9794e21d56fb1a628abf891980e93032 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Fri, 25 Apr 2025 09:26:24 +0200 Subject: [PATCH 01/21] First implementation of power_limit --- .../modules/devices/victron/victron/bat.py | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index a6c1003caa..c669d20453 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 -from typing import Any, TypedDict +import logging +from typing import Any, Optional, TypedDict from modules.common import modbus from modules.common.abstract_device import AbstractBat @@ -11,6 +12,7 @@ from modules.common.store import get_bat_value_store from modules.devices.victron.victron.config import VictronBatSetup +log = logging.getLogger(__name__) class KwargsDict(TypedDict): device_id: int @@ -28,6 +30,7 @@ def initialize(self) -> None: 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 = 'Undefined' def update(self) -> None: modbus_id = self.component_config.configuration.modbus_id @@ -44,5 +47,34 @@ def update(self) -> None: ) self.store.set(bat_state) + def set_power_limit(self, power_limit: Optional[int]) -> None: + unit = self.component_config.configuration.modbus_id + log.debug(f'last_mode: {self.last_mode}') + + if power_limit is None: + log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter") + if self.last_mode is not None: + # ESS Mode 1 für Selbstregelung mit Phasenkompensation, alternativ ESS Mode 2? + self.__tcp_client.write_registers(2902, [0], data_type=ModbusDataType.UINT_16, unit=unit) + 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': + # ESS Mode 3 für externe Steuerung und L1 auf 0 setzen, was ist bei 3 phasigen Victrons? + self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=unit) + self.__tcp_client.write_registers(37, [0], data_type=ModbusDataType.INT_16, 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") + if self.last_mode != 'discharge': + self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=unit) + self.last_mode = 'discharge' + # Die maximale Entladeleistung begrenzen auf 3600W, für Test + power_value = int(min(power_limit, 3600)) + self.__tcp_client.write_registers(37, [power_value], data_type=ModbusDataType.INT_16, unit=unit) + + def power_limit_controllable(self) -> bool: + return True + component_descriptor = ComponentDescriptor(configuration_factory=VictronBatSetup) From 018124c003e6a0774d9c6098e9b234105dd52cc0 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Fri, 25 Apr 2025 11:09:36 +0200 Subject: [PATCH 02/21] Fix for stop and negative power_value --- packages/modules/devices/victron/victron/bat.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index c669d20453..76407c7593 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -62,15 +62,15 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: if self.last_mode != 'stop': # ESS Mode 3 für externe Steuerung und L1 auf 0 setzen, was ist bei 3 phasigen Victrons? self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=unit) - self.__tcp_client.write_registers(37, [0], data_type=ModbusDataType.INT_16, unit=unit) self.last_mode = 'stop' + self.__tcp_client.write_registers(37, [0], data_type=ModbusDataType.INT_16, unit=unit) elif power_limit > 0: log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_limit} W entladen für den Hausverbrauch") if self.last_mode != 'discharge': self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=unit) self.last_mode = 'discharge' # Die maximale Entladeleistung begrenzen auf 3600W, für Test - power_value = int(min(power_limit, 3600)) + power_value = int(min(power_limit, 3600)) *-1 self.__tcp_client.write_registers(37, [power_value], data_type=ModbusDataType.INT_16, unit=unit) def power_limit_controllable(self) -> bool: From 5a5f66221226e66dd956eae9965bfec0b6818e54 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Fri, 25 Apr 2025 15:45:50 +0200 Subject: [PATCH 03/21] Combine stop and discharge and add debug logging --- .../modules/devices/victron/victron/bat.py | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index 76407c7593..233cd23167 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -49,28 +49,30 @@ def update(self) -> None: def set_power_limit(self, power_limit: Optional[int]) -> None: unit = self.component_config.configuration.modbus_id + + # Zu Debugzwecken + ess_mode = self.__tcp_client.read_holding_registers(2902, ModbusDataType.UINT_16, unit=unit) + ess_min_soc = self.__tcp_client.read_holding_registers(2901, ModbusDataType.UINT_16, unit=unit) + log.debug(f"Aktueller ESS Mode: {ess_mode}") + log.debug(f"Aktueller ESS Minimum SoC: {ess_min_soc}") log.debug(f'last_mode: {self.last_mode}') if power_limit is None: log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter") if self.last_mode is not None: - # ESS Mode 1 für Selbstregelung mit Phasenkompensation, alternativ ESS Mode 2? + # ESS Mode 1 für Selbstregelung mit Phasenkompensation setzen self.__tcp_client.write_registers(2902, [0], data_type=ModbusDataType.UINT_16, unit=unit) 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': - # ESS Mode 3 für externe Steuerung und L1 auf 0 setzen, was ist bei 3 phasigen Victrons? - self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=unit) - self.last_mode = 'stop' - self.__tcp_client.write_registers(37, [0], data_type=ModbusDataType.INT_16, unit=unit) - elif power_limit > 0: - log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_limit} W entladen für den Hausverbrauch") + elif power_limit >= 0: + log.debug("Aktive Batteriesteuerung. Batterie wird mit {power_limit}W entladen") if self.last_mode != 'discharge': + # ESS Mode 3 für externe Steuerung und auf L1 wird entladen self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=unit) + self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=unit) + self.__tcp_client.write_registers(39, [0], data_type=ModbusDataType.UINT_16, unit=unit) self.last_mode = 'discharge' - # Die maximale Entladeleistung begrenzen auf 3600W, für Test - power_value = int(min(power_limit, 3600)) *-1 + # Die maximale Entladeleistung begrenzen auf 3000W, für Test + power_value = int(min(power_limit, 3000)) *-1 self.__tcp_client.write_registers(37, [power_value], data_type=ModbusDataType.INT_16, unit=unit) def power_limit_controllable(self) -> bool: From fc21ca3478e8759526bcaba662a37bf2deacc343 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Sun, 27 Apr 2025 00:14:57 +0200 Subject: [PATCH 04/21] Add dynamic ess mode for debug --- packages/modules/devices/victron/victron/bat.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index 233cd23167..6fa7dc0a0e 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -53,8 +53,10 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: # Zu Debugzwecken ess_mode = self.__tcp_client.read_holding_registers(2902, ModbusDataType.UINT_16, unit=unit) ess_min_soc = self.__tcp_client.read_holding_registers(2901, ModbusDataType.UINT_16, unit=unit) + dynamic_ess_mode = self.__tcp_client.read_holding_registers(5400, ModbusDataType.UINT_16, unit=unit) log.debug(f"Aktueller ESS Mode: {ess_mode}") log.debug(f"Aktueller ESS Minimum SoC: {ess_min_soc}") + log.debug(f"Aktueller Dynamic ESS Mode: {dynamic_ess_mode}") log.debug(f'last_mode: {self.last_mode}') if power_limit is None: From 445797c3d0385eaed593a597ec33a3bdb5555ed1 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Sun, 27 Apr 2025 00:31:52 +0200 Subject: [PATCH 05/21] Add robustness if state unknown --- packages/modules/devices/victron/victron/bat.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index 6fa7dc0a0e..4a9fb0c87f 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -65,14 +65,14 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: # ESS Mode 1 für Selbstregelung mit Phasenkompensation setzen self.__tcp_client.write_registers(2902, [0], data_type=ModbusDataType.UINT_16, unit=unit) self.last_mode = None - elif power_limit >= 0: + elif power_limit >= 0 and self.last_mode != 'discharge': + # ESS Mode 3 für externe Steuerung und auf L1 wird entladen + self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=unit) + self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=unit) + self.__tcp_client.write_registers(39, [0], data_type=ModbusDataType.UINT_16, unit=unit) + self.last_mode = 'discharge' + elif power_limit >= 0 and self.last_mode == 'discharge': log.debug("Aktive Batteriesteuerung. Batterie wird mit {power_limit}W entladen") - if self.last_mode != 'discharge': - # ESS Mode 3 für externe Steuerung und auf L1 wird entladen - self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=unit) - self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=unit) - self.__tcp_client.write_registers(39, [0], data_type=ModbusDataType.UINT_16, unit=unit) - self.last_mode = 'discharge' # Die maximale Entladeleistung begrenzen auf 3000W, für Test power_value = int(min(power_limit, 3000)) *-1 self.__tcp_client.write_registers(37, [power_value], data_type=ModbusDataType.INT_16, unit=unit) From c3f5d51ca875d1408a37331fd4a5f6956b14b590 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Mon, 28 Apr 2025 21:36:44 +0200 Subject: [PATCH 06/21] Fix ESS Mode for None --- packages/modules/devices/victron/victron/bat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index 4a9fb0c87f..b934fe7e72 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -63,7 +63,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter") if self.last_mode is not None: # ESS Mode 1 für Selbstregelung mit Phasenkompensation setzen - self.__tcp_client.write_registers(2902, [0], data_type=ModbusDataType.UINT_16, unit=unit) + self.__tcp_client.write_registers(2902, [1], data_type=ModbusDataType.UINT_16, unit=unit) self.last_mode = None elif power_limit >= 0 and self.last_mode != 'discharge': # ESS Mode 3 für externe Steuerung und auf L1 wird entladen From 3873d1af305242a528086919591eb4e92d474d1c Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 29 Apr 2025 09:01:04 +0200 Subject: [PATCH 07/21] Added more debugging and split 0 and >0 --- .../modules/devices/victron/victron/bat.py | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index b934fe7e72..d01f61d836 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -50,13 +50,18 @@ def update(self) -> None: def set_power_limit(self, power_limit: Optional[int]) -> None: unit = self.component_config.configuration.modbus_id - # Zu Debugzwecken + # Zu Debugzwecken kann später gelöscht werden ess_mode = self.__tcp_client.read_holding_registers(2902, ModbusDataType.UINT_16, unit=unit) ess_min_soc = self.__tcp_client.read_holding_registers(2901, ModbusDataType.UINT_16, unit=unit) dynamic_ess_mode = self.__tcp_client.read_holding_registers(5400, ModbusDataType.UINT_16, unit=unit) + ess_charge_flag = self.__tcp_client.read_holding_registers(38, ModbusDataType.UINT_16, unit=unit) + ess_feedin_flag = self.__tcp_client.read_holding_registers(39, ModbusDataType.UINT_16, unit=unit) log.debug(f"Aktueller ESS Mode: {ess_mode}") log.debug(f"Aktueller ESS Minimum SoC: {ess_min_soc}") log.debug(f"Aktueller Dynamic ESS Mode: {dynamic_ess_mode}") + log.debug(f"Aktuelles ESS Charge Flag: {ess_charge_flag}") + log.debug(f"Aktuelles ESS Feed-In Flag: {ess_feedin_flag}") + log.debug(f"Aktuelles power_limit: {power_limit}") log.debug(f'last_mode: {self.last_mode}') if power_limit is None: @@ -65,16 +70,25 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: # ESS Mode 1 für Selbstregelung mit Phasenkompensation setzen self.__tcp_client.write_registers(2902, [1], data_type=ModbusDataType.UINT_16, unit=unit) self.last_mode = None - elif power_limit >= 0 and self.last_mode != 'discharge': - # ESS Mode 3 für externe Steuerung und auf L1 wird entladen - self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=unit) - self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=unit) - self.__tcp_client.write_registers(39, [0], data_type=ModbusDataType.UINT_16, unit=unit) - self.last_mode = 'discharge' - elif power_limit >= 0 and self.last_mode == 'discharge': - log.debug("Aktive Batteriesteuerung. Batterie wird mit {power_limit}W entladen") + elif power_limit == 0: + log.debug("Aktive Batteriesteuerung. Batterie wird auf Stop gesetzt und nicht entladen") + if self.last_mode != 'stop': + # ESS Mode 3 für externe Steuerung und keine Entladung + self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=unit) + self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=unit) + self.__tcp_client.write_registers(39, [1], data_type=ModbusDataType.UINT_16, unit=unit) + self.last_mode = 'stop' + # self.__tcp_client.write_registers(37, [0], data_type=ModbusDataType.INT_16, unit=unit) + elif power_limit > 0: + if self.last_mode != 'discharge': + # ESS Mode 3 für externe Steuerung und auf L1 wird entladen + self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=unit) + self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=unit) + self.__tcp_client.write_registers(39, [0], data_type=ModbusDataType.UINT_16, unit=unit) + self.last_mode = 'discharge' # Die maximale Entladeleistung begrenzen auf 3000W, für Test - power_value = int(min(power_limit, 3000)) *-1 + power_value = int(min(power_limit, 3000)) * -1 + log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W entladen") self.__tcp_client.write_registers(37, [power_value], data_type=ModbusDataType.INT_16, unit=unit) def power_limit_controllable(self) -> bool: From 24eca16379feefd91c42ddaa14aa3a978b6f6e94 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 29 Apr 2025 11:20:17 +0200 Subject: [PATCH 08/21] Use modbus_id instead of unit --- .../modules/devices/victron/victron/bat.py | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index d01f61d836..38b5b6e957 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -48,19 +48,19 @@ def update(self) -> None: self.store.set(bat_state) def set_power_limit(self, power_limit: Optional[int]) -> None: - unit = self.component_config.configuration.modbus_id + modbus_id = self.component_config.configuration.modbus_id # Zu Debugzwecken kann später gelöscht werden - ess_mode = self.__tcp_client.read_holding_registers(2902, ModbusDataType.UINT_16, unit=unit) - ess_min_soc = self.__tcp_client.read_holding_registers(2901, ModbusDataType.UINT_16, unit=unit) - dynamic_ess_mode = self.__tcp_client.read_holding_registers(5400, ModbusDataType.UINT_16, unit=unit) - ess_charge_flag = self.__tcp_client.read_holding_registers(38, ModbusDataType.UINT_16, unit=unit) - ess_feedin_flag = self.__tcp_client.read_holding_registers(39, ModbusDataType.UINT_16, unit=unit) + ess_mode = self.__tcp_client.read_holding_registers(2902, ModbusDataType.UINT_16, unit=modbus_id) + ess_min_soc = self.__tcp_client.read_holding_registers(2901, ModbusDataType.UINT_16, unit=modbus_id) + dynamic_ess_mode = self.__tcp_client.read_holding_registers(5400, ModbusDataType.UINT_16, unit=modbus_id) + #ess_charge_flag = self.__tcp_client.read_holding_registers(38, ModbusDataType.UINT_16, unit=modbus_id) + #ess_feedin_flag = self.__tcp_client.read_holding_registers(39, ModbusDataType.UINT_16, unit=modbus_id) log.debug(f"Aktueller ESS Mode: {ess_mode}") log.debug(f"Aktueller ESS Minimum SoC: {ess_min_soc}") log.debug(f"Aktueller Dynamic ESS Mode: {dynamic_ess_mode}") - log.debug(f"Aktuelles ESS Charge Flag: {ess_charge_flag}") - log.debug(f"Aktuelles ESS Feed-In Flag: {ess_feedin_flag}") + #log.debug(f"Aktuelles ESS Charge Flag: {ess_charge_flag}") + #log.debug(f"Aktuelles ESS Feed-In Flag: {ess_feedin_flag}") log.debug(f"Aktuelles power_limit: {power_limit}") log.debug(f'last_mode: {self.last_mode}') @@ -68,28 +68,28 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter") if self.last_mode is not None: # ESS Mode 1 für Selbstregelung mit Phasenkompensation setzen - self.__tcp_client.write_registers(2902, [1], data_type=ModbusDataType.UINT_16, unit=unit) + self.__tcp_client.write_registers(2902, [1], 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': # ESS Mode 3 für externe Steuerung und keine Entladung - self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=unit) - self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=unit) - self.__tcp_client.write_registers(39, [1], data_type=ModbusDataType.UINT_16, unit=unit) + self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_registers(39, [1], data_type=ModbusDataType.UINT_16, unit=modbus_id) self.last_mode = 'stop' - # self.__tcp_client.write_registers(37, [0], data_type=ModbusDataType.INT_16, unit=unit) + # self.__tcp_client.write_registers(37, [0], data_type=ModbusDataType.INT_16, unit=modbus_id) elif power_limit > 0: if self.last_mode != 'discharge': # ESS Mode 3 für externe Steuerung und auf L1 wird entladen - self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=unit) - self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=unit) - self.__tcp_client.write_registers(39, [0], data_type=ModbusDataType.UINT_16, unit=unit) + self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_registers(39, [0], data_type=ModbusDataType.UINT_16, unit=modbus_id) self.last_mode = 'discharge' # Die maximale Entladeleistung begrenzen auf 3000W, für Test power_value = int(min(power_limit, 3000)) * -1 log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W entladen") - self.__tcp_client.write_registers(37, [power_value], data_type=ModbusDataType.INT_16, unit=unit) + self.__tcp_client.write_registers(37, [power_value], data_type=ModbusDataType.INT_16, unit=modbus_id) def power_limit_controllable(self) -> bool: return True From 5e3b011c447bea2966917d318a20e4036b069972 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 29 Apr 2025 15:29:01 +0200 Subject: [PATCH 09/21] Fix control after testing --- packages/modules/devices/victron/victron/bat.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index 38b5b6e957..a6f697d2f1 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -52,15 +52,9 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: # Zu Debugzwecken kann später gelöscht werden ess_mode = self.__tcp_client.read_holding_registers(2902, ModbusDataType.UINT_16, unit=modbus_id) - ess_min_soc = self.__tcp_client.read_holding_registers(2901, ModbusDataType.UINT_16, unit=modbus_id) dynamic_ess_mode = self.__tcp_client.read_holding_registers(5400, ModbusDataType.UINT_16, unit=modbus_id) - #ess_charge_flag = self.__tcp_client.read_holding_registers(38, ModbusDataType.UINT_16, unit=modbus_id) - #ess_feedin_flag = self.__tcp_client.read_holding_registers(39, ModbusDataType.UINT_16, unit=modbus_id) log.debug(f"Aktueller ESS Mode: {ess_mode}") - log.debug(f"Aktueller ESS Minimum SoC: {ess_min_soc}") log.debug(f"Aktueller Dynamic ESS Mode: {dynamic_ess_mode}") - #log.debug(f"Aktuelles ESS Charge Flag: {ess_charge_flag}") - #log.debug(f"Aktuelles ESS Feed-In Flag: {ess_feedin_flag}") log.debug(f"Aktuelles power_limit: {power_limit}") log.debug(f'last_mode: {self.last_mode}') @@ -69,22 +63,20 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: if self.last_mode is not None: # ESS Mode 1 für Selbstregelung mit Phasenkompensation setzen self.__tcp_client.write_registers(2902, [1], data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_registers(38, [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': # ESS Mode 3 für externe Steuerung und keine Entladung self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=modbus_id) - self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=modbus_id) - self.__tcp_client.write_registers(39, [1], data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_registers(38, [1], data_type=ModbusDataType.UINT_16, unit=modbus_id) self.last_mode = 'stop' - # self.__tcp_client.write_registers(37, [0], data_type=ModbusDataType.INT_16, unit=modbus_id) elif power_limit > 0: if self.last_mode != 'discharge': # ESS Mode 3 für externe Steuerung und auf L1 wird entladen self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=modbus_id) self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=modbus_id) - self.__tcp_client.write_registers(39, [0], data_type=ModbusDataType.UINT_16, unit=modbus_id) self.last_mode = 'discharge' # Die maximale Entladeleistung begrenzen auf 3000W, für Test power_value = int(min(power_limit, 3000)) * -1 From 54465a8930431a3d5710e1480c2dcfb3209746d7 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 29 Apr 2025 16:02:41 +0200 Subject: [PATCH 10/21] Add check for DESS --- packages/modules/devices/victron/victron/bat.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index a6f697d2f1..f8bf3673bc 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -58,6 +58,12 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: log.debug(f"Aktuelles power_limit: {power_limit}") log.debug(f'last_mode: {self.last_mode}') + # Check Dynamic ESS Mode + dynamic_ess_mode = self.__tcp_client.read_holding_registers(5400, ModbusDataType.UINT_16, unit=modbus_id) + if dynamic_ess_mode == 1: + log.debug("Dynamic ESS Mode ist aktiv, daher erfolgt keine Regelung des Speichers durch openWB") + return + if power_limit is None: log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter") if self.last_mode is not None: From 2aae397e17b4ade7b33d48208ed4ae6f7cd4b4dc Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 29 Apr 2025 20:06:41 +0200 Subject: [PATCH 11/21] Make sure power_limit is INT --- packages/modules/devices/victron/victron/bat.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index f8bf3673bc..3c531526ba 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -84,8 +84,16 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=modbus_id) self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=modbus_id) self.last_mode = 'discharge' - # Die maximale Entladeleistung begrenzen auf 3000W, für Test - power_value = int(min(power_limit, 3000)) * -1 + # Die maximale Entladeleistung begrenzen auf 5000W, für Test + power_limit = int(power_limit) # Ensure power_limit is an integer + log.debug(f"Int power_limit: {power_limit}") + power_value = int(min(power_limit, 5000)) * -1 + log.debug(f"Errechneter power_value: {power_value}") + + # Validate power_value range + if not -32768 <= power_value <= 32767: + raise ValueError(f"power_value {power_value} is out of range for INT_16") + log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W entladen") self.__tcp_client.write_registers(37, [power_value], data_type=ModbusDataType.INT_16, unit=modbus_id) From 957804b10b7a45f150d8bcc423edb4e76e94f6d8 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 29 Apr 2025 22:17:52 +0200 Subject: [PATCH 12/21] Change Setpoint register to INT32 --- packages/modules/devices/victron/victron/bat.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index 3c531526ba..2badd0ff21 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -89,13 +89,9 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: log.debug(f"Int power_limit: {power_limit}") power_value = int(min(power_limit, 5000)) * -1 log.debug(f"Errechneter power_value: {power_value}") - - # Validate power_value range - if not -32768 <= power_value <= 32767: - raise ValueError(f"power_value {power_value} is out of range for INT_16") log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W entladen") - self.__tcp_client.write_registers(37, [power_value], data_type=ModbusDataType.INT_16, unit=modbus_id) + self.__tcp_client.write_registers(96, [power_value], data_type=ModbusDataType.INT_32, unit=modbus_id) def power_limit_controllable(self) -> bool: return True From 095b21c4114ee08a3ae410fe8633468e3b94e0fc Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 29 Apr 2025 23:03:23 +0200 Subject: [PATCH 13/21] Change order of write registers --- packages/modules/devices/victron/victron/bat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index 2badd0ff21..4e02a44b47 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -68,8 +68,8 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter") if self.last_mode is not None: # ESS Mode 1 für Selbstregelung mit Phasenkompensation setzen - self.__tcp_client.write_registers(2902, [1], data_type=ModbusDataType.UINT_16, unit=modbus_id) self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_registers(2902, [1], 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") From d951ad850f4a0d716d54c0a5ea61c827f48edcf8 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 30 Apr 2025 10:45:19 +0200 Subject: [PATCH 14/21] Fix Modbus ID and ensure INT16 --- packages/modules/devices/victron/victron/bat.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index 4e02a44b47..0f5458d868 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -68,7 +68,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter") if self.last_mode is not None: # ESS Mode 1 für Selbstregelung mit Phasenkompensation setzen - self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=228) self.__tcp_client.write_registers(2902, [1], data_type=ModbusDataType.UINT_16, unit=modbus_id) self.last_mode = None elif power_limit == 0: @@ -76,22 +76,20 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: if self.last_mode != 'stop': # ESS Mode 3 für externe Steuerung und keine Entladung self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=modbus_id) - self.__tcp_client.write_registers(38, [1], data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_registers(38, [1], data_type=ModbusDataType.UINT_16, unit=228) self.last_mode = 'stop' elif power_limit > 0: if self.last_mode != 'discharge': # ESS Mode 3 für externe Steuerung und auf L1 wird entladen self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=modbus_id) - self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=modbus_id) + self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=228) self.last_mode = 'discharge' # Die maximale Entladeleistung begrenzen auf 5000W, für Test power_limit = int(power_limit) # Ensure power_limit is an integer - log.debug(f"Int power_limit: {power_limit}") power_value = int(min(power_limit, 5000)) * -1 log.debug(f"Errechneter power_value: {power_value}") - log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W entladen") - self.__tcp_client.write_registers(96, [power_value], data_type=ModbusDataType.INT_32, unit=modbus_id) + self.__tcp_client.write_registers(37, [power_value & 0xFFFF], data_type=ModbusDataType.INT_16, unit=228) def power_limit_controllable(self) -> bool: return True From 80c833b876cf95c01f4ab8f8d1fe2301b7c72a84 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 30 Apr 2025 13:21:36 +0200 Subject: [PATCH 15/21] Change to Register 39 and try UINT16 --- packages/modules/devices/victron/victron/bat.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index 0f5458d868..db8e30ccec 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -68,7 +68,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter") if self.last_mode is not None: # ESS Mode 1 für Selbstregelung mit Phasenkompensation setzen - self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=228) + self.__tcp_client.write_registers(39, [0], data_type=ModbusDataType.UINT_16, unit=228) self.__tcp_client.write_registers(2902, [1], data_type=ModbusDataType.UINT_16, unit=modbus_id) self.last_mode = None elif power_limit == 0: @@ -76,20 +76,18 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: if self.last_mode != 'stop': # ESS Mode 3 für externe Steuerung und keine Entladung self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=modbus_id) - self.__tcp_client.write_registers(38, [1], data_type=ModbusDataType.UINT_16, unit=228) + self.__tcp_client.write_registers(39, [1], data_type=ModbusDataType.UINT_16, unit=228) self.last_mode = 'stop' elif power_limit > 0: if self.last_mode != 'discharge': # ESS Mode 3 für externe Steuerung und auf L1 wird entladen self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=modbus_id) - self.__tcp_client.write_registers(38, [0], data_type=ModbusDataType.UINT_16, unit=228) + self.__tcp_client.write_registers(39, [0], data_type=ModbusDataType.UINT_16, unit=228) self.last_mode = 'discharge' # Die maximale Entladeleistung begrenzen auf 5000W, für Test - power_limit = int(power_limit) # Ensure power_limit is an integer power_value = int(min(power_limit, 5000)) * -1 - log.debug(f"Errechneter power_value: {power_value}") log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W entladen") - self.__tcp_client.write_registers(37, [power_value & 0xFFFF], data_type=ModbusDataType.INT_16, unit=228) + self.__tcp_client.write_registers(37, [power_value], data_type=ModbusDataType.UINT_16, unit=228) def power_limit_controllable(self) -> bool: return True From a47c5a179dcb10d1984b1e6672364463d9abb708 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 30 Apr 2025 21:50:09 +0200 Subject: [PATCH 16/21] Register 37 must be int16 and fix correct value --- packages/modules/devices/victron/victron/bat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index db8e30ccec..598aa87920 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -87,7 +87,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: # Die maximale Entladeleistung begrenzen auf 5000W, für Test power_value = int(min(power_limit, 5000)) * -1 log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W entladen") - self.__tcp_client.write_registers(37, [power_value], data_type=ModbusDataType.UINT_16, unit=228) + self.__tcp_client.write_registers(37, [power_value & 0xFFFF], data_type=ModbusDataType.INT_16, unit=228) def power_limit_controllable(self) -> bool: return True From ac97860801777a807fed8e519e853f7d7a6af636 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Mon, 5 May 2025 13:23:11 +0200 Subject: [PATCH 17/21] Add Debugging for Stop --- packages/modules/devices/victron/victron/bat.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index 598aa87920..a1dbc732cb 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -74,9 +74,20 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: elif power_limit == 0: log.debug("Aktive Batteriesteuerung. Batterie wird auf Stop gesetzt und nicht entladen") if self.last_mode != 'stop': + # Log für Debugging, kann anschließend gelöscht werden + current_ess_mode = self.__tcp_client.read_holding_registers(2902, ModbusDataType.UINT_16, unit=modbus_id) + current_register_39 = self.__tcp_client.read_holding_registers(39, ModbusDataType.UINT_16, unit=228) + log.debug(f"Vor dem Schreiben: Register 2902 = {current_ess_mode}, Register 39 = {current_register_39}") + # ESS Mode 3 für externe Steuerung und keine Entladung self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=modbus_id) self.__tcp_client.write_registers(39, [1], data_type=ModbusDataType.UINT_16, unit=228) + + # Log für Debugging, kann anschließend gelöscht werden + updated_ess_mode = self.__tcp_client.read_holding_registers(2902, ModbusDataType.UINT_16, unit=modbus_id) + updated_register_39 = self.__tcp_client.read_holding_registers(39, ModbusDataType.UINT_16, unit=228) + log.debug(f"Nach dem Schreiben: Register 2902 = {updated_ess_mode}, Register 39 = {updated_register_39}") + self.last_mode = 'stop' elif power_limit > 0: if self.last_mode != 'discharge': From fa99dd8b915850d219f635765a73115b3516914a Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Mon, 5 May 2025 15:37:50 +0200 Subject: [PATCH 18/21] Delete debugging --- packages/modules/devices/victron/victron/bat.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index a1dbc732cb..0baa99bef0 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -53,7 +53,9 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: # Zu Debugzwecken kann später gelöscht werden ess_mode = self.__tcp_client.read_holding_registers(2902, ModbusDataType.UINT_16, unit=modbus_id) dynamic_ess_mode = self.__tcp_client.read_holding_registers(5400, ModbusDataType.UINT_16, unit=modbus_id) + register_39 = self.__tcp_client.read_holding_registers(39, ModbusDataType.UINT_16, unit=228) log.debug(f"Aktueller ESS Mode: {ess_mode}") + log.debug(f"Aktuelles Register 39: {register_39}") log.debug(f"Aktueller Dynamic ESS Mode: {dynamic_ess_mode}") log.debug(f"Aktuelles power_limit: {power_limit}") log.debug(f'last_mode: {self.last_mode}') @@ -74,20 +76,9 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: elif power_limit == 0: log.debug("Aktive Batteriesteuerung. Batterie wird auf Stop gesetzt und nicht entladen") if self.last_mode != 'stop': - # Log für Debugging, kann anschließend gelöscht werden - current_ess_mode = self.__tcp_client.read_holding_registers(2902, ModbusDataType.UINT_16, unit=modbus_id) - current_register_39 = self.__tcp_client.read_holding_registers(39, ModbusDataType.UINT_16, unit=228) - log.debug(f"Vor dem Schreiben: Register 2902 = {current_ess_mode}, Register 39 = {current_register_39}") - # ESS Mode 3 für externe Steuerung und keine Entladung self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=modbus_id) self.__tcp_client.write_registers(39, [1], data_type=ModbusDataType.UINT_16, unit=228) - - # Log für Debugging, kann anschließend gelöscht werden - updated_ess_mode = self.__tcp_client.read_holding_registers(2902, ModbusDataType.UINT_16, unit=modbus_id) - updated_register_39 = self.__tcp_client.read_holding_registers(39, ModbusDataType.UINT_16, unit=228) - log.debug(f"Nach dem Schreiben: Register 2902 = {updated_ess_mode}, Register 39 = {updated_register_39}") - self.last_mode = 'stop' elif power_limit > 0: if self.last_mode != 'discharge': From dcff8ac038d1d34e60ef62d11b47ac686ed729a9 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Fri, 23 May 2025 07:21:50 +0200 Subject: [PATCH 19/21] Remove debugging messages from Testing --- packages/modules/devices/victron/victron/bat.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index 0baa99bef0..38d6a7a086 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -50,17 +50,7 @@ def update(self) -> None: def set_power_limit(self, power_limit: Optional[int]) -> None: modbus_id = self.component_config.configuration.modbus_id - # Zu Debugzwecken kann später gelöscht werden - ess_mode = self.__tcp_client.read_holding_registers(2902, ModbusDataType.UINT_16, unit=modbus_id) - dynamic_ess_mode = self.__tcp_client.read_holding_registers(5400, ModbusDataType.UINT_16, unit=modbus_id) - register_39 = self.__tcp_client.read_holding_registers(39, ModbusDataType.UINT_16, unit=228) - log.debug(f"Aktueller ESS Mode: {ess_mode}") - log.debug(f"Aktuelles Register 39: {register_39}") - log.debug(f"Aktueller Dynamic ESS Mode: {dynamic_ess_mode}") - log.debug(f"Aktuelles power_limit: {power_limit}") - log.debug(f'last_mode: {self.last_mode}') - - # Check Dynamic ESS Mode + # Wenn Victron Dynamic ESS aktiv, erfolgt keine weitere Regelung in openWB dynamic_ess_mode = self.__tcp_client.read_holding_registers(5400, ModbusDataType.UINT_16, unit=modbus_id) if dynamic_ess_mode == 1: log.debug("Dynamic ESS Mode ist aktiv, daher erfolgt keine Regelung des Speichers durch openWB") @@ -86,7 +76,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=modbus_id) self.__tcp_client.write_registers(39, [0], data_type=ModbusDataType.UINT_16, unit=228) self.last_mode = 'discharge' - # Die maximale Entladeleistung begrenzen auf 5000W, für Test + # Die maximale Entladeleistung begrenzen auf 5000W power_value = int(min(power_limit, 5000)) * -1 log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W entladen") self.__tcp_client.write_registers(37, [power_value & 0xFFFF], data_type=ModbusDataType.INT_16, unit=228) From 2ce49f413f4adcca2b2d1631348f45e02aadc813 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Fri, 23 May 2025 07:27:50 +0200 Subject: [PATCH 20/21] fix Flake8 --- packages/modules/devices/victron/victron/bat.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index 38d6a7a086..51065f58cb 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -19,6 +19,7 @@ class KwargsDict(TypedDict): client: modbus.ModbusTcpClient_ + class VictronBat(AbstractBat): def __init__(self, component_config: VictronBatSetup, **kwargs: Any) -> None: self.component_config = component_config From d25a23451858f6fc286c44279d7724ba1262f577 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Fri, 23 May 2025 07:31:26 +0200 Subject: [PATCH 21/21] Fixed Flake8 --- packages/modules/devices/victron/victron/bat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/devices/victron/victron/bat.py b/packages/modules/devices/victron/victron/bat.py index 51065f58cb..370da54547 100644 --- a/packages/modules/devices/victron/victron/bat.py +++ b/packages/modules/devices/victron/victron/bat.py @@ -14,12 +14,12 @@ log = logging.getLogger(__name__) + class KwargsDict(TypedDict): device_id: int client: modbus.ModbusTcpClient_ - class VictronBat(AbstractBat): def __init__(self, component_config: VictronBatSetup, **kwargs: Any) -> None: self.component_config = component_config