Most IoT platforms are built for one vendor's hardware. EazyIoT is
built for whatever arrives next. Everything reaches the platform
over MQTT — but what's inside the payload never agrees: one
controller sends clean JSON telemetry, another emits binary frames
that have to be decoded byte by byte, a third sits behind a
gateway relaying register blocks from a panel that has never heard
of the internet. Same platform, same dashboards, no rewrite.
Every reading a device sends crosses five layers before it becomes a
number someone acts on. Each one is where a different class of bug
lives.
Ingest
MQTT
One transport for every device. Topic structure carries identity
and direction, so routing a new device family costs nothing at
the edge.
Parse
Per-device-type
Paired in/out parsers per device type, resolved at runtime. JSON
payloads, binary frames and relayed register blocks go in — one
flat, normalized shape comes out.
Store
Mongo · Influx
Device state and config in MongoDB, high-frequency telemetry in
InfluxDB — separated so neither query pattern starves the other.
Derive
Rule engine
Scheduled cloud functions turning raw current and voltage into
runtime, uptime, faults and outage windows.
Surface
Angular
Drag-and-drop dashboards, per-tenant layouts, charts that stay
responsive with thousands of points on screen.
Protocol translation
One transport, four dialects
Adding a device family shouldn't mean touching the core. Each
device type ships a key map and a parser pair, so a structured
telemetry payload, a binary frame and a gateway-relayed register
block all land in the same normalized document.
The hard half is the write path: turning a schedule a user drew
in a browser into the exact byte layout a controller expects,
then reconciling the acknowledgement that comes back. Config is
a conversation, not a POST.
Derived metrics
Devices report current — people ask about uptime
No device sends "this fixture was on 91% of last night." That
gets inferred: measured current against rated wattage tells you
how many lamps in a fixture are alive; relay state tells you
which hours even counted as operational.
Most of the difficulty is time. Cron jobs run in UTC containers
on IST infrastructure, outage windows cross midnight, and a day
boundary computed in the wrong zone silently shifts every report
by five and a half hours. The rules are resumable and day-wise
by design so a restart never double-counts.
Reliability
The bug that only appears under load
A handler that opened a fresh database client per incoming
message worked perfectly in testing and exhausted the server's
file descriptors in production. The fix was small — one pooled
client, a raised container limit — but finding it meant reading
the failure from the OS down, not the app up.
Deployments got the same treatment: scripted pull, build swap
and service recreate, so shipping is boring on purpose.