Je voudrai que au bout de X minutes / heures passé devant la TV je reçoit une notification avec automation mais malgré ma bonne volonté je me heurte à quelque soucie de conversion en affichage horaire (ex: sa me met 2.98 en valeur qui signifie 2h58) puis la reprendre pour le déclenchement avec condition de l’automatisation.
Template sensor:
Donc il suffit de déclencher l’automatisation sur cet attribut plutôt que de faire des calculs :
alias: Résumé de la journée
description: ''
trigger:
- platform: state
entity_id: sensor.lamp_on_today
attribute: value
to: 20h 59m
- platform: state
entity_id: sensor.lamp_on_today
attribute: value
to: 21h 0m
- platform: state
entity_id: sensor.lamp_on_today
attribute: value
to: 21h 1m
condition: []
action:
- service: persistent_notification.create
data:
message: 'Résumé : Vous avez regardé {{state_attr("sensor.lamp_on_today","value")}}'
mode: single
Il n’y a rien de bizarre cela correspond à ton code…
Je repasse ce soir éditer mon post pour t’expliquer et te donner un exemple
edit:
Commençons par expliquer le code que tu as écris pour la valeur de watchtv_all :
Déjà, pour récupérer un attribut, la documentation dit de préférer la méthode state_att(entité,attribut) (comme je te l’ai montré dans ma réponse plus haute) plutôt que la méthode states.domaine.entité.attributes.attribut, donc pourquoi ne pas faire comme le préconise la documentation ?
Concernant ton code tu lui dit de récupérer le temps de 2 entités et de les concaténer ensemble.
Donc si entité_1 = 1h 2m et entite_2 = 0m (pas encore regarder cette tv aujourd’hui) le résultat va donner… 1h 2m0m (comme dans ton message )
Alors pourquoi ? Car les résultats renvoyées par les fonctions states() , is_state() (et bien d’autre, voir la documentation pour tous les détails) sont au format string donc en texte. Et quand on écrit la formule {{ texte1 + texte 2 }} le résultat sera texte1texte2 (concaténation).
Pour faire des calculs de nombre, il faut donc les transformer en nombre via des filtres donc les plus connus sont |int (entier, pas de virgule) et |float (virgule flottante).
Donc prenons l’exemple de : texte1 = 12 et texte2 = 34 :
Si on écrit {{texte1 + texte2}} le résultat sera 1234 (concaténation de chaines de caractères)
Si on écrit {{texte1|int + texte2|int}} le résultat sera 46
Avec ces explications brèves, j’espère que tu comprends mieux ton résultat.
Donc pour en revenir à ta demande initiale, à savoir : Additionner le nombre total de temps de visionnage des TV, il faut donc passer par quelques conversions pour pouvoir additionner les valeurs dont nous disposons
Une démonstration de code juste pour le plaisir :
{% set hours = (states('sensor.lamp_on_today').split('.')[0]) %}
{% set minutes = '%02d'|format(((('0.' ~ states('sensor.lamp_on_today').split('.')[1]|first )|float)*60)|round) %}
{{hours}}h{{minutes}}m
Renverra le temps de visionnage d’une entité au format 12h34m (la seule différence avec l’attribut value est la disparition de l’espace… mais il y a beaucoup de notion dans le code donc je le mets…
Une façon plus rapide et moins fastidieuse serait de récupérer la valeur de l’attribut value et d’enlever l’espace en trop, mais (sinon ça ne serait pas amusant) dans le cas de 1h 3m nous préfèrerons voir 01h03m (on ne va pas pousser même si c’est faisable de ne pas afficher les heures pour 00h12m par exemple )
On obtient par exemple le code :
{% set hours = '%02d'|format(state_attr('sensor.lamp_on_today','value').split('h')[0]|int) %}
{% set minutes = '%02d'|format(state_attr('sensor.lamp_on_today','value').split('h')[1].split('m')[0]|trim|int)%}
{{hours}}h{{minutes}}m
pour le résultat 12h34m… … oui le même résultat que le code précédent mais avec une autre approche…
J’arrête avec les codes inutiles (ou pas) et on attaque le problème :
On a donc 2 entité qui ont chacune un attribut value et un état state représentant le temps d’allumage et nous voulons les additionner…
Pour faire un calcul de durée, je le dis à chaque fois mais il faut passer par des variables de type datetime.
Donc convertissons ces entités et ajoutons les :
{# 1ère entité #}
{% set hours1 = '%02d'|format(state_attr('sensor.lamp_on_today','value').split('h')[0]|int) %}
{% set minutes1 = '%02d'|format(state_attr('sensor.lamp_on_today','value').split('h')[1].split('m')[0]|trim|int)%}
{% set time1 = hours1 ~ 'h' ~ minutes1 ~ 'm' %}
{% set time1 = strptime(time1,'%Hh%Mm').time() %}
{# 2ème entité #}
{% set hours2 = '%02d'|format(state_attr('sensor.lamp_on_today_2','value').split('h')[0]|int) %}
{% set minutes2 = '%02d'|format(state_attr('sensor.lamp_on_today_2','value').split('h')[1].split('m')[0]|trim|int)%}
{% set time2 = hours2 ~ 'h' ~ minutes2 ~ 'm' %}
{% set time2 = strptime(time2,'%Hh%Mm').time() %}
{# On additionne les entités#}
{% set seconds = time1.minute*60+time1.hour*3600+time2.minute*60+time2.hour*3600 %}
{# On affiche le résultat #}
{{'%02d'|format(seconds//3600)}}:{{'%02d'|format(seconds//60%60)}}
On teste tout cela dans les outils de développements :
Merci c’est… Impressionnant, je pense le lire et le relire parce-que c’est vraiment intéressent de pouvoir commencer à comprendre comment sa fonctionne
Merci pour ta pédagogie @Clemalex en espérant que cela puisse aider au plus grand nombre sur ce forum