This page is not fully translated, yet. Please help completing the translation.
(remove this paragraph once the translation is finished)
This page is not fully translated, yet. Please help completing the translation.
(remove this paragraph once the translation is finished)
This is an old revision of the document!
This page is not fully translated, yet. Please help completing the translation.
(remove this paragraph once the translation is finished)
As William would say : “Why not ?”
The spot installed on the front of the garages is kept turned on because the movement sensor is more or less broken. I tried to adjust the small potentimeters but it still malfunction.
As the spot itself is still working I'd rather reuse it. But I never found the sensor as spare parts so it's a perfect excuse to try to DIY something and learn now things. Moreover I'll have to make it weatherproof and that's a fun challenge.
Last but no least, I'll be able to add new functions and make all of that talk with my home automation server!
The bare minimum functions would be :
Cool functions easy to add :
If it's really too easy I could also try to add :
But I'll have to think on how to have the sensors and actuators far away from the core of the system.
At first I wanted to buy ready to use zigbee modules. But most of them are running on batteries and I'll probably forget to change them in time. I could make some changes on the devices to add photovoltaic panels but it's hard to keep everything weatherproof.
So I searched other solutions. The simplest one I've found would be a ESPHome based system.
It runs on ESP32, ESP8366 and even RP2040 (with some restrictions on the model) and I can use available breakout boards for compatible sensors and actuators.
Connection to the server would be done over wifi (I'll have to check if house wifi also cover the garage).
What's cool is that the microcontroller can do standalone automation. The connection to home assistant would only serve to get sensor readings, change settings, modify automation or be used as remote for lights.
Another solution would be to use zigbee ready ESP32 like ESP32-C6 (high performances) or ESP32-H2 (low power consumption). It would be a bit more complex but it has the benefit of using the meshed network already deployed in our house. And if done right, it would be able to be used the same as any standard module.
Moreover those ESP32 are also Matter compatible. So it would be possible to flash a new firmware matter compatible.
I used ESPHome's listing to choose the modules. It's mainly based on capabilities described and prices of the modules.
This is a ESP32 Wifi/BLE devboard (it should be compatible with ESPHome).
This is the core of the small home automation installation. Sensors and actuators will be connected with various data bus (I²C, UART, SPI) or on GPIO.
Those boards can often be powered with a large array of voltages. I'll probably use a 12V DC power brick.
Some version of those ESP32 come with an ipex connector instead of the PCB antenna. Allowing us to move the antenna away from the ESP and to use a more efficient external antenna to get better radio signal. I'd rather use that one for the garage since they're quite far away from main house and moreover there are a few walls in the way.
These LTR390 can not only measure light intensity but also measure UV intensity. UV aren't useful for my project, but it's a nice addon for weather informations. This sensor will allow to check if ambient light is low enough for the spot to be turned on or not.
It talk to the MCU using I²C bus.
The LD2420 doesn't detect movements (like FIR) but it uses millimeter wave radar to detect presence of things that aren't usually there. It allows to fine tune various parameters to detect only what you really want to detect. Those parameters are accessible with ESPHome so I'm going to have loads of fun playing with them.
As it's not a movement detector even if people stay still their presence is detected. So timer is less useful than with movement detector. It integrates some off delay to prevent tuning off then back on if people are on the outer fringe of the area covered by the detector.
It's connected using UART.
A BME280 will allow to collect weather informations. It's not useful for my project. But the sensor is cheap and it's fun to add more informations to use on my Home Assistant server.
It speaks I²C.
I need at least a relay that can be actuated by 3.3V and can pilot the 230V needed to power my light(s). There are loads of those available on the various webshop. Most of them isolate the 3.3V from the 230V using optocoupler. That way electronic is protected if 230V circuit malfunction in a way or another.
GPIO is the only language it talks.
J'ai acheté “un peu” de matériel pour réaliser plusieurs montages en parallèle et pouvoir les tester sans devoir démonter un pour faire l'autre.
Ça devrait me permettre de réaliser quelques essais sans trop me prendre le choux.
Autant débuter par un truc simple sans faire non plus dans le simpliste (j'ai pas envie de juste lire/écrire des GPIO), donc récupérer les données d'un capteur de t° et les remonter au central domotique. Si j'arrive déjà à faire ça, ça veut dire que le esp32 parle via I²C au capteur et transmet les valeurs via wifi au serveur domotique. Le tout sera alimenté directement par un chargeur USB, histoire de pas trop se casser les bonbons.
Le plus complexe pour moi, c'est faire le programme. N'ayant jamais utilisé ESPHome, faut le temps d'apprendre quoi mettre dans le code pour obtenir le fonctionnement désiré et comment pousser ce code dans l'ESP32.
Dans un premier temps, je suis passé par l'interface graphique du plugin ESPHome Device Builder de Home Assistant et un pc avec chromium. Ce qui a permis d'assez facilement pousser un premier programme plus ou moins vide dans un ESP32-WROOM-32U surnommé “test001”.
Mais dès que le code s'est étoffé, le raspi s'est retrouvé à bout de souffle pendant la compilation.
Pour soulager ce pauvre raspi il a fallu installer les outils CLI ESPHome sur un “vrai” ordi. Ça prends tout de suite vraiment beaucoup moins de temps pour compiler et je peux pousser le firmware directement par usb dans le core sans passer par un navigateur web.
esphome: name: test001 friendly_name: test001 esp32: board: esp32dev framework: type: arduino # Enable logging logger: # Enable Home Assistant API api: encryption: key: !secret ota_key ota: - platform: esphome password: !secret ota_password wifi: ssid: !secret wifi_ssid password: !secret wifi_password # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Test001 Fallback Hotspot" password: !secret fallback_wifi_password captive_portal: time: - platform: homeassistant id: homeassistant_time
Ici on a tout le setup de base du module ESPHome, j'y ai ajouté une sync avec l'horloge du serveur. Ça coute rien et ça peut m'éviter des surprises si je prévois des automatismes interne à l'esp basés sur l'heure.
i2c: sda: GPIO21 scl: GPIO22 scan: true id: bus_a
On initialise le bus I²C sur les pins 21 pour SDL et 22 pour SDA et on le désigne par l'identifiant bus_a. Rien de bien folichon.
sensor: - platform: bme280_i2c address: 0x76 temperature: name: "BME280 Temperature" pressure: name: "BME280 Pressure" humidity: name: "BME280 Humidity"
On définit d'abord le type de capteur, ici un BME280.
Ensuite, petite subtilité, mon capteur n'était pas détecté par l'ESP. J'ai poussé un sketch sniffeur d'adresse I²C sur un arduino. Il m'a signalé qu'un truc répondait à l'adresse 0x76 après avoir câblé le capteur dessus. Évidemment, l'adresse par défaut pour ces capteurs dans ESPHome est 0x77, ça ne risquait pas de fonctionner. Après avoir spécifié l'adresse, on obtient bien les remontées de valeurs du capteurs.
Puis les différentes valeurs à remonter au serveur et le nom sous lequel les afficher. J'ai laissé les noms par défauts donnés sur le site ESPHome parce que c'est avant tout un proto, il n'est pas destiné à être utilisé tel quel.
C'est très simple de câbler un capteur I²C sur le core, seuls 4 fils suffisent :
Dans un premier temps je n'avais que ça :
Après avoir corrigé l'adresse dans le firmware :
C'est officiellement un grand succès!
Il va être nécessaire d'étalonner les capteurs lorsque le module complet sera installé à sa place définitive. Parce que si la pression semble correcte (par rapport à mes autres capteurs et météo France), la température et l'humidité paraissent douteuses. Le capteur zigbee du commerce et un petit thermomètre hygromètre de table dans la même pièce donnent des relevés très similaires entre-eux, mais ces relevés sont différents de ceux de test001 (genre 10% d'humidité en plus et 1 ou 2 degrés en moins).
Ajouter le capteur lumière et UV est vraiment trivial. Le bus I²C est déjà initialisé, il y a juste à brancher les quatre pins du capteurs sur les mêmes pins du core que le BME280. Et niveau code, c'est pas plus compliqué que pour le BME on rajoute ça dans la section “sensor” :
- platform: ltr390 uv_index: name: "UV Index" uv: name: "UV Sensor Counts" light: name: "Light" ambient_light: name: "Light Sensor Counts"
Et ça fonctionne directement.
Le radar à ondes millimétriques est assez simple à raccorder physiquement, encore une fois 4 fils suffisent :
Si on rajoute un cinquième fil, on peut avoir le retour sur GPIO de la présence détectée ou non et éventuellement pouvoir utiliser des modes plus économes en énergie sur l'ESP avec le GPIO qui vient le réveiller. Dans mon cas, pas très utile, le montage ne tournant pas sur batterie.
Il faut d'abord configurer le bus UART qu'on va exploiter.
uart: tx_pin: GPIO01 rx_pin: GPIO03 baud_rate: 115200
Ensuite, le code pour le module n'est pas extrêmement complexe (c'est principalement attribuer à des variables d'entrés ou de sorties des noms), mais il expose plus d'interfaces que nos autres capteurs, principalement pour configurer le radar et récupérer les données du radar.
ld2420: text_sensor: - platform: ld2420 fw_version: name: LD2420 Firmware sensor: - platform: ld2420 moving_distance: name : Moving Distance binary_sensor: - platform: ld2420 has_target: name: Presence select: - platform: ld2420 operating_mode: name: Operating Mode number: - platform: ld2420 presence_timeout: name: Detection Presence Timeout min_gate_distance: name: Detection Gate Minimum max_gate_distance: name: Detection Gate Maximum gate_select: name: Select Gate to Set still_threshold: name: Set Still Threshold Value move_threshold: name: Set Move Threshold Value gate_move_sensitivity: name: Move Calibration Sensitivity Factor gate_still_sensitivity: name: Still Calibration Sensitivity Factor
Ouais, pour tester et comparer le rapport emmerdement/bénéfices. J'aimerais aussi beaucoup pouvoir comparer la couverture réseau entre les deux. Surtout que sous peu, quelques modules zigbee supplémentaires devraient être installés dans la maison.