Sommaire
Si vous êtes équipés d'un adoucisseur d'eau dans votre logement alors, vous devez certainement régulièrement ouvrir le bac à pastilles de sel pour en vérifier le niveau. Ne le faisant pas régulièrement, j'ai cherché une solution pour visualiser le niveau restant et à être notifié lorsqu'il sera judicieux d'en remettre. Ça m'évite d'être pris au dépourvu et de tirer de l'eau de moins bonne qualité. Pour cela nous allons nous baser sur un composant électronique, une carte type ESP et la librairie ESPHome pour intégrer les informations retournées dans Home Assistant.
Ce projet vise à remplir les objectifs suivants :
- Intégré à Home Assistant
- Être en mesure de connaître à tout moment le niveau actuel de sel dans le bac à pastilles
- Être alerté lorsque le niveau atteint un certain seuil
- Consommer le moins possible d'énergie
Enfin, vous découvrirez ici comment bien utiliser la fonction de deep sleep, indispensable dans bien des projets ESPHome.
Nous nous appuyons sur ESPHome qui facilite la programmation des modules ESP, ainsi que l'intégration dans Home Assistant. Pour plus d'information, se référer à l'article suivant :
Matériel nécessaire
Pour ce projet, nous allons avoir besoin d'une carte ESP et d'un moyen de connaître une distance. En guise de carte ESP, j'avais sous la main une carte ESP8266 mais je détaillerai également pour une carte ESP32. Pour la mesure de la distance, j'ai choisi d'utiliser le capteur à ultrasons HC-SR04
Capteur HC-SR04
Ce petit module permet d’évaluer les distances. Pour cela, il envoie une impulsion et nous renvoie une largeur d'impulsion proportionnelle à la distance de l'obstacle rencontré.
Il est équipé d'un émetteur et d'un récepteur. Le premier envoie une onde, cette dernière est réfléchie par l'obstacle rencontré et est détectée par le récepteur. On est dès lors capable de mesurer la distance entre le capteur et l'obstacle.
Dans notre cas de figure, en accrochant le capteur au couvercle du bac à pastilles de sel et en l'orientant vers le bas, les ondes vont ricocher sur les pastilles. Au fur et à mesure du fonctionnement de l'adoucisseur, elles vont être consommées et le niveau va régulièrement descendre dans le bac, faisant accroitre la distance à parcourir par les ondes pour rencontrer les pastilles de sel. Nous voilà en mesure de connaître le niveau de sel à tout moment.
Schéma de câblage
Le module HC-SR04 possède 4 connecteurs. Le câblage est identique quelque soit la carte ESP choisie (ESP32 ou 8266).
Celui du haut est pour l'alimentation en 5V, celui du bas la masse (GND). Ceux du milieu correspondent à l'émetteur et l'autre au récepteur. Le branchement à l'ESP se fait très simplement. Je vais une fois de plus me servir de la prise USB pour alimenter mon ESP et me servir des pins Vin et GND pour alimenter le module HC-SR04.
Code ESPHome
Capteur à ultrasons HC-SR04
La définition du capteur dans ESPHome est assez basique.
sensor:
- platform: ultrasonic
trigger_pin: GPIO05
echo_pin: GPIO04
name: "Capteur niveau sel"
update_interval: 15s
timeout: 1m
filters:
- median
Il suffit de définir un sensor de type ultrasonic, lui indiquer les pins de connexion du Trigger et de l'Echo. Ensuite, on spécifie la fréquence, avec l'attribut update_interval, à laquelle il envoie une onde pour mesure. J'ai choisi de prendre une mesure toutes les 15 secondes, et enfin, on peut spécifier un timeout : c'est la distance maximale que les ondes peuvent parcourir avant que le capteur ne renvoie une distance incorrecte (Si vous visez le ciel par exemple !) dans notre cas de figure, c'est peu utile, car on mesure des distances dans un environnement clos de moins de 1m de long.
Deep Sleep
La quantité de sel dans le bac à pastilles ne varie pas aussi vite qu'une mesure de température ou d'humidité, nous n'avons pas besoin de remonter l'information aussi périodiquement. Sachant cela, nous pourrions tout simplement modifier la fréquence de mise à jour du capteur, mais l'ESP resterait tout de même alimenté et fonctionnel tout le temps.
Une autre solution consiste à se servir des fonctionnalités de Deep Sleep des ESP. L'idée est de laisser l'ESP effectuer quelques mesures de distance dans le bac de sel, pendant 1 minute puis de le passer en sommeil profond (Deep Sleep) durant plusieurs heures. Au bout d'un temps définit, il se réveillera et effectuera de nouveau quelques mesures de distance pendant 1 minute avant de se rendormir.
Cette approche permet de consommer très peu d'énergie sans pour autant perdre en qualité de données : le niveau dans le bac de sel ne descendra pas de plusieurs centimètres d'un seul coup !
deep_sleep:
id: "deep_sleep_adoucisseur"
run_duration: 1min
sleep_duration:
hours: 12
En ajoutant ce code, on définit une fonction de deep sleep avec les caractéristiques suivantes :
- Fonctionne pendant 1 minute
- S'endort pendant 12 heures
L'ESP va donc fonctionner 1 minute toutes les demi-journées, soit 2 minutes par jour. C'est durant ces temps d'activités qu'il effectuera les mesures de distance et les reportera dans Home Assistant.
Mise à jour OTA
Le sommeil profond est en place, mais que se passe-t-il si je souhaite mettre à jour mon ESP alors qu'il dort ? Il ne sera tout simplement pas accessible. La mise à jour OTA (Over The Air) permet normalement de mettre à jour l'ESP à distance, sans avoir besoin de le déconnecter et le reconnecter à un ordinateur, nous voulons tout de même garder cette fonctionnalité.
Pour cela nous allons nous appuyer sur le protocole de file de messages MQTT. Définissez votre broker de messages et spécifiez des actions à réaliser lorsque certains messages sont reçus par l'ESP.
mqtt:
broker: 192.168.1.xx
username: mqtt_user
password: !secret mqtt_password
on_message:
- topic: adoucisseur/ota_mode
payload: 'ON'
then:
- deep_sleep.prevent: deep_sleep_adoucisseur
- topic: adoucisseur/ota_mode
payload: 'OFF'
then:
- deep_sleep.enter: deep_sleep_adoucisseur
Alors que l'ESP est entrain de dormir, à l'aide d'un client MQTT sur ordinateur (MQTT Explorer par exemple), vous pouvez envoyer un message sur le topic adoucisseur/ota_mode avec la valeur à ON
Lorsque l'ESP se réveillera, il lira le message et grâce à deep_sleep.prevent, il sera empêché d'entrer en sommeil profond. On pourra alors le mettre à jour sans problème. Une fois la mise à jour effectuée, il suffit de renvoyer un message sur le même topic avec la valeur à OFF, ce qui aura pour effet de rendormir aussitôt l'ESP.
Une fois connecté à votre broker MQTT, vous verrez tous les messages passer. On distingue les messages liés à notre ESP "adoucisseur". Pour lui envoyer un message il faut se servir du panel de droite et dans la partie "Publish" mettre dans "Topic" l'adresse du nœud configuré dans la configuration ESPHome de l'ESP : adoucisseur/ota_mode
Ensuite, il faut lui envoyer la valeur désirée. Pour lui dire de ne pas se rendormir après le prochain réveil, envoyer la valeur ON. Une fois la mise à jour effectuée, lui renvoyer le même message avec la valeur OFF.
Code complet
Voici ce que ça donne une fois tous les éléments réunis. On retrouve les blocs précédents.
esphome:
name: adoucisseur
friendly_name: Adoucisseur
substitutions:
friendly_name: Adoucisseur
esp8266:
board: esp01_1m
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: !secret api_encryption_key_adoucisseur
ota:
password: !secret ota_password_adoucisseur
mqtt:
broker: 192.168.1.xx
username: mqtt_user
password: !secret mqtt_password
on_message:
- topic: adoucisseur/ota_mode
payload: 'ON'
then:
- deep_sleep.prevent: deep_sleep_adoucisseur
- topic: adoucisseur/ota_mode
payload: 'OFF'
then:
- deep_sleep.enter: deep_sleep_adoucisseur
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Adoucisseur Fallback Hotspot"
password: "XhdC9M0BrNJG"
captive_portal:
sensor:
- platform: ultrasonic
trigger_pin: GPIO05
echo_pin: GPIO04
name: "Capteur niveau sel"
update_interval: 15s
timeout: 1m
filters:
- median
deep_sleep:
id: "deep_sleep_adoucisseur"
run_duration: 1min
sleep_duration:
hours: 12
Au démarrage de l'ESP, vous pourrez surveiller l'apparition des lignes encadrées en vert pour vérifier que les paramètres ont bien été pris en compte. À des fins de tests les durées indiquées dans la capture d'écran correspondent à 2min de fonctionnement et autant de Deep Sleep.
Home Assistant
Dashboard
Une fois que tout est installé, l'entité suivante va remonter dans Home Assistant
On obtient donc le niveau de sel dans le bac à pastilles ! Il nous reste à automatiser les alertes.
Automatisations
Pour créer une automatisation, il va falloir connaître la distance maximale, c'est-à-dire la distance relevée par le capteur lorsqu'il n'y a plus de sel dans le bac. Pour ça, le plus simple est d'installer le capteur lorsqu'il n'y a plus de sel. Sinon, il suffit de mesurer la hauteur effective du bac, c'est ce que j'ai fait.
Je possède un bac dont la hauteur fait 78 cm et 33 cm de diamètre. Lorsque le niveau est à son maximum, que le bac à pastilles est rempli de sel, la hauteur remontée par le capteur est de 20 cm et lorsqu'il est à son minimum 75 cm.
alias: Adoucisseur - Niveau de sel
description: ""
trigger:
- platform: numeric_state
entity_id:
- sensor.adoucisseur_niveau_sel_capteur_niveau_sel
above: 0.70
condition: []
action:
- service: notify.mobile
metadata: {}
data:
message: Le niveau de sel dans le bac à pastilles est bas.
title: Adoucisseur - Niveau de sel
mode: single
Je crée donc une automatisation qui m'informe via une notification smartphone que le niveau de sel est bas lorsque la valeur remontée par le capteur dépasse 70 cm.
Conclusion
Nous sommes désormais capables de connaître à tout moment le niveau de sel dans le bac et nous avons même une notification en cas de seuil trop bas. Le système consomme peu et reste accessible pour mises à jour en WiFi. Tous les objectifs sont atteints.