{
  "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json",
  "mbmap": 2,
  "vendor": "Shelly",
  "model": "Pro 4PM",
  "models": [
    "Pro 4PM"
  ],
  "vendor_website": "shelly.com",
  "description": "Four-channel smart relay with power metering 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: 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).",
    "Each Switch component has a block of 20 input registers starting at 33000 + 20 x its id, and a coil at 100 + 10 x its id."
  ],
  "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 1", "group": "Channel 1", "area": "coil", "address": 100, "type": "bool", "access": "RW", "description": "1 = on, 0 = off"},
    {"name": "Output 1 state", "group": "Channel 1", "area": "input", "address": 3000, "type": "bool", "bit": 0},
    {"name": "Voltage 1", "group": "Channel 1", "area": "input", "address": 3001, "type": "float32", "unit": "V"},
    {"name": "Current 1", "group": "Channel 1", "area": "input", "address": 3003, "type": "float32", "unit": "A"},
    {"name": "Active power 1", "group": "Channel 1", "area": "input", "address": 3005, "type": "float32", "unit": "W"},
    {"name": "Frequency 1", "group": "Channel 1", "area": "input", "address": 3007, "type": "float32", "unit": "Hz"},
    {"name": "Power factor 1", "group": "Channel 1", "area": "input", "address": 3009, "type": "float32"},
    {"name": "Active energy 1", "group": "Channel 1", "area": "input", "address": 3011, "type": "float32", "unit": "Wh"},
    {"name": "Returned active energy 1", "group": "Channel 1", "area": "input", "address": 3013, "type": "float32", "unit": "Wh"},
    {"name": "Undervoltage error 1", "group": "Channel 1", "area": "input", "address": 3015, "type": "bool", "bit": 0},
    {"name": "Overvoltage error 1", "group": "Channel 1", "area": "input", "address": 3016, "type": "bool", "bit": 0},
    {"name": "Overcurrent error 1", "group": "Channel 1", "area": "input", "address": 3017, "type": "bool", "bit": 0},
    {"name": "Overpower error 1", "group": "Channel 1", "area": "input", "address": 3018, "type": "bool", "bit": 0},
    {"name": "Output 2", "group": "Channel 2", "area": "coil", "address": 110, "type": "bool", "access": "RW", "description": "1 = on, 0 = off"},
    {"name": "Output 2 state", "group": "Channel 2", "area": "input", "address": 3020, "type": "bool", "bit": 0},
    {"name": "Voltage 2", "group": "Channel 2", "area": "input", "address": 3021, "type": "float32", "unit": "V"},
    {"name": "Current 2", "group": "Channel 2", "area": "input", "address": 3023, "type": "float32", "unit": "A"},
    {"name": "Active power 2", "group": "Channel 2", "area": "input", "address": 3025, "type": "float32", "unit": "W"},
    {"name": "Frequency 2", "group": "Channel 2", "area": "input", "address": 3027, "type": "float32", "unit": "Hz"},
    {"name": "Power factor 2", "group": "Channel 2", "area": "input", "address": 3029, "type": "float32"},
    {"name": "Active energy 2", "group": "Channel 2", "area": "input", "address": 3031, "type": "float32", "unit": "Wh"},
    {"name": "Returned active energy 2", "group": "Channel 2", "area": "input", "address": 3033, "type": "float32", "unit": "Wh"},
    {"name": "Undervoltage error 2", "group": "Channel 2", "area": "input", "address": 3035, "type": "bool", "bit": 0},
    {"name": "Overvoltage error 2", "group": "Channel 2", "area": "input", "address": 3036, "type": "bool", "bit": 0},
    {"name": "Overcurrent error 2", "group": "Channel 2", "area": "input", "address": 3037, "type": "bool", "bit": 0},
    {"name": "Overpower error 2", "group": "Channel 2", "area": "input", "address": 3038, "type": "bool", "bit": 0},
    {"name": "Output 3", "group": "Channel 3", "area": "coil", "address": 120, "type": "bool", "access": "RW", "description": "1 = on, 0 = off"},
    {"name": "Output 3 state", "group": "Channel 3", "area": "input", "address": 3040, "type": "bool", "bit": 0},
    {"name": "Voltage 3", "group": "Channel 3", "area": "input", "address": 3041, "type": "float32", "unit": "V"},
    {"name": "Current 3", "group": "Channel 3", "area": "input", "address": 3043, "type": "float32", "unit": "A"},
    {"name": "Active power 3", "group": "Channel 3", "area": "input", "address": 3045, "type": "float32", "unit": "W"},
    {"name": "Frequency 3", "group": "Channel 3", "area": "input", "address": 3047, "type": "float32", "unit": "Hz"},
    {"name": "Power factor 3", "group": "Channel 3", "area": "input", "address": 3049, "type": "float32"},
    {"name": "Active energy 3", "group": "Channel 3", "area": "input", "address": 3051, "type": "float32", "unit": "Wh"},
    {"name": "Returned active energy 3", "group": "Channel 3", "area": "input", "address": 3053, "type": "float32", "unit": "Wh"},
    {"name": "Undervoltage error 3", "group": "Channel 3", "area": "input", "address": 3055, "type": "bool", "bit": 0},
    {"name": "Overvoltage error 3", "group": "Channel 3", "area": "input", "address": 3056, "type": "bool", "bit": 0},
    {"name": "Overcurrent error 3", "group": "Channel 3", "area": "input", "address": 3057, "type": "bool", "bit": 0},
    {"name": "Overpower error 3", "group": "Channel 3", "area": "input", "address": 3058, "type": "bool", "bit": 0},
    {"name": "Output 4", "group": "Channel 4", "area": "coil", "address": 130, "type": "bool", "access": "RW", "description": "1 = on, 0 = off"},
    {"name": "Output 4 state", "group": "Channel 4", "area": "input", "address": 3060, "type": "bool", "bit": 0},
    {"name": "Voltage 4", "group": "Channel 4", "area": "input", "address": 3061, "type": "float32", "unit": "V"},
    {"name": "Current 4", "group": "Channel 4", "area": "input", "address": 3063, "type": "float32", "unit": "A"},
    {"name": "Active power 4", "group": "Channel 4", "area": "input", "address": 3065, "type": "float32", "unit": "W"},
    {"name": "Frequency 4", "group": "Channel 4", "area": "input", "address": 3067, "type": "float32", "unit": "Hz"},
    {"name": "Power factor 4", "group": "Channel 4", "area": "input", "address": 3069, "type": "float32"},
    {"name": "Active energy 4", "group": "Channel 4", "area": "input", "address": 3071, "type": "float32", "unit": "Wh"},
    {"name": "Returned active energy 4", "group": "Channel 4", "area": "input", "address": 3073, "type": "float32", "unit": "Wh"},
    {"name": "Undervoltage error 4", "group": "Channel 4", "area": "input", "address": 3075, "type": "bool", "bit": 0},
    {"name": "Overvoltage error 4", "group": "Channel 4", "area": "input", "address": 3076, "type": "bool", "bit": 0},
    {"name": "Overcurrent error 4", "group": "Channel 4", "area": "input", "address": 3077, "type": "bool", "bit": 0},
    {"name": "Overpower error 4", "group": "Channel 4", "area": "input", "address": 3078, "type": "bool", "bit": 0}
  ]
}
