From 5aa95b6b380d2357cb1cae8c57e0de4906a0e590 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Sun, 12 Apr 2026 13:27:37 +0200 Subject: [PATCH 01/22] Add 'hybrid-s' option to SolisVersion enum --- packages/modules/devices/solis/solis/version.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/modules/devices/solis/solis/version.py b/packages/modules/devices/solis/solis/version.py index f1a0fe5854..c9feb2afbd 100644 --- a/packages/modules/devices/solis/solis/version.py +++ b/packages/modules/devices/solis/solis/version.py @@ -4,3 +4,4 @@ class SolisVersion(Enum): inverter = "inverter" hybrid = "hybrid" + hybrid-s = "hybrid-s" From 13ee3f25f9252199a609890101c3aa30902ee157 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Sun, 12 Apr 2026 13:43:21 +0200 Subject: [PATCH 02/22] Rename hybrid-s to hybrid_s in SolisVersion --- packages/modules/devices/solis/solis/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/devices/solis/solis/version.py b/packages/modules/devices/solis/solis/version.py index c9feb2afbd..31517a4ce4 100644 --- a/packages/modules/devices/solis/solis/version.py +++ b/packages/modules/devices/solis/solis/version.py @@ -4,4 +4,4 @@ class SolisVersion(Enum): inverter = "inverter" hybrid = "hybrid" - hybrid-s = "hybrid-s" + hybrid_s = "hybrid_s" From 23a166cc5882b3eb47cbad8a55ae8631180d31f6 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Sun, 12 Apr 2026 13:44:10 +0200 Subject: [PATCH 03/22] Enhance inverter.py to read currents for hybrid models Added current readings for hybrid inverter versions and adjusted calculations accordingly. --- packages/modules/devices/solis/solis/inverter.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/modules/devices/solis/solis/inverter.py b/packages/modules/devices/solis/solis/inverter.py index 749829a57f..b6223d272a 100644 --- a/packages/modules/devices/solis/solis/inverter.py +++ b/packages/modules/devices/solis/solis/inverter.py @@ -34,14 +34,19 @@ def update(self) -> None: if self.version == SolisVersion.inverter: power = self.client.read_input_registers(3004, ModbusDataType.UINT_32, unit=unit) * -1 - exported = self.client.read_input_registers(3008, ModbusDataType.UINT_32, unit=unit) * 1000 - elif self.version == SolisVersion.hybrid: + currents = self.__tcp_client.read_input_registers(3037, [ModbusDataType.UINT_16]*3, unit=unit) + elif self.version in (SolisVersion.hybrid, SolisVersion.hybrid_s): power = self.client.read_input_registers(33057, ModbusDataType.UINT_32, unit=unit) * -1 - exported = self.client.read_input_registers(33029, ModbusDataType.UINT_32, unit=unit) * 1000 + currents = self.__tcp_client.read_input_registers(33076, [ModbusDataType.UINT_16]*3, unit=unit) - _, exported = self.peak_filter.check_values(power, None, exported) + currents = [value * -0.1 for value in currents] + + self.peak_filter.check_values(power) + imported, exported = self.sim_counter.sim_count(power) inverter_state = InverterState( power=power, + currents=currents, + imported=imported, exported=exported ) self.store.set(inverter_state) From 0b05636747f14aa2f32b3b4a5824cfabf7e5eb52 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Sun, 12 Apr 2026 13:46:14 +0200 Subject: [PATCH 04/22] Add SimCounter import to inverter.py --- packages/modules/devices/solis/solis/inverter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/modules/devices/solis/solis/inverter.py b/packages/modules/devices/solis/solis/inverter.py index b6223d272a..0ea88a4309 100644 --- a/packages/modules/devices/solis/solis/inverter.py +++ b/packages/modules/devices/solis/solis/inverter.py @@ -5,6 +5,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_inverter_value_store from modules.devices.solis.solis.config import SolisInverterSetup from modules.devices.solis.solis.version import SolisVersion From 5f50d4cb284c562312972f6f1a71b2e691455f58 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Sun, 12 Apr 2026 14:09:22 +0200 Subject: [PATCH 05/22] Refactor battery state handling and add power limit control --- packages/modules/devices/solis/solis/bat.py | 36 ++++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/packages/modules/devices/solis/solis/bat.py b/packages/modules/devices/solis/solis/bat.py index 490fc6a8f5..3fda2e5bd0 100644 --- a/packages/modules/devices/solis/solis/bat.py +++ b/packages/modules/devices/solis/solis/bat.py @@ -7,6 +7,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_bat_value_store from modules.devices.solis.solis.config import SolisBatSetup from modules.common.utils.peak_filter import PeakFilter @@ -35,19 +36,44 @@ def update(self) -> None: power = self.client.read_input_registers(33149, ModbusDataType.INT_32, unit=unit) soc = self.client.read_input_registers(33139, ModbusDataType.UINT_16, unit=unit) - # Geladen in kWh - imported = self.client.read_input_registers(33161, ModbusDataType.UINT_32, unit=unit) * 1000 - # Entladen in kWh - exported = self.client.read_input_registers(33165, ModbusDataType.UINT_32, unit=unit) * 1000 + bat_current = self.__tcp_client.read_input_registers(33134, ModbusDataType.INT_16, unit=unit) * -0.1 - imported, exported = self.peak_filter.check_values(power, imported, exported) + currents = [bat_current / 3] * 3 + + self.peak_filter.check_values(power) + imported, exported = self.sim_counter.sim_count(power) bat_state = BatState( power=power, soc=soc, + currents=currents, 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: + self.__tcp_client.write_register(43135, 0, data_type=ModbusDataType.UINT_16, unit=unit) + log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter") + elif power_limit == 0: + self.__tcp_client.write_register(43135, 1, data_type=ModbusDataType.UINT_16, unit=unit) + self.__tcp_client.write_register(43136, 0, data_type=ModbusDataType.UINT_16, unit=unit) + log.debug("Aktive Batteriesteuerung. Batterie wird auf Stop gesetzt und nicht geladen/entladen") + elif power_limit < 0: + self.__tcp_client.write_register(43135, 2, data_type=ModbusDataType.UINT_16, unit=unit) + power_value = int(power_limit / 10) + self.__tcp_client.write_register(43129, power_value, data_type=ModbusDataType.UINT_16, unit=unit) + log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W entladen für den Hausverbrauch") + elif power_limit > 0: + self.__tcp_client.write_register(43135, 1, data_type=ModbusDataType.UINT_16, unit=unit) + power_value = int(power_limit / 10) + self.__tcp_client.write_register(43136, power_value, data_type=ModbusDataType.UINT_16, unit=unit) + log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W geladen") + + def power_limit_controllable(self) -> bool: + return True + component_descriptor = ComponentDescriptor(configuration_factory=SolisBatSetup) From abffab239d0c0a186cc223cb81e12272c48f1ceb Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Sun, 12 Apr 2026 14:17:54 +0200 Subject: [PATCH 06/22] Add SolisVersion to KwargsDict and initialize method --- packages/modules/devices/solis/solis/bat.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/solis/solis/bat.py b/packages/modules/devices/solis/solis/bat.py index 3fda2e5bd0..5218d1d446 100644 --- a/packages/modules/devices/solis/solis/bat.py +++ b/packages/modules/devices/solis/solis/bat.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 import logging -from typing import TypedDict, Any +from typing import TypedDict, Any, Optional from modules.common.abstract_device import AbstractBat from modules.common.component_state import BatState @@ -10,6 +10,7 @@ from modules.common.simcount import SimCounter from modules.common.store import get_bat_value_store from modules.devices.solis.solis.config import SolisBatSetup +from modules.devices.solis.solis.version import SolisVersion from modules.common.utils.peak_filter import PeakFilter from modules.common.component_type import ComponentType @@ -18,6 +19,7 @@ class KwargsDict(TypedDict): client: ModbusTcpClient_ + version: SolisVersion class SolisBat(AbstractBat): @@ -27,6 +29,7 @@ def __init__(self, component_config: SolisBatSetup, **kwargs: Any) -> None: def initialize(self) -> None: self.client: ModbusTcpClient_ = self.kwargs['client'] + self.version: SolisVersion = self.kwargs['version'] self.store = get_bat_value_store(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) @@ -73,7 +76,8 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W geladen") def power_limit_controllable(self) -> bool: - return True + # Nur die S-Serie sollte die Speichersteuerung können + return self.solis_version == SolisVersion.hybrid_s component_descriptor = ComponentDescriptor(configuration_factory=SolisBatSetup) From 171658d15dba773acb1ab8034fa6986d04347edc Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Sun, 12 Apr 2026 14:21:52 +0200 Subject: [PATCH 07/22] Fixes --- packages/modules/devices/solis/solis/bat.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/modules/devices/solis/solis/bat.py b/packages/modules/devices/solis/solis/bat.py index 5218d1d446..996f327c8b 100644 --- a/packages/modules/devices/solis/solis/bat.py +++ b/packages/modules/devices/solis/solis/bat.py @@ -30,6 +30,7 @@ def __init__(self, component_config: SolisBatSetup, **kwargs: Any) -> None: def initialize(self) -> None: self.client: ModbusTcpClient_ = self.kwargs['client'] self.version: SolisVersion = self.kwargs['version'] + self.sim_counter = SimCounter(self.component_config.id) self.store = get_bat_value_store(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) @@ -39,7 +40,7 @@ def update(self) -> None: power = self.client.read_input_registers(33149, ModbusDataType.INT_32, unit=unit) soc = self.client.read_input_registers(33139, ModbusDataType.UINT_16, unit=unit) - bat_current = self.__tcp_client.read_input_registers(33134, ModbusDataType.INT_16, unit=unit) * -0.1 + bat_current = self.client.read_input_registers(33134, ModbusDataType.INT_16, unit=unit) * -0.1 currents = [bat_current / 3] * 3 @@ -58,26 +59,26 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: unit = self.component_config.configuration.modbus_id if power_limit is None: - self.__tcp_client.write_register(43135, 0, data_type=ModbusDataType.UINT_16, unit=unit) + self.client.write_register(43135, 0, data_type=ModbusDataType.UINT_16, unit=unit) log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter") elif power_limit == 0: - self.__tcp_client.write_register(43135, 1, data_type=ModbusDataType.UINT_16, unit=unit) - self.__tcp_client.write_register(43136, 0, data_type=ModbusDataType.UINT_16, unit=unit) + self.client.write_register(43135, 1, data_type=ModbusDataType.UINT_16, unit=unit) + self.client.write_register(43136, 0, data_type=ModbusDataType.UINT_16, unit=unit) log.debug("Aktive Batteriesteuerung. Batterie wird auf Stop gesetzt und nicht geladen/entladen") elif power_limit < 0: - self.__tcp_client.write_register(43135, 2, data_type=ModbusDataType.UINT_16, unit=unit) + self.client.write_register(43135, 2, data_type=ModbusDataType.UINT_16, unit=unit) power_value = int(power_limit / 10) - self.__tcp_client.write_register(43129, power_value, data_type=ModbusDataType.UINT_16, unit=unit) + self.client.write_register(43129, power_value, data_type=ModbusDataType.UINT_16, unit=unit) log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W entladen für den Hausverbrauch") elif power_limit > 0: - self.__tcp_client.write_register(43135, 1, data_type=ModbusDataType.UINT_16, unit=unit) + self.client.write_register(43135, 1, data_type=ModbusDataType.UINT_16, unit=unit) power_value = int(power_limit / 10) - self.__tcp_client.write_register(43136, power_value, data_type=ModbusDataType.UINT_16, unit=unit) + self.client.write_register(43136, power_value, data_type=ModbusDataType.UINT_16, unit=unit) log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W geladen") def power_limit_controllable(self) -> bool: # Nur die S-Serie sollte die Speichersteuerung können - return self.solis_version == SolisVersion.hybrid_s + return self.version == SolisVersion.hybrid_s component_descriptor = ComponentDescriptor(configuration_factory=SolisBatSetup) From 1a2d82c19a350d0953761570d0722d4569a84a69 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Sun, 12 Apr 2026 14:23:27 +0200 Subject: [PATCH 08/22] Fixes --- packages/modules/devices/solis/solis/inverter.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/solis/solis/inverter.py b/packages/modules/devices/solis/solis/inverter.py index 0ea88a4309..b84bc0d7cd 100644 --- a/packages/modules/devices/solis/solis/inverter.py +++ b/packages/modules/devices/solis/solis/inverter.py @@ -26,6 +26,7 @@ def __init__(self, component_config: SolisInverterSetup, **kwargs: Any) -> None: def initialize(self) -> None: self.client: ModbusTcpClient_ = self.kwargs['client'] self.version: SolisVersion = self.kwargs['version'] + self.sim_counter = SimCounter(self.component_config.id) 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) @@ -35,10 +36,10 @@ def update(self) -> None: if self.version == SolisVersion.inverter: power = self.client.read_input_registers(3004, ModbusDataType.UINT_32, unit=unit) * -1 - currents = self.__tcp_client.read_input_registers(3037, [ModbusDataType.UINT_16]*3, unit=unit) + currents = self.client.read_input_registers(3037, [ModbusDataType.UINT_16]*3, unit=unit) elif self.version in (SolisVersion.hybrid, SolisVersion.hybrid_s): power = self.client.read_input_registers(33057, ModbusDataType.UINT_32, unit=unit) * -1 - currents = self.__tcp_client.read_input_registers(33076, [ModbusDataType.UINT_16]*3, unit=unit) + currents = self.client.read_input_registers(33076, [ModbusDataType.UINT_16]*3, unit=unit) currents = [value * -0.1 for value in currents] From 4241a1032be771ba10ca4a8508d368285383f4d8 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Sun, 12 Apr 2026 14:43:50 +0200 Subject: [PATCH 09/22] Update inverter.py for Modbus register changes --- packages/modules/devices/solis/solis/inverter.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/modules/devices/solis/solis/inverter.py b/packages/modules/devices/solis/solis/inverter.py index b84bc0d7cd..7e044cb2be 100644 --- a/packages/modules/devices/solis/solis/inverter.py +++ b/packages/modules/devices/solis/solis/inverter.py @@ -35,18 +35,22 @@ def update(self) -> None: unit = self.component_config.configuration.modbus_id if self.version == SolisVersion.inverter: - power = self.client.read_input_registers(3004, ModbusDataType.UINT_32, unit=unit) * -1 - currents = self.client.read_input_registers(3037, [ModbusDataType.UINT_16]*3, unit=unit) + # Für Stringwechselrichter -1 bei Modbus Registers + power = self.client.read_input_registers(3004, ModbusDataType.INT_32, unit=unit) * -1 + dc_power = self.client.read_input_registers(3006, ModbusDataType.UINT_32, unit=unit) * -1 + currents = self.client.read_input_registers(3036, [ModbusDataType.UINT_16]*3, unit=unit) elif self.version in (SolisVersion.hybrid, SolisVersion.hybrid_s): - power = self.client.read_input_registers(33057, ModbusDataType.UINT_32, unit=unit) * -1 + power = self.client.read_input_registers(33079, ModbusDataType.INT_32, unit=unit) * -1 + dc_power = self.client.read_input_registers(33057, ModbusDataType.UINT_32, unit=unit) * -1 currents = self.client.read_input_registers(33076, [ModbusDataType.UINT_16]*3, unit=unit) currents = [value * -0.1 for value in currents] self.peak_filter.check_values(power) - imported, exported = self.sim_counter.sim_count(power) + imported, exported = self.sim_counter.sim_count(power, dc_power) inverter_state = InverterState( power=power, + dc_power=dc_power, currents=currents, imported=imported, exported=exported From 1596f630f0c1ab0750b2543019b10c1a3bc0e8c0 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 3 Jun 2026 14:33:55 +0200 Subject: [PATCH 10/22] Fix errors --- packages/modules/devices/solis/solis/bat.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/modules/devices/solis/solis/bat.py b/packages/modules/devices/solis/solis/bat.py index 996f327c8b..b62f12d339 100644 --- a/packages/modules/devices/solis/solis/bat.py +++ b/packages/modules/devices/solis/solis/bat.py @@ -19,7 +19,7 @@ class KwargsDict(TypedDict): client: ModbusTcpClient_ - version: SolisVersion + device_id: int class SolisBat(AbstractBat): @@ -29,8 +29,7 @@ def __init__(self, component_config: SolisBatSetup, **kwargs: Any) -> None: def initialize(self) -> None: self.client: ModbusTcpClient_ = self.kwargs['client'] - self.version: SolisVersion = self.kwargs['version'] - self.sim_counter = SimCounter(self.component_config.id) + self.sim_counter = SimCounter(self.kwargs['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.peak_filter = PeakFilter(ComponentType.BAT, self.component_config.id, self.fault_state) @@ -78,7 +77,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: def power_limit_controllable(self) -> bool: # Nur die S-Serie sollte die Speichersteuerung können - return self.version == SolisVersion.hybrid_s + return SolisVersion(self.component_config.configuration.version) == SolisVersion.hybrid_s component_descriptor = ComponentDescriptor(configuration_factory=SolisBatSetup) From d7fb25dbf256d38c53db05991a5c563b5149bbba Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 3 Jun 2026 14:36:31 +0200 Subject: [PATCH 11/22] Refactor SolisInverter to use device_id and version --- packages/modules/devices/solis/solis/inverter.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/modules/devices/solis/solis/inverter.py b/packages/modules/devices/solis/solis/inverter.py index 7e044cb2be..1802a03ea8 100644 --- a/packages/modules/devices/solis/solis/inverter.py +++ b/packages/modules/devices/solis/solis/inverter.py @@ -15,7 +15,7 @@ class KwargsDict(TypedDict): client: ModbusTcpClient_ - version: SolisVersion + device_id: int class SolisInverter: @@ -25,21 +25,21 @@ def __init__(self, component_config: SolisInverterSetup, **kwargs: Any) -> None: def initialize(self) -> None: self.client: ModbusTcpClient_ = self.kwargs['client'] - self.version: SolisVersion = self.kwargs['version'] - self.sim_counter = SimCounter(self.component_config.id) + self.sim_counter = SimCounter(self.kwargs['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: unit = self.component_config.configuration.modbus_id + version = SolisVersion(self.component_config.configuration.version) - if self.version == SolisVersion.inverter: + if version == SolisVersion.inverter: # Für Stringwechselrichter -1 bei Modbus Registers power = self.client.read_input_registers(3004, ModbusDataType.INT_32, unit=unit) * -1 dc_power = self.client.read_input_registers(3006, ModbusDataType.UINT_32, unit=unit) * -1 currents = self.client.read_input_registers(3036, [ModbusDataType.UINT_16]*3, unit=unit) - elif self.version in (SolisVersion.hybrid, SolisVersion.hybrid_s): + elif version in (SolisVersion.hybrid, SolisVersion.hybrid_s): power = self.client.read_input_registers(33079, ModbusDataType.INT_32, unit=unit) * -1 dc_power = self.client.read_input_registers(33057, ModbusDataType.UINT_32, unit=unit) * -1 currents = self.client.read_input_registers(33076, [ModbusDataType.UINT_16]*3, unit=unit) @@ -47,7 +47,7 @@ def update(self) -> None: currents = [value * -0.1 for value in currents] self.peak_filter.check_values(power) - imported, exported = self.sim_counter.sim_count(power, dc_power) + imported, exported = self.sim_counter.sim_count(power) inverter_state = InverterState( power=power, dc_power=dc_power, From 12797aaee3ad1666de7a7c9436fba6596c538a6f Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 3 Jun 2026 14:41:18 +0200 Subject: [PATCH 12/22] Refactor SolisCounter to remove version from kwargs Removed version attribute from kwargs and refactored its usage in initialize and update methods. --- packages/modules/devices/solis/solis/counter.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/modules/devices/solis/solis/counter.py b/packages/modules/devices/solis/solis/counter.py index e5a17bf559..664898604e 100644 --- a/packages/modules/devices/solis/solis/counter.py +++ b/packages/modules/devices/solis/solis/counter.py @@ -13,7 +13,6 @@ class KwargsDict(TypedDict): client: ModbusTcpClient_ - version: SolisVersion class SolisCounter: @@ -23,18 +22,16 @@ def __init__(self, component_config: SolisCounterSetup, **kwargs: Any) -> None: def initialize(self) -> None: self.client: ModbusTcpClient_ = self.kwargs['client'] - self.version: SolisVersion = 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 + version = SolisVersion(self.component_config.configuration.version) register_offset = 30000 - if self.version == SolisVersion.inverter: + if version == SolisVersion.inverter: register_offset = -1 power = self.client.read_input_registers(3263 + register_offset, ModbusDataType.INT_32, unit=unit) * -1 From 989cd4bade556ba7c1d00150fca949c6646f873a Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 3 Jun 2026 14:41:44 +0200 Subject: [PATCH 13/22] Refactor peak_filter usage in bat.py --- packages/modules/devices/solis/solis/bat.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/modules/devices/solis/solis/bat.py b/packages/modules/devices/solis/solis/bat.py index b62f12d339..6359970391 100644 --- a/packages/modules/devices/solis/solis/bat.py +++ b/packages/modules/devices/solis/solis/bat.py @@ -43,8 +43,7 @@ def update(self) -> None: currents = [bat_current / 3] * 3 - self.peak_filter.check_values(power) - imported, exported = self.sim_counter.sim_count(power) + imported, exported = self.peak_filter.check_values(power, imported, exported) bat_state = BatState( power=power, soc=soc, From c3b47a598e2ba645c17dddce437337f5b32a95e9 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 3 Jun 2026 14:42:05 +0200 Subject: [PATCH 14/22] Refactor peak_filter usage in inverter.py --- packages/modules/devices/solis/solis/inverter.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/modules/devices/solis/solis/inverter.py b/packages/modules/devices/solis/solis/inverter.py index 1802a03ea8..eea8904544 100644 --- a/packages/modules/devices/solis/solis/inverter.py +++ b/packages/modules/devices/solis/solis/inverter.py @@ -46,8 +46,7 @@ def update(self) -> None: currents = [value * -0.1 for value in currents] - self.peak_filter.check_values(power) - imported, exported = self.sim_counter.sim_count(power) + imported, exported = self.peak_filter.check_values(power, imported, exported) inverter_state = InverterState( power=power, dc_power=dc_power, From a98a8c710cb9ab46bfb5b4355718423ea85a05e4 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 3 Jun 2026 14:44:51 +0200 Subject: [PATCH 15/22] Add device_id to component creation functions Updated component creation functions to include device_id. --- packages/modules/devices/solis/solis/device.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/modules/devices/solis/solis/device.py b/packages/modules/devices/solis/solis/device.py index 6b52c6a3cc..73084b516f 100644 --- a/packages/modules/devices/solis/solis/device.py +++ b/packages/modules/devices/solis/solis/device.py @@ -10,7 +10,6 @@ from modules.devices.solis.solis.counter import SolisCounter from modules.devices.solis.solis.inverter import SolisInverter from modules.devices.solis.solis.config import Solis, SolisBatSetup, SolisCounterSetup, SolisInverterSetup -from modules.devices.solis.solis.version import SolisVersion log = logging.getLogger(__name__) @@ -20,17 +19,15 @@ def create_device(device_config: Solis): def create_bat_component(component_config: SolisBatSetup): nonlocal client - return SolisBat(component_config, client=client) - + return SolisBat(component_config, client=client, device_id=device_config.id) + def create_counter_component(component_config: SolisCounterSetup): nonlocal client - return SolisCounter(component_config, version=SolisVersion(device_config.configuration.version), client=client) - + return SolisCounter(component_config, client=client) + def create_inverter_component(component_config: SolisInverterSetup): nonlocal client - return SolisInverter(component_config, - version=SolisVersion(device_config.configuration.version), - client=client) + return SolisInverter(component_config, client=client, device_id=device_config.id) def update_components(components: Iterable[Union[SolisBat, SolisCounter, SolisInverter]]): nonlocal client From 56674ea7cdc65ef3b9494f05289b53e113c1bfbb Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 3 Jun 2026 14:46:47 +0200 Subject: [PATCH 16/22] flake8 --- packages/modules/devices/solis/solis/device.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/solis/solis/device.py b/packages/modules/devices/solis/solis/device.py index 73084b516f..0b75d71c0c 100644 --- a/packages/modules/devices/solis/solis/device.py +++ b/packages/modules/devices/solis/solis/device.py @@ -20,11 +20,11 @@ def create_device(device_config: Solis): def create_bat_component(component_config: SolisBatSetup): nonlocal client return SolisBat(component_config, client=client, device_id=device_config.id) - + def create_counter_component(component_config: SolisCounterSetup): nonlocal client return SolisCounter(component_config, client=client) - + def create_inverter_component(component_config: SolisInverterSetup): nonlocal client return SolisInverter(component_config, client=client, device_id=device_config.id) From 47421817b92cd728d441d49f799978fc3095d095 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 3 Jun 2026 14:49:52 +0200 Subject: [PATCH 17/22] flake8 --- packages/modules/devices/solis/solis/bat.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/modules/devices/solis/solis/bat.py b/packages/modules/devices/solis/solis/bat.py index 6359970391..b62f12d339 100644 --- a/packages/modules/devices/solis/solis/bat.py +++ b/packages/modules/devices/solis/solis/bat.py @@ -43,7 +43,8 @@ def update(self) -> None: currents = [bat_current / 3] * 3 - imported, exported = self.peak_filter.check_values(power, imported, exported) + self.peak_filter.check_values(power) + imported, exported = self.sim_counter.sim_count(power) bat_state = BatState( power=power, soc=soc, From 247a996e4175523db95ec760f7780e690e5087fa Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 3 Jun 2026 14:50:25 +0200 Subject: [PATCH 18/22] flake8 --- packages/modules/devices/solis/solis/inverter.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/modules/devices/solis/solis/inverter.py b/packages/modules/devices/solis/solis/inverter.py index eea8904544..1802a03ea8 100644 --- a/packages/modules/devices/solis/solis/inverter.py +++ b/packages/modules/devices/solis/solis/inverter.py @@ -46,7 +46,8 @@ def update(self) -> None: currents = [value * -0.1 for value in currents] - imported, exported = self.peak_filter.check_values(power, imported, exported) + self.peak_filter.check_values(power) + imported, exported = self.sim_counter.sim_count(power) inverter_state = InverterState( power=power, dc_power=dc_power, From 3c44ff2bf41697d5c04efe5730fbf366ffe38f5f Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Mon, 8 Jun 2026 11:11:08 +0200 Subject: [PATCH 19/22] fix: version setting in device config --- packages/modules/devices/solis/solis/counter.py | 5 +++-- packages/modules/devices/solis/solis/device.py | 4 ++-- packages/modules/devices/solis/solis/inverter.py | 7 ++++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/modules/devices/solis/solis/counter.py b/packages/modules/devices/solis/solis/counter.py index 664898604e..a33feff386 100644 --- a/packages/modules/devices/solis/solis/counter.py +++ b/packages/modules/devices/solis/solis/counter.py @@ -13,6 +13,7 @@ class KwargsDict(TypedDict): client: ModbusTcpClient_ + version: SolisVersion class SolisCounter: @@ -22,16 +23,16 @@ def __init__(self, component_config: SolisCounterSetup, **kwargs: Any) -> None: def initialize(self) -> None: self.client: ModbusTcpClient_ = self.kwargs['client'] + self.version: SolisVersion = 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.peak_filter = PeakFilter(ComponentType.COUNTER, self.component_config.id, self.fault_state) def update(self): unit = self.component_config.configuration.modbus_id - version = SolisVersion(self.component_config.configuration.version) register_offset = 30000 - if version == SolisVersion.inverter: + if self.version == SolisVersion.inverter: register_offset = -1 power = self.client.read_input_registers(3263 + register_offset, ModbusDataType.INT_32, unit=unit) * -1 diff --git a/packages/modules/devices/solis/solis/device.py b/packages/modules/devices/solis/solis/device.py index 0b75d71c0c..df636f0ee5 100644 --- a/packages/modules/devices/solis/solis/device.py +++ b/packages/modules/devices/solis/solis/device.py @@ -23,11 +23,11 @@ def create_bat_component(component_config: SolisBatSetup): def create_counter_component(component_config: SolisCounterSetup): nonlocal client - return SolisCounter(component_config, client=client) + return SolisCounter(component_config, client=client, version=device_config.configuration.version) def create_inverter_component(component_config: SolisInverterSetup): nonlocal client - return SolisInverter(component_config, client=client, device_id=device_config.id) + return SolisInverter(component_config, client=client, device_id=device_config.id, version=device_config.configuration.version) def update_components(components: Iterable[Union[SolisBat, SolisCounter, SolisInverter]]): nonlocal client diff --git a/packages/modules/devices/solis/solis/inverter.py b/packages/modules/devices/solis/solis/inverter.py index 1802a03ea8..078e9a9903 100644 --- a/packages/modules/devices/solis/solis/inverter.py +++ b/packages/modules/devices/solis/solis/inverter.py @@ -16,6 +16,7 @@ class KwargsDict(TypedDict): client: ModbusTcpClient_ device_id: int + version: SolisVersion class SolisInverter: @@ -25,6 +26,7 @@ def __init__(self, component_config: SolisInverterSetup, **kwargs: Any) -> None: def initialize(self) -> None: self.client: ModbusTcpClient_ = self.kwargs['client'] + self.version: SolisVersion = self.kwargs['version'] self.sim_counter = SimCounter(self.kwargs['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)) @@ -32,14 +34,13 @@ def initialize(self) -> None: def update(self) -> None: unit = self.component_config.configuration.modbus_id - version = SolisVersion(self.component_config.configuration.version) - if version == SolisVersion.inverter: + if self.version == SolisVersion.inverter: # Für Stringwechselrichter -1 bei Modbus Registers power = self.client.read_input_registers(3004, ModbusDataType.INT_32, unit=unit) * -1 dc_power = self.client.read_input_registers(3006, ModbusDataType.UINT_32, unit=unit) * -1 currents = self.client.read_input_registers(3036, [ModbusDataType.UINT_16]*3, unit=unit) - elif version in (SolisVersion.hybrid, SolisVersion.hybrid_s): + elif self.version in (SolisVersion.hybrid, SolisVersion.hybrid_s): power = self.client.read_input_registers(33079, ModbusDataType.INT_32, unit=unit) * -1 dc_power = self.client.read_input_registers(33057, ModbusDataType.UINT_32, unit=unit) * -1 currents = self.client.read_input_registers(33076, [ModbusDataType.UINT_16]*3, unit=unit) From 40a1e42314492725c3dd8a20f3f53a0ed0ba3f6e Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Mon, 8 Jun 2026 11:24:39 +0200 Subject: [PATCH 20/22] flake8 --- packages/modules/devices/solis/solis/device.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/modules/devices/solis/solis/device.py b/packages/modules/devices/solis/solis/device.py index df636f0ee5..fbb51349e2 100644 --- a/packages/modules/devices/solis/solis/device.py +++ b/packages/modules/devices/solis/solis/device.py @@ -27,7 +27,10 @@ def create_counter_component(component_config: SolisCounterSetup): def create_inverter_component(component_config: SolisInverterSetup): nonlocal client - return SolisInverter(component_config, client=client, device_id=device_config.id, version=device_config.configuration.version) + return SolisInverter(component_config, + client=client, + device_id=device_config.id, + version=device_config.configuration.version) def update_components(components: Iterable[Union[SolisBat, SolisCounter, SolisInverter]]): nonlocal client From 3e256af1aee790c92633b27eed578ce84560d1e0 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Mon, 8 Jun 2026 11:33:21 +0200 Subject: [PATCH 21/22] fix version for bat --- packages/modules/devices/solis/solis/bat.py | 4 +++- packages/modules/devices/solis/solis/device.py | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/solis/solis/bat.py b/packages/modules/devices/solis/solis/bat.py index b62f12d339..9731b2a98f 100644 --- a/packages/modules/devices/solis/solis/bat.py +++ b/packages/modules/devices/solis/solis/bat.py @@ -20,6 +20,7 @@ class KwargsDict(TypedDict): client: ModbusTcpClient_ device_id: int + version: SolisVersion class SolisBat(AbstractBat): @@ -29,6 +30,7 @@ def __init__(self, component_config: SolisBatSetup, **kwargs: Any) -> None: def initialize(self) -> None: self.client: ModbusTcpClient_ = self.kwargs['client'] + self.version: SolisVersion = self.kwargs['version'] self.sim_counter = SimCounter(self.kwargs['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)) @@ -77,7 +79,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: def power_limit_controllable(self) -> bool: # Nur die S-Serie sollte die Speichersteuerung können - return SolisVersion(self.component_config.configuration.version) == SolisVersion.hybrid_s + return self.version == SolisVersion.hybrid_s component_descriptor = ComponentDescriptor(configuration_factory=SolisBatSetup) diff --git a/packages/modules/devices/solis/solis/device.py b/packages/modules/devices/solis/solis/device.py index fbb51349e2..969c325b58 100644 --- a/packages/modules/devices/solis/solis/device.py +++ b/packages/modules/devices/solis/solis/device.py @@ -19,7 +19,10 @@ def create_device(device_config: Solis): def create_bat_component(component_config: SolisBatSetup): nonlocal client - return SolisBat(component_config, client=client, device_id=device_config.id) + return SolisBat(component_config, + client=client, + device_id=device_config.id, + version=device_config.configuration.version) def create_counter_component(component_config: SolisCounterSetup): nonlocal client From 4cf88971c7b8ea93de58613f8b78f8065f1bef2b Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Mon, 8 Jun 2026 11:45:19 +0200 Subject: [PATCH 22/22] Fix power limit calculation for battery control --- packages/modules/devices/solis/solis/bat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/devices/solis/solis/bat.py b/packages/modules/devices/solis/solis/bat.py index 9731b2a98f..be88ab4059 100644 --- a/packages/modules/devices/solis/solis/bat.py +++ b/packages/modules/devices/solis/solis/bat.py @@ -68,7 +68,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: log.debug("Aktive Batteriesteuerung. Batterie wird auf Stop gesetzt und nicht geladen/entladen") elif power_limit < 0: self.client.write_register(43135, 2, data_type=ModbusDataType.UINT_16, unit=unit) - power_value = int(power_limit / 10) + power_value = int(abs(power_limit) / 10) self.client.write_register(43129, power_value, data_type=ModbusDataType.UINT_16, unit=unit) log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W entladen für den Hausverbrauch") elif power_limit > 0: