All paths assume you end up with decoded JSON from the MOIZ reference codec. Run it on the LNS when codecs are hosted there; otherwise decode FPort 1 bytes in your ingestion worker. Prefer that reference decoder; avoid a second incompatible implementation.
Transports
- MQTT — LNS topic → worker (e.g. ChirpStack
application/+/device/+/event/up) - HTTP webhook — LNS POST → your API
- Payload may arrive as already-decoded JSON (LNS codec) or as raw bytes / hex (decode in the worker)
- Runnable examples live under
integration_doc/examples/(Python / Node MQTT and HTTP)
Typical targets
- Timescale / Postgres + Grafana
- Historians (PI, Aveva, …) via MQTT or OPC-UA
- SCADA (Ignition, WinCC, …)
- Cloud IoT hubs · Node-RED for prototyping
Idempotency and timestamps
- Deduplicate on
(deveui, f_cnt)or message UUID when your LNS provides one. - Store server receive time and/or LNS
time(or gateway time when provided) — pick what fits your stack; keep extras as metadata. The device has no absolute clock in the uplink. - Expect irregular intervals (configurable measurement period).
Recommended dashboard views
| View | Metrics |
|---|---|
| Fleet health | Last seen, storageVoltage, boardTemperature, RSSI/SNR |
| Process | Port keys per device config |
| Alarms | status = 2, alarm source flags, event log |
| Energy proxy | thermogenVoltage, baseTemperature gradient indicator |
Practice
Store raw + normalized. Business alarms belong in your app — device Alarm mode is threshold telemetry, not a complete alarm management system.