Calcul temp filtration piscine / température eau

Bonjour à tous,
Je souhaite indexer le temp de filtration de ma piscine à la température de l’eau.
Tout les matins à une heure déterminée (9h par exemple) je souhaite calculer le temp de filtration de la piscine pour la journée en fonction de la température de l’eau et lancer la filtration pour cette durée.
J’ai créé un sensor qui calcul en divisant par 2 la température de l’eau :

## calcul tmp filtration piscine
  - platform: template
    sensors:
      tmpfiltrationpiscine:
        value_template: "{{ (states('sensor.temp_piscine') | float / 2) | round(1) }}"

  • un input date time pour la durée de filtration
  • automatisation pour calculer la durée du jour
alias: Calcul tmp filtration piscine
description: ''
trigger:
  - platform: time
    at: '09:00'
condition: []
action:
  - service: input_datetime.set_datetime
    target:
      entity_id: input_datetime.duree_pompe_piscine
    data:
      time: ' tmpfiltrationpiscine'
mode: single

Il faudrait pouvoir convertir « tmpfiltrationpiscine » en durée pour que cela fonctionne.
Merci par avance de votre aide

System Health

version core-2021.12.10
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.9.7
os_name Linux
os_version 5.10.63-v8
arch aarch64
timezone Europe/Paris
Home Assistant Community Store
GitHub API ok
Github API Calls Remaining 5000
Installed Version 1.21.0
Stage running
Available Repositories 973
Downloaded Repositories 12
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 7.2
update_channel stable
supervisor_version supervisor-2022.01.1
docker_version 20.10.9
disk_total 29.1 GB
disk_used 3.9 GB
healthy true
supported true
board rpi4-64
supervisor_api ok
version_api ok
installed_addons File editor (5.3.3), Terminal & SSH (9.3.0), Mosquitto broker (6.0.1), Samba share (9.5.1), Samba Backup (5.0.0), Zigbee2mqtt (1.22.2-1), SQLite Web (3.2.1)
Lovelace
dashboards 1
resources 10
views 5
mode storage

J’avance un peu avec :

value_template: {{ ((states('sensor.temp_piscine') | float / 2 *3600 )) | timestamp_custom("%H:%M", 0) }}

J’obtiens la bonne valeur avec l’outil de dévellopement et avec une température d’eau à 4.3°C : value_template: 02:09
Par contre si je copie la ligne dans le fichier configuration j’ai une erreur :

Error loading /config/configuration.yaml: invalid key: "OrderedDict([('((states(\'sensor.temp_piscine\') | float / 2 *3600 )) | timestamp_custom("%H:%M"', None), ('0)', None)])"
in "/config/sensors.yaml", line 381, column 0

Cela doit venir de la fonction timestamp_custom ?

Il y a cette intégration proposée par @oncleben31, mais je ne l’ai pas testée. Lui devrait pouvoir t’aider.

Jettes aussi un coup d’oeil sur ce post
https://forum.hacf.fr/t/filtration-piscine/3729

Autrement, le calcul de durée / heure pourrait être fait via un sensor template et du code jinja, puis injecté dans une automatisation ou alors le scheduler Schedy (ce serait mon choix).

MAIS perso, j’utilise maintenant une pompe à débit variable qui tourne 24h/24 à vitesse lente (180wh actuellement) et non 9h à vitesse rapide (2800wh avant). Je pilote alors juste la vitesse. La consommation électrique est le carré de la vitesse de filtration / débit, les pertes de charges sont fortes en vitesse rapide, d’où cette différence de consommation monstrueuse. La quantité filtrée en 24h sera la même mais la consommation est 80% en moins et donc amortissement du prix de la pompe en 2 saisons… Du coup, cela peut franchement valoir le coût de regarder cette alternative :innocent:

Salut @Argonaute et merci pour ton aide.
Bonne idée pour la pompe de filtration à vitesse variable. Je vais étudier la question.
Concernant l’intégration je souhaite faire plus simple et par moi même si possible.
Ce que je ne comprend pas c’est que cela fonctionne dans l’outil de dev :

Si je copie colle

## calcul tmp filtration piscine
  - platform: template
    sensors:
      tmpfiltrationpiscine:
        value_template: "{{ ((states('sensor.temp_piscine') | float / 2 ) * 3600) | timestamp_custom("%H:%M", 0) }}"

en ajoutant des «  » j’ai cette erreur :

Error loading /config/configuration.yaml: while scanning for the next token
found character '%' that cannot start any token
in "/config/sensors.yaml", line 381, column 103

Il y a quelque chose à faire pour « activer » le code jinja ?

Salut,
Moi j’utilise une automation qui s’execute tous les matin à minuit, qui définie l’heure de début et l’heure de fin de deux périodes (j’utilise deux périodes pour faire 2h matin et 2h aprem par exemple) et les renseigne dans des input_datetime. Et d’autres automations qui démarrent à l’heure définie pour allumer ou éteindre la filtration.

Voici en brut mon code :

- id: 3fa7e204a9ef472d88e731158a2baab7
  alias: durée automatique de filtration piscine
  trigger:
  - platform: time
    at: 00:00:00
  - platform: state
    entity_id: automation.duree_automatique_de_filtration_piscine
    from: 'off'
    to: 'on'
  condition: []
  action:
  - service: input_number.set_value
    data_template:
      entity_id: input_number.duree_cible_filtration
      value: "{% if states(\"sensor.temperature_piscine\") < '10' -%}\n  2\n{%- elif\
        \ states(\"sensor.temperature_piscine\") < '12'-%}\n  4\n{%- elif states(\"\
        sensor.temperature_piscine\") < '16'-%}\n  6\n{%- elif states(\"sensor.temperature_piscine\"\
        ) < '24'-%}\n  8\n{%- elif states(\"sensor.temperature_piscine\") < '27'-%}\n\
        \  12\n{%- elif states(\"sensor.temperature_piscine\") < '30'-%}\n  20\n{%-\
        \ elif states(\"sensor.temperature_piscine\") >= '30'-%}\n  24\n{%- else -%}\n\
        \  2\n{%- endif %}\n"
  - service: input_number.set_value
    data_template:
      entity_id: input_number.nb_periode_filtration
      value: "{% if states(\"sensor.temperature_piscine\") < '10' or states(\"sensor.temperature_piscine\"\
        ) >= '30' -%}\n  1\n{%- else -%}\n  2\n{%- endif %}\n"
  - service: input_datetime.set_datetime
    data_template:
      entity_id: input_datetime.filtration_piscine_p1_on
      time: "{% if states(\"sensor.temperature_piscine\") < '10' -%}\n  09:00\n{%-\
        \ elif states(\"sensor.temperature_piscine\") < '12'-%}\n  09:00\n{%- elif\
        \ states(\"sensor.temperature_piscine\") < '16'-%}\n  08:30\n{%- elif states(\"\
        sensor.temperature_piscine\") < '24'-%}\n  08:00\n{%- elif states(\"sensor.temperature_piscine\"\
        ) < '27'-%}\n  06:00\n{%- elif states(\"sensor.temperature_piscine\") < '30'-%}\n\
        \  02:00\n{%- elif states(\"sensor.temperature_piscine\") >= '30'-%}\n  00:01\n\
        {%- else -%}\n  17:00\n{%- endif %}\n"
  - service: input_datetime.set_datetime
    data_template:
      entity_id: input_datetime.filtration_piscine_p1_off
      time: "{% if states(\"sensor.temperature_piscine\") < '10' -%}\n  11:00\n{%-\
        \ elif states(\"sensor.temperature_piscine\") < '12'-%}\n  11:00\n{%- elif\
        \ states(\"sensor.temperature_piscine\") < '16'-%}\n  11:30\n{%- elif states(\"\
        sensor.temperature_piscine\") < '24'-%}\n  12:00\n{%- elif states(\"sensor.temperature_piscine\"\
        ) < '27'-%}\n  12:00\n{%- elif states(\"sensor.temperature_piscine\") < '30'-%}\n\
        \  12:00\n{%- elif states(\"sensor.temperature_piscine\") >= '30'-%}\n  23:59\n\
        {%- else -%}\n  17:30\n{%- endif %}\n"
  - service: input_datetime.set_datetime
    data_template:
      entity_id: input_datetime.filtration_piscine_p2_on
      time: "{% if states(\"sensor.temperature_piscine\") < '10' -%}\n  09:00\n{%-\
        \ elif states(\"sensor.temperature_piscine\") < '12'-%}\n  15:00\n{%- elif\
        \ states(\"sensor.temperature_piscine\") < '16'-%}\n  15:00\n{%- elif states(\"\
        sensor.temperature_piscine\") < '24'-%}\n  14:00\n{%- elif states(\"sensor.temperature_piscine\"\
        ) < '27'-%}\n  14:00\n{%- elif states(\"sensor.temperature_piscine\") < '30'-%}\n\
        \  13:00\n{%- elif states(\"sensor.temperature_piscine\") >= '30'-%}\n  00:01\n\
        {%- else -%}\n  18:00\n{%- endif %}\n"
  - service: input_datetime.set_datetime
    data_template:
      entity_id: input_datetime.filtration_piscine_p2_off
      time: "{% if states(\"sensor.temperature_piscine\") < '10' -%}\n  11:00\n{%-\
        \ elif states(\"sensor.temperature_piscine\") < '12'-%}\n  17:00\n{%- elif\
        \ states(\"sensor.temperature_piscine\") < '16'-%}\n  18:00\n{%- elif states(\"\
        sensor.temperature_piscine\") < '24'-%}\n  18:00\n{%- elif states(\"sensor.temperature_piscine\"\
        ) < '27'-%}\n  20:00\n{%- elif states(\"sensor.temperature_piscine\") < '30'-%}\n\
        \  23:00\n{%- elif states(\"sensor.temperature_piscine\") >= '30'-%}\n  23:59\n\
        {%- else -%}\n  18:30\n{%- endif %}\n"
  mode: single
- alias: Filtration piscine p1 ON
  trigger:
    platform: template
    value_template: '{{ states(''sensor.time'') == (state_attr(''input_datetime.filtration_piscine_p1_on'',
      ''timestamp'') | int | timestamp_custom(''%H:%M'', False)) }}'
  condition:
  - condition: state
    entity_id: automation.filtration_piscine_automatique
    state: 'on'
  action:
  - service: switch.turn_on
    data_template:
      entity_id: switch.filtration_piscine
  - service: notify.mobile_app_iphone
    data:
      title: Piscine
      message: Mise en route de la filtration
  id: 2a55ff31ac83431bb1df18c74cb5455a

Je connaissais pas du tout… Quand la mienne lâchera je regarderais ca du coup, merci.

Tu ne peux mettre des doubles quote dans une expression avec des double quote. Utilise les simples quote pour le format. Je te conseille aussi de forcer une valeur à 0 dans la conversion si jamais la température n’est pas définie : float (0).

## calcul tmp filtration piscine
  - platform: template
    sensors:
      tmpfiltrationpiscine:
        value_template: "{{ ((states('sensor.fibaro_piscine_temperature_eau') | float(0) / 2 ) * 3600) | timestamp_custom('%H:%M', 0) }}"

L’alternative est d’aller à la ligne pour ne plus avoir de double quote dans l’expression

## calcul tmp filtration piscine
  - platform: template
    sensors:
      tmpfiltrationpiscine:
        value_template: ->
          {{ ((states('sensor.fibaro_piscine_temperature_eau') | float(0) / 2 ) * 3600) | timestamp_custom("%H:%M", 0) }}

Super !! Ca fonctionne !
Merci beaucoup @Argonaute
Il fallait la trouver :grin:
Je vais essayer de l’inclure dans mon automatisation pour la pompe

Test de l’automatisation OK :+1:

alias: Pompe piscine automatique
description: ''
trigger:
  - platform: time
    at: input_datetime.heure_demarrage_pompe_piscine
condition:
  - condition: state
    entity_id: input_boolean.pompe_piscine_auto
    state: 'on'
action:
  - service: switch.turn_on
    target:
      entity_id: switch.contact_pompe_piscine
  - delay: '{{ states(''sensor.tmpfiltrationpiscine'') }}'
  - service: switch.turn_off
    target:
      entity_id: switch.contact_pompe_piscine
  - service: notify.telegram_sg
    data:
      message: Fin de filtration piscine
mode: single

Paramètre OK du Sensor :

## calcul tmp filtration piscine
  - platform: template
    sensors:
      tmpfiltrationpiscine:
        value_template: "{{ ((states('sensor.temp_piscine') | float(0) / 2 ) * 3600) | timestamp_custom('%H:%M', 0) }}"

Merci beaucoup !!

1 « J'aime »

Salut @stephg38,
Alors moi je débarque totalement dans le monde HA. Ce que tu viens de faire pour ta piscine m’intéresse beaucoup et je souhaitais le faire pour la mienne. Mais voilà je ne sais pas où je dois mettre tous les codes que tu as écris. Peux tu me guider ?

Merci @stephg38 !
Je n’ai pas de capteur de température dans ma piscine hors sol mais j’ai néanmoins une prise connectée qui alimente la pompe. La température de l’eau ne variant pas tous les jours non plus, j’ai crée un input number pour « simuler » une valeur de température.
J’ai repris ton sensor et ton automation tout en gardant la main sur la valeur de la température par un sélecteur :

Je viens de voir cet autre post ou tu as amélioré et détaillé ta configuration
tip top merci !

1 « J'aime »