{
  "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json",
  "mbmap": 2,
  "vendor": "Eastron",
  "model": "SDM120CT",
  "models": ["SDM120CT", "SDM120CTM", "SDM120CT-M"],
  "vendor_website": "eastroneurope.com",
  "description": "Single-phase DIN rail energy meter for an external current transformer (1 A or 5 A secondary)",
  "revision": 2,
  "revised": "2026-10-17",
  "source": "Eastron, \"Eastron SDM120CTM Smart Meter Modbus Protocol Implementation\", V1.3",
  "sources": [{"title": "Eastron SDM120CTM Smart Meter Modbus Protocol Implementation", "version": "V1.3", "url": "https://www.eastroneurope.com/images/uploads/products/protocol/SDM120CT_Modbus_protocol.pdf"}],
  "notes": [
    "Measurements are float32 input registers (FC04); settings are float32 holding registers (FC03 read, FC10 write). The meter also answers FC08.",
    "Requests must start at an even address and cover an even number of registers, so a single float32 is read or written as two registers. Only one float can be written per request.",
    "The settings at F900h-F920h are 16-bit values in the protocol; read them together with the next register if the meter rejects a one-register read."
  ],
  "protocol": "rtu",
  "unit_id": 1,
  "baudrate": 2400,
  "parity": "N",
  "databits": 8,
  "stopbits": 1,
  "byte_order": "big",
  "word_order": "big",
  "address_base": 0,
  "x_status": "official",
  "registers": [
    {"name": "Voltage", "group": "Measurements", "area": "input", "address": "0x0000", "type": "float32", "unit": "V", "access": "R"},
    {"name": "Current", "group": "Measurements", "area": "input", "address": "0x0006", "type": "float32", "unit": "A", "access": "R"},
    {"name": "Active power", "group": "Measurements", "area": "input", "address": "0x000C", "type": "float32", "unit": "W", "access": "R"},
    {"name": "Apparent power", "group": "Measurements", "area": "input", "address": "0x0012", "type": "float32", "unit": "VA", "access": "R"},
    {"name": "Reactive power", "group": "Measurements", "area": "input", "address": "0x0018", "type": "float32", "unit": "var", "access": "R"},
    {"name": "Power factor", "group": "Measurements", "area": "input", "address": "0x001E", "type": "float32", "access": "R"},
    {"name": "Frequency", "group": "Measurements", "area": "input", "address": "0x0046", "type": "float32", "unit": "Hz", "access": "R"},
    {"name": "Import active energy", "group": "Energy", "area": "input", "address": "0x0048", "type": "float32", "unit": "kWh", "access": "R"},
    {"name": "Export active energy", "group": "Energy", "area": "input", "address": "0x004A", "type": "float32", "unit": "kWh", "access": "R"},
    {"name": "Import reactive energy", "group": "Energy", "area": "input", "address": "0x004C", "type": "float32", "unit": "kvarh", "access": "R"},
    {"name": "Export reactive energy", "group": "Energy", "area": "input", "address": "0x004E", "type": "float32", "unit": "kvarh", "access": "R"},
    {"name": "Total system power demand", "group": "Demand", "area": "input", "address": "0x0054", "type": "float32", "unit": "W", "access": "R"},
    {"name": "Maximum total system power demand", "group": "Demand", "area": "input", "address": "0x0056", "type": "float32", "unit": "W", "access": "R"},
    {"name": "Import system power demand", "group": "Demand", "area": "input", "address": "0x0058", "type": "float32", "unit": "W", "access": "R"},
    {"name": "Maximum import system power demand", "group": "Demand", "area": "input", "address": "0x005A", "type": "float32", "unit": "W", "access": "R"},
    {"name": "Export system power demand", "group": "Demand", "area": "input", "address": "0x005C", "type": "float32", "unit": "W", "access": "R"},
    {"name": "Maximum export system power demand", "group": "Demand", "area": "input", "address": "0x005E", "type": "float32", "unit": "W", "access": "R"},
    {"name": "Current demand", "group": "Demand", "area": "input", "address": "0x0102", "type": "float32", "unit": "A", "access": "R"},
    {"name": "Maximum current demand", "group": "Demand", "area": "input", "address": "0x0108", "type": "float32", "unit": "A", "access": "R"},
    {"name": "Total active energy", "group": "Energy", "area": "input", "address": "0x0156", "type": "float32", "unit": "kWh", "access": "R"},
    {"name": "Total reactive energy", "group": "Energy", "area": "input", "address": "0x0158", "type": "float32", "unit": "kvarh", "access": "R"},
    {"name": "Demand time", "group": "Setup", "area": "holding", "address": "0x0000", "type": "float32", "unit": "min", "access": "R", "description": "Minutes into the first demand calculation; demand values are valid once it reaches the demand period"},
    {"name": "Demand period", "group": "Setup", "area": "holding", "address": "0x0002", "type": "float32", "unit": "min", "access": "RW", "write_min": 0, "write_max": 60, "description": "Default 60; 0 turns demand off"},
    {"name": "Relay pulse width", "group": "Setup", "area": "holding", "address": "0x000C", "type": "float32", "unit": "ms", "access": "RW", "description": "60, 100 or 200 ms, default 100"},
    {"name": "Network parity and stop bits", "group": "Setup", "area": "holding", "address": "0x0012", "type": "float32", "access": "RW", "enum": {"0": "No parity, 1 stop bit", "1": "Even parity, 1 stop bit", "2": "Odd parity, 1 stop bit", "3": "No parity, 2 stop bits"}, "description": "Default 0. Takes effect after a restart"},
    {"name": "Meter ID", "group": "Setup", "area": "holding", "address": "0x0014", "type": "float32", "access": "RW", "write_min": 1, "write_max": 247, "description": "Modbus address, default 1"},
    {"name": "Baud rate", "group": "Setup", "area": "holding", "address": "0x001C", "type": "float32", "access": "RW", "enum": {"0": "2400", "1": "4800", "2": "9600", "5": "1200"}, "description": "Default 0 (2400)"},
    {"name": "CT primary current", "group": "Setup", "area": "holding", "address": "0x0032", "type": "float32", "unit": "A", "access": "RW", "write_min": 5, "write_max": 9999, "description": "Default 5"},
    {"name": "CT secondary current", "group": "Setup", "area": "holding", "address": "0x0034", "type": "float32", "unit": "A", "access": "RW", "description": "1 or 5, default 5"},
    {"name": "Pulse 1 output mode", "group": "Setup", "area": "holding", "address": "0x0056", "type": "float32", "access": "RW", "enum": {"1": "Import active energy", "2": "Import + export active energy", "4": "Export active energy", "5": "Import reactive energy", "6": "Import + export reactive energy", "8": "Export reactive energy"}, "description": "Default 4"},
    {"name": "Reset demand", "group": "Commands", "area": "holding", "address": "0xF010", "type": "uint32", "access": "W", "enum": {"0": "Reset demand"}, "description": "The protocol writes 00 00 here; requests must cover an even number of registers, so this sends two zero registers with FC10"},
    {"name": "Scroll display time", "group": "Setup", "area": "holding", "address": "0xF900", "type": "uint16", "unit": "s", "access": "RW", "description": "BCD, 0 to 30 s; 0 (default) = no automatic scrolling"},
    {"name": "Pulse 1 constant", "group": "Setup", "area": "holding", "address": "0xF910", "type": "uint16", "access": "RW", "enum": {"0": "0.001 kWh/imp", "1": "0.01 kWh/imp", "2": "0.1 kWh/imp", "3": "1 kWh/imp", "4": "10 kWh/imp", "5": "100 kWh/imp", "6": "1000 kWh/imp"}, "description": "Default 1"},
    {"name": "Measurement mode", "group": "Setup", "area": "holding", "address": "0xF920", "type": "uint16", "access": "RW", "enum": {"1": "Total = import", "2": "Total = import + export", "3": "Total = import - export"}, "description": "Default 2"},
    {"name": "Serial number", "group": "Device", "area": "holding", "address": "0xFC00", "type": "uint32", "access": "R", "role": "serial"}
  ]
}
