HA-Gestion piscine-4_Mesure Ph

Intro

Les possesseurs de piscine le savent, le pH est une composante importante dans le traitement des eaux de piscine. Un mauvais pH rendra très difficile voir impossible le traitement de l’eau. Personnellement, je cible une valeur de Ph à 7.3 .

Dans le commerce vous trouvez beaucoup de régulateurs de pH, malheureusement à des prix trop élevés à mon gout.

J’ai découvert les modules EZO fabriqués par AtlasScientific au hasard du net, mais la toute récente intégration du module EZO dans EspHome m’a conforté dans ce choix.

Je commande les modules EZO chez https://www.whiteboxes.ch/ , c’est rapide et j’ai pas trouvé mieux ailleurs en Europe. leur boutique est bien organisée, vous y retrouvez bon nombre de produits ainsi que la documentation très fournie associée.

Vous y trouvez notamment des modules et sondes de mesure de conductivité, ORP, oxygène dissoute, température, mesure de gaz O² et CO², de couleur, humidité, pression, ainsi que divers accessoires.

Nota: dans un premier temps, je ne traite dans cet article que la mesure de pH, la régulation avec des pompes péristaltiques fera l’objet d’une mise à jour.

La partie matérielle

Liste des courses

  • Un module mesure de ph EZO
  • Une sonde pH EZO. J’utilise celle ci mais il existe des modèles compatibles industriels beaucoup plus chers et des modèles chinois beaucoup moins chers, c’est selon l’importance et le budget que vous accorderez à la fiabilité et la pérennité de la mesure.
  • Un connecteur SMA pour la sonde.
  • Un module d’isolation galvanique EZO. Je ne l’ai utilisé qu’apres avoir essayé sans, mais je rencontrai des problèmes de stabilité de mesure, résolus grâce à ce module. Voir la nouvelle version de ce module dans mon Update du 4 octobre 2021.
  • Un afficheur local 2 lignes de 16 caractères . Vous en trouvez à foison sur le net, c’est pratique de le choisir avec une puce compatible ESPHome.
  • Un ESP32. J’ai choisi ce modèle car je pense lui confier à terme d’autres fonctionnalités dédiées à la piscine, cependant un esp8266 D1 ferait très bien l’affaire.
  • Une alimentation 220VCA-5VCC courant continu.
  • Quelques connecteurs et cordons JST précablés.
  • Divers composants et accessoires

Pour des raison pratiques j’ai dissocié la partie ESP de la partie mesure du pH, donc deux circuits imprimés.

Je préfère intégrer mes composants sur un circuit imprimé, c’est plus propre et donc plus fiable. Je conçois mes schémas et mes circuit imprimés avec le logiciel Eagle et je les grave avec une CNC de ma fabrication.

Mesure pH

Schéma électronique

Vous y retrouvez:

  • Le module d’isolation galvanique
  • Le module de mesure de pH
  • le connecteur SMA (SV1)

Circuit imprimé réalisé avec Eagle

Fichiers Eagle à télécharger

Update du 4 octobre 2021

J’ai remplacer le circuit imprimé précédent par un module d’isolation galvanique V2 de chez Atlas_Scentifique. Ce module et plus compact et facile à mettre en oeuvre, il supporte directement le module PH ou ORP.

ESP

Schéma électronique

Quelques explications sur le schéma:

  • Bus I²C (pin 21,22) a quatre connecteurs: 1 pour l’afficheur, 1 pour le module EZO, 2 pour de futures pompes péristaltiques (injection pH+ et pH-).
  • Bus UART (pin 18,19): Réserve si besoin de brancher un UART
  • Entrées digitales (pin 16,17): Si besoin d’une action rapide en local (Bouton poussoir Marche arrêt pompe par exemple)
  • Entrée analogique (pin 3): Mesure de pression du filtre à sable
  • Entrée analogique (pin 4): Mesure de pression refoulement (A venir)
  • BP RAZ (Pin 2): Accès au « reboot » de l’ESP en local.

Vous constaterez l’anticipation de quelques fonctionnalités complémentaires qui feront l’objet d’articles spécifiques.

Circuit imprimé réalisé avec Eagle

J’évite si possible la fabrication de circuit double face, d’où l’utilisation de quelques straps (en rouge) me permettant de m’en sortir avec un CI simple face.

Fichiers Eagle à télécharger

La partie logicielle

Module EZO

Le module de mesure EZO peux communiquer selon deux protocoles: I²C ou UART. Seul le protocole I²C est disponible dans ESPHome . Par défaut le module est configuré d’usine en UART, il faut donc le basculer en I²C. C’est très simple et bien expliqué dans la documentation du module.

Deux solutions pour le changement de protocole, par logiciel ou par câblage, c’est celle que je préfère, car plus rapide à mettre en œuvre:

  • Connecter TX et PGND
  • Veiller à ce que RX soit déconnecté
  • Alimenter en 0-5v via GND et VCC
  • La led passe en bleue, c’est OK, vous êtes en I²C. A noter que la manipulation est identique pour le re basculer en UART.

Pour information, La led du module est verte en UART et bleue en I²C.

La solution logiciel nécessite un montage sur le port série avec par exemple un Arduino et l’utilisation du code fourni par EZO.

L’isolateur galvanique ne nécessite pas d’intervention.

ESP Home

Rien de particulier, vous y retrouvez les déclarations standards ESPHome, la déclaration EZO ainsi que celle de l’afficheur. A noter la déclaration du bus I²C sur les GPIO spécifiques à l’esp32, celle de l’esp8266 sont différentes (GPIO5->scl, GPIO4->sda). L’option « scan: true » autorise l’ESP à scanner les esclaves i²C, pratique pour vérifier dans le log si l’ESP reconnait le module EZO et l’afficheur. L’adresse I²C de l’EZO et de l’afficheur sont différentes donc pas de souci de compatibilité.

Si besoin de précisions sur le flashage de l’ESP, se reporter à mon article « Home Assistant-ESP HOME ».

Vous y trouverez également le code du capteur d’ORP et de la mesure de pression du filtre à sable.

substitutions:
  device_name: esp125-piscine
  friendly_name: esp125
  adress_ip: "192.168.0.125"
  time_timezone: "Europe/Paris"
  
esphome:
  name: ${device_name}
  platform: ESP32
  board: lolin_d32

wifi:
  networks:
    - ssid: !secret wifi_mi4
      password: !secret mdpwifi_mi4
      priority: 2    
    - ssid: !secret wifi_esp
      password: !secret mdpwifi_esp
      priority: 1
    - ssid: !secret wifi
      password: !secret mdpwifi
      priority: 0
  reboot_timeout: 5min

  manual_ip:
    static_ip: ${adress_ip}
    gateway: 192.168.0.254
    subnet: 255.255.255.0


# Enable logging
logger:

# Enable Home Assistant API
api:

ota:

web_server:
  port: 80


# Example configuration entry for ESP32
i2c:
  sda: 21
  scl: 22
  scan: true
  id: bus_a
  
#Etat de la connection
binary_sensor:
  - platform: status
    name: "${friendly_name}_Status"

sensor:

# Mesure du pH
  - platform: ezo
    id: esp125_ph_ezo
    name: ph_ezo
    address: 99
    unit_of_measurement: "pH"
    accuracy_decimals: 2
    update_interval: 60s
  #  moyenne sur 15 mn-affichage toutes les 5mn
  # Etalonné le 6 juillet 2022
    filters:
      - calibrate_linear:
        - 4.44 -> 4.0
        - 7.17 -> 6.86
        - 9.41 -> 9.18
      - sliding_window_moving_average:
          window_size: 15
          send_every: 5
          send_first_at: 1


# Mesure de l'ORP
# Etalonné le 6 juillet 2022
  - platform: ezo
    id: esp125_orp_ezo
    name: orp_ezo
    address: 98
    unit_of_measurement: "mV"
    accuracy_decimals: 1
    update_interval: 60s
    filters:
#      - multiply: 10
      - calibrate_linear:
          - 0 -> 0
          - 216.9 -> 256
# moyenne sur 15 mn-affichage toutes les 5mn
      - sliding_window_moving_average:
          window_size: 15
          send_every: 5
          send_first_at: 1

# Mesure de la pression filtre
  - platform: adc
    pin: A0
    id: esp125_pression_filtre
    name: "Pression filtre"
    unit_of_measurement: "Bars"
    update_interval: 60s
    attenuation: 11db
    filters:
      - calibrate_linear:
        - 0.58 -> 0.0
        - 0.82 -> 0.8
# moyenne sur 30 mn + affichage toutes les mn
      - sliding_window_moving_average:
          window_size: 30
          send_every: 1
# Avec le 30PSI
#    filters:
#      - calibrate_linear:
#        - 0.5 -> 0.0
#""        - 2.21 -> 0.8
# moyenne sur 30 mn + affichage toutes les mn
#      - sliding_window_moving_average:
#          window_size: 30
#          send_every: 1


  - platform: wifi_signal
    name: "${friendly_name} WiFi Signal Sensor"
    update_interval: 60s

  - platform: homeassistant
    name: "T° Eau Piscine"
    id: temp_piscine
    entity_id: sensor.temp_piscine


# gestion afficheur
display:
  - platform: lcd_pcf8574
    dimensions: 16x2
    address: 0x27
    update_interval: 5s
    lambda: |-
      it.printf(0,0,"Ph=%.2f",id(esp125_ph_ezo).state);
      it.printf(0,1,"Or=%.2f",id(esp125_orp_ezo).state);
      it.printf(8,0,"P=%.3f",id(esp125_pression_filtre).state);
      it.printf(8,1,"T=%.1f",id(temp_piscine).state);


switch:    
  - platform: restart
    name: "${friendly_name}_Restart"
    

text_sensor:
  # IP address #
  - platform: wifi_info
    ip_address:
      name: "${friendly_name} IP address"
      icon: "mdi:network-outline"
    ssid:
      name: "${friendly_name} Connected SSID"
    bssid:
      name: "${friendly_name} Connected BSSID"
  - platform: version
    id: text_sensor_version
    name: "${friendly_name} ESPHome Version"

Affichage local

Une fois l’ESP flashé, alimenté et connecte, vous retrouvez dans HA la mesure de ph et l’affichage en local.

Vous pouvez aussi vérifier son fonctionnement dans la page WEB de l’ESP.

Mise en oeuvre

Pour la mise en oeuvre, J’utilise une chambre de mesure qui permet de positionner deux sondes et deux injecteurs dans le circuit hydraulique, plus un débitmètre. Ne pas oublier les vannes de séparation avant et après ce qui évite d’avoir à vidanger pour intervenir sur les sondes. Dans mon cas j’ai positionner la sonde pt100 de mesure de température sur le deuxième emplacement. L’injecteur est en attente de la pompe de régulation de pH.

Déclaration des entités

Les entités déclarées sont disponibles dans le fichier ph.yaml

Affichage HA

Se reporter à l’article sur la filtration pour plus de détail sur les cartes et les codes associés.

Calibration du module EZO

La calibration est à faire au moins une fois dans l’année. J’utilise de temps en temps les bonnes veilles languettes de réactifs afin de vérifier si la mesure de pH est fiable.

Le principe est de mesurer le Ph dans 3 solutions étalons, relever les valeurs brutes lues par le module EZO, configurer la mise à l’échelle lineaire dans le programme ESP.

Préparer 3 solutions de pH étalon dans 250 ml d’eau distillée: (j’utilise des solutions étalon commandées en quantité chez aliexpress)

  • Basse: 4.00
  • Milieu: 6.86
  • Haute: 9.18

Modifier le programme ESP en supprimant les eventuelles calibrations précédentes (calibrate_filter) et l' »update_interval » à 1s et télécharger le dans l’ESP

Déposer votre sonde, rincez la dans de l’eau distillée, et plonger là dans la solution 4.00.

Attendez 4/5 mn le temps que la mesure se stabilise.

Notez la valeur lue par l’ESP.

Rincez la sonde à l’eau distillée.

Recommencez l’opération pour les solutions 6.86 et 9.18

Une fois les trois valeurs relevées, programmer votre ESP en insérant « calibrate_filter »:

    filters:
      - calibrate_linear:
        - 4.44 -> 4.0
        - 7.17 -> 6.86
        - 9.41 -> 9.18

Les valeurs de gauche son celles que vous avez relevés, celle de droite les valeurs de vos solutions étalons.

Remettre Mettre à jour l' »update_interval » à 60s

Télécharger dans l’ESP.

C’est terminer, votre mesure de pH est étalonnée.

Notée la date d’étalonnage dans votre programme ESP, c’est plus simple à retrouver.

Conclusion

Pour quelques dizaines d’euro, un peu de bricolage, vous pouvez vous fabriquer un pH-mètre, de bonne qualité, évolutif et parfaitement intégré dans HA.

Liste des publications en lien avec cet article

4 Comments on “HA-Gestion piscine-4_Mesure Ph”

  1. Bravo et merci pour ce partage trés inspirant, je découvre ce blog aujourd’hui !
    J’ai migré de jeedom vers home assistant il y a bientot 2 ans. Sur jeedom, j’utilisais le plugin piscine de scadinot. Il n’y avait pas grand chose à cette époque côté HA ( j’ai hésité a porter ça sur HA, mais au final pour éviter d’y passer trop de temps, j’ai fait une automatisation avec nodered, où je définis des plages de filtration en fonction de seuils de température). C’est moins fin, mais ça fait le job. Et en parcourant ton blog, j’ai vu que tu avais fait un équivalent avec Pool pump manager ! j’aurais gagné du temps 😉 Ce qui m’intéresse maintenant, c’est la régulation PH et ORP. Je vais étudier ta façon de faire avec les modules EZO et ESP. A la base, je comptais utiliser un module GCE x200ph en extension de mon IPX800 (avec lequel je gère le contacteur Filtration, Polaris, Eclairage, sonde temp.), mais ils ne fabriquent plus ce module d’extension…. je vais sans doute commencer par le PH, j’ai l’impression que tu as mis un ZeliaPod, c’est exactement ce que j’avais pensé mettre pour les sondes et injecteurs, en faisant un bypass. Tu gères également la régulation Chlore/ORP avec HA ?
    En tout cas, je vais avoir un peu de lecture pour ce WE 🙂 félicitation pour ce blog, les sujets correspondent exactement a mes besoins (conso elec… on vera plus tard)

    1. Bonjour
      merci pour ton retour. Tiens moi au courant de ton avancement et des eventuelles remarques sur le tuto
      Concernant la régul de chlore, elle n’a pas été activée du fait que les lecture de l’ORP sont complètement farfelues, j’attend des valeurs autour des 700 mv et je mesure une valeur inférieure à 100 donc j’investiguerai bientôt lors de la sortie d’hivernage.
      Bon courage à toi.

  2. Bonjour,
    je rencontre un problème d’orde technique ,mais je pose la question au cas ou l’un d’entre vous y aurait déjà été confronté.
    J’ai installé une sonde PH sur ma tuyauterie : https://www.gotronic.fr/art-sonde-ph-interface-sen0161-21552.htm . Elle est reliée à un ESP32 sous arduino et transmet via MQTT.
    Dans un liquide au repos la sonde est stable et l’étalonnage s’est ben passé. Mais dès que je l’installe dans ma tuyauterie… C’est le drame! les valeurs ossillent de 3 à 15 de ph !!! Et chaque seconde j’ai une mesure du min au max.
    De mon point de vue ça pourrait être lié à:
    – l’absence de chambre d’analyse (mais j’ai vu que certains s’en passé…)
    – l’absence de « pool-terre » mais est-ce que les variations seraient si importantes…
    – l’absence d’isolateur galvanique, je ne suis pas certain que ce soit indispensable avec mon convertisseur
    Si quelqu’un à une idée…
    Merci

    1. Bonjour
      J’ai eu des problèmes d’instabilité au début que j’ai résolu avec un isolateur galvanique sachant que j’utilise une chambre d’analyse avec son pool-terre.
      Les sondes mesures des millivolts donc tres sensibles aux interférences.
      Commence au moins par le pool-terre et le cas échéant une isolation galvanique.
      Bon courage

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.