Calcul du temps restant d'un sensor [Resolu]

Bonjour,

Je cherche depuis le début de l’après à résoudre un problème qui semblait pourtant simple et comme je ne n’arrive pas trouver la solution, je fais appel à vous.

Voilà , j’ai une entité dont un attribut me donne le temps de fin d’une programmation sous cette forme:

quick_veto_end_date_time: 2023-04-24T22:01:00

et je voudrais tout simplement créer un nouveau sensor qui me donnerai le temps en heures minutes secondes qui me sépare du temps actuel.
En bref je voudrais le temps restant de la programmation.
J’ai essayé plusieur formules dans l’outil « modèle » mais j’ai à chaque fois un message d’erreur TypeError: unsupported operand type(s) for -: 'str' and 'str' .
Pour le temps actuel j’utilise as_timestamp(now())
Merci d’avance de votre aide,

Voici @telenaze :


sensor:
  - platform: template
    sensors:
      temps_restant_programmation:
        friendly_name: "Temps restant de la programmation"
        value_template: >
          {% set end_time = strptime(states('votre_entite').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) }}
1 « J'aime »

Merci du retour express !

Le sensor me dit unavailable alors qu’il à bien une valeur.
Voici le code que j’ai saisie. ( je suis dans la nouvelle configuration avec un repertoire template)


- sensor:
    - name: "temps_restant_programmation"
      unique_id: "Temps restant de la programmation"
      state: >
        {% 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) }}
       


et si je mets {% set end_time = strptime(states('climate.zone_0').attributes.quick_veto_end_date_time, "%Y-%m-%dT%H:%M:%S") %} dans l’outil « modèle » j’ai ce message UndefinedError: 'str object' has no attribute 'attributes'

montre moi ce que tu as quand tu vas dans outils dev > etat:
image

car pour le code précedent il va chercher dans les attribut la ligne attributes.quick_veto_end_date_time



Voilou !

Essayons ceci cela va convertir en seconde puis reformater expression:

  - 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) }}```

idem, ça ne marche pas.

J’ai copier le même Voici un template teste regarde si il affiche unavailable.

  - 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) %}
          {% if remaining_time > 0 %}
            {{ '%02d:%02d:%02d' | format(hours, minutes, seconds) }}
          {% else %}
            00:00:00
          {% endif %}```

En fait déja la première ligne est en erreur dans l’outil « modele »

C’est dans doute parce-qu’il n’est pas toujours présent l’attribut
Voici une vérification template

- platform: template
  sensors:
    temps_restant_programmation:
      friendly_name: "Temps restant de la programmation"
      value_template: >-
        {% if 'quick_veto_end_date_time' in state_attr('climate.zone_0', 'all') %}
          {% 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) }}
        {% else %}
          N/A
        {% endif %}

En Fait, cet attributà été ajouté dans une intégration de gestion de chaidière Vaillant/saunier-duval.
https://community.home-assistant.io/t/myvaillant-integration/542610/26?u=telenaze
Est-il possible que le développeur n’est pas configuré en format date cet attribut ?

Aucune idée mais normalement avec le dernier code tu devrai avoir n/a

j’ai encore unavailable

j’ai créer un sensor

    - name: "saunier_duval_heure_fin_programmation"
      unique_id: "Saunier Duval heure fin programmation"    
      state: "{{ state_attr('climate.zone_0', 'quick_veto_end_date_time') }}"


et lui donne bien une information

On va partir de zéro dit moi si cela affiche l’attribut
sensor:

    sensors:
      quick_veto_end_time:
        friendly_name: "Quick veto end time"
        value_template: "{{ state_attr('climate.zone_0', 'quick_veto_end_date_time') }}"

oui c’est le même que celui que j’ai créer

Peux tu me copier coller le résultat pour le format

2023-04-25 11:06:00

Essayons

{{ states('climate.zone_0').attributes.quick_veto_end_date_time | as_timestamp | timestamp_custom('%H:%M') }}

testé dans modèle

UndefinedError: 'str object' has no attribute 'attributes'