{
  "spec_version": 1,
  "slug": "sol-ark-hybrid-inverters",
  "manufacturer": "Sol-Ark",
  "model": "Sol-Ark 5K / 8K / 12K / 15K hybrid inverter",
  "category": "Solar inverter",
  "supplier_url": "https://www.sol-ark.com/resources/product-document-library/",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "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": [],
  "holding_registers": [
    {
      "address": 60,
      "count": 1,
      "name": "Day active power (grid port energy)",
      "data_type": "Int16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Inverter grid-port energy for the current day; signed."
    },
    {
      "address": 63,
      "count": 2,
      "name": "Total active power (grid port energy)",
      "data_type": "Int32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Low word at 63, high word at 64."
    },
    {
      "address": 70,
      "count": 1,
      "name": "Day battery charge power",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 71,
      "count": 1,
      "name": "Day battery discharge power",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 72,
      "count": 2,
      "name": "Total battery charge power",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Low word at 72, high word at 73."
    },
    {
      "address": 74,
      "count": 2,
      "name": "Total battery discharge power",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Low word at 74, high word at 75."
    },
    {
      "address": 76,
      "count": 1,
      "name": "Day grid buy power",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 77,
      "count": 1,
      "name": "Day grid sell power",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 81,
      "count": 2,
      "name": "Total grid sell power",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Low word at 81, high word at 82."
    },
    {
      "address": 84,
      "count": 1,
      "name": "Day load power",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Document labels this row \"SG: Day Load Power (Wh)\"."
    },
    {
      "address": 85,
      "count": 2,
      "name": "Total load power",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Low word at 85, high word at 86."
    },
    {
      "address": 90,
      "count": 1,
      "name": "DC/DC transformer temperature",
      "data_type": "UInt16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Same offset as register 91; not used on the 15K."
    },
    {
      "address": 91,
      "count": 1,
      "name": "IGBT heat sink temperature",
      "data_type": "UInt16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Offset -56.2 degC reads 438, 0 degC reads 1000, 50.5 degC reads 1505."
    },
    {
      "address": 96,
      "count": 2,
      "name": "Total PV power over all time",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Low word at 96, high word at 97."
    },
    {
      "address": 103,
      "count": 1,
      "name": "Fault information word 1",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Bit field; see the fault table at the end of the vendor document."
    },
    {
      "address": 104,
      "count": 1,
      "name": "Fault information word 2",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 105,
      "count": 1,
      "name": "Fault information word 3",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 106,
      "count": 1,
      "name": "Fault information word 4",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Four 16-bit words, 64 fault bits in total, one bit per fault."
    },
    {
      "address": 107,
      "count": 1,
      "name": "Corrected battery capacity",
      "data_type": "UInt16",
      "units": "Ah",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Value 100 means 100 Ah."
    },
    {
      "address": 108,
      "count": 1,
      "name": "Daily PV power",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Total PV energy produced today."
    },
    {
      "address": 109,
      "count": 1,
      "name": "DC (PV) voltage input 1",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 110,
      "count": 1,
      "name": "DC (PV) current input 1",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 111,
      "count": 1,
      "name": "DC (PV) voltage input 2",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 112,
      "count": 1,
      "name": "DC (PV) current input 2",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 113,
      "count": 1,
      "name": "DC (PV) voltage input 3",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Applies to the 15K only."
    },
    {
      "address": 114,
      "count": 1,
      "name": "DC (PV) current input 3",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Applies to the 15K only."
    },
    {
      "address": 150,
      "count": 1,
      "name": "Grid side voltage L1-N",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 151,
      "count": 1,
      "name": "Grid side voltage L2-N",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 152,
      "count": 1,
      "name": "Grid side voltage L1-L2",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 157,
      "count": 1,
      "name": "Load voltage L1",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 158,
      "count": 1,
      "name": "Load voltage L2",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 160,
      "count": 1,
      "name": "Grid side current L1",
      "data_type": "Int16",
      "units": "A",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 161,
      "count": 1,
      "name": "Grid side current L2",
      "data_type": "Int16",
      "units": "A",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 164,
      "count": 1,
      "name": "Inverter output current L1",
      "data_type": "Int16",
      "units": "A",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 165,
      "count": 1,
      "name": "Inverter output current L2",
      "data_type": "Int16",
      "units": "A",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 167,
      "count": 1,
      "name": "Grid side L1 power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 168,
      "count": 1,
      "name": "Grid side L2 power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 169,
      "count": 1,
      "name": "Total power of grid side L1-L2",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "> 0 = buying, < 0 = selling."
    },
    {
      "address": 172,
      "count": 1,
      "name": "Grid external total power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Sum of the external CT readings (registers 170 and 171)."
    },
    {
      "address": 173,
      "count": 1,
      "name": "Inverter output L1 power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 174,
      "count": 1,
      "name": "Inverter output L2 power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 175,
      "count": 1,
      "name": "Inverter output total power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 178,
      "count": 1,
      "name": "Load side total power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 181,
      "count": 1,
      "name": "Generator port voltage L1-L2",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 182,
      "count": 1,
      "name": "Battery temperature",
      "data_type": "UInt16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Real value of offset + 1000: raw 1200 = 20.0 degC."
    },
    {
      "address": 183,
      "count": 1,
      "name": "Battery voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Raw 4100 = 41.0 V."
    },
    {
      "address": 184,
      "count": 1,
      "name": "Battery state of charge",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 186,
      "count": 1,
      "name": "PV1 input power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 187,
      "count": 1,
      "name": "PV2 input power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 188,
      "count": 1,
      "name": "PV3 input power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Applies to the 15K only."
    },
    {
      "address": 189,
      "count": 1,
      "name": "PV4 input power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 190,
      "count": 1,
      "name": "Battery output power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed; positive = discharging."
    },
    {
      "address": 191,
      "count": 1,
      "name": "Battery output current",
      "data_type": "Int16",
      "units": "A",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 192,
      "count": 1,
      "name": "Load frequency",
      "data_type": "UInt16",
      "units": "Hz",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 193,
      "count": 1,
      "name": "Inverter output frequency",
      "data_type": "UInt16",
      "units": "Hz",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 194,
      "count": 1,
      "name": "Grid side relay status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = open (disconnected), 2 = closed."
    },
    {
      "address": 195,
      "count": 1,
      "name": "Generator side relay status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Low 4 bits: 0 open, 1 closed, 2 no connection, 3 closed when the generator is on."
    },
    {
      "address": 196,
      "count": 1,
      "name": "Generator relay frequency",
      "data_type": "UInt16",
      "units": "Hz",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    }
  ],
  "combined_registers": [],
  "notes": "Source: Sol-Ark \"Modbus RTU Protocol, Sol-Ark Hybrid Inverters: 5k, 8k, 12k, 15k\", V1.4 (2023-10-13, added the 15K and the total-energy registers). The vendor document is public, but sol-ark.com did not list it in the rendered or indexed document library, so it was read from the public mirror https://github.com/chuyskywalker/solark-esphome/blob/main/Modbus%20Sol-Ark%20V1.4%20(Public%20Release).pdf. Fixed interface settings from the document: RS-485, 9600 bps, no parity, 8 data bits, 1 stop bit, and \"The inverter's Slave ID is 0x01. This cannot be changed.\" The map is read-only (function code 0x03 only); the vendor states it does not support third-party Modbus, that the inverter must have \"BMS Lithium Batt\" set to 00, and that it cannot be used at the same time as RS-485 battery communication. Addresses are the decimal wire addresses: the document's own example reads address 107 as PDU 0x006B. 32-bit values carry the low word at the lower address (63/64, 72/73, 74/75, 81/82, 85/86, 96/97), so the seed declares word order LowFirst. Deliberate omissions: the total grid buy power pair at 78 (low word) and 80 (high word) - register 79 (grid frequency) sits between the two halves, so it cannot be expressed as one 32-bit row without overlapping a register; the serial-number block at 3-7, whose ten ASCII bytes are documented across addresses whose byte-to-register mapping the document leaves open; registers 153/155/156/162/163/170/171/176/177/179/180, whose labels wrap across two PDF rows and could not be paired with their address without guessing; and the fault-code tables, which are descriptions and not registers."
}
