Skip to main content

Documentation Index

Fetch the complete documentation index at: https://fop-50527c4b.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

The SUN2000 register map is organized into functional groups. You read all registers with FC 03 (Read Holding Registers). INT32 and UINT32 values span two consecutive registers — always request both in a single transaction to guarantee consistency. Divide each raw integer by its gain to obtain the real physical value.
Register addresses differ between SUN2000 series (L0, L1, M0, M1, M2, M3, MA, MB0). The addresses below match the SUN2000MA and SUN2000-M1/M3 Modbus Interface Definitions (Issue 08, 2024-11-07). Verify every address against the Modbus Interface Definitions for your specific model before deploying to production.

System information registers (read-only)

RegisterDescriptionTypeGain
30000Inverter modelString
30015Serial number (SN)String
32089Run stateU161
Register 32089 returns one of the coded integers in the state decode table below.

DC side registers (solar panels)

RegisterDescriptionTypeGainUnit
32016PV1 voltageI1610V
32017PV1 currentI16100A
32064DC input powerI321W

AC side registers (grid)

RegisterDescriptionTypeGainUnit
32066Line voltage L1-L2 (AB)U1610V
32069Phase voltage A (L1-N)U1610V
32070Phase voltage B (L2-N)U1610V
32071Phase voltage C (L3-N)U1610V
32072Phase A currentI1610A
32074Phase B currentI1610A
32076Phase C currentI1610A
32078Reactive powerI321var
32080Active powerI321W
32082Power factorI161000
32085Grid frequencyU16100Hz
Register 32080 (Active power) is signed: positive values indicate generation, negative values indicate consumption from the grid.

Energy and temperature registers

RegisterDescriptionTypeGainUnit
32106Daily yieldU32100kWh
32109Total yieldU32100kWh
32087Internal temperatureI1610°C

Inverter state decode (register 32089)

Raw valueState
0Idle: Initializing
1Idle: Detecting ISO
2Idle: Detecting irradiation
3Idle: Grid Detecting
256Starting
512On-Grid (normal operation)
513On-Grid: Power Limit
514On-Grid: Self-derating
768Shutdown: Fault
769Shutdown: Command
770Shutdown: OVGR
771Shutdown: Comm. disconnected
772Shutdown: Power Limit
1280Spot-check
2048IV Scanning
40960Idle: No irradiation

Top 10 registers for Home Assistant, Node-RED, and SCADA

These registers cover the most common monitoring requirements with minimal polling overhead:
RegisterParameterTypeGainNotes
32064DC input powerI321Total power from panels (W)
32069Phase voltage A (L1-N)U1610
32070Phase voltage B (L2-N)U1610
32071Phase voltage C (L3-N)U1610
32080Active power ACI321positive = generation, negative = consumption
32085Grid frequencyU16100
32087Internal temperatureI1610°C
32089Inverter run stateU161512 = On-Grid
32106Daily yieldU32100kWh
32109Total yieldU32100kWh

Python example: reading key registers

The example below uses the pymodbus library to connect over Modbus TCP and read a selection of the registers above.
from pymodbus.client import ModbusTcpClient
from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder

HOST = "192.168.200.1"  # Inverter Wi-Fi AP address
PORT = 6607             # New-firmware SDongle port; use 502 for old firmware
SLAVE_ID = 1

client = ModbusTcpClient(HOST, port=PORT)
client.connect()

def read_u16(address):
    result = client.read_holding_registers(address, count=1, slave=SLAVE_ID)
    return result.registers[0]

def read_i16(address):
    raw = read_u16(address)
    return raw if raw < 0x8000 else raw - 0x10000

def read_i32(address):
    result = client.read_holding_registers(address, count=2, slave=SLAVE_ID)
    decoder = BinaryPayloadDecoder.fromRegisters(
        result.registers, byteorder=Endian.BIG, wordorder=Endian.BIG
    )
    return decoder.decode_32bit_int()

def read_u32(address):
    result = client.read_holding_registers(address, count=2, slave=SLAVE_ID)
    decoder = BinaryPayloadDecoder.fromRegisters(
        result.registers, byteorder=Endian.BIG, wordorder=Endian.BIG
    )
    return decoder.decode_32bit_uint()

# DC side
dc_power_w    = read_i32(32064)

# AC side
phase_a_v     = read_u16(32069) / 10   # Volts
active_power_w = read_i32(32080)        # W, positive = generation
grid_freq_hz  = read_u16(32085) / 100  # Hz
temperature_c = read_i16(32087) / 10   # °C
run_state     = read_u16(32089)

# Energy
daily_kwh     = read_u32(32106) / 100
total_kwh     = read_u32(32109) / 100

print(f"DC input power : {dc_power_w} W")
print(f"Phase A voltage: {phase_a_v} V")
print(f"Active power   : {active_power_w} W")
print(f"Grid frequency : {grid_freq_hz} Hz")
print(f"Temperature    : {temperature_c} °C")
print(f"Run state      : {run_state}  (512 = On-Grid)")
print(f"Daily yield    : {daily_kwh} kWh")
print(f"Total yield    : {total_kwh} kWh")

client.close()