diff --git a/packages/modules/devices/sma/sma_sunny_boy/bat.py b/packages/modules/devices/sma/sma_sunny_boy/bat.py index da50bc7673..99624e1295 100644 --- a/packages/modules/devices/sma/sma_sunny_boy/bat.py +++ b/packages/modules/devices/sma/sma_sunny_boy/bat.py @@ -12,6 +12,8 @@ class SunnyBoyBat(AbstractBat): + SMA_UINT_64_NAN = 0xFFFFFFFFFFFFFFFF # SMA uses this value to represent NaN + def __init__(self, device_id: int, component_config: Union[Dict, SmaSunnyBoyBatSetup], @@ -35,6 +37,11 @@ def read(self) -> BatState: exported = self.__tcp_client.read_holding_registers(31401, ModbusDataType.UINT_64, unit=unit) imported = self.__tcp_client.read_holding_registers(31397, ModbusDataType.UINT_64, unit=unit) + if exported == self.SMA_UINT_64_NAN or imported == self.SMA_UINT_64_NAN: + raise ValueError(f'Batterie lieferte nicht plausible Werte. Export: {exported}, Import: {imported}. ', + 'Sobald die Batterie geladen/entladen wird sollte sich dieser Wert ändern, ', + 'andernfalls kann ein Defekt vorliegen.') + return BatState( power=power, soc=soc, diff --git a/packages/modules/devices/sma/sma_sunny_boy/bat_smart_energy.py b/packages/modules/devices/sma/sma_sunny_boy/bat_smart_energy.py index b80e0864d7..b5b5d61845 100644 --- a/packages/modules/devices/sma/sma_sunny_boy/bat_smart_energy.py +++ b/packages/modules/devices/sma/sma_sunny_boy/bat_smart_energy.py @@ -13,7 +13,8 @@ class SunnyBoySmartEnergyBat(AbstractBat): - SMA_INT32_NAN = 0xFFFFFFFF # SMA uses this value to represent NaN + SMA_UINT32_NAN = 0xFFFFFFFF # SMA uses this value to represent NaN + SMA_UINT_64_NAN = 0xFFFFFFFFFFFFFFFF # SMA uses this value to represent NaN def __init__(self, device_id: int, @@ -36,7 +37,7 @@ def read(self) -> BatState: current = self.__tcp_client.read_holding_registers(30843, ModbusDataType.INT_32, unit=unit)/-1000 voltage = self.__tcp_client.read_holding_registers(30851, ModbusDataType.INT_32, unit=unit)/100 - if soc == self.SMA_INT32_NAN: + if soc == self.SMA_UINT32_NAN: # If the storage is empty and nothing is produced on the DC side, the inverter does not supply any values. soc = 0 power = 0 @@ -45,6 +46,11 @@ def read(self) -> BatState: exported = self.__tcp_client.read_holding_registers(31401, ModbusDataType.UINT_64, unit=3) imported = self.__tcp_client.read_holding_registers(31397, ModbusDataType.UINT_64, unit=3) + if exported == self.SMA_UINT_64_NAN or imported == self.SMA_UINT_64_NAN: + raise ValueError(f'Batterie lieferte nicht plausible Werte. Export: {exported}, Import: {imported}. ', + 'Sobald die Batterie geladen/entladen wird sollte sich dieser Wert ändern, ', + 'andernfalls kann ein Defekt vorliegen.') + return BatState( power=power, soc=soc, diff --git a/packages/modules/devices/sma/sma_sunny_boy/inverter.py b/packages/modules/devices/sma/sma_sunny_boy/inverter.py index ee2a81b4c9..8685fd7410 100644 --- a/packages/modules/devices/sma/sma_sunny_boy/inverter.py +++ b/packages/modules/devices/sma/sma_sunny_boy/inverter.py @@ -19,6 +19,7 @@ class SmaSunnyBoyInverter(AbstractInverter): SMA_INT32_NAN = -0x80000000 # SMA uses this value to represent NaN + SMA_UINT32_NAN = 0xFFFFFFFF # SMA uses this value to represent NaN SMA_NAN = -0xC000 def __init__(self, @@ -68,6 +69,13 @@ def read(self) -> InverterState: if power_total == self.SMA_INT32_NAN or power_total == self.SMA_NAN: power_total = 0 + if energy == self.SMA_UINT32_NAN: + raise ValueError( + f'Wechselrichter lieferte nicht plausiblen Zählerstand: {energy}. ' + 'Sobald PV Ertrag vorhanden ist sollte sich dieser Wert ändern, ' + 'andernfalls kann ein Defekt vorliegen.' + ) + inverter_state = InverterState( power=power_total * -1, dc_power=dc_power * -1,