{
 "manufacturer": "Lovato Electric",
 "manufacturer_slug": "lovato-electric",
 "model": "DMG7000 / DMG7500 / DMG8000 / DMG9000 power analyzers",
 "model_slug": "dmg7000-dmg9000",
 "short_model": "DMG7000-9000",
 "aliases": [
  "DMG7000",
  "DMG7500",
  "DMG8000",
  "DMG9000",
  "DMG 7000",
  "DMG 8000",
  "DMG 9000",
  "Lovato DMG"
 ],
 "equipment_type": "Power meter (power analyzer)",
 "applies_to": "Lovato DMG7000, DMG7500, DMG8000 and DMG9000 panel power analyzers on any Modbus port (RTU, ASCII or TCP); DMG9000-only rows are marked.",
 "summary": "The DMG7000-DMG9000 are Lovato's 96x96 panel power analyzers. They answer Modbus RTU, ASCII or TCP depending on the communication port used, and EXS4 Easy Branch current modules on the same channel appear as extra Modbus nodes. Measurements are fixed-point 32-bit integers sent high word first. This map covers voltages, currents, powers, power factor, frequency, unbalance, THD, max demand, hour counter, I/O status, the real-time clock and the reset, tariff and remote-variable commands.",
 "transport": [
  "RTU",
  "ASCII",
  "TCP"
 ],
 "defaults": {
  "unit_id": 1,
  "baud": null,
  "parity": null,
  "data_bits": null,
  "stop_bits": null,
  "tcp_port": null
 },
 "addressing": {
  "convention": "1-based",
  "note": "The tables print hex register numbers that are one higher than the address sent on the wire. The manual's own example frames prove it: the table puts 'parameter value' at 0x5004, 'save to flash' at 0x2F03 and 'menu select' at 0x5000, and the example requests send 50 03, 2F 02 and 4F FF. So subtract 1: L1 voltage, printed 0x0002, is requested at address 0x0001. The same rule is applied to every register here."
 },
 "default_word_order": "ABCD",
 "firmware": null,
 "source": {
  "title": "DMG7000-7500-8000-9000 / EXS4... Power analyzers Modbus manual",
  "doc_number": "I676 GB PL 03 22",
  "revision_date": "03 22 (as coded in the document number)",
  "url": "https://datasheet.lovatoelectric.com/DOWNLOAD/Technical/TechInstructions/28.%20CONTATORI%20DI%20ENERGIA%20E%20ANALIZZATORI%20DI%20RETE/I676GBPL03_22.pdf",
  "pages": "Protocol specs p. 1; frame examples p. 8; register tables pp. 2-9"
 },
 "notes": [
  "Byte and word order are big endian (high word first), so every 2-register value is ABCD.",
  "Measurement registers are read with function 03 or 04 (same data); they are listed as input registers. At most 120 registers per request; Modbus TCP accepts one connection per physical port.",
  "Scale is the divisor printed in the Unit column: V/100 = 0.01 V, A/10000 = 0.0001 A, kW/100000 = 0.00001 kW (0.01 W), Hz/1000, PF /10000, %/100.",
  "Several power rows carry a '(1)' marker in the Unit column, but no footnote text for it appears in the English/Polish, English/Chinese or English/Russian editions. The printed scale is used here; confirm power readings against the front display at commissioning.",
  "Left out: all energy counters (0x1B20-0x1CFC). The table gives them 4 registers each but labels the format 'Unsigned Long' / 'Signed Long', which normally means 32 bits, so the bit width cannot be decoded with certainty.",
  "Left out: alarm, PLC, limit and remote-variable status blocks (0x2120-0x2140, 0x4F00 read), which are 40-bit fields across 3 registers without a stated word arrangement; min/max/average copies, harmonic spectra, angles, crest and k-factors, analogue inputs, counters and the DMG9000 power-quality statistics.",
  "Left out: parameter setup through menu/submenu/parameter selector registers (0x5000-0x5004); the example frames use addresses one lower than the table, as noted under addressing.",
  "Function 0x11 (report slave ID) returns a model code: 0x70 DMG7000, 0x75 DMG7500, 0x80 DMG8000, 0x90 DMG9000, 0x40 EXS4.",
  "EXS4 Easy Branch measuring points answer on their own node numbers (by default the DMG is node 1 and branch points take 2, 3, ...), with the subset of registers the manual marks as available for EXS4.",
  "Verifier: all seven example frames in the parameter-setup section carry valid CRCs, so the minus-one rule is taken from genuine frames (0x5000->4FFF, 0x5001->5000, 0x5002->5001, 0x5004->5003, 0x2F03->2F02).",
  "Verifier: the energy-counter width is not settled anywhere in the document - no 64-bit statement and no example frame for the 4-register rows, and total export energy is even typed 'Signed Long' - so they stay out."
 ],
 "registers": [
  {
   "table": "input_register",
   "address": 1,
   "documented": "0x0002",
   "name": "L1 phase voltage",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 3,
   "documented": "0x0004",
   "name": "L2 phase voltage",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 5,
   "documented": "0x0006",
   "name": "L3 phase voltage",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 7,
   "documented": "0x0008",
   "name": "L1 current",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.0001,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 9,
   "documented": "0x000A",
   "name": "L2 current",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.0001,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 11,
   "documented": "0x000C",
   "name": "L3 current",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.0001,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 13,
   "documented": "0x000E",
   "name": "L1-L2 voltage",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 15,
   "documented": "0x0010",
   "name": "L2-L3 voltage",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 17,
   "documented": "0x0012",
   "name": "L3-L1 voltage",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 19,
   "documented": "0x0014",
   "name": "L1 active power",
   "description": "Signed; negative when exporting.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1e-05,
   "units": "kW",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 21,
   "documented": "0x0016",
   "name": "L2 active power",
   "description": "Signed; negative when exporting.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1e-05,
   "units": "kW",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 23,
   "documented": "0x0018",
   "name": "L3 active power",
   "description": "Signed; negative when exporting.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1e-05,
   "units": "kW",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 25,
   "documented": "0x001A",
   "name": "L1 reactive power",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1e-05,
   "units": "kvar",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 27,
   "documented": "0x001C",
   "name": "L2 reactive power",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1e-05,
   "units": "kvar",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 29,
   "documented": "0x001E",
   "name": "L3 reactive power",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1e-05,
   "units": "kvar",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 31,
   "documented": "0x0020",
   "name": "L1 apparent power",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1e-05,
   "units": "kVA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 33,
   "documented": "0x0022",
   "name": "L2 apparent power",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1e-05,
   "units": "kVA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 35,
   "documented": "0x0024",
   "name": "L3 apparent power",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1e-05,
   "units": "kVA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 37,
   "documented": "0x0026",
   "name": "L1 power factor",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.0001,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 39,
   "documented": "0x0028",
   "name": "L2 power factor",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.0001,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 41,
   "documented": "0x002A",
   "name": "L3 power factor",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.0001,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 49,
   "documented": "0x0032",
   "name": "Frequency",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.001,
   "units": "Hz",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 51,
   "documented": "0x0034",
   "name": "Equivalent phase voltage",
   "description": "Three-phase equivalent (system) line-to-neutral voltage.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 53,
   "documented": "0x0036",
   "name": "Equivalent phase-to-phase voltage",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 55,
   "documented": "0x0038",
   "name": "Equivalent current",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.0001,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 57,
   "documented": "0x003A",
   "name": "Total active power",
   "description": "System (equivalent) active power, signed.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1e-05,
   "units": "kW",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 59,
   "documented": "0x003C",
   "name": "Total reactive power",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1e-05,
   "units": "kvar",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 61,
   "documented": "0x003E",
   "name": "Total apparent power",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1e-05,
   "units": "kVA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 63,
   "documented": "0x0040",
   "name": "Total power factor",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.0001,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 65,
   "documented": "0x0042",
   "name": "VLL unbalance",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 67,
   "documented": "0x0044",
   "name": "VLN unbalance",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 69,
   "documented": "0x0046",
   "name": "Current unbalance",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 83,
   "documented": "0x0054",
   "name": "THD voltage L1",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 85,
   "documented": "0x0056",
   "name": "THD voltage L2",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 87,
   "documented": "0x0058",
   "name": "THD voltage L3",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 89,
   "documented": "0x005A",
   "name": "THD current L1",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 91,
   "documented": "0x005C",
   "name": "THD current L2",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 93,
   "documented": "0x005E",
   "name": "THD current L3",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.01,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 213,
   "documented": "0x00D6",
   "name": "I4 calculated",
   "description": "Neutral current calculated from the three phase currents.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.0001,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 2565,
   "documented": "0x0A06",
   "name": "Max demand current L1",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.0001,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 2567,
   "documented": "0x0A08",
   "name": "Max demand current L2",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.0001,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 2569,
   "documented": "0x0A0A",
   "name": "Max demand current L3",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.0001,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 2615,
   "documented": "0x0A38",
   "name": "Max demand active power total",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1e-05,
   "units": "kW",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 2619,
   "documented": "0x0A3C",
   "name": "Max demand apparent power total",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1e-05,
   "units": "kVA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 7679,
   "documented": "0x1E00",
   "name": "Hour counter",
   "description": "Main hour meter; the table gives the unit as seconds.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "s",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 8175,
   "documented": "0x1FF0",
   "name": "Serial number",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 8447,
   "documented": "0x2100",
   "name": "Digital inputs",
   "description": "Input 1 in bit 0 up to input 12 in bit 11.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Input 1",
    "1": "Input 2",
    "2": "Input 3",
    "3": "Input 4",
    "4": "Input 5",
    "5": "Input 6",
    "6": "Input 7",
    "7": "Input 8",
    "8": "Input 9",
    "9": "Input 10",
    "10": "Input 11",
    "11": "Input 12"
   },
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 8463,
   "documented": "0x2110",
   "name": "Digital outputs",
   "description": "Output 1 in bit 0 up to output 12 in bit 11.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Output 1",
    "1": "Output 2",
    "2": "Output 3",
    "3": "Output 4",
    "4": "Output 5",
    "5": "Output 6",
    "6": "Output 7",
    "7": "Output 8",
    "8": "Output 9",
    "9": "Output 10",
    "10": "Output 11",
    "11": "Output 12"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 10479,
   "documented": "0x28F0",
   "name": "Clock year",
   "description": "Real-time clock; read 03/04, write 06/16.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 10480,
   "documented": "0x28F1",
   "name": "Clock month",
   "description": "Real-time clock; read 03/04, write 06/16.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 10481,
   "documented": "0x28F2",
   "name": "Clock day",
   "description": "Real-time clock; read 03/04, write 06/16.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 10482,
   "documented": "0x28F3",
   "name": "Clock hour",
   "description": "Real-time clock; read 03/04, write 06/16.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 10483,
   "documented": "0x28F4",
   "name": "Clock minutes",
   "description": "Real-time clock; read 03/04, write 06/16.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 10484,
   "documented": "0x28F5",
   "name": "Clock seconds",
   "description": "Real-time clock; read 03/04, write 06/16.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 12034,
   "documented": "0x2F03",
   "name": "Save to flash / reboot",
   "description": "Write 5: saves parameters and reboots; no reply comes back.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": {
    "5": "Save and reboot"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 12271,
   "documented": "0x2FF0",
   "name": "Reset command",
   "description": "Write one code with function 06 to run the reset.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": {
    "0": "Reset max/min values",
    "1": "Reset max demand",
    "2": "Reset partial and tariff energy counters",
    "3": "Reset partial hour counters",
    "4": "Reset counters",
    "5": "Reset alarms",
    "6": "Reset limit thresholds",
    "8": "Restore setup defaults (reboot afterwards)",
    "12": "Reset event list",
    "16": "Reset power-quality statistics (DMG9000)",
    "255": "Reset power-quality counters (DMG9000)"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 16895,
   "documented": "0x4200",
   "name": "Set energy tariff",
   "description": "Write the tariff number with function 06.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": {
    "1": "Tariff 1",
    "2": "Tariff 2",
    "3": "Tariff 3",
    "4": "Tariff 4"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20223,
   "documented": "0x4F00",
   "name": "Remote variable REM1 command",
   "description": "REM2..REM40 follow at the next addresses (up to 0x4F27).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": {
    "170": "Set REM1 ON (0xAA)",
    "187": "Set REM1 OFF (0xBB)"
   },
   "bits": null,
   "offset": 0
  }
 ],
 "integration": {
  "summary": "Read the measurement block with function 04 (or 03) starting at wire address 1 (printed 0x0002) and decode each pair as a 32-bit integer, high word first, applying the printed divisor. Remember to subtract 1 from every printed address.",
  "minimum_registers": [
   {
    "table": "input_register",
    "address": 1,
    "why": "L1 phase voltage (V/100)"
   },
   {
    "table": "input_register",
    "address": 7,
    "why": "L1 current (A/10000)"
   },
   {
    "table": "input_register",
    "address": 57,
    "why": "Total active power (kW/100000, signed)"
   },
   {
    "table": "input_register",
    "address": 63,
    "why": "Total power factor"
   },
   {
    "table": "input_register",
    "address": 49,
    "why": "Frequency"
   },
   {
    "table": "input_register",
    "address": 83,
    "why": "THD voltage L1"
   },
   {
    "table": "input_register",
    "address": 2615,
    "why": "Max demand active power"
   }
  ],
  "enable": "Modbus runs on the meter's communication port; the protocol variant (RTU, ASCII or TCP) follows the port in use. Set the node address in parameter P07.n.01 on the DMG and P20.n.05 for each Easy Branch measuring point.",
  "watchdog": null,
  "quirks": [
   "Printed addresses are one above the wire address (0x0002 is requested as 0x0001).",
   "All 32-bit values are high word first (ABCD).",
   "Writing 5 to 0x2F03 saves and reboots the meter with no Modbus reply; do not treat the timeout as a failure.",
   "Remote variables are switched by writing 0xAA (on) or 0xBB (off) to their own register."
  ],
  "setup": [
   "Default node address is 1; Easy Branch points follow as 2, 3, 4...",
   "Up to 120 registers per read; one TCP client per physical port."
  ],
  "gotchas": [
   "Energy counters are not in this map; their 4-register 'Long' format is ambiguous in the manual.",
   "DMG9000-only rows (V4, I4, earth current, power quality) return errors or zero on the smaller models."
  ]
 },
 "page": "https://easymodbus.com/modbus-register-maps/lovato-electric/dmg7000-dmg9000",
 "address_note": "address = 0-based Modbus wire (PDU) address; documented = as printed in the source.",
 "note": "Re-typed from the manufacturer's public documentation (see source) and verified against it. Registers vary by firmware and options; verify against the live device before writing."
}
