{
  "spec_version": 1,
  "slug": "kostal-ksem",
  "manufacturer": "KOSTAL",
  "model": "KOSTAL Smart Energy Meter G1 / G2 (KSEM)",
  "category": "Energy meter",
  "supplier_url": "https://www.kostal-solar-electric.com/en/products/accessories/smart-energy-meter/",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst"
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 0,
      "count": 2,
      "name": "Active power+",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:1.4.0*255."
    },
    {
      "address": 2,
      "count": 2,
      "name": "Active power-",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:2.4.0*255."
    },
    {
      "address": 4,
      "count": 2,
      "name": "Reactive power+",
      "data_type": "UInt32",
      "units": "var",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:3.4.0*255."
    },
    {
      "address": 6,
      "count": 2,
      "name": "Reactive power-",
      "data_type": "UInt32",
      "units": "var",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:4.4.0*255."
    },
    {
      "address": 16,
      "count": 2,
      "name": "Apparent power+",
      "data_type": "UInt32",
      "units": "VA",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:9.4.0*255."
    },
    {
      "address": 18,
      "count": 2,
      "name": "Apparent power-",
      "data_type": "UInt32",
      "units": "VA",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:10.4.0*255."
    },
    {
      "address": 24,
      "count": 2,
      "name": "Power factor",
      "data_type": "Int32",
      "units": "",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:13.4.0*255."
    },
    {
      "address": 26,
      "count": 2,
      "name": "Supply frequency",
      "data_type": "UInt32",
      "units": "Hz",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:14.4.0*255."
    },
    {
      "address": 40,
      "count": 2,
      "name": "Active power+ (L1)",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:21.4.0*255."
    },
    {
      "address": 42,
      "count": 2,
      "name": "Active power- (L1)",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:22.4.0*255."
    },
    {
      "address": 44,
      "count": 2,
      "name": "Reactive power+ (L1)",
      "data_type": "UInt32",
      "units": "var",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:23.4.0*255."
    },
    {
      "address": 46,
      "count": 2,
      "name": "Reactive power- (L1)",
      "data_type": "UInt32",
      "units": "var",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:24.4.0*255."
    },
    {
      "address": 56,
      "count": 2,
      "name": "Apparent power+ (L1)",
      "data_type": "UInt32",
      "units": "VA",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:29.4.0*255."
    },
    {
      "address": 58,
      "count": 2,
      "name": "Apparent power- (L1)",
      "data_type": "UInt32",
      "units": "VA",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:30.4.0*255."
    },
    {
      "address": 60,
      "count": 2,
      "name": "Current (L1)",
      "data_type": "UInt32",
      "units": "A",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:31.4.0*255."
    },
    {
      "address": 62,
      "count": 2,
      "name": "Voltage (L1)",
      "data_type": "UInt32",
      "units": "V",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:32.4.0*255."
    },
    {
      "address": 64,
      "count": 2,
      "name": "Power factor (L1)",
      "data_type": "Int32",
      "units": "",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:33.4.0*255."
    },
    {
      "address": 80,
      "count": 2,
      "name": "Active power+ (L2)",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:41.4.0*255."
    },
    {
      "address": 82,
      "count": 2,
      "name": "Active power- (L2)",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:42.4.0*255."
    },
    {
      "address": 84,
      "count": 2,
      "name": "Reactive power+ (L2)",
      "data_type": "UInt32",
      "units": "var",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:43.4.0*255."
    },
    {
      "address": 86,
      "count": 2,
      "name": "Reactive power- (L2)",
      "data_type": "UInt32",
      "units": "var",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:44.4.0*255."
    },
    {
      "address": 96,
      "count": 2,
      "name": "Apparent power+ (L2)",
      "data_type": "UInt32",
      "units": "VA",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:49.4.0*255."
    },
    {
      "address": 98,
      "count": 2,
      "name": "Apparent power- (L2)",
      "data_type": "UInt32",
      "units": "VA",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:50.4.0*255."
    },
    {
      "address": 100,
      "count": 2,
      "name": "Current (L2)",
      "data_type": "UInt32",
      "units": "A",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:51.4.0*255."
    },
    {
      "address": 102,
      "count": 2,
      "name": "Voltage (L2)",
      "data_type": "UInt32",
      "units": "V",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:52.4.0*255."
    },
    {
      "address": 104,
      "count": 2,
      "name": "Power factor (L2)",
      "data_type": "Int32",
      "units": "",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:53.4.0*255."
    },
    {
      "address": 120,
      "count": 2,
      "name": "Active power+ (L3)",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:61.4.0*255."
    },
    {
      "address": 122,
      "count": 2,
      "name": "Active power- (L3)",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:62.4.0*255."
    },
    {
      "address": 124,
      "count": 2,
      "name": "Reactive power+ (L3)",
      "data_type": "UInt32",
      "units": "var",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:63.4.0*255."
    },
    {
      "address": 126,
      "count": 2,
      "name": "Reactive power- (L3)",
      "data_type": "UInt32",
      "units": "var",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:64.4.0*255."
    },
    {
      "address": 136,
      "count": 2,
      "name": "Apparent power+ (L3)",
      "data_type": "UInt32",
      "units": "VA",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:69.4.0*255."
    },
    {
      "address": 138,
      "count": 2,
      "name": "Apparent power- (L3)",
      "data_type": "UInt32",
      "units": "VA",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:70.4.0*255."
    },
    {
      "address": 140,
      "count": 2,
      "name": "Current (L3)",
      "data_type": "UInt32",
      "units": "A",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:71.4.0*255."
    },
    {
      "address": 142,
      "count": 2,
      "name": "Voltage (L3)",
      "data_type": "UInt32",
      "units": "V",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:72.4.0*255."
    },
    {
      "address": 144,
      "count": 2,
      "name": "Power factor (L3)",
      "data_type": "Int32",
      "units": "",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "OBIS code 1-0:73.4.0*255."
    },
    {
      "address": 146,
      "count": 2,
      "name": "Minimum active power+",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    }
  ],
  "combined_registers": [],
  "notes": "Source: KOSTAL Solar Electric GmbH \"KSEM G1/G2 - KOSTAL Smart Energy Meter - Interface Description MODBUS\", release date 13.03.2025, valid for SW version 2.6.0, vendor-hosted at https://www.kostal-solar-electric.com/fileadmin/downloadcenter/kse/BA_KOSTAL_Interface_KSEM_EN.pdf. The register map is divided into areas (section 3.1); this seed carries the internal instantaneous block (decimal addresses 0-147, section 3.2), which the document lists with function code 0x03, so every row is a holding register. Addresses are printed in decimal and hex side by side and agree, and are wire addresses, so addressing is zero_based. All values are uint32/int32 or uint16/int16 with a fixed scale printed in the Units column (0.1 W, 0.001 V, ...), which is stored as scale_factor plus unit. Modbus TCP slave mode is served on port 502 by default (section 1.3.2); the document states no unit identifier for the TCP slave, so unit 1 is a placeholder to be set to whatever the meter is configured with. The document states the word order itself (section 2.2: 'the registers with the lower address contain the most significant bits', with the worked formula Active power+ = (register 0 × 2^16 + register 1) × 0.1), so word_order is HighFirst. Deliberate omissions: the internal energy register block (512-791) is uint64 throughout and the app has no 64-bit type; the SunSpec block (40000-40177) scales every value with a separate sunssf register, which cannot be expressed as a fixed scale_factor; and the KSEM/RM PnP (8192-8249), static (40960-49151), dynamic (49152-59391), group (59392-61312) and sensor (61440-65280) areas are installation-configured or device-specific and are left out. Minimum active power+ (146) carries a footnote marker in the document; its scale is 0.1 W like the other power rows."
}
