Shelly 2PM Gen4 Modbus register map
Also covers Shelly 2PM Gen4
Two-channel smart relay or roller shutter controller with power metering and Modbus TCP
- Official
- 27 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
- 27 input registers
- Groups
- 3
- Revision
- 1 · 2026-10-18
- Added
- ()
- File
- maps/shelly/2pm-gen4.mbmap.json · 6 KB · history
- SHA-256
- 06d8b4bb6790ab325cdcec3a7384454b20a7e03ac97f91fc425aaffb26a8800d
- 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
- Shelly Gen2 API: Shelly 2PM Gen4
Source: Shelly Gen2 API documentation: Modbus and Switch component pages, Shelly 2PM Gen4 device page
- Modbus TCP must be enabled first (Modbus.SetConfig with 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; Switch:1 starts at 33020.
- Not in this map: the output coils (the documentation lists them for the Pro 3EM with output add-on and the Pro EM only) and the Cover component, which has no Modbus register table. The Switch measurements are the same whether the channels are used as relays or as a roller shutter.
| Area | Address | Name | Type | Access | Unit | Scale | Description |
|---|---|---|---|---|---|---|---|
| IR | 0 | string[6] | R | ||||
| IR | 6 | string[10] | R | ||||
| IR | 16 | string[32] | R | ||||
| 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 | ||||
| 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 |
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).