{
  "spec_version": 1,
  "slug": "sigenergy-sigenstor",
  "manufacturer": "Sigenergy",
  "model": "SigenStor / Sigen Hybrid / Sigen PV Max",
  "category": "Home battery",
  "supplier_url": "https://www.sigenergy.com/",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 247,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst"
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 30005,
      "count": 2,
      "name": "Grid sensor active power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed; positive means import from the grid."
    },
    {
      "address": 30599,
      "count": 2,
      "name": "ESS charge/discharge power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed; positive means charging (evcc inverts it so that charging is negative)."
    },
    {
      "address": 30601,
      "count": 1,
      "name": "Battery state of charge",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 31017,
      "count": 2,
      "name": "Phase A current",
      "data_type": "Int32",
      "units": "A",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 31019,
      "count": 2,
      "name": "Phase B current",
      "data_type": "Int32",
      "units": "A",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 31021,
      "count": 2,
      "name": "Phase C current",
      "data_type": "Int32",
      "units": "A",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 31035,
      "count": 2,
      "name": "PV power (per inverter)",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40046,
      "count": 1,
      "name": "Backup SoC",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Discharge floor used when a Sigen Energy Gateway is installed. evcc's battery control writes this register only in that configuration, otherwise it writes 40048."
    },
    {
      "address": 40048,
      "count": 1,
      "name": "Discharge cut-off SoC",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Discharge cut-off SoC. evcc's battery control writes this register on systems without a gateway (with a gateway it writes 40046 instead)."
    }
  ],
  "combined_registers": [],
  "notes": "Register map from the evcc template https://raw.githubusercontent.com/evcc-io/evcc/master/templates/definition/meter/sigenergy.yaml (Sigen Hybrid, Sigen PV Max, SigenStor EC). Modbus TCP on port 502 with unit ID 247, and it has to be enabled in the configuration app with installer rights - the customer app cannot switch it on. All entries are holding registers. The accumulated energy registers in this map (30562, 30568, 30574) are 64-bit values, which this specification cannot express, so they are left out rather than split. Discharge cut-off SoC is written in 0.1 % steps; systems with a Sigen Energy Gateway use the backup SoC register instead so the house stays powered during a grid outage. 40046 and 40048 are the only write registers in this map - evcc writes exactly one of the two, depending on the gateway option - so they are the only RW entries. Category changed from Solar inverter to Home battery (storage-centred)."
}
