Identity and discovery
How a host recognises an STD module, what it is, and what it can do. All registers in this chapter are read-only unless stated otherwise. I²C addresses; Modbus discovery mirrors are listed at the end.
Discovery sequence
On first contact a master reads the identity block at 0x0000 and gates everything else on it:
ID(0x0000, 2 bytes) must read'S','T'(0x53, 0x54) — anything else is not an STD module.VERSION(0x0003) is the register-map layout version (current:0x36). Feature additions bump it; a master gates map features on it.CAPABILITIES(0x0004, u16) — feature bitmap, see below. Bit 9 (16-bit addressing) is always set on STD.N_VOLTAGE(0x0007) /N_CURRENT(0x0008) — how many channels are populated. Channel blocks at index ≥ N are reserved; their value is unspecified.VARIANT(0x0009) — family member code.UID(0x00F4, 12 bytes) — the chip's unique id. Addresses can be changed; the UID cannot: use it as the device identity in any database.FW_VER(0x0114, u32) — the running firmware version (use it for inventory and update decisions). Read it asmajor.minor= the high word and the low word in decimal:0x0001007Eis shown as STD firmware 1.126. The register-map version (VERSION, 0x0003) is separate.
Identity registers
| Addr | Name | Type | Meaning |
|---|---|---|---|
| 0x0000 | ID | 2×u8 | 'S','T' |
| 0x0002 | ERROR | u8 | result of the last command (see Commands) |
| 0x0003 | VERSION | u8 | register-map version (0x36) |
| 0x0004 | CAPABILITIES | u16 | feature bitmap |
| 0x0006 | STATUS | u8 | live status bits (see Diagnostics) |
| 0x0007 | N_VOLTAGE | u8 | voltage channels, 0..8 |
| 0x0008 | N_CURRENT | u8 | current channels, 1..64 |
| 0x0009 | VARIANT | u8 | family member code |
| 0x000A | HW_REV | u8 | hardware revision |
| 0x000B | FW_VERSION | u16 | firmware line marker — not the image version |
| 0x00F4 | UID | 12×u8 | unique chip id |
| 0x0114 | FW_VER | u32 | running firmware version: high word . low word, decimal (0x0001007E = 1.126) |
| 0x017C | BOARD_ID | u32 | board id of the running image (see below) |
⚠ Two "firmware version" registers exist for historical reasons.
FW_VERSION(0x000B, u16) only marks the firmware line. The actual, monotonically increasing firmware version isFW_VER(0x0114, u32), shown asmajor.minor— use it for inventory and update decisions.
BOARD_ID (0x017C)
BOARD_ID identifies the board the running image was built for:
("BD" << 16) | channel-count << 8 | VARIANT = 0x4244nnvv — e.g. 0x42440211 for STD-UI1.
Every release image carries the same word, covered by the image's
integrity and signature checks; a firmware update with a different board id is refused
(see Firmware update). Compare BOARD_ID with the release file before
sending an update.
CAPABILITIES bitmap (0x0004)
| Bit | Name | Meaning |
|---|---|---|
| 0 | SIGNED | signed power/energy (import/export) |
| 1 | REACTIVE | Q and S published |
| 2 | THD | THD / displacement-PF fields live (0 → those fields read 0 on I²C, the sentinel on Modbus native) |
| 3 | HARMONICS | per-harmonic spectra (industrial tier) |
| 4 | INDUSTRIAL | industrial tier build |
| 5 | HUB_IFACE | hub-side interface |
| 6 | OTA | firmware update over the bus |
| 7 | ENERGY | per-window energy accumulators |
| 8 | MULTI_LATCH | eight snapshot banks present — see Snapshot banks |
| 9 | ADDR16 | 16-bit register addressing (always 1 on STD) |
| 10 | MULTI_CHANNEL | more than one current channel |
| 11 | MODBUS_IFACE | Modbus RTU transport present |
| 12 | RTC | battery-backed on-device clock (0 — time comes from the master) |
| 13 | ONDEVICE_ENERGY | cumulative energy counters persisted on the device |
| 14 | CHMAP_PERSIST | per-channel CT-model map persists (reserved; 0 until implemented) |
| 15 | ENERGY_UWH | µWh-resolution energy counters published (active µWh and reactive µvarh) — see Measurement & energy |
A master treats unknown bits as "feature absent" and never relies on reserved fields.
Honest-capabilities rule: a module reports only what the running build actually provides. For example, the three-phase firmware reports THD = 0 and RTC = 0 (the master feeds the clock); modules modules without snapshot banks report MULTI_LATCH = 0 (energy is read from cumulative counters).
VARIANT codes (0x0009)
| Code | Member | Channels |
|---|---|---|
| 0x11 | STD-UI1 | 1 V + 1 I |
| 0x63 | STD-U3I3 | 3 V + 3 I (three-phase) |
Other codes in the enum space are reserved and must not be assumed absent-forever; a master decides
by N_VOLTAGE / N_CURRENT + CAPABILITIES, not by hardcoding variant codes.
Modbus discovery mirror
The same identity set is readable over Modbus as input registers at 0x6000:
MAGIC 0x6000 · MAP_VERSION 0x6001 · FW_VERSION 0x6002 · HW_REV 0x6003 · CAPABILITIES 0x6004 ·
N_VOLTAGE 0x6005 · N_CURRENT 0x6006 · VARIANT 0x6007 · TIER 0x6008 · STATUS 0x6009 · ERROR 0x600A ·
UID 0x600B–0x6010 (12 bytes, big-endian by register) · FRAME_CNT 0x6011–12 · FREQ 0x6013 ·
WINDOW_MS 0x6014 · CMD_SEQ 0x6015 · RING_DROP 0x6016 · WIN_NSAMP 0x6017 · WIN_PERIOD 0x6018 ·
CPU diag 0x6019–0x601C · LOST_FRAMES 0x601D–1E · WIN_SEQ 0x601F. BOARD_ID is holding 0x831B–1C;
FW_VER is holding 0x8315–16.