Shelly Pro 3EM Modbus register map
Three-phase energy meter with Modbus TCP
- Official
- 69 registers
- Modbus TCP
- Revision 2 · 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
- 69 input registers
- Groups
- 7
- Revision
- 2 · 2026-10-18
- Added
- ()
- File
- maps/shelly/pro-3em.mbmap.json · 10 KB · history
- SHA-256
- a5d626b65ef53fc88d1dd785b248ec50dda8f5067bd6c0aaf475378b6437992c
- 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: EM Modbus registers table
- Shelly Gen2 API: EMData Modbus registers table
Source: Shelly Gen2 API documentation: Modbus, EM and EMData components
- Modbus TCP must be enabled first (Modbus.SetConfig enable=true, or in the web interface).
- The documentation lists input registers in 3xxxx notation: 31000 is input register 1000.
- 32-bit values are sent low word first, as in the documentation's modbus_cli examples (-B mixed).
- A second EM or EMData component, when present, has its registers at +80 (EM) and +70 (EMData).
| Area | Address | Name | Type | Access | Unit | Scale | Description |
|---|---|---|---|---|---|---|---|
| IR | 0 | string[6] | R | ||||
| IR | 6 | string[10] | R | ||||
| IR | 16 | string[32] | R | ||||
| IR | 1000 | uint32 CDAB | R | s | Unix timestamp | ||
| IR | 1002 | bool bit 0 | R | ||||
| IR | 1003 | bool bit 0 | R | ||||
| IR | 1004 | bool bit 0 | R | ||||
| IR | 1005 | bool bit 0 | R | ||||
| IR | 1006 | bool bit 0 | R | ||||
| IR | 1007 | float32 CDAB | R | A | |||
| IR | 1009 | bool bit 0 | R | ||||
| IR | 1010 | bool bit 0 | R | ||||
| IR | 1011 | float32 CDAB | R | A | Sum of the phases | ||
| IR | 1013 | float32 CDAB | R | W | Sum of the phases | ||
| IR | 1015 | float32 CDAB | R | VA | Sum of the phases | ||
| IR | 1020 | float32 CDAB | R | V | |||
| IR | 1022 | float32 CDAB | R | A | |||
| IR | 1024 | float32 CDAB | R | W | |||
| IR | 1026 | float32 CDAB | R | VA | |||
| IR | 1028 | float32 CDAB | R | ||||
| IR | 1030 | bool bit 0 | R | ||||
| IR | 1031 | bool bit 0 | R | ||||
| IR | 1032 | bool bit 0 | R | ||||
| IR | 1033 | float32 CDAB | R | Hz | |||
| IR | 1040 | float32 CDAB | R | V | |||
| IR | 1042 | float32 CDAB | R | A | |||
| IR | 1044 | float32 CDAB | R | W | |||
| IR | 1046 | float32 CDAB | R | VA | |||
| IR | 1048 | float32 CDAB | R | ||||
| IR | 1050 | bool bit 0 | R | ||||
| IR | 1051 | bool bit 0 | R | ||||
| IR | 1052 | bool bit 0 | R | ||||
| IR | 1053 | float32 CDAB | R | Hz | |||
| IR | 1060 | float32 CDAB | R | V | |||
| IR | 1062 | float32 CDAB | R | A | |||
| IR | 1064 | float32 CDAB | R | W | |||
| IR | 1066 | float32 CDAB | R | VA | |||
| IR | 1068 | float32 CDAB | R | ||||
| IR | 1070 | bool bit 0 | R | ||||
| IR | 1071 | bool bit 0 | R | ||||
| IR | 1072 | bool bit 0 | R | ||||
| IR | 1073 | float32 CDAB | R | Hz | |||
| IR | 1160 | uint32 CDAB | R | s | Unix timestamp | ||
| IR | 1162 | float32 CDAB | R | Wh | All phases, never reset | ||
| IR | 1164 | float32 CDAB | R | Wh | All phases, never reset | ||
| IR | 1170 | float32 CDAB | R | Wh | |||
| IR | 1172 | float32 CDAB | R | Wh | |||
| IR | 1174 | float32 CDAB | R | Wh | |||
| IR | 1176 | float32 CDAB | R | Wh | |||
| IR | 1178 | float32 CDAB | R | varh | |||
| IR | 1180 | float32 CDAB | R | varh | |||
| IR | 1182 | float32 CDAB | R | Wh | Never reset | ||
| IR | 1184 | float32 CDAB | R | Wh | Never reset | ||
| IR | 1190 | float32 CDAB | R | Wh | |||
| IR | 1192 | float32 CDAB | R | Wh | |||
| IR | 1194 | float32 CDAB | R | Wh | |||
| IR | 1196 | float32 CDAB | R | Wh | |||
| IR | 1198 | float32 CDAB | R | varh | |||
| IR | 1200 | float32 CDAB | R | varh | |||
| IR | 1202 | float32 CDAB | R | Wh | Never reset | ||
| IR | 1204 | float32 CDAB | R | Wh | Never reset | ||
| IR | 1210 | float32 CDAB | R | Wh | |||
| IR | 1212 | float32 CDAB | R | Wh | |||
| IR | 1214 | float32 CDAB | R | Wh | |||
| IR | 1216 | float32 CDAB | R | Wh | |||
| IR | 1218 | float32 CDAB | R | varh | |||
| IR | 1220 | float32 CDAB | R | varh | |||
| IR | 1222 | float32 CDAB | R | Wh | Never reset | ||
| IR | 1224 | float32 CDAB | R | Wh | Never reset |
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).