KEBA KeContact P30 Modbus register map
Also covers KeContact P30 c-series, KeContact P30 x-series
EV charging station, Modbus TCP
- Official
- 32 registers
- Modbus TCP
- Revision 1 · 2026-11-10
- Identity: 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
- Unit ID
- 255
- TCP port
- 502
- Byte / word order
- ABCD · bytes big-endian, words high first
- Addresses
- 0-based
- Max read
- 2 registers per request
Connection values are defaults: the device may be configured differently.
Map
- Registers
- 32 holding registers
- Groups
- 8
- Translation tables
- 6
- Revision
- 1 · 2026-11-10
- Added
- ()
- File
- maps/keba/kecontact-p30.mbmap.json · 9 KB · history
- SHA-256
- 99743906f2fa989ae3b661eb2ca58dd45a7147cccbd7779600e3e0cab9b210f0
- Manufacturer
- keba.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 1014 | uint32 ABCD |
Sources and notes
- KeContact P30 Modbus TCP Programmers Guide · version 1.07, 2025-12 linked in issue #198
Source: KEBA, KeContact P30 Modbus TCP Programmers Guide, V 1.07 (en), 12.2025
- The interface needs a P30 c-series with firmware 3.10.16 or later, or a P30 x-series with software 1.11 or later. DIP switch DSW1.3 on the station must be ON to enable Modbus TCP. The guide says Modbus TCP and the UDP interface must not be used together.
- The guide says the Unit ID must be 255, that only function codes 3 (read) and 6 (write) are supported, and that registers cannot be read in blocks: each value is read on its own, at most 2 registers (one 32-bit value). Registers are numbered from 0 (address_base 0), although the guide adds that some clients need +1.
- Every readable value is a 32-bit unsigned integer in two registers. The guide does not state the word order; big (high word first) is assumed. Check against the display or the serial number if a value looks wrong.
- Write registers hold one 16-bit value, are write-only (the guide marks them wo) and cannot be read back. The guide recommends reading no faster than every 0.5 s and writing no faster than every 5 s.
- Firmware version (1018) is hex-coded in the decimal value (30A0D00 hex is 3.10.14); it has no firmware role because the raw value is not a version string. The guide notes that Modbus TCP version 1.11 numbers this register 1013.
- Product type and features (1016) is a decimal number whose digits give the product type, cable or socket, maximum current, series, meter type and RFID; the digit tables are in the guide. Error code (1006) is a decimal number to be read as hex: the leading hex digit is the error group.
- Written from the manufacturer's document; not tested on a device.
| Area | Address | Name | Type | Access | Unit | Scale | Description |
|---|---|---|---|---|---|---|---|
| HR | 1000 | uint32 ABCD | R | ||||
| HR | 1004 | uint32 ABCD | R | ||||
| HR | 1006 | uint32 ABCD | R | 0 is no error; otherwise read the decimal value as hex | |||
| HR | 1008 | uint32 ABCD | R | A | ×0.001 | ||
| HR | 1010 | uint32 ABCD | R | A | ×0.001 | ||
| HR | 1012 | uint32 ABCD | R | A | ×0.001 | ||
| HR | 1014 | uint32 ABCD | R | ||||
| HR | 1016 | uint32 ABCD | R | Decimal digits for type, cable or socket, current, series, meter and RFID; see the guide | |||
| HR | 1018 | uint32 ABCD | R | Hex-coded: read the decimal value as hex, one byte per version part | |||
| HR | 1020 | uint32 ABCD | R | W | ×0.001 | ||
| HR | 1036 | uint32 ABCD | R | Wh | ×0.1 | Lifetime energy of the station | |
| HR | 1040 | uint32 ABCD | R | V | |||
| HR | 1042 | uint32 ABCD | R | V | |||
| HR | 1044 | uint32 ABCD | R | V | |||
| HR | 1046 | uint32 ABCD | R | % | ×0.1 | ||
| HR | 1100 | uint32 ABCD | R | A | ×0.001 | ||
| HR | 1110 | uint32 ABCD | R | A | ×0.001 | Hardware limit: lowest of DIP switch, cable coding and temperature limit; socket models show 6 A with no cable plugged | |
| HR | 1500 | uint32 ABCD | R | First 4 bytes of the card UID, when the session was authorized by RFID | |||
| HR | 1502 | uint32 ABCD | R | Wh | ×0.1 | Energy of the current session | |
| HR | 1550 | uint32 ABCD | R | ||||
| HR | 1552 | uint32 ABCD | R | ||||
| HR | 1600 | uint32 ABCD | R | A | ×0.001 | Active setting, not necessarily the persisted one | |
| HR | 1602 | uint32 ABCD | R | s | Active setting, not necessarily the persisted one | ||
| HR | 5004 | uint16 | W | A | ×0.001 | Raw value in mA; lasts until the next reboot | |
| HR | 5010 | uint16 | W | Wh | ×10 | Ends the current or next session once this energy is delivered | |
| HR | 5012 | uint16 | W | Write 0; only in suspended state | |||
| HR | 5014 | uint16 | W | Disabling stops an active session | |||
| HR | 5016 | uint16 | W | A | ×0.001 | Raw value in mA: 0 stops charging, otherwise 6000 to 32000. Only active once a failsafe timeout is sent | |
| HR | 5018 | uint16 | W | s | 0 turns failsafe off, otherwise 5 to 600 | ||
| HR | 5020 | uint16 | W | Write 1 to store the failsafe settings | |||
| HR | 5050 | uint16 | W | Chooses the channel that drives contact x2 | |||
| HR | 5052 | uint16 | 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).