{
  "spec_version": 1,
  "slug": "sungrow-ihomemanager",
  "manufacturer": "Sungrow",
  "model": "iHomeManager (iHM)",
  "category": "Protocol gateway",
  "supplier_url": "https://en.sungrowpower.com/downloadList",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 247,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "LowFirst",
    "native_interface": "rs485",
    "serial": {
      "parity": "None",
      "baud_rate": 9600,
      "data_bits": 8,
      "stop_bits": 1
    }
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [
    {
      "address": 4357,
      "count": 1,
      "name": "Phase A voltage, phase-to-neutral",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 4359,
      "count": 1,
      "name": "Phase B voltage, phase-to-neutral",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 4361,
      "count": 1,
      "name": "Phase C voltage, phase-to-neutral",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 8144,
      "count": 2,
      "name": "Total rated active power",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 100,
      "offset": 0,
      "access": "R",
      "description": "The source states 0.1 kW resolution and scales the reading by 100 to get watts."
    },
    {
      "address": 8154,
      "count": 2,
      "name": "Total active power (PV)",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 10,
      "offset": 0,
      "access": "R",
      "description": "PV production of the plant behind the iHM; reads together with 8155-8162 as one 9-register block."
    },
    {
      "address": 8156,
      "count": 2,
      "name": "Total active power at the grid meter",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 10,
      "offset": 0,
      "access": "R",
      "description": "Positive = import, negative = export."
    },
    {
      "address": 8160,
      "count": 2,
      "name": "Battery power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 10,
      "offset": 0,
      "access": "R",
      "description": "Positive = discharge, negative = charge."
    },
    {
      "address": 8162,
      "count": 1,
      "name": "State of charge",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 8175,
      "count": 2,
      "name": "Import energy at the grid meter",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 8177,
      "count": 2,
      "name": "Export energy at the grid meter",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 8558,
      "count": 2,
      "name": "Phase A active power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed: positive = import, negative = export. The source reads 8559-8564 as one 6-register block."
    },
    {
      "address": 8560,
      "count": 2,
      "name": "Phase B active power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 8562,
      "count": 2,
      "name": "Phase C active power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    }
  ],
  "holding_registers": [
    {
      "address": 8027,
      "count": 1,
      "name": "Feed-in limitation",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0x55 (85) disables the limitation, 0xAA (170) enables it."
    },
    {
      "address": 8030,
      "count": 1,
      "name": "Feed-in limitation ratio",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Allowed feed-in power as a percentage of nominal power, 0-1000 raw = 0-100.0 %. Only in effect while register 8027 is enabled."
    }
  ],
  "combined_registers": [],
  "notes": "Secondary source: evcc template \"sungrow-ihm\" (products: Sungrow iHomeManager), checked 2026-11 at https://github.com/evcc-io/evcc/blob/master/templates/definition/meter/sungrow-ihm.yaml - no Sungrow register document for the iHM is public, so the addresses, the 9600 8N1 RS-485 framing, unit ID 247 and port 502 all come from that template and are marked secondary here. The register numbers in the template's comments are the 1-based reference numbers (comment \"8155\" against address 8154); the addresses stored here are the wire addresses the template actually polls, i.e. zero based. All 32-bit values are read with evcc's `int32s` / `uint32s` encoding, which is low-word-first, so the seed declares word order LowFirst; 16-bit rows are unaffected. The iHM is a plant-level manager: the values describe the meter and battery behind it, and per-inverter data stays in `sungrow-sh-sg` / the inverter's own map. Deliberate omissions: the identity block, the device-state and fault registers and the battery charge/discharge limits are not in the template and therefore not claimed; register 4357 is flagged \"undocumented\" in the source itself. Poll the 8154 block in one request (9 registers) as the template does, otherwise the iHM answers with gaps."
}
