{
  "spec_version": 1,
  "slug": "sma-sunny-tripower-storage-x",
  "manufacturer": "SMA",
  "model": "Sunny Tripower Storage X 30/50 (STPS30-20, STPS50-20) and Sunny Island X 30/50 (SI30-20, SI50-20, US variants)",
  "category": "Battery inverter",
  "supplier_url": "https://www.sma.de/en/products/product-features-interfaces/modbus-protocol-interface",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 2,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst"
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 30201,
      "count": 2,
      "name": "Current state of health (5-minute value)",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Device or system status tag list; 307 = OK."
    },
    {
      "address": 30233,
      "count": 2,
      "name": "Accumulated connected power of the PV inverter",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 30845,
      "count": 2,
      "name": "Current battery state of charge (User SOC)",
      "data_type": "UInt32",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "SOC in relation to the present capacity, without decimal offset. The value is the User SOC: the actual SOC minus the upper and lower charging/discharging limits."
    },
    {
      "address": 33017,
      "count": 2,
      "name": "Nominal active power WMaxOutRtg",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Nominal active power of the grid feed-in, e.g. 50,000 W."
    },
    {
      "address": 33019,
      "count": 2,
      "name": "Nominal active power WMaxInRtg",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Nominal active power of the intake, negative, e.g. -50,000 W."
    },
    {
      "address": 40018,
      "count": 2,
      "name": "Quick shut-down of the inverters",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Writable tag list: 381 = standby, 1467 = start, 1749 = full stop (AC and DC sides)."
    },
    {
      "address": 40029,
      "count": 2,
      "name": "General operating status",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Tag list: 303 = off, 309 = operation, 569 = switched on (default), 1295 = standby, 1795 = blocked, 16777213 = information not available."
    },
    {
      "address": 40187,
      "count": 2,
      "name": "Nominal battery capacity",
      "data_type": "UInt32",
      "units": "Wh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Nominal capacity in watt hours, without decimal offset."
    },
    {
      "address": 40472,
      "count": 2,
      "name": "Nominal grid voltage",
      "data_type": "UInt32",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "e.g. 230 V or 400 V."
    },
    {
      "address": 41193,
      "count": 2,
      "name": "Behaviour during failure of external setpoint",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Writable tag list: 2506 = keep values (default), 2507 = use fallback values."
    },
    {
      "address": 41195,
      "count": 2,
      "name": "Timeout for external setpoint",
      "data_type": "UInt32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 to 1,800 s, default 600 s."
    },
    {
      "address": 41315,
      "count": 2,
      "name": "Operating mode of the active power controller",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Writable tag list, default 3352: 3352 = open-loop control, 3353 = closed-loop control."
    },
    {
      "address": 41369,
      "count": 2,
      "name": "Activation threshold, grid feed-in",
      "data_type": "Int32",
      "units": "%",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "RW",
      "description": "Default 5 %."
    },
    {
      "address": 41371,
      "count": 2,
      "name": "Deactivation threshold, grid feed-in",
      "data_type": "Int32",
      "units": "%",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "RW",
      "description": "Default 5 %."
    },
    {
      "address": 41373,
      "count": 2,
      "name": "Activation threshold, power consumption",
      "data_type": "Int32",
      "units": "%",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "RW",
      "description": "Default 5 %."
    },
    {
      "address": 41375,
      "count": 2,
      "name": "Deactivation threshold, power consumption",
      "data_type": "Int32",
      "units": "%",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "RW",
      "description": "Default 5 %."
    },
    {
      "address": 44001,
      "count": 2,
      "name": "Soft start rate P",
      "data_type": "UInt32",
      "units": "%/min",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Range 1 to 10,000, default 1,200 %/min."
    },
    {
      "address": 44013,
      "count": 2,
      "name": "Soft start P after a grid fault",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Writable tag list: 308 = activate, 303 = deactivate."
    },
    {
      "address": 44381,
      "count": 2,
      "name": "Nominal active power WMaxOut",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Nominal active power of the grid feed-in, e.g. 12,000 W."
    },
    {
      "address": 44383,
      "count": 2,
      "name": "Nominal active power WMaxIn",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Nominal active power of the intake, -60,000 W to 0 W."
    },
    {
      "address": 44505,
      "count": 2,
      "name": "Limitation of active power",
      "data_type": "UInt32",
      "units": "%",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "RW",
      "description": "Two decimals, range 0-10,000 = 0-100 %, default 10,000 (100 %). Returns the limitation and is writable."
    }
  ],
  "combined_registers": [],
  "notes": "Source: SMA Solar Technology AG \"SMA Modbus Interface - Remote Control - Sunny Tripower Storage X / Sunny Island X\", technical information SMAModbus-STPS-X-SI-X-TI-en-10, version 1.0, vendor-hosted at https://files.sma.de/downloads/SMAModbus-STPS-X-SI-X-TI-en-10.pdf. Valid for STPS30-20 / STPS50-20 (Sunny Tripower Storage X 30/50), STPS27-US-20 / STPS60-US-20, and SI30-20 / SI50-20 / SI27-US208-20 / SI40-US480-20 / SI60-US480-20 (Sunny Island X 30/50 and US variants). The document defines unit ID 1 = communication product identity, 2 = system, 3 = device; all rows here are from the unit-2 table and the unit-2-and-3 table, so the seed uses unit_id 2, and the default TCP port 502 is stated in section 4. ADR values are decimal wire addresses (addressing zero_based). The document supports Modbus TCP only (no RTU, no UDP). The document states no word order for its 32-bit values; HighFirst follows the SMA profile (32-bit values high word first) and should be checked against a known reading on site. Deliberate omissions: the unit-1 identity rows (30005 serial number, 30051 device category); the unit-3-only table (battery operating status, SOC tag list and the device-level active-power setpoints), which needs a second entry at unit 3; and one row of the unit-2-and-3 table - the active-power limit ('sets the active power limit, e.g. 50,000 W for an STPS 50-20', range 0-60,000 W) - because its address cell is missing in the document and no other table gives the address, so it is not guessed. The battery must be controlled through unit ID 3, not through the system view. SMA product pages: https://www.sma.de/en/products/battery-inverters/sunny-island-x (Sunny Island X) and the SMA Modbus interface page linked here."
}
