WAGO 879-3000 energy meter Modbus register map
Also covers 879-3001, 879-3020, 879-3021, 879-3040
Three-phase MID energy meter (4PU, 4PS and 2PU CT variants) with Modbus RTU
- Official
- 147 registers
- Modbus TCP and RTU
- Revision 2 · 2026-11-10
- Identity: firmware, 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
- 1
- TCP port
- 502default
- 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
Connection values are defaults: the device may be configured differently.
Map
- Registers
- 147 holding registers
- Groups
- 4
- Translation tables
- 8
- Revision
- 2 · 2026-11-10
- Added
- ()
- File
- maps/wago/879-3000.mbmap.json · 26 KB · history
- SHA-256
- 358d29c64826391bb0fef10242362a797494f77d2aee4c7660d18b886f03a11e
- Manufacturer
- wago.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 | Serial number | holding 16384 | uint32 ABCD | |
| Firmware | Software version | holding 16391 | float32 ABCD |
Sources and notes
- WAGO Energy Meters (MID), Operating Instructions 4PU/4PS/2PU CT · version 1.8, 2024-02 Appendix 3, Modbus register map (A3.2) and write registers (A3.3); every register address, length, unit, type and the Float ABCD order checked against it
- Varitras/ha-wago, wago_879_api/registers.py (MIT licence) First source of the map; cites manual EN V1.6
Source: WAGO Energy Meters (MID) operating instructions 4PU/4PS/2PU CT, English, V1.8 (02/2024), appendix 3 (A3.1 to A3.3)
- Checked against the manufacturer's manual (V1.8, appendix 3). Addresses in the manual are hexadecimal (0x4000 is 16384) and every register is read with function 03.
- Every measured value is a 32-bit IEEE float in two holding registers, high word first (the manual's 'Float ABCD'). Whole numbers are 16-bit signed, apart from the serial number, checksum, status word and S0 pulse width (two registers, 'HEX' or 'Signed' in the manual).
- Power is in kW, kvar and kVA and energy in kWh and kvarh, as the manual lists them.
- The 'total' energy registers follow the combination code (0x400F): 1 import only, 2 export only, 3 import plus export, 4 and 5 import minus export. They can fall or go negative; use the import and export registers for rising counters.
- Voltage average, current average and the CT ratio sit on registers the manual marks with an asterisk or grey: a direct-measuring meter leaves them at zero. A tariff-less meter holds zero in most T1 to T4 and Q1 to Q4 counters.
- The meter has an RS-485 Modbus RTU interface, factory settings unit id 1, 9600 baud, 8 data bits, no parity, 1 stop bit. The manual does not describe Modbus TCP: the TCP access in the Home Assistant integration goes through the 879-9000 module, which forwards the meter's unit id and answers itself on unit 255.
- The settings registers are writable with function 06 (function 16 for two-register values); access RW marks the ones the manual lists in A3.3. Not mapped: reserved registers, checksum 2, and the CT ratio history registers' meaning beyond their names.
| Area | Address | Name | Type | Access | Unit | Scale | Description |
|---|---|---|---|---|---|---|---|
| HR | 16384 | uint32 ABCD | R | Two registers, shown as hex | |||
| HR | 16386 | uint16 | R | Variant code: 1111 on the 4PU, 1112 on the 4PS, 1113 on the 2PU CT | |||
| HR | 16387 | int16 | RW | Unit id, 1 to 247 (0 is broadcast); written with function 06 | |||
| HR | 16388 | int16 | RW | ||||
| HR | 16389 | float32 ABCD | R | ||||
| HR | 16391 | float32 ABCD | R | ||||
| HR | 16393 | float32 ABCD | R | ||||
| HR | 16395 | int16 | R | A | Rated current of the meter (the manual calls it meter amp) | ||
| HR | 16396 | uint16 | R | A | One-register CT ratio; the two-register value at 0x401F is the one the manual shows how to write | ||
| HR | 16397 | float32 ABCD | RW | pulse/kWh | Pulses per kWh of the S0 output: 10000, 2000, 1000, 100, 10, 1, 0.1 or 0.01 | ||
| HR | 16399 | int16 | R | What the 'total' energy registers accumulate | |||
| HR | 16400 | uint16 | RW | s | Display scroll time, 1 to 30 s | ||
| HR | 16401 | int16 | RW | ||||
| HR | 16402 | uint16 | R | One ASCII character: F for import, R for export | |||
| HR | 16403 | uint16 | R | One ASCII character: F for import, R for export | |||
| HR | 16404 | uint16 | R | One ASCII character: F for import, R for export | |||
| HR | 16406 | int16 | RW | Write 0 to reset | |||
| HR | 16407 | int16 | R | ||||
| HR | 16408 | int16 | R | ||||
| HR | 16409 | int16 | R | ||||
| HR | 16410 | int16 | R | ||||
| HR | 16411 | uint32 ABCD | R | Two registers, shown as hex | |||
| HR | 16413 | uint32 ABCD | R | Two registers, shown as hex | |||
| HR | 16415 | uint16 | RW | First half of the two-register CT ratio at 0x401F: the primary current, written together with the secondary (9995/5 in the manual example). Zero on a direct-measuring meter | |||
| HR | 16416 | uint16 | RW | Second half of the two-register CT ratio at 0x401F: the secondary current. Zero on a direct-measuring meter | |||
| HR | 16417 | uint16 | RW | ms | S0 pulse width, 2 to 99 ms (the read table gives two registers, the write table one; mapped as one because the next register is 0x4022) | ||
| HR | 16418 | uint16 | RW | ||||
| HR | 16422 | int16 | RW | Value format of the meter: standard or integer | |||
| HR | 16434 | int16 | RW | ||||
| HR | 16435 | int16 | RW | ||||
| HR | 20480 | float32 ABCD | R | V | |||
| HR | 20482 | float32 ABCD | R | V | |||
| HR | 20484 | float32 ABCD | R | V | |||
| HR | 20486 | float32 ABCD | R | V | |||
| HR | 20488 | float32 ABCD | R | Hz | |||
| HR | 20490 | float32 ABCD | R | A | |||
| HR | 20492 | float32 ABCD | R | A | |||
| HR | 20494 | float32 ABCD | R | A | |||
| HR | 20496 | float32 ABCD | R | A | |||
| HR | 20498 | float32 ABCD | R | kW | |||
| HR | 20500 | float32 ABCD | R | kW | |||
| HR | 20502 | float32 ABCD | R | kW | |||
| HR | 20504 | float32 ABCD | R | kW | |||
| HR | 20506 | float32 ABCD | R | kvar | |||
| HR | 20508 | float32 ABCD | R | kvar | |||
| HR | 20510 | float32 ABCD | R | kvar | |||
| HR | 20512 | float32 ABCD | R | kvar | |||
| HR | 20514 | float32 ABCD | R | kVA | |||
| HR | 20516 | float32 ABCD | R | kVA | |||
| HR | 20518 | float32 ABCD | R | kVA | |||
| HR | 20520 | float32 ABCD | R | kVA | |||
| HR | 20522 | float32 ABCD | R | ||||
| HR | 20524 | float32 ABCD | R | ||||
| HR | 20526 | float32 ABCD | R | ||||
| HR | 20528 | float32 ABCD | R | ||||
| HR | 20530 | float32 ABCD | R | V | |||
| HR | 20532 | float32 ABCD | R | V | |||
| HR | 20534 | float32 ABCD | R | V | |||
| HR | 24576 | float32 ABCD | R | kWh | |||
| HR | 24578 | float32 ABCD | R | kWh | |||
| HR | 24580 | float32 ABCD | R | kWh | |||
| HR | 24582 | float32 ABCD | R | kWh | |||
| HR | 24584 | float32 ABCD | R | kWh | |||
| HR | 24586 | float32 ABCD | R | kWh | |||
| HR | 24588 | float32 ABCD | R | kWh | |||
| HR | 24590 | float32 ABCD | R | kWh | |||
| HR | 24592 | float32 ABCD | R | kWh | |||
| HR | 24594 | float32 ABCD | R | kWh | |||
| HR | 24596 | float32 ABCD | R | kWh | |||
| HR | 24598 | float32 ABCD | R | kWh | |||
| HR | 24600 | float32 ABCD | R | kWh | |||
| HR | 24602 | float32 ABCD | R | kWh | |||
| HR | 24604 | float32 ABCD | R | kWh | |||
| HR | 24606 | float32 ABCD | R | kWh | |||
| HR | 24608 | float32 ABCD | R | kWh | |||
| HR | 24610 | float32 ABCD | R | kWh | |||
| HR | 24612 | float32 ABCD | R | kvarh | |||
| HR | 24614 | float32 ABCD | R | kvarh | |||
| HR | 24616 | float32 ABCD | R | kvarh | |||
| HR | 24618 | float32 ABCD | R | kvarh | |||
| HR | 24620 | float32 ABCD | R | kvarh | |||
| HR | 24622 | float32 ABCD | R | kvarh | |||
| HR | 24624 | float32 ABCD | R | kvarh | |||
| HR | 24626 | float32 ABCD | R | kvarh | |||
| HR | 24628 | float32 ABCD | R | kvarh | |||
| HR | 24630 | float32 ABCD | R | kvarh | |||
| HR | 24632 | float32 ABCD | R | kvarh | |||
| HR | 24634 | float32 ABCD | R | kvarh | |||
| HR | 24636 | float32 ABCD | R | kvarh | |||
| HR | 24638 | float32 ABCD | R | kvarh | |||
| HR | 24640 | float32 ABCD | R | kvarh | |||
| HR | 24642 | float32 ABCD | R | kvarh | |||
| HR | 24644 | float32 ABCD | R | kvarh | |||
| HR | 24646 | float32 ABCD | R | kvarh | |||
| HR | 24648 | int16 | RW | Active tariff, 1 to 4; written with function 06 | |||
| HR | 24649 | float32 ABCD | RW | kWh | Resettable day register; write zero to reset it | ||
| HR | 24651 | float32 ABCD | R | kWh | |||
| HR | 24653 | float32 ABCD | R | kWh | |||
| HR | 24655 | float32 ABCD | R | kWh | |||
| HR | 24657 | float32 ABCD | R | kWh |
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).