{
  "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json",
  "mbmap": 2,
  "vendor": "Shelly",
  "model": "Pro EM-50",
  "models": [
    "Pro EM-50"
  ],
  "vendor_website": "shelly.com",
  "description": "Two-channel energy meter with a relay output and Modbus TCP",
  "revision": 1,
  "revised": "2026-10-18",
  "source": "Shelly Gen2 API documentation: Modbus and component pages",
  "sources": [
    {
      "title": "Shelly Gen2 API: Modbus",
      "url": "https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/Modbus"
    },
    {
      "title": "Shelly Gen2 API: EM1",
      "url": "https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/EM1",
      "note": "Modbus registers table"
    },
    {
      "title": "Shelly Gen2 API: EM1Data",
      "url": "https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/EM1Data",
      "note": "Modbus registers table"
    },
    {
      "title": "Shelly Gen2 API: Switch",
      "url": "https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/Switch",
      "note": "Modbus registers table"
    }
  ],
  "notes": [
    "Modbus TCP must be enabled first (Modbus.SetConfig enable=true, or in the web interface).",
    "The documentation lists input registers in 3xxxx notation: 33000 is input register 3000.",
    "Floats and 32-bit values are sent low word first, as in the documentation's modbus_cli examples (-B mixed).",
    "The two channels are the EM1 components 0 and 1; each next component's block starts 20 registers after the previous one (EM1 at 32000, EM1Data at 32300)."
  ],
  "protocol": "tcp",
  "port": 502,
  "byte_order": "big",
  "word_order": "little",
  "address_base": 0,
  "x_status": "official",
  "registers": [
    {"name": "MAC address", "group": "Device", "area": "input", "address": 0, "type": "string", "length": 6},
    {"name": "Model", "group": "Device", "area": "input", "address": 6, "type": "string", "length": 10, "role": "model"},
    {"name": "Device name", "group": "Device", "area": "input", "address": 16, "type": "string", "length": 32},
    {"name": "Output", "group": "Output", "area": "coil", "address": 100, "type": "bool", "access": "RW", "description": "1 = on, 0 = off"},
    {"name": "Output state", "group": "Output", "area": "input", "address": 3000, "type": "bool", "bit": 0},
    {"name": "Last update 1", "group": "Channel 1", "area": "input", "address": 2000, "type": "uint32", "unit": "s", "description": "Unix timestamp"},
    {"name": "Meter error 1", "group": "Channel 1", "area": "input", "address": 2002, "type": "bool", "bit": 0},
    {"name": "Voltage 1", "group": "Channel 1", "area": "input", "address": 2003, "type": "float32", "unit": "V"},
    {"name": "Current 1", "group": "Channel 1", "area": "input", "address": 2005, "type": "float32", "unit": "A"},
    {"name": "Active power 1", "group": "Channel 1", "area": "input", "address": 2007, "type": "float32", "unit": "W"},
    {"name": "Apparent power 1", "group": "Channel 1", "area": "input", "address": 2009, "type": "float32", "unit": "VA"},
    {"name": "Power factor 1", "group": "Channel 1", "area": "input", "address": 2011, "type": "float32"},
    {"name": "Overpower error 1", "group": "Channel 1", "area": "input", "address": 2013, "type": "bool", "bit": 0},
    {"name": "Overvoltage error 1", "group": "Channel 1", "area": "input", "address": 2014, "type": "bool", "bit": 0},
    {"name": "Overcurrent error 1", "group": "Channel 1", "area": "input", "address": 2015, "type": "bool", "bit": 0},
    {"name": "Frequency 1", "group": "Channel 1", "area": "input", "address": 2016, "type": "float32", "unit": "Hz"},
    {"name": "Last update 2", "group": "Channel 2", "area": "input", "address": 2020, "type": "uint32", "unit": "s", "description": "Unix timestamp"},
    {"name": "Meter error 2", "group": "Channel 2", "area": "input", "address": 2022, "type": "bool", "bit": 0},
    {"name": "Voltage 2", "group": "Channel 2", "area": "input", "address": 2023, "type": "float32", "unit": "V"},
    {"name": "Current 2", "group": "Channel 2", "area": "input", "address": 2025, "type": "float32", "unit": "A"},
    {"name": "Active power 2", "group": "Channel 2", "area": "input", "address": 2027, "type": "float32", "unit": "W"},
    {"name": "Apparent power 2", "group": "Channel 2", "area": "input", "address": 2029, "type": "float32", "unit": "VA"},
    {"name": "Power factor 2", "group": "Channel 2", "area": "input", "address": 2031, "type": "float32"},
    {"name": "Overpower error 2", "group": "Channel 2", "area": "input", "address": 2033, "type": "bool", "bit": 0},
    {"name": "Overvoltage error 2", "group": "Channel 2", "area": "input", "address": 2034, "type": "bool", "bit": 0},
    {"name": "Overcurrent error 2", "group": "Channel 2", "area": "input", "address": 2035, "type": "bool", "bit": 0},
    {"name": "Frequency 2", "group": "Channel 2", "area": "input", "address": 2036, "type": "float32", "unit": "Hz"},
    {"name": "Energy last update 1", "group": "Energy 1", "area": "input", "address": 2300, "type": "uint32", "unit": "s", "description": "Unix timestamp"},
    {"name": "Total active energy 1", "group": "Energy 1", "area": "input", "address": 2302, "type": "float32", "unit": "Wh"},
    {"name": "Total returned active energy 1", "group": "Energy 1", "area": "input", "address": 2304, "type": "float32", "unit": "Wh"},
    {"name": "Lagging reactive energy 1", "group": "Energy 1", "area": "input", "address": 2306, "type": "float32", "unit": "varh"},
    {"name": "Leading reactive energy 1", "group": "Energy 1", "area": "input", "address": 2308, "type": "float32", "unit": "varh"},
    {"name": "Total active energy (perpetual) 1", "group": "Energy 1", "area": "input", "address": 2310, "type": "float32", "unit": "Wh", "description": "Never reset"},
    {"name": "Total returned active energy (perpetual) 1", "group": "Energy 1", "area": "input", "address": 2312, "type": "float32", "unit": "Wh", "description": "Never reset"},
    {"name": "Energy last update 2", "group": "Energy 2", "area": "input", "address": 2320, "type": "uint32", "unit": "s", "description": "Unix timestamp"},
    {"name": "Total active energy 2", "group": "Energy 2", "area": "input", "address": 2322, "type": "float32", "unit": "Wh"},
    {"name": "Total returned active energy 2", "group": "Energy 2", "area": "input", "address": 2324, "type": "float32", "unit": "Wh"},
    {"name": "Lagging reactive energy 2", "group": "Energy 2", "area": "input", "address": 2326, "type": "float32", "unit": "varh"},
    {"name": "Leading reactive energy 2", "group": "Energy 2", "area": "input", "address": 2328, "type": "float32", "unit": "varh"},
    {"name": "Total active energy (perpetual) 2", "group": "Energy 2", "area": "input", "address": 2330, "type": "float32", "unit": "Wh", "description": "Never reset"},
    {"name": "Total returned active energy (perpetual) 2", "group": "Energy 2", "area": "input", "address": 2332, "type": "float32", "unit": "Wh", "description": "Never reset"}
  ]
}
