Capteurs de qualité de l'eau (pH, ORP) + jauges configurables avec seuils colorés

Salut tout le monde :waving_hand:

Je voulais partager 2 PRs que je viens d’ouvrir, liées à un cas concret : intégrer ma sonde iopool Eco (surveillance qualité de l’eau de piscine) à Gladys via MQTT.

J’ai remonté la sonde côté Node-RED qui publie sur le broker MQTT, ce qui me permet de créer un Appareil virtuel MQTT côté Gladys avec les fonctionnalités : température, pH, ORP (capacité de désinfection), mode, durée de filtration conseillée, date de dernière mesure.

Le problème : pour le pH et l’ORP, aucune catégorie de capteur ne correspondait. J’ai dû mettre « Inconnu » pour le pH et « Indice de qualité de l’air » pour l’ORP (parce que airquality-sensor était ce qui ressemblait le plus). Pas idéal.

J’ai donc fait 2 PRs (stack) :


PR 1 — Catégories de capteurs pour la qualité de l’eau

:link: Add water quality sensor categories (pH, ORP) by Terdious · Pull Request #2530 · GladysAssistant/Gladys · GitHub

Ajout de 2 catégories génériques, réutilisables par n’importe quelle intégration (MQTT, Z2M, Matter, services custom) :

  • ph-sensor — pH de l’eau, plage 0–14, nouvelle unité dimensionless ph
  • orp-sensor — Potentiel d’oxydoréduction (Redox / « Capacité de désinfection »), en millivolt (unité existante)

Couvre les sondes piscine (iopool, Ondilo, BWT), aquariums, stations de mesure d’eau de pluie, etc.

Convention de nommage : termes scientifiques standards (pas de capacite-desinfection-sensor). Mais le libellé FR garde « ORP / Capacité de désinfection » pour rester accessible au grand public.


Pourquoi pas de coloration automatique sur le widget « Appareil » ?

Question légitime : la qualité de l’air (CO2, PM2.5, VOC…) affiche un badge coloré
automatiquement dans le widget Appareil selon la valeur. Pourquoi ne pas faire pareil
pour le pH et l’ORP ?

Parce que ça ne marche que pour des mesures à seuils universels. Le CO2 à 1200 ppm
est mauvais partout, peu importe le contexte — c’est une norme sanitaire mondiale.

Le pH et l’ORP, eux, sont des échelles absolues dont la plage « correcte » dépend
entièrement de l’usage :

Usage pH idéal ORP idéal
Piscine 7.0 – 7.4 650 – 750 mV
Aquarium eau douce 6.5 – 7.5 250 – 400 mV
Aquarium récifal 8.1 – 8.4 350 – 450 mV
Eau potable 6.5 – 8.5
Hydroponie 5.5 – 6.5

Si on hardcodait des seuils piscine dans le widget Appareil, un utilisateur d’aquarium
verrait sa valeur en rouge alors que son eau est parfaite. Trompeur.

À ça s’ajoute un détail technique : la coloration de la qualité de l’air est monotone
(« plus c’est bas, mieux c’est »). Le pH, c’est une bande : mauvais en bas et en haut,
bon au milieu. La logique existante ne s’applique tout simplement pas.

C’est pour ça que la coloration par seuils passe par la PR2 (jauge configurable) :
chacun définit ses propres seuils selon son usage. Neutre, correct pour tout le monde,
et réutilisable bien au-delà de la qualité de l’eau (batterie, niveau de cuve, etc.).


PR 2 — Jauge configurable avec seuils colorés

:link: Gauge dashboard widget: add configurable color thresholds by Terdious · Pull Request #2531 · GladysAssistant/Gladys · GitHub

Reprend la logique seuil + couleur déjà présente dans les widgets « Température de la pièce » et « Humidité de la pièce », mais en générique sur le widget Jauge :

  • Checkbox « Configurer des seuils personnalisés » dans l’éditeur
  • Double curseur pour définir les 2 seuils (les bornes du curseur viennent du min/max de la feature, donc cohérent avec pH 0-12, ORP 500-1100, batterie 0-100, etc.)
  • 3 sélecteurs de couleur (zone basse / dans la plage / zone haute) avec la palette du widget chart
  • Légende sous la jauge avec les 3 couleurs et les bornes formatées avec l’unité
  • Sans seuils personnalisés → le gradient ApexCharts d’origine est conservé (zéro régression)



Pourquoi ces choix de design

  • Catégories séparées plutôt qu’une catégorie umbrella water-quality-sensor avec plusieurs types : aligné sur le pattern existant (co2-sensor, pm25-sensor, voc-sensor, etc. — 1 catégorie = 1 mesure physique)
  • Jauge configurable plutôt que widget dédié piscine : générique = utile à beaucoup plus de cas d’usage (batterie de véhicule électrique, humidité du sol, dB, niveau de cuve, etc.)
  • Pas de coloration smart hardcodée par catégorie (genre « pH entre 7.0-7.4 = vert ») : laissé au choix de l’utilisateur via l’éditeur, pour rester neutre sur les conventions métier (piscine ≠ aquarium ≠ spa)

Feedback bienvenu :folded_hands: — surtout sur :

  1. Le nommage des catégories (ph-sensor / orp-sensor vs alternatives ?)
  2. Le wording FR pour ORP — « Capacité de désinfection » est-il assez clair pour ceux qui ne connaissent pas la chimie de l’eau ?
  3. Est-ce que d’autres ont des cas d’usage (aquarium, eau de pluie, hydroponie…) qui bénéficieraient de ces catégories ou qui en demanderaient d’autres (TDS, conductivité, salinité) ?
  4. La jauge configurable — vous voyez d’autres widgets qui mériteraient le même traitement seuils/couleurs ?

Merci de votre lecture :slightly_smiling_face:

Ca fait un long moment que je cherche une sonde pour ma piscine. J’ai toujours eu peur de me lancer car peur que la calibration soit totalement foireuse / se modifie trop avec le temps.

Peux tu me dire ce qu’il en est de ton coté ? :wink:

Salut @guim31,

Oui bien sûr, j’ai cette sonde depuis 2022, j’en ai pris une pour un collègue en 2023 (Sel), et une pour mon père en 2024 (Sel également).

Pour ma part je tourne en Oxygène Actif durant l’été, j’ai eu un souci de valeur erronée en 2024, j’ai acheté le kit de recalibrage et ensuite retour nickel.
Je l’ai remplacé entièrement à la remise en route 2025 car plus de batterie (donnée pour 2 ans, elle a tenu 3 été). Malheureusement c’était la 1ere version et elle n’était pas démontable pour remplacer seulement la batterie, donc j’ai dû racheter la nouvelle version au complet.
Les nouvelles peuvent être ouvertes par des vis sur la tête et donc on peut remplacer la sonde ou la batterie indépendamment.

Mon collègue à lui la nouvelle version, il n’a toujours pas rencontré de soucis, peut-être à la remise en route cette année pour la batterie. Côté sonde, il est métrologue et sont retour est qu’elle fonctionne très bien. Les dérives sont normales dans ce genre d’utilisation avec hibernation l’hiver, mais la calibration n’a pas de souci. Concernant la sonde, il donne en tant que métrologue une durée de vie de 5 à 10 ans, c’est totalement normal. Pour un usage oxygène actif ou chlore les sondes sont moins cher.

Mon papa lui vit dans le sud, il ne l’hiberne pas, et 0 soucis pour le moment, même pas une recalibration.

Pour la surveillance d’écart pour recalibration, on peut faire des tests languette directement avec l’application pour repérer les écarts. Je me suis également équipé d’un capteur électronique pH et ORP pour fiabiliser.

Perso je ne connaissais par ORP mais par contre Redox ça me parle beaucoup plus car quand je dois checker, c’est le redox que je vérifie (je suis au sel aussi).
D’ailleurs pur les piscines, on parle plus de Redox qe d’ORP (ou alors il faut que je me trouve une plus grosse piscine :joy:).
Je serais plus d’avis d’avoir redox-sensor que orp-sensor, qu’en penses-tu ?

Et top pour le dev, merci pour tout ce que tu fais :wink:

Ça a l’air top ! Super développement :slight_smile:

Je te dis dès que j’ai pu regarder !

Pour ta sonde, est-ce que ça ferait pas sens d’avoir un plugin Matterbridge ?

Hésite pas à tester l’usine, c’est fait pour ça :wink: (même si, pour toi qui utilise déjà Claude Code, ça va moins t’impressionner!)

Merci beaucoup pour ton retour je vais regarder ça de plus près grâce à toi !!!

Salut mutmut,

Tu as raison sur le contexte piscine en France : Redox y est effectivement le terme dominant (Zodiac, Hayward, CCEI… tous étiquettent leurs régulateurs « Redox »). Petite précision quand même : « pour les piscines, on parle plus de Redox qu’ORP »→ c’est vrai en France, mais à l’international (et en anglais en général), ORP reste le standard d’après mes courtes recherches. Et dans d’autres domaines qui pourraient utiliser cette catégorie — aquariophilie, hydroponie, traitement d’eau potable — ORP domine aussi, notamment parce que la quasi-totalité des sondes vendues en ligne sont étiquetées « ORP probe ».
Techniquement les deux désignent exactement la même chose (potentiel d’oxydoréduction en mV), c’est juste une question d’usage régional/sectoriel.

Du coup je proposerais un compromis : garder orp-sensor côté code (cohérence internationale, plus universel pour le SEO et la recherche de matériel), mais afficher « Redox / ORP » côté UI française.
Ça parle à tout le monde, piscinistes français comme aquariophiles, sans exclure personne.

Qu’en penses-tu ?

Merci Pierre-Gilles :grinning_face_with_smiling_eyes:

Pour le plugin Matterbridge, pourquoi pas en effet ! La connexion à l’API iopool est assez simple, et il existe déjà une intégration exemple côté Home Assistant dont on peut s’inspirer.
De mon côté, je peux partager mon flow Node-RED qui fait déjà le job, ça devrait donner une bonne base pour le développement.

Par contre, ce sera plus pour la commu que pour moi : je ne suis vraiment pas fan de Matter pour le moment​:sweat_smile:

Je vais tester l’usine avec plaisir, un peu curieux de voir ce que ça donne quand même.

Je trouve le compromis très bien :+1:

C’est fait !

Issue créée par l’IA => pour l’IA :sweat_smile: :

Avec un point soulevé par Claude Opus 4.7 :

« Une seule réserve honnête à avoir en tête : pH et ORP n’ayant pas de cluster Matter standard, le rendu côté Gladys sera probablement nickel pour la température et « best-effort » pour pH/ORP — c’est précisément le genre de retour que Pierre-Gilles attend de ce test. »

EDIT :

On a creusé le sujet côté Matter : vérification directement
dans le SDK officiel (project-chip/connectedhomeip) la liste des clusters de
mesure. Verdict — Matter n’a aucun cluster pH ni ORP/Redox. Les seuls
clusters « de substance » sont les 10 Concentration Measurement (CO, CO2, NO2,
ozone, PM1/2.5/10, formaldéhyde, COV, radon) : 100 % qualité de l’air.

Recherches pH Measurement, pH Measurement, redox, water quality dans tout le SDK → 0 résultat.

Côté qualité de l’eau, c’est en demi-teinte :

  • L’espace d’IDs Matter réserve bien des clusters pour pas mal de paramètres
    d’eau (chlore, fluorure, turbidité, oxygène dissous…), hérités de Zigbee — mais
    ils ne sont pas implémentés : seuls 10 clusters Concentration Measurement
    existent réellement, et ce sont les 10 de qualité de l’air.
  • Surtout : pH et ORP sont absents même de l’espace réservé. Et c’est logique
    — ce ne sont pas des concentrations (le pH est une échelle log, l’ORP un
    potentiel en mV), donc aucun modèle de cluster Matter actuel ne peut les porter.

Conclusion :

  • Température → un plugin Matterbridge a tout son sens (cluster standard,
    déjà mappé par Gladys).
  • pH / ORP → Matter ne sait structurellement pas les représenter aujourd’hui.
    Le chemin MQTT de la PR1 (ph-sensor / orp-sensor) reste donc le seul
    fonctionnel — les deux approches sont complémentaires.

À noter quand même : le SDK a récemment gagné un cluster soil-measurement
(humidité du sol), donc la CSA ajoute bien de nouveaux clusters de niche au fil
des versions. Un cluster « water quality » un jour n’est pas impossible — mais
c’est du long terme, côté CSA.

Je vais quand même tester l’usine pour la partie température, je te fais un
retour ! :slightly_smiling_face:

EDIT 2 :
Dans le doute on a tout de même créé une issue au seul endroit possible du projet Matter :

J’ai testé le plugin généré par l’usine sur mon instance Matterbridge (3.7.9). Premier bilan :backhand_index_pointing_down:

:white_check_mark: Ce qui marche bien

  • Le plugin s’installe et tourne (statut Running), se connecte à l’API iopool, découvre ma piscine et la nomme correctement (« Piscine DUBLEM », le nom défini dans iopool).
  • La température de l’eau est parfaite : remontée dans un vrai cluster Matter TemperatureMeasurement → 11.15 °C, exploitable nativement. Pour cette partie, le plugin fait exactement le job.

:warning: Le piège pH / ORP — exactement ce qu’on avait anticipé

Matter n’ayant aucun cluster pH ni ORP, l’IA a fait au mieux : elle expose le pH et l’ORP… dans des clusters TemperatureMeasurement eux aussi. Résultat :

  • 3 « capteurs de température » pour une seule piscine (eau + pH + ORP).
  • pH : le bon chiffre (6.69) mais affiché en °C.
  • ORP : carrément faux — affiché 5.73 au lieu de 573 mV. Le cluster température est en centi-degrés (÷100 côté contrôleur), et l’ORP ne tient pas dans cette échelle → valeur divisée par 100.

:cross_mark: Autre bug repéré : le statut « Online »

Le device est marqué « Online » en permanence (reachable = true figé). Ça ne reflète que le succès de l’appel API cloud, pas l’état réel de la sonde — ma sonde est actuellement hors de l’eau et le plugin la montre quand même « Online » avec les dernières valeurs en cache. L’API iopool fournit pourtant isValid + measuredAt pour gérer ça correctement.

:magnifying_glass_tilted_left: Conclusion

Le facteur a produit un très bon premier jet : connexion, découverte, température → nickel. Mais ça confirme noir sur blanc le mur de fond : Matter ne sait structurellement pas porter le pH et l’ORP. Le « contournement température » est le seul possible aujourd’hui, mais il donne des données fausses/trompeuses dans n’importe quel contrôleur.

:person_raising_hand: Décision à prendre — @pierre-gilles

J’ai préparé un retour détaillé pour l’issue #15 (checklist + bugs + cause racine). Avant de le poster, ton avis sur le pH/ORP côté plugin Matterbridge :

  1. On les garde dans le plugin, en documentant clairement les pièges (pH = lire la valeur sans l’unité, ORP = ×100 mentalement) ?
  2. On les retire du plugin Matter et on assume « température seule » comme livrable Matter, le pH/ORP restant sur le canal MQTT (catégories ph-sensor/orp-sensor de ma PR) tant que Matter n’a pas les clusters ?

Le bug reachable/« Online » et un productUrl cosmétique sont eux corrigeables par un --fix de l’usine, quoi qu’il arrive.

(En parallèle j’ai créé une feature request sur project-chip/connectedhomeip pour des vrais clusters pH/ORP — sujet long terme 6-24 mois, si pris en compte.)

Pour le coup, gros avantage des plugins Matterbridge, c’est qu’il n’y a pas besoin de moi, fais ce qui te semble le mieux :wink:

Mon objectif est de ne pas être le goulot d’étranglement sur ces sujets, liberté totale :wind_face:

Top !