From 62333121100c83876ac3ae666f0e372fadc13414 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 19 Aug 2026 22:06:19 +0200 Subject: [PATCH 01/29] Change word order to Big Endian in counter.py --- packages/modules/devices/anker/smartmeter_gen2/counter.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/modules/devices/anker/smartmeter_gen2/counter.py b/packages/modules/devices/anker/smartmeter_gen2/counter.py index 44c098ecb3..a678a34bbc 100644 --- a/packages/modules/devices/anker/smartmeter_gen2/counter.py +++ b/packages/modules/devices/anker/smartmeter_gen2/counter.py @@ -34,13 +34,13 @@ def update(self): unit = self.device_config.configuration.modbus_id power = self.client.read_input_registers(10644, ModbusDataType.INT_32, - wordorder=Endian.Little, unit=unit) * -1 + wordorder=Endian.Big, unit=unit) * -1 powers = self.client.read_input_registers(10638, [ModbusDataType.INT_32] * 3, - wordorder=Endian.Little, unit=unit) + wordorder=Endian.Big, unit=unit) voltages = self.client.read_input_registers(10632, [ModbusDataType.UINT_16] * 3, - wordorder=Endian.Little, unit=unit) + wordorder=Endian.Big, unit=unit) currents = self.client.read_input_registers(10666, [ModbusDataType.INT_16] * 3, - wordorder=Endian.Little, unit=unit) + wordorder=Endian.Big, unit=unit) voltages = [value / 10 for value in voltages] currents = [value / -100 for value in currents] From 4363b814122b19c535df9962ebae1ecf0e667ea8 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 19 Aug 2026 22:06:51 +0200 Subject: [PATCH 02/29] Refactor power calculations in inverter.py Removed POWER_GAIN constant and adjusted power calculations accordingly. --- .../modules/devices/anker/solarbank_4_e5000/inverter.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/modules/devices/anker/solarbank_4_e5000/inverter.py b/packages/modules/devices/anker/solarbank_4_e5000/inverter.py index 8e76e1a314..c813544975 100644 --- a/packages/modules/devices/anker/solarbank_4_e5000/inverter.py +++ b/packages/modules/devices/anker/solarbank_4_e5000/inverter.py @@ -12,9 +12,6 @@ from modules.common.utils.peak_filter import PeakFilter from modules.common.component_type import ComponentType -# Rohwert der Leistungsregister / POWER_GAIN = Watt (Gerät liefert mW statt W) -POWER_GAIN = 1000 - class KwargsDict(TypedDict): device_config: Anker @@ -40,9 +37,9 @@ def update(self) -> None: # Register 10002 ist die PV_power also die DC Leistung # Register 10010 ist "Load_power" unklar ob dies wirklich die AC Leistung des Inverters ist power = self.client.read_input_registers(10010, ModbusDataType.INT_32, - wordorder=Endian.Little, unit=unit) * -1 / POWER_GAIN + wordorder=Endian.Big, unit=unit) * -1 dc_power = self.client.read_input_registers(10002, ModbusDataType.INT_32, - wordorder=Endian.Little, unit=unit) * -1 / POWER_GAIN + wordorder=Endian.Big, unit=unit) * -1 self.peak_filter.check_values(power) imported, exported = self.sim_counter.sim_count(power) From 497c490196670975fc699ad6fec081f6ae40f12c Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 19 Aug 2026 22:07:51 +0200 Subject: [PATCH 03/29] Refactor power calculations and remove POWER_GAIN --- .../modules/devices/anker/solarbank_4_e5000/bat.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/packages/modules/devices/anker/solarbank_4_e5000/bat.py b/packages/modules/devices/anker/solarbank_4_e5000/bat.py index 28145c291a..de2142931c 100644 --- a/packages/modules/devices/anker/solarbank_4_e5000/bat.py +++ b/packages/modules/devices/anker/solarbank_4_e5000/bat.py @@ -15,9 +15,6 @@ log = logging.getLogger(__name__) -# Rohwert der Leistungsregister / POWER_GAIN = Watt (Gerät liefert mW statt W) -POWER_GAIN = 1000 - class KwargsDict(TypedDict): device_config: Anker @@ -42,7 +39,7 @@ def update(self) -> None: unit = self.device_config.configuration.modbus_id power = self.client.read_input_registers(10008, ModbusDataType.INT_32, - wordorder=Endian.Little, unit=unit) * -1 / POWER_GAIN + wordorder=Endian.Big, unit=unit) * -1 soc = self.client.read_input_registers(10014, ModbusDataType.UINT_16, unit=unit) self.peak_filter.check_values(power) @@ -70,11 +67,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: # Berechne power value: 0 = stop, != 0 = multipliziere mit -1 # Laut Doku ist der min Wert 100W, ggf. noch Anpassung für power_limit=0 notwendig - # ACHTUNG: POWER_GAIN hier nur nach Symmetrie-Annahme angewendet (Leseregister sind - # nachweislich in mW). Vor Praxiseinsatz unbedingt mit einem kleinen, unkritischen - # Grenzwert verifizieren, dass das Schreibregister ebenfalls mW statt W erwartet - - # sonst wird ggf. eine 1000x falsche Leistung angefordert. - power_value = 0 if power_limit == 0 else int(power_limit) * -1 * POWER_GAIN + power_value = 0 if power_limit == 0 else int(power_limit) * -1 self.client.write_register(10071, power_value, data_type=ModbusDataType.INT_32, unit=unit) log.debug("Aktive Batteriesteuerung angefordert, angeforderte Leistung: {power_value} W") From bfb72bb6171fd0b7df529f44d1884f237df4bff7 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 19 Aug 2026 22:08:21 +0200 Subject: [PATCH 04/29] Change word order to Big Endian in counter.py --- .../modules/devices/anker/solarbank_max_ac/counter.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/modules/devices/anker/solarbank_max_ac/counter.py b/packages/modules/devices/anker/solarbank_max_ac/counter.py index 5e54deb3a0..fa7689b304 100644 --- a/packages/modules/devices/anker/solarbank_max_ac/counter.py +++ b/packages/modules/devices/anker/solarbank_max_ac/counter.py @@ -35,13 +35,13 @@ def update(self): unit = self.device_config.configuration.modbus_id power = self.client.read_input_registers(10644, ModbusDataType.INT_32, - wordorder=Endian.Little, unit=unit) * -1 + wordorder=Endian.Big, unit=unit) * -1 powers = self.client.read_input_registers(10638, [ModbusDataType.INT_32] * 3, - wordorder=Endian.Little, unit=unit) + wordorder=Endian.Big, unit=unit) voltages = self.client.read_input_registers(10632, [ModbusDataType.UINT_16] * 3, - wordorder=Endian.Little, unit=unit) + wordorder=Endian.Big, unit=unit) currents = self.client.read_input_registers(10666, [ModbusDataType.INT_16] * 3, - wordorder=Endian.Little, unit=unit) + wordorder=Endian.Big, unit=unit) voltages = [value / 10 for value in voltages] currents = [value / -100 for value in currents] From 18d2d8a4661af850c3e1e1b18cc81d91e4de47f1 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 19 Aug 2026 22:08:37 +0200 Subject: [PATCH 05/29] Change word order to Big Endian for power readings --- packages/modules/devices/anker/solarbank_max_ac/inverter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/anker/solarbank_max_ac/inverter.py b/packages/modules/devices/anker/solarbank_max_ac/inverter.py index b4d152bdc5..e58f1746ec 100644 --- a/packages/modules/devices/anker/solarbank_max_ac/inverter.py +++ b/packages/modules/devices/anker/solarbank_max_ac/inverter.py @@ -37,9 +37,9 @@ def update(self) -> None: # Register 10002 ist die PV_power also die DC Leistung # Register 10010 ist "Load_power" unklar ob dies wirklich die AC Leistung des Inverters ist power = self.client.read_input_registers(10010, ModbusDataType.INT_32, - wordorder=Endian.Little, unit=unit) * -1 + wordorder=Endian.Big, unit=unit) * -1 dc_power = self.client.read_input_registers(10002, ModbusDataType.INT_32, - wordorder=Endian.Little, unit=unit) * -1 + wordorder=Endian.Big, unit=unit) * -1 self.peak_filter.check_values(power) imported, exported = self.sim_counter.sim_count(power) From b73887555a6adc12ce4874f921308ea9be69029c Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 19 Aug 2026 22:08:52 +0200 Subject: [PATCH 06/29] Change word order in power reading to Big Endian --- packages/modules/devices/anker/solarbank_max_ac/bat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/devices/anker/solarbank_max_ac/bat.py b/packages/modules/devices/anker/solarbank_max_ac/bat.py index 1c53d95c9c..0b172dd374 100644 --- a/packages/modules/devices/anker/solarbank_max_ac/bat.py +++ b/packages/modules/devices/anker/solarbank_max_ac/bat.py @@ -39,7 +39,7 @@ def update(self) -> None: unit = self.device_config.configuration.modbus_id power = self.client.read_input_registers(10008, ModbusDataType.INT_32, - wordorder=Endian.Little, unit=unit) * -1 + wordorder=Endian.Big, unit=unit) * -1 soc = self.client.read_input_registers(10014, ModbusDataType.UINT_16, unit=unit) self.peak_filter.check_values(power) From 237577755d1b46f637a9a0484d2dba39b5104f6f Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 10:37:42 +0200 Subject: [PATCH 07/29] Fix register address for currents in update method Corrected register addresses for reading currents. --- packages/modules/devices/anker/smartmeter_gen2/counter.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/anker/smartmeter_gen2/counter.py b/packages/modules/devices/anker/smartmeter_gen2/counter.py index a678a34bbc..563a1d888e 100644 --- a/packages/modules/devices/anker/smartmeter_gen2/counter.py +++ b/packages/modules/devices/anker/smartmeter_gen2/counter.py @@ -34,15 +34,16 @@ def update(self): unit = self.device_config.configuration.modbus_id power = self.client.read_input_registers(10644, ModbusDataType.INT_32, - wordorder=Endian.Big, unit=unit) * -1 + wordorder=Endian.Big, unit=unit) powers = self.client.read_input_registers(10638, [ModbusDataType.INT_32] * 3, wordorder=Endian.Big, unit=unit) voltages = self.client.read_input_registers(10632, [ModbusDataType.UINT_16] * 3, wordorder=Endian.Big, unit=unit) - currents = self.client.read_input_registers(10666, [ModbusDataType.INT_16] * 3, + currents = self.client.read_input_registers(10635, [ModbusDataType.INT_16] * 3, wordorder=Endian.Big, unit=unit) voltages = [value / 10 for value in voltages] + # Vorzeichen (-100 vs 100) noch nicht live verifiziert currents = [value / -100 for value in currents] self.peak_filter.check_values(power) From dd04dc9c59c7ccec66fe6e184ec40f6768383a47 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 10:50:45 +0200 Subject: [PATCH 08/29] Add newline at end of counter.py Fix formatting issue by adding a newline at the end of the file. From d3bfc4dc1ea70d43c2c0b9642d4a32a5323b2549 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 10:52:03 +0200 Subject: [PATCH 09/29] Refactor power value calculation and logging --- packages/modules/devices/anker/solarbank_4_e5000/bat.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/modules/devices/anker/solarbank_4_e5000/bat.py b/packages/modules/devices/anker/solarbank_4_e5000/bat.py index de2142931c..a063b2fd49 100644 --- a/packages/modules/devices/anker/solarbank_4_e5000/bat.py +++ b/packages/modules/devices/anker/solarbank_4_e5000/bat.py @@ -65,8 +65,6 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: self.client.write_register(10064, 3, data_type=ModbusDataType.UINT_16, unit=unit) self.last_mode = 'limited' - # Berechne power value: 0 = stop, != 0 = multipliziere mit -1 - # Laut Doku ist der min Wert 100W, ggf. noch Anpassung für power_limit=0 notwendig power_value = 0 if power_limit == 0 else int(power_limit) * -1 self.client.write_register(10071, power_value, data_type=ModbusDataType.INT_32, unit=unit) log.debug("Aktive Batteriesteuerung angefordert, angeforderte Leistung: {power_value} W") From d664ed6984e4559603cfa9dd33ba2a31099f01f0 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 10:52:52 +0200 Subject: [PATCH 10/29] Refactor power limit handling in bat.py Removed commented code regarding power value calculation and adjusted the power limit logic. --- packages/modules/devices/anker/solarbank_max_ac/bat.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/modules/devices/anker/solarbank_max_ac/bat.py b/packages/modules/devices/anker/solarbank_max_ac/bat.py index 0b172dd374..b7d49b465c 100644 --- a/packages/modules/devices/anker/solarbank_max_ac/bat.py +++ b/packages/modules/devices/anker/solarbank_max_ac/bat.py @@ -65,9 +65,6 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: self.client.write_register(10064, 3, data_type=ModbusDataType.UINT_16, unit=unit) self.last_mode = 'limited' - # Berechne power value: 0 = stop, != 0 = multipliziere mit -1 - # Laut Doku ist der min Wert 100W, ggf. noch Anpassung für power_limit=0 notwendig - power_value = 0 if power_limit == 0 else int(power_limit) * -1 self.client.write_register(10071, power_value, data_type=ModbusDataType.INT_32, unit=unit) log.debug("Aktive Batteriesteuerung angefordert, angeforderte Leistung: {power_value} W") From 9edbe3f077648652836a8b16530ddbb0cb3b66d3 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 10:53:05 +0200 Subject: [PATCH 11/29] Delete packages/modules/devices/anker/solarbank_max_ac/counter.py --- .../devices/anker/solarbank_max_ac/counter.py | 62 ------------------- 1 file changed, 62 deletions(-) delete mode 100644 packages/modules/devices/anker/solarbank_max_ac/counter.py diff --git a/packages/modules/devices/anker/solarbank_max_ac/counter.py b/packages/modules/devices/anker/solarbank_max_ac/counter.py deleted file mode 100644 index fa7689b304..0000000000 --- a/packages/modules/devices/anker/solarbank_max_ac/counter.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python3 -from typing import Any, TypedDict - -from modules.common.abstract_device import AbstractCounter -from modules.common.component_state import CounterState -from modules.common.component_type import ComponentDescriptor -from modules.common.fault_state import ComponentInfo, FaultState -from modules.common.modbus import ModbusDataType, Endian, ModbusTcpClient_ -from modules.common.simcount import SimCounter -from modules.common.store import get_component_value_store -from modules.devices.anker.solarbank_max_ac.config import Anker, AnkerCounterSetup -from modules.common.utils.peak_filter import PeakFilter -from modules.common.component_type import ComponentType - - -class KwargsDict(TypedDict): - device_config: Anker - client: ModbusTcpClient_ - - -class AnkerCounter(AbstractCounter): - def __init__(self, component_config: AnkerCounterSetup, **kwargs: Any) -> None: - self.component_config = component_config - self.kwargs: KwargsDict = kwargs - - def initialize(self) -> None: - self.device_config: Anker = self.kwargs['device_config'] - self.client: ModbusTcpClient_ = self.kwargs['client'] - self.sim_counter = SimCounter(self.device_config.id, self.component_config.id, self.component_config.type) - self.store = get_component_value_store(self.component_config.type, self.component_config.id) - self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) - self.peak_filter = PeakFilter(ComponentType.COUNTER, self.component_config.id, self.fault_state) - - def update(self): - unit = self.device_config.configuration.modbus_id - - power = self.client.read_input_registers(10644, ModbusDataType.INT_32, - wordorder=Endian.Big, unit=unit) * -1 - powers = self.client.read_input_registers(10638, [ModbusDataType.INT_32] * 3, - wordorder=Endian.Big, unit=unit) - voltages = self.client.read_input_registers(10632, [ModbusDataType.UINT_16] * 3, - wordorder=Endian.Big, unit=unit) - currents = self.client.read_input_registers(10666, [ModbusDataType.INT_16] * 3, - wordorder=Endian.Big, unit=unit) - - voltages = [value / 10 for value in voltages] - currents = [value / -100 for value in currents] - - self.peak_filter.check_values(power) - imported, exported = self.sim_counter.sim_count(power) - counter_state = CounterState( - imported=imported, - exported=exported, - power=power, - powers=powers, - voltages=voltages, - currents=currents - ) - self.store.set(counter_state) - - -component_descriptor = ComponentDescriptor(configuration_factory=AnkerCounterSetup) From a282a9cdbe5ee915ce8f4df97b9aa27747a42dc0 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 10:53:22 +0200 Subject: [PATCH 12/29] Remove AnkerCounterConfiguration and Setup classes Removed AnkerCounterConfiguration and AnkerCounterSetup classes. --- .../devices/anker/solarbank_max_ac/config.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/packages/modules/devices/anker/solarbank_max_ac/config.py b/packages/modules/devices/anker/solarbank_max_ac/config.py index 4e8a704d25..3d27599172 100644 --- a/packages/modules/devices/anker/solarbank_max_ac/config.py +++ b/packages/modules/devices/anker/solarbank_max_ac/config.py @@ -41,20 +41,6 @@ def __init__(self, super().__init__(name, type, id, configuration or AnkerBatConfiguration()) -class AnkerCounterConfiguration: - def __init__(self): - pass - - -class AnkerCounterSetup(ComponentSetup[AnkerCounterConfiguration]): - def __init__(self, - name: str = "Anker Zähler", - type: str = "counter", - id: int = 0, - configuration: AnkerCounterConfiguration = None) -> None: - super().__init__(name, type, id, configuration or AnkerCounterConfiguration()) - - class AnkerInverterConfiguration: def __init__(self): pass From dec7653a73fcdeb926ccaecb23566f292a3dbf5e Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 10:53:40 +0200 Subject: [PATCH 13/29] Remove counter component from device.py --- .../modules/devices/anker/solarbank_max_ac/device.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/modules/devices/anker/solarbank_max_ac/device.py b/packages/modules/devices/anker/solarbank_max_ac/device.py index 4cd00f9ca7..d0e3fed57d 100644 --- a/packages/modules/devices/anker/solarbank_max_ac/device.py +++ b/packages/modules/devices/anker/solarbank_max_ac/device.py @@ -7,8 +7,7 @@ from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, MultiComponentUpdater from modules.common.modbus import ModbusTcpClient_ from modules.devices.anker.solarbank_max_ac.bat import AnkerBat -from modules.devices.anker.solarbank_max_ac.config import Anker, AnkerBatSetup, AnkerCounterSetup, AnkerInverterSetup -from modules.devices.anker.solarbank_max_ac.counter import AnkerCounter +from modules.devices.anker.solarbank_max_ac.config import Anker, AnkerBatSetup, AnkerInverterSetup from modules.devices.anker.solarbank_max_ac.inverter import AnkerInverter log = logging.getLogger(__name__) @@ -20,13 +19,10 @@ def create_device(device_config: Anker): def create_bat_component(component_config: AnkerBatSetup): return AnkerBat(component_config, device_config=device_config, client=client) - def create_counter_component(component_config: AnkerCounterSetup): - return AnkerCounter(component_config, device_config=device_config, client=client) - def create_inverter_component(component_config: AnkerInverterSetup): return AnkerInverter(component_config, device_config=device_config, client=client) - def update_components(components: Iterable[Union[AnkerBat, AnkerCounter, AnkerInverter]]): + def update_components(components: Iterable[Union[AnkerBat, AnkerInverter]]): with client: for component in components: with SingleComponentUpdateContext(component.fault_state): @@ -41,7 +37,6 @@ def initializer(): initializer=initializer, component_factory=ComponentFactoryByType( bat=create_bat_component, - counter=create_counter_component, inverter=create_inverter_component, ), component_updater=MultiComponentUpdater(update_components) From 7188192fd1d45b580979e8d541df9c22b13aa3c3 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 10:58:24 +0200 Subject: [PATCH 14/29] Refactor power calculation and add logging Updated power calculation to use dc_power from register 10002 instead of Load_power from register 10010. Added logging for ac_grid_output_power from register 10208 for debugging purposes. --- .../anker/solarbank_4_e5000/inverter.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/modules/devices/anker/solarbank_4_e5000/inverter.py b/packages/modules/devices/anker/solarbank_4_e5000/inverter.py index c813544975..52e97f3eb8 100644 --- a/packages/modules/devices/anker/solarbank_4_e5000/inverter.py +++ b/packages/modules/devices/anker/solarbank_4_e5000/inverter.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import logging from typing import TypedDict, Any from modules.common.abstract_device import AbstractInverter @@ -12,6 +13,8 @@ from modules.common.utils.peak_filter import PeakFilter from modules.common.component_type import ComponentType +log = logging.getLogger(__name__) + class KwargsDict(TypedDict): device_config: Anker @@ -34,12 +37,19 @@ def initialize(self) -> None: def update(self) -> None: unit = self.device_config.configuration.modbus_id - # Register 10002 ist die PV_power also die DC Leistung - # Register 10010 ist "Load_power" unklar ob dies wirklich die AC Leistung des Inverters ist - power = self.client.read_input_registers(10010, ModbusDataType.INT_32, - wordorder=Endian.Big, unit=unit) * -1 + # power kommt aus dc_power (10002, PV), nicht aus Load_power (10010, = Hausverbrauch). + # Unsicher: 10208 (ac_grid_output_power) koennte die eigentlich richtige AC-Leistung + # sein, noch nicht getestet. dc_power = self.client.read_input_registers(10002, ModbusDataType.INT_32, wordorder=Endian.Big, unit=unit) * -1 + power = dc_power + + # DEBUG only: Register 10208 (ac_grid_output_power laut HA-Integration) zum + # Vergleich mitloggen, ob das die bessere Quelle fuer power waere. Wird noch + # nirgends verwendet/gespeichert. + ac_grid_output_power = self.client.read_input_registers(10208, ModbusDataType.INT_32, + wordorder=Endian.Big, unit=unit) + log.debug("DEBUG ac_grid_output_power (10208) roh: %s", ac_grid_output_power) self.peak_filter.check_values(power) imported, exported = self.sim_counter.sim_count(power) From feffa7e502be80ba4a0cb18000d1488a984d7734 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 12:14:30 +0200 Subject: [PATCH 15/29] Add logging for current and power debugging Added logging to debug current and power values before processing. --- .../modules/devices/anker/smartmeter_gen2/counter.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/anker/smartmeter_gen2/counter.py b/packages/modules/devices/anker/smartmeter_gen2/counter.py index 563a1d888e..33c8cd465f 100644 --- a/packages/modules/devices/anker/smartmeter_gen2/counter.py +++ b/packages/modules/devices/anker/smartmeter_gen2/counter.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import logging from typing import Any, TypedDict from modules.common.abstract_device import AbstractCounter @@ -11,6 +12,8 @@ from modules.common.utils.peak_filter import PeakFilter from modules.devices.anker.smartmeter_gen2.config import AnkerMeter, AnkerMeterCounterSetup +log = logging.getLogger(__name__) + class KwargsDict(TypedDict): device_config: AnkerMeter @@ -42,9 +45,13 @@ def update(self): currents = self.client.read_input_registers(10635, [ModbusDataType.INT_16] * 3, wordorder=Endian.Big, unit=unit) + # DEBUG only: Rohwerte vor Skalierung/Vorzeichen-Anpassung mitloggen, um zu + # sehen ob das Strom-Register selbst schon ein Vorzeichen traegt oder nicht. + log.debug("DEBUG currents roh (vor /100, vor Vorzeichen-Uebernahme von powers): %s", currents) + log.debug("DEBUG powers roh (zum Vergleich): %s", powers) + voltages = [value / 10 for value in voltages] - # Vorzeichen (-100 vs 100) noch nicht live verifiziert - currents = [value / -100 for value in currents] + currents = [abs(c) / 100 * (1 if p >= 0 else -1) for c, p in zip(currents, powers)] self.peak_filter.check_values(power) imported, exported = self.sim_counter.sim_count(power) From 92edb2b0d59a40e100c5cc5aea6bafdddf6c428b Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 13:58:20 +0200 Subject: [PATCH 16/29] Delete packages/modules/devices/anker/solarbank_max_ac/__init__.py --- packages/modules/devices/anker/solarbank_max_ac/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 packages/modules/devices/anker/solarbank_max_ac/__init__.py diff --git a/packages/modules/devices/anker/solarbank_max_ac/__init__.py b/packages/modules/devices/anker/solarbank_max_ac/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 From 23d42e08ba3619d5cab8046a8d1dfa52e3ca1627 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 13:58:31 +0200 Subject: [PATCH 17/29] Delete packages/modules/devices/anker/solarbank_max_ac/bat.py --- .../devices/anker/solarbank_max_ac/bat.py | 76 ------------------- 1 file changed, 76 deletions(-) delete mode 100644 packages/modules/devices/anker/solarbank_max_ac/bat.py diff --git a/packages/modules/devices/anker/solarbank_max_ac/bat.py b/packages/modules/devices/anker/solarbank_max_ac/bat.py deleted file mode 100644 index b7d49b465c..0000000000 --- a/packages/modules/devices/anker/solarbank_max_ac/bat.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 -import logging -from typing import Any, Optional, TypedDict - -from modules.common.abstract_device import AbstractBat -from modules.common.component_state import BatState -from modules.common.component_type import ComponentDescriptor -from modules.common.fault_state import ComponentInfo, FaultState -from modules.common.modbus import ModbusDataType, Endian, ModbusTcpClient_ -from modules.common.simcount import SimCounter -from modules.common.store import get_component_value_store -from modules.devices.anker.solarbank_max_ac.config import Anker, AnkerBatSetup -from modules.common.utils.peak_filter import PeakFilter -from modules.common.component_type import ComponentType - -log = logging.getLogger(__name__) - - -class KwargsDict(TypedDict): - device_config: Anker - client: ModbusTcpClient_ - - -class AnkerBat(AbstractBat): - def __init__(self, component_config: AnkerBatSetup, **kwargs: Any) -> None: - self.component_config = component_config - self.kwargs: KwargsDict = kwargs - - def initialize(self) -> None: - self.device_config: Anker = self.kwargs['device_config'] - self.client: ModbusTcpClient_ = self.kwargs['client'] - self.sim_counter = SimCounter(self.device_config.id, self.component_config.id, self.component_config.type) - self.store = get_component_value_store(self.component_config.type, self.component_config.id) - self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) - self.peak_filter = PeakFilter(ComponentType.BAT, self.component_config.id, self.fault_state) - self.last_mode = 'Undefined' - - def update(self) -> None: - unit = self.device_config.configuration.modbus_id - - power = self.client.read_input_registers(10008, ModbusDataType.INT_32, - wordorder=Endian.Big, unit=unit) * -1 - soc = self.client.read_input_registers(10014, ModbusDataType.UINT_16, unit=unit) - - self.peak_filter.check_values(power) - imported, exported = self.sim_counter.sim_count(power) - bat_state = BatState( - power=power, - soc=soc, - imported=imported, - exported=exported - ) - self.store.set(bat_state) - - def set_power_limit(self, power_limit: Optional[int]) -> None: - unit = self.device_config.configuration.modbus_id - - if power_limit is None: - log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter") - if self.last_mode is not None: - self.client.write_register(10064, 0, data_type=ModbusDataType.UINT_16, unit=unit) - self.last_mode = None - else: - if self.last_mode != 'limited': - self.client.write_register(10064, 3, data_type=ModbusDataType.UINT_16, unit=unit) - self.last_mode = 'limited' - - power_value = 0 if power_limit == 0 else int(power_limit) * -1 - self.client.write_register(10071, power_value, data_type=ModbusDataType.INT_32, unit=unit) - log.debug("Aktive Batteriesteuerung angefordert, angeforderte Leistung: {power_value} W") - - def power_limit_controllable(self) -> bool: - return True - - -component_descriptor = ComponentDescriptor(configuration_factory=AnkerBatSetup) From 9b5fb85d029f61e4617f9c21ef8a6b792c531165 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 13:58:41 +0200 Subject: [PATCH 18/29] Delete packages/modules/devices/anker/solarbank_max_ac/config.py --- .../devices/anker/solarbank_max_ac/config.py | 55 ------------------- 1 file changed, 55 deletions(-) delete mode 100644 packages/modules/devices/anker/solarbank_max_ac/config.py diff --git a/packages/modules/devices/anker/solarbank_max_ac/config.py b/packages/modules/devices/anker/solarbank_max_ac/config.py deleted file mode 100644 index 3d27599172..0000000000 --- a/packages/modules/devices/anker/solarbank_max_ac/config.py +++ /dev/null @@ -1,55 +0,0 @@ -from typing import Optional - -from modules.common.component_setup import ComponentSetup -from ..vendor import vendor_descriptor - - -class AnkerConfiguration: - def __init__(self, - ip_address: Optional[str] = None, - port: int = 502, - modbus_id: int = 1): - self.ip_address = ip_address - self.port = port - self.modbus_id = modbus_id - - -class Anker: - def __init__(self, - name: str = "Anker SOLIX Solarbank Max AC", - type: str = "solarbank_max_ac", - id: int = 0, - configuration: AnkerConfiguration = None) -> None: - self.name = name - self.type = type - self.vendor = vendor_descriptor.configuration_factory().type - self.id = id - self.configuration = configuration or AnkerConfiguration() - - -class AnkerBatConfiguration: - def __init__(self): - pass - - -class AnkerBatSetup(ComponentSetup[AnkerBatConfiguration]): - def __init__(self, - name: str = "Anker Speicher", - type: str = "bat", - id: int = 0, - configuration: AnkerBatConfiguration = None) -> None: - super().__init__(name, type, id, configuration or AnkerBatConfiguration()) - - -class AnkerInverterConfiguration: - def __init__(self): - pass - - -class AnkerInverterSetup(ComponentSetup[AnkerInverterConfiguration]): - def __init__(self, - name: str = "Anker Wechselrichter", - type: str = "inverter", - id: int = 0, - configuration: AnkerInverterConfiguration = None) -> None: - super().__init__(name, type, id, configuration or AnkerInverterConfiguration()) From 7f3e09b26b4a8261ba1d46090e8bd48c53f13299 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 13:58:49 +0200 Subject: [PATCH 19/29] Delete packages/modules/devices/anker/solarbank_max_ac/device.py --- .../devices/anker/solarbank_max_ac/device.py | 46 ------------------- 1 file changed, 46 deletions(-) delete mode 100644 packages/modules/devices/anker/solarbank_max_ac/device.py diff --git a/packages/modules/devices/anker/solarbank_max_ac/device.py b/packages/modules/devices/anker/solarbank_max_ac/device.py deleted file mode 100644 index d0e3fed57d..0000000000 --- a/packages/modules/devices/anker/solarbank_max_ac/device.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python3 -import logging -from typing import Iterable, Union - -from modules.common.abstract_device import DeviceDescriptor -from modules.common.component_context import SingleComponentUpdateContext -from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, MultiComponentUpdater -from modules.common.modbus import ModbusTcpClient_ -from modules.devices.anker.solarbank_max_ac.bat import AnkerBat -from modules.devices.anker.solarbank_max_ac.config import Anker, AnkerBatSetup, AnkerInverterSetup -from modules.devices.anker.solarbank_max_ac.inverter import AnkerInverter - -log = logging.getLogger(__name__) - - -def create_device(device_config: Anker): - client = None - - def create_bat_component(component_config: AnkerBatSetup): - return AnkerBat(component_config, device_config=device_config, client=client) - - def create_inverter_component(component_config: AnkerInverterSetup): - return AnkerInverter(component_config, device_config=device_config, client=client) - - def update_components(components: Iterable[Union[AnkerBat, AnkerInverter]]): - with client: - for component in components: - with SingleComponentUpdateContext(component.fault_state): - component.update() - - def initializer(): - nonlocal client - client = ModbusTcpClient_(device_config.configuration.ip_address, device_config.configuration.port) - - return ConfigurableDevice( - device_config=device_config, - initializer=initializer, - component_factory=ComponentFactoryByType( - bat=create_bat_component, - inverter=create_inverter_component, - ), - component_updater=MultiComponentUpdater(update_components) - ) - - -device_descriptor = DeviceDescriptor(configuration_factory=Anker) From e696f32d1e5eddfd95a00a948b3c7a9e5b6a3a07 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 13:58:57 +0200 Subject: [PATCH 20/29] Delete packages/modules/devices/anker/solarbank_max_ac/inverter.py --- .../anker/solarbank_max_ac/inverter.py | 55 ------------------- 1 file changed, 55 deletions(-) delete mode 100644 packages/modules/devices/anker/solarbank_max_ac/inverter.py diff --git a/packages/modules/devices/anker/solarbank_max_ac/inverter.py b/packages/modules/devices/anker/solarbank_max_ac/inverter.py deleted file mode 100644 index e58f1746ec..0000000000 --- a/packages/modules/devices/anker/solarbank_max_ac/inverter.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python3 -from typing import TypedDict, Any - -from modules.common.abstract_device import AbstractInverter -from modules.common.component_state import InverterState -from modules.common.component_type import ComponentDescriptor -from modules.common.fault_state import ComponentInfo, FaultState -from modules.common.modbus import ModbusDataType, Endian, ModbusTcpClient_ -from modules.common.simcount import SimCounter -from modules.common.store import get_component_value_store -from modules.devices.anker.solarbank_max_ac.config import Anker, AnkerInverterSetup -from modules.common.utils.peak_filter import PeakFilter -from modules.common.component_type import ComponentType - - -class KwargsDict(TypedDict): - device_config: Anker - client: ModbusTcpClient_ - - -class AnkerInverter(AbstractInverter): - def __init__(self, component_config: AnkerInverterSetup, **kwargs: Any) -> None: - self.component_config = component_config - self.kwargs: KwargsDict = kwargs - - def initialize(self) -> None: - self.device_config: Anker = self.kwargs['device_config'] - self.client: ModbusTcpClient_ = self.kwargs['client'] - self.sim_counter = SimCounter(self.device_config.id, self.component_config.id, self.component_config.type) - self.store = get_component_value_store(self.component_config.type, self.component_config.id) - self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) - self.peak_filter = PeakFilter(ComponentType.INVERTER, self.component_config.id, self.fault_state) - - def update(self) -> None: - unit = self.device_config.configuration.modbus_id - - # Register 10002 ist die PV_power also die DC Leistung - # Register 10010 ist "Load_power" unklar ob dies wirklich die AC Leistung des Inverters ist - power = self.client.read_input_registers(10010, ModbusDataType.INT_32, - wordorder=Endian.Big, unit=unit) * -1 - dc_power = self.client.read_input_registers(10002, ModbusDataType.INT_32, - wordorder=Endian.Big, unit=unit) * -1 - - self.peak_filter.check_values(power) - imported, exported = self.sim_counter.sim_count(power) - inverter_state = InverterState( - power=power, - dc_power=dc_power, - imported=imported, - exported=exported - ) - self.store.set(inverter_state) - - -component_descriptor = ComponentDescriptor(configuration_factory=AnkerInverterSetup) From 9d090c0aec24c68f8e318189a35ca3f5d4e873cd Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 14:00:11 +0200 Subject: [PATCH 21/29] Update Anker class name and type attributes --- .../devices/anker/{solarbank_4_e5000 => solarbank}/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename packages/modules/devices/anker/{solarbank_4_e5000 => solarbank}/config.py (93%) diff --git a/packages/modules/devices/anker/solarbank_4_e5000/config.py b/packages/modules/devices/anker/solarbank/config.py similarity index 93% rename from packages/modules/devices/anker/solarbank_4_e5000/config.py rename to packages/modules/devices/anker/solarbank/config.py index 380788057e..bcd9102ed6 100644 --- a/packages/modules/devices/anker/solarbank_4_e5000/config.py +++ b/packages/modules/devices/anker/solarbank/config.py @@ -16,8 +16,8 @@ def __init__(self, class Anker: def __init__(self, - name: str = "Anker SOLIX Solarbank 4 E5000 Pro", - type: str = "solarbank_4_e5000", + name: str = "Anker SOLIX Solarbank", + type: str = "solarbank", id: int = 0, configuration: AnkerConfiguration = None) -> None: self.name = name From 8d12a8d6bcb2cc72f1c81163980c6c3f4a4c7352 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 14:00:42 +0200 Subject: [PATCH 22/29] Refactor import paths for Anker device module --- .../{solarbank_4_e5000/device.py => solarbank/devie.py} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename packages/modules/devices/anker/{solarbank_4_e5000/device.py => solarbank/devie.py} (86%) diff --git a/packages/modules/devices/anker/solarbank_4_e5000/device.py b/packages/modules/devices/anker/solarbank/devie.py similarity index 86% rename from packages/modules/devices/anker/solarbank_4_e5000/device.py rename to packages/modules/devices/anker/solarbank/devie.py index 397f174198..2629539ebb 100644 --- a/packages/modules/devices/anker/solarbank_4_e5000/device.py +++ b/packages/modules/devices/anker/solarbank/devie.py @@ -6,9 +6,9 @@ from modules.common.component_context import SingleComponentUpdateContext from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, MultiComponentUpdater from modules.common.modbus import ModbusTcpClient_ -from modules.devices.anker.solarbank_4_e5000.bat import AnkerBat -from modules.devices.anker.solarbank_4_e5000.config import Anker, AnkerBatSetup, AnkerInverterSetup -from modules.devices.anker.solarbank_4_e5000.inverter import AnkerInverter +from modules.devices.anker.solarbank.bat import AnkerBat +from modules.devices.anker.solarbank.config import Anker, AnkerBatSetup, AnkerInverterSetup +from modules.devices.anker.solarbank.inverter import AnkerInverter log = logging.getLogger(__name__) From 534c063f908be70bc46a5f1151cf30e1b5b09c16 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 14:01:15 +0200 Subject: [PATCH 23/29] Move bat.py to new solarbank directory --- .../devices/anker/{solarbank_4_e5000 => solarbank}/bat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename packages/modules/devices/anker/{solarbank_4_e5000 => solarbank}/bat.py (97%) diff --git a/packages/modules/devices/anker/solarbank_4_e5000/bat.py b/packages/modules/devices/anker/solarbank/bat.py similarity index 97% rename from packages/modules/devices/anker/solarbank_4_e5000/bat.py rename to packages/modules/devices/anker/solarbank/bat.py index a063b2fd49..75d44a6ba3 100644 --- a/packages/modules/devices/anker/solarbank_4_e5000/bat.py +++ b/packages/modules/devices/anker/solarbank/bat.py @@ -9,7 +9,7 @@ from modules.common.modbus import ModbusDataType, Endian, ModbusTcpClient_ from modules.common.simcount import SimCounter from modules.common.store import get_component_value_store -from modules.devices.anker.solarbank_4_e5000.config import Anker, AnkerBatSetup +from modules.devices.anker.solarbank.config import Anker, AnkerBatSetup from modules.common.utils.peak_filter import PeakFilter from modules.common.component_type import ComponentType From c7d9d05beb9dfe22d68c2986a9c71a20fb6f4b3f Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 14:03:13 +0200 Subject: [PATCH 24/29] Move inverter.py to new solarbank directory --- .../inverter.py | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) rename packages/modules/devices/anker/{solarbank_4_e5000 => solarbank}/inverter.py (65%) diff --git a/packages/modules/devices/anker/solarbank_4_e5000/inverter.py b/packages/modules/devices/anker/solarbank/inverter.py similarity index 65% rename from packages/modules/devices/anker/solarbank_4_e5000/inverter.py rename to packages/modules/devices/anker/solarbank/inverter.py index 52e97f3eb8..8933fef575 100644 --- a/packages/modules/devices/anker/solarbank_4_e5000/inverter.py +++ b/packages/modules/devices/anker/solarbank/inverter.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -import logging from typing import TypedDict, Any from modules.common.abstract_device import AbstractInverter @@ -9,12 +8,10 @@ from modules.common.modbus import ModbusDataType, Endian, ModbusTcpClient_ from modules.common.simcount import SimCounter from modules.common.store import get_component_value_store -from modules.devices.anker.solarbank_4_e5000.config import Anker, AnkerInverterSetup +from modules.devices.anker.solarbank.config import Anker, AnkerInverterSetup from modules.common.utils.peak_filter import PeakFilter from modules.common.component_type import ComponentType -log = logging.getLogger(__name__) - class KwargsDict(TypedDict): device_config: Anker @@ -37,19 +34,9 @@ def initialize(self) -> None: def update(self) -> None: unit = self.device_config.configuration.modbus_id - # power kommt aus dc_power (10002, PV), nicht aus Load_power (10010, = Hausverbrauch). - # Unsicher: 10208 (ac_grid_output_power) koennte die eigentlich richtige AC-Leistung - # sein, noch nicht getestet. - dc_power = self.client.read_input_registers(10002, ModbusDataType.INT_32, - wordorder=Endian.Big, unit=unit) * -1 - power = dc_power + power = self.client.read_input_registers(10002, ModbusDataType.INT_32, + wordorder=Endian.Big, unit=unit) * -1 - # DEBUG only: Register 10208 (ac_grid_output_power laut HA-Integration) zum - # Vergleich mitloggen, ob das die bessere Quelle fuer power waere. Wird noch - # nirgends verwendet/gespeichert. - ac_grid_output_power = self.client.read_input_registers(10208, ModbusDataType.INT_32, - wordorder=Endian.Big, unit=unit) - log.debug("DEBUG ac_grid_output_power (10208) roh: %s", ac_grid_output_power) self.peak_filter.check_values(power) imported, exported = self.sim_counter.sim_count(power) From 182b7a9f2dc7c51e826d05b69ebffac6478591a7 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 14:03:31 +0200 Subject: [PATCH 25/29] Delete packages/modules/devices/anker/solarbank_4_e5000/__init__.py --- packages/modules/devices/anker/solarbank_4_e5000/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 packages/modules/devices/anker/solarbank_4_e5000/__init__.py diff --git a/packages/modules/devices/anker/solarbank_4_e5000/__init__.py b/packages/modules/devices/anker/solarbank_4_e5000/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 From aee1abf7dd7693d57b8701f8b807c7ede4a6a518 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 14:03:43 +0200 Subject: [PATCH 26/29] Add files via upload --- packages/modules/devices/anker/solarbank/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/modules/devices/anker/solarbank/__init__.py diff --git a/packages/modules/devices/anker/solarbank/__init__.py b/packages/modules/devices/anker/solarbank/__init__.py new file mode 100644 index 0000000000..e69de29bb2 From 6f9d2f5c5ceac6a0669d27c1779066668ee02c6d Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 14:05:48 +0200 Subject: [PATCH 27/29] Remove debug logging from counter.py --- .../modules/devices/anker/smartmeter_gen2/counter.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/modules/devices/anker/smartmeter_gen2/counter.py b/packages/modules/devices/anker/smartmeter_gen2/counter.py index 33c8cd465f..83237c8566 100644 --- a/packages/modules/devices/anker/smartmeter_gen2/counter.py +++ b/packages/modules/devices/anker/smartmeter_gen2/counter.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -import logging from typing import Any, TypedDict from modules.common.abstract_device import AbstractCounter @@ -12,8 +11,6 @@ from modules.common.utils.peak_filter import PeakFilter from modules.devices.anker.smartmeter_gen2.config import AnkerMeter, AnkerMeterCounterSetup -log = logging.getLogger(__name__) - class KwargsDict(TypedDict): device_config: AnkerMeter @@ -45,10 +42,8 @@ def update(self): currents = self.client.read_input_registers(10635, [ModbusDataType.INT_16] * 3, wordorder=Endian.Big, unit=unit) - # DEBUG only: Rohwerte vor Skalierung/Vorzeichen-Anpassung mitloggen, um zu - # sehen ob das Strom-Register selbst schon ein Vorzeichen traegt oder nicht. - log.debug("DEBUG currents roh (vor /100, vor Vorzeichen-Uebernahme von powers): %s", currents) - log.debug("DEBUG powers roh (zum Vergleich): %s", powers) + # Currents hat keine eigene Vorzeichen (getestet), daher kommen die Vorzeichen aus + # den powers-Werten voltages = [value / 10 for value in voltages] currents = [abs(c) / 100 * (1 if p >= 0 else -1) for c, p in zip(currents, powers)] From 31f9af0b5c03075667de26e1540c12fa5df1d442 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 14:09:16 +0200 Subject: [PATCH 28/29] Update update_config.py --- packages/helpermodules/update_config.py | 28 ++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/helpermodules/update_config.py b/packages/helpermodules/update_config.py index a6803941fd..c35ba3b974 100644 --- a/packages/helpermodules/update_config.py +++ b/packages/helpermodules/update_config.py @@ -58,7 +58,7 @@ class UpdateConfig: - DATASTORE_VERSION = 138 + DATASTORE_VERSION = 139 valid_topic = [ "^openWB/bat/config/bat_control_activated$", @@ -3500,3 +3500,29 @@ def upgrade(topic: str, payload) -> Optional[dict]: return {topic: payload_device} self._loop_all_received_topics(upgrade) self._append_datastore_version(138) + + def upgrade_datastore_139(self) -> None: + def upgrade(topic: str, payload) -> Optional[dict]: + if re.search("^openWB/system/device/[0-9]+/config$", topic) is not None: + payload_device = decode_payload(payload) + if payload_device.get("type") in ("solarbank_4_e5000", "solarbank_max_ac"): + old_type = payload_device["type"] + payload_device["type"] = "solarbank" + if old_type == "solarbank_max_ac": + index = get_index(topic) + for topic_component, payload_component in self.all_received_topics.items(): + if re.search(f"^openWB/system/device/{index}/component/[0-9]+/config$", + topic_component) is not None: + payload_component = decode_payload(payload_component) + if payload_component.get("type") == ComponentType.COUNTER.value: + pub_system_message( + payload_device, + "Die Solarbank Max AC unterstuetzt den Zaehler nicht mehr als eigene " + "Komponente. Bitte lege den Anker SOLIX Smart Meter Gen 2 als " + "eigenstaendiges Geraet mit eigener IP-Adresse an und entferne die " + "bisherige Zaehler-Komponente unter Einstellungen -> Konfiguration -> " + "Geraete manuell.", MessageType.WARNING) + break + return {topic: payload_device} + self._loop_all_received_topics(upgrade) + self._append_datastore_version(139) From c79153a5f78fba382a3daaea7ca9db16df9aa0c4 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 20 Aug 2026 14:21:03 +0200 Subject: [PATCH 29/29] Remove dc_power from inverter state Removed dc_power from InverterState initialization. --- packages/modules/devices/anker/solarbank/inverter.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/modules/devices/anker/solarbank/inverter.py b/packages/modules/devices/anker/solarbank/inverter.py index 8933fef575..9efe89fcc0 100644 --- a/packages/modules/devices/anker/solarbank/inverter.py +++ b/packages/modules/devices/anker/solarbank/inverter.py @@ -37,12 +37,10 @@ def update(self) -> None: power = self.client.read_input_registers(10002, ModbusDataType.INT_32, wordorder=Endian.Big, unit=unit) * -1 - self.peak_filter.check_values(power) imported, exported = self.sim_counter.sim_count(power) inverter_state = InverterState( power=power, - dc_power=dc_power, imported=imported, exported=exported )