{
  "spec_version": 1,
  "slug": "kehua-spi-b-50-60",
  "manufacturer": "Kehua",
  "model": "SPI-B 50K-B / 60K-B string inverter (sold as Chint SPI-B 50/60)",
  "category": "Solar inverter",
  "supplier_url": "https://www.kehua.com/",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst",
    "native_interface": "rs485",
    "serial": {
      "parity": "None",
      "baud_rate": 9600,
      "data_bits": 8,
      "stop_bits": 1
    }
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [
    {
      "address": 5000,
      "count": 1,
      "name": "Inverter running status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = standby, 1 = grid-tied, 2 = fault, 3 = off, 4 = off-line; the high byte mirrors the same scale as register 11016 when the unit has a display."
    },
    {
      "address": 5001,
      "count": 1,
      "name": "CRC16 check word",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Check code over registers 5000 and 5002."
    },
    {
      "address": 5002,
      "count": 1,
      "name": "Bus voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    }
  ],
  "holding_registers": [
    {
      "address": 10015,
      "count": 10,
      "name": "Device model",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 10025,
      "count": 10,
      "name": "Serial number",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 10070,
      "count": 1,
      "name": "Device type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = three-phase PV inverter, 2 = three-phase PV energy-storage inverter, 10 = single-phase PV inverter."
    },
    {
      "address": 10071,
      "count": 1,
      "name": "Protocol type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = three-phase protocol, 2 = single-phase protocol, 3 = PID protocol."
    },
    {
      "address": 10077,
      "count": 1,
      "name": "Total PV array quantity",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 10078,
      "count": 1,
      "name": "MPPT number",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 10080,
      "count": 1,
      "name": "Rated power",
      "data_type": "UInt16",
      "units": "kW",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 10081,
      "count": 1,
      "name": "Maximum apparent power",
      "data_type": "UInt16",
      "units": "kVA",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Maximum scheduling value."
    },
    {
      "address": 10082,
      "count": 1,
      "name": "Maximum active power",
      "data_type": "UInt16",
      "units": "kW",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Maximum scheduling value."
    },
    {
      "address": 10083,
      "count": 1,
      "name": "Maximum reactive power",
      "data_type": "UInt16",
      "units": "kvar",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Minimum scheduling value."
    },
    {
      "address": 10084,
      "count": 1,
      "name": "Minimum power factor",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11000,
      "count": 1,
      "name": "Alarm word 1",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Bit field; sixteen alarm words follow at 11000-11015."
    },
    {
      "address": 11001,
      "count": 1,
      "name": "Alarm word 2",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11016,
      "count": 1,
      "name": "Running status",
      "data_type": "Hex",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0x0000 standby (no DC input), 0x0001 standby (DC under-voltage), 0x0002 standby (self-check), 0x0100 grid-tied, 0x0101 inverter prestart, 0x0102 unit derating, 0x0103 ratio derating, 0x0104 night SVG, 0x0200 fault, 0x0201 fault (waiting for recovery), 0x0300 off, 0x0400 off-line."
    },
    {
      "address": 11017,
      "count": 1,
      "name": "Daily grid-tied energy",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11018,
      "count": 2,
      "name": "Total grid-tied energy",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11020,
      "count": 1,
      "name": "Grid frequency",
      "data_type": "UInt16",
      "units": "Hz",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11021,
      "count": 2,
      "name": "Apparent power",
      "data_type": "UInt32",
      "units": "VA",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11023,
      "count": 2,
      "name": "Active power",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11025,
      "count": 2,
      "name": "Reactive power",
      "data_type": "Int32",
      "units": "var",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11027,
      "count": 1,
      "name": "Total power factor",
      "data_type": "Int16",
      "units": "",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11028,
      "count": 1,
      "name": "Grid voltage U",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11029,
      "count": 1,
      "name": "Grid voltage V",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Reads 0 on the single-phase SPI."
    },
    {
      "address": 11030,
      "count": 1,
      "name": "Grid voltage W",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Reads 0 on the single-phase SPI."
    },
    {
      "address": 11031,
      "count": 1,
      "name": "Grid current U",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11032,
      "count": 1,
      "name": "Grid current V",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Reads 0 on the single-phase SPI."
    },
    {
      "address": 11033,
      "count": 1,
      "name": "Grid current W",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Reads 0 on the single-phase SPI."
    },
    {
      "address": 11034,
      "count": 1,
      "name": "AC residual current",
      "data_type": "UInt16",
      "units": "mA",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11035,
      "count": 1,
      "name": "Heat sink temperature (boost)",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11036,
      "count": 1,
      "name": "Heat sink temperature (inverter)",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11037,
      "count": 1,
      "name": "Power module temperature (boost)",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11038,
      "count": 1,
      "name": "Power module temperature (inverter)",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11039,
      "count": 1,
      "name": "Internal temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11040,
      "count": 1,
      "name": "Bus voltage (inverter)",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11041,
      "count": 1,
      "name": "Insulation resistance",
      "data_type": "UInt16",
      "units": "kOhm",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11042,
      "count": 1,
      "name": "PV input power",
      "data_type": "UInt16",
      "units": "kW",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11043,
      "count": 1,
      "name": "Bus capacitor value",
      "data_type": "UInt16",
      "units": "uF",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 11044,
      "count": 1,
      "name": "PID running status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = standby, 1 = repairing, 2 = off, 3 = fault."
    },
    {
      "address": 11045,
      "count": 1,
      "name": "PID repair voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    }
  ],
  "combined_registers": [],
  "notes": "Source: Kehua Data \"String PV Grid-tied Inverter - Monitor Protocol V2.0\" (2021) - the vendor's own document, served by Chint Italy for the Chint-branded SPI-B 50/60 units it builds: https://chint.it/wp-content/uploads/product-docs/SPI-B-50_60/Istruzioni/SPI%20Monitor%20Protocol%20V2.0_005%20EN.pdf. §1.4.1 fixes the RS-485 framing: RTU, default 9600 bps (2400/4800/19200/38400/115200 selectable), no parity, 8 data bits, 1 stop bit; §1.4.2 gives the optional Ethernet port on TCP 502 with default IP 192.168.1.10, so the seed records the RS-485 path. Addressing is declared zero-based because the document's own example frame queries \"address 4501\" as PDU 0x1195 = 4501 (chapter 9). 16/32-bit values are big-endian, high byte and high word first, so word order stays HighFirst. The document states no factory slave address; the example uses 1 and the address-assignment chapter only describes the procedure. The unit 1 recorded here is therefore a placeholder, not a cited value, and the user must set their inverter's address on site. Function codes follow the document's own split: §2.1 input registers (FC 0x04, which holds the 4800 identity block and the 5000 PID-analog block; only the three 5000 rows are seeded) and §2.2 holding registers (FC 0x03, tables 2-1 and 2-2 with the 10000 identity block and the 11000 alarm/measurement block). Deliberate omissions: the 4800-4852 identity block of §2.1 (it is in the document but was not transcribed, so no row from it is claimed); the MPPT/PV string arrays (11064-11199); the manufacturer info, HMI and control-software version strings (10000-10069); alarm words 3-16 (11002-11015) and the alarm bit definitions, which the document tables by meaning rather than register; the PID/scheduling write block and the time-setting block; and the 4853-4872 PID-protocol variant block, which only applies to the PID option."
}
