@@ -410,6 +410,7 @@ def read_all_data(self) -> Optional[GrowattData]:
410410 has_base_range = any (0 <= addr < 1000 for addr in addresses )
411411 has_storage_range = any (1000 <= addr < 2000 for addr in addresses )
412412 has_3000_range = any (3000 <= addr < 4000 for addr in addresses )
413+ has_31000_range = any (31000 <= addr < 32000 for addr in addresses )
413414
414415 # Read base range (0-124) if needed - SPH models
415416 if has_base_range :
@@ -435,18 +436,30 @@ def read_all_data(self) -> Optional[GrowattData]:
435436 for i , value in enumerate (registers ):
436437 self ._register_cache [1000 + i ] = value
437438
438- # Read 3000 range if needed - MIN models
439+ # Read 3000 range if needed - MIN/MOD models
439440 if has_3000_range :
440441 logger .debug ("Reading 3000 range (3000-3110)" )
441442 registers = self .read_input_registers (3000 , 111 )
442443 if registers is None :
443444 logger .error ("Failed to read main input register block" )
444445 return None
445-
446+
446447 # Populate cache
447448 for i , value in enumerate (registers ):
448449 self ._register_cache [3000 + i ] = value
449-
450+
451+ # Read 31000 range if needed - MOD battery/BMS data
452+ if has_31000_range :
453+ logger .debug ("Reading 31000 range (31100-31299)" )
454+ registers = self .read_input_registers (31100 , 200 )
455+ if registers is None :
456+ logger .warning ("Failed to read 31000 register block (MOD battery data may be unavailable)" )
457+ # Don't return None - continue with what we have
458+ else :
459+ # Populate cache
460+ for i , value in enumerate (registers ):
461+ self ._register_cache [31100 + i ] = value
462+
450463 # Now extract values using the register map
451464 try :
452465 # Status
0 commit comments