Shelly Pro 4PM Modbus register map
Four-channel smart relay with power metering and Modbus TCP
- Official
- 55 registers
- Modbus TCP
- Revision 1 · 2026-10-18
- Identity: model
Official: Written from the manufacturer's documentation, but not tested on a device yet. Check the map against the manufacturer's documentation before you write to a live device. Tested it? Report a test.
Communication
- Protocol
- Modbus TCP
- Unit ID
- 1default
- TCP port
- 502
- Byte / word order
- CDAB · bytes big-endian, words low first (word swap)
- Addresses
- 0-based
Connection values are defaults: the device may be configured differently.
Map
- Registers
- 51 input registers, 4 coils
- Groups
- 5
- Revision
- 1 · 2026-10-18
- Added
- ()
- File
- maps/shelly/pro-4pm.mbmap.json · 8 KB · history
- SHA-256
- c7687c2be2e1d6aa468d9e047e0d8b1ceee81bd26671543277b1a10bb87b573c
- Manufacturer
- shelly.com
Device identity
What a tool can read to check that this map fits the connected device (SPEC.md section 4.7). Registers with a role are read like any other register.
| Role | Register | Address | Type | Values |
|---|---|---|---|---|
| Model | Model | input 6 | string[10] |
Sources and notes
- Shelly Gen2 API: Modbus
- Shelly Gen2 API: Switch Modbus registers table
Source: Shelly Gen2 API documentation: Modbus and component pages
- 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.
| Area | Address | Name | Type | Access | Unit | Scale | Description |
|---|---|---|---|---|---|---|---|
| IR | 0 | string[6] | R | ||||
| IR | 6 | string[10] | R | ||||
| IR | 16 | string[32] | R | ||||
| CO | 100 | bool | RW | 1 = on, 0 = off | |||
| IR | 3000 | bool bit 0 | R | ||||
| IR | 3001 | float32 CDAB | R | V | |||
| IR | 3003 | float32 CDAB | R | A | |||
| IR | 3005 | float32 CDAB | R | W | |||
| IR | 3007 | float32 CDAB | R | Hz | |||
| IR | 3009 | float32 CDAB | R | ||||
| IR | 3011 | float32 CDAB | R | Wh | |||
| IR | 3013 | float32 CDAB | R | Wh | |||
| IR | 3015 | bool bit 0 | R | ||||
| IR | 3016 | bool bit 0 | R | ||||
| IR | 3017 | bool bit 0 | R | ||||
| IR | 3018 | bool bit 0 | R | ||||
| CO | 110 | bool | RW | 1 = on, 0 = off | |||
| IR | 3020 | bool bit 0 | R | ||||
| IR | 3021 | float32 CDAB | R | V | |||
| IR | 3023 | float32 CDAB | R | A | |||
| IR | 3025 | float32 CDAB | R | W | |||
| IR | 3027 | float32 CDAB | R | Hz | |||
| IR | 3029 | float32 CDAB | R | ||||
| IR | 3031 | float32 CDAB | R | Wh | |||
| IR | 3033 | float32 CDAB | R | Wh | |||
| IR | 3035 | bool bit 0 | R | ||||
| IR | 3036 | bool bit 0 | R | ||||
| IR | 3037 | bool bit 0 | R | ||||
| IR | 3038 | bool bit 0 | R | ||||
| CO | 120 | bool | RW | 1 = on, 0 = off | |||
| IR | 3040 | bool bit 0 | R | ||||
| IR | 3041 | float32 CDAB | R | V | |||
| IR | 3043 | float32 CDAB | R | A | |||
| IR | 3045 | float32 CDAB | R | W | |||
| IR | 3047 | float32 CDAB | R | Hz | |||
| IR | 3049 | float32 CDAB | R | ||||
| IR | 3051 | float32 CDAB | R | Wh | |||
| IR | 3053 | float32 CDAB | R | Wh | |||
| IR | 3055 | bool bit 0 | R | ||||
| IR | 3056 | bool bit 0 | R | ||||
| IR | 3057 | bool bit 0 | R | ||||
| IR | 3058 | bool bit 0 | R | ||||
| CO | 130 | bool | RW | 1 = on, 0 = off | |||
| IR | 3060 | bool bit 0 | R | ||||
| IR | 3061 | float32 CDAB | R | V | |||
| IR | 3063 | float32 CDAB | R | A | |||
| IR | 3065 | float32 CDAB | R | W | |||
| IR | 3067 | float32 CDAB | R | Hz | |||
| IR | 3069 | float32 CDAB | R | ||||
| IR | 3071 | float32 CDAB | R | Wh | |||
| IR | 3073 | float32 CDAB | R | Wh | |||
| IR | 3075 | bool bit 0 | R | ||||
| IR | 3076 | bool bit 0 | R | ||||
| IR | 3077 | bool bit 0 | R | ||||
| IR | 3078 | bool bit 0 | R |
No registers match
Try part of the name, an address (decimal or 0x hex) or clear the filters.
Help improve this map
- I tested it on a deviceReport whether it worked, even if you did not write the map.
- Suggest a correctionEdit the file on GitHub; it opens a pull request.
- Report a problemA wrong address, type, scale or byte order.
- Read the formatWhat each key of the file means (SPEC.md).