2026-08-10
Campus Aware AI — IoT pipeline from ESP32 to InfluxDB
Capstone IoT platform—ESP32 sensors over MQTT into a concurrent Go ingestion service and InfluxDB, with Docker Compose and GitHub Actions holding the stack together for a Next.js + Ollama front end.
Problem
Campus environmental data is only useful if it survives the hop from cheap wireless sensors to something you can query. Our capstone needed a full path: physical nodes on campus → reliable telemetry → time-series storage → a Next.js UI and a natural-language agent (Ollama) on top. Gaps anywhere in that chain—firmware drops, broker backpressure, brittle local setup—would kill the demo and the learning.
Constraints
- Multidisciplinary team (Error 404): I owned infrastructure and the data pipeline, not the frontend or the LLM agent.
- Hardware was real: Adafruit Feather ESP32 nodes with limited RAM/radio budget, not simulated-only sensors.
- Stack had to run as a composeable local system so five people could develop without snowflake machines.
- Bridge physical devices, an MQTT broker, InfluxDB, and a local LLM—pragmatic systems choices over perfect theory.
What I built
Firmware (C++) — Telemetry firmware for the Feather ESP32 nodes so environmental readings left the device reliably enough to trust as a pipeline input, not a lab one-off.
Go ingestion service — Concurrent MQTT consumer that parsed sensor payloads and wrote them into InfluxDB, chosen for Go’s concurrency model and how fast we could iterate on the broker → store path.
End-to-end pipeline — Owned the path device → MQTT → backend → time-series storage, so firmware, broker behaviour, and ingestion stayed one coherent concern instead of three disconnected tickets.
Docker Compose — Standardised how the microservices stack came up locally, cutting environment-configuration thrash for the rest of the team.
GitHub Actions — CI workflows for automated testing so merges didn’t depend on “works on my machine” alone.
Teammates shipped the rest of the product: Next.js UI (Alysie Luong, Aastha Acharya), Ollama conversational agent over the time-series data (Mahmoud Assaad), and security review/docs (Jody Bernal, with Aastha on security fixes). My job was making sure the physical world actually arrived in the database those layers sat on.
Result
We delivered an end-to-end campus IoT platform: live ESP32 sensors, a concurrent Go/MQTT/InfluxDB spine, Compose + Actions for repeatable delivery, and a web + local-LLM surface on top. The hard lesson wasn’t any single library—it was the systems tradeoffs when hardware limits, real-time messaging, and local AI all have to share one architecture.