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éthodestates.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 sera1234
(concaténation de chaines de caractères) - Si on écrit
{{texte1|int + texte2|int}}
le résultat sera46
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 :
Et on crée une entité (ancien format car je l’avais sous la main…
)
sensor:
- platform: template
sensors:
temps_total:
icon_template: mdi:timer-outline
unit_of_measurement: " " #<- Espace insécable pour ne rien afficher dans lovelace (un espace) mais activer la vue historique
value_template: >
{# 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)}}
Ce qui donne côté lovelace :
Voilà…