|
20 | 20 | from grobro.grobro.builder import append_crc |
21 | 21 | from grobro.grobro.builder import scramble |
22 | 22 | from grobro.model.modbus_function import GrowattModbusFunctionSingle |
| 23 | +from grobro.model.modbus_message import GrowattModbusBlock |
23 | 24 | from grobro.model.modbus_message import GrowattModbusFunction |
24 | 25 | from grobro.model.modbus_message import GrowattModbusMessage |
25 | 26 | from grobro.model.mqtt_config import MQTTConfig |
@@ -367,17 +368,35 @@ def __on_message(self, client, userdata, msg: MQTTMessage): |
367 | 368 | self._client.publish(topic, eco["data"], retain=PUBLISH_SENSORS_RETAINED) |
368 | 369 | return |
369 | 370 |
|
| 371 | + modbus_message = None |
| 372 | + |
370 | 373 | # NOAH-specific message types (FE19 config, 0103 holding regs, etc.) |
371 | 374 | noah_msg = parser.parse_noah_message(unscrambled) |
372 | | - if noah_msg and noah_msg.get("message_type") == 0xFE19 and device_id.startswith("0PVP"): |
373 | | - config = noah_msg.get("config") |
374 | | - if config and config.serial_number: |
375 | | - LOG.info("Received NOAH config for %s (sw_version=%s)", config.serial_number, config.sw_version or "?") |
376 | | - self.on_config(device_id, config) |
377 | | - return |
| 375 | + if noah_msg: |
| 376 | + if noah_msg.get("message_type") == 0xFE19 and device_id.startswith("0PVP"): |
| 377 | + config = noah_msg.get("config") |
| 378 | + if config and config.serial_number: |
| 379 | + LOG.info("Received NOAH config for %s (sw_version=%s)", config.serial_number, config.sw_version or "?") |
| 380 | + self.on_config(device_id, config) |
| 381 | + return |
| 382 | + |
| 383 | + if noah_msg.get("message_type") == 0x0103: |
| 384 | + registers = noah_msg.get("registers", []) |
| 385 | + if registers: |
| 386 | + block = GrowattModbusBlock( |
| 387 | + start=0, |
| 388 | + end=len(registers) - 1, |
| 389 | + values=b"".join(struct.pack(">H", v) for v in registers), |
| 390 | + ) |
| 391 | + modbus_message = GrowattModbusMessage( |
| 392 | + unknown=0, |
| 393 | + device_id=noah_msg["device_id"], |
| 394 | + function=GrowattModbusFunction.READ_SINGLE_REGISTER, |
| 395 | + register_blocks=[block], |
| 396 | + ) |
378 | 397 |
|
379 | | - # Generic modbus message |
380 | | - modbus_message = GrowattModbusMessage.parse_grobro(unscrambled) |
| 398 | + if modbus_message is None: |
| 399 | + modbus_message = GrowattModbusMessage.parse_grobro(unscrambled) |
381 | 400 | LOG.debug("Received modbus message: %s", modbus_message) |
382 | 401 |
|
383 | 402 | if modbus_message: |
|
0 commit comments