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

Non, je pense pas qu’il y a besoin d’enregistrer la conso au début car cette info est enregistrer
car contre, pour arriver a ce résultat, il faut faire un mix avec ces 2 variables : sensor.XXX_energy , sensor.XXX_power

Je pense qu’il faudrait faire 2 automatisations :

  • 1er :
trigger : sensor.XXX_power > 1watt 
action: enregistrer date_début
  • 2eme ( la plus compliqué ) :
trigger : sensor.XXX_power < 1watt 
action: 
- enregistrer date_fin
- calculer le temps de cycle ( date_fin - date_début )
- calculer la conso_utiliser : `sensor.XXX_energy - sensor.XXX_energy a la date_debut` 
- calculer le coût : conso_utiliser * prix fixe (si pas d'heure_creuse) 
- envoyer notification avec ces infos crées

Ou là il va falloir que je regarde ça de plus prêt car pas encore fait d’automation dans HA
Je fais dans Node Red

Les trigger pas de soucis c’est ce que je fais déjà dans mon Jeedom

Dans la 1ère automation je cale sur enregistrer la date heure :slight_smile: lest’s go dans les recherche
La partie calcul, bon c’est des dates donc c’est chiant ça :wink:

Mais là où j’ai du mal à saisir c’est le comment le système sait la conso au démarrage !?
Tu dis que c’est enregistrer oui mais il faut prendre l’enregistrement pile au moment du trigger de l’automation 1
Je ne saisie pas comment tu reviens en arrière

Je ne connais rien en nodered… Mais peut-être une piste qui peut t’aider …
En yaml, on peut enregistrer par exemple la donnée d’un capteur lors d’un changement d’état.
Par exemple, la date et l’heure de passage d’une prise de l’état Off à l’état On.
On utilise pour cela les imput text, imput number, etc…
Je n’ai pas regardé en détail, mais cela se couple avec un trigger et des automatisations pour relire les données…
Ici un exemple : Calcul intervalle de temps en jour pour notification
C’est peut-être un début de piste pour toi.
Et je te l’accorde, ce que tu veux faire n’est peut être pas que des maths :slight_smile:

1 « J'aime »

Tu le places ou ton bloc template ?

Soit dans le configuration.yaml.
Soit tu as un fichier à part templates.yaml, et tu mets le bloc dedans.
Et tu ajoutes dans le configuration.yaml

template: !include templates.yaml
1 « J'aime »

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