Project · build
Aquila
Presence, occupancy and vital signs for Home Assistant, sensed from WiFi by ESP32-S3 nodes.
- Kind
- build
- Tags
- sensing, home-assistant, rust, esp32
Aquila senses people from the way they disturb WiFi. ESP32-S3 nodes around the house capture channel state information from the packets they hear and stream it to a core on the Home Assistant machine, which turns it into presence, occupancy, person count and vital-sign entities. There is no camera and nothing to wear.
Parts
- Node firmware, in C on ESP-IDF. It captures CSI in promiscuous mode and sends one frame per UDP datagram. After the first flash it updates over the LAN.
- Aquila Core, in Rust, packaged as a Home Assistant add-on for amd64 and aarch64. It receives the frames, aligns the nodes’ clocks, runs the signal processing and serves a dashboard.
- A custom component, in Python, installed through HACS, which exposes the entities.
The three are versioned separately.
Design
The core is eleven crates in six layers, with one stateful crate at the centre. The layering is checked in CI against a declared graph. There is no plugin loading, service discovery or message broker. Unsafe code is forbidden across the workspace and the toolchain is pinned, because the measurements have to be reproducible bit for bit.
Nodes send raw samples and the core does the arithmetic; how that was arrived at is in ESP32 CSI stores the imaginary part first. CSI travels as plain UDP with no acknowledgement, so loss shows up as gaps in the sequence numbers. Commands from the core to a node are authenticated with an HMAC keyed at pairing. The CSI stream itself is not authenticated in this version.
Space is modelled as zones and nothing else.
Some paths were ruled out. ESP-NOW does not route across a multi-floor LAN and ties the design to one vendor. MQTT would add a third process. Power over Ethernet cost too much per node. The ESP32-C5’s 5 GHz band penetrates walls worse than 2.4 GHz.
State
The latest release is v0.1.6, an alpha, from 16 October 2026. The core, the simulator and the replay path run and are tested. The firmware compiles but has not yet been flashed to a board, streamed real CSI or performed an update on hardware; boards were in transit when the bring-up plan was written.
The accuracy targets are recorded as targets that have not been met, using the grading scheme the project keeps for its own claims.