{
  "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json",
  "mbmap": 2,
  "vendor": "Eastron",
  "model": "SDM120-M",
  "models": ["SDM120-M"],
  "vendor_website": "eastroneurope.com",
  "description": "Single-phase multifunction DIN rail energy meter, 45 A direct connection, bidirectional",
  "revision": 3,
  "revised": "2026-11-10",
  "source": "Zhejiang Eastron Electronic, \"Eastron SDM120-M User Manual V1.0\", Modbus register map; https://www.eastrongroup.com/eastrongroup/2025/03/22/eastronsdm120-musermanualv1.0.pdf",
  "sources": [
    {"title": "Eastron SDM120-M User Manual", "version": "V1.0", "note": "Modbus register map", "url": "https://www.eastrongroup.com/eastrongroup/2025/03/22/eastronsdm120-musermanualv1.0.pdf"}
  ],
  "notes": [
    "Eastron SDM120-M single-phase energy meter (RS485).",
    "Measurements are float32 input registers (FC04); the integer copies at 2710h-2849h carry the same values."
  ],
  "protocol": "rtu",
  "unit_id": 1,
  "baudrate": 9600,
  "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": 0, "type": "float32", "unit": "V", "access": "R"},
    {"name": "Current", "group": "Measurements", "area": "input", "address": 6, "type": "float32", "unit": "A", "access": "R"},
    {"name": "Active power", "group": "Measurements", "area": "input", "address": 12, "type": "float32", "unit": "W", "access": "R"},
    {"name": "Apparent power", "group": "Measurements", "area": "input", "address": 18, "type": "float32", "unit": "VA", "access": "R"},
    {"name": "Reactive power", "group": "Measurements", "area": "input", "address": 24, "type": "float32", "unit": "var", "access": "R"},
    {"name": "Power factor", "group": "Measurements", "area": "input", "address": 30, "type": "float32", "access": "R"},
    {"name": "Frequency", "group": "Measurements", "area": "input", "address": 70, "type": "float32", "unit": "Hz", "access": "R"},
    {"name": "Import active energy", "group": "Energy", "area": "input", "address": 72, "type": "float32", "unit": "kWh", "access": "R"},
    {"name": "Export active energy", "group": "Energy", "area": "input", "address": 74, "type": "float32", "unit": "kWh", "access": "R"},
    {"name": "Import reactive energy", "group": "Energy", "area": "input", "address": 76, "type": "float32", "unit": "kvarh", "access": "R"},
    {"name": "Export reactive energy", "group": "Energy", "area": "input", "address": 78, "type": "float32", "unit": "kvarh", "access": "R"},
    {"name": "VAh", "group": "Energy", "area": "input", "address": 80, "type": "float32", "unit": "kVAh", "access": "R"},
    {"name": "Ah", "group": "Energy", "area": "input", "address": 82, "type": "float32", "unit": "Ah", "access": "R"},
    {"name": "Total system power demand", "group": "Demand", "area": "input", "address": 84, "type": "float32", "unit": "W", "access": "R"},
    {"name": "Maximum total system power demand", "group": "Demand", "area": "input", "address": 86, "type": "float32", "unit": "W", "access": "R"},
    {"name": "Import system power demand", "group": "Demand", "area": "input", "address": 88, "type": "float32", "unit": "W", "access": "R"},
    {"name": "Maximum import system power demand", "group": "Demand", "area": "input", "address": 90, "type": "float32", "unit": "W", "access": "R"},
    {"name": "Export system power demand", "group": "Demand", "area": "input", "address": 92, "type": "float32", "unit": "W", "access": "R"},
    {"name": "Maximum export system power demand", "group": "Demand", "area": "input", "address": 94, "type": "float32", "unit": "W", "access": "R"},
    {"name": "Current demand", "group": "Demand", "area": "input", "address": 258, "type": "float32", "unit": "A", "access": "R"},
    {"name": "Maximum current demand", "group": "Demand", "area": "input", "address": 264, "type": "float32", "unit": "A", "access": "R"},
    {"name": "Total active energy", "group": "Energy", "area": "input", "address": 342, "type": "float32", "unit": "kWh", "access": "R"},
    {"name": "Total reactive energy", "group": "Energy", "area": "input", "address": 344, "type": "float32", "unit": "kvarh", "access": "R"},
    {"name": "CO2", "group": "Energy", "area": "input", "address": 20130, "type": "float32", "unit": "kg", "access": "R"},
    {"name": "Total import active energy (int64)", "group": "Energy (integer)", "area": "input", "address": 10000, "type": "int64", "scale": 0.001, "unit": "kWh", "access": "R", "description": "Raw value in Wh, varh or VAh"},
    {"name": "Total export active energy (int64)", "group": "Energy (integer)", "area": "input", "address": 10004, "type": "int64", "scale": 0.001, "unit": "kWh", "access": "R", "description": "Raw value in Wh, varh or VAh"},
    {"name": "Total import reactive energy (int64)", "group": "Energy (integer)", "area": "input", "address": 10008, "type": "int64", "scale": 0.001, "unit": "kvarh", "access": "R", "description": "Raw value in Wh, varh or VAh"},
    {"name": "Total export reactive energy (int64)", "group": "Energy (integer)", "area": "input", "address": 10012, "type": "int64", "scale": 0.001, "unit": "kvarh", "access": "R", "description": "Raw value in Wh, varh or VAh"},
    {"name": "Total apparent energy (int64)", "group": "Energy (integer)", "area": "input", "address": 10016, "type": "int64", "scale": 0.001, "unit": "kVAh", "access": "R", "description": "Raw value in Wh, varh or VAh"},
    {"name": "Total active energy (int64)", "group": "Energy (integer)", "area": "input", "address": 10020, "type": "int64", "scale": 0.001, "unit": "kWh", "access": "R", "description": "Raw value in Wh, varh or VAh"},
    {"name": "Total reactive energy (int64)", "group": "Energy (integer)", "area": "input", "address": 10024, "type": "int64", "scale": 0.001, "unit": "kvarh", "access": "R", "description": "Raw value in Wh, varh or VAh"},
    {"name": "Voltage (int32)", "group": "Measurements (integer)", "area": "input", "address": 10250, "type": "int32", "scale": 0.1, "unit": "V", "access": "R"},
    {"name": "Current (int32)", "group": "Measurements (integer)", "area": "input", "address": 10256, "type": "int32", "scale": 0.001, "unit": "A", "access": "R"},
    {"name": "Active power (int32)", "group": "Measurements (integer)", "area": "input", "address": 10262, "type": "int32", "scale": 0.1, "unit": "W", "access": "R"},
    {"name": "Apparent power (int32)", "group": "Measurements (integer)", "area": "input", "address": 10268, "type": "int32", "scale": 0.1, "unit": "VA", "access": "R"},
    {"name": "Reactive power (int32)", "group": "Measurements (integer)", "area": "input", "address": 10274, "type": "int32", "scale": 0.1, "unit": "var", "access": "R"},
    {"name": "Power factor (int32)", "group": "Measurements (integer)", "area": "input", "address": 10280, "type": "int32", "scale": 0.01, "access": "R"},
    {"name": "Frequency (int32)", "group": "Measurements (integer)", "area": "input", "address": 10308, "type": "int32", "scale": 0.01, "unit": "Hz", "access": "R"},
    {"name": "CO2 (int64)", "group": "Energy (integer)", "area": "input", "address": 10310, "type": "int64", "scale": 0.001, "unit": "kg", "access": "R"},
    {"name": "Demand period", "group": "Setup", "area": "holding", "address": 2, "type": "float32", "unit": "min", "access": "RW", "description": "0 to 60 minutes, default 60. 0 makes demand show the present value and max demand the maximum since the last reset"},
    {"name": "Pulse 1 width", "group": "Setup", "area": "holding", "address": 12, "type": "float32", "unit": "ms", "access": "RW", "description": "60, 100 or 200 ms, default 60"},
    {"name": "Network parity and stop bits", "group": "Setup", "area": "holding", "address": 18, "type": "float32", "access": "RW", "description": "0 = no parity, 1 stop bit; 1 = even, 1 stop (the register table calls this the default; the specification says parity none); 2 = odd, 1 stop; 3 = no parity, 2 stop. Takes effect after a restart"},
    {"name": "Meter ID", "group": "Setup", "area": "holding", "address": 20, "type": "float32", "access": "RW", "description": "Modbus address 1 to 247, default 1"},
    {"name": "Pulse 1 rate", "group": "Setup", "area": "holding", "address": 22, "type": "float32", "access": "RW", "description": "0 = 0.001, 1 = 0.01, 2 = 0.1, 3 = 1 kWh per pulse"},
    {"name": "Baud rate", "group": "Setup", "area": "holding", "address": 28, "type": "float32", "access": "RW", "description": "0 = 2400, 1 = 4800, 2 = 9600 (default), 3 = 19200, 4 = 38400"},
    {"name": "Scroll display time", "group": "Setup", "area": "holding", "address": 58, "type": "float32", "unit": "s", "access": "RW", "description": "0 to 255 s; 0 (default) = no automatic scrolling"},
    {"name": "CO2 rate", "group": "Setup", "area": "holding", "address": 70, "type": "uint32", "scale": 0.0001, "unit": "kg/kWh", "access": "RW", "description": "0 to 60 kg per kWh, default 0.5703"},
    {"name": "Pulse 1 output mode", "group": "Setup", "area": "holding", "address": 86, "type": "float32", "access": "RW", "description": "1 = import active, 2 = total active (import + export), 4 = export active (default), 5 = import reactive, 6 = total reactive, 8 = export reactive"},
    {"name": "Reset historical data", "group": "Commands", "area": "holding", "address": 61456, "type": "uint16", "access": "W", "enum": {"0": "Reset demand"}, "description": "The manual documents writes with FC16; Modbench writes a single register with FC06, which the meter may reject"},
    {"name": "Scroll display time (BCD)", "group": "Setup", "area": "holding", "address": 63744, "type": "uint16", "access": "RW", "description": "BCD, 0 to 30 s (0x0030 = 30 s); 0 = no automatic scrolling. The manual documents writes with FC16; Modbench writes a single register with FC06, which the meter may reject"},
    {"name": "Pulse 1 output", "group": "Setup", "area": "holding", "address": 63760, "type": "uint16", "access": "RW", "enum": {"0": "0.001 kWh/imp", "1": "0.01 kWh/imp", "2": "0.1 kWh/imp", "3": "1 kWh/imp"}, "description": "The manual documents writes with FC16; Modbench writes a single register with FC06, which the meter may reject"},
    {"name": "Measurement mode", "group": "Setup", "area": "holding", "address": 63776, "type": "uint16", "access": "RW", "enum": {"1": "Total = import", "2": "Total = import + export", "3": "Total = import - export"}, "description": "Default 2. The manual documents writes with FC16; Modbench writes a single register with FC06, which the meter may reject"},
    {"name": "Serial number", "group": "Device", "area": "holding", "address": 64512, "type": "uint32", "access": "R", "role": "serial"},
    {"name": "Meter code", "group": "Device", "area": "holding", "address": 64514, "type": "uint16", "access": "R", "description": "0020h"},
    {"name": "Software version major", "group": "Device", "area": "holding", "address": 64644, "type": "uint16", "bit": 8, "bits": 8, "access": "R", "role": "firmware"},
    {"name": "Software version minor", "group": "Device", "area": "holding", "address": 64644, "type": "uint16", "bit": 0, "bits": 8, "access": "R", "role": "firmware"}
  ]
}
