GoodWe Hybrid inverters (third-party EMS protocol) Modbus register map
GoodWe hybrid inverters (ET, EH, BH, BT, ESA and newer) for monitoring and EMS control
- Official
- 169 registers
- Modbus TCP and RTU
- Revision 1 · 2026-10-14
- Identity: model, serial number
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 and RTU
- Unit ID
- 247
- TCP port
- 502
- Serial
- 9600 8N1 · 9600 baud, 8 data bits, none parity, 1 stop bit
- Byte / word order
- ABCD · bytes big-endian, words high first
- Addresses
- 0-based
- Max read
- 100 registers per request
Connection values are defaults: the device may be configured differently.
Map
- Registers
- 169 holding registers
- Groups
- 13
- Revision
- 1 · 2026-10-14
- Added
- ()
- File
- maps/goodwe/hybrid-ems.mbmap.json · 28 KB · history
- SHA-256
- c4ad9fb0ebd926354c6b6d5591f5751981a9199a84712f2488be174bfe2a4ba3
- Manufacturer
- goodwe.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 |
|---|---|---|---|---|
| Serial number | Inverter serial number | holding 35003 | string[8] | |
| Model | Model name | holding 35011 | string[5] |
Sources and notes
- Third-Party EMS Protocol MODBUS · version V1.1.1 sections 8, 9 and appendix
Source: GoodWe, Technical Information: Third-Party EMS Protocol MODBUS V1.1.1
- Every register is a holding register: read with FC03, write with FC16.
- The default slave address is 247 (RTU and TCP). Modbus TCP must be enabled through SEMS+.
- Read at most 100 registers at a time, about once per second; the EMS mode and power registers must be written every second.
- Not every model has every register: the descriptions say which models a register is for when the protocol does.
| Area | Address | Name | Type | Access | Unit | Scale | Description |
|---|---|---|---|---|---|---|---|
| HR | 33001 | uint32 ABCD | R | W | |||
| HR | 33004 | uint32 ABCD | R | W | |||
| HR | 33006 | uint32 ABCD | R | W | |||
| HR | 35001 | uint16 | R | W | |||
| HR | 35003 | string[8] | R | ||||
| HR | 35011 | string[5] | R | EH and ET PLUS only | |||
| HR | 35060 | string[16] | R | ||||
| HR | 35103 | uint16 | R | V | ×0.1 | ||
| HR | 35104 | uint16 | R | A | ×0.1 | ||
| HR | 35107 | uint16 | R | V | ×0.1 | ||
| HR | 35108 | uint16 | R | A | ×0.1 | ||
| HR | 35111 | uint16 | R | V | ×0.1 | ||
| HR | 35112 | uint16 | R | A | ×0.1 | ||
| HR | 35115 | uint16 | R | V | ×0.1 | ||
| HR | 35116 | uint16 | R | A | ×0.1 | ||
| HR | 35304 | uint16 | R | V | ×0.1 | ||
| HR | 35305 | uint16 | R | A | ×0.1 | ||
| HR | 35306 | uint16 | R | V | ×0.1 | ||
| HR | 35307 | uint16 | R | A | ×0.1 | ||
| HR | 35308 | uint16 | R | V | ×0.1 | ||
| HR | 35309 | uint16 | R | A | ×0.1 | ||
| HR | 35310 | uint16 | R | V | ×0.1 | ||
| HR | 35311 | uint16 | R | A | ×0.1 | ||
| HR | 35312 | uint16 | R | V | ×0.1 | ||
| HR | 35313 | uint16 | R | A | ×0.1 | ||
| HR | 35314 | uint16 | R | V | ×0.1 | ||
| HR | 35315 | uint16 | R | A | ×0.1 | ||
| HR | 35316 | uint16 | R | V | ×0.1 | ||
| HR | 35317 | uint16 | R | A | ×0.1 | ||
| HR | 35318 | uint16 | R | V | ×0.1 | ||
| HR | 35319 | uint16 | R | A | ×0.1 | ||
| HR | 35320 | uint16 | R | V | ×0.1 | ||
| HR | 35321 | uint16 | R | A | ×0.1 | ||
| HR | 35322 | uint16 | R | V | ×0.1 | ||
| HR | 35323 | uint16 | R | A | ×0.1 | ||
| HR | 35324 | uint16 | R | V | ×0.1 | ||
| HR | 35325 | uint16 | R | A | ×0.1 | ||
| HR | 35326 | uint16 | R | V | ×0.1 | ||
| HR | 35327 | uint16 | R | A | ×0.1 | ||
| HR | 35423 | uint16 | R | V | ×0.1 | ||
| HR | 35424 | uint16 | R | A | ×0.1 | ||
| HR | 35425 | uint16 | R | V | ×0.1 | ||
| HR | 35426 | uint16 | R | A | ×0.1 | ||
| HR | 35427 | uint16 | R | V | ×0.1 | ||
| HR | 35428 | uint16 | R | A | ×0.1 | ||
| HR | 35429 | uint16 | R | V | ×0.1 | ||
| HR | 35430 | uint16 | R | A | ×0.1 | ||
| HR | 35345 | uint16 | R | A | ×0.1 | ||
| HR | 35105 | uint32 ABCD | R | W | 200 ms average | ||
| HR | 35337 | uint16 | R | W | 200 ms average | ||
| HR | 35346 | uint16 | R | A | ×0.1 | ||
| HR | 35109 | uint32 ABCD | R | W | 200 ms average | ||
| HR | 35338 | uint16 | R | W | 200 ms average | ||
| HR | 35347 | uint16 | R | A | ×0.1 | ||
| HR | 35113 | uint32 ABCD | R | W | 200 ms average | ||
| HR | 35339 | uint16 | R | W | 200 ms average | ||
| HR | 35348 | uint16 | R | A | ×0.1 | ||
| HR | 35117 | uint32 ABCD | R | W | 200 ms average | ||
| HR | 35340 | uint16 | R | W | 200 ms average | ||
| HR | 35349 | uint16 | R | A | ×0.1 | ||
| HR | 35341 | uint16 | R | W | 200 ms average | ||
| HR | 35350 | uint16 | R | A | ×0.1 | ||
| HR | 35342 | uint16 | R | W | 200 ms average | ||
| HR | 35351 | uint16 | R | A | ×0.1 | ||
| HR | 35343 | uint16 | R | W | 200 ms average | ||
| HR | 35352 | uint16 | R | A | ×0.1 | ||
| HR | 35344 | uint16 | R | W | 200 ms average | ||
| HR | 35415 | uint16 | R | A | ×0.1 | ||
| HR | 35407 | uint16 | R | W | 200 ms average | ||
| HR | 35416 | uint16 | R | A | ×0.1 | ||
| HR | 35408 | uint16 | R | W | 200 ms average | ||
| HR | 35121 | uint16 | R | V | ×0.1 | ||
| HR | 35122 | uint16 | R | A | ×0.1 | ||
| HR | 35123 | uint16 | R | Hz | ×0.01 | ||
| HR | 35124 | int32 ABCD | R | W | |||
| HR | 35126 | uint16 | R | V | ×0.1 | ||
| HR | 35127 | uint16 | R | A | ×0.1 | ||
| HR | 35128 | uint16 | R | Hz | ×0.01 | ||
| HR | 35129 | int32 ABCD | R | W | |||
| HR | 35131 | uint16 | R | V | ×0.1 | ||
| HR | 35132 | uint16 | R | A | ×0.1 | ||
| HR | 35133 | uint16 | R | Hz | ×0.01 | ||
| HR | 35134 | int32 ABCD | R | W | |||
| HR | 35137 | int32 ABCD | R | W | |||
| HR | 35139 | int32 ABCD | R | W | On-grid power: the meter reading when the meter is connected, otherwise the inverter on-grid port | ||
| HR | 35141 | int32 ABCD | R | var | |||
| HR | 35143 | int32 ABCD | R | VA | |||
| HR | 35169 | int32 ABCD | R | W | |||
| HR | 35171 | int32 ABCD | R | W | On-grid load, backup not included | ||
| HR | 35181 | int16 | R | A | ×0.1 | ||
| HR | 35182 | int32 ABCD | R | W | 200 ms average | ||
| HR | 35184 | uint16 | R | ||||
| HR | 35186 | uint16 | R | Code from table 1-1 of the protocol | |||
| HR | 35187 | uint16 | R | ||||
| HR | 35212 | uint16 | R | ||||
| HR | 35262 | uint16 | R | V | ×0.1 | ||
| HR | 35263 | int16 | R | A | ×0.1 | ||
| HR | 35264 | int32 ABCD | R | W | |||
| HR | 35267 | uint16 | R | ||||
| HR | 35301 | uint32 ABCD | R | W |
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).