SRNE ASP48120SH3 Modbus Register Map (validated)
Validated Modbus register map for the SRNE ASP48120SH3 three-phase hybrid inverter, confirmed against the live unit on 2026-07-21.
Bus: RS485, 9600 8N1, function code 03 (read holding registers), slave address 1.
Source of truth: src/inverter/registers.py in nfe-modbus-energy-logger (declarative, grouped by OpenEMS nature). This page is the human-readable copy.
Live telemetry registers
| Address | Field | OpenEMS nature / channel | Scale | Signed | Unit |
|---|---|---|---|---|---|
| 0x0210 | state_code | System / STATE | enum | no | code |
| 0x0212 | bus_v | System / DC_BUS_VOLTAGE | 0.1 | no | V |
| 0x0228 | pbus_v | System / DC_BUS_P_VOLTAGE | 0.1 | no | V |
| 0x0229 | nbus_v | System / DC_BUS_N_VOLTAGE | 0.1 | no | V |
| 0x0213 | grid_v_l1 | ElectricityMeter(grid) / VOLTAGE_L1 | 0.1 | no | V |
| 0x022A | grid_v_l2 | ElectricityMeter(grid) / VOLTAGE_L2 | 0.1 | no | V |
| 0x022B | grid_v_l3 | ElectricityMeter(grid) / VOLTAGE_L3 | 0.1 | no | V |
| 0x0214 | grid_i_l1 | ElectricityMeter(grid) / CURRENT_L1 | 0.1 | no | A |
| 0x0215 | grid_freq | ElectricityMeter(grid) / FREQUENCY | 0.01 | no | Hz |
| 0x0216 | backup_v_l1 | ElectricityMeter(backup) / VOLTAGE_L1 | 0.1 | no | V |
| 0x022C | backup_v_l2 | ElectricityMeter(backup) / VOLTAGE_L2 | 0.1 | no | V |
| 0x022D | backup_v_l3 | ElectricityMeter(backup) / VOLTAGE_L3 | 0.1 | no | V |
| 0x0217 | backup_i_l1 | ElectricityMeter(backup) / CURRENT_L1 | 0.1 | no | A |
| 0x022E | backup_i_l2 | ElectricityMeter(backup) / CURRENT_L2 | 0.1 | no | A |
| 0x022F | backup_i_l3 | ElectricityMeter(backup) / CURRENT_L3 | 0.1 | no | A |
| 0x0218 | backup_freq | ElectricityMeter(backup) / FREQUENCY | 0.01 | no | Hz |
| 0x0219 | load_i_l1 | Load / CURRENT_L1 | 0.1 | no | A |
| 0x021B | load_active_w | Load / ACTIVE_POWER | 1 | no | W |
| 0x021C | load_apparent_va | Load / APPARENT_POWER | 1 | no | VA |
| 0x021F | load_ratio_pct | Load / LOAD_RATIO | 1 | no | % |
| 0x0100 | battery_soc | SymmetricEss / SOC | 1 | no | % |
| 0x0101 | battery_v | SymmetricEss / VOLTAGE | 0.1 | no | V |
| 0x0102 | battery_i | SymmetricEss / CURRENT | 0.1 | yes | A |
| 0x0220 | temp_heatsink_a | Temp / TEMPERATURE_A | 0.1 | yes | C |
| 0x0221 | temp_heatsink_b | Temp / TEMPERATURE_B | 0.1 | yes | C |
| 0x0222 | temp_heatsink_c | Temp / TEMPERATURE_C | 0.1 | yes | C |
Derived values
- Power factor = active power (0x021B) / apparent power (0x021C).
- Battery flow direction from the sign of battery current (0x0102): positive is charging, negative is discharging.
- Machine state label from the code at 0x0210 (see gotchas below).
Registers deliberately NOT used (validated wrong on this model)
| Address | Reason |
|---|---|
| 0x021A load PF | Reads 0 (unpopulated). Derive PF from active/apparent instead. |
| 0x0103 device temp | Reads 0. Use the heat-sink temps 0x0220 to 0x0222. |
| 0x0223 heatsink D | Reads 120.0 (bogus/unused). |
| 0x0107 to 0x0111 PV | This backup unit has no PV, reads 0. |
Machine state (0x0210)
Only code 2 is verified. The generic SRNE V1.7 state table does NOT match this model (generic says 2 is "initialization"; the live unit at 2 is fully running). Verify the rest by observing transitions.
- 2 = running (mains/bypass) [VERIFIED]
- other codes: treat as unverified until observed.
Writes
Config/control registers reject FC06 ("Illegal function"). Use FC16 (write multiple registers), e.g. pymodbus write_registers. Control area starts at 0xDF00 (power on/off) plus the setting parameters.
No comments to display
No comments to display