Créer un minuteur indiquant le temps restant avant le prochain événement

Pas besoin de passer par une automatisation, tu peux faire tout ce que tu souhaites dans une entité créée juste pour ça indiquant le temps avant le prochain événement et son nom par exemple.

De plus quelle précision cherches tu ? La minute ? Car en dessous de la minute c’est moins évident…:innocent:

Salut Clemalex,

Merci pour ta réactivité et tes réponses.
Précis à la minute près c’est largement suffisant.

Je vais étudier la page template ce soir en rentrant à la maison, pour essayer de mettre ça en oeuvre…

Tu peux te servir de ce post comme source pour ta demande :+1:
(sauf qu’il faut que tu remplace |max par |min

Je trouve tout ça assez complexe pour le moment et je ne suis pas encore à l’aise avec les template et le language jinja… Enfaîte j’ai juste la théorie en tête. Je vois les choses comme ça :

Admettons que :
Event1 = 8h
Event2 = 13h
Event3 = 15h
Event4 = 17h
Event5 = 20h
sensor.time = 12h (midi quoi)
sensor.prochaine_event = (ce qu’on cherche à obtenir)

En fesant ces comparaisons :
SI sensor.time < Event1 ALORS sensor.prochaine_event = Event1 - sensor.time

SI sensor.time < Event2 ALORS sensor.prochaine_event = Event2 - sensor.time

SI sensor.time < Event3 ALORS sensor.prochaine_event = Event3 - sensor.time

SI sensor.time < Event4 ALORS sensor.prochaine_event = Event4 - sensor.time

SI sensor.time < Event5 ALORS sensor.prochaine_event = Event5 - sensor.time

Ainsi on obtient le temps restant avant le prochain événement. Et si on fait tourner ce script en boucle, la valeur du prochaine_event va faire que de se mettre à jour et jouer le rôle de minuteur du prochain événement. C’est jouable ce genre de chose ?

En pratique c’est peu être bien moins simple à mette en œuvre… Et j’ai peut être était un peu trop ambitieux sur mon projet.

Est-ce que tu peux fournir un aperçu des entités ?

Tu va dans Outils de développement et tu fais une capture d’écran des entités (avec leurs attributs).

Bien sûr que c’est jouable.

C’est ambitieux si tu débutes et que tu es seul… Mais tu es au bon endroit :+1: pour recevoir de l’aide.



Par exemple, Prochaine expiration du certificat de mes noms de domaine (ou autre liste) te montre comment remonter le nom du certificat qui sera le premier a expirer depuis une liste (j’ai plusieurs certificats car plusieurs ndd).

Ce n’est pas en rapport direct avec ta demande, mais ce n’est pas si éloigné car on récupère au final l’entité dont le timestamp est le plus bas qui peut être te sera nécessaire.

Je te laisse lire, mais je pense que ça peut te servir car il y a pas mal de notion qui te seront utiles, du moins j’espère.

Et n’hésites pas à poser des questions :+1:

Et du coup, voici le code qui permet d’obtenir le temps restant avant l’expiration de l’un des certificats de mes ndd (le prochain à expirer) :

{# Définition de la liste des entités que l'on veut surveiller #}
{% set liste_des_entites = ['sensor.cert_expiry_timestamp_ndd1_duckdns_org','sensor.cert_expiry_timestamp_ndd2_duckdns_org'] %}
{# Définition du namespace pour récupération de la valeur en dehors de la boucle #}
{%set timestamp_des_entites_boucle = namespace(timestamp='')  %}
{# Boucle parcourant tous les éléments de la liste `liste_des_entites` #}
{# Cette boucle permet de définir une liste contenant les timestamp #}
{% for entite in liste_des_entites %}
    {% if loop.first %}
        {# Au premier passage #}        
        {% set timestamp_des_entites_boucle.timestamp = [as_timestamp(states(entite))] %}
    {% else %}
        {# Pour les autres passages #}        
        {% set timestamp_des_entites_boucle.timestamp = timestamp_des_entites_boucle.timestamp + [as_timestamp(states(entite))] %}  
    {% endif %}
{% endfor %}
{# Définition de la liste représentant les timestamp #}        
{% set timestamp_des_entites = timestamp_des_entites_boucle.timestamp %}
{# Définition de la variable contenant le timestamp le plus petit représentant le prochain évènement #} 
{% set entite_la_plus_petite = timestamp_des_entites|min %}
{# Définition de la date/heure du prochain évènement en objet datetime pour faire des calculs liés au temps #} 
{% set prochain_evenement = as_local(strptime(states(liste_des_entites[timestamp_des_entites.index(entite_la_plus_petite)]), '%Y-%m-%dT%H:%M:%S.000Z')).replace(tzinfo=None) %}
{# Définition de la date/heure actuel en objet datetime pour faire des calculs liés au temps #} 
{% set maintenant = strptime((states('sensor.date') + " " + states('sensor.time') + ":00"), '%Y-%m-%d %H:%M:%S') %}
{# On soustrait les deux objets datetime afin de récupérer le temps restant #} 
{{(prochain_evenement - maintenant)|replace('days','jours')|replace('day','jour')}}

Pour l’adapter avec tes entités, il faut modifier la liste des entités contenues dans la variable liste_des_entites et modifier en conséquence le format utilisé pour la conversion en objet datetime à définition de la variable prochain_evenement, n’hésite pas à demander de l’aide :+1:

J’ai une question toute bête car je ne suis pas sûr de ce que tu veux. Tu veux le temps restant … mais en faire quoi ? uniquement l’afficher ?
Si c’est uniquement pour de l’affichage dans l’interface et que tu as un peu de compétence de dev Web, le mieux est d’utiliser une lib js d’horloge, tu l’initialises avec le décompte du déclenchement à venir et c’est joué uniquement dans le client, pas coté HA.
Il n’y a pas cela dans HACS ? Hummmm une idée de dev ça tiens :slight_smile:

Merci pour tes explications clemalex. Je me plonge dans tes codes pour voir un peu comment ça se goupille. Si j’ai des questions j’hésiterais pas alors !

Voici une capture d’écran d’une de mes entité en question :


Les 4 autres entités ont les mêmes attributs que celle ci et la même structure d’état (c à d date et heure). Seule leur valeur d’état diffère entre elle.

Sur ceux, Bonne nuit !

Hello Pozzi, il n’y a pas de question bête, j’ai peut être tout simplement pas été précis dans mon explication !
En faite oui c’est simplement pour de l’affichage sur une carte dans l’interface de HA. C’est juste histoire de consulter combien de temps il me reste avant le prochain événement.
D’accord pour la lib js horloge, je ne suis hyper à l’aise avec ça non plus, qu’est ce que tu veux dire par côté client ?
A+

Cela veut dire que le code est exécuté côté client, comprendre le navigateur internet et non pas le serveur domotique, donc pas de ressources utilisées.

Tu va avoir besoin d’adapter comme je le précise en fin de mon post :+1:

N’hésite pas.

Comme le précise …

Ca reste une idée, je n’ai pas mis en pratique :slight_smile:

@Heihachi31

As tu pu mettre en pratique le bout de code ?

As tu besoin d’aide ?

En toute sincérité, non je ne m’y suis pas encore penché. Je vais tenter quelques choses d’ici là fin du week-end maintenant que mon système d’alarme est finalisé. Je vais sûrement avoir besoin de toi oui :wink:

1 « J'aime »

@Clemalex déjà où est-ce que je peux tester mon bout de code dans HA ? Directement dans une carte ? Ou je fais un script par exemple ?

Dans une entité personnalisée (template sensor) … :laughing:

https://forum.hacf.fr/t/creer-un-minuteur-indiquant-le-temps-restant-avant-le-prochain-evenement/2273/7?u=clemalex

Hmm c’est le menu « personnalisation »?

Euh non pas du tout :sweat_smile:

Dans ton fichier configuration.yaml en face de sensor: tu as quoi ?

Dans mon fichier de config, je redirige les sensors vers le fichier sensor.yaml, voici son contenu:

- platform: prixCarburant
  stationID:
    - 31170001
    - 31170002
    - 31100003
    - 31880001

- platform: time_date
  display_options:
    - 'date' 
    - 'time'
    - 'date_time'

La première ligne indique dans quelle domaine l’entité est utilisé, donc ici sensor (ça aurait pû être dans un autre exemple input_datetime: ou input_select:).

Donc toi, tu copie/colle à partir de la ligne 2 en prenant soin d’adapter l’indentation à ton niveau d’inclusion (ici, tu va devoir diminuer l’indentation de 2xESPACE devant chaque ligne).