SRNE ASP48120SH3 Modbus Register Map (validated)
Validated Modbus register map for the SRNE ASP48120SH3 three-phase hybrid inverter, confirmedverified register-by-register against the live Nansana unit on (2026-07-21.27).
Bus: RS485, 9600 8N1, function code 03 (read holding registers), slave address 1.
Source of truth (code): src/inverter/registers.py in nfe-modbus-energy-loggerlogger.
Legend: VERIFIED = decoded value matched physical reality live. INFERRED = best-effort from live values. UNCONFIRMED = needs a different operating state (declarative,off-grid grouped/ byheavy OpenEMScharge) nature).to Thisprove.
Valid isregister theranges human-readable(probed copy.live)
- P00 product info: 0x0000 to 0x0049
- P01 battery / DC: 0x0100 to 0x0111
- P02 inverter telemetry: 0x0200 to 0x023F (0x0240 and beyond return "Illegal data address")
- P03 control commands: 0xDF00 to 0xDF09 (write-only, read back 0)
- Settings E (writable params): 0xE001 to 0xE02D
- Settings F: 0xF000 to 0xF01F
Live telemetrytelemetry, registersfull per-phase (P02) - VERIFIED
| V | |||||||
| grid frequency | 0x0215 | - | - | x0.01 Hz | |||
| inverter voltage | 0x0216 | 0x022C | 0x022D | x0.1 V | |||
| A | |||||||
| Hz | |||||||
| A | |||||||
| 0x021F | % | ||||||
| - | reads 0 (unpopulated) - derive PF = P / | ||||||
Derived
Other 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.MachineP02: statelabel from the code at0x0210 (seeenum),gotchaspasswordbelow).status
RegistersBattery deliberately/ NOT usedDC (validatedP01) wrong- VERIFIED
SOC 0x0100 (%), battery V 0x0101 (x0.1 V), battery I 0x0102 (x0.1 A, signed, + charge / - discharge), device temp 0x0103 (reads 0, dead), DC load 0x0104-0x0106 (0), PV1 0x0107-0x0109 (0, no PV), charge state 0x010B (enum, mislabelled on this model), charge power 0x010E (W), PV2 0x010F-0x0111 (0).
Extended block 0x0238 to 0x023F - MODEL-SPECIFIC, NOT in the SRNE V1.7 doc
Discovered by probing (the V1.7 doc stops at 0x0237). Read live in mains/bypass:
| INFERRED meaning | status | |||
|---|---|---|---|---|
| ~12 (1.2 A) | per-phase current B (likely GRID current B) | UNCONFIRMED (= load | I ||
| per-phase current C (likely GRID current C) | UNCONFIRMED | |||
| 0x023A | ~1816 | active power phase A | INFERRED (matches load P_A) | |
| 0x023B | ~267 | active power phase B | INFERRED (matches load P_B) | |
| 0x023C | ~201 | active power phase C | INFERRED (matches load P_C) | |
| 0x023D | ~2150 | total or apparent (phase A ~2187 VA) | UNCONFIRMED | |
| 0x023E | ~297 | unknown | UNCONFIRMED | |
| 0x023F | ~309 | unknown | UNCONFIRMED |
IMPORTANT: in mains/bypass mode grid current = load current = (near) inverter current, so grid-side vs load-side registers are indistinguishable from this state. To confirm 0x0238/0x0239 as GRID current B/C (and the 0x023A-F meanings), re-read during an off-grid or heavy-charge state where grid, load and inverter differ. Community SRNE docs found online map 0x0230+ differently (e.g. "R-phase voltage") because they are for other SRNE models; they do NOT apply to this three-phase ASP unit.
Corrections vs the generic SRNE V1.7 doc (do NOT trust the generic enums)
- Machine state 0x0210 = 2 means RUNNING (mains/bypass), NOT the generic "initialization". Only code 2 is verified.
- Power factor 0x021A reads 0. Derive PF = active (0x021B) / apparent (0x021C).
- Device temperature 0x0103 reads 0. Use
theheat-sink temps 0x0220 to 0x0222. - Charge-state
enum 0x0223 heatsink DReads 120.0 (bogus/unused). = quick charge"0x0107 to 0x0111 PV "1This backup unit has no PV,0x010B reads0.
94%Machineevenstateat(0x0210)OnlySOCcodewith20isWverified.chargeThepower, so the genericSRNE V1.7charge-statetableenum does NOT match this model(genericeither.
For the liveOpenEMS unitdriver at 2 is fully running). Verify the rest by observing transitions.(important)
2There=isrunningNO(mains/bypass)grid-power[VERIFIED]register, NO inverter-output-power register, NO ESS/battery AC-power register, and NO total-power register on this unit. The only power registers are LOAD power per phase.otherThereforecodes:thetreatESSasSymmetricEss.ACTIVE_POWERunverifiedmustuntilbeobserved.DERIVED from battery DC power (0x0101 x 0x0102), the same V x I used for DcDischargePower. Do NOT map load power 0x021B to ACTIVE_POWER: 0x021B is what the loads consume (verified 1803 W while the battery was idle/charging ~16 W), and it is phase A only.- Consumption/backup meter active + reactive power per phase are available from the load registers (0x021B/0x0232/0x0233 active, 0x0234/0x0235 reactive) and can populate the ElectricityMeter power channels.
Writes
Config/controlBoth FC06 and FC16 are supported. Read-only registers reject FC06with ("Illegalexception function").code Use7. FC16Settings (write0xE0xx multipleare registers), e.g. pymodbus write_registers.writable. Control 0xDF00 area starts(power/reset/restore) atis 0xDF00dangerous (power on/off) pluson the settinglive parameters.unit: documented, not fired.