Skip to content

Commit 2b9e679

Browse files
authored
Merge pull request #29 from 0xAHA/claude/growatt-inverter-emulator-01CoSswioNUhF3Kh2jHuEDZG
Fix: Use dynamic register ranges instead of hardcoded 251 (fixes MIN …
2 parents af7ff9e + c4e44d2 commit 2b9e679

1 file changed

Lines changed: 14 additions & 7 deletions

File tree

custom_components/growatt_modbus/growatt_modbus.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -454,9 +454,11 @@ def read_all_data(self) -> Optional[GrowattData]:
454454

455455
# Read 3000 range if needed - MIN/MOD models
456456
if has_3000_range:
457-
logger.debug("Reading 3000 range (3000-3250)")
458-
# Extended range to cover MOD battery registers up to 3250
459-
registers = self.read_input_registers(3000, 251)
457+
# Find the highest register in the 3000 range
458+
max_3000_addr = max([addr for addr in addresses if 3000 <= addr < 4000])
459+
count_3000 = (max_3000_addr - 3000) + 1
460+
logger.debug(f"Reading 3000 range (3000-{max_3000_addr}, {count_3000} registers)")
461+
registers = self.read_input_registers(3000, count_3000)
460462
if registers is None:
461463
logger.error("Failed to read main input register block")
462464
return None
@@ -467,15 +469,20 @@ def read_all_data(self) -> Optional[GrowattData]:
467469

468470
# Read 31000 range if needed - MOD extended battery/BMS range
469471
if has_31000_range:
470-
logger.debug("Reading 31000 range (31100-31300)")
471-
registers = self.read_input_registers(31100, 201)
472+
# Find the min and max registers in the 31000 range
473+
addrs_31000 = [addr for addr in addresses if 31000 <= addr < 32000]
474+
min_31000_addr = min(addrs_31000)
475+
max_31000_addr = max(addrs_31000)
476+
count_31000 = (max_31000_addr - min_31000_addr) + 1
477+
logger.debug(f"Reading 31000 range ({min_31000_addr}-{max_31000_addr}, {count_31000} registers)")
478+
registers = self.read_input_registers(min_31000_addr, count_31000)
472479
if registers is None:
473-
logger.warning("Failed to read extended battery register block (31100+)")
480+
logger.warning("Failed to read extended battery register block (31000+)")
474481
# Don't return None - continue with what we have
475482
else:
476483
# Populate cache
477484
for i, value in enumerate(registers):
478-
self._register_cache[31100 + i] = value
485+
self._register_cache[min_31000_addr + i] = value
479486

480487
# Now extract values using the register map
481488
try:

0 commit comments

Comments
 (0)