Skip to main content

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.

page

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

x0.1 x0.1 x0.01x0.1 W.var.VA.
Addressquantity Fieldphase A OpenEMSphase nature / channelB Scalephase C SignedUnitnotes
0x0210grid voltage state_code0x0213 System / STATE0x022A enum0x022B no code
0x0212bus_vSystem / DC_BUS_VOLTAGE0.1noV
0x0228grid current pbus_v0x0214 System / DC_BUS_P_VOLTAGE(none) 0.1(none) nox0.1 A. GRID CURRENT IS PHASE A ONLY in the documented map
grid frequency 0x0215--x0.01 Hz
inverter voltage0x02160x022C0x022Dx0.1 V
0x0229inverter current nbus_v0x0217 System / DC_BUS_N_VOLTAGE0x022E 0.10x022F no V
0x0213grid_v_l1ElectricityMeter(grid) / VOLTAGE_L10.1noV
0x022Agrid_v_l2ElectricityMeter(grid) / VOLTAGE_L20.1noV
0x022Bgrid_v_l3ElectricityMeter(grid) / VOLTAGE_L30.1noV
0x0214grid_i_l1ElectricityMeter(grid) / CURRENT_L10.1noA
0x0215inverter frequency grid_freq0x0218 ElectricityMeter(grid) / FREQUENCY- 0.01- no Hz
0x0216load current backup_v_l10x0219 ElectricityMeter(backup) / VOLTAGE_L10x0230 0.10x0231 no V
0x022Cbackup_v_l2ElectricityMeter(backup) / VOLTAGE_L20.1noV
0x022Dbackup_v_l3ElectricityMeter(backup) / VOLTAGE_L30.1noV
0x0217backup_i_l1ElectricityMeter(backup) / CURRENT_L10.1noA
0x022Eload active power backup_i_l20x021B ElectricityMeter(backup) / CURRENT_L20x0232 0.10x0233 no ANO total register: sum the three phases
0x022Fload reactive power backup_i_l3(none) ElectricityMeter(backup) / CURRENT_L30x0234 0.10x0235 no AREACTIVE IS B/C ONLY (phase A: derive)
0x0218load apparent power backup_freq0x021C ElectricityMeter(backup) / FREQUENCY(none) 0.01(none) no HzAPPARENT IS PHASE A ONLY (B/C: derive S = sqrt(P^2 + Q^2))
0x0219load ratioload_i_l1Load / CURRENT_L10.1noA
0x021Bload_active_wLoad / ACTIVE_POWER1noW
0x021Cload_apparent_vaLoad / APPARENT_POWER1noVA
0x021F load_ratio_pct0x0236 Load / LOAD_RATIO1no0x0237 %
0x0100load PF battery_soc0x021A SymmetricEss--reads 0 (unpopulated) - derive PF = P / SOC1no%
0x0101battery_vSymmetricEss / VOLTAGE0.1noV
0x0102battery_iSymmetricEss / CURRENT0.1yesA
0x0220temp_heatsink_aTemp / TEMPERATURE_A0.1yesC
0x0221temp_heatsink_bTemp / TEMPERATURE_B0.1yesC
0x0222temp_heatsink_cTemp / TEMPERATURE_C0.1yesCS

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: state label from the code at 0x0210 (seeenum), gotchaspassword below).
  • status
0x0211, bus V 0x0212 (x0.1) = PBus 0x0228 + NBus 0x0229, inverter DC component 0x021D (mV), mains charge current 0x021E (x0.1 A), heat-sink temps 0x0220/0x0221/0x0222 (x0.1 C, 0x0223 bogus), PV charge current 0x0224 (0, no PV), inverter fault 0x0226, charge status 0x0227.

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:

I
Addressaddr Reasonlive valueINFERRED meaningstatus
0x021A0x0238~12 (1.2 A)per-phase current B (likely GRID current B)UNCONFIRMED (= load PF ReadsB 0in (unpopulated). Derive PF from active/apparent instead.bypass)
0x0103 device temp0x0239 Reads~13 (1.3 A)per-phase current C (likely GRID current C)UNCONFIRMED
0x023A~1816active power phase AINFERRED (matches load P_A)
0x023B~267active power phase BINFERRED (matches load P_B)
0x023C~201active power phase CINFERRED (matches load P_C)
0x023D~2150total or apparent (phase A ~2187 VA)UNCONFIRMED
0x023E~297unknownUNCONFIRMED
0x023F~309unknownUNCONFIRMED

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 the heat-sink temps 0x0220 to 0x0222.
  • Charge-state enum 0x0223 heatsink D Reads 120.0 (bogus/unused). 0x0107 to 0x0111 PV This backup unit has no PV,0x010B reads 0."1 = quick charge"

    Machineeven stateat (0x0210)

    94%

    OnlySOC codewith 20 isW verified.charge Thepower, so the generic SRNE V1.7 charge-state tableenum does NOT match this model (genericeither.

  • says
2 is "initialization";

For the liveOpenEMS unitdriver at 2 is fully running). Verify the rest by observing transitions.

(important)

  • 2There =is runningNO (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.
  • otherTherefore codes:the treatESS asSymmetricEss.ACTIVE_POWER unverifiedmust untilbe observed.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.