{
  "spec_version": 1,
  "slug": "sungrow-sh-sg",
  "manufacturer": "Sungrow",
  "model": "SH series hybrid / SG series string inverter",
  "category": "Solar inverter",
  "supplier_url": "https://en.sungrowpower.com/downloads",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "addressing": "one_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst"
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [
    {
      "address": 5000,
      "count": 1,
      "name": "Device type code",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Inverter family code; see the adaptive model table in Sungrow's protocol document."
    },
    {
      "address": 5001,
      "count": 1,
      "name": "Nominal output power",
      "data_type": "UInt16",
      "units": "kW",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 5002,
      "count": 1,
      "name": "Output type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = single phase, 1 = three phase 4-wire, 2 = three phase 3-wire."
    },
    {
      "address": 5008,
      "count": 1,
      "name": "Inside temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 5011,
      "count": 1,
      "name": "MPPT 1 voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 5012,
      "count": 1,
      "name": "MPPT 1 current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 5013,
      "count": 1,
      "name": "MPPT 2 voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 5014,
      "count": 1,
      "name": "MPPT 2 current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 5015,
      "count": 1,
      "name": "MPPT 3 voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 5016,
      "count": 1,
      "name": "MPPT 3 current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 5017,
      "count": 2,
      "name": "Total DC power",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 5019,
      "count": 1,
      "name": "Line voltage A-B / phase A voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Phase voltage on single-phase units, line-to-line voltage on three-phase units set to 3P3L."
    },
    {
      "address": 5020,
      "count": 1,
      "name": "Line voltage B-C / phase B voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 5021,
      "count": 1,
      "name": "Line voltage C-A / phase C voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 5033,
      "count": 2,
      "name": "Reactive power",
      "data_type": "Int32",
      "units": "var",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 5035,
      "count": 1,
      "name": "Power factor",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "Positive = leading, negative = lagging."
    },
    {
      "address": 5115,
      "count": 1,
      "name": "MPPT 4 voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Only on models with four MPP trackers."
    },
    {
      "address": 5116,
      "count": 1,
      "name": "MPPT 4 current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 5214,
      "count": 2,
      "name": "Battery power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Preferred battery power register; positive = charging."
    },
    {
      "address": 5242,
      "count": 1,
      "name": "Grid frequency (high resolution)",
      "data_type": "UInt16",
      "units": "Hz",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 5601,
      "count": 2,
      "name": "Meter active power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Only valid when the inverter is directly connected to a Sungrow smart energy meter; positive = export."
    },
    {
      "address": 5628,
      "count": 1,
      "name": "BDC rated power",
      "data_type": "UInt16",
      "units": "kW",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Rated battery converter power; the 100 % reference for the charge/discharge power setting (13052)."
    },
    {
      "address": 5631,
      "count": 1,
      "name": "Battery current",
      "data_type": "Int16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Preferred battery current register."
    },
    {
      "address": 5639,
      "count": 1,
      "name": "Battery capacity (high precision)",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 5726,
      "count": 2,
      "name": "Total backup power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13000,
      "count": 1,
      "name": "Running state",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "See the running state table in Sungrow's protocol document (standby, running, fault, ...)."
    },
    {
      "address": 13001,
      "count": 1,
      "name": "Power flow status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Encodes where the power currently flows; see the power flow state table."
    },
    {
      "address": 13002,
      "count": 1,
      "name": "Daily PV generation",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13003,
      "count": 2,
      "name": "Total PV generation",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13005,
      "count": 1,
      "name": "Daily export energy from PV",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13006,
      "count": 2,
      "name": "Total export energy from PV",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13008,
      "count": 2,
      "name": "Load power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13010,
      "count": 2,
      "name": "Export power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Power delivered by the inverter to the grid."
    },
    {
      "address": 13020,
      "count": 1,
      "name": "Battery voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13021,
      "count": 1,
      "name": "Battery current",
      "data_type": "Int16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Signed on SH3.0-6.0RS and SH8.0-10RS; register 5631 is the preferred source."
    },
    {
      "address": 13022,
      "count": 1,
      "name": "Battery power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed in practice (positive = charging); register 5214-5215 is the preferred source."
    },
    {
      "address": 13023,
      "count": 1,
      "name": "Battery state of charge (SOC)",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13025,
      "count": 1,
      "name": "Battery temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13026,
      "count": 1,
      "name": "Daily battery discharge energy",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13027,
      "count": 2,
      "name": "Total battery discharge energy",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13031,
      "count": 1,
      "name": "Phase A current",
      "data_type": "Int16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Only the phases present in the output type are filled."
    },
    {
      "address": 13032,
      "count": 1,
      "name": "Phase B current",
      "data_type": "Int16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13033,
      "count": 1,
      "name": "Phase C current",
      "data_type": "Int16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13034,
      "count": 2,
      "name": "Total active power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13036,
      "count": 1,
      "name": "Daily import energy",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13037,
      "count": 2,
      "name": "Total import energy",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13039,
      "count": 1,
      "name": "Battery capacity",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "0.1 kWh for lithium batteries, 1 Ah for lead-acid batteries; register 5639 has 0.01 kWh resolution."
    },
    {
      "address": 13040,
      "count": 1,
      "name": "Daily charge energy",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13041,
      "count": 2,
      "name": "Total charge energy",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13045,
      "count": 1,
      "name": "Daily export energy",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13046,
      "count": 2,
      "name": "Total export energy",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 13050,
      "count": 2,
      "name": "Inverter alarm",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Alarm bit field; see the fault code appendix."
    }
  ],
  "holding_registers": [
    {
      "address": 5000,
      "count": 1,
      "name": "System clock: year",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "2000-2099; year, month, day, hour, minute and second are written as six consecutive registers (5000-5005)."
    },
    {
      "address": 5001,
      "count": 1,
      "name": "System clock: month",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 5002,
      "count": 1,
      "name": "System clock: day",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 5003,
      "count": 1,
      "name": "System clock: hour",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 5004,
      "count": 1,
      "name": "System clock: minute",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 5005,
      "count": 1,
      "name": "System clock: second",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 13018,
      "count": 1,
      "name": "PV power limitation",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0xAA = limit PV power, 0x55 = allow PV power. Only supported on SHT models."
    },
    {
      "address": 13050,
      "count": 1,
      "name": "EMS mode selection",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = self-consumption (default), 2 = compulsory (forced charge/discharge), 3 = external EMS, 4 = VPP."
    },
    {
      "address": 13051,
      "count": 1,
      "name": "Charge/discharge command",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0xAA = charge, 0xBB = discharge, 0xCC = stop."
    },
    {
      "address": 13052,
      "count": 1,
      "name": "Charge/discharge power",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0-100 % of the BDC rated power (5628)."
    },
    {
      "address": 13058,
      "count": 1,
      "name": "Maximum SOC",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Range 50.0-100.0 %."
    },
    {
      "address": 13059,
      "count": 1,
      "name": "Minimum SOC",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Range 0.0-50.0 %."
    },
    {
      "address": 13074,
      "count": 1,
      "name": "Feed-in limitation value",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 13075,
      "count": 1,
      "name": "Off-grid option",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0xAA = enable backup output, 0x55 = disable."
    },
    {
      "address": 13087,
      "count": 1,
      "name": "Feed-in limitation enable",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0xAA = enabled, 0x55 = disabled."
    },
    {
      "address": 13088,
      "count": 1,
      "name": "Feed-in limitation ratio",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "0-1000 (0.0-100.0 %). Takes precedence over the value in W at 13074 when both are set."
    },
    {
      "address": 13089,
      "count": 1,
      "name": "Active power limitation enable",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0xAA = enabled, 0x55 = disabled."
    },
    {
      "address": 13090,
      "count": 1,
      "name": "Active power limit ratio",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "0-1000 (0.0-100.0 % of nominal power)."
    },
    {
      "address": 33042,
      "count": 1,
      "name": "Charge cutoff voltage (wide range)",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 33047,
      "count": 1,
      "name": "Maximum charging power",
      "data_type": "UInt16",
      "units": "kW",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 33048,
      "count": 1,
      "name": "Maximum discharging power",
      "data_type": "UInt16",
      "units": "kW",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "RW"
    }
  ],
  "combined_registers": [],
  "notes": "Address convention: Sungrow's protocol document numbers registers from 1, and the device expects the number minus one on the wire (\"visit all registers by subtracting 1 from the register address\"). This file therefore declares one_based addressing and lists Sungrow's register numbers unchanged; a client that works with wire addresses must subtract 1. Read-only running information is served by function code 4 (input registers) and settings by function code 3/6/16 (holding registers); the same register number can therefore appear once in each table (for example 13050 is the inverter alarm when read and the EMS mode when written). Modbus TCP is available through the WiNet-S/WiNet-S2 dongle and, on models with a LAN port, directly on the inverter; the default TCP port is 502 and the default unit ID is 1. Older dongle firmware does not expose all registers (battery power and SOC in particular) - update the dongle firmware first. Registers marked \"unavailable\" by the device read back as 0xFFFF (U16), 0xFFFFFFFF (U32) or the maximum positive value for signed types, so filter those values. The SG series (string inverters without a battery) uses the same measurement registers but has no battery block, and limits export with registers 5007/5008 instead of the SH ratios at 13087-13090. Source: Sungrow \"Communication Protocol of Residential Hybrid Inverter\" V1.1.11 (SH series) and the shared running-information registers of the SG series. Battery compatibility: Sungrow's compatibility list (version 3.5, 22.07.2025) pairs the SH hybrid series with Sungrow's own SBR (SBR064-SBR256) and SBH (SBH100-SBH400) packs and, on the SH3.0/6.0RS, SH5.0/10RT and SH15-25T models, with BYD Battery-Box Premium HVS/HVM/HV and Pylontech Powercube/Force H1/H2 - https://ger.sungrowpower.com/upload/file/20250729/EN_FS_Compatibility_Factsheet.pdf."
}
