{
  "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json",
  "mbmap": 2,
  "vendor": "ABB",
  "model": "M2M / DMTME",
  "models": ["M2M MODBUS", "M2M ALARM", "M2M I/O", "DMTME-I-485"],
  "vendor_website": "abb.com",
  "description": "Three-phase panel multimeters (M2M with RS485, DMTME-I-485), Modbus RTU",
  "revision": 2,
  "revised": "2026-10-17",
  "source": "ABB, \"M2M/DMTME Instruments - Communication protocol\", technical specification V2.0, 2CSG445011D0201; https://library.abb.com/d/2CSG445011D0201",
  "sources": [{"title": "M2M/DMTME Instruments - Communication protocol", "version": "Technical specification V2.0, 2CSG445011D0201", "url": "https://library.abb.com/d/2CSG445011D0201"}],
  "notes": [
    "ABB M2M (MODBUS, ALARM and I/O models) and DMTME-I-485 multimeters over RS485.",
    "Every value is a 32-bit long (2 registers, high word first); reads and writes use FC03 and FC16. Up to 24 values (48 registers) per read.",
    "Registers marked M2M only read as 0 on the DMTME. Active and reactive powers are unsigned on the DMTME.",
    "A power factor or cos phi of 2.000 (raw 2000) means not available, e.g. with no current.",
    "The instrument type and firmware are only given by FC11 Report slave ID: 80 = DMTME-I-485, 57 = M2M MODBUS, 58 = M2M ALARM, 59 = M2M I/O.",
    "Serial settings: 8 data bits, parity even, odd or none, 2400-19200 baud (DMTME) or 4800-19200 baud (M2M). Set the address on the instrument."
  ],
  "protocol": "rtu",
  "unit_id": 1,
  "byte_order": "big",
  "word_order": "big",
  "address_base": 0,
  "max_read_registers": 48,
  "enums": {
    "pf_na": {"2000": "Not available"}
  },
  "x_status": "official",
  "registers": [
    {"name": "System voltage", "group": "Voltage", "area": "holding", "address": "0x1000", "type": "uint32", "unit": "V", "access": "R"},
    {"name": "Voltage L1-N", "group": "Voltage", "area": "holding", "address": "0x1002", "type": "uint32", "unit": "V", "access": "R"},
    {"name": "Voltage L2-N", "group": "Voltage", "area": "holding", "address": "0x1004", "type": "uint32", "unit": "V", "access": "R"},
    {"name": "Voltage L3-N", "group": "Voltage", "area": "holding", "address": "0x1006", "type": "uint32", "unit": "V", "access": "R"},
    {"name": "Voltage L1-L2", "group": "Voltage", "area": "holding", "address": "0x1008", "type": "uint32", "unit": "V", "access": "R"},
    {"name": "Voltage L2-L3", "group": "Voltage", "area": "holding", "address": "0x100A", "type": "uint32", "unit": "V", "access": "R"},
    {"name": "Voltage L3-L1", "group": "Voltage", "area": "holding", "address": "0x100C", "type": "uint32", "unit": "V", "access": "R"},
    {"name": "System current", "group": "Current", "area": "holding", "address": "0x100E", "type": "uint32", "scale": 0.001, "unit": "A", "access": "R"},
    {"name": "Current L1", "group": "Current", "area": "holding", "address": "0x1010", "type": "uint32", "scale": 0.001, "unit": "A", "access": "R"},
    {"name": "Current L2", "group": "Current", "area": "holding", "address": "0x1012", "type": "uint32", "scale": 0.001, "unit": "A", "access": "R"},
    {"name": "Current L3", "group": "Current", "area": "holding", "address": "0x1014", "type": "uint32", "scale": 0.001, "unit": "A", "access": "R"},
    {"name": "Power factor total", "group": "Power factor", "area": "holding", "address": "0x1016", "type": "int32", "scale": 0.001, "access": "R", "enum": "pf_na"},
    {"name": "Power factor L1", "group": "Power factor", "area": "holding", "address": "0x1018", "type": "int32", "scale": 0.001, "access": "R", "enum": "pf_na"},
    {"name": "Power factor L2", "group": "Power factor", "area": "holding", "address": "0x101A", "type": "int32", "scale": 0.001, "access": "R", "enum": "pf_na"},
    {"name": "Power factor L3", "group": "Power factor", "area": "holding", "address": "0x101C", "type": "int32", "scale": 0.001, "access": "R", "enum": "pf_na"},
    {"name": "Cos phi total", "group": "Power factor", "area": "holding", "address": "0x101E", "type": "int32", "scale": 0.001, "access": "R", "enum": "pf_na"},
    {"name": "Cos phi L1", "group": "Power factor", "area": "holding", "address": "0x1020", "type": "int32", "scale": 0.001, "access": "R", "enum": "pf_na"},
    {"name": "Cos phi L2", "group": "Power factor", "area": "holding", "address": "0x1022", "type": "int32", "scale": 0.001, "access": "R", "enum": "pf_na"},
    {"name": "Cos phi L3", "group": "Power factor", "area": "holding", "address": "0x1024", "type": "int32", "scale": 0.001, "access": "R", "enum": "pf_na"},
    {"name": "Apparent power total", "group": "Power", "area": "holding", "address": "0x1026", "type": "uint32", "unit": "VA", "access": "R"},
    {"name": "Apparent power L1", "group": "Power", "area": "holding", "address": "0x1028", "type": "uint32", "unit": "VA", "access": "R"},
    {"name": "Apparent power L2", "group": "Power", "area": "holding", "address": "0x102A", "type": "uint32", "unit": "VA", "access": "R"},
    {"name": "Apparent power L3", "group": "Power", "area": "holding", "address": "0x102C", "type": "uint32", "unit": "VA", "access": "R"},
    {"name": "Active power total", "group": "Power", "area": "holding", "address": "0x102E", "type": "int32", "unit": "W", "access": "R", "description": "Signed on the M2M, unsigned on the DMTME"},
    {"name": "Active power L1", "group": "Power", "area": "holding", "address": "0x1030", "type": "int32", "unit": "W", "access": "R", "description": "Signed on the M2M, unsigned on the DMTME"},
    {"name": "Active power L2", "group": "Power", "area": "holding", "address": "0x1032", "type": "int32", "unit": "W", "access": "R", "description": "Signed on the M2M, unsigned on the DMTME"},
    {"name": "Active power L3", "group": "Power", "area": "holding", "address": "0x1034", "type": "int32", "unit": "W", "access": "R", "description": "Signed on the M2M, unsigned on the DMTME"},
    {"name": "Reactive power total", "group": "Power", "area": "holding", "address": "0x1036", "type": "int32", "unit": "var", "access": "R", "description": "Signed on the M2M, unsigned on the DMTME"},
    {"name": "Reactive power L1", "group": "Power", "area": "holding", "address": "0x1038", "type": "int32", "unit": "var", "access": "R", "description": "Signed on the M2M, unsigned on the DMTME"},
    {"name": "Reactive power L2", "group": "Power", "area": "holding", "address": "0x103A", "type": "int32", "unit": "var", "access": "R", "description": "Signed on the M2M, unsigned on the DMTME"},
    {"name": "Reactive power L3", "group": "Power", "area": "holding", "address": "0x103C", "type": "int32", "unit": "var", "access": "R", "description": "Signed on the M2M, unsigned on the DMTME"},
    {"name": "Active energy", "group": "Energy", "area": "holding", "address": "0x103E", "type": "uint32", "access": "R", "description": "Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Reactive energy", "group": "Energy", "area": "holding", "address": "0x1040", "type": "uint32", "access": "R", "description": "Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Frequency", "group": "Power", "area": "holding", "address": "0x1046", "type": "uint32", "scale": 0.001, "unit": "Hz", "access": "R"},
    {"name": "Max current L1", "group": "Maximum", "area": "holding", "address": "0x1060", "type": "uint32", "scale": 0.001, "unit": "A", "access": "R"},
    {"name": "Max current L2", "group": "Maximum", "area": "holding", "address": "0x1062", "type": "uint32", "scale": 0.001, "unit": "A", "access": "R"},
    {"name": "Max current L3", "group": "Maximum", "area": "holding", "address": "0x1064", "type": "uint32", "scale": 0.001, "unit": "A", "access": "R"},
    {"name": "Max active power", "group": "Maximum", "area": "holding", "address": "0x1066", "type": "int32", "unit": "W", "access": "R", "description": "Signed on the M2M, unsigned on the DMTME"},
    {"name": "Max apparent power", "group": "Maximum", "area": "holding", "address": "0x1068", "type": "uint32", "unit": "VA", "access": "R"},
    {"name": "Active power 15 min average", "group": "Averages", "area": "holding", "address": "0x1070", "type": "int32", "unit": "W", "access": "R", "description": "Signed on the M2M, unsigned on the DMTME"},
    {"name": "Apparent power 15 min average", "group": "Averages", "area": "holding", "address": "0x1072", "type": "uint32", "unit": "VA", "access": "R", "description": "M2M only"},
    {"name": "Active energy L1", "group": "Energy", "area": "holding", "address": "0x1074", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Active energy L2", "group": "Energy", "area": "holding", "address": "0x1076", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Active energy L3", "group": "Energy", "area": "holding", "address": "0x1078", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Reactive energy L1", "group": "Energy", "area": "holding", "address": "0x107A", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Reactive energy L2", "group": "Energy", "area": "holding", "address": "0x107C", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Reactive energy L3", "group": "Energy", "area": "holding", "address": "0x107E", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Max active power 15 min average", "group": "Averages", "area": "holding", "address": "0x1080", "type": "int32", "unit": "W", "access": "R", "description": "M2M only"},
    {"name": "Voltage THD L1", "group": "Harmonics", "area": "holding", "address": "0x1082", "type": "uint32", "scale": 0.01, "unit": "%", "access": "R", "description": "M2M only; 0 when not defined"},
    {"name": "Voltage THD L2", "group": "Harmonics", "area": "holding", "address": "0x1084", "type": "uint32", "scale": 0.01, "unit": "%", "access": "R", "description": "M2M only; 0 when not defined"},
    {"name": "Voltage THD L3", "group": "Harmonics", "area": "holding", "address": "0x1086", "type": "uint32", "scale": 0.01, "unit": "%", "access": "R", "description": "M2M only; 0 when not defined"},
    {"name": "Current THD L1", "group": "Harmonics", "area": "holding", "address": "0x1088", "type": "uint32", "scale": 0.01, "unit": "%", "access": "R", "description": "M2M only; 0 when not defined"},
    {"name": "Current THD L2", "group": "Harmonics", "area": "holding", "address": "0x108A", "type": "uint32", "scale": 0.01, "unit": "%", "access": "R", "description": "M2M only; 0 when not defined"},
    {"name": "Current THD L3", "group": "Harmonics", "area": "holding", "address": "0x108C", "type": "uint32", "scale": 0.01, "unit": "%", "access": "R", "description": "M2M only; 0 when not defined"},
    {"name": "Max active power 15 min average L1", "group": "Averages", "area": "holding", "address": "0x108E", "type": "int32", "unit": "W", "access": "R", "description": "M2M only"},
    {"name": "Max active power 15 min average L2", "group": "Averages", "area": "holding", "address": "0x1090", "type": "int32", "unit": "W", "access": "R", "description": "M2M only"},
    {"name": "Max active power 15 min average L3", "group": "Averages", "area": "holding", "address": "0x1092", "type": "int32", "unit": "W", "access": "R", "description": "M2M only"},
    {"name": "Max apparent power 15 min average", "group": "Averages", "area": "holding", "address": "0x1094", "type": "uint32", "unit": "VA", "access": "R", "description": "M2M only"},
    {"name": "Max apparent power 15 min average L1", "group": "Averages", "area": "holding", "address": "0x1096", "type": "uint32", "unit": "VA", "access": "R", "description": "M2M only"},
    {"name": "Max apparent power 15 min average L2", "group": "Averages", "area": "holding", "address": "0x1098", "type": "uint32", "unit": "VA", "access": "R", "description": "M2M only"},
    {"name": "Max apparent power 15 min average L3", "group": "Averages", "area": "holding", "address": "0x109A", "type": "uint32", "unit": "VA", "access": "R", "description": "M2M only"},
    {"name": "Average active power from pulse input 1", "group": "Pulse inputs", "area": "holding", "address": "0x109C", "type": "uint32", "unit": "W", "access": "R", "description": "M2M I/O only"},
    {"name": "Average reactive power from pulse input 2", "group": "Pulse inputs", "area": "holding", "address": "0x109E", "type": "uint32", "unit": "var", "access": "R", "description": "M2M I/O only"},
    {"name": "Active energy from pulse input 1", "group": "Pulse inputs", "area": "holding", "address": "0x10A0", "type": "uint32", "access": "R", "description": "M2M I/O only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Reactive energy from pulse input 2", "group": "Pulse inputs", "area": "holding", "address": "0x10A2", "type": "uint32", "access": "R", "description": "M2M I/O only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Timer 2 current threshold", "group": "Settings", "area": "holding", "address": "0x10A4", "type": "uint32", "scale": 0.001, "unit": "A", "access": "R", "description": "M2M only"},
    {"name": "Apparent energy total", "group": "Energy", "area": "holding", "address": "0x10A6", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Apparent energy L1", "group": "Energy", "area": "holding", "address": "0x10A8", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Apparent energy L2", "group": "Energy", "area": "holding", "address": "0x10AA", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Apparent energy L3", "group": "Energy", "area": "holding", "address": "0x10AC", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Generated active energy total", "group": "Energy", "area": "holding", "address": "0x10AE", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Generated active energy L1", "group": "Energy", "area": "holding", "address": "0x10B0", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Generated active energy L2", "group": "Energy", "area": "holding", "address": "0x10B2", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Generated active energy L3", "group": "Energy", "area": "holding", "address": "0x10B4", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Generated reactive energy total", "group": "Energy", "area": "holding", "address": "0x10B6", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Generated reactive energy L1", "group": "Energy", "area": "holding", "address": "0x10B8", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Generated reactive energy L2", "group": "Energy", "area": "holding", "address": "0x10BA", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Generated reactive energy L3", "group": "Energy", "area": "holding", "address": "0x10BC", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Generated apparent energy total", "group": "Energy", "area": "holding", "address": "0x10BE", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Generated apparent energy L1", "group": "Energy", "area": "holding", "address": "0x10C0", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Generated apparent energy L2", "group": "Energy", "area": "holding", "address": "0x10C2", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "Generated apparent energy L3", "group": "Energy", "area": "holding", "address": "0x10C4", "type": "uint32", "access": "R", "description": "M2M only; Unit printed as \"Wh * 100\" (varh, VAh): either 100 Wh or 0.01 Wh steps; check against the display"},
    {"name": "CT ratio", "group": "Settings", "area": "holding", "address": "0x11A0", "type": "uint32", "access": "RW", "write_min": 1, "write_max": 2000, "description": "1-1250 on the DMTME, 1-2000 on the M2M; on the M2M writing sets the CT to (ratio × 5 A)/5 A"},
    {"name": "VT ratio", "group": "Settings", "area": "holding", "address": "0x11A2", "type": "uint32", "access": "RW", "write_min": 1, "write_max": 600, "description": "1-500 on the DMTME, 1-600 on the M2M; on the M2M writing sets the VT to (ratio × 100 V)/100 V"},
    {"name": "Pulse energy weight", "group": "Settings", "area": "holding", "address": "0x11A4", "type": "uint32", "access": "RW", "write_min": 1, "write_max": 4, "enum": {"1": "10 Wh/varh", "2": "100 Wh/varh", "3": "1000 Wh/varh", "4": "10000 Wh/varh"}},
    {"name": "Reset energy counters", "group": "Commands", "area": "holding", "address": "0x11B0", "type": "uint32", "access": "W", "enum": {"0x11B055AA": "Execute"}, "description": "Write the register address followed by 55AAh"},
    {"name": "Reset max values", "group": "Commands", "area": "holding", "address": "0x11B2", "type": "uint32", "access": "W", "enum": {"0x11B255AA": "Execute"}, "description": "Write the register address followed by 55AAh"},
    {"name": "Reset average values", "group": "Commands", "area": "holding", "address": "0x11B4", "type": "uint32", "access": "W", "enum": {"0x11B455AA": "Execute"}, "description": "Write the register address followed by 55AAh"}
  ]
}
