← all projects
home automation & IoT

Velum

A self-hosted smart home system on ESP32 — a HomeKit bridge driving relays, lights and sensors straight from the distribution cabinet, with wireless nodes on a custom protocol. No cloud, no subscriptions.

Project

Velum

A self-hosted smart home system on ESP32: a HomeKit bridge in the distribution cabinet drives relays, lights and sensors through I²C expanders, while wireless nodes run on a custom UDP protocol — no cloud, no subscriptions, everything local.

Client / Industry

Home automation & IoT — an in-house product, in daily use in a real house.

Platforms

ESP32-S3, ESP32, ESP32-C3/C6 and ESP8266; Apple HomeKit plus a custom web UI and REST API.

Role

Everything: bridge and node firmware, the VLP protocol, web UI, companion services, deployment.

Problem

A typical smart home today means five apps, three clouds and vendor lock-in — and an older installation of plain relays and wall buttons has practically no way into Apple Home without expensive gateways. When the internet drops or a vendor kills a service, the switch stops working. The goal was the opposite: one device in the distribution cabinet that drives the existing wiring, talks to HomeKit directly and keeps working when the network goes.

Solution

Velum is two firmwares and a couple of companion services. The bridge (ESP32-S3) shows up in Apple Home as a HomeKit bridge: through I²C expanders (PCF8574 + MCP23017 on the same bus) it gets up to 128 pins and builds accessories out of them — lights, covers, locks, fans, garage doors, sensors and an alarm. The node is firmware for wireless modules (RGB strips, sensors, power metering): it has no UI of its own — it pairs to exactly one bridge and is configured, monitored and updated through it, all over VLP, a custom UDP protocol with mDNS discovery.

Isometric view: the bridge in the middle, nodes linked over VLP
The bridge as the hub — nodes pair over VLP (UDP + mDNS)
  • Bridge: dual-core architecture (I/O supervisor on one core, HTTP/HomeKit/VLP on the other), embedded web UI, REST API, security zones, energy metering and OTA — with zero external dependencies.
  • Node: RGB lighting and environmental sensors (temperature, humidity, pressure, air quality, CO, CO₂, particulate matter) plus a 433 MHz weather station; remote OTA goes through the bridge, so a module built in behind a light fixture never gets touched.
  • Companion services in Docker: an Eve history archive (graphs survive reboots) and a firmware server for pull-OTA across the whole fleet — both on the local network.
  • Velum Panel (early stage): a wall-mounted touch panel on ESP32-P4 with an LVGL UI — the macOS simulator and ESP-IDF skeleton are in place, the UI layer is just getting started.
The bridge mounted in the distribution cabinet next to breakers
The bridge lives in the distribution cabinet, on the existing wiring
Close-up of a node module with a coral status LED
A node: sensors and RGB, no UI of its own

Tech stack

C++ (Arduino core, ESP-IDF), ESP32-S3 / ESP32 / ESP32-C3 / ESP32-C6 / ESP8266, HomeSpan, VLP (custom UDP protocol + mDNS), I²C (PCF8574, MCP23017), NVS + PSRAM, LVGL (ESP32-P4), PHP, MariaDB, Docker.

Dashboard with measurement history graphs
Measurement history in the web UI — graphs survive reboots

Results

0 clouds

Pairing, control, measurement history and OTA work without a single external service — the system never calls anything outside the LAN.

2 firmwares

Bridge and node share one protocol; a node pairs, configures and updates through the bridge with no UI of its own.

24/7

In production in a real house: survives router outages and reboots without losing configuration or measurement history.

Need a similar project?