IoT environmental monitoring using BME280/CCS811 sensors on Raspberry Pi 4 with local Prometheus and Grafana Cloud integration.
# Configure environment
cp .env.example .env
# Edit .env with your Grafana Cloud credentials
# Deploy
docker-compose up -d- Raspberry Pi 4 with I2C enabled
- SparkFun Environmental Combo Breakout - CCS811/BME280 (Qwiic)
- Optional: pHAT shutdown button
The system uses a two-tier monitoring approach:
- Local Prometheus collects and stores sensor metrics locally
- Grafana Cloud receives metrics via Prometheus remote_write for cloud monitoring
✅ Local data retention • ✅ Network resilience • ✅ Cloud monitoring • ✅ Local access to metrics
Local Prometheus + Grafana Cloud integration:
- Sign up at https://grafana.com (free tier available)
- Get credentials: Cloud Portal > Prometheus > Details
- Add to
.env:GRAFANA_CLOUD_PUSH_URL,GRAFANA_CLOUD_USERNAME,GRAFANA_CLOUD_PASSWORD
✅ Fleet management • ✅ OTA updates • ✅ Remote monitoring
balena login
balena app create home-monitoring --type raspberrypi4-64
balena push home-monitoringSet environment variables in Balena dashboard or via CLI.
Environmental (BME280):
bme280_humidity- Humidity %bme280_pressure- Atmospheric pressurebme280_celsius- Temperature °Cbme280_dewpoint_celsius- Dew point
Air Quality (CCS811):
ccs811_co2- CO2 levels (ppm)ccs811_tvoc- Total VOCs
All metrics include location tag for filtering.
Required Environment Variables:
# Device location tag
DEVICE_DB_LOCATION=home
# Grafana Cloud
GRAFANA_CLOUD_PUSH_URL=https://prometheus-prod-XX.grafana.net/api/prom/push
GRAFANA_CLOUD_USERNAME=your_username
GRAFANA_CLOUD_PASSWORD=your_password- Prometheus UI: http://device-ip:9090 (local metrics, queries, alerts)
- Sensor Metrics: http://device-ip:8000/metrics (raw Prometheus format)
- Grafana Cloud: Remote dashboards and alerting
All commands are run from the project root directory:
# View all logs
docker-compose logs
# View specific service logs
docker-compose logs sensor
docker-compose logs prometheus
# Restart services
docker-compose restart
# Stop all services
docker-compose down┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ BME280/CCS811 │───▶│ Python Scripts │───▶│ Prometheus │───▶│ Grafana Cloud │
│ Sensors │ │ (HTTP metrics) │ │ (local DB) │ │ (remote_write) │
└─────────────────┘ └──────────────────┘ └─────────────────┘ └─────────────────┘
Sensor issues:
- Enable I2C:
sudo raspi-config> Interface > I2C - Check wiring and power
- View logs:
docker-compose logs sensor - Test metrics:
curl http://localhost:8000/metrics
Prometheus issues:
- Check Prometheus UI at http://device-ip:9090
- Verify targets are UP in Status > Targets
- Check remote_write queue in Status > Runtime
Network issues:
- Verify
priv_lannetwork exists - Check internet connectivity for Grafana Cloud
- Ensure Docker daemon is running
Balena deployment:
- Privileged containers enabled for GPIO/I2C access
- Host features: procfs, sysfs for system monitoring
Built with Python 3.12, Docker, and Balena.io platform. Based on influxdb-client-python and SparkFun Qwiic libraries.