Aide sur un template avec des dates svp

Bonjour,

J’aurais besoin d’un coup de main pour créer un template qui compare deux heures, j’y suis depuis 3 jours et je n’arrive pas à m’en sortir. :face_with_head_bandage:
Je m’explique mes volets s’ouvre et se ferment une heure qui varie en fonction du lever/couché du soleil, Mais ils ne doivent pas se lever trop tôt non plus. Donc j’ai créé une automation qui me permet de gérer l’ouverture et la fermeture de mon volet soit en fonction de l’heure du lever du soleil soit en fonction d’une heure fixe.
J’aimerais également afficher dans un template l’heure de lever et l’heure de fermeture du volet chaque jour.

Je pense que je touche au but mais ça ne fonctionne toujours pas.
J’ai d’abord essayé ça pour l’heure d’ouverture:

{% if ((state_attr('sun.sun', 'next_rising') | as_datetime).timestamp() + 10*60 )| timestamp_custom("%-H:%M", true) < "08:00" %}
  08:00
{% else %}
  {{((state_attr('sun.sun', 'next_rising') | as_datetime).timestamp() + 10*60 )| timestamp_custom("%-H:%M", true)}}
{% endif %}

puis avec un input_datetime :

{% if ((state_attr('sun.sun', 'next_rising') | as_datetime).timestamp() + 10*60 )| timestamp_custom("%-H:%M", true) < state_attr('input_datetime.test_heure', 'timestamp') | timestamp_custom("%-H:%M", true) %}
  {{state_attr('input_datetime.test_heure', 'timestamp') | timestamp_custom("%-H:%M", true)}}
{% else %}
  {{((state_attr('sun.sun', 'next_rising') | as_datetime).timestamp() + 10*60 )| timestamp_custom("%-H:%M", true)}}
{% endif %}```


mais cela ne fonctionne toujours pas, peu importe l’heure que j’indique dans mon input_datetime le résultat du template ne change jamais à chaque fois il indique en résultat ma 1er variable, soit :

((state_attr(‹ sun.sun ›, ‹ next_rising ›) | as_datetime).timestamp() + 10*60 )| timestamp_custom(« %-H:%M », true)```

je vois pas pourquoi ??

merci de votre aide

Salut,

Pourquoi autant de calculs ???
now() donne la date et l’heure
x.hour donne l’heure uniquement, idem pour minutes etc


Donc tu compares les heures avec l’heure de ton input …et les minutes avec les minutes par ex, ou les heures * 60 + minutes

Excuse-moi mais je ne vois pas vraiment comment appliquer ta solution. Aurais-tu un exemple concret?

Salut, c’est sûrement un peu lourd mais ton premier template est presque fonctionnel :
Tu compares un string de type 4:30 avec un autre 08:00.
Donc soit tu vires les tirets dans %-H:%M et tu affiche tes autre horaires avec le 0 dans l’heure (04:30).
Soit tu laisses les tirets et tu vires les 0 (4:30).

Cela dit, essaie de simplifier tes templates de la sorte:
Perso j’essaie de ne jamais avoir d’expression qui se répète. Ça facilite grandement la maintenance.

{% set rise = ((state_attr('sun.sun', 'next_rising') | as_datetime).timestamp() + 10*60 )| timestamp_custom("%H:%M", true)  %}
{% if rise < "08:00" %}
  08:00
{% else %}
  {{ rise }}
{% endif %}

Merci ta solution marche nickel

Je vais pouvoir simplifier pas mal de mes templates :wink:

1 « J'aime »

la gestion des dates dans python nécessite un peut d’apprentissage (et de tâtonnement pour les non-dev comme moi)

  • Si c’est juste pour de l’affichage, je recommande d’utiliser la librairie easy_time.jinja qui permet d’afficher et comparer des dates relativement facilement.

  • Sinon, le mieux est d’utiliser les objets date et/ou datetime de python & les functions associé et de toujours spécifier le device_class, ce qui permet d’afficher ça très facilement

en voici un exemple :

    - name: Duree Jour
      unique_id: daily_duration
      device_class: duration
      icon: mdi:weather-sunset-up
      unit_of_measurement: s
      state: >
        {{ (states.sun.sun.attributes.next_setting  | as_datetime | relative_time - states.sun.sun.attributes.next_rising  | as_datetime | relative_time).total_seconds()|int(default=0) }}

une fois que le sensor est une « vrai » date (au sens python), on peut facilement comparer et les manipuler :

    - name: delta jour
      unique_id: delta_jour
      device_class: duration
      unit_of_measurement: s
      icon: mdi:weather-sunset-up
      state: >
        {{ states('sensor.duree_jour') | int (default=0)  - states('sensor.duree_jour_veille') | int (default=0)  }}

ça permet de pouvoir faire ce genre de chose dans HomeAssistant :

bus_dateheure

1h61m16s :grin: Y’a pas un léger problème ? :wink:

C’est pas faux, …

Afficher de manière jolie dans plusieurs cas est pas toujours facile , …

Dans cet exemple, j’ai 4 cas possible :

  • pas de retard
  • retard de moins de 60s,
  • retard de moins d’1h
  • retard de plus d’une heure

J’avoue que j’ai pas eu souvent des retard > 1h donc, pour tester , …

J’ai pas mis a jour le sensor pour pouvoir comparer : (j’ai aussi supprimer les secondes car si plus d’une heure de retard, on est plus a une minute près ,… )

bus_dateheure3

Tu aurais du prendre des horaires SNCF, tu aurais eu de quoi tester les retards de plus d’une heure :laughing: