{
  "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json",
  "mbmap": 2,
  "vendor": "Contrel",
  "model": "EMC series",
  "models": ["EMC series", "EMM-µD3h-485"],
  "vendor_website": "contrel.it",
  "description": "Multifunction electrical meter",
  "revision": 3,
  "revised": "2026-11-10",
  "source": "Contrel EMC series communication protocol, instruction manual IM154-U v0.94",
  "sources": [
    {"title": "EMC series electrical multifunction meter communication protocol", "version": "IM154-U v0.94", "note": "register tables, pages 8-11"}
  ],
  "notes": [
    "Every value is a 32-bit integer in two registers, high word first.",
    "A value the meter cannot measure reads 0.",
    "The meter answers at most 32 registers (16 values) per read; a read must not split a value.",
    "Energy T1 is the total or time band 1 counter and T2 the partial or time band 2 counter, depending on the energy mode. Meters without these functions only have T1.",
    "The model and firmware are reported by Report Slave ID (FC17), not by a register: slave ID 0x50, firmware in data bytes 19-20, options in bytes 17-18.",
    "The manual does not give the scale of the power factor and cos phi registers. On a device they read as thousandths (574 = 0.574, equal to active / apparent power), so the map scales them by 0.001.",
    "Tested on an EMM-µD3h-485 (EMM-µD3), read over a Modbus TCP gateway, November 2026: all 80 registers read without errors. Checked: voltages, currents, power, energy (T1, T2 empty), frequency, status, settings and the 32-bit word order (big). The Max voltage L1-L3 registers (0x1072-0x1076) read 105145, 1009514 and 675279 with 226 V on the line, so they do not fit any scale and were not verified. Temperature, hour counter and neutral current read 0 on this meter."
  ],
  "protocol": "rtu",
  "byte_order": "big",
  "word_order": "big",
  "address_base": 0,
  "max_read_registers": 32,
  "enums": {
    "do_mode_1": {"1": "Active energy pulses", "2": "Three-phase alarm", "3": "Max/min L1-L2-L3 alarm", "4": "Remote control"},
    "do_mode_2": {"1": "Reactive energy pulses", "2": "Three-phase alarm", "3": "Max/min L1-L2-L3 alarm", "4": "Remote control"},
    "do_control": {"0x000055AA": "Off", "0x010055AA": "On"}
  },
  "x_status": "verified",
  "registers": [
    {"name": "System voltage", "group": "Measurements", "area": "holding", "address": "0x1000", "type": "uint32", "unit": "V", "description": "Three-phase system voltage"},
    {"name": "Voltage L1-N", "group": "Measurements", "area": "holding", "address": "0x1002", "type": "uint32", "unit": "V"},
    {"name": "Voltage L2-N", "group": "Measurements", "area": "holding", "address": "0x1004", "type": "uint32", "unit": "V"},
    {"name": "Voltage L3-N", "group": "Measurements", "area": "holding", "address": "0x1006", "type": "uint32", "unit": "V"},
    {"name": "Voltage L1-L2", "group": "Measurements", "area": "holding", "address": "0x1008", "type": "uint32", "unit": "V"},
    {"name": "Voltage L2-L3", "group": "Measurements", "area": "holding", "address": "0x100A", "type": "uint32", "unit": "V"},
    {"name": "Voltage L3-L1", "group": "Measurements", "area": "holding", "address": "0x100C", "type": "uint32", "unit": "V"},
    {"name": "System current", "group": "Measurements", "area": "holding", "address": "0x100E", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Three-phase system current (sent in mA)"},
    {"name": "Current L1", "group": "Measurements", "area": "holding", "address": "0x1010", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Sent in mA"},
    {"name": "Current L2", "group": "Measurements", "area": "holding", "address": "0x1012", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Sent in mA"},
    {"name": "Current L3", "group": "Measurements", "area": "holding", "address": "0x1014", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Sent in mA"},
    {"name": "System power factor", "group": "Measurements", "area": "holding", "address": "0x1016", "type": "int32", "scale": 0.001, "description": "Raw value divided by 1000 (574 = 0.574); the manual does not give the scale, checked against active / apparent power on a device"},
    {"name": "Power factor L1", "group": "Measurements", "area": "holding", "address": "0x1018", "type": "int32", "scale": 0.001, "description": "Raw value divided by 1000 (574 = 0.574); the manual does not give the scale, checked against active / apparent power on a device"},
    {"name": "Power factor L2", "group": "Measurements", "area": "holding", "address": "0x101A", "type": "int32", "scale": 0.001, "description": "Raw value divided by 1000 (574 = 0.574); the manual does not give the scale, checked against active / apparent power on a device"},
    {"name": "Power factor L3", "group": "Measurements", "area": "holding", "address": "0x101C", "type": "int32", "scale": 0.001, "description": "Raw value divided by 1000 (574 = 0.574); the manual does not give the scale, checked against active / apparent power on a device"},
    {"name": "System cos phi", "group": "Measurements", "area": "holding", "address": "0x101E", "type": "int32", "scale": 0.001, "description": "Raw value divided by 1000 (574 = 0.574); the manual does not give the scale, checked against active / apparent power on a device"},
    {"name": "Cos phi L1", "group": "Measurements", "area": "holding", "address": "0x1020", "type": "int32", "scale": 0.001, "description": "Raw value divided by 1000 (574 = 0.574); the manual does not give the scale, checked against active / apparent power on a device"},
    {"name": "Cos phi L2", "group": "Measurements", "area": "holding", "address": "0x1022", "type": "int32", "scale": 0.001, "description": "Raw value divided by 1000 (574 = 0.574); the manual does not give the scale, checked against active / apparent power on a device"},
    {"name": "Cos phi L3", "group": "Measurements", "area": "holding", "address": "0x1024", "type": "int32", "scale": 0.001, "description": "Raw value divided by 1000 (574 = 0.574); the manual does not give the scale, checked against active / apparent power on a device"},
    {"name": "System apparent power", "group": "Measurements", "area": "holding", "address": "0x1026", "type": "uint32", "unit": "VA"},
    {"name": "Apparent power L1", "group": "Measurements", "area": "holding", "address": "0x1028", "type": "uint32", "unit": "VA"},
    {"name": "Apparent power L2", "group": "Measurements", "area": "holding", "address": "0x102A", "type": "uint32", "unit": "VA"},
    {"name": "Apparent power L3", "group": "Measurements", "area": "holding", "address": "0x102C", "type": "uint32", "unit": "VA"},
    {"name": "System active power", "group": "Measurements", "area": "holding", "address": "0x102E", "type": "uint32", "unit": "W"},
    {"name": "Active power L1", "group": "Measurements", "area": "holding", "address": "0x1030", "type": "uint32", "unit": "W"},
    {"name": "Active power L2", "group": "Measurements", "area": "holding", "address": "0x1032", "type": "uint32", "unit": "W"},
    {"name": "Active power L3", "group": "Measurements", "area": "holding", "address": "0x1034", "type": "uint32", "unit": "W"},
    {"name": "System reactive power", "group": "Measurements", "area": "holding", "address": "0x1036", "type": "uint32", "unit": "var"},
    {"name": "Reactive power L1", "group": "Measurements", "area": "holding", "address": "0x1038", "type": "uint32", "unit": "var"},
    {"name": "Reactive power L2", "group": "Measurements", "area": "holding", "address": "0x103A", "type": "uint32", "unit": "var"},
    {"name": "Reactive power L3", "group": "Measurements", "area": "holding", "address": "0x103C", "type": "uint32", "unit": "var"},
    {"name": "Active energy T1", "group": "Energy", "area": "holding", "address": "0x103E", "type": "uint32", "scale": 0.1, "unit": "kWh", "description": "Three-phase, in units of 100 Wh"},
    {"name": "Reactive energy T1", "group": "Energy", "area": "holding", "address": "0x1040", "type": "uint32", "scale": 0.1, "unit": "kvarh", "description": "Three-phase, in units of 100 varh"},
    {"name": "Active energy T2", "group": "Energy", "area": "holding", "address": "0x1042", "type": "uint32", "scale": 0.1, "unit": "kWh", "description": "Three-phase, in units of 100 Wh"},
    {"name": "Reactive energy T2", "group": "Energy", "area": "holding", "address": "0x1044", "type": "uint32", "scale": 0.1, "unit": "kvarh", "description": "Three-phase, in units of 100 varh"},
    {"name": "Frequency", "group": "Measurements", "area": "holding", "address": "0x1046", "type": "uint32", "scale": 0.001, "unit": "Hz", "description": "Sent in mHz"},
    {"name": "Neutral current", "group": "Measurements", "area": "holding", "address": "0x1048", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Sent in mA"},
    {"name": "Apparent energy T1", "group": "Energy", "area": "holding", "address": "0x104A", "type": "uint32", "scale": 0.1, "unit": "kVAh", "description": "Three-phase, in units of 100 VAh"},
    {"name": "Apparent energy T2", "group": "Energy", "area": "holding", "address": "0x104C", "type": "uint32", "scale": 0.1, "unit": "kVAh", "description": "Three-phase, in units of 100 VAh"},
    {"name": "Max current L1", "group": "Max and average values", "area": "holding", "address": "0x1060", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Maximum instantaneous value"},
    {"name": "Max current L2", "group": "Max and average values", "area": "holding", "address": "0x1062", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Maximum instantaneous value"},
    {"name": "Max current L3", "group": "Max and average values", "area": "holding", "address": "0x1064", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Maximum instantaneous value"},
    {"name": "Max system active power", "group": "Max and average values", "area": "holding", "address": "0x1066", "type": "uint32", "unit": "W", "description": "Maximum instantaneous value"},
    {"name": "Max system apparent power", "group": "Max and average values", "area": "holding", "address": "0x1068", "type": "uint32", "unit": "VA", "description": "Maximum instantaneous value"},
    {"name": "Max demand current L1", "group": "Max and average values", "area": "holding", "address": "0x106A", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Highest average value"},
    {"name": "Max demand current L2", "group": "Max and average values", "area": "holding", "address": "0x106C", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Highest average value"},
    {"name": "Max demand current L3", "group": "Max and average values", "area": "holding", "address": "0x106E", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Highest average value"},
    {"name": "Max demand system active power", "group": "Max and average values", "area": "holding", "address": "0x1070", "type": "uint32", "unit": "W", "description": "Highest average value"},
    {"name": "Max voltage L1", "group": "Max and average values", "area": "holding", "address": "0x1072", "type": "uint32", "unit": "V", "description": "Maximum instantaneous value"},
    {"name": "Max voltage L2", "group": "Max and average values", "area": "holding", "address": "0x1074", "type": "uint32", "unit": "V", "description": "Maximum instantaneous value"},
    {"name": "Max voltage L3", "group": "Max and average values", "area": "holding", "address": "0x1076", "type": "uint32", "unit": "V", "description": "Maximum instantaneous value"},
    {"name": "Max system reactive power", "group": "Max and average values", "area": "holding", "address": "0x1078", "type": "uint32", "unit": "var", "description": "Maximum instantaneous value"},
    {"name": "Max demand system reactive power", "group": "Max and average values", "area": "holding", "address": "0x107A", "type": "uint32", "unit": "var", "description": "Highest average value"},
    {"name": "Max demand system apparent power", "group": "Max and average values", "area": "holding", "address": "0x107C", "type": "uint32", "unit": "VA", "description": "Highest average value"},
    {"name": "Last average system active power", "group": "Max and average values", "area": "holding", "address": "0x107E", "type": "uint32", "unit": "W"},
    {"name": "Last average system reactive power", "group": "Max and average values", "area": "holding", "address": "0x1080", "type": "uint32", "unit": "var"},
    {"name": "Last average system apparent power", "group": "Max and average values", "area": "holding", "address": "0x1082", "type": "uint32", "unit": "VA"},
    {"name": "Max neutral current", "group": "Max and average values", "area": "holding", "address": "0x1084", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Maximum instantaneous value"},
    {"name": "Max demand neutral current", "group": "Max and average values", "area": "holding", "address": "0x1086", "type": "uint32", "scale": 0.001, "unit": "A", "description": "Highest average value"},
    {"name": "Last average neutral current", "group": "Max and average values", "area": "holding", "address": "0x1088", "type": "uint32", "scale": 0.001, "unit": "A"},
    {"name": "Last average current L1", "group": "Max and average values", "area": "holding", "address": "0x108A", "type": "uint32", "scale": 0.001, "unit": "A"},
    {"name": "Last average current L2", "group": "Max and average values", "area": "holding", "address": "0x108C", "type": "uint32", "scale": 0.001, "unit": "A"},
    {"name": "Last average current L3", "group": "Max and average values", "area": "holding", "address": "0x108E", "type": "uint32", "scale": 0.001, "unit": "A"},
    {"name": "Temperature", "group": "Measurements", "area": "holding", "address": "0x1096", "type": "uint32", "unit": "°C"},
    {"name": "Hour counter", "group": "Measurements", "area": "holding", "address": "0x1098", "type": "uint32", "scale": 0.1, "unit": "h", "description": "Sent in tenths of an hour"},
    {"name": "DO1 mode", "group": "Status", "area": "holding", "address": "0x109A", "type": "uint16", "bit": 8, "bits": 8, "enum": "do_mode_1", "description": "High byte of the DO1 settings"},
    {"name": "DO1 alarm parameter", "group": "Status", "area": "holding", "address": "0x109A", "type": "uint16", "bit": 0, "bits": 8, "description": "Low byte of the DO1 settings: index of the measure in table A (three-phase alarm) or table B (max/min alarm) of the manual"},
    {"name": "DO2 mode", "group": "Status", "area": "holding", "address": "0x109B", "type": "uint16", "bit": 8, "bits": 8, "enum": "do_mode_2", "description": "High byte of the DO2 settings"},
    {"name": "DO2 alarm parameter", "group": "Status", "area": "holding", "address": "0x109B", "type": "uint16", "bit": 0, "bits": 8, "description": "Low byte of the DO2 settings: index of the measure in table A (three-phase alarm) or table B (max/min alarm) of the manual"},
    {"name": "DO1 status", "group": "Status", "area": "holding", "address": "0x109C", "type": "uint16", "bit": 8, "bits": 8},
    {"name": "DO2 status", "group": "Status", "area": "holding", "address": "0x109C", "type": "uint16", "bit": 0, "bits": 8},
    {"name": "DI status", "group": "Status", "area": "holding", "address": "0x109D", "type": "uint16", "bit": 0, "bits": 8, "enum": {"0": "Powered", "1": "Not powered"}},
    {"name": "Sync mode", "group": "Status", "area": "holding", "address": "0x109E", "type": "uint16", "bit": 8, "bits": 8, "enum": {"1": "External sync", "2": "Internal sync 50 Hz", "3": "Internal sync 60 Hz"}},
    {"name": "Energy mode", "group": "Status", "area": "holding", "address": "0x109E", "type": "uint16", "bit": 0, "bits": 8, "enum": {"1": "Time bands", "2": "Total / partial", "3": "Single counter"}},
    {"name": "Neutral line mode", "group": "Status", "area": "holding", "address": "0x109F", "type": "uint16", "bit": 8, "bits": 8, "enum": {"1": "4-wire (with neutral)", "2": "3-wire"}},
    {"name": "Phase mode", "group": "Status", "area": "holding", "address": "0x109F", "type": "uint16", "bit": 0, "bits": 8, "enum": {"1": "Three-phase unbalanced", "2": "Three-phase balanced", "3": "Single phase"}},
    {"name": "CT ratio", "group": "Settings", "area": "holding", "address": "0x11A0", "type": "uint32", "access": "RW", "write_min": 1, "write_max": 2000, "description": "Current transformer ratio for L1-L2-L3"},
    {"name": "VT ratio", "group": "Settings", "area": "holding", "address": "0x11A2", "type": "uint32", "scale": 0.1, "access": "RW", "write_min": 0.1, "write_max": 400, "description": "Voltage transformer ratio"},
    {"name": "Pulse weight", "group": "Settings", "area": "holding", "address": "0x11A4", "type": "uint32", "access": "RW", "write_min": 1, "write_max": 4, "enum": {"1": "0.01 kWh-kvarh/pulse", "2": "0.1 kWh-kvarh/pulse", "3": "1 kWh-kvarh/pulse", "4": "10 kWh-kvarh/pulse"}},
    {"name": "Neutral CT ratio", "group": "Settings", "area": "holding", "address": "0x11A6", "type": "uint32", "access": "RW", "write_min": 1, "write_max": 2000, "description": "Current transformer ratio for the neutral"},
    {"name": "DO1 control", "group": "Commands", "area": "holding", "address": "0x11A8", "type": "uint32", "access": "W", "enum": "do_control", "description": "Output state in the high word, enable code 0x55AA in the low word. Only when DO1 is set to remote control"},
    {"name": "DO2 control", "group": "Commands", "area": "holding", "address": "0x11AA", "type": "uint32", "access": "W", "enum": "do_control", "description": "Output state in the high word, enable code 0x55AA in the low word. Only when DO2 is set to remote control"},
    {"name": "Reset energy counters", "group": "Commands", "area": "holding", "address": "0x11B0", "type": "uint32", "access": "W", "write_min": 296768938, "write_max": 296768938, "description": "Write 0x11B055AA"},
    {"name": "Reset max instantaneous values", "group": "Commands", "area": "holding", "address": "0x11B2", "type": "uint32", "access": "W", "write_min": 296900010, "write_max": 296900010, "description": "Write 0x11B255AA"},
    {"name": "Reset max demand values", "group": "Commands", "area": "holding", "address": "0x11B4", "type": "uint32", "access": "W", "write_min": 297031082, "write_max": 297031082, "description": "Write 0x11B455AA"},
    {"name": "Reset all values", "group": "Commands", "area": "holding", "address": "0x11B6", "type": "uint32", "access": "W", "write_min": 297162154, "write_max": 297162154, "description": "Write 0x11B655AA: max values and counters"}
  ]
}
