Synthèse, home

Work

Maison

The whole home driven locally, in Rust: Hue over Zigbee on a Raspberry Pi 1, an old AC's IRDA, Meross plugs on their native protocol, and Tempo colors predicted days ahead, straight to the rabbit's ears and belly. The homie Twitch bot even hands viewers superpowers.

Rusthome automation

Role
Design, development, protocol work, self-hosting.
Period
Since 2025
Stack
Rust (axum), Zigbee (EZSP), Broadlink infrared, Matter, SvelteKit, Cloudflare Tunnel
Links
Maison's dashboard on desktop, shown with a fictional house: a row of status chips, then scenes, Tempo (a white day, peak price until 10 PM), lamps and their sliders, the cat's feeder, fountain and litter box, the Mitsubishi air conditioner, the living room shutter, plugs with live wattage, the rabbit and the TV.

The brief

In September 2025, I wrote a small TypeScript API for my cat’s Tuya food dispenser. I added the fountain, the litter box, the Hue bulbs, EDF Tempo and the Meross plugs.

In March 2026, I rewrote everything in Rust, with each device controlled on the local network. The target is a 2012 Raspberry Pi 1 Model B: one ARMv6 core at 700 MHz and 512 MB of memory. Home Assistant, by comparison, requires a Pi 4 or 5 and 2 GB.

In use

The dashboard brings together all the devices: scenes, the cat’s equipment, air conditioning, television. The shutters follow sunrise and sunset times, and a button suspends the evening closing.

The TV set-top box remote controls the whole house. The box, running modified firmware, sends each key press to Maison, which maps each key to a device, an app or a scene.

The Tempo page shows today’s color, tomorrow’s, the days left in the season and a seven-day forecast. Maison also sends these colors to the Clapier rabbit. During streams, Homie, a Twitch bot, lets viewers switch on a lamp, change its color or serve the cat a portion.

Architecture

A single binary controls all the devices and serves the web app, published through a Cloudflare tunnel: passkeys require a domain and HTTPS.

Each device family has its protocol and its driver. A single task manages the Zigbee serial port, under a watchdog; each Tuya device keeps a supervised TCP session; the Meross plugs receive signed JSON over HTTP.

Infrared controls the devices that have only a remote. Each frame of the Mitsubishi heat pump contains the unit’s time, which Maison recomputes at each send. The TV’s JointSPACE API hangs on an unknown route: all calls go through a single queue, spaced by a minimum interval.

Tempo, a week ahead

To forecast the color, I took up the method published by RTE. Applied to measured consumption from 2014 to 2026, it recovers the official color on 96% of days. Maison feeds it ECMWF weather forecasts and runs it 400 times; the share of each color gives its probability.

Over two replayed seasons, the forecast is right 95.5% of the time one day ahead and 89.9% seven days ahead, compared with 81.8% by always forecasting blue. The model is recalibrated once a year on a Mac; on the Pi, a forecast takes a few milliseconds.

Decisions

The local network first. Each device is controlled on the local network; the tunnel exposes only the web app.

A measured footprint. The binary weighs about 20 MB and occupies about 18 MB of memory; the whole Pi uses 67 MB out of 427.

Wait for the exact time. The Pi boots with the time saved at shutdown, which NTP then corrects, sometimes by several weeks. Such a correction once triggered all the missed sunrise actions at once. Maison now waits for synchronization before issuing a Matter certificate or moving a shutter, and catches up five minutes at most.

Test against the real backend. Rust unit and integration tests for the drivers, Vitest for the components, Playwright and axe against the real backend.

Today

Maison runs the house every day from the Raspberry Pi 1, next to Clapier. The code is public under the MIT license (synthe-se/maison), and Homie at uplg/homie.

A project in mind? Let's talk