HA-Gestion piscine-5_Régulation du Ph

Intro

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

Voir l’article

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.

Cahier des charges

  • 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.

Descriptif fonctionnel

Code

- id: '1624083693650'
  alias: 3_2_1 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
    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
  - 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"-}}{{states("sensor.date_time")
            }}
          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

Automatisme « Piscine pH Injection »

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 « 3_2_2 Piscine-pH Injection ».

Fonctionnement

Codage

- id: '1624811066593'
  alias: 3_2_2 Piscine-pH Injection
  description: 'Injection pH '
  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"-}}{{states("sensor.date_time")
        }}
      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"-}}{{states("sensor.date_time") }}
      title: Piscine Fin injection pH !!!
  mode: single

Automatisme « Piscine Notifications pH »

Descriptif Fonctionnel

Code

- id: '1634204887702'
  alias: 3_2_3 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: numeric_state
    entity_id: sensor.ph_stat_standard_deviation
    id: ph_mauvais
    above: '0.1'
  - 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"-}}{{states("sensor.date_time")
            }}
          title: Piscine Alerte pH !!!
    - conditions:
      - condition: trigger
        id: ph_haut
      sequence:
      - service: notify.telegram
        data:
          message: Ph Haut = {{states('sensor.ph_piscine_ph') }}{{-"\n"-}}{{states("sensor.date_time")
            }}
          title: Piscine Alerte pH !!!
    - conditions:
      - condition: trigger
        id: ph_mauvais
      sequence:
      - service: notify.telegram
        data:
          message: pH Mauvais-sonde à calibrer??{{-"\n"-}} Median = {{states("sensor.ph_stat_median")}}{{-"\n"-}}
            Deviation(S=0.01) = {{states("sensor.ph_stat_standard_deviation")}} {{-"\n"-}}{{states("sensor.date_time")
            }}
          title: Piscine Alerte pH !!!
    - 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"-}}{{states("sensor.date_time") }}
          title: Piscine Alerte niveau Bas Bidon pH !!!
    default: []
  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"

Déclaration des entités

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.

Liste des publications en lien avec cet article

  1. Filtration
  2. Mesure de puissance électrique
  3. Mise à niveau automatique
  4. Mesure du pH
  5. Régulation du Ph
  6. Mise Hors Gel

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.