A cellular GPS and OBD-II tracker for my car, built end to end: custom firmware on an ESP32-S3 with a SIM7080G modem, a REST API, a time-series database and a live map.
- ESP32-S3 + SIM7080GGNSS, OBD-II, LTE-M
- REST APIYii2, bearer auth
- TimescaleDBhypertables, PL/pgSQL
- Live mapLeaflet, SSE
- Firmware built for the real world
- A state machine with adaptive sampling (every 10 s when moving, every 2 min when parked), a flash-backed queue that survives power loss, exponential backoff with jitter, deep sleep and over-the-air updates.
- Trips detected inside the database
- PL/pgSQL functions run as a TimescaleDB background job, inferring ignition from gaps in the telemetry and filtering out GPS drift. Hypertables and continuous aggregates keep the queries fast.
- Live map and history
- A Leaflet map streamed over Server-Sent Events, track playback, OBD-II charts, an operating log, CSV export and offline import from SD card.
- Shipped like a product
- A Docker Compose stack, GitHub Actions deployments on version tags, and around 34 automated tests.
Built with: C++ (Arduino), ESP32-S3, SIM7080G LTE-M, PHP 8 (Yii2), PostgreSQL, TimescaleDB, Leaflet, Docker, GitHub Actions
AirFlow Manager
2025, self-hosted
Self-hosted monitoring and alerting for AUX air conditioners, which otherwise only talk to a closed cloud app.
- AUX cloud APIAES, reverse-engineered
- CollectorPHP, cron
- TimescaleDBhypertable
- Dashboard and alertsYii2, e-mail
- Ported a reverse-engineered client
- Re-implemented the community Python client for the AUX cloud in PHP: AES-encrypted login flow, region-aware endpoints, multiple accounts and units.
- Time-series collection
- A cron-driven collector snapshots around 22 parameters per unit into a TimescaleDB hypertable.
- Rule-based alerts
- E-mail notifications for power transitions, temperature thresholds, lost connections and a cooling-efficiency check, throttled per unit and alert type.
Protocol knowledge comes from the open-source project maeek/ha-aux-cloud
Built with: PHP 8.3 (Yii2), PostgreSQL 17, TimescaleDB, Chart.js, Docker Compose
Tesla Wall Connector to Grafana
Home energy monitoring
Charging data from a Tesla Wall Connector, collected through the charger’s API and turned into Grafana dashboards.
- Wall Connectorcharger API
- Collectorpolling service
- TimescaleDBPostgreSQL
- Grafanadashboards
- Collector service
- Polls the Wall Connector API and stores every reading as time-series data in PostgreSQL with TimescaleDB.
- Grafana on plain SQL
- Dashboards query the database directly: charging sessions, power and energy over time.
Built with: PostgreSQL, TimescaleDB, Grafana