{
 "manufacturer": "Carlo Gavazzi",
 "manufacturer_slug": "carlo-gavazzi",
 "model": "EM100 / ET100 series (EM111, EM112, ET112)",
 "model_slug": "em111-em112-et112",
 "short_model": "EM111/EM112",
 "aliases": [
  "EM111",
  "EM112",
  "ET112",
  "EM110",
  "EM111-DIN",
  "EM112-DIN",
  "ET112-DIN",
  "EM111DINAV81XS1X",
  "EM112DINAV01XS1X",
  "ET112DINAV01XS1X"
 ],
 "equipment_type": "Energy meter",
 "applies_to": "Single-phase EM111, EM112 energy meters and ET112 bidirectional meter with the S1 (RS485 Modbus RTU) port, protocol version 2 revision 14.",
 "summary": "The EM111/EM112 are Carlo Gavazzi's single-phase DIN-rail energy meters, and the ET112 is the bidirectional version for PV and storage. The S1 versions have an RS485 Modbus RTU port; values are 32-bit integers sent low word first with fixed weights, readable with function 03 or 04. This map covers voltage, current, powers, demand, PF, frequency, total/partial/tariff energy, high-resolution energy totals, hour counter, identification, setup, serial settings and resets.",
 "transport": [
  "RTU"
 ],
 "defaults": {
  "unit_id": 1,
  "baud": 9600,
  "parity": "None",
  "data_bits": null,
  "stop_bits": 1,
  "tcp_port": null
 },
 "addressing": {
  "convention": "Modicon",
  "note": "Registers are printed as a 6-digit Modicon number for function 04 (3xxxxx; use 4xxxxx for function 03) and as the hex physical address placed in the frame. Wire address = physical address (300001 / 0000h is address 0). Setup rows are written with function 06 and are listed as holding registers; 1010h/1012h are printed with the hex address only."
 },
 "default_word_order": "CDAB",
 "firmware": null,
 "source": {
  "title": "EM100 Series and ET100 Series Communication Protocol",
  "doc_number": "Version 2 Revision 14",
  "revision_date": null,
  "url": "https://www.gavazziautomation.com/fileadmin/images/PIM/OTHERSTUFF/COMPRO/EM111_EM112_ET112_CP.pdf",
  "pages": "Data format p. 7; tables pp. 8-14"
 },
 "notes": [
  "Word order: the protocol states INT32/UINT32/UINT64 are LSW first with bytes MSB first, so 32-bit values are CDAB.",
  "Functions 03 and 04 are equivalent; up to 50 registers per request.",
  "Table 2.4-4 (0100h-0189h) mirrors the same values, with PF as INT32; it is not duplicated here.",
  "The integer/decimal split totalizers (0400h-040Fh) exist only on EM111/EM112 from firmware b.10, in units made from 1 January 2020 (serial YR2020 001xxxU onward).",
  "Registers marked 'not available, value = 0' (tariffs 3-4, negative partials, kVAh, THD) are left out.",
  "Left out: the INT64 energy block at 0500h (no value weight given), kWh-per-pulse settings (1020h/1022h, no weight), the ASCII serial-number letters (5000h-5006h), and kWh(-) total integer part (0408h), whose Notes cell is empty in the document, so its weight is not stated (its decimal-part partner 040Ah is printed with a weight and is kept).",
  "In measurement mode A (and PFA models) energy always counts as imported; mode B (PFB, ET112) separates kWh(+) and kWh(-) and current/power go negative when exporting."
 ],
 "integration": {
  "summary": "Read input registers 0000h-0023h with function 04 (or 03) in one request; decode INT32 values low word first and apply the fixed weights (V and W x10, A and PF x1000, energy x10).",
  "minimum_registers": [
   {
    "table": "input_register",
    "address": 0,
    "why": "Voltage"
   },
   {
    "table": "input_register",
    "address": 2,
    "why": "Current"
   },
   {
    "table": "input_register",
    "address": 4,
    "why": "Active power"
   },
   {
    "table": "input_register",
    "address": 14,
    "why": "Power factor"
   },
   {
    "table": "input_register",
    "address": 16,
    "why": "Imported energy"
   },
   {
    "table": "input_register",
    "address": 32,
    "why": "Exported energy"
   }
  ],
  "enable": "S1 versions carry the RS485 Modbus RTU port. Address, baud rate, parity and stop bits are in registers 2000h-2003h (or the instrument's own setup menu, see its manual).",
  "watchdog": null,
  "quirks": [
   "INT32 values are low word first (CDAB).",
   "Function 06 only for writes; broadcast to address 0 is supported.",
   "Measurement mode (1103h) can only be written on non-MID X versions."
  ],
  "setup": [
   "Defaults: address 1, 9600 baud, no parity, 1 stop bit.",
   "Terminate the master end with 120 ohm and the last meter by bridging A- to T.",
   "Use a repeater for runs longer than 1000 m or more than 160 instruments on one bus."
  ],
  "gotchas": [
   "Total energy reset (4001h) is documented for non-MID X versions only."
  ]
 },
 "registers": [
  {
   "table": "input_register",
   "address": 0,
   "documented": "300001 / 0000h",
   "name": "V L-N",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 2,
   "documented": "300003 / 0002h",
   "name": "A",
   "description": "Negative when exporting in measurement mode B.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 4,
   "documented": "300005 / 0004h",
   "name": "W",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "W",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 6,
   "documented": "300007 / 0006h",
   "name": "VA",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "VA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 8,
   "documented": "300009 / 0008h",
   "name": "var",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "var",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 10,
   "documented": "300011 / 000Ah",
   "name": "W dmd",
   "description": "Demand (average) active power.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "W",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 11,
   "documented": "300012 / 000Bh",
   "name": "Carlo Gavazzi identification code",
   "description": "Read alone; shares 000Bh with W dmd (000Ah-000Bh).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "100": "EM110 AV7",
    "101": "EM111 AV7",
    "102": "EM112 AV1",
    "103": "EM111 AV8",
    "104": "EM112 AV0",
    "110": "EM110 AV8",
    "114": "EM111 AV5",
    "120": "ET112 AV0",
    "121": "ET112 AV1"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 12,
   "documented": "300013 / 000Ch",
   "name": "W dmd peak",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "W",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 14,
   "documented": "300015 / 000Eh",
   "name": "PF",
   "description": "",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.001,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 15,
   "documented": "300016 / 000Fh",
   "name": "Frequency",
   "description": "",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "Hz",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 16,
   "documented": "300017 / 0010h",
   "name": "kWh(+) total",
   "description": "Imported active energy.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 18,
   "documented": "300019 / 0012h",
   "name": "kvarh(+) total",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 20,
   "documented": "300021 / 0014h",
   "name": "kWh(+) partial",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 22,
   "documented": "300023 / 0016h",
   "name": "kvarh(+) partial",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 24,
   "documented": "300025 / 0018h",
   "name": "kWh(+) tariff 1",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 26,
   "documented": "300027 / 001Ah",
   "name": "kWh(+) tariff 2",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 32,
   "documented": "300033 / 0020h",
   "name": "kWh(-) total",
   "description": "Exported active energy.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 34,
   "documented": "300035 / 0022h",
   "name": "kvarh(-) total",
   "description": "",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 44,
   "documented": "300045 / 002Ch",
   "name": "Hour counter",
   "description": "ET112 only.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.01,
   "units": "h",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 770,
   "documented": "300771 / 0302h",
   "name": "Version code",
   "description": "0 = version A, 1 = B, and so on.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 771,
   "documented": "300772 / 0303h",
   "name": "Revision code",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1024,
   "documented": "301025 / 0400h",
   "name": "kWh(+) total integer part",
   "description": "Whole units; add the decimal part register.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1026,
   "documented": "301027 / 0402h",
   "name": "kWh(+) total decimal part",
   "description": "Thousandths, 0-999.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1028,
   "documented": "301029 / 0404h",
   "name": "kvarh(+) total integer part",
   "description": "Whole units; add the decimal part register.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1030,
   "documented": "301031 / 0406h",
   "name": "kvarh(+) total decimal part",
   "description": "Thousandths, 0-999.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1034,
   "documented": "301035 / 040Ah",
   "name": "kWh(-) total decimal part",
   "description": "Thousandths, 0-999.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1036,
   "documented": "301037 / 040Ch",
   "name": "kvarh(-) total integer part",
   "description": "Whole units; add the decimal part register.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1038,
   "documented": "301039 / 040Eh",
   "name": "kvarh(-) total decimal part",
   "description": "Thousandths, 0-999.",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "kvarh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4096,
   "documented": "304097 / 1000h",
   "name": "Password",
   "description": "0-9999, EM only; always 0 on ET.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4098,
   "documented": "304099 / 1002h",
   "name": "Measuring system",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "1P (1-phase)"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4099,
   "documented": "304100 / 1003h",
   "name": "CT ratio",
   "description": "Raw 10-600 = CT 1.0-60.0.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4112,
   "documented": "1010h",
   "name": "Demand integration time",
   "description": "1-30.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4114,
   "documented": "1012h",
   "name": "Pulse output Ton",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "30 ms",
    "1": "100 ms"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4352,
   "documented": "304353 / 1100h",
   "name": "Display mode",
   "description": "EM112 only.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Full",
    "1": "Easy"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4353,
   "documented": "304354 / 1101h",
   "name": "Tariff management",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Off",
    "1": "On"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4354,
   "documented": "304355 / 1102h",
   "name": "Home page selection",
   "description": "0-17, EM112 only; 0 on others.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4355,
   "documented": "304356 / 1103h",
   "name": "Measurement mode",
   "description": "Writable on non-MID X versions; repeated writes of 1 toggle.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "A (easy connection)",
    "1": "B (bidirectional)"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4608,
   "documented": "304609 / 1200h",
   "name": "Tariff mode",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Via digital input",
    "1": "Via serial"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4609,
   "documented": "304610 / 1201h",
   "name": "Tariff selection via serial",
   "description": "Read-only when 1200h = 0.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "1": "Tariff 1",
    "2": "Tariff 2"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 8192,
   "documented": "308193 / 2000h",
   "name": "RS485 address",
   "description": "1-247, default 1.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 8193,
   "documented": "308194 / 2001h",
   "name": "RS485 baud rate",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "1": "9600 (default)",
    "2": "19200",
    "3": "38400",
    "4": "57600",
    "5": "115200"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 8194,
   "documented": "308195 / 2002h",
   "name": "RS485 parity",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "1": "None (default)",
    "2": "Even"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 8195,
   "documented": "308196 / 2003h",
   "name": "RS485 stop bits",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "1": "1 (default)",
    "2": "2 (only with no parity)"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 8196,
   "documented": "308197 / 2004h",
   "name": "Max words per read",
   "description": "Read-only; returns 50.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 16384,
   "documented": "316385 / 4000h",
   "name": "Reset partial, tariff and demand",
   "description": "Write 1: clears partial and tariff meters, kW dmd and peak.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 16385,
   "documented": "316386 / 4001h",
   "name": "Reset total energy meters",
   "description": "Write 1; non-MID (X) versions only.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 16386,
   "documented": "316387 / 4002h",
   "name": "Reset hour counter",
   "description": "Write 1; ET112 only.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20496,
   "documented": "320497 / 5010h",
   "name": "Production year",
   "description": "EM111 made from Oct 2018 onward.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  }
 ],
 "page": "https://easymodbus.com/modbus-register-maps/carlo-gavazzi/em111-em112-et112",
 "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."
}
