Calcul du temps restant d'un sensor [Resolu]

C’est que c’est une chaîne de caractère et non un format temp…

- platform: template
  sensors:
    temps_restant_programmation:
      friendly_name: "Temps restant de la programmation"
      value_template: >
        {% set end_time = strptime(states('climate.zone_0').attributes.quick_veto_end_date_time, "%Y-%m-%dT%H:%M:%S") %}
        {% set remaining_time = (end_time - now()).total_seconds() %}
        {% set hours = ((remaining_time // 3600) % 24) %}
        {% set minutes = ((remaining_time // 60) % 60) %}
        {% set seconds = (remaining_time % 60) %}
         {{ '%02d:%02d:%02d' | format(hours, minutes, seconds) if remaining_time > 0 else 'Terminé' }}

Sinon

sensor:
  - platform: template
    sensors:
      quick_veto_end_time:
        friendly_name: "Quick veto end time"
        value_template: "{{ state_attr('climate.zone_0', 'quick_veto_end_date_time') | as_datetime | strftime('%H:%M:%S') }}"

Ou encore

sensor:
  - platform: template
    sensors:
      quick_veto_end_time:
        friendly_name: "Quick veto end time"
        value_template: >
          {% set end_time = strptime(state_attr('climate.zone_0', 'quick_veto_end_date_time'), "%Y-%m-%d %H:%M:%S") %}
          {{ end_time.strftime("%H:%M:%S") }}

Alors,
le 1er NOK
le 2eme fait planté le sensor qui fonctionnait
le 3eme NOK

On va faire un essai de remplacement de caractère

sensor:
  - platform: template
    sensors:
      quick_veto_end_time:
        friendly_name: "Quick veto end time"
        value_template: >
          {{ state_attr('climate.zone_0', 'quick_veto_end_date_time') | regex_replace('T', ' ') | regex_replace('\.\d+$', '') }}

Celui la fonctionne :+1:

Donc c’était bien une chaîne de caractère :rofl:
Tu obtient quel résultat ?

je t’ai mis la photo

2023-04-25 11:06:00

Ah :joy:
Voilà pour afficher HH:mm

  - platform: template
    sensors:
      quick_veto_end_time:
        friendly_name: "Quick veto end time"
        value_template: >
          {{ state_attr('climate.zone_0', 'quick_veto_end_date_time') | regex_replace('T', ' ') | regex_replace('\.\d+$', '') | regex_replace('^.* ', '') }}

il fonctionne aussi :+1:

Tu as le résultat voulu ?

Ba, en fait je voulais le temps restant donc ce sensor moins le temps actuel

  - platform: template
    sensors:
      quick_veto_end_time:
        friendly_name: "Quick veto end time"
        value_template: >
          {{ state_attr('climate.zone_0', 'quick_veto_end_date_time') | regex_replace('T', ' ') | regex_replace('\.\d+$', '') | regex_replace('^.* ', '') }}
      quick_veto_remaining_time:
        friendly_name: "Quick veto remaining time"
        value_template: >
          {% set end_time = strptime(state_attr('climate.zone_0', 'quick_veto_end_date_time'), '%Y-%m-%dT%H:%M:%S') %}
          {% set remaining_time = (end_time - now()).total_seconds() %}
          {% set hours = ((remaining_time // 3600) % 24) %}
          {% set minutes = ((remaining_time // 60) % 60) %}
          {% set seconds = (remaining_time % 60) %}
          {{ '%02d:%02d:%02d' | format(hours, minutes, seconds) }}

Le premier sensor quick_veto_end_time reste inchangé et affiche l’heure de fin du quick veto sous forme de chaîne de caractères.

Le deuxième sensor quick_veto_remaining_time calcule le temps restant en récupérant l’heure de fin du quick veto à partir de l’attribut de l’entité climate.zone_0. Ensuite, il calcule la différence entre cette heure de fin et l’heure actuelle avec la fonction now(), puis il formate le résultat sous forme d’une chaîne de caractères de la forme hh:mm:ss.

Au cas où

sensor:
  - platform: template
    sensors:
      quick_veto_info:
        friendly_name: "Quick veto info"
        value_template: >
          {% set end_time = state_attr('climate.zone_0', 'quick_veto_end_date_time') | regex_replace('T', ' ') | regex_replace('\.\d+$', '') | regex_replace('^.* ', '') %}
          {% set remaining_minutes = ((as_timestamp(end_time) - now().timestamp()) / 60) | int %}
          Quick Veto ends at {{ end_time }} (in {{ remaining_minutes }} minutes)

c’est pas encore ça


j’essaie le deuxieme,

le deuxième


ne fonctionne pas non plus. :worried:

On va tenter de convertir en date Time

{% set end_time_str = state_attr('climate.zone_0', 'quick_veto_end_date_time') | regex_replace('T', ' ') | regex_replace('\.\d+$', '') %}
{% set end_time = strptime(end_time_str, '%Y-%m-%d %H:%M:%S') %}
{% set remaining_time = end_time - now() %}

Temps restant : {{ remaining_time.seconds // 3600 }}h {{ (remaining_time.seconds % 3600) // 60 }}m {{ remaining_time.seconds % 60 }}s

Sinon

  - platform: template
    sensors:
      quick_veto_end_time:
        friendly_name: "Quick veto end time"
        value_template: "{{ state_attr('climate.zone_0', 'quick_veto_end_date_time') }}"
      quick_veto_remaining_time:
        friendly_name: "Quick veto remaining time"
        value_template: >-
          {% set end_time = strptime(states('sensor.quick_veto_end_time'), '%Y-%m-%d %H:%M:%S') %}
          {% set remaining_time = end_time - now() %}
          {{ remaining_time.seconds // 3600 }}h{{ remaining_time.seconds % 3600 // 60 }}m

Après réflexion plutôt celle ci ou on voit bien la demande de conversion

{% set end_time_str = state_attr('climate.zone_0', 'quick_veto_end_date_time') %}
{% set end_time = strptime(end_time_str, '%Y-%m-%dT%H:%M:%S') %}
{% set remaining_time = (end_time - now()).total_seconds() %}
{% set hours = ((remaining_time // 3600) % 24) %}
{% set minutes = ((remaining_time // 60) % 60) %}
{% set seconds = (remaining_time % 60) %}
{{ '%02d:%02d:%02d' | format(hours, minutes, seconds) }}

Aucune ne fonctionne, mais sur la dernière tu ecrit {% set end_time = strptime(end_time_str, '%Y-%m-%dT%H:%M:%S') %} alors qu’il n’y apas de « T » dans le résultat. Et cette ligne bloque dans modele:

ValueError: Template error: strptime got invalid input '2023-04-25 17:13:00' when rendering template '{% set end_time_str = state_attr('climate.zone_0', 'quick_veto_end_date_time') %}
{% set end_time = strptime(end_time_str, '%Y-%m-%dT%H:%M:%S') %}

Oui c’est a adapter selon l’affichage

{% set end_time_str = state_attr('climate.zone_0', 'quick_veto_end_date_time') %}
{% set end_time = strptime(end_time_str, '%Y-%m-%d %H:%M:%S') %}

Tu peux remplacer par celle ci

ça passe pas non plus

Bizarre
On va revérifier si tout est bien en place a adapter selon ton attribut bien sûr

{% set end_time_str = state_attr('climate.zone_0', 'quick_veto_end_date_time') %}
{% set match = end_time_str | regex_match('(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})') %}
{% set end_time = as_timestamp(match[1] ~ '-' ~ match[2] ~ '-' ~ match[3] ~ ' ' ~ match[4] ~ ':' ~ match[5] ~ ':' ~ match[6]) %}
{% set remaining_time = end_time - now().timestamp() %}
{{ '%02d:%02d:%02d' | format((remaining_time // 3600) % 24, (remaining_time // 60) % 60, remaining_time % 60) }}