From 1ba739b21cfee184e91a5afe4bd8ccf2ada5f26d Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 08:21:01 +0200 Subject: [PATCH 01/30] Add Vendor class for Anker devices --- packages/modules/devices/anker/vendor.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 packages/modules/devices/anker/vendor.py diff --git a/packages/modules/devices/anker/vendor.py b/packages/modules/devices/anker/vendor.py new file mode 100644 index 0000000000..69365e206f --- /dev/null +++ b/packages/modules/devices/anker/vendor.py @@ -0,0 +1,14 @@ +from pathlib import Path + +from modules.common.abstract_device import DeviceDescriptor +from modules.devices.vendors import VendorGroup + + +class Vendor: + def __init__(self): + self.type = Path(__file__).parent.name + self.vendor = "Anker" + self.group = VendorGroup.VENDORS.value + + +vendor_descriptor = DeviceDescriptor(configuration_factory=Vendor) From ec0f1e2beac85887c6ed31afeb5aaa7d26bac856 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 08:21:15 +0200 Subject: [PATCH 02/30] Add files via upload --- packages/modules/devices/anker/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/modules/devices/anker/__init__.py diff --git a/packages/modules/devices/anker/__init__.py b/packages/modules/devices/anker/__init__.py new file mode 100644 index 0000000000..e69de29bb2 From 5ee03356555d3e3efe2e9eeb370a9613c8b16fc6 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 08:28:07 +0200 Subject: [PATCH 03/30] Add Anker configuration and setup classes --- .../devices/anker/anker_solix/config.py | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 packages/modules/devices/anker/anker_solix/config.py diff --git a/packages/modules/devices/anker/anker_solix/config.py b/packages/modules/devices/anker/anker_solix/config.py new file mode 100644 index 0000000000..2e2b9604cc --- /dev/null +++ b/packages/modules/devices/anker/anker_solix/config.py @@ -0,0 +1,67 @@ +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): + self.ip_address = ip_address + self.port = port + + +class Anker: + def __init__(self, + name: str = "Anker", + type: str = "anker", + 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, modbus_id: int = 100): + self.modbus_id = modbus_id + + +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 AnkerCounterConfiguration: + def __init__(self, energy_meter: bool = True, modbus_id: int = 1): + self.energy_meter = energy_meter + self.modbus_id = modbus_id + + +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, mppt: bool = False, modbus_id: int = 100): + self.mppt = mppt + self.modbus_id = modbus_id + + +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 ef13f0be1d68d7e452873c09d06e55ab1aea4fc0 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 08:28:27 +0200 Subject: [PATCH 04/30] Add files via upload --- packages/modules/devices/anker/anker_solix/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/modules/devices/anker/anker_solix/__init__.py diff --git a/packages/modules/devices/anker/anker_solix/__init__.py b/packages/modules/devices/anker/anker_solix/__init__.py new file mode 100644 index 0000000000..e69de29bb2 From 92489b8c9b04ada99b420ba22b3c63a4e9573b6f Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 08:30:21 +0200 Subject: [PATCH 05/30] Add Anker device implementation in device.py --- .../devices/anker/anker_solix/device.py | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 packages/modules/devices/anker/anker_solix/device.py diff --git a/packages/modules/devices/anker/anker_solix/device.py b/packages/modules/devices/anker/anker_solix/device.py new file mode 100644 index 0000000000..5000adee4f --- /dev/null +++ b/packages/modules/devices/anker/anker_solix/device.py @@ -0,0 +1,55 @@ +#!/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.anker_solix.bat import AnkerBat +from modules.devices.anker.anker_solix.config import Anker, AnkerBatSetup, AnkerCounterSetup, AnkerInverterSetup +from modules.devices.anker.anker_solix.counter import AnkerCounter +from modules.devices.anker.anker_solix.inverter import AnkerInverter + +log = logging.getLogger(__name__) + + +def create_device(device_config: Anker): + client = None + + def create_bat_component(component_config: AnkerBatSetup): + nonlocal client + return AnkerBat(component_config, device_id=device_config.id, client=client) + + def create_counter_component(component_config: AnkerCounterSetup): + nonlocal client + return AnkerCounter(component_config, device_id=device_config.id, client=client) + + def create_inverter_component(component_config: AnkerInverterSetup): + nonlocal client + return AnkerInverter(component_config, device_id=device_config.id, client=client) + + def update_components(components: Iterable[Union[AnkerBat, AnkerCounter, AnkerInverter]]): + nonlocal client + 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, + counter=create_counter_component, + inverter=create_inverter_component, + ), + component_updater=MultiComponentUpdater(update_components) + ) + + +device_descriptor = DeviceDescriptor(configuration_factory=Anker) From 6fd9196f84af4ca0ad0d43b0f75c233acb9ab514 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 08:43:10 +0200 Subject: [PATCH 06/30] Add AnkerInverter class for inverter management Implement AnkerInverter class with initialization and update methods for inverter functionality. --- .../devices/anker/anker_solix/inverter.py | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 packages/modules/devices/anker/anker_solix/inverter.py diff --git a/packages/modules/devices/anker/anker_solix/inverter.py b/packages/modules/devices/anker/anker_solix/inverter.py new file mode 100644 index 0000000000..c6626d03f7 --- /dev/null +++ b/packages/modules/devices/anker/anker_solix/inverter.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +import logging +from typing import TypedDict, Any + +from modules.common import modbus +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 +from modules.common.simcount import SimCounter +from modules.common.store import get_inverter_value_store +from modules.devices.anker.anker_solix.config import AnkerInverterSetup +from modules.common.utils.peak_filter import PeakFilter +from modules.common.component_type import ComponentType + +log = logging.getLogger(__name__) + + +class KwargsDict(TypedDict): + device_id: int + client: modbus.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_id: int = self.kwargs['device_id'] + self.__tcp_client: modbus.ModbusTcpClient_ = self.kwargs['client'] + self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="pv") + self.store = get_inverter_value_store(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: + modbus_id = self.component_config.configuration.modbus_id + + # Register 10002 ist die PV_power also die DC Leistung, eine AC Leistung gibt es so nicht + power = self.__tcp_client.read_input_registers(10002, ModbusDataType.INT_32, + wordorder=Endian.Little, unit=unit) * -1 + + + self.peak_filter.check_values(power) + imported, exported = self.sim_counter.sim_count(power) + inverter_state = InverterState( + power=power, + imported=imported, + exported=exported + ) + self.store.set(inverter_state) + + +component_descriptor = ComponentDescriptor(configuration_factory=AnkerInverterSetup) From e0c7c60138b2a3efb2e207ab15d1a17e3fdf5a5c Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 08:47:33 +0200 Subject: [PATCH 07/30] Add AnkerCounterVersion enum for device versions --- packages/modules/devices/anker/anker_solix/version.py | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 packages/modules/devices/anker/anker_solix/version.py diff --git a/packages/modules/devices/anker/anker_solix/version.py b/packages/modules/devices/anker/anker_solix/version.py new file mode 100644 index 0000000000..71686120d8 --- /dev/null +++ b/packages/modules/devices/anker/anker_solix/version.py @@ -0,0 +1,6 @@ +from enum import Enum + + +class AnkerCounterVersion(Enum): + smartmeter = "smartmeter" + solarbank = "solarbank" From ca326bb0ca7353160d42f611eaa2c210817dc584 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 09:05:42 +0200 Subject: [PATCH 08/30] Add AnkerCounter class with initialization and update methods Implement AnkerCounter class for managing counter data. --- .../devices/anker/anker_solix/counter.py | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 packages/modules/devices/anker/anker_solix/counter.py diff --git a/packages/modules/devices/anker/anker_solix/counter.py b/packages/modules/devices/anker/anker_solix/counter.py new file mode 100644 index 0000000000..84b40e93e2 --- /dev/null +++ b/packages/modules/devices/anker/anker_solix/counter.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +from typing import Any, TypedDict +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, ModbusTcpClient_ +from modules.common.store import get_counter_value_store +from modules.devices.anker.anker_solix.config import AnkerCounterSetup +from modules.common.utils.peak_filter import PeakFilter +from modules.common.component_type import ComponentType + + +class KwargsDict(TypedDict): + client: ModbusTcpClient_ + + +class AnkerCounter: + def __init__(self, component_config: AnkerCounterSetup, **kwargs: Any) -> None: + self.component_config = component_config + self.kwargs: KwargsDict = kwargs + + def initialize(self) -> None: + self.client: ModbusTcpClient_ = self.kwargs['client'] + self.version: AnkerCounterVersion = self.kwargs['version'] + self.store = get_counter_value_store(self.component_config.id) + self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) + self.version = self.kwargs['version'] + self.client = self.kwargs['client'] + self.peak_filter = PeakFilter(ComponentType.COUNTER, self.component_config.id, self.fault_state) + + def update(self): + unit = self.component_config.configuration.modbus_id + + power = self.__tcp_client.read_input_registers(10644, ModbusDataType.INT_32, + wordorder=Endian.Little, unit=unit) * -1 + powers = self.__tcp_client.read_input_registers(10638, [ModbusDataType.INT_32] * 3, + wordorder=Endian.Little, unit=unit) + voltages = self.__tcp_client.read_input_registers(10632, [ModbusDataType.UINT_16] * 3, + wordorder=Endian.Little, unit=unit) + currents = self.__tcp_client.read_input_registers(10666, [ModbusDataType.INT_16] * 3, + wordorder=Endian.Little, 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 395ecbbdda00556dbfc311a6db39d387d832a02f Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 09:06:01 +0200 Subject: [PATCH 09/30] Delete packages/modules/devices/anker/anker_solix/version.py --- packages/modules/devices/anker/anker_solix/version.py | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 packages/modules/devices/anker/anker_solix/version.py diff --git a/packages/modules/devices/anker/anker_solix/version.py b/packages/modules/devices/anker/anker_solix/version.py deleted file mode 100644 index 71686120d8..0000000000 --- a/packages/modules/devices/anker/anker_solix/version.py +++ /dev/null @@ -1,6 +0,0 @@ -from enum import Enum - - -class AnkerCounterVersion(Enum): - smartmeter = "smartmeter" - solarbank = "solarbank" From 2113e2d8b9f1e0847139d6241a6324d757bc87c0 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 09:33:45 +0200 Subject: [PATCH 10/30] Add AnkerBat class for battery management --- .../modules/devices/anker/anker_solix/bat.py | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 packages/modules/devices/anker/anker_solix/bat.py diff --git a/packages/modules/devices/anker/anker_solix/bat.py b/packages/modules/devices/anker/anker_solix/bat.py new file mode 100644 index 0000000000..4260080d78 --- /dev/null +++ b/packages/modules/devices/anker/anker_solix/bat.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +import logging +from typing import Any, Optional, TypedDict + +from modules.common import modbus +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 +from modules.common.simcount import SimCounter +from modules.common.store import get_bat_value_store +from modules.devices.anker.anker_solix.config import AnkerBatSetup +from modules.common.utils.peak_filter import PeakFilter +from modules.common.component_type import ComponentType +from control import data + +log = logging.getLogger(__name__) + + +class KwargsDict(TypedDict): + device_id: int + client: modbus.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_id: int = self.kwargs['device_id'] + self.__tcp_client: modbus.ModbusTcpClient_ = self.kwargs['client'] + 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' + self.peak_filter = PeakFilter(ComponentType.BAT, self.component_config.id, self.fault_state) + + def update(self) -> None: + unit = self.component_config.configuration.modbus_id + + power = self.__tcp_client.read_input_registers(10008, ModbusDataType.INT_32, + wordorder=Endian.Little, unit=unit) * -1 + soc = self.__tcp_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.component_config.configuration.modbus_id + + if power_limit is None: + log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter") + if self.last_mode is not None: + self.__tcp_client.write_register(10064, 0, data_type=ModbusDataType.UINT_16, unit=unit) + self.last_mode = None + else: + if self.last_mode != 'limited': + self.__tcp_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.__tcp_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=SungrowSHBatSetup) From 31e7f91ea2353be75ef18f09496f8f70559721f2 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 09:39:52 +0200 Subject: [PATCH 11/30] Refactor Modbus client usage in AnkerBat class --- .../modules/devices/anker/anker_solix/bat.py | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/modules/devices/anker/anker_solix/bat.py b/packages/modules/devices/anker/anker_solix/bat.py index 4260080d78..b4420a6db8 100644 --- a/packages/modules/devices/anker/anker_solix/bat.py +++ b/packages/modules/devices/anker/anker_solix/bat.py @@ -7,7 +7,7 @@ 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 +from modules.common.modbus import ModbusDataType, ModbusTcpClient_ from modules.common.simcount import SimCounter from modules.common.store import get_bat_value_store from modules.devices.anker.anker_solix.config import AnkerBatSetup @@ -19,8 +19,7 @@ class KwargsDict(TypedDict): - device_id: int - client: modbus.ModbusTcpClient_ + client: ModbusTcpClient_ class AnkerBat(AbstractBat): @@ -29,20 +28,19 @@ def __init__(self, component_config: AnkerBatSetup, **kwargs: Any) -> None: self.kwargs: KwargsDict = kwargs def initialize(self) -> None: - self.__device_id: int = self.kwargs['device_id'] - self.__tcp_client: modbus.ModbusTcpClient_ = self.kwargs['client'] + self.client: ModbusTcpClient_ = self.kwargs['client'] 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' self.peak_filter = PeakFilter(ComponentType.BAT, self.component_config.id, self.fault_state) + self.last_mode = 'Undefined' def update(self) -> None: unit = self.component_config.configuration.modbus_id - power = self.__tcp_client.read_input_registers(10008, ModbusDataType.INT_32, + power = self.client.read_input_registers(10008, ModbusDataType.INT_32, wordorder=Endian.Little, unit=unit) * -1 - soc = self.__tcp_client.read_input_registers(10014, ModbusDataType.UINT_16, unit=unit) + 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) @@ -60,18 +58,18 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: if power_limit is None: log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter") if self.last_mode is not None: - self.__tcp_client.write_register(10064, 0, data_type=ModbusDataType.UINT_16, unit=unit) + self.client.write_register(10064, 0, data_type=ModbusDataType.UINT_16, unit=unit) self.last_mode = None else: if self.last_mode != 'limited': - self.__tcp_client.write_register(10064, 3, data_type=ModbusDataType.UINT_16, unit=unit) + 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.__tcp_client.write_register(10071, power_value, data_type=ModbusDataType.INT_32, unit=unit) + 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: From 90b49ac0a3eb43df989df5e4f22489e57ceee2bc Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 09:42:59 +0200 Subject: [PATCH 12/30] Refactor counter.py to use SimCounter and update client Initialized SimCounter and updated client references in the update method. --- .../modules/devices/anker/anker_solix/counter.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/modules/devices/anker/anker_solix/counter.py b/packages/modules/devices/anker/anker_solix/counter.py index 84b40e93e2..84884d5fb0 100644 --- a/packages/modules/devices/anker/anker_solix/counter.py +++ b/packages/modules/devices/anker/anker_solix/counter.py @@ -4,6 +4,7 @@ from modules.common.component_type import ComponentDescriptor from modules.common.fault_state import ComponentInfo, FaultState from modules.common.modbus import ModbusDataType, ModbusTcpClient_ +from modules.common.simcount import SimCounter from modules.common.store import get_counter_value_store from modules.devices.anker.anker_solix.config import AnkerCounterSetup from modules.common.utils.peak_filter import PeakFilter @@ -21,23 +22,21 @@ def __init__(self, component_config: AnkerCounterSetup, **kwargs: Any) -> None: def initialize(self) -> None: self.client: ModbusTcpClient_ = self.kwargs['client'] - self.version: AnkerCounterVersion = self.kwargs['version'] + self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="bezug") self.store = get_counter_value_store(self.component_config.id) self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) - self.version = self.kwargs['version'] - self.client = self.kwargs['client'] self.peak_filter = PeakFilter(ComponentType.COUNTER, self.component_config.id, self.fault_state) def update(self): unit = self.component_config.configuration.modbus_id - power = self.__tcp_client.read_input_registers(10644, ModbusDataType.INT_32, + power = self.client.read_input_registers(10644, ModbusDataType.INT_32, wordorder=Endian.Little, unit=unit) * -1 - powers = self.__tcp_client.read_input_registers(10638, [ModbusDataType.INT_32] * 3, + powers = self.client.read_input_registers(10638, [ModbusDataType.INT_32] * 3, wordorder=Endian.Little, unit=unit) - voltages = self.__tcp_client.read_input_registers(10632, [ModbusDataType.UINT_16] * 3, + voltages = self.client.read_input_registers(10632, [ModbusDataType.UINT_16] * 3, wordorder=Endian.Little, unit=unit) - currents = self.__tcp_client.read_input_registers(10666, [ModbusDataType.INT_16] * 3, + currents = self.client.read_input_registers(10666, [ModbusDataType.INT_16] * 3, wordorder=Endian.Little, unit=unit) voltages = [value / 10 for value in voltages] From c2dcb7640f0cdf93ef8939a97a0845d389d9caf1 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 09:45:20 +0200 Subject: [PATCH 13/30] Refactor inverter.py to use ModbusTcpClient_ directly --- .../devices/anker/anker_solix/inverter.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/packages/modules/devices/anker/anker_solix/inverter.py b/packages/modules/devices/anker/anker_solix/inverter.py index c6626d03f7..3f10fc9726 100644 --- a/packages/modules/devices/anker/anker_solix/inverter.py +++ b/packages/modules/devices/anker/anker_solix/inverter.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -import logging from typing import TypedDict, Any from modules.common import modbus @@ -7,19 +6,16 @@ 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 +from modules.common.modbus import ModbusDataType, ModbusTcpClient_ from modules.common.simcount import SimCounter from modules.common.store import get_inverter_value_store from modules.devices.anker.anker_solix.config import AnkerInverterSetup from modules.common.utils.peak_filter import PeakFilter from modules.common.component_type import ComponentType -log = logging.getLogger(__name__) - class KwargsDict(TypedDict): - device_id: int - client: modbus.ModbusTcpClient_ + client: ModbusTcpClient_ class AnkerInverter(AbstractInverter): @@ -28,19 +24,18 @@ def __init__(self, component_config: AnkerInverterSetup, **kwargs: Any) -> None: self.kwargs: KwargsDict = kwargs def initialize(self) -> None: - self.__device_id: int = self.kwargs['device_id'] - self.__tcp_client: modbus.ModbusTcpClient_ = self.kwargs['client'] + self.client: ModbusTcpClient_ = self.kwargs['client'] self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="pv") self.store = get_inverter_value_store(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: - modbus_id = self.component_config.configuration.modbus_id + unit = self.component_config.configuration.modbus_id # Register 10002 ist die PV_power also die DC Leistung, eine AC Leistung gibt es so nicht - power = self.__tcp_client.read_input_registers(10002, ModbusDataType.INT_32, - wordorder=Endian.Little, unit=unit) * -1 + power = self.client.read_input_registers(10002, ModbusDataType.INT_32, + wordorder=Endian.Little, unit=unit) * -1 self.peak_filter.check_values(power) From 5f6cb8b0fe4eb14cc693344fe5bccb0e8a594533 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 09:47:54 +0200 Subject: [PATCH 14/30] Add device_id to KwargsDict in AnkerBat --- packages/modules/devices/anker/anker_solix/bat.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/modules/devices/anker/anker_solix/bat.py b/packages/modules/devices/anker/anker_solix/bat.py index b4420a6db8..ee3a1207d7 100644 --- a/packages/modules/devices/anker/anker_solix/bat.py +++ b/packages/modules/devices/anker/anker_solix/bat.py @@ -19,6 +19,7 @@ class KwargsDict(TypedDict): + device_id: int client: ModbusTcpClient_ @@ -28,6 +29,7 @@ def __init__(self, component_config: AnkerBatSetup, **kwargs: Any) -> None: self.kwargs: KwargsDict = kwargs def initialize(self) -> None: + self.__device_id: int = self.kwargs['device_id'] self.client: ModbusTcpClient_ = self.kwargs['client'] self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="speicher") self.store = get_bat_value_store(self.component_config.id) From 68e7ee2f38b28afe51f3dae3f23cffd521ffb9cb Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 09:48:18 +0200 Subject: [PATCH 15/30] Add device_id to KwargsDict and initialize in AnkerCounter Added device_id to KwargsDict and initialized it in AnkerCounter. --- packages/modules/devices/anker/anker_solix/counter.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/modules/devices/anker/anker_solix/counter.py b/packages/modules/devices/anker/anker_solix/counter.py index 84884d5fb0..8a62faef10 100644 --- a/packages/modules/devices/anker/anker_solix/counter.py +++ b/packages/modules/devices/anker/anker_solix/counter.py @@ -12,6 +12,7 @@ class KwargsDict(TypedDict): + device_id: int client: ModbusTcpClient_ @@ -21,6 +22,7 @@ def __init__(self, component_config: AnkerCounterSetup, **kwargs: Any) -> None: self.kwargs: KwargsDict = kwargs def initialize(self) -> None: + self.__device_id: int = self.kwargs['device_id'] self.client: ModbusTcpClient_ = self.kwargs['client'] self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="bezug") self.store = get_counter_value_store(self.component_config.id) From df1aa1b035f1f2fa3d6e817e22ffd2d3deee6553 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 09:48:36 +0200 Subject: [PATCH 16/30] Add device_id to KwargsDict and initialize Add device_id to KwargsDict and initialize method --- packages/modules/devices/anker/anker_solix/inverter.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/modules/devices/anker/anker_solix/inverter.py b/packages/modules/devices/anker/anker_solix/inverter.py index 3f10fc9726..2ec66afaa4 100644 --- a/packages/modules/devices/anker/anker_solix/inverter.py +++ b/packages/modules/devices/anker/anker_solix/inverter.py @@ -15,6 +15,7 @@ class KwargsDict(TypedDict): + device_id: int client: ModbusTcpClient_ @@ -24,6 +25,7 @@ def __init__(self, component_config: AnkerInverterSetup, **kwargs: Any) -> None: self.kwargs: KwargsDict = kwargs def initialize(self) -> None: + self.__device_id: int = self.kwargs['device_id'] self.client: ModbusTcpClient_ = self.kwargs['client'] self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="pv") self.store = get_inverter_value_store(self.component_config.id) From a98267ab3f4d43dd6f4071fe845a4f71e391eaf6 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 09:51:59 +0200 Subject: [PATCH 17/30] Change default modbus_id from 100 to 1 --- packages/modules/devices/anker/anker_solix/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/anker/anker_solix/config.py b/packages/modules/devices/anker/anker_solix/config.py index 2e2b9604cc..649b1599e3 100644 --- a/packages/modules/devices/anker/anker_solix/config.py +++ b/packages/modules/devices/anker/anker_solix/config.py @@ -24,7 +24,7 @@ def __init__(self, class AnkerBatConfiguration: - def __init__(self, modbus_id: int = 100): + def __init__(self, modbus_id: int = 1): self.modbus_id = modbus_id @@ -53,7 +53,7 @@ def __init__(self, class AnkerInverterConfiguration: - def __init__(self, mppt: bool = False, modbus_id: int = 100): + def __init__(self, mppt: bool = False, modbus_id: int = 1): self.mppt = mppt self.modbus_id = modbus_id From 9c8a84a644ede915a81b1b0f6f890fb7cb340230 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 10:38:08 +0200 Subject: [PATCH 18/30] Update power limit handling and component descriptor --- packages/modules/devices/anker/anker_solix/bat.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/modules/devices/anker/anker_solix/bat.py b/packages/modules/devices/anker/anker_solix/bat.py index ee3a1207d7..cbef7a2766 100644 --- a/packages/modules/devices/anker/anker_solix/bat.py +++ b/packages/modules/devices/anker/anker_solix/bat.py @@ -7,7 +7,7 @@ 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, ModbusTcpClient_ +from modules.common.modbus import ModbusDataType, Endian, ModbusTcpClient_ from modules.common.simcount import SimCounter from modules.common.store import get_bat_value_store from modules.devices.anker.anker_solix.config import AnkerBatSetup @@ -69,7 +69,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 - + 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") @@ -78,4 +78,4 @@ def power_limit_controllable(self) -> bool: return True -component_descriptor = ComponentDescriptor(configuration_factory=SungrowSHBatSetup) +component_descriptor = ComponentDescriptor(configuration_factory=AnkerBatSetup) From c2a0cc592b656222c5e64ace1d35d4aa1b5673c3 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 10:39:18 +0200 Subject: [PATCH 19/30] Refactor imports and update read_input_registers calls --- packages/modules/devices/anker/anker_solix/counter.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/modules/devices/anker/anker_solix/counter.py b/packages/modules/devices/anker/anker_solix/counter.py index 8a62faef10..6a2ce04866 100644 --- a/packages/modules/devices/anker/anker_solix/counter.py +++ b/packages/modules/devices/anker/anker_solix/counter.py @@ -3,7 +3,7 @@ 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, ModbusTcpClient_ +from modules.common.modbus import ModbusDataType, Endian, ModbusTcpClient_ from modules.common.simcount import SimCounter from modules.common.store import get_counter_value_store from modules.devices.anker.anker_solix.config import AnkerCounterSetup @@ -33,13 +33,13 @@ def update(self): unit = self.component_config.configuration.modbus_id power = self.client.read_input_registers(10644, ModbusDataType.INT_32, - wordorder=Endian.Little, unit=unit) * -1 + wordorder=Endian.Little, unit=unit) * -1 powers = self.client.read_input_registers(10638, [ModbusDataType.INT_32] * 3, - wordorder=Endian.Little, unit=unit) + wordorder=Endian.Little, unit=unit) voltages = self.client.read_input_registers(10632, [ModbusDataType.UINT_16] * 3, - wordorder=Endian.Little, unit=unit) + wordorder=Endian.Little, unit=unit) currents = self.client.read_input_registers(10666, [ModbusDataType.INT_16] * 3, - wordorder=Endian.Little, unit=unit) + wordorder=Endian.Little, unit=unit) voltages = [value / 10 for value in voltages] currents = [value / -100 for value in currents] From 45cd964625300be230dd056a0fbc640f9c44b3bd Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 10:40:08 +0200 Subject: [PATCH 20/30] Refactor imports and clean up inverter.py Updated import statements and removed an unused line. --- packages/modules/devices/anker/anker_solix/inverter.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/modules/devices/anker/anker_solix/inverter.py b/packages/modules/devices/anker/anker_solix/inverter.py index 2ec66afaa4..f8466626ac 100644 --- a/packages/modules/devices/anker/anker_solix/inverter.py +++ b/packages/modules/devices/anker/anker_solix/inverter.py @@ -6,7 +6,7 @@ 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, ModbusTcpClient_ +from modules.common.modbus import ModbusDataType, Endian, ModbusTcpClient_ from modules.common.simcount import SimCounter from modules.common.store import get_inverter_value_store from modules.devices.anker.anker_solix.config import AnkerInverterSetup @@ -39,7 +39,6 @@ def update(self) -> None: power = self.client.read_input_registers(10002, ModbusDataType.INT_32, wordorder=Endian.Little, unit=unit) * -1 - self.peak_filter.check_values(power) imported, exported = self.sim_counter.sim_count(power) inverter_state = InverterState( From 4ed6b499f891a35fdeb137dc00d435d7daeb51ef Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 10:41:56 +0200 Subject: [PATCH 21/30] flake8 --- packages/modules/devices/anker/anker_solix/counter.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/modules/devices/anker/anker_solix/counter.py b/packages/modules/devices/anker/anker_solix/counter.py index 6a2ce04866..25b2f7206c 100644 --- a/packages/modules/devices/anker/anker_solix/counter.py +++ b/packages/modules/devices/anker/anker_solix/counter.py @@ -37,14 +37,13 @@ def update(self): powers = self.client.read_input_registers(10638, [ModbusDataType.INT_32] * 3, wordorder=Endian.Little, unit=unit) voltages = self.client.read_input_registers(10632, [ModbusDataType.UINT_16] * 3, - wordorder=Endian.Little, unit=unit) + wordorder=Endian.Little, unit=unit) currents = self.client.read_input_registers(10666, [ModbusDataType.INT_16] * 3, wordorder=Endian.Little, 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( From 85196ee6f1cbfbc775956a6b5c12c62fc8853dc8 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 10:43:09 +0200 Subject: [PATCH 22/30] Remove unused import from inverter.py Remove unused import of 'modbus' from inverter.py --- packages/modules/devices/anker/anker_solix/inverter.py | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/modules/devices/anker/anker_solix/inverter.py b/packages/modules/devices/anker/anker_solix/inverter.py index f8466626ac..69e41dc6d8 100644 --- a/packages/modules/devices/anker/anker_solix/inverter.py +++ b/packages/modules/devices/anker/anker_solix/inverter.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 from typing import TypedDict, Any -from modules.common import modbus from modules.common.abstract_device import AbstractInverter from modules.common.component_state import InverterState from modules.common.component_type import ComponentDescriptor From 29a3adcb8e58a691c2396fd1b2a40feb7d11b5ae Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 10:44:41 +0200 Subject: [PATCH 23/30] flake8 --- packages/modules/devices/anker/anker_solix/counter.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/modules/devices/anker/anker_solix/counter.py b/packages/modules/devices/anker/anker_solix/counter.py index 25b2f7206c..0a8798db1a 100644 --- a/packages/modules/devices/anker/anker_solix/counter.py +++ b/packages/modules/devices/anker/anker_solix/counter.py @@ -1,5 +1,7 @@ #!/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 86872f289c2df068aae156e5feae647986d764ad Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 10:45:24 +0200 Subject: [PATCH 24/30] flake8 --- packages/modules/devices/anker/anker_solix/bat.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/modules/devices/anker/anker_solix/bat.py b/packages/modules/devices/anker/anker_solix/bat.py index cbef7a2766..1297333c42 100644 --- a/packages/modules/devices/anker/anker_solix/bat.py +++ b/packages/modules/devices/anker/anker_solix/bat.py @@ -2,7 +2,6 @@ import logging from typing import Any, Optional, TypedDict -from modules.common import modbus from modules.common.abstract_device import AbstractBat from modules.common.component_state import BatState from modules.common.component_type import ComponentDescriptor @@ -13,7 +12,6 @@ from modules.devices.anker.anker_solix.config import AnkerBatSetup from modules.common.utils.peak_filter import PeakFilter from modules.common.component_type import ComponentType -from control import data log = logging.getLogger(__name__) @@ -41,7 +39,7 @@ def update(self) -> None: unit = self.component_config.configuration.modbus_id power = self.client.read_input_registers(10008, ModbusDataType.INT_32, - wordorder=Endian.Little, unit=unit) * -1 + wordorder=Endian.Little, unit=unit) * -1 soc = self.client.read_input_registers(10014, ModbusDataType.UINT_16, unit=unit) self.peak_filter.check_values(power) From 65f8d7182bf1cad4cc469af4daa711deea82b460 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 10:48:55 +0200 Subject: [PATCH 25/30] flake8 --- packages/modules/devices/anker/anker_solix/counter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/devices/anker/anker_solix/counter.py b/packages/modules/devices/anker/anker_solix/counter.py index 0a8798db1a..3671872a65 100644 --- a/packages/modules/devices/anker/anker_solix/counter.py +++ b/packages/modules/devices/anker/anker_solix/counter.py @@ -18,7 +18,7 @@ class KwargsDict(TypedDict): client: ModbusTcpClient_ -class AnkerCounter: +class AnkerCounter(AbstractCounter): def __init__(self, component_config: AnkerCounterSetup, **kwargs: Any) -> None: self.component_config = component_config self.kwargs: KwargsDict = kwargs From a15005dd754b26494ba67f43481316895db4f579 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 12:02:25 +0200 Subject: [PATCH 26/30] Add IP config for counter --- packages/modules/devices/anker/anker_solix/config.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/modules/devices/anker/anker_solix/config.py b/packages/modules/devices/anker/anker_solix/config.py index 649b1599e3..0d24f354f5 100644 --- a/packages/modules/devices/anker/anker_solix/config.py +++ b/packages/modules/devices/anker/anker_solix/config.py @@ -38,9 +38,11 @@ def __init__(self, class AnkerCounterConfiguration: - def __init__(self, energy_meter: bool = True, modbus_id: int = 1): - self.energy_meter = energy_meter + def __init__(self, modbus_id: int = 1 + ip_address: Optional[str] = None, port: int = 502): self.modbus_id = modbus_id + self.ip_address = ip_address + self.port = port class AnkerCounterSetup(ComponentSetup[AnkerCounterConfiguration]): @@ -53,8 +55,7 @@ def __init__(self, class AnkerInverterConfiguration: - def __init__(self, mppt: bool = False, modbus_id: int = 1): - self.mppt = mppt + def __init__(self, modbus_id: int = 1): self.modbus_id = modbus_id From 5fcbf47aa54d8210ec4d63cd6009d64f8090f675 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 12:04:48 +0200 Subject: [PATCH 27/30] flake8 --- packages/modules/devices/anker/anker_solix/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/devices/anker/anker_solix/config.py b/packages/modules/devices/anker/anker_solix/config.py index 0d24f354f5..a9375c17bf 100644 --- a/packages/modules/devices/anker/anker_solix/config.py +++ b/packages/modules/devices/anker/anker_solix/config.py @@ -38,7 +38,7 @@ def __init__(self, class AnkerCounterConfiguration: - def __init__(self, modbus_id: int = 1 + def __init__(self, modbus_id: int = 1, ip_address: Optional[str] = None, port: int = 502): self.modbus_id = modbus_id self.ip_address = ip_address From 18f06652809adc77c8a2f52f71f5d1fe9cc5a5cd Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 12:06:57 +0200 Subject: [PATCH 28/30] flake8 --- packages/modules/devices/anker/anker_solix/config.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/anker/anker_solix/config.py b/packages/modules/devices/anker/anker_solix/config.py index a9375c17bf..f56885326d 100644 --- a/packages/modules/devices/anker/anker_solix/config.py +++ b/packages/modules/devices/anker/anker_solix/config.py @@ -38,8 +38,10 @@ def __init__(self, class AnkerCounterConfiguration: - def __init__(self, modbus_id: int = 1, - ip_address: Optional[str] = None, port: int = 502): + def __init__(self, + modbus_id: int = 1, + ip_address: Optional[str] = None, + port: int = 502): self.modbus_id = modbus_id self.ip_address = ip_address self.port = port From 85476de1855ceda372c59772da27943693c4817d Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 12:08:17 +0200 Subject: [PATCH 29/30] flake8 --- packages/modules/devices/anker/anker_solix/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/devices/anker/anker_solix/config.py b/packages/modules/devices/anker/anker_solix/config.py index f56885326d..74fc9ec810 100644 --- a/packages/modules/devices/anker/anker_solix/config.py +++ b/packages/modules/devices/anker/anker_solix/config.py @@ -40,7 +40,7 @@ def __init__(self, class AnkerCounterConfiguration: def __init__(self, modbus_id: int = 1, - ip_address: Optional[str] = None, + ip_address: Optional[str] = None, port: int = 502): self.modbus_id = modbus_id self.ip_address = ip_address From 737c3167c041ccd87cd5b72827836fe96e5ea97b Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Tue, 14 Apr 2026 20:15:43 +0200 Subject: [PATCH 30/30] Add dc_power --- packages/modules/devices/anker/anker_solix/inverter.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/anker/anker_solix/inverter.py b/packages/modules/devices/anker/anker_solix/inverter.py index 69e41dc6d8..4110529842 100644 --- a/packages/modules/devices/anker/anker_solix/inverter.py +++ b/packages/modules/devices/anker/anker_solix/inverter.py @@ -34,14 +34,18 @@ def initialize(self) -> None: def update(self) -> None: unit = self.component_config.configuration.modbus_id - # Register 10002 ist die PV_power also die DC Leistung, eine AC Leistung gibt es so nicht - power = self.client.read_input_registers(10002, ModbusDataType.INT_32, + # 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 + dc_power = self.client.read_input_registers(10002, ModbusDataType.INT_32, + wordorder=Endian.Little, 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 )