IoT / Environmental monitoring / Machine learning
AirThessaly — Air Quality Monitoring & Forecasting
A live regional air-quality platform that brings reference stations and low-cost sensors together on one public map, with European AQI scoring, alerting and machine-learning forecasts of pollution levels.
- Role
- System design / Full-stack, IoT & ML engineering
- Status
- In production / Ongoing
AirThessaly is a live air-quality platform for the region of Thessaly. It combines the Region's reference monitoring stations, a third-party station network, our own low-cost sensor fleet and older spreadsheet-based loggers. All of them appear on one public, bilingual map, scored with the European Air Quality Index, covering Volos, Larisa, Trikala, Karditsa and several smaller towns.
The main engineering problem is that every source is different. Data arrives through a REST API, an authenticated web page, our own sensor backend and Google Sheets, each with its own timestamps, units and ways of failing. A single ingestion service puts everything on a common five-minute grid, checks readings, fills gaps and calibrates low-cost sensors against a reference instrument at the same site before any value is published.
We also built the sensors. They are Arduino-based devices with two particulate sensors, averaging on the device, an SD-card buffer for when the network drops and a watchdog that restarts them when left alone in the field. A device service behind them applies versioned calibration coefficients to each sensor.
On top of the data sits a forecasting layer. Separate models for each station, pollutant and time horizon predict which air-quality band will be reached 8, 12 and 16 hours ahead, using neighbouring stations as spatial context. Training and live predictions use the same feature pipeline, and every forecast is later checked against what actually happened.
Around this run the operational parts a public monitoring service needs: alerts for threshold breaches and sensor faults, daily reports, an admin panel with a full change history and role-based access, and Grafana monitoring across the containerized deployment.
Alert reasons
- Threshold exceedance
- Sensor error or out-of-range value
- Stuck sensor
- Missing component
- Limit-value exceedance count
Topics
- Python
- Node.js
- React
- TypeScript
- Leaflet
- SQLite
- Machine Learning
- Time-Series Forecasting
- IoT / Arduino
- Docker
- Grafana
Illustrative pipeline — not live readings or real forecast results.