Carte Zigbee pour piscine

Pour faire un retour sur mon post précédent avec la chute soudaine d'ORP observée après des semaines de stabilité autour de 650mV.

Je suis rentré a la maison ce soir, et effectivement il y a eu un événement en mon absence qui a fait chuter l'ORP : un coup de vent a envoyé beaucoup de feuilles dans les skimmers et les paniers étaient quasi bouchés. Plus de chlore dans les paniers, des grosses variations de température ce weekend et des traces d'algues commençaient à se développer sur les parois.

J'ai ajouté du chlore ce soir et mon ORP est remonté instantanément.

En conclusion : j'ai bien reçu mon alerte de seuil bas de chlore, qui était bien corrélé avec l'ORP mesuré. La chute était bien physique et les sauts sans doute liés à ma chambre de mesure en dérivation.

Donc : Bravo abulcke ça marche bien !

Info supplémentaire pour les intéressés de la relation ORP/pH/chlore libre : j'ai reçu mon kit de mesure de turbidité pour intégrer a l'abaque le taux de stabilisant. En ajoutant une courbe de recalage du taux de chlore en fonction du taux de Cya, mon taux de chlore libre est pas trop mal corrélé avec ce que je mesure a la bandelette et au réactif. Je mesure donc périodiquement le taux de Cya et je le consigne dans l'input number qui va bien pour compléter l'équation de correction. On voit bien ci-dessous mon ajout de chlore a la fin et avant mon taux bas sous 1ppm qui a provoqué l'apparition des algues.

Je n' ai pas pris le temps de recalibrer la sonde (plus de liquide d étalonnage) Par contre je l'ai plongé dans l eau du robinet et je n' ai eu aucune variation de la.mrsurr.du chlore :frowning:

voici les 2 capteurs que j'utilise:

Caractéristiques:

  • Alimentation: 4,5 à 5,25 Vcc

  • Consommation maxi: 3 mA

  • Spécifications en mode pH:

    • entrée: -400 mV à +400 mV
    • résolution en entrée: 1pH/54,4 val.
    • précision mini/maxi: ±0,09 pH
    • précision type: ±0,02 pH
  • Spécifications en mode ORP:

    • entrée: -2000 mV à +2000 mV
    • résolution en entrée: 100 mV/20 val.
    • précision mini/maxi: ±8 mV
    • précision type: ± 3 mV
  • Dimensions: 68 x 32 x 15 mm.

Référence Phidgets: 1130_0B

salut @abulcke

j ai fait les test demander
ma valeur orp actuel est de 660mv sur mon astralpool .

premier log sonde dans la plomberie
orp 744mv , tension 2.547v

deuxieme log sonde dans la solution 256mv
orp 581mv , tension 2.383v

troisieme log sonde dans un verre d eau choquer
orp 744mv , tension 2.546v

bonne chose il y a une variation de tension
mauvaise chose

  • dans la solution 256mv la valeur redox devrais etre de 256mv mais elle est de 581mv .
  • que la sonde soit dans l eau ou dans l eau extrement chlorer la tension est la meme 2.55v et la valeur autour de 744mv .
  • dans le verre d eau choquer la valeur aurais du sauter a au moins 900mv voir plus .

si tu a besoin d autre test n hesite pas je ferais mon possible .

Première remarque vite fait :

581/2.32 = 250mV donc je pense que tu affiches la tension sans tenir compte du gain de l'AOP (qui vaut 2.32 pour l'ORP)

744/2.32 = 320mV c'est pas énorme après chlore choc !

Cependant la calibration doit être faussée pour les mêmes raisons.

Essaye de modifier :

- platform: ads1115
  multiplexer: 'A2_A3'
  gain: 4.096
  id: orp_raw_voltage
  update_interval: 15s
  filters:
    - sliding_window_moving_average:
        window_size: 5
        send_every: 1



- platform: template
  name: "ORP piscine"
  unit_of_measurement: "mV"
  accuracy_decimals: 0
  update_interval: 30s
  lambda: |-
    float v     = id(orp_raw_voltage).state;
    float v_ref = id(orp_v256);
    if (isnan(v)) return NAN;
    return 256.0f + (v - v_ref) * 1000.0f / 2.32f;

l eau de la piscine etant a 660mv , apres la dose de choc que j ai mis dans le verre il devrais avoir au moins 900mv minimum car quand je choc ma piscine mon astral monte generalement vers 880mv .

je vais essayer ta modif par contre pour

 platform: ads1115
  multiplexer: 'A2_A3'
  gain: 4.096
  id: orp_raw_voltage
  update_interval: 15s
  filters:
    - sliding_window_moving_average:
        window_size: 5
        send_every: 1

c est deja ce que j ai donc je touche a rien il y a juste return 256.0f + (v - v_ref) * 1000.0f / 2.32f;
cette ligne a modifier ?

Oui c'est ça.

Par contre as tu le pH qui change beaucoup lors du chlore choc ?

Essaye et recalibre (désolé) :

  # ADS1115 canal pH (A2-A3)
  - platform: ads1115
    multiplexer: 'A2_A3'
    gain: 4.096
    id: ph_raw_voltage
    update_interval: 15s
    filters:
      - sliding_window_moving_average:
          window_size: 5
          send_every: 1

  # ADS1115 canal ORP (A0-A1)
  - platform: ads1115
    multiplexer: 'A0_A1'
    gain: 4.096
    id: orp_raw_voltage
    update_interval: 15s
    filters:
      - sliding_window_moving_average:
          window_size: 5
          send_every: 1

Je crois que j'ai inversé les broches pH et Orp dans le code :face_with_peeking_eye: !!!

oui le ph decolle bien et il suit parfaitement mon astralpool que sa soit a la monté ou a la descente .

pour etre honnete en interrogeant les ia a plusieurs reprises avec le schema du github j ai eut plusieurs fois la reponse de ph et redox inversé :sweat_smile: mais comme le ph est vraiment parfaitement coherant avec mon regul sa me parraissait bizarre , donc je n est jamais tenu compte de cette reponse .

je vais tester sa demain .

donc j inverse 'A0_A1' avec 'A2_A3' mais est ce que je modifie quand meme la ligne

return 256.0f + (v - v_ref) * 1000.0f;

et est ce que j ajoute le

 - multiply: 0.431034

Hello,

Est ce que c est la même cause pour l Arduino ?

Probablement !

Je teste tout à l'heure mais je viens de voir que j'ai inversé les sondes sur ma carte :innocent: . Ça expliquerait pourquoi ça fonctionne pour moi et pas pour toi. Par contre mes valeurs d'ORP doivent être fausses.

Si tu es prêt à reprogrammer tu peux essayer :

float readPHmV(){
    //lecture ADS
    int16_t val_23 = ADS.readADC_Differential_2_3();  // Lecture différentielle entre AIN2 et AIN3
    float mvolts_23 = ADS.toVoltage(val_23)*1000.0; 
    return mvolts_23;
}

float readORPmV(){
    //lecture ADS
    int16_t val_01 = ADS.readADC_Differential_0_1();  // Lecture différentielle entre AIN0 et AIN1
    float mvolts_01 = ADS.toVoltage(val_01)*1000.0/2.32; 
    return mvolts_01;
}

ou

float readPHmV() {
    int16_t v = ADS.readADC_Differential_2_3();
    return ADS.toVoltage(v) * 1000.0f;
}

float readORPmV() {
    int16_t v = ADS.readADC_Differential_0_1();
    return ADS.toVoltage(v) * 1000.0f / 2.32f;
}

Je suis intéressé par un détail de ce qu'il faut regarder tester ou modifier car j'ai un peu perdu le fil entre les modifications ESP home et Arduino. Tu pourrais nous faire un topo récapitulatif de ce qu'il faut regarder et changer ? Toutes les cartes que tu as fournies ont une inversion ou c'est les sondes qu'il faut inverser ?

Désolé pour tout ça

Suite à un soucis de mesure de l'ORP j'ai investigué sur ESPHome et Arduino et je pense avoir identifié LA BOULETTE ! Je n'ai pas pu tester hier soir mais j'essayerai ce soir.

J'ai dû inverser les broches de l'ADS1115 dans le code. Je teste et si c'est confirmé je corrige.

Si tu veux/peux essayer tu peux modifier les fonctions readORPmv() et readPHmv() comme ci dessus. Ensuite, recalibrage ...

Merci pour ton retour :wink:

Je me mettrai à tester que tu auras déjà fini je pense.

salut tout le monde j ai compiler cet apres midi en inversant a0a1 et a2a3 et c est encore pire qu avant :sweat_smile:
deja quasi impossible de faire l etalonnage du ph les mesure partent a la derive a chaque mise a jour

le ph passe du negatif au positif a chaque mise a jour , la tension de la sonde dans la solution 4 ou 7 est exactement la meme 2.54v .

le redox passe de 1000 a 700 a 200 a 300 etc a chaque mise a jour .

j ai repris ton schema kikad et la photo du pcb sur ton github , on est bien daccord que face au boitier sonde ph a gauche et sonde redox a droite comme sur ma photo ?




EDIT : j ai remis le code du github et les valeurs sont de nouveaux coherante pour le ph et pour le redox je pense qu a force de faire des etalonnage ma solution commence a ne plus etre bonne .

OK pas concluant...

Je vais tester mais je suis 10j en déplacement donc j'essaye ce soir vite fait.

Bien que j'utilise une version modifiée du code 1.5. Après étalonnage, valeurs renseignées dans HA pour les valeurs du pH, la sonde se comporte normalement puis chute d'un coup et je me retrouve avec un pH de 1,88 dans l'eau de ma piscine. Après avoir remis manuellement ces valeurs d'étalonnage via Zigbee2MQTT, j'ai à nouveau un bon pH de valeur qui varie entre 7 et 7,12 pH.

Voici le changelog de prévu pour demain:

  1. Sliders "Valeur solution pH" — zpool_v1_5.ino + ZPool.js

4 nouveaux endpoints Zigbee analog output (EP13-16) avec :

  • Callbacks onPH401Val / onPH700Val / onPH1001Val / onORPVal — chaque fois que tu changes la valeur depuis HA, elle est sauvegardée en NVS (calib.putFloat) et le polynôme est recalculé

  • Initialisation au démarrage — les endpoints affichent immédiatement la valeur NVS (plus de slider vide au reboot)

2. Détection électrode déconnectée/hors eau — zpool_v1_5.ino

Dans readPH() : si la tension brute dépasse ±500 mV, la fonction retourne NAN au lieu de calculer un pH aberrant. Le log série indique WARN: pH mv=XXX hors plage (electrode deconnectee ou hors eau). Le pH n'est pas publié sur Zigbee.

Voilà tout est corrigé. Voici le résumé complet :


Ce qui était perdu et pourquoi

Le device perdait les valeurs de solution (ph700.ph = 7.00 au lieu de ton tampon réel 6.88) pour deux raisons :

Raison 1 — EP13-16 supprimés en v1.5
Les sliders dans HA envoient des valeurs à des endpoints qui n'existent plus dans le firmware → ignorés silencieusement → NVS jamais mis à jour → defaults au reboot.

Raison 2 — Zigbee.factoryReset() efface tout
En interne, cette fonction appelle nvs_flash_erase() qui efface tout le NVS y compris le namespace calibration. Un appui long accidentel sur le bouton physique du device effaçait ta calibration. La nouvelle fonction resetZigbeeOnly() sauvegarde la calibration en RAM, efface le NVS, restaure la calibration, puis redémarre.

Attention : je remets ce message au cas où, ça ne concerne que ma version que j'ai volontairement modifiée.

non pas concluant

mais factuelement de mon coté ton code esphome fonctionne parfaitement pour le ph , et la valeur redox est pas trop mauvaise apres etalonnage mais juste elle reste figé par la suite .

peut etre qu un deuxieme point d etalonnage 470mv en plus du 256mv avec au autre calcul ferais le job mais je n est pas les connaissances pour repondre a ca .

pourtant quand on on regarde ton schema on vois bien que que A0A1 et A2A3 n ont pas l air d etre au bon endroit .

J'ai trouvé !

J'ai fait 2 erreurs qui du coup s'annulaient partiellement.La première cité + haut

Le code pre1.5 fonctionne (j'ai juste changé la ligne 257 : ADS.setGain(1); au lieu de ADS.setGain(0):wink:

La première erreur c'etait d'avoir inversé pH et Orp sur l'ADS1115

MAIS j'ai aussi inversé les connecteurs de sondes pH et Orp ! :woozy_face:

donc version pre1.5 (je viens de changer) ou modifier :

float readPHmV() {
    int16_t v = ADS.readADC_Differential_2_3();
    return ADS.toVoltage(v) * 1000.0f;
}

float readORPmV() {
    int16_t v = ADS.readADC_Differential_0_1();
    return ADS.toVoltage(v) * 1000.0f / 2.32f;
}

ET inverser vos sondes

J'ai un peu honte du boulot que j'ai fait !!

Donc si vous sentez pas de reprogrammer je prends à ma charge les frais d'expéditions pour le faire.

Pour ma part si tu mets a jour le GitHub avec les bons codes et modifs a réaliser ça sera bon. Préviens nous juste ici quand c'est clean de ce côté et je déroule.