SRNE ASP48120SH3 (Direct Hybrid Inverter) + mbpoll Command Reference
Version: 1.0 Prepared For: Field & Deployment Teams Platform: Raspberry Pi / Linux Tool: mbpoll / pymodbus
1. Purpose
This document explains how to communicate with the SRNE ASP48120SH3 three-phase hybrid inverter using Modbus RTU (mbpoll or pymodbus).
It covers: reading live telemetry (grid, inverter output, battery, temperatures), serial parameters and function codes, the model-specific gotchas validated against the live unit, and preparing for OpenEMS integration.
2. Hardware & Software Requirements
Hardware
- SRNE ASP48120SH3 (three-phase hybrid inverter)
- RS485 to USB converter (CH340)
- Raspberry Pi / Linux PC
- RS485 wiring: A(converter) to pin 7 (RS485-A) of the inverter WiFi-port RJ45, B(converter) to pin 8 (RS485-B), GND to pin 2 recommended.
Note: the WiFi port carries the monitoring RS485 bus. The separate RS485/CAN port is reserved for the battery BMS, do not use it for polling.
Software
sudo apt update
sudo apt install mbpoll
3. Serial parameters (differ from the CHINT meters)
- Baud 9600, 8 data bits, No parity, 1 stop bit (8N1). The meters are 8N2.
- Function code 03 (read holding registers). The meters use FC04 input registers.
- Slave address 1 (default).
- 16-bit registers with scale factors, NOT 32-bit floats like the meters.
mbpoll flags: -b 9600 -P none -s 1 -t 4 -0 where -t 4 is holding/FC03, -s 1 is one stop bit, -0 is 0-based so -r matches the hex address directly.
4. Reading values
Machine state (0x0210 = 528):
mbpoll -m rtu -b 9600 -P none -s 1 -t 4 -0 -r 528 -c 1 -a 1 -1 /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0
Grid + inverter block (0x0210 to 0x0217):
mbpoll -m rtu -b 9600 -P none -s 1 -t 4 -0 -r 528 -c 8 -a 1 -1 <port>
Battery block (0x0100 to 0x0103):
mbpoll -m rtu -b 9600 -P none -s 1 -t 4 -0 -r 256 -c 4 -a 1 -1 <port>
(528 = 0x0210, 256 = 0x0100.)
5. Model-specific gotchas (validated 2026-07-21)
- Machine state 0x0210 = 2 means RUNNING (mains/bypass) on this model, NOT the generic SRNE V1.7 "initialization". The generic state table does not match this unit. Verify other codes by observing transitions.
- Power factor 0x021A reads 0 (unpopulated). Derive PF = active power (0x021B) / apparent power (0x021C).
- Device temperature 0x0103 reads 0. Use heat-sink temps 0x0220, 0x0221, 0x0222 instead (scale 0.1 C). 0x0223 (heatsink D) is bogus.
- Writes need FC16, not FC06. Config/control registers reject FC06 with "Illegal function". Use write-multiple (FC16, or pymodbus write_registers).
- Bus voltage 0x0212 = PBus 0x0228 + NBus 0x0229 (split DC bus).
6. Preparing for OpenEMS integration
The validated register map is captured as a declarative table (see the SRNE register-map page, and src/inverter/registers.py in nfe-modbus-energy-logger), grouped by OpenEMS nature: ElectricityMeter for grid and backup, SymmetricEss for the battery, OffGridBatteryInverter for machine state. It maps 1:1 to a GoodWe-style defineModbusProtocol (FC3ReadRegistersTask + UnsignedWordElement + SCALE_FACTOR).