Domo
Table of Contents
Project Genesis #
In my opinion, the biggest flaws of IoT (Internet of Things) today are:
Fragmentation: Each vendor on the market tends to create its own locked ecosystem. Because staying locked into a single ecosystem is too expensive and too limiting, most people have to juggle multiple mobile applications to control their devices and cannot create complex scenarios involving devices from different vendors.
Cloud dependency: Most devices/services rely on backend services to work which brings privacy concerns and decreases responsiveness. In the worst-case scenario, everything can stop working overnight in case online services are discontinued. Recent example: Insteon.
To solve these problems, I started looking at open-source local home automation solutions.
Devices and services overview #
In terms of devices and services my goal was to control products from various vendors: Philips Hue light bulbs, Spotify streaming music service, LG TV, Sonos speakers, Netatmo weather station, IKEA smart plugs, Xiaomi Aqara sensors, … But also custom-made connected devices built with ESP32 microcontrollers.

For example, with the assistance of ESPHome, this ESP32 allows me to drive an addressable LED Strip.
Infrastructure #
Local solution means local server.
To start I chose to use a simple Raspberry Pi 3 (Since replaced by a Raspberry Pi 4) because it’s cheap, energy efficient and powerful enough to run most solutions.

In addition to its default capabilities, this Raspberry Pi is able to communicate with Zigbee devices like Xiaomi Aqara sensors thanks to a Phoscon ConBee 2 Zigbee USB gateway.
Because a Wi-Fi Access point is nearby this Raspberry Pi, I had to plug the dongle into the end of a 2-meter USB extension cable. In fact, since Zigbee operates in the 2.4 GHz frequency range, like Wi-Fi, I experienced a lot of instability because of interferences.
EDIT (2025-01-04): With the benefit of hindsight, the main weakness of this setup is the micro-SD card which has a limited number of read/write cycles.
Its lifetime can be extended by disabling swap and logs among others but after a misadventure, I replaced it by a USB-connected SSD. Fortunately, no data loss thanks to a good backup strategy! ✨
Software stack #
After having compared different home automation platforms (Jeedom, OpenHAB, Domoticz…), I opted for Home Assistant.
Home Assistant is an open-source home automation software that puts local control and privacy first. It’s probably the most complete platform thanks to its very active community that develops and supports integrations with over a thousand devices and services.
The icing on the cake: Most of its configuration can be done through YAML files which allows to push everything in a git repository 😍.
It of course allows to create a fully customized dashboard:

That’s nice to have, but in my opinion, the most important thing in home automation is automations so your living space automatically reacts to your actions/time of day/etc without requiring anything manual.
Here are some of mine:
- Living room lights turn on progressively one hour before nightfall.
- Entrance light turns on for 45 seconds when the entrance door is opened.
- Based on motion, the toilet light is turned on at 100% brightness during the day / 25% at night.
- An animation is played on a LED strip in case the air quality is poor in the apartment.
- Sonos speakers night mode is enabled at midnight / disabled in the morning.
- A notification is sent to people that are at home when the washing machine is done so we don’t forget to hang up the laundry.
- A Zigbee button allows to ring our phones to find them at home.
- Alerts are sent and all lights turn red if water or smoke is detected.
- …
Other examples of advanced ways in which I used Home Assistant are detailed below:
- A custom alarm system
- A LED matrix that displays useful information in the living room.
Custom alarm system #
My custom alarm system is based on:
- Zigbee door opening and motion sensors,
- A camera plugged into a smart plug,
- Connected lights and speakers,
- A Zigbee smoke detector (capable of emitting a loud sound on demand),
- A homemade alarm panel to activate/deactivate the alarm in an authenticated way.
The software part relies on Manual Alarm control panel integration that comes with a pre-established state machine:

Then, multiple custom-made automations make the devices react to the changes:
- Disarmed → Arming: States and attributes of all lights are saved, …
- Arming → Armed: Lights are turned off, “Alarm activated” notification is sent, Camera is turned on, …
- Pending → Disarmed: “Welcome” message is played on Sonos speakers, lights state and attributes are restored, …
- Pending → Triggered: Smoke sensor alarm rings, all lights blink in red, …
Alarm can be armed or disarmed using the alarm panel. It can also be armed remotely via an actionable notification sent in case everybody left home without arming it:

Ulanzi TC001 LED Matrix #

The Ulanzi TC001 LED matrix is a 256-pixel display that embeds an ESP32 microcontroller. Its default firmware can easily be replaced with Awtrix 3, a custom firmware that provides lots of features via a MQTT (or HTTP) API.
I chose to use MQTT because it provides more features like broadcasting data about button presses. A prerequisite was to setup Mosquitto, an open-source MQTT Broker.
Once done, I was able to write scripts on Home Assistant that send MQTT messages to this broker to create / delete information on the LED matrix. These scripts are then used in various automations to display:
- Today’s birthdays
- The hour of the day in which it will rain today (if it rains)
- A reminder to water the plants if necessary
- A progress bar if washing machine is running
- A reminder to hang up the laundry when the washing machine has finished
- …
All this information is then automatically removed based on various sensors:
- Birthday reminders → The following day.
- Reminder to water the plants → When the plant sensor detects a spike in humidity.
- Reminder to hang up the laundry → When the washing machine door is opened.
- …
We haven’t missed a birthday since :-)
Conclusion #
Today, this setup manages ~100 devices and over 80 automations, running 24/7 with minimal manual intervention.

It started as a personal experiment but quickly became a long-running system used daily that we can’t live without.
Along the way, I ended up dealing with many of the same topics I face in professional environments: reliability, automation, backups, hardware limitations, and iterative improvements. The main difference is that here, when something breaks, my partner and I are the ones who get annoyed first 😄
It’s still evolving over time, there’s always another sensor to add, another automation to tweak… but it already achieved its initial goal: a local, reliable, and vendor-agnostic home automation setup that doesn’t depend on the cloud.