Building a LoRaWAN Meter Management Dashboard.
The IoT management problem
Our client manages 12,000+ water meters across a metropolitan area. Each meter transmits consumption data over LoRaWAN to a network server, which forwards it to our application. Sounds simple — until you deal with the messy reality of IoT at scale.
The existing system was a spreadsheet. Literally — a shared Excel file tracking meter locations, installation dates, and customer assignments. When a meter stopped transmitting, nobody knew until the next quarterly reading.
The dashboard architecture
We built the management dashboard as a Laravel application with a Vue.js frontend, connected to the LoRaWAN network server via MQTT:
- Real-time data ingestion — MQTT subscriber processes uplink messages, decodes payloads, and stores readings
- Device registry — every meter tracked with location, installation date, firmware version, last transmission time
- Alert system — automated alerts for silent devices (no transmission in 24h), abnormal readings, and battery warnings
- Bulk operations — CSV import for provisioning, QR code scanning for field installation, batch firmware updates
The encoding nightmare
The hardest part of the project wasn’t the dashboard — it was decoding meter payloads. LoRaWAN devices send binary-encoded data to minimize airtime. Each meter manufacturer uses a different encoding format, and the documentation ranges from “adequate” to “a single PDF in broken English.”
We built a decoder registry — a pluggable system where each meter type has a decoder class that translates raw bytes into structured data. When a new meter model is deployed, we add a decoder without touching the rest of the application. Our CI/CD pipeline handles deployment of new decoders automatically.
QR code field provisioning
Installing 12,000 meters means field technicians need a fast, error-free provisioning process. We built a mobile-friendly flow:
- Technician scans the meter’s QR code (contains DevEUI and serial number)
- App looks up the device in the registry and shows its configuration
- Technician confirms location via GPS and takes an installation photo
- Device is activated on the network server and starts transmitting within minutes
This reduced provisioning from 15 minutes per meter (manual data entry) to under 2 minutes.
CSV import challenges
The initial data migration involved importing 12,000 devices from various CSV files — each with different column orders, date formats, and character encodings. Windows-1252 vs UTF-8 encoding caused the most headaches; meter serial numbers with special characters silently corrupted during import.
Our fix: We built a preview step that shows the first 10 rows parsed, lets the user map columns, and highlights encoding issues before committing the import. It catches 99% of data quality issues before they enter the system.
Need help with your project?
We'll review your architecture and recommend the right path forward.
Book a Strategy Call →