From 91ac443a280c014b04874941e133966edaedf916 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 28 May 2025 21:59:02 +0200 Subject: [PATCH 01/11] Add inverter currents --- packages/modules/devices/sungrow/sungrow/inverter.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/modules/devices/sungrow/sungrow/inverter.py b/packages/modules/devices/sungrow/sungrow/inverter.py index fe30c6f798..9ab6359fd1 100644 --- a/packages/modules/devices/sungrow/sungrow/inverter.py +++ b/packages/modules/devices/sungrow/sungrow/inverter.py @@ -43,11 +43,17 @@ def update(self) -> float: dc_power = self.__tcp_client.read_input_registers(5016, ModbusDataType.UINT_32, wordorder=Endian.Little, unit=unit) * -1 - _, exported = self.sim_counter.sim_count(power) + currents_raw = self.__tcp_client.read_input_registers(13030, ModbusDataType.INT_16, count=3, + wordorder=Endian.Little, unit=unit) + currents = [value * 0.1 for value in currents_raw] + + imported, exported = self.sim_counter.sim_count(power) inverter_state = InverterState( power=power, dc_power=dc_power, + currents=currents, + imported=imported, exported=exported ) self.store.set(inverter_state) From b5ad42d7ee7190d778985f5306da2c9e579da1cc Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 29 May 2025 17:47:58 +0200 Subject: [PATCH 02/11] Add SMA inverter currents for default Sunny Boy --- packages/modules/devices/sma/sma_sunny_boy/inverter.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/modules/devices/sma/sma_sunny_boy/inverter.py b/packages/modules/devices/sma/sma_sunny_boy/inverter.py index a724caa63d..208306608b 100644 --- a/packages/modules/devices/sma/sma_sunny_boy/inverter.py +++ b/packages/modules/devices/sma/sma_sunny_boy/inverter.py @@ -57,6 +57,8 @@ def read(self) -> InverterState: # Leistung DC an Eingang 1 und 2 dc_power = (self.tcp_client.read_holding_registers(30773, ModbusDataType.INT_32, unit=unit) + self.tcp_client.read_holding_registers(30961, ModbusDataType.INT_32, unit=unit)) + currents_raw = self.tcp_client.read_holding_registers(30977, ModbusDataType.INT_32, count=3, unit=unit) + currents = [val / 1000 for val in currents_raw] elif self.component_config.configuration.version == SmaInverterVersion.core2: # AC Wirkleistung über alle Phasen (W) [Pac] power_total = self.tcp_client.read_holding_registers(40084, ModbusDataType.INT_16, unit=unit) * 10 @@ -89,6 +91,7 @@ def read(self) -> InverterState: inverter_state = InverterState( power=power_total * -1, dc_power=dc_power * -1, + currents=currents, exported=energy, imported=imported ) From 90633036b0fac5fbed6d344c276e0d57fc22965d Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 29 May 2025 18:00:01 +0200 Subject: [PATCH 03/11] Add Bat currents --- packages/modules/devices/sungrow/sungrow/bat.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/modules/devices/sungrow/sungrow/bat.py b/packages/modules/devices/sungrow/sungrow/bat.py index fc8cf0c42f..31a104c688 100644 --- a/packages/modules/devices/sungrow/sungrow/bat.py +++ b/packages/modules/devices/sungrow/sungrow/bat.py @@ -37,6 +37,9 @@ def initialize(self) -> None: def update(self) -> None: unit = self.device_config.configuration.modbus_id soc = int(self.__tcp_client.read_input_registers(13022, ModbusDataType.UINT_16, unit=unit) / 10) + # Es gibt nur einen DC Strom der Batterie, dieser wird daher durch 3 geteilt um die Phasenströme gleich aufzuteilen + bat_current = self.__tcp_client.read_input_registers(13020, ModbusDataType.INT_16, unit=unit) + phase_currents = [bat_current / 3.0] * 3 if ( Firmware(self.device_config.configuration.firmware) == Firmware.v2 @@ -66,6 +69,7 @@ def update(self) -> None: bat_state = BatState( power=bat_power, soc=soc, + currents=phase_currents, imported=imported, exported=exported ) From 4a827ffaf645cf28d13023670b1dbeded6517fe1 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 11 Jun 2025 12:24:12 +0200 Subject: [PATCH 04/11] Correct Modbus type --- packages/modules/devices/sungrow/sungrow/inverter.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/modules/devices/sungrow/sungrow/inverter.py b/packages/modules/devices/sungrow/sungrow/inverter.py index 9ab6359fd1..bc71878f28 100644 --- a/packages/modules/devices/sungrow/sungrow/inverter.py +++ b/packages/modules/devices/sungrow/sungrow/inverter.py @@ -43,8 +43,7 @@ def update(self) -> float: dc_power = self.__tcp_client.read_input_registers(5016, ModbusDataType.UINT_32, wordorder=Endian.Little, unit=unit) * -1 - currents_raw = self.__tcp_client.read_input_registers(13030, ModbusDataType.INT_16, count=3, - wordorder=Endian.Little, unit=unit) + currents_raw = self.__tcp_client.read_input_registers(13030, ModbusDataType.INT_16, 3, unit=unit) currents = [value * 0.1 for value in currents_raw] imported, exported = self.sim_counter.sim_count(power) From 592c0d73f90c2e875f6d1c827d3637054380835a Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 11 Jun 2025 12:42:41 +0200 Subject: [PATCH 05/11] Read all phases --- packages/modules/devices/sma/sma_sunny_boy/inverter.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/sma/sma_sunny_boy/inverter.py b/packages/modules/devices/sma/sma_sunny_boy/inverter.py index 208306608b..89393d8706 100644 --- a/packages/modules/devices/sma/sma_sunny_boy/inverter.py +++ b/packages/modules/devices/sma/sma_sunny_boy/inverter.py @@ -57,8 +57,10 @@ def read(self) -> InverterState: # Leistung DC an Eingang 1 und 2 dc_power = (self.tcp_client.read_holding_registers(30773, ModbusDataType.INT_32, unit=unit) + self.tcp_client.read_holding_registers(30961, ModbusDataType.INT_32, unit=unit)) - currents_raw = self.tcp_client.read_holding_registers(30977, ModbusDataType.INT_32, count=3, unit=unit) - currents = [val / 1000 for val in currents_raw] + current_L1 = self.tcp_client.read_holding_registers(30977, ModbusDataType.INT_32, unit=unit) + current_L2 = self.tcp_client.read_holding_registers(30979, ModbusDataType.INT_32, unit=unit) + current_L3 = self.tcp_client.read_holding_registers(30981, ModbusDataType.INT_32, unit=unit) + currents = [current_L1 / 1000, current_L2 / 1000, current_L3 / 1000] elif self.component_config.configuration.version == SmaInverterVersion.core2: # AC Wirkleistung über alle Phasen (W) [Pac] power_total = self.tcp_client.read_holding_registers(40084, ModbusDataType.INT_16, unit=unit) * 10 From 77f6c1aaa528d0e1c47ca0f96437ccae8940c649 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 11 Jun 2025 12:44:03 +0200 Subject: [PATCH 06/11] Read all phases --- packages/modules/devices/sungrow/sungrow/inverter.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/sungrow/sungrow/inverter.py b/packages/modules/devices/sungrow/sungrow/inverter.py index bc71878f28..4f8a14f963 100644 --- a/packages/modules/devices/sungrow/sungrow/inverter.py +++ b/packages/modules/devices/sungrow/sungrow/inverter.py @@ -43,8 +43,10 @@ def update(self) -> float: dc_power = self.__tcp_client.read_input_registers(5016, ModbusDataType.UINT_32, wordorder=Endian.Little, unit=unit) * -1 - currents_raw = self.__tcp_client.read_input_registers(13030, ModbusDataType.INT_16, 3, unit=unit) - currents = [value * 0.1 for value in currents_raw] + current_L1 = self.__tcp_client.read_input_registers(13030, ModbusDataType.INT_16, unit=unit) * 0.1 + current_L2 = self.__tcp_client.read_input_registers(13031, ModbusDataType.INT_16, unit=unit) * 0.1 + current_L3 = self.__tcp_client.read_input_registers(13032, ModbusDataType.INT_16, unit=unit) * 0.1 + currents = [current_L1, current_L2, current_L3] imported, exported = self.sim_counter.sim_count(power) From dfe30cb1686503d40cc42aa6d059dbec092406ae Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 11 Jun 2025 21:14:20 +0200 Subject: [PATCH 07/11] Fix factor for current --- packages/modules/devices/sungrow/sungrow/bat.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/modules/devices/sungrow/sungrow/bat.py b/packages/modules/devices/sungrow/sungrow/bat.py index 9d299a2cdf..3aab3de990 100644 --- a/packages/modules/devices/sungrow/sungrow/bat.py +++ b/packages/modules/devices/sungrow/sungrow/bat.py @@ -38,8 +38,8 @@ def update(self) -> None: unit = self.device_config.configuration.modbus_id soc = int(self.__tcp_client.read_input_registers(13022, ModbusDataType.UINT_16, unit=unit) / 10) # Es gibt nur einen DC Strom der Batterie, dieser wird daher durch 3 geteilt um die Phasenströme gleich aufzuteilen - bat_current = self.__tcp_client.read_input_registers(13020, ModbusDataType.INT_16, unit=unit) - phase_currents = [bat_current / 3.0] * 3 + bat_current = self.__tcp_client.read_input_registers(13020, ModbusDataType.INT_16, unit=unit) * -0.1 + currents = [bat_current / 3] * 3 if ( Firmware(self.device_config.configuration.firmware) == Firmware.v2 @@ -69,7 +69,7 @@ def update(self) -> None: bat_state = BatState( power=bat_power, soc=soc, - currents=phase_currents, + currents=currents, imported=imported, exported=exported ) From a175c3308cd747551d56de0d8beb936dc4ed8f48 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 11 Jun 2025 21:15:04 +0200 Subject: [PATCH 08/11] Fix sign --- packages/modules/devices/sungrow/sungrow/inverter.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/modules/devices/sungrow/sungrow/inverter.py b/packages/modules/devices/sungrow/sungrow/inverter.py index 4f8a14f963..84e9ac8329 100644 --- a/packages/modules/devices/sungrow/sungrow/inverter.py +++ b/packages/modules/devices/sungrow/sungrow/inverter.py @@ -43,9 +43,9 @@ def update(self) -> float: dc_power = self.__tcp_client.read_input_registers(5016, ModbusDataType.UINT_32, wordorder=Endian.Little, unit=unit) * -1 - current_L1 = self.__tcp_client.read_input_registers(13030, ModbusDataType.INT_16, unit=unit) * 0.1 - current_L2 = self.__tcp_client.read_input_registers(13031, ModbusDataType.INT_16, unit=unit) * 0.1 - current_L3 = self.__tcp_client.read_input_registers(13032, ModbusDataType.INT_16, unit=unit) * 0.1 + current_L1 = self.__tcp_client.read_input_registers(13030, ModbusDataType.INT_16, unit=unit) * -0.1 + current_L2 = self.__tcp_client.read_input_registers(13031, ModbusDataType.INT_16, unit=unit) * -0.1 + current_L3 = self.__tcp_client.read_input_registers(13032, ModbusDataType.INT_16, unit=unit) * -0.1 currents = [current_L1, current_L2, current_L3] imported, exported = self.sim_counter.sim_count(power) From b1858fd3e31f59f30bec293016beda58fc6a4c1d Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 11 Jun 2025 21:15:58 +0200 Subject: [PATCH 09/11] Fix sign --- packages/modules/devices/sma/sma_sunny_boy/inverter.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/modules/devices/sma/sma_sunny_boy/inverter.py b/packages/modules/devices/sma/sma_sunny_boy/inverter.py index 89393d8706..28968aaa86 100644 --- a/packages/modules/devices/sma/sma_sunny_boy/inverter.py +++ b/packages/modules/devices/sma/sma_sunny_boy/inverter.py @@ -57,9 +57,9 @@ def read(self) -> InverterState: # Leistung DC an Eingang 1 und 2 dc_power = (self.tcp_client.read_holding_registers(30773, ModbusDataType.INT_32, unit=unit) + self.tcp_client.read_holding_registers(30961, ModbusDataType.INT_32, unit=unit)) - current_L1 = self.tcp_client.read_holding_registers(30977, ModbusDataType.INT_32, unit=unit) - current_L2 = self.tcp_client.read_holding_registers(30979, ModbusDataType.INT_32, unit=unit) - current_L3 = self.tcp_client.read_holding_registers(30981, ModbusDataType.INT_32, unit=unit) + current_L1 = self.tcp_client.read_holding_registers(30977, ModbusDataType.INT_32, unit=unit) * -1 + current_L2 = self.tcp_client.read_holding_registers(30979, ModbusDataType.INT_32, unit=unit) * -1 + current_L3 = self.tcp_client.read_holding_registers(30981, ModbusDataType.INT_32, unit=unit) * -1 currents = [current_L1 / 1000, current_L2 / 1000, current_L3 / 1000] elif self.component_config.configuration.version == SmaInverterVersion.core2: # AC Wirkleistung über alle Phasen (W) [Pac] From 4226ec28b49c7b404b4d46ed7defa1dd2b6eaf8c Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Wed, 11 Jun 2025 21:57:02 +0200 Subject: [PATCH 10/11] Fix currents for NAN --- packages/modules/devices/sma/sma_sunny_boy/inverter.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/modules/devices/sma/sma_sunny_boy/inverter.py b/packages/modules/devices/sma/sma_sunny_boy/inverter.py index 28968aaa86..5c3b206d0d 100644 --- a/packages/modules/devices/sma/sma_sunny_boy/inverter.py +++ b/packages/modules/devices/sma/sma_sunny_boy/inverter.py @@ -80,6 +80,8 @@ def read(self) -> InverterState: raise ValueError("Unbekannte Version "+str(self.component_config.configuration.version)) if power_total == self.SMA_INT32_NAN or power_total == self.SMA_NAN: power_total = 0 + # Bei keiner AC Wirkleistung müssen auch die Ströme der Phasen 0 sein. + currents = [0, 0, 0] if energy == self.SMA_UINT32_NAN: raise ValueError( From c1917cbeea12dc10f0bb504be7a72d23055f884d Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Fri, 13 Jun 2025 08:24:50 +0200 Subject: [PATCH 11/11] Fixed Flake8 --- packages/modules/devices/sungrow/sungrow/bat.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/modules/devices/sungrow/sungrow/bat.py b/packages/modules/devices/sungrow/sungrow/bat.py index 3aab3de990..b2c11f69f1 100644 --- a/packages/modules/devices/sungrow/sungrow/bat.py +++ b/packages/modules/devices/sungrow/sungrow/bat.py @@ -36,10 +36,11 @@ def initialize(self) -> None: def update(self) -> None: unit = self.device_config.configuration.modbus_id - soc = int(self.__tcp_client.read_input_registers(13022, ModbusDataType.UINT_16, unit=unit) / 10) - # Es gibt nur einen DC Strom der Batterie, dieser wird daher durch 3 geteilt um die Phasenströme gleich aufzuteilen + soc = int( + self.__tcp_client.read_input_registers(13022, ModbusDataType.UINT_16, unit=unit) / 10) + # Es gibt nur einen DC Strom der Batterie, daher Aufteilen auf 3 Phasenströme bat_current = self.__tcp_client.read_input_registers(13020, ModbusDataType.INT_16, unit=unit) * -0.1 - currents = [bat_current / 3] * 3 + currents = [bat_current / 3] * 3 if ( Firmware(self.device_config.configuration.firmware) == Firmware.v2