Work
UniversityUniversity · IoT

Oxaira

AirQ, an air quality monitoring system: an ESP32 device, Spring Boot services, messaging and web and mobile apps.

View live site

Screenshot of Oxaira
SYSTEM.md

The problem

Sensor data must reach an understandable interface and trigger alerts without coupling capture, analysis and notification.

What I built

An ESP32 with DHT11 and MQ135 sensors sends readings over HTTP. Separate Spring Boot services cover analytics and alerts, notifications and SMS through Twilio, with Angular and Flutter apps.

Outcome

A system of independent services, from the board to the phone. Documented from the team’s repositories.

Decisions that mattered

  1. 01

    One service, one responsibility

    Analytics, notifications and SMS are separate services, each with its own database.

  2. 02

    An air quality domain

    The analytics service models readings, alerts and insights as aggregates, with separate commands and queries.

  3. 03

    Messaging to decouple

    RabbitMQ carries alerts to notifications, and Kafka was explored for the event stream.

Technologies

  • Spring Boot
  • RabbitMQ
  • Kafka
  • MySQL
  • Angular
  • Flutter
  • ESP32

C4 model. The pulsing line is the main path of a request.

Level 1 · who uses the system and what it connects to

HTTPS1HTTP · JSON2HTTPS3ResidentChecks the air in theirareaAirQ device[ESP32 · C++ · DHT11 + MQ135]Measures temperature,humidity and CO₂AirQAir quality monitoringTwilio[Twilio]Sends alert SMS

Level 2 · the applications and data stores it is made of

HTTPSAppRESTRESTJDBCHTTP · JSON1JDBCAMQP · alerts2AMQP3HTTP4eventsResidentChecks the air in theirareaWeb app[Angular 19]Dashboard and reportsAirQ backend[Spring Boot · Java 17]IAM, users andnotificationsDatabase[PostgreSQL]Users and notificationsMobile app[Flutter]Alerts on the phoneAirQ device[ESP32 · C++ · DHT11 + MQ135]Measures temperature,humidity and CO₂Data analytics[Spring Boot · Data Analytics]Readings, alerts andinsightsDatabase[MySQL]Readings and alertsSMS service[Spring Boot · Twilio]Sends messages with TwilioNotifications[Spring Boot · AMQP]Consumes the alertsRabbitMQ[RabbitMQ]Alert eventsApache Kafka[Apache Kafka]Streaming trial

Level 3 · the components inside the API

calls1rulesport2JDBC3portAMQPREST controllers[REST controllers]Readings and alertsCommand and queryservices[Command and query services]Light CQRSAggregates[Aggregates]IotData, Alert andAnalyticsInsightJPA repositories[JPA · Hibernate]Persist to MySQLDatabase[MySQL]Readings and alertsAlert publisher[Alert publisher]Sends to the queueRabbitMQ[RabbitMQ]Alert events
  • Person
  • System
  • Container
  • Database
  • External
  • Main path
  1. 01ESP32 sensor
  2. 02Analytics
  3. 03RabbitMQ
  4. 04Notifications
  5. 05SMS
  6. 06App

CV

Get my CV

Leave your email and I will send the CV there. First I check the address is yours with a code.