Adoucisseur et niveau de sel

Un adoucisseur fonctionne en échangeant des ions calcium et magnésium contre des ions sodiums, contenus dans le bac de sel, tant qu'il y en a ! Découvrons comment être alerté lorsque le niveau de sel est bas grâce à ESPHome et les fonctions de DeepSleep pour une solution peu gourmande en énergie.
Adoucisseur et niveau de sel

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
👍
À noter que ce projet pourrait être repris pour bien d'autres types de mesures et appareils : niveau de pellet dans un poêle à bois, niveau de liquide dans une citerne, etc.

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 :

Home Assistant : vos premiers pas avec ESPHome
Si la domotique vous passionne, il est tentant de créer vos propres objets connectés. C’est ce que propose ESPHome. Cet article permet de comprendre à quoi sert ESPHome, comment l’installer et l’utiliser, ce que sont les micro-contrôleurs ESP32 et ESP8266.

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.

💡
Une autre solution aurait été d'alimenter la carte ESP et le module directement depuis la même source. Par exemple un chargeur de téléphone mais ça nécessite un peu de soudure.
Spécificité ESP8266 uniquement : Ne pas connecter le pin D0 de l'ESP 8266 au module HC-SR04, il nous servira dans le chapitre suivant.

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.

⚠️
La subtilité pour l'ESP8266 concerne la fonctionnalité de Deep Sleep : la plupart des ESP (ESP32 inclus) se réveillent tout seul lorsque le temps définit dans le code est atteint. L'ESP8266 lui, nécessite un câblage particulier pour être réveillé. Connectez un fil du pin D0 au pin RST (reset).

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.

Il est nécessaire de cocher la case "retain" uniquement lors de l'envoi de la valeur ON pour que le message vive jusqu'à ce qu'il soit consommé par l'ESP lors de son prochain réveil.

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.

💡
Si jamais l'entité devient indisponible lorsque l'ESP est en sommeil profond, c'est que vous avez ajouté l'appareil avant d'installer les fonctions de Deep Sleep. Pour régler le problème, supprimez l'appareil de l'intégration ESPHome de Home Assistant et réimportez la.

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.