Obtenir le temps d'utilisation d'un appareil électrique sur une période donnée

Salut à tous,

J’ai aussi utilisé History stats pour me remonter mes durées de chauffage.
Je n’arrive apriori pas à remonter les infos sur l’année en cours (j’ai une durée qui remonte mais qui est incohérente : « 8000 h »).

start: « {{ now().replace(month=1, day=1, hour=0, minute=0, second=0, microsecond=0) }} »
end: « {{ now() }} »

Je profite de ce poste pour savoir si quelqu’un a une idée.

Merci.
smilorel

1 « J'aime »

Pour les données sur l’année, le mois ou autre, il est envisageable d’utiliser un utility meter. Je trouve cela beaucoup moins chiant à configurer.

Exemple pour le chauffage, sur lequel je récupère le temps de chauffe journalier, mensuel et annuel :

---
# ------------------------------------------------------------------------------
# File: climate.yaml
# Desc: Climate related entities and config.
#
# Content:
# 1. Template - Sensor.
# 2. Sensor - Hystory stats.
# 3. Utility meter.
# ------------------------------------------------------------------------------
# 1. Template - Sensor.
template:
    # Status of the heated floor. Pulled from climate entity attribute.
  - sensor:
      - name: Heated Floor Status
        state: "{{ state_attr('climate.netatmo_smart_thermostat', 'hvac_action') }}"

# 2. Sensor - Hystory stats.
sensor :
    # Hours of heating today.       
    - platform: history_stats
      name: Heating Duration Today
      entity_id: sensor.heated_floor_status
      state: 'heating'
      type: time
      start: '{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}'
      end: '{{ now() }}'

# 3. Utility meter.
utility_meter:
  heating_duration_daily:
    source: sensor.heating_duration_today
    cycle: daily
  heating_duration_monthly:
    source: sensor.heating_duration_today
    cycle: monthly
  heating_duration_yearly:
    source: sensor.heating_duration_today
    cycle: yearly

A noter que l’utility_meter qui cycle en journalier est redondant avec l’hystory_stats, mais je m’y retrouve plus facilement.

2 « J'aime »

Bonjour,

j’ai essayé de mettre en place le temps d’allumage de ma TV mais lors que je crée un template il me dit que value_template n’est pas attendu.

Il y a eu une MAJ de HA qui a changé un peu le code peut être ?

en cherchant un peu sur le net j’ai essayé ça dans template.yaml :

      - name: "Temps TV Today"
        device_class: duration
        state: "{{ as_timestamp(states('sensor.tv_on_today')) | timestamp_custom('%H:%M') }}"

mais en valeur j’ai unavailable.

le sensor.tv_on_today fonctionne bien, il me retourne 1.53en heure, le but est donc de l’afficher en H:M

Quelqu’un pourrait-il m’aider ?

Merci

Salut,
Si tu décomposes le template et utilise l’onglet modèle dans outil de devpt, peut être que ce sera plus simple.
Par decomposer je veux dire :
-est ce que le sensor source renvoie une valeur (a priori ok)

  • quel est le résultat de la première transformation (state: "{{as_timestamp(states(‹ sensor.tv_on_today ›)) : est ce ok?
  • syntaxiquement la dernière transfo accepte t’elle le résultat de la seconde.?

Pour tout travail sur les template, l’onglet modèle est LE point de départ ( plus souple, visu direct, pas de pollution des données…)

Bonjour,

j’ai réussi à me débrouiller merci, voici ce que j’ai fait

      - name: "Temps TV Today"
        device_class: duration
        state: >
          {% set hours = (states('sensor.tv_on_today').split('.')[0]) %}
          {% set minutes = '%02d'|format(((('0.' ~ states('sensor.tv_on_today').split('.')[1]|first )|float)*60)|round) %}
          {{hours}}h{{minutes}}m

J’ai reçu a générer une notification sur un cycle

Voici le résultat (en mode test donc les Wh ne sont pas pertinents ) :

Pour faire ça, il faut :

  1. Crée un utility_meter (j’ai mis exprès un cycle montly car je veut faire uniquement des reset « manual »
  lave_vaisselle_power_cycle:
    source: sensor.circuit_8_daily_energy
    cycle: monthly
  1. une automatisation « de start »
    Celle-ci fait 2 choses :
  • remise a zero de la consommation d’energie de notre utility meter
  • et après; on pourras connaitre la date de début du cycle via state_attr(''automation.XXX'',''last_triggered''))
- id: '1673341181614'
  alias: Lave vaisselle Start
  description: Lave vaisselle Start
  trigger:
  - type: power
    platform: device
    device_id: efc284c42c5676265a2e8ad8c7144625
    entity_id: sensor.circuit_13_power
    domain: sensor
    above: 5
    for:
      hours: 0
      minutes: 1
      seconds: 0
  condition: []
  action:
  - service: utility_meter.calibrate
    data:
      value: '0'
    target:
      entity_id: sensor.lave_vaisselle_power_cycle
  mode: single
  1. automatisation de fin
    qui envoie une notification et qui met a zero la consommation
- id: '1673340815471'
  alias: 'Lave-Vaisselle Fin : Notification'
  description: "a la fin du cycle : \n- reset de l'utility meter\n- notification de
    la durée et de la consommation du cycle de lave-vaiselle"
  trigger:
  - type: power
    platform: device
    device_id: efc284c42c5676265a2e8ad8c7144625
    entity_id: sensor.circuit_13_power
    domain: sensor
    below: 5
    for:
      hours: 0
      minutes: 1
      seconds: 0
  condition: []
  action:
  - service: notify.mobile_your_mobile
    data:
      title: Lave-vaiselle Fini
      message: 'Lave-vaiselle démarrer le {{ (state_attr(''automation.automation_88'',
        ''last_triggered'')) .strftime("%Hh%M") }}\nDurée de lavage : {{ (now() -
        (state_attr(''automation.automation_88'', ''last_triggered''))) }}\nConsommation
        : {{ states(''sensor.lave_vaisselle_power_cycle'') }} Wh'

il faut encore améliorer la notification, en particulier la durée de lavage ( qui est du type timedelta) et je sais pas trop comment on peut formater ce type de données.

2 « J'aime »

J’ai un peut lutter mais j’ai fini par avoir un résutat qui me satisfait ( le diable se cache dans les détails) :

  • la date de début (via last_triggered d’une automation) est en UTC
  • le formatage du deltatime n’a pas était trivial
  • J’ai rajouter un calcul du cout du cycle (qui est approximatif si le cycle est a chevale entre 2 tarification differentes.
  • J’ai aussi crée une nouvelle notification mais dans un fichier qui a la forme d’un csv (où il faut enlever 2 lignes pour faire un « vrai » csv), dans l’idée de pouvoir suivre dans le temps, le nombre et le temps des cycles
Date ; Debut ; Fin ; Duree ; Wh ; € ;
Home Assistant notifications (Log started: 2023-01-11T16:44:36.125753+00:00)
--------------------------------------------------------------------------------
12/01/2023 ; 02h16 ; 17h58 ; 15h42m ; 541Wh ; 0.07€ ;
12/01/2023 ; 02h16 ; 18h00 ; 15h44m ; 541Wh ; 0.07€ ;

Au besoin, voici les actions de l’automatisation de fin pour faire ça :

  - service: notify.mobile_app_rmx3085
    data:
      title: Lave-Vaisselle Fini
      message: >
        Le cycle s'est déroulé de {{ ((state_attr('automation.lave_vaisselle_start', 'last_triggered')) | as_local).strftime("%Hh%M") }} à {{ now().strftime("%Hh%M") }}
        Soit une durée de {{ ((now() - (state_attr('automation.lave_vaisselle_start', 'last_triggered'))).seconds  / 3600 )| int }}h{{ (((now() - (state_attr('automation.lave_vaisselle_start', 'last_triggered'))).seconds % 3600 )/60 )| round }}m\n
        Le cycle à consommé {{ states('sensor.lave_vaisselle_power_cycle') }}Wh\n
        Pour un coût de {{ (states('sensor.lave_vaisselle_power_cycle') | float(default=0) * (states('sensor.edf_tempo_current_cost')| float(default=0)) /1000) | round(2) }}€
  - service: notify.lave_vaisselle
    data:
      message: >
        {{ now().strftime("%d/%m/%Y") }} ; {{ ((state_attr('automation.lave_vaisselle_start', 'last_triggered')) | as_local).strftime("%Hh%M") }} ; {{ now().strftime("%Hh%M") }} ; {{ ((now() - (state_attr('automation.lave_vaisselle_start', 'last_triggered'))).seconds / 3600 )| int }}h{{ (((now() - (state_attr('automation.lave_vaisselle_start', 'last_triggered'))).seconds % 3600 )/60 )| round }}m ; {{ states('sensor.lave_vaisselle_power_cycle') }}Wh ; {{ (states('sensor.lave_vaisselle_power_cycle') | float(default=0) * (states('sensor.edf_tempo_current_cost')| float(default=0)) /1000) | round(2) }}€ ;

et d’une configuration « minimaliste » d’un notify :

notify:
- name: lave_vaisselle
  platform: file
  filename: /data/git/cycle/lave_vaisselle.csv
2 « J'aime »

Salut, merci pour le partage !
Je cherche à faire la même chose (mesurer et stocker le temps d’allumage d’un appareil), mais non pas basé sur le status on ou off de la prise, mais plutôt sur la consommation en Watts de la prise (il s’agit de mesure le temps de fonctionnement de ma pompe de relevage).

Est-ce que si je fais un « state: sensor.maPrise.power > 10 » ça peut fonctionner ?
(je n’ai pas d’erreur YAML en faisant ça, mais pour le moment je n’ai pas de données qui remontent alors que la pompe s’est déclenchée. La conso en W remonte bien dans mon sensor quand elle se déclenche)

Merci pour votre aide !

C’est exactement ce que je fait.
++

1 « J'aime »

Ahh j’ai lu trop vite ce post :slight_smile:
Effectivement ça marche bien avec ton astuce, merci !

J’ai juste modifié l’envoi du message pour que ça prenne en charge les retours à la ligne (sinon je voyais le \n dans le texte) :

message: |
source: Forcer des retours à la ligne dans le texte généré par les template jinja
@+

Merci @syl2042 pour ce partage.

Par contre, petite question j’ai un 2 sensor du même nom qui ce sont créer
image

Hello @roumano ,

L’automatisation de début se déclenche plusieurs fois lorsque l’appareil est en route (normal, car les conditions sont = true plusieurs fois pendant le cycle, du coup la donnée de last_trigger est faussée => comment faire pour éviter que l’automatisation de start ne se déclenche de manière trop rapprochée de la précédente ?

Egalement, au dessus, tu dis à l’étape 3 " 3. automatisation de fin
qui envoie une notification et qui met a zero la consommation" => dans ton script il n’y a pas de remise à 0 sur l’automatisation de fin ?!

Merci !

Salut @spamoi ,

Effectivement mon information ne correspondais pas avec l’automatisation, la remise a zero était fait par le start. (c’est ce qu’il faut sinon tu vas avoir la conso en veille de ton LV dans ton reporting)

J’ai améliorer le fonctionne pour qu’il soit plus robuste, et j’ai rajouter une automatisation intermédiaire pour avoir le temps de fin de façon plus précise (avec le mode éco de mon lave-vaisselle, il peut se passer presque une 1heure où il consomme rien mais n’a pas encore fini)

je vous les partagent :

Start
- id: '1673367359265'
  alias: 'Lave-Vaisselle : Start'
  description: Lave vaisselle Start
  trigger:
  - type: power
    platform: device
    device_id: efc284c42c5676265a2e8ad8c7144625
    entity_id: sensor.circuit_13_power
    domain: sensor
    above: 10
    for:
      hours: 0
      minutes: 1
      seconds: 0
  condition:
  - condition: state
    entity_id: input_boolean.lave_vaisselle_cycle
    state: 'off'
  action:
  - service: utility_meter.calibrate
    data:
      value: '0'
    target:
      entity_id: sensor.lave_vaisselle_power_cycle
  - service: input_boolean.turn_on
    data: {}
    target:
      entity_id: input_boolean.lave_vaisselle_cycle
  mode: single
Fin ?

( attention, ici le mode est important )

- id: '1674478650323'
  alias: 'Lave-Vaisselle : Fin'
  description: Lave vaisselle Fin
  trigger:
  - type: power
    platform: device
    device_id: efc284c42c5676265a2e8ad8c7144625
    entity_id: sensor.circuit_13_power
    domain: sensor
    below: 10
    for:
      hours: 0
      minutes: 1
      seconds: 0
  condition:
  - condition: state
    entity_id: input_boolean.lave_vaisselle_cycle
    state: 'on'
  action:
  mode: restart
Fin : notification

il y a 2 notification, l’un pour le téléphone, l’autre pour crée un « csv » de tous les cycles de l’appareil

- id: '1673367677075'
  alias: 'Lave-Vaisselle : Fin , Notification'
  description: a la fin du cycle notification de la durée et de la consommation du
    cycle de lave-vaiselle
  trigger:
  - type: power
    platform: device
    device_id: efc284c42c5676265a2e8ad8c7144625
    entity_id: sensor.circuit_13_power
    domain: sensor
    below: 10
    for:
      hours: 1
      minutes: 0
      seconds: 0
  condition:
  - condition: state
    entity_id: input_boolean.lave_vaisselle_cycle
    state: 'on'
  action:
  - service: input_boolean.turn_off
    data: {}
    target:
      entity_id: input_boolean.lave_vaisselle_cycle
  - service: notify.mobile_app_rmx3085
    data:
      title: Lave-Vaisselle Fini
      message: 'Le cycle s''est déroulé de {{ ((state_attr(''automation.lave_vaisselle_start'',''last_triggered''))
        | as_local).strftime("%Hh%M") }} à {{ ((state_attr(''automation.lave_vaisselle_fin'',''last_triggered''))
        | as_local).strftime("%Hh%M") }}. Soit une durée de {{ (( (state_attr(''automation.lave_vaisselle_fin'',''last_triggered''))
        - (state_attr(''automation.lave_vaisselle_start'',''last_triggered''))).seconds  /
        3600 )| int }}h{{ ((((state_attr(''automation.lave_vaisselle_fin'',''last_triggered''))
        - (state_attr(''automation.lave_vaisselle_start'',''last_triggered''))).seconds
        % 3600 )/60 )| round }}m\n Le cycle à consommé {{ states(''sensor.lave_vaisselle_power_cycle'') | round
        }}Wh\n Pour un coût de {{(states(''sensor.lave_vaisselle_power_cycle'') |
        float(default=0) * (states(''sensor.edf_tempo_current_cost'')|float(default=0))
        /1000) | round(2) }}€

        '
  - service: notify.lave_vaisselle
    data:
      message: '{{ now().strftime("%d/%m/%Y") }} ; {{ ((state_attr(''automation.lave_vaisselle_start'',''last_triggered''))
        | as_local).strftime("%Hh%M") }} ; {{ (state_attr(''automation.lave_vaisselle_fin'',''last_triggered'')|
        as_local).strftime("%Hh%M") }} ; {{ (((state_attr(''automation.lave_vaisselle_fin'',''last_triggered''))
        - (state_attr(''automation.lave_vaisselle_start'', ''last_triggered''))).seconds
        / 3600 )| int }}h{{ ((((state_attr(''automation.lave_vaisselle_fin'',''last_triggered''))
        - (state_attr(''automation.lave_vaisselle_start'',''last_triggered''))).seconds
        % 3600 )/60 )| round }}m ; {{ states(''sensor.lave_vaisselle_power_cycle'') | round
        }}Wh ; {{ (states(''sensor.lave_vaisselle_power_cycle'') | float(default=0)
        * (states(''sensor.edf_tempo_current_cost'')| float(default=0)) /1000) | round(2)
        }}€ ;

        '

ps : il est possible de fusionner les deux fin si celui-ci se termine rapidement et/ou si on se moque d’avoir le temps de fin et de la durée du cycle de manière « précise ». ( +1heures dans mon cas )

ps2: petit coup de gueule a l’interface graphique des automatisations dans home assistant

j’en écrivant ça en yaml qui fonctionne : (le message a un poil évolué mais l’idée est là )

      message: >
        Le cycle s'est déroulé de {{ ((state_attr('automation.lave_vaisselle_start','last_triggered')) | as_local).strftime("%Hh%M") }} à {{ ((state_attr('automation.lave_vaisselle_fin','last_triggered')) | as_local).strftime("%Hh%M") }}. Soit une durée de {{ (( (state_attr('automation.lave_vaisselle_fin','last_triggered')) - (state_attr('automation.lave_vaisselle_start','last_triggered'))).seconds  / 3600 )| int }}h{{ ((((state_attr('automation.lave_vaisselle_fin','last_triggered')) - (state_attr('automation.lave_vaisselle_start','last_triggered'))).seconds % 3600 )/60 )| round }}m 

mais quand je vais dans le GUI des automatisation, même sans faire de changement, celui-ci parse le fichier des automatisations et le modifie en quelques-chose comme ça ( qui fonctionne aussi mais qui est illisible avec 2 simples quotes de partout et ce qui est une plaît pour reprendre en fichier texte ! )

      message: 'Le cycle s''est déroulé de {{ ((state_attr(''automation.lave_vaisselle_start'',
        ''last_triggered'')) | as_local).strftime("%Hh%M") }} à {{ now().strftime("%Hh%M")
        }} Soit une durée de {{ ((now() - (state_attr(''automation.lave_vaisselle_start'',
        ''last_triggered''))).seconds  / 3600 )| int }}h{{ (((now() - (state_attr(''automation.lave_vaisselle_start'',
        ''last_triggered''))).seconds % 3600 )/60 )| round }}m\n Le cycle à consommé
        {{ states(''sensor.lave_vaisselle_power_cycle'') }}Wh\n Pour un coût de {{
        (states(''sensor.lave_vaisselle_power_cycle'') | float(default=0) * (states(''sensor.edf_tempo_current_cost'')|
        float(default=0)) /1000) | round(2) }}€

        '
2 « J'aime »

Hello @roumano , merci pour ces améliorations, je vais corriger mes automatisations et tester tout ça pour avoir le début de production et la fin de production de mes panneaux solaire dans la journée :slight_smile:

Bonjour @roumano et bravo pour ton partage. J’ai appliqué tes recommandations et j’ai cependant un doute sur le total d’énergie consommé durant une durée.
En effet, j’ai suivi ton tuto et j’ai crée un utility meter pour mon lave linge connecté à une prise koniks priska max 3.
j’ai lancé une machine (avec bien évidemment le utility meter calibrate à 0) et à la fin de la machine j’obtiens une puissance consommée de 3082 wh. (fig ci dessous)
image

or depuis l’application koniks il m’est possible de regarder la puissance totale consommée durant la machine qui est donc de 450 wh.

Du coup avant dans utility meter il était possible d’avoir le calcul de l’intégrale via method: left ,ce qui pourrait correspondre à ce qu’indique koniks mais là j’ai l’impression que la valeur qui remonte dans l’utility crée (lave linge power cycle) c’est plutôt le pic de puissance atteint durant le cycle et non la puissance totale consommée durant le cycle.

qu’en penses tu ? Suis je dans le vrai ou alors ou est mon erreur ?

Merci

D’après ton graph, la nouvelle valeur semble correspondre a l’ancienne plus tes 450wh, non ?

Comme si, le reset ne sert a rien (pourtant, il passe à zéro d’après ton graph )

Bonjour @roumano
J’ai cherché un long moment et je n’ai toujours pas trouvé d’explication. Pour tester le reset j’ai crée un bouton faidant appel au service utility_meter.calibrate avec la valeur 0. Cà marche pour la remise à zéro.
Dans mon automatisme aussi, mais au final le compteur s’incrémente toujours…aujourd’hui je viens de faire une machine, l’utility était à zéro et à la fin j’ai une conso de 17999 w !!!
as tu une idée d’où cela buggerait?? Merci

PS: j’ai lu dans la doc utility qu’une option etait envisageable avec des prises connectées.
voici mon code actuel :

    source: sensor.konyks_1_power
    cycle: daily
    periodically_resetting: true

Reste à voir à la prochaine machine.

Bonjour @roumano,
Petit message pour confirmer que j’ai ré-utilisé largement tes automatismes et que j’arrive maintenant à avoir toutes les info disponibles (durée de cycle, consommation et coût associé). Un grand merci pour le partage !
Pour le moment, je n’ai créé que des notifications internes à HA (persistent_notification). Me reste juste un peu de travail de mise en forme.
La prochaine étape : les notifications dans le fichier csv. Juste une question: as-tu créé un fichier vierge initialement ? A quel endroit as-tu inséré le code

notify:
- name: lave_vaisselle
  platform: file
  filename: /data/git/cycle/lave_vaisselle.csv

Merci d’avance

Dans le fichier configuration.yaml, pas besoin de créer le fichier, il sera créé par HA (si il a les droits Unix pour le faire)

1 « J'aime »

Bonjour @roumano ,

Bon ben je reviens vers toi et ton expertise dans ke domaine car je n’ai toujours pas trouvé la solution et j’espère que tu seras en mesure de m’aider.


Comme tu peux le voir la calibration du power cycle fonctionne bien. Pour en être certain j’ai également ajouté un calibrate une fois la machine terminée…la remise à zéro fonctionne mais l’utility meter m’indique toujours le cumul global de toutes les machines effectuées. Du coup je tourne en rond.
je poste ici mon code des fois qu’une coquille y serait insérée…
pour l’utility_meter


utility_meter:

# données utiles pour envoy
  daily_energy_import:
    source: sensor.energy_imported_wh
    cycle: daily
  daily_energy_export:
    source: sensor.energy_exported_wh
    cycle: daily
# calcul Pluie hebdomadaire, mensuelle et annuelle
  rain_week:
    source: sensor.rainfall_today 
    cycle: weekly
  rain_month:
    source: sensor.rainfall_today 
    cycle: monthly
  rain_year:
    source: sensor.rainfall_today 
    cycle: yearly
  lave_linge_power_cycle:
    source: sensor.konyks_1_power
    cycle: daily
    periodically_resetting: true


pour les input: machine en cours de type interrupteur

pour les automatismes,

alias: Machine à laver en cours
description: >-
  détecte la modification de puissance sur la prise machine à laver , passe
  l'interrupteur de off à on et notifie le oneplus 8t du début de la machine
trigger:
  - type: power
    platform: device
    device_id: 2089a00f0cdef9bdf19ecf1f5d7e6e51
    entity_id: sensor.konyks_1_power
    domain: sensor
    above: 1
condition:
  - condition: state
    entity_id: input_boolean.machine_en_cours
    state: "off"
action:
  - service: utility_meter.calibrate
    data:
      value: "0"
    target:
      entity_id: sensor.lave_linge_power_cycle
  - service: input_boolean.turn_on
    data: {}
    target:
      entity_id: input_boolean.machine_en_cours
  - service: notify.mobile_app_kb2003
    data:
      title: 📢 Machine
      message: La machine à laver est en cours
  - service: notify.mobile_app_ne2213
    data:
      message: La machine à laver est en cours
      title: 📢 Machine
mode: single

pour la fin de la machine

alias: machine à laver terminée
description: >-
  si puissance descend en dessous de  20w et machine en cours sur on , alors fin
  de la machine. notifications sur les deux téléphones
trigger:
  - type: power
    platform: device
    device_id: 2089a00f0cdef9bdf19ecf1f5d7e6e51
    entity_id: sensor.konyks_1_power
    domain: sensor
    below: 3
    for:
      hours: 0
      minutes: 3
      seconds: 0
condition:
  - condition: state
    entity_id: input_boolean.machine_en_cours
    state: "on"
action:
  - service: input_boolean.turn_off
    data: {}
    target:
      entity_id: input_boolean.machine_en_cours
  - service: notify.mobile_app_kb2003
    data:
      message: >-
        La machine à laver est terminée. Le cycle s'est       déroulé de
        {{      
        ((state_attr('automation.machine_a_laver_en_cours','last_triggered'))
        |       as_local).strftime("%Hh%M") }} à {{      
        ((state_attr('automation.fin_machine_a_laver','last_triggered')) |      
        as_local).strftime("%Hh%M") }}. Soit une durée de {{ ((      
        (state_attr('automation.fin_machine_a_laver','last_triggered')) -      
        (state_attr('automation.machine_a_laver_en_cours','last_triggered'))).seconds      
        / 3600 )| int }}h{{      
        ((((state_attr('automation.fin_machine_a_laver','last_triggered'))
        -      
        (state_attr('automation.machine_a_laver_en_cours','last_triggered'))).seconds      
        % 3600 )/60 )| round }}mn. Le cycle à consommé
        {{ states(''sensor.lave_linge_power_cycle'') }}Wh\n
      title: 💥 Machine à étendre..
  - service: notify.mobile_app_ne2213
    data:
      message: >-
        La machine à laver est terminée. Le cycle s'est             déroulé de
        {{      
        ((state_attr('automation.machine_a_laver_en_cours','last_triggered'))      
        |       as_local).strftime("%Hh%M") }} à {{      
        ((state_attr('automation.fin_machine_a_laver','last_triggered')) |      
        as_local).strftime("%Hh%M") }}. Soit une durée de {{ ((      
        (state_attr('automation.fin_machine_a_laver','last_triggered')) -      
        (state_attr('automation.machine_a_laver_en_cours','last_triggered'))).seconds      
        / 3600 )| int }}h{{      
        ((((state_attr('automation.fin_machine_a_laver','last_triggered'))
        -      
        (state_attr('automation.machine_a_laver_en_cours','last_triggered'))).seconds      
        % 3600 )/60 )| round }}mn. Le cycle à consommé
        {{ states(''sensor.lave_linge_power_cycle'') }}Wh\n
      title: 💥 Machine à étendre..
  - service: notify.mobile_app_kb2003
    data:
      data:
        ttl: 0
        priority: high
        media_stream: alarm_stream_max
        tts_text: >-
          Attention Philippe, la machine à laver est à étendre. Le cycle
          s'est       déroulé de {{
          ((state_attr('automation.machine_a_laver_en_cours','last_triggered'))
          |       as_local).strftime("%Hh%M") }} à {{
          ((state_attr('automation.fin_machine_a_laver','last_triggered')) |
          as_local).strftime("%Hh%M") }}. Soit une durée de {{ ((
          (state_attr('automation.fin_machine_a_laver','last_triggered')) -
          (state_attr('automation.machine_a_laver_en_cours','last_triggered'))).seconds
          / 3600 )| int }}h{{
          ((((state_attr('automation.fin_machine_a_laver','last_triggered')) -
          (state_attr('automation.machine_a_laver_en_cours','last_triggered'))).seconds
          % 3600 )/60 )| round }}mn. Le cycle à consommé
        {{ states(''sensor.lave_linge_power_cycle'') }}Wh\n
      message: TTS
  - service: utility_meter.calibrate
    data:
      value: "0"
    target:
      entity_id: sensor.lave_linge_power_cycle
mode: single

Merci de ton aide.