Electrolyseur E-Pool Technologie Justsalt

Oui en effet, 'vous avez une idée pour simuler avec un bouton dans home assistant la fermeture du volet piscine pour le Justsalt ?

non aucune idée, perso pour l’ouverture de mon volet, ce que j’ai fait, c’est d’installer un fingerbot zigbee sur la télécommande. Ca fonctionne très bien.Pour la fermeture c’est plus compliqué je n’ai pas encore fait mais avec un autre finger bot sur la télécommande en réglant sur 2 fois 45s, je pense qu’on peut simuler la fermeture, après, il faut voir si la consommation de la pile ne sera pas trop importante.

Est-ce que vous avez le même problème que moi ? Quand la pompe et l’electrolyseur se coupent électriquement (prise connectée), je perds l’appairage et je dois repasser par le menu appairage de l’ePool .
Si oui, comment avez-vous fait pour que l’appairage soit conservé ? J’ai essayé de redémarrer ou de couper l’electriquement l’ESP, ça ne change rien

Bonjour ,
J’ai un serveur WES ,
je met l’electrolyseur à 0 ( = OFF ) ( modification du programme avec pour échelle mini = 0 en valeur d’electrolyse )puis je le coupe électriquement , puis je coupe ma commande de pompe et ensuite électriquement la pompe . ( je séquence l’arrêt pour ne pas faire un OFF brutal sur tout le système ,… déformation professionnelle )
Et redémarrage dans l’autre sens , pas de soucis le pairage est toujours valide ( pour info j’ai un RACER 17/80 )

ok merci, mais chez moi, c’est une prise qui alimente la pompe ET l’ePool donc je ne peux pas séquencer l’allumage et je n’ai pas moyen de mettre à 0 l’electrolyseur. De plus, j’ai une horloge mécanique sur le boitier du pisciniste qui fait la même chose que la prise connectée donc prise ou pas prise, c’est pareil. D’ailleurs avec l’iphone, j’avais même problème, tous les jours je devais réapparairer

pour mettre à 0 j’ai modifié l’echelle de production

id: production_consigne
name: "production Consigne"
icon: "mdi:cog-outline"
unit_of_measurement: "%"
min_value: 0                    
max_value: 100

dans production consigne , le min_value à 0 correspond à OFF sur le Racer

1 « J'aime »

D’accord merci pour le code. :ok_hand:Mais en quoi cela joue-t-il sur l’appairage au redémarrage ???

Sur le Racer , je ne vois pas , le fait de le mettre en OFF c’est juste pour un arret propre .
Je testerai sans le OFF pour voir si je perd l’appairage

je test …

Le test est simple et rapide :
OFF , 10 % , 50 %
l’electrolyseur redémarre et l’appairage fonctionne .

A vérifier : le module ESP32 lui est toujours en fonctionnement avec son alimentation , pas de coupure électrique . (je ne coupe pas mes ESP en alimentation …sauf pour mes volets mais le principe de fonctionnement est différent)

Alors si je modifie le code ou m’est à jour l esp le reappairrage est quasi systématique. Mais sinon pas besoin. L electroliseur est asservi à. La. Pompe qui est asservi à un tongou

Alors est-ce que ca ne sera pas parce que mon esp est à 5m de l’ePool séparé par un mur ?? Demain, j’essaie de le rapprocher le plus possible de l’électrolyseur, on verra bien

Oui alors le bluetooth c est 10m en champs libre alors avec un mur ça peut être compliqué. c’est pas le protocole le plus sympa à utilisémer mais pas Le. Choix. J’ai du le déplacer dans le local piscine avec un cpl je suis pas fan mais ça marche niquel

Bizarre, ce matin, après allumage de la pompe et de l’ePool, sans rien changer au niveau de l’esp, la connexion s’est faite normalement. Du coup je ne touche rien jusqu’à la prochaine déconnexion.

Bonjour, j’ai mis la version ESP Home avec les valeurs globales pour optimiser, et ça marche bien.

Cependant, j’ai une valeur complètement fausse: la température notamment qui indique 260°C alors que ça devrait être 30°C ou 31°C selon l’affichage du JustSalt (la mesure de température dans le pool house surestime quand il fait très chaud, j’ai une autre sonde dans mon skimmer).

[EDIT 5] J’ai trouvé la raison: dans ton code que j’ai copié-collé (depuis Electrolyseur E-Pool Technologie Justsalt - #171 par Ricky_D) il y avait

static_cast<float>( x[index + 2]<< 8) + (x[index +3]) /10

au lieu de

( static_cast<float>( x[index + 2]<< 8) + x[index +3]) /10

ce qui fait que seulement le bit de poids faible était divisé par 10.
En dessous de 25,6°C on ne voit rien, après ça fait une énorme différence.

[EDIT 2] J’ai été obligé de neutraliser la partie « write » parce que sinon mon electrolyseur se retrouvait en permanence dans le menu de réglage du volume d’eau. Je n’ai pas repéré de modification intempestive des valeurs, juste une activation de ce menu.

[EDIT 3] Je pense que temp08 est chez moi un offset qui correspond à l’étalonnage de température. À tous les coups il est dispo quelque part en écriture aussi.

[EDIT 4] Je pense que chez moi les capteurs d’injection PH- et PH+ sont à l’envers (activé ↔ désactivé).


@Ricky_D J’aimerais bien essayer de transformer ton travail en intégration Home Assistant (en utilisant le nouveau système Bluetooth ce qui permet d’utiliser les ESP en répéteur). Ça permettrait d’avoir l’avantage de la version compilée de ton GitHub mais avec plus de facilité car ça réutilise toute l’infrastructure Bluetooth de HA. Et d’avoir un config flow pour une expérience utilisateur plus simple. Voire même de l’auto discovery.

C’est basé sur bleak et bluetooth-sensor-state-data donc malheureusement c’est pas tout à fait la même API que NimbleBLE et ArduinoHA que tu utilises. Ça devrait pas être trop compliqué non plus en s’inspirant de https://github.com/home-assistant/core/tree/dev/homeassistant/components/oralb et oralb-ble/src/oralb_ble at main · Bluetooth-Devices/oralb-ble · GitHub

[EDIT] J’ai oublié le lien vers la doc

Qu’en penses-tu ?

J’ai aussi découvert que le capteur de volet était disponible en faisant
tempE1 & (1 << 48)
si tempE1 est considéré comme un entier, ou
tempE1[17]
si tempE1 est considéré comme une chaine (hexadécimale).

Ce capteur est à 1 quand le volet est fermé (le Justsalt affiche « Volet » à la place de la consigne d’électrolyse), 0 sinon. Donc inversé par rapport aux binary_sensor de volet dans HA.

Bonsoir,
J ai repris le développement ce weekend après une longue absence.
Me reste a ajouté vos remarques et avancement
Je vous partage ça dès que possible
J ai bcp de lecture en retard
voila ce que ca donne !
Wifi manager intégrer , du coup , plus besoin de paramétrage sur l ESP32
quand ESP démarre pour la première fois il créer un point accès wifi « JustSaltMQTT » avec le password « password »

vous arrivez automatiquement sur la page

si vous cliquer sur « Configuration » vous arriver sur la page


ainsi vous avez accès au paramétrage du réseau wifi et du serveur MQTT

une fois la connexion Wifi établie , la détection de l électrolyseur commence et vous pouvez allez voir la liste des valeurs


j ai encore quelque erreur de remonte d état mais en principe j ai inclus la gestion du volet

aujourd’hui j ai désactivé l écriture des setting du e-pool mais des que je peux je mi récole

1 « J'aime »

Bonjour,

J’ai sous la main un racer 17/80 ainsi qu’un esp32. Y a t’il un endroit où je peux trouver la dernière version du code pour Esphome ou la version MQTT ?

Merci

Bonjour , j’ai le meme modèle .
Soit tu récupère une des dernière version dans la fin du post .
Soit tu va sur le github de Ricky_D pour la version Mqtt ( je n’ai pas réussi à la faire fonctionner avec mon Racer )

Soit tu peux aussi tester ma version que j’ai modifié et allégée pour le Racer ( je ne suis pas un pro du code , mais cela fonction avec mon electrolyseur ) mon Broker MQTT est encore sur Jeedom et pas sur HA , il faudra peut etre adapter
Je n’ai mis que les infos pour mon Racer

esphome:
  name: racer
  friendly_name: Racer

esp32:
  board: esp32dev
  framework:
    type: arduino

substitutions:
  mac_justsalt: "Adresse Mac de ton Racer"
  service_uuid: '09912756-7b32-4629-aeb1-b309d9a338ae'
  characteristic_uuid: 'ef785c24-22bb-463d-b651-0b7445ba091c'
  characteristic_uuid_write: '4d32c5e5-2bb5-45c6-8c89-6f59bb3930d2' 

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "7HNJZjY/xxxxxxxxxxxxxxxxxxxxxxxpycMN4p+xxW5g="

ota:
  - platform: esphome
    password: "esphome"

mqtt:
  broker: 192.168.0.76
  port: 1883
  username: ""
  password: "" 

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Racer Fallback Hotspot"
    password: "E1UoOxxxxxx"

bluetooth_proxy:
  active: true

time:
  - platform: homeassistant
    id: homeassistant_time_5m
    on_time:
      - seconds: 0
        minutes: /5
        then:
          - switch.turn_off: ble_switch_com
          - delay: 20s
          - switch.turn_on: ble_switch_com

ble_client:
  - mac_address:  ${mac_justsalt}
    auto_connect: true
    id: JustSaltPro
    on_connect:
      then:
        - ble_client.numeric_comparison_reply:
            id: JustSaltPro
            accept: True

binary_sensor:
  - platform: ble_presence
    mac_address: ${mac_justsalt}
    name: Electolyseur

number:
  - platform: template
    id: production_consigne
    name: "production Consigne"
    icon: "mdi:cog-outline"
    unit_of_measurement: "%"
    min_value: 0
    max_value: 100
    step: 5
    optimistic: true
    on_value: 
      then:
        - ble_client.ble_write:
            id: JustSaltPro
            service_uuid: ${service_uuid}
            characteristic_uuid: ${characteristic_uuid_write}
            value: !lambda |-
              ESP_LOGD("productionconsigne", "Option consigne change:  %f", id(production_consigne).state);   
              uint8_t statehex = id(production_consigne).state;
              return {0x00, 0x06, 0x03, 0x33, 0x01, statehex, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

  - platform: template
    id: inversion_consigne
    name: "inversion Consigne"
    icon: "mdi:alarm"
    unit_of_measurement: "h"
    min_value: 6
    max_value: 24
    step: 2
    optimistic: true
    on_value: 
      then:
        - ble_client.ble_write:
            id: JustSaltPro
            service_uuid: ${service_uuid}
            characteristic_uuid: ${characteristic_uuid_write}
            value: !lambda |-
              ESP_LOGD("inversionconsigne", "Option consigne change:  %f", id(inversion_consigne).state);   
              uint8_t statehex = id(inversion_consigne).state;
              return {0x00, 0x06, 0x03, 0x39, 0x01, statehex, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

text_sensor:
  - platform: template
    name: "tempE1"
    id: JustSalt_e1_textsensor

sensor:
  - platform: template
    name: "Compteur Heure de fonctionnement"
    id: JustSalt_temp0e_sensor
    accuracy_decimals: 0
    unit_of_measurement: "h"

  - platform: template
    name: "Temperature eau"
    id: JustSalt_temperature_sensor
    unit_of_measurement: "°C"
    accuracy_decimals: 1
    state_class: measurement
    device_class: temperature
   
  - platform: template
    name: "TDS"
    id: JustSalt_tds_sensor
    unit_of_measurement: "g/L"
    accuracy_decimals: 1
    state_class: measurement
    icon: mdi:water-opacity

  - platform: ble_client
    ble_client_id: JustSaltPro
    name: "traitement"
    id: sensor_state    
    service_uuid: ${service_uuid} #'09912756-7b32-4629-aeb1-b309d9a338ae'
    characteristic_uuid: ${characteristic_uuid} #'ef785c24-22bb-463d-b651-0b7445ba091c'
    type: characteristic
    # update_interval: 2m
    notify: True
    lambda: |-     
      std::string value2(x.begin(), x.end());
      std::string rawhex = format_hex_pretty((uint8_t *) value2.c_str(), value2.size()).c_str();
      //ESP_LOGW("raw_hex_boucle", "-- Recep Debut --");
      //ESP_LOGD("raw_hex", "%s", rawhex.c_str());
      rawhex.erase(std::remove(rawhex.begin(), rawhex.end(), '.'), rawhex.end());
      
      int index = 3;

      while (index +2 < x.size()) {
        uint8_t idvaleur = x[index];
        int taillevaleur = x[index + 1 ];
      
        switch (idvaleur) {
          case 0x00: { 
            }break;

          case 0x09: {
            uint16_t tempeauhex = ((x[index + 2]<< 8) + (x[index +3]));
            float tempeau = static_cast<float>(tempeauhex)/10;
            id(JustSalt_temperature_sensor).publish_state(tempeau);
            }break;
          
          case 0x0A: {
            uint8_t selhex = x[index + 2] ;
            float sel = static_cast<float>(selhex)/10;
            id(JustSalt_tds_sensor).publish_state(sel);
            }break;

          case 0x0E: {
            uint16_t temphex = ((x[index + 2]<< 8) + (x[index +3]));
            float temp = static_cast<float>(temphex);
            id(JustSalt_temp0e_sensor).publish_state(temp);
            }break;
             
          case 0x33: {
            uint8_t prodhex = x[index + 2] ;
            float prod = static_cast<float>(prodhex);
            id(production_consigne).publish_state(prod);
            }break;
 
          case 0x39: {
            uint8_t inversionhex = x[index + 2] ;
            float inversionval = static_cast<float>(inversionhex);
            id(inversion_consigne).publish_state(inversionval);
            }break;

          case 0xE1: {
            //  E1.0F.18.04.11.11.00.33.00.00.88.00.F8.00.00.00.00
            std::string tempstring = rawhex.substr((index + 2 )* 2, 30);
            id(JustSalt_e1_textsensor).publish_state(tempstring);
            }break;
            
          default: {
              ESP_LOGW("raw_hex_boucle", "idvaleur Non implementee %d", idvaleur);
            };
          }
        index = index + 2 + taillevaleur ;
      }
      //ESP_LOGW("raw_hex_boucle", "-- Recep FIN --");
      return 1;


switch:      
  - platform: restart
    name: JustSalt_Gatway restart    

  - platform: ble_client
    id: ble_switch_com
    ble_client_id: JustSaltPro
    name: "Activation Bluetooth"      

La valeur 0 en Production Consigne permet de mettre en OFF l’électrolyseur

1 « J'aime »