HA-Gestion piscine-5_Régulation du Ph

Dans la série « gestion piscine », faisant suite aux articles publiés précédemment:

  1. Filtration
  2. Mesure de puissance électrique
  3. Mise à niveau automatique
  4. mesure du pH

Je vous propose de découvrir un dispositif de régulation du pH fait maison.

Avant de publier cet article, j’ai laissé passer un été de mise au point du process de régulation, c’est le temps que je me suis laissé pour obtenir un résultat fiable et publiable.

Puisque que le pH de ma piscine a tendance à augmenter de part la nature du traitement, il me faut donc injecter du pH-.

Je ne reviens pas sur la mesure de pH développé dans un article précédent, la mesure est considérée comme fiable.

La partie matérielle

La liste des courses se résume à:

  • Une pompe péristaltique acheté chez AliExpress. Alimentation en 220 VCa, débit variable de 0 à 7.2 l/h avec une pression de 0.1 bar.
  • Du liquide pH- disponible dans les boutiques spécialisées dans le traitement des piscines.
  • Un module de pilotage avec un relais équipé d’un contact sec et intégrable dans HA ‘switch’. Dans mon cas j’utilise un automate WAGO série 750 communiquant en Modbus, équipé d’une carte d’entrées pt100, d’une carte d’entrées digitales et d’une carte de sortie relais.

Bien entendu, cet automate peut être remplacé par n’importe quel dispositif compatible HA, remplissant les mêmes fonctionnalités.

Descriptif fonctionnel

Le cahier des charges est le suivant:

  • Fonctionne en mode automatique
  • Validation du mode automatique simple d’emploi.
  • Les paramètres doivent être accessibles et modifiables
  • Notification en cas de pH hors limite
  • Notification du début et fin de cycle
  • Notification du volume de pH- injecté et utilisé

La partie logicielle

Automatisme « Piscine pH Validation Automatismes »

Cet automatisme valide d’autres automatismes lorsque la pompe de filtration tourne depuis 15mn, le temps nécessaire à la stabilisation des mesures.

Trigger:
  • Marche pompe depuis 15 mn (id=ma_pump)
  • Arrêt pompe depuis 10s (id=at_pump)
  • Arrêt régulation pH (id=regule_ph_off)
Choix 1
Trigger:
  • id=ma_pump
Condition:
  • Regul ph = on
Actions
  • Les automatismes sont validés:
    • – automation.piscine_injection_v2
    • – automation.ph notifications
  • Notification « début injection »
Choix 2
Trigger:
  • id=at_pump
Condition:
  • sans
Actions
  • Les automatismes sont dé validés:
    • – automation.piscine_injection_v2
    • – automation.ph notifications
  • Notification « fin injection »
Choix 3
Trigger:
  • id=regule_ph_off
Condition:
  • sans
Actions
  • Les automatismes sont dé validés:
    • – automation.ph notifications
    • – automation.piscine_injection_v2
  • Notification « fin injection »
- id: '1624083693650'
  alias: Piscine pH Validation Automatismes
  description: 'Valide les automations régulation pH au bout de 1 h de fonctionnement '
  trigger:
  - platform: state
    entity_id: binary_sensor.pool_pump_running
    for:
      hours: 0
      minutes: 15
      seconds: 0
      milliseconds: 0
    to: 'on'
    from: 'off'
    id: ma_pump
  - platform: state
    entity_id: binary_sensor.pool_pump_running
    id: at_pump
    from: 'on'
    to: 'off'
    for:
      hours: 0
      minutes: 0
      seconds: 10
      milliseconds: 0
  - platform: state
    entity_id: input_boolean.regul_ph
    id: regule_ph_off
    from: 'on'
    to: 'off'
  condition: []
  action:
  - choose:
    - conditions:
      - condition: trigger
        id: ma_pump
      - condition: state
        entity_id: input_boolean.regul_ph
        state: 'on'
      sequence:
      - service: automation.turn_on
        target:
          entity_id:
          - automation.piscine_injection_v2
          - automation.piscine_notification_ph
      - service: notify.telegram
        data:
          message: pH sonde= {{states('sensor.ph_piscine_ph')}} {{-"\n"-}}{{as_timestamp(strptime(now(),
            "")) | timestamp_custom('%d/%m/%y-%H:%M:%S')}}
          title: Piscine Activation Traitement pH !
    - conditions:
      - condition: trigger
        id: at_pump
      sequence:
      - service: automation.turn_off
        target:
          entity_id:
          - automation.piscine_injection_v2
          - automation.piscine_notification_ph
    - conditions:
      - condition: trigger
        id: regule_ph_off
      sequence:
      - service: automation.turn_off
        target:
          entity_id:
          - automation.piscine_injection_v2
          - automation.piscine_notification_ph
    default: []
  mode: single

Calcul du temps d’injection

Ce calcul est réalisé avec deux « template », l’un pour les minutes, l’autre pour les secondes, déclarés dans le fichier « ph.yaml ».

Durée en minutes:

      ph_tps_inject_mn:
        friendly_name: "pH Durée Inject calc. (mn)"
        value_template: >-
          {% set a=states('sensor.ph_piscine_ph') | float %}
          {% set b=states('input_number.ph_cible') | float %}
          {% set d=states('input_number.ph_debit_ppe') | float %}
          {% set e=states('input_number.ph_concentration') | float %}
          {% set r=(((a-b)/(e/100))/d)*3600|round(2)|int %} 
          {% if r < 0 %}
            {{ 0 }}
          {% else %}
            {{ (r//60)|int }}
          {% endif %}
        unit_of_measurement: "mn"

Calcul basé sur l’écart entre la mesure et la cible (a-b), divisé par la concentration (e en %) et le débit de la pompe (d en l/h), converti en secondes (*3600), et si supérieur à 0, le résultat est la partie entière de la division par 60 ((r//60)|int).

Durée en secondes:

      ph_tps_inject_s:
        friendly_name: "pH Durée Inject calc. (s)"
        value_template: >-
          {% set a=states('sensor.ph_piscine_ph') | float %}
          {% set y=state_attr("sensor.ph_stat", "mean") | float %}
          {% set x=states('input_number.simul_ph') | float %}
          {% set b=states('input_number.ph_cible') | float %}
          {% set d=states('input_number.ph_debit_ppe') | float %}
          {% set e=states('input_number.ph_concentration') | float %}
          {% set r=(((a-b)/(e/100))/d)*3600|round(2)|int %} 
          {% if r < 0 %}
            {{ 0 }}
          {% else %}
            {{ (r%60)|int }}
          {% endif %}
        unit_of_measurement: "s"

Même calcul que pour les minutes, mais le résultat est le reste de la division par 60 ((r%60)|int)

Ces deux templates sont utilisés dans l’automatisme suivant.

Automatisme « Piscine pH Injection »

Trigger:
  • Déclenché toutes les minutes.
Conditions:
  • si la mesure de ph est supérieure à la cible et supérieure à 0
  • Régulation ph validée

Actions:

  • Mémorisation de la durée d’injection en minutes et secondes dans des « input_number »
  • Mise en fonctionnement de la pompe péristaltique d’injection de pH,
  • Notification du début d’injection,
  • Attente selon le délai calculé avec la durée d’injection
  • Ajout du volume injecté dans « input_number.ph_vol_injecte »
  • Arrêt de la pompe de pH
  • Notification de la durée et du volume injecté
- id: '1624811066593'
  alias: Piscine pH Injection
  description: ''
  trigger:
  - platform: time_pattern
    hours: /1
  condition:
  - condition: template
    value_template: '{% set a=states(''sensor.ph_piscine_ph'') | float %}

      {% set b=states(''input_number.ph_cible'') | float %}

      {{ a > b }}'
  - condition: numeric_state
    entity_id: sensor.ph_piscine_ph
    above: '0'
  - condition: state
    entity_id: input_boolean.regul_ph
    state: 'on'
  action:
  - service: input_number.set_value
    target:
      entity_id: input_number.ph_duree_inject_s
    data_template:
      value: '{{ states(''sensor.ph_tps_inject_s'')|float }}'
  - service: input_number.set_value
    target:
      entity_id: input_number.ph_duree_inject_mn
    data_template:
      value: '{{ states(''sensor.ph_tps_inject_mn'')|float }}'
  - service: switch.turn_on
    target:
      entity_id:
      - switch.cde_traitement
  - service: notify.telegram
    data:
      message: pH sonde= {{states('sensor.ph_piscine_ph')}} {{-"\n"-}}{{as_timestamp(strptime(now(),
        "")) | timestamp_custom('%d/%m/%y-%H:%M:%S')}}
      title: Piscine Début injection pH !!!
  - delay: 00:{{ states('input_number.ph_duree_inject_mn')|int}}:{{ states('input_number.ph_duree_inject_s')
      | int }}
  - service: input_number.set_value
    data_template:
      entity_id: input_number.ph_vol_injecte
      value: '{% set a=states(''input_number.ph_vol_injecte'')|float %} {% set b=states(''input_number.ph_debit_ppe'')|float
        %} {% set c=states(''input_number.ph_duree_inject_s'')|float %} {% set d=states(''input_number.ph_duree_inject_mn'')|float
        %} {{a+( (b*((d*60)+c)/3600))|round(2) }}'
  - service: switch.turn_off
    target:
      entity_id: switch.cde_traitement
  - service: notify.telegram
    data:
      message: pH sonde= {{states('sensor.ph_piscine_ph')}}{{-"\n"-}} Vol Injecté
        =  {% set b=states('input_number.ph_debit_ppe')|float %} {% set c=states('input_number.ph_duree_inject_s')|float
        %} {% set d=states('input_number.ph_duree_inject_mn')|float %} {{(b*((d*60)+c)/3600)|round(2)
        }} l {{-"\n"-}}{{as_timestamp(strptime(now(), "")) | timestamp_custom('%d/%m/%y-%H:%M:%S')}}
      title: Piscine Fin injection pH !!!
  mode: single

Calcul du niveau bas bidon pH

Niveau bas bidon = on si Volum_bidon-volume_injecté inferieur au seuil bas

  - platform: template
    sensors:
      ph_niveau_bas_bidon:
        value_template: >-
          {% set a=states('input_number.ph_vol_bidon')|float %}
          {% set b=states('input_number.ph_vol_injecte')|float %}
          {% set c=states('input_number.ph_seuil_bas_bidon')|float %}
          {{ (a-b) <= c }}   
        friendly_name: "pH Seuil Niveau Bas Bidon"

Automatisme « Piscine Notifications pH »

Trigger:
  • mesure pH inférieur à 6.8 (id=ph_bas)
  • mesure pH supérieur à 7.8 (id=ph_haut)
  • Déviation pH supérieure à 0.1 (id=ph_mauvais)
  • Niveau bas bidon pH (niv_bas_bidon)
Choix 1
Trigger:
  • id=ph_bas
Condition:
  • sans
Actions
  • notification « pH bas »
Choix 2
Trigger:
  • id=ph_haut
Condition:
  • sans
Actions
  • Notification « ph_haut »
Choix 3
Trigger:
  • id=ph_mauvais
Condition:
  • sans
Actions
  • Notification « pH mauvais »
Choix 4
  • id=niv_bas_bidon
Trigger:
Condition:
  • sans
Actions
  • Notification « niveau bas bidon »
- id: '1634204887702'
  alias: Piscine pH Notifications
  description: Notifie Ph bas, haut, anormal, bidon bas
  trigger:
  - platform: numeric_state
    entity_id: sensor.ph_piscine_ph
    below: '6.8'
    above: '0'
    id: ph_bas
  - platform: numeric_state
    entity_id: sensor.ph_piscine_ph
    id: ph_haut
    above: '7.8'
  - platform: template
    value_template: '''{{state_attr("sensor.ph_stat", "standard_deviation") | float  >  0.1}}'''
    id: ph_mauvais
  - platform: state
    entity_id: binary_sensor.ph_niveau_bas_bidon
    id: niv_bas_bidon
    to: 'on'
  condition: []
  action:
  - choose:
    - conditions:
      - condition: trigger
        id: ph_bas
      sequence:
      - service: notify.telegram
        data:
          message: Ph Bas = {{states('sensor.ph_piscine_ph') }}{{-"\n"-}}{{as_timestamp(strptime(now(),
            "")) | timestamp_custom('%d/%m/%y-%H:%M:%S')}}
          title: Piscine Alerte pH !!!
    - conditions:
      - condition: trigger
        id: ph_haut
      sequence:
      - service: notify.telegram
        data:
          message: Ph Haut = {{states('sensor.ph_piscine_ph') }}{{-"\n"-}}{{as_timestamp(strptime(now(),
            "")) | timestamp_custom('%d/%m/%y-%H:%M:%S')}}
          title: Piscine Alerte pH !!!
    - conditions:
      - condition: trigger
        id: ph_mauvais
      sequence:
      - service: notify.telegram
        data:
          message: ORP Mauvais sonde à calibrer??{{-"\n"-}} Moyenne = {{state_attr("sensor.orp_stat",
            "mean")}}{{-"\n"-}} Deviation(S=0.01) = {{state_attr("sensor.orp_stat",
            "standard_deviation")}} {{-"\n"-}}{{as_timestamp(strptime(now(), ""))
            | timestamp_custom('%d/%m/%y-%H:%M:%S')}}
          title: Piscine Alerte ORP !!!
    - conditions:
      - condition: trigger
        id: niv_bas_bidon
      sequence:
      - service: notify.telegram
        data:
          message: Volume Restant = {{(states("sensor.ph_volume_restant_bidon"))|round(2)
            }} l{{-"\n"-}}{{as_timestamp(strptime(now(), "")) | timestamp_custom('%d/%m/%y-%H:%M:%S')}}
          title: Piscine Alerte niveau Bas Bidon pH !!!
    default: []
  mode: single

Les automatismes sont à copier/coller.

Les déclarations des entités sont disponibles dans le fichier ph.yaml à télécharger.

Interface lovelace

Les interfaces ont été décrits dans l’article sur la filtration.

Conclusion

Une régulation de pH complète qui donne de bons résultats, cependant vous pouvez dans un premier temps supprimer les fonctionnalités qui vous semblent superflues.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

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