A self-hosted, vendor-independent AMI system bridging NB-IoT and LoRaWAN water meters to DLMS/COSEM, MDM, and billing — zero cloud dependency.
Architecture
Every reading travels from physical meter to billing-ready interval in under 5 seconds.
Services
Click any card to open its dashboard. Default credentials are shown for the initial deployment.
Central device manager. Decodes vendor payloads via codec registry, stores canonical readings, manages alarms, OTA firmware updates, and acts as DLMS client polling the virtual concentrator.
Consumes canonical HES events, produces hourly and daily interval data, runs VEE (Validation, Estimation, Editing), generates billing determinants, and monitors Non-Revenue Water per DMA zone.
Makes NB-IoT meters appear as native DLMS/COSEM devices to any DLMS-speaking HES or utility software. Caches readings in memory and serves COSEM attributes over TCP Wrapper.
LoRaWAN Network Server. Handles gateway connections (Basic Station over WSS on port 3002), device activation (OTAA/ABP), uplink/downlink routing, and publishes events to MQTT for the HES bridge.
Bridges NB-IoT devices registered on Leshan to the HES MQTT pipeline. Streams Leshan events via SSE, normalizes LwM2M object values, and publishes canonical readings to the shared MQTT bus.
Operational analytics and monitoring. Pre-configured with TimescaleDB data source for meter readings, and Mosquitto Live for real-time MQTT event streaming. Build custom dashboards for any metric.
S3-compatible object store for FUOTA firmware image storage. Stores binary firmware blobs referenced by FUOTA sessions. Also available as a cold-storage export target for interval data archives.
Eclipse Leshan is the OMA LwM2M server that NB-IoT meters register to. Provides the CoAP endpoint for device registration, observe/notify subscriptions, and firmware object (LwM2M /5) management.
Device Identity
Every meter is uniquely identified by a 64-bit hardware address across all services and protocols.
A Device EUI (Extended Unique Identifier) is the 64-bit hardware address that uniquely identifies every IoT meter in this platform — analogous to a MAC address. It is assigned by the meter manufacturer, burned into the hardware, and never changes. In LoRaWAN the EUI is used during OTAA join; in NB-IoT/LwM2M it is the endpoint name. All data in the system — readings, alarms, DLMS poll records, billing intervals — is keyed on the EUI.
| Context | Field name | Format | Example | Used by |
|---|---|---|---|---|
| LoRaWAN (ChirpStack) | devEui |
16 hex chars (8 bytes) | a8610a3030303031 | NS, ChirpStack UI, OTAA join |
| NB-IoT (LwM2M) | Endpoint name | String — often EUI or IMEI | urn:imei:351234567890123 | Leshan, LwM2M bridge |
| HES canonical | device_eui |
16 hex chars, lowercase | deadbeef00000001 | HES DB, MQTT topics, API |
| DLMS concentrator | device_eui → logical_address |
EUI mapped to WPORT (uint16) | deadbeef00000001 → 2001 | DLMS TCP, utility HES |
| MDM / Billing | device_eui |
16 hex chars, lowercase | deadbeef00000001 | Intervals, VEE flags, billing |
| MQTT topics | Topic segment | hes/reading/{tenant_id}/{device_eui} |
hes/reading/0000…/deadbeef… | All services via Mosquitto |