[DefiDIY25] Rien que de l’eau, De l’eau de pluie, De l’eau de là-haut

:oil_drum: TankMonitor – Suivi du niveau d’une cuve d’eau de pluie

:pushpin: Contexte

Dans le cadre de la construction d’une maison neuve, le règlement du lotissement « incite fortement » à installer une cuve de récupération des eaux de pluie (usage toilettes et arrosage extérieur).

Pourquoi pas se lancer… mais hors de question de le faire sans visibilité sur le niveau de remplissage :sweat_smile:

C’est décidé : j’inclus le suivi de remplissage de ma cuve de 5 m³ dans Home Assistant.


:compass: Démarche

Après un prototypage sur une petite cuve de jardin, mon choix s’est porté sur une solution filaire à base de flotteurs à contact, répartis uniformément sur la hauteur de la cuve. Les états des capteurs (ouvert/fermé) sont lus via un ESP8266 et envoyés à Home Assistant grâce à ESPHome.

:bar_chart: Les données sont interprétées par le composant binary_sensor_map, qui convertit les états en pourcentage de remplissage.

Avec 10 capteurs = 10 entrées à gérer → trop pour un ESP seul ! J’utilise donc une carte d’expansion MCP23017 pour gérer ça avec seulement 2 pins (SDA/SCL).


:gear: Contraintes / Solutions

:wrench: Partie capteur

  • La cuve est enterrée à l’extérieur, à environ 3 m de la maison.
  • L’intérieur est évidemment très humide.
  • Il y a une gaine existante (amenée au fond de la cuve) que j’ai utilisée pour faire passer tous les fils, héberger l’ESP à l’abri (au sec), proche de l’alimentation et du WiFi.

Les flotteurs sont connectés via des connecteurs étanches.

Pour les maintenir :

  • Une cornière en L en alu (plus chère, mais plus résistant que le plastique) de 2,5 m sert de perche,
  • Les supports des capteurs (toujours en cornière d’alu) sont rivetés, pour déporter les flotteurs,
  • Un plot en béton maintient la perche à la verticale.

Les fils des flotteurs sont regroupés dans 3 câbles RJ45 en sortie de cuve, pour un coût réduit (au métre) et une meilleure facilité de passage en gaine.


:light_bulb: Partie électronique

Le matériel utilisé :

  • Un ESP8266 (clone Wemos D1 Mini)
  • Une carte d’expansion MCP23017
  • Deux résistances 10kΩ (pull-up sur SDA/SCL)
  • 20 connexions pour les capteurs

:triangular_ruler: Schéma de câblage :

Peu de composants, mais beaucoup de connexions, donc j’ai conçu un PCB pour fiabiliser le tout (Gerbers dispo sur le GitHub) :



:camera_with_flash: En images

:hammer_and_wrench: La perche avec les capteurs

:backhand_index_pointing_right: Couleur différente pour les flotteurs pairs et impairs :

:package: Le PCB avec les branchements :


:red_exclamation_mark: Erratum / Oubli

:cross_mark: Erreur : le nombre de capteurs

J’avais prévu 11 capteurs au lieu de 10 (0 → 10 = 11 valeurs). Finalement, le capteur 0 n’est pas vraiment utile.
Interprétation : si le capteur 1 (10 %) n’est pas immergé, le niveau est < 10 %, donc affiché à 0 %.
Pas dramatique : qui peut le plus, peut le moins :sweat_smile:

:light_bulb: Oubli : la température

J’utilisais 3 câbles RJ45, soit 24 fils. 20 seulement sont utilisés.
Pourquoi ne pas ajouter la température de l’eau, juste pour le fun ?

J’ai donc ajouté une sonde DS18B20 étanche (3 m de câble), branchée un peu à l’arrache car non prévue sur le PCB, dommage…


:brain: Code ESPHome

Le code est simple, basé uniquement sur des composants officiels ESPHome.
J’utilise des packages pour des fonctionnalités partagées (WiFi, bouton reset, uptime, etc.).
Le code complet est dispo sur le GitHub.

:locked: Les XXXXXXXX sont à remplacer par vos mots de passe :wink:

packages:
  button: !include common.yaml

substitutions:
    devicename: tankmonitor

esphome:
  name: tankmonitor

esp8266:
  board: d1_mini

# Enable logging
logger:

wifi:
  ap:
    ssid: "Tankmonitor Fallback Hotspot"
    password: "XXXXXXXX"

captive_portal:

    
i2c:
  sda: D2
  scl: D1
  scan: True
  id: bus_a

one_wire:
  - platform: gpio
    pin: D3


mcp23017:
  - id: 'mcp23017_hub'
    address: 0x20
    
binary_sensor:
  - platform: gpio
    id: 'pin0'
    name: "pin0"
    pin:
      mcp23xxx: mcp23017_hub
      number: 0
      mode: INPUT_PULLUP
      inverted: false
  - platform: gpio
    id: 'pin1'
    name: 'pin1'
    pin:
      mcp23xxx: mcp23017_hub
      number: 1
      mode: INPUT_PULLUP
      inverted: false
  - platform: gpio
    id: 'pin2'
    name: 'pin2'
    pin:
      mcp23xxx: mcp23017_hub
      number: 2
      mode: INPUT_PULLUP
      inverted: false
  - platform: gpio
    id: 'pin3'
    name: 'pin3'
    pin:
      mcp23xxx: mcp23017_hub
      number: 3
      mode: INPUT_PULLUP
      inverted: false
  - platform: gpio
    id: 'pin4'
    name: 'pin4'
    pin:
      mcp23xxx: mcp23017_hub
      number: 4
      mode: INPUT_PULLUP
      inverted: false
  - platform: gpio
    id: 'pin5'
    name: 'pin5'
    pin:
      mcp23xxx: mcp23017_hub
      number: 5
      mode: INPUT_PULLUP
      inverted: false
  - platform: gpio
    id: 'pin6'
    name: 'pin6'
    pin:
      mcp23xxx: mcp23017_hub
      number: 6
      mode: INPUT_PULLUP
      inverted: false
  - platform: gpio
    id: 'pin7'
    name: 'pin7'
    pin:
      mcp23xxx: mcp23017_hub
      number: 7
      mode: INPUT_PULLUP
      inverted: false
  - platform: gpio
    id: 'pin8'
    name: 'pin8'
    pin:
      mcp23xxx: mcp23017_hub
      number: 8
      mode: INPUT_PULLUP
      inverted: false
  - platform: gpio
    id: 'pin9'
    name: 'pin9'
    pin:
      mcp23xxx: mcp23017_hub
      number: 9
      mode: INPUT_PULLUP
      inverted: false
  - platform: gpio
    id: 'pin10'
    name: 'pin10'
    pin:
      mcp23xxx: mcp23017_hub
      number: 10
      mode: INPUT_PULLUP
      inverted: false
     
sensor:
 
  - platform: dallas_temp
    name : temperature eau recup
    address: 0x8b3ce4f6486fd428
    resolution: 11
    update_interval : 10min

  
  - platform: binary_sensor_map
    id: group_0
    name: "Niveau d'eau"
    type: GROUP
    state_class: measurement
    unit_of_measurement : '%'
    channels:
      - binary_sensor: pin0
        value: 0
      - binary_sensor: pin1
        value: 20
      - binary_sensor: pin2
        value: 40
      - binary_sensor: pin3
        value: 60
      - binary_sensor: pin4
        value: 80
      - binary_sensor: pin5
        value: 100
      - binary_sensor: pin6
        value: 120
      - binary_sensor: pin7
        value: 140
      - binary_sensor: pin8
        value: 160
      - binary_sensor: pin9
        value: 180
      - binary_sensor: pin10
        value: 200

:white_check_mark: Retour d’expérience

J’ai rencontré quelques soucis :

Faux niveaux (pas multiples de 10) pour cause de

  • Capteurs défectueux ou encrassés ?
  • Connexion étanche, pas si étanches ?

J’ai dû démonter, nettoyer, et remplacer certains capteurs / connexions.

:puzzle_piece:Intégration HomeAssistant

:bar_chart: Affichage dans le dashboard se fait via une jauge Home Assistant.

:robot: Une automatisation HA vérifie la cohérence des données (multiples de 10) et envoi une alerte si ce n’est pas le cas.

:police_car_light: Via une seconde automatisation, une alerte m’est envoyée dès que le niveau tombe sous 10 %, pour basculer sur le réseau de ville.


:puzzle_piece: Conclusion

Ce n’est clairement pas la solution la plus simple (des mètres de câbles, beaucoup de bricolage), mais très satisfaisant de mener un projet comme ça jusqu’au bout :flexed_biceps:

3 « J'aime »

Alors pour le niveau de liquide dans une cuve, les capteurs hydrostatiques sont encore ce qu’il y a de plus fiable et précis.

C’est pas le meilleur marché (exemple : Sonde de niveau hydrostatique pour eau potable et eaux usées ) mais vu la fiabilité et la durée de vie ça les vaut largement.
J’en ai un dans une installation dont j’ai “hérité” qui est en place depuis au moins 30 ans et il fonctionne toujours parfaitement.

Salut,
Effectivement pas le même budget :grinning_face:
En héritage pourquoi pas, dans un domaine pro surement, mais pas pour moi :wink:

Je ne prétend pas que c’est LA solution, juste ma solution/ mon implémentation, qui a ses inconvénients et limites (explicitement mentionnés).

SebCaps

1 « J'aime »

Pas besoin de mettre ce prix.

Et encore moins cher avec toutes les options directement en chine (hauteur de cuve, longueur de câble, format du signal 4/20mA, 5V, 10V)