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

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.

Tu les places où les sensors ?
Un fichier plateform.yaml ou history.yaml ???

A vérifier, mais je pense que le souci est là : source: sensor.konyks_1_power

Tu devrais avoir un autre sensor pour ton konyks, mais de type energy, comme tes autres sensors de l’ utility meter.

Bonjour syl2042, bravo pour ta proposition.

Pour moi il me reste encore à ce que HA prenne en compte le fichier que j’ai créé sensors.yaml dans le directory de configuration.yaml,

Comment as-tu fait ?
Voici mon configuration.yaml à qui j’ai ajouté:

template: !include templates.yaml
homeassistant:
# KNX IP Interface ABB IP Router IPR/S
  packages: !include_dir_named knxfiles

# Loads default set of integrations. Do not remove.
default_config:

# Load frontend themes from the themes folder
frontend:
  themes: !include_dir_merge_named themes

# Text to speech
tts:
  - platform: google_translate

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
camera: !include cameras.yaml
template: !include templates.yaml

Mais si j’ajoute = erreur de configuration

sensor: !include sensors.yaml

J’ai résolu mon problème après avoir trouvé et lu:
Répartir le fichier configuration.yaml en plusieurs fichiers

Bonne journée…

Bonjour @roumano
Très joli travail bravo

j’ai quelques questions pour bien comprendre ce qui est partagé.
Ton input_boolean.lave_vaisselle_cycle est une entrée que tu as réalisé c’est pas un sensor d’une prise ou autre ? Une entrée pour bien matérialiser que le cycle est ON ou OFF en somme ?

Donc sur le Start
Tu regardes si le cylce est bien OFF, tu mets à 0 l’utility meter et tu mets à ON le cycle

Sur l’automation Fin ?
Tu regardes si le cycle est bien ON, tu lances la notification et tu passes le cycle à OFF

C’est bien ça ?
Le reste les calculs etc… se font dans la partie message des notifications ou bien entendu on adapte le sensor des coûts par exemple ou autres

Si j’ai bien compris la philosophie je vais regarder pour associer à ceci un compteur de cycle mensuel ou annuel, voir même cumuler les infos de cette notification pour voir l’usage global par mois ou année !

Merci encore une fois pour ce partage

Oui tu a bien compris.
J’ai étais obliger de créé ce bolean car les lave vaisselle fonctionne par cycle et pendant un long moment console pas mais n’ont pas fini leurs cycles.

1 « J'aime »