{
 "manufacturer": "Carlo Gavazzi",
 "manufacturer_slug": "carlo-gavazzi",
 "model": "WM20 / WM30 / WM40 power analyzers",
 "model_slug": "wm20-wm30-wm40",
 "short_model": "WM20/WM30/WM40",
 "aliases": [
  "WM20",
  "WM30",
  "WM40",
  "WM20-96",
  "WM30-96",
  "WM40-96"
 ],
 "equipment_type": "Power meter (power analyzer)",
 "applies_to": "WM20, WM30 and WM40 modular power analyzers with an RS485 (or Ethernet) Modbus module, protocol internal version rev. 4.0 (2018-03-28); WM30 = firmware letter X, WM40 = Y, WM20 = Z.",
 "summary": "The WM20, WM30 and WM40 are Carlo Gavazzi's modular panel power analyzers. Unlike the smaller CG meters, live values are IEEE-754 floats (in base units) and energies are 64-bit counters in Wh/varh, both sent low word first. This map covers per-phase and system voltage, current, power, PF, frequency, asymmetry, phase sequence, total/partial/tariff energy, identification, RS485 settings and energy reset commands.",
 "transport": [
  "RTU",
  "TCP"
 ],
 "defaults": {
  "unit_id": null,
  "baud": null,
  "parity": null,
  "data_bits": null,
  "stop_bits": null,
  "tcp_port": null
 },
 "addressing": {
  "convention": "Modicon",
  "note": "Registers are printed as a 6-digit Modicon number for function 04 (3xxxxx; first digit becomes 4 for function 03) beside the hex physical address placed in the frame. Wire address = physical address (300081 / 0050h is address 0x50). Setup and command rows are written with 06/10h and are listed as holding registers."
 },
 "default_word_order": "CDAB",
 "firmware": "Per-row compatibility codes in the source (X0/Y0/Z0 = all firmware of WM30/WM40/WM20)",
 "source": {
  "title": "WM20-WM30-WM40 Communication Protocol",
  "doc_number": "Internal version rev. 4.0",
  "revision_date": "2018-03-28",
  "url": "https://www.gavazziautomation.com/fileadmin/images/PIM/OTHERSTUFF/COMPRO/WM20_WM30_WM40_CP.pdf",
  "pages": "Data format p. 10; firmware/ID pp. 11-12; instantaneous p. 12-13; energy pp. 17-18; RS485 pp. 26-27; commands pp. 37-41"
 },
 "notes": [
  "Float word order: the document lists the frame bytes as float bits 15-8, 7-0, 31-24, 23-16, i.e. low word first with MSB-first bytes (CDAB).",
  "Integer word order: UINT16/UINT64 are MSB-first inside a word and LSW first across words (p. 10). Under this library's 64-bit convention CDAB means least significant word first with all four words reversed, which is exactly what the document describes: words arrive W0 (least) to W3 (most).",
  "Float units are not printed separately; the variable names (V, A, W, VA, var, Hz, %) are the engineering units, so no scaling is applied.",
  "Energy counters are in Wh / varh (not kWh); divide by 1000 for kWh.",
  "Tariff energies (0524h-0583h) are WM40 only; RS485 settings at 1130h-1132h are documented for WM30 and WM20 only (WM40 uses a different communication module table, not mapped here).",
  "Left out: the hour counter (0520h), whose value packs hours x100 plus minutes in the remainder rather than a plain scale; K-factor, temperature, analogue-input and the model-dependent 'A' rows at 0090h-009Ah, which overlap by model; odd/even THD, TDD, max/min/demand blocks; harmonic tables; module and alarm configuration; clock; record-file and special-register (42h) functions.",
  "Removed on verification: total THD floats (00A0h-00B0h). The table names them 'THD tot ...' without any unit, and the document never says whether the float is a percentage or a ratio, so the scaling is ambiguous. (Asymmetry rows 008Ah/008Ch print '%' in the name and are kept.)"
 ],
 "integration": {
  "summary": "Read input registers 0050h-008Fh as floats (low word first) for live values and 0500h-051Fh as UINT64 Wh/varh counters (least significant word first).",
  "minimum_registers": [
   {
    "table": "input_register",
    "address": 80,
    "why": "V L1-N (float)"
   },
   {
    "table": "input_register",
    "address": 96,
    "why": "A L1 (float)"
   },
   {
    "table": "input_register",
    "address": 110,
    "why": "W system (float)"
   },
   {
    "table": "input_register",
    "address": 134,
    "why": "PF system"
   },
   {
    "table": "input_register",
    "address": 136,
    "why": "Frequency"
   },
   {
    "table": "input_register",
    "address": 1280,
    "why": "Total kWh(+) in Wh"
   },
   {
    "table": "input_register",
    "address": 1288,
    "why": "Total kWh(-) in Wh"
   },
   {
    "table": "input_register",
    "address": 11,
    "why": "Model ID (WM20/30/40)"
   }
  ],
  "enable": "Fit an RS485 (or Ethernet) communication module. Change RS485 address/baud/parity in 1130h-1132h, then write 1 to 3052h (or power-cycle) to apply.",
  "watchdog": null,
  "quirks": [
   "Floats are low word first (CDAB).",
   "64-bit energy counters are least significant word first and in Wh/varh.",
   "Up to 125 registers per read; functions 03/04 equivalent; 06 and 10h for writes."
  ],
  "setup": [
   "Terminate the last instrument and the host; above 1000 m use a line amplifier.",
   "WM20/WM30 RS485 baud options: 9600, 19200, 38400, 115200; parity none/odd/even."
  ],
  "gotchas": [
   "New RS485 settings take effect only after the update command 3052h or a power cycle."
  ]
 },
 "registers": [
  {
   "table": "input_register",
   "address": 0,
   "documented": "300001 / 0000h",
   "name": "Base firmware version",
   "description": "High byte ASCII model (A=AV5, B=AV6, C=AV4, D=AV7); low byte revision.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 11,
   "documented": "300012 / 000Bh",
   "name": "Carlo Gavazzi identification code",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "65": "WM30",
    "66": "WM40",
    "98": "WM20"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 80,
   "documented": "300081 / 0050h",
   "name": "V L1-N",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 82,
   "documented": "300083 / 0052h",
   "name": "V L2-N",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 84,
   "documented": "300085 / 0054h",
   "name": "V L3-N",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 86,
   "documented": "300087 / 0056h",
   "name": "V L-N system",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 88,
   "documented": "300089 / 0058h",
   "name": "V L1-L2",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 90,
   "documented": "300091 / 005Ah",
   "name": "V L2-L3",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 92,
   "documented": "300093 / 005Ch",
   "name": "V L3-L1",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 94,
   "documented": "300095 / 005Eh",
   "name": "V L-L system",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 96,
   "documented": "300097 / 0060h",
   "name": "A L1",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 98,
   "documented": "300099 / 0062h",
   "name": "A L2",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 100,
   "documented": "300101 / 0064h",
   "name": "A L3",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 102,
   "documented": "300103 / 0066h",
   "name": "A N",
   "description": "Calculated by the base; WM40 can measure it with an optional module.",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 104,
   "documented": "300105 / 0068h",
   "name": "W L1",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "W",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 106,
   "documented": "300107 / 006Ah",
   "name": "W L2",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "W",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 108,
   "documented": "300109 / 006Ch",
   "name": "W L3",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "W",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 110,
   "documented": "300111 / 006Eh",
   "name": "W system",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "W",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 112,
   "documented": "300113 / 0070h",
   "name": "VA L1",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "VA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 114,
   "documented": "300115 / 0072h",
   "name": "VA L2",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "VA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 116,
   "documented": "300117 / 0074h",
   "name": "VA L3",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "VA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 118,
   "documented": "300119 / 0076h",
   "name": "VA system",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "VA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 120,
   "documented": "300121 / 0078h",
   "name": "var L1",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "var",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 122,
   "documented": "300123 / 007Ah",
   "name": "var L2",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "var",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 124,
   "documented": "300125 / 007Ch",
   "name": "var L3",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "var",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 126,
   "documented": "300127 / 007Eh",
   "name": "var system",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "var",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 128,
   "documented": "300129 / 0080h",
   "name": "PF L1",
   "description": "Negative = capacitive (lead), positive = inductive (lag).",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 130,
   "documented": "300131 / 0082h",
   "name": "PF L2",
   "description": "Negative = capacitive (lead), positive = inductive (lag).",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 132,
   "documented": "300133 / 0084h",
   "name": "PF L3",
   "description": "Negative = capacitive (lead), positive = inductive (lag).",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 134,
   "documented": "300135 / 0086h",
   "name": "PF system",
   "description": "Negative = capacitive (lead), positive = inductive (lag).",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 136,
   "documented": "300137 / 0088h",
   "name": "Frequency",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Hz",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 138,
   "documented": "300139 / 008Ah",
   "name": "Asymmetry L-N",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 140,
   "documented": "300141 / 008Ch",
   "name": "Asymmetry L-L",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 142,
   "documented": "300143 / 008Eh",
   "name": "Phase sequence",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "1": "L1-L2-L3",
    "-1": "Wrong sequence"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1280,
   "documented": "301281 / 0500h",
   "name": "Total kWh(+)",
   "description": "Value in Wh; 4 registers, least significant word first.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1284,
   "documented": "301285 / 0504h",
   "name": "Total kvarh(+)",
   "description": "Value in varh; 4 registers, least significant word first.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1288,
   "documented": "301289 / 0508h",
   "name": "Total kWh(-)",
   "description": "Value in Wh; 4 registers, least significant word first.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1292,
   "documented": "301293 / 050Ch",
   "name": "Total kvarh(-)",
   "description": "Value in varh; 4 registers, least significant word first.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1296,
   "documented": "301297 / 0510h",
   "name": "Partial kWh(+)",
   "description": "Value in Wh; 4 registers, least significant word first.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1300,
   "documented": "301301 / 0514h",
   "name": "Partial kvarh(+)",
   "description": "Value in varh; 4 registers, least significant word first.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1304,
   "documented": "301305 / 0518h",
   "name": "Partial kWh(-)",
   "description": "Value in Wh; 4 registers, least significant word first.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1308,
   "documented": "301309 / 051Ch",
   "name": "Partial kvarh(-)",
   "description": "Value in varh; 4 registers, least significant word first.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1316,
   "documented": "301317 / 0524h",
   "name": "Tariff 1 kWh(+)",
   "description": "WM40 only. Value in Wh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1320,
   "documented": "301321 / 0528h",
   "name": "Tariff 1 kvarh(+)",
   "description": "WM40 only. Value in varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1324,
   "documented": "301325 / 052Ch",
   "name": "Tariff 1 kWh(-)",
   "description": "WM40 only. Value in Wh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1328,
   "documented": "301329 / 0530h",
   "name": "Tariff 1 kvarh(-)",
   "description": "WM40 only. Value in varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1332,
   "documented": "301333 / 0534h",
   "name": "Tariff 2 kWh(+)",
   "description": "WM40 only. Value in Wh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1336,
   "documented": "301337 / 0538h",
   "name": "Tariff 2 kvarh(+)",
   "description": "WM40 only. Value in varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1340,
   "documented": "301341 / 053Ch",
   "name": "Tariff 2 kWh(-)",
   "description": "WM40 only. Value in Wh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1344,
   "documented": "301345 / 0540h",
   "name": "Tariff 2 kvarh(-)",
   "description": "WM40 only. Value in varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1348,
   "documented": "301349 / 0544h",
   "name": "Tariff 3 kWh(+)",
   "description": "WM40 only. Value in Wh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1352,
   "documented": "301353 / 0548h",
   "name": "Tariff 3 kvarh(+)",
   "description": "WM40 only. Value in varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1356,
   "documented": "301357 / 054Ch",
   "name": "Tariff 3 kWh(-)",
   "description": "WM40 only. Value in Wh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1360,
   "documented": "301361 / 0550h",
   "name": "Tariff 3 kvarh(-)",
   "description": "WM40 only. Value in varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1364,
   "documented": "301365 / 0554h",
   "name": "Tariff 4 kWh(+)",
   "description": "WM40 only. Value in Wh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1368,
   "documented": "301369 / 0558h",
   "name": "Tariff 4 kvarh(+)",
   "description": "WM40 only. Value in varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1372,
   "documented": "301373 / 055Ch",
   "name": "Tariff 4 kWh(-)",
   "description": "WM40 only. Value in Wh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1376,
   "documented": "301377 / 0560h",
   "name": "Tariff 4 kvarh(-)",
   "description": "WM40 only. Value in varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1380,
   "documented": "301381 / 0564h",
   "name": "Tariff 5 kWh(+)",
   "description": "WM40 only. Value in Wh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1384,
   "documented": "301385 / 0568h",
   "name": "Tariff 5 kvarh(+)",
   "description": "WM40 only. Value in varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1388,
   "documented": "301389 / 056Ch",
   "name": "Tariff 5 kWh(-)",
   "description": "WM40 only. Value in Wh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1392,
   "documented": "301393 / 0570h",
   "name": "Tariff 5 kvarh(-)",
   "description": "WM40 only. Value in varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1396,
   "documented": "301397 / 0574h",
   "name": "Tariff 6 kWh(+)",
   "description": "WM40 only. Value in Wh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1400,
   "documented": "301401 / 0578h",
   "name": "Tariff 6 kvarh(+)",
   "description": "WM40 only. Value in varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1404,
   "documented": "301405 / 057Ch",
   "name": "Tariff 6 kWh(-)",
   "description": "WM40 only. Value in Wh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1408,
   "documented": "301409 / 0580h",
   "name": "Tariff 6 kvarh(-)",
   "description": "WM40 only. Value in varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1520,
   "documented": "301521 / 05F0h",
   "name": "Real-time tariff",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "0": "Tariff 1",
    "1": "Tariff 2",
    "2": "Tariff 3",
    "3": "Tariff 4",
    "4": "Tariff 5",
    "5": "Tariff 6",
    "6": "Tariff disabled"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4400,
   "documented": "304401 / 1130h",
   "name": "RS485 address",
   "description": "1-247. WM20/WM30. Apply with command 3052h.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4401,
   "documented": "304402 / 1131h",
   "name": "RS485 baud rate",
   "description": "WM20/WM30. Apply with command 3052h.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "9600",
    "1": "19200",
    "2": "38400",
    "3": "115200"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4402,
   "documented": "304403 / 1132h",
   "name": "RS485 parity",
   "description": "WM20/WM30. Apply with command 3052h.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "None",
    "1": "Odd",
    "2": "Even"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 12370,
   "documented": "312371 / 3052h",
   "name": "Apply serial settings",
   "description": "Write 1 to activate new RS485 settings.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13568,
   "documented": "313569 / 3500h",
   "name": "Reset total kWh(+)",
   "description": "Write 1 to execute.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13569,
   "documented": "313570 / 3501h",
   "name": "Reset total kvarh(+)",
   "description": "Write 1 to execute.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13570,
   "documented": "313571 / 3502h",
   "name": "Reset total kWh(-)",
   "description": "Write 1 to execute.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13571,
   "documented": "313572 / 3503h",
   "name": "Reset total kvarh(-)",
   "description": "Write 1 to execute.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13572,
   "documented": "313573 / 3504h",
   "name": "Reset partial kWh(+)",
   "description": "Write 1 to execute.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13573,
   "documented": "313574 / 3505h",
   "name": "Reset partial kvarh(+)",
   "description": "Write 1 to execute.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13574,
   "documented": "313575 / 3506h",
   "name": "Reset partial kWh(-)",
   "description": "Write 1 to execute.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13575,
   "documented": "313576 / 3507h",
   "name": "Reset partial kvarh(-)",
   "description": "Write 1 to execute.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": null,
   "bits": null,
   "offset": 0
  }
 ],
 "page": "https://easymodbus.com/modbus-register-maps/carlo-gavazzi/wm20-wm30-wm40",
 "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."
}
