{
  "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json",
  "mbmap": 2,
  "vendor": "Lovato Electric",
  "model": "DMG610 / DMG615 / DMG620",
  "models": [
    "DMG610",
    "DMG615",
    "DMG620"
  ],
  "vendor_website": "lovatoelectric.com",
  "description": "Digital multimeter",
  "revision": 3,
  "revised": "2026-11-10",
  "source": "Lovato Electric, DMG series Modbus communication protocol, I317 I GB 02_22",
  "sources": [
    {
      "title": "DMG series - Modbus communication protocol",
      "version": "I317 I GB 02_22",
      "date": "2022-02-07",
      "url": "https://catalogue.lovatoelectric.com/gb_en/Product/GetDocument?doc=Technical%5CTechInstructions%5C28.%20CONTATORI%20DI%20ENERGIA%20E%20ANALIZZATORI%20DI%20RETE%5CI317IGB02_22.pdf",
      "note": "tables 2 and 3"
    }
  ],
  "notes": [
    "Addresses are those of the manual; the address sent in the request is one less (address_base 1).",
    "Function 03 and 04 both read the measurements. 32- and 64-bit values are sent high word first.",
    "DMG610 and DMG615 have a built-in RS-485 port; DMG620 has Ethernet (Modbus TCP). DMG600 has no communication port.",
    "The model is reported by function 17 (Report Slave ID), see identify: type code 0x41 = DMG610 (read on a device), 0x57 = DMG620 (manual). The manual also lists a code for the DMG615, but the English text is cut off, so it is not given here.",
    "Max (HI), min (LO), average and max demand values, harmonics, I/O and setup parameters (tables 4-8 of the manual) are not listed here.",
    "Tested on a DMG610 (Report Slave ID type code 0x41, software revision 2, hardware revision 0, parameter revision 1) read over a Modbus TCP gateway, November 2026: all 54 registers read without errors. Checked: voltages, currents (current and power agree: 293284 VA / 231.15 V = 1268.8 A), power, power factor, THD, neutral current, asymmetry, the 64-bit energy counters, hour meters and the word order (big). Frequency read 50030, so its scale is 0.001 (50.03 Hz), not 0.01 as this map had before."
  ],
  "protocol": "tcp+rtu",
  "unit_id": 1,
  "byte_order": "big",
  "word_order": "big",
  "address_base": 1,
  "x_status": "verified",
  "enums": {
    "type_codes": {"0x41": "DMG610", "0x57": "DMG620"}
  },
  "identify": {
    "function": 17,
    "fields": [
      {"name": "Type", "offset": 0, "type": "uint8", "role": "model", "enum": "type_codes"},
      {"name": "Software revision", "offset": 1, "type": "uint8", "role": "firmware"},
      {"name": "Hardware revision", "offset": 2, "type": "uint8"},
      {"name": "Parameter revision", "offset": 3, "type": "uint8"}
    ]
  },
  "registers": [
    {"name": "Voltage L1-N", "group": "Measurements", "area": "holding", "address": 2, "type": "uint32", "scale": 0.01, "unit": "V"},
    {"name": "Voltage L2-N", "group": "Measurements", "area": "holding", "address": 4, "type": "uint32", "scale": 0.01, "unit": "V"},
    {"name": "Voltage L3-N", "group": "Measurements", "area": "holding", "address": 6, "type": "uint32", "scale": 0.01, "unit": "V"},
    {"name": "Current L1", "group": "Measurements", "area": "holding", "address": 8, "type": "uint32", "scale": 0.0001, "unit": "A"},
    {"name": "Current L2", "group": "Measurements", "area": "holding", "address": 10, "type": "uint32", "scale": 0.0001, "unit": "A"},
    {"name": "Current L3", "group": "Measurements", "area": "holding", "address": 12, "type": "uint32", "scale": 0.0001, "unit": "A"},
    {"name": "Voltage L1-L2", "group": "Measurements", "area": "holding", "address": 14, "type": "uint32", "scale": 0.01, "unit": "V"},
    {"name": "Voltage L2-L3", "group": "Measurements", "area": "holding", "address": 16, "type": "uint32", "scale": 0.01, "unit": "V"},
    {"name": "Voltage L3-L1", "group": "Measurements", "area": "holding", "address": 18, "type": "uint32", "scale": 0.01, "unit": "V"},
    {"name": "Active power L1", "group": "Measurements", "area": "holding", "address": 20, "type": "int32", "scale": 0.01, "unit": "W"},
    {"name": "Active power L2", "group": "Measurements", "area": "holding", "address": 22, "type": "int32", "scale": 0.01, "unit": "W"},
    {"name": "Active power L3", "group": "Measurements", "area": "holding", "address": 24, "type": "int32", "scale": 0.01, "unit": "W"},
    {"name": "Reactive power L1", "group": "Measurements", "area": "holding", "address": 26, "type": "int32", "scale": 0.01, "unit": "var"},
    {"name": "Reactive power L2", "group": "Measurements", "area": "holding", "address": 28, "type": "int32", "scale": 0.01, "unit": "var"},
    {"name": "Reactive power L3", "group": "Measurements", "area": "holding", "address": 30, "type": "int32", "scale": 0.01, "unit": "var"},
    {"name": "Apparent power L1", "group": "Measurements", "area": "holding", "address": 32, "type": "uint32", "scale": 0.01, "unit": "VA"},
    {"name": "Apparent power L2", "group": "Measurements", "area": "holding", "address": 34, "type": "uint32", "scale": 0.01, "unit": "VA"},
    {"name": "Apparent power L3", "group": "Measurements", "area": "holding", "address": 36, "type": "uint32", "scale": 0.01, "unit": "VA"},
    {"name": "Power factor L1", "group": "Measurements", "area": "holding", "address": 38, "type": "int32", "scale": 0.0001},
    {"name": "Power factor L2", "group": "Measurements", "area": "holding", "address": 40, "type": "int32", "scale": 0.0001},
    {"name": "Power factor L3", "group": "Measurements", "area": "holding", "address": 42, "type": "int32", "scale": 0.0001},
    {"name": "Frequency", "group": "Measurements", "area": "holding", "address": 50, "type": "uint32", "scale": 0.001, "unit": "Hz"},
    {"name": "Equivalent phase voltage", "group": "Measurements", "area": "holding", "address": 52, "type": "uint32", "scale": 0.01, "unit": "V"},
    {"name": "Equivalent line voltage", "group": "Measurements", "area": "holding", "address": 54, "type": "uint32", "scale": 0.01, "unit": "V"},
    {"name": "Equivalent current", "group": "Measurements", "area": "holding", "address": 56, "type": "uint32", "scale": 0.0001, "unit": "A"},
    {"name": "Total active power", "group": "Measurements", "area": "holding", "address": 58, "type": "int32", "scale": 0.01, "unit": "W"},
    {"name": "Total reactive power", "group": "Measurements", "area": "holding", "address": 60, "type": "int32", "scale": 0.01, "unit": "var"},
    {"name": "Total apparent power", "group": "Measurements", "area": "holding", "address": 62, "type": "uint32", "scale": 0.01, "unit": "VA"},
    {"name": "Total power factor", "group": "Measurements", "area": "holding", "address": 64, "type": "int32", "scale": 0.0001},
    {"name": "Line voltage asymmetry", "group": "Measurements", "area": "holding", "address": 66, "type": "uint32", "scale": 0.01, "unit": "%"},
    {"name": "Phase voltage asymmetry", "group": "Measurements", "area": "holding", "address": 68, "type": "uint32", "scale": 0.01, "unit": "%"},
    {"name": "Current asymmetry", "group": "Measurements", "area": "holding", "address": 70, "type": "uint32", "scale": 0.01, "unit": "%"},
    {"name": "Neutral current", "group": "Measurements", "area": "holding", "address": 72, "type": "uint32", "scale": 0.0001, "unit": "A"},
    {"name": "THD voltage L1", "group": "Measurements", "area": "holding", "address": 84, "type": "uint32", "scale": 0.01, "unit": "%"},
    {"name": "THD voltage L2", "group": "Measurements", "area": "holding", "address": 86, "type": "uint32", "scale": 0.01, "unit": "%"},
    {"name": "THD voltage L3", "group": "Measurements", "area": "holding", "address": 88, "type": "uint32", "scale": 0.01, "unit": "%"},
    {"name": "THD current L1", "group": "Measurements", "area": "holding", "address": 90, "type": "uint32", "scale": 0.01, "unit": "%"},
    {"name": "THD current L2", "group": "Measurements", "area": "holding", "address": 92, "type": "uint32", "scale": 0.01, "unit": "%"},
    {"name": "THD current L3", "group": "Measurements", "area": "holding", "address": 94, "type": "uint32", "scale": 0.01, "unit": "%"},
    {"name": "THD voltage L1-L2", "group": "Measurements", "area": "holding", "address": 96, "type": "uint32", "scale": 0.01, "unit": "%"},
    {"name": "THD voltage L2-L3", "group": "Measurements", "area": "holding", "address": 98, "type": "uint32", "scale": 0.01, "unit": "%"},
    {"name": "THD voltage L3-L1", "group": "Measurements", "area": "holding", "address": 100, "type": "uint32", "scale": 0.01, "unit": "%"},
    {"name": "Imported active energy", "group": "Energy", "area": "holding", "address": 6944, "type": "uint64", "scale": 0.01, "unit": "kWh"},
    {"name": "Exported active energy", "group": "Energy", "area": "holding", "address": 6948, "type": "uint64", "scale": 0.01, "unit": "kWh"},
    {"name": "Imported reactive energy", "group": "Energy", "area": "holding", "address": 6952, "type": "uint64", "scale": 0.01, "unit": "kvarh"},
    {"name": "Exported reactive energy", "group": "Energy", "area": "holding", "address": 6956, "type": "uint64", "scale": 0.01, "unit": "kvarh"},
    {"name": "Apparent energy", "group": "Energy", "area": "holding", "address": 6960, "type": "uint64", "scale": 0.01, "unit": "kVAh"},
    {"name": "Partial imported active energy", "group": "Energy", "area": "holding", "address": 6964, "type": "uint64", "scale": 0.01, "unit": "kWh"},
    {"name": "Partial exported active energy", "group": "Energy", "area": "holding", "address": 6968, "type": "uint64", "scale": 0.01, "unit": "kWh"},
    {"name": "Partial imported reactive energy", "group": "Energy", "area": "holding", "address": 6972, "type": "uint64", "scale": 0.01, "unit": "kvarh"},
    {"name": "Partial exported reactive energy", "group": "Energy", "area": "holding", "address": 6976, "type": "uint64", "scale": 0.01, "unit": "kvarh"},
    {"name": "Partial apparent energy", "group": "Energy", "area": "holding", "address": 6980, "type": "uint64", "scale": 0.01, "unit": "kVAh"},
    {"name": "Total hour meter", "group": "Hour meters", "area": "holding", "address": 7680, "type": "uint32", "unit": "s"},
    {"name": "Partial hour meter", "group": "Hour meters", "area": "holding", "address": 7682, "type": "uint32", "unit": "s"},
    {"name": "System reboot", "group": "Commands", "area": "holding", "address": 12033, "type": "uint16", "access": "W", "write_min": 1, "write_max": 1, "description": "Write 1"},
    {"name": "Command", "group": "Commands", "area": "holding", "address": 12272, "type": "uint16", "access": "W", "enum": {"0": "Reset HI-LO values", "1": "Reset max demand", "2": "Reset partial energy", "3": "Reset partial hour meter", "6": "Reset alarms", "7": "Reset limits", "11": "Reset all energy counters", "12": "Reset all hour meters", "13": "Parameters to default", "14": "Backup parameters", "15": "Restore parameters", "16": "Wiring test", "100": "Reset HI", "200": "Reset LO"}, "description": "Write with function 06; send a reboot after the parameter commands (13-15)"}
  ]
}
