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

Bonjour à tous…

Je vous partage ici une astuce qui permet de connaître le temps d’allumage d’un appareil. Que ce soit une prise connectée, une lumière, etc…
C’est idiot, mais certaines prises vous remontent la puissance, le voltage, mais pas la durée d’allumage.

Je souhaitais cela à la base pour calculer le temps de chauffage de mon thermostat Netatmo.
Mais c’est compliqué du fait de ses modes internes… Je n’abandonne pas, et cela peut marcher avec d’autres marques de thermostat, mais Netatmo est mal foutu sur le sujet. Bref…

Ducoup j’ai utilisé ceci pour avoir le temps d’allumage des prises wifi et zigbee de la salle de jeux des gosses par exemple. Sur laquelle sont branchés ordis et consoles.

Comme j’ai pu le faire pour calculer le temps d’allumage de la TV, à la journée, hier, semaine ou mois.

C’est drôle, mais cela a bien fait réagir les gosses qui ne s’attendaient pas à un tel résultat :slight_smile:

Donc, voici ce qu’on obtient :

image

Pour arriver à cela, on va devoir créer des templates et des sensors.

Pour mon exemple, les templates !

template:
  sensor:
      temps_pm_today:
        device_class: duration
        value_template: "{% set hours = states('sensor.temps_allumage_pm_today') | float %} 
        {% set minutes = ((hours % 1) * 60) | int %}
        {{ '%02ih %02im'%(hours // 1, minutes) }}"
        friendly_name: temps_pm_today
        unique_id: "temps_pm_today"
      temps__pm_hier:
        device_class: duration
        value_template: "{% set hours = states('sensor.temps_allumage_pm_hier') | float %} 
        {% set minutes = ((hours % 1) * 60) | int %}
        {{ '%02ih %02im'%(hours // 1, minutes) }}"
        friendly_name: temps_pm_hier
        unique_id: "temps_pm_hier"
      temps__pm7_semaine:
        device_class: duration
        value_template: "{% set hours = states('sensor.temps_allumage_pm_semaine') | float %} 
        {% set minutes = ((hours % 1) * 60) | int %}
        {{ '%02ih %02im'%(hours // 1, minutes) }}"
        friendly_name: temps_pm_semaine
        unique_id: "temps_pm_semaine"
      temps__pm_mois:
        device_class: duration
        value_template: "{% set hours = states('sensor.temps_allumage_pm_mois') | float %} 
        {% set minutes = ((hours % 1) * 60) | int %}
        {{ '%02ih %02im'%(hours // 1, minutes) }}"
        friendly_name: temps_pm_mois
        unique_id: "ttemps_pm_mois"

Et les sensors correspondant :

- platform: history_stats
  name: temps_allumage_pm_today
  entity_id: light.socket_1
  state: 'on'
  type: time
  start: "{{ now().replace(hour=0, minute=0, second=0, microsecond=0) }}"
  end: "{{ now() }}"
  
- platform: history_stats
  name: temps_allumage_pm_hier
  entity_id: light.socket_1
  state: 'on'
  type: time
  end: "{{ now().replace(hour=0, minute=0, second=0, microsecond=0) }}"
  duration:
    hours: 24
    
- platform: history_stats
  name: temps_allumage_pm_semaine
  entity_id: light.socket_1
  state: 'on'
  type: time
  start: "{{ as_timestamp( now().replace(hour=0, minute=0, second=0, microsecond=0) ) - now().weekday() * 86400 }}"
  end: "{{ now() }}"
  
- platform: history_stats
  name: temps_allumage_pm_mois
  entity_id: light.socket_1
  state: 'on'
  type: time
  start: "{{ now().replace(day=1, hour=0, minute=0, second=0, microsecond=0 ) }}"
  end: "{{ now() }}"

Remplacez évidemment le entity ID dans le sensor, par celui dont vous souhaitez mesurer le temps.

Et ce qui est primordial, c’est que le nom de l’entité dans le value_template du template, soit le même que le name du sensor.

Une fois ces fichiers modifiés, soit directement dans votre configuration.yaml, soit comme moi, sur des fichiers templates et sensors.yaml dédiés, passez par les outils de développement pour vérifier la configuration.

Cela permet de vérifier que vous n’avez pas d’erreur dans le code.

Si tout est ok, redémarrer HA pour prendre en compte les modifs;

Une fois redémarré, vous verrez apparaitre vos nouveaux sensors dans l’onglet statistiques des outils de développement. C’est pour cela qu’on utilise dans les sensors, le platform: history_stats.

Ben après, vous n’avez plus qu’à les intégrer comme bon vous semble. En entité, en graph, ou la carte que vous souhaitez.

A noter que vous calculez ici la durée d’un état. Moi j’ai le state ‹ on ›, mais à contrario, vous pouvez calculer une durée d’extinction avec un state ‹ off ›.

Et cela fonctionne sur tous les états de votre entité. Et pour connaître les états possibles, il faut vous rendre sur les outils de développement de HA, et aller dans « Etats ». Et vous verrez les états possible de votre appareil.

Si on gère une fonction de présence à la maison, on peut par exemple calculer la durée d’absence ou de présence d’une personne : state: "home’ ou state: ‹ not_home ›…

Après, laissez libre court à votre imagination :slight_smile:

Si vous souhaitez calculer sur des durées différentes, référez vous à History Stats - Home Assistant

En espérant que cela vous plaira :).

Syl20

12 « J'aime »

Super idée @syl2042 merci pour le partage !
En survolant je n’ai pas vu sur quelle période c’est mesuré ? Autrement dit les compteurs sont remis à zéro tous les jours à minuit ?

Hey c’est rigolo, je crois que @jerome6994 cherche exactement un truc comme ça. Merci pour le partage.

1 « J'aime »

Salut,
faut voir la doc de history stats qui est une intégration standard HA, tout y est expliqué
Tu peux y mettre les durées que tu veux, tu peux le voir dans les paramètres « start » « end » et/ou « duration » des sensors dans la config partagée par @syl2042

2 « J'aime »

Merci pour le partage ! J’avais a l’époque vu la sortie de history_stats, mais jamais utilisé. Couplé a un template, c’est effectivement très puissant.
Je vois une autre utilisation qui est la mesure d’une consommation électrique, quand on connait les on-off de l’appareil et sa puissance.
A tester pour un chauffage électrique en particulier géré par fil pilote. Le résultat peut être injecté dans le module Energy.

Marchera aussi pour la consommation électrique de la TV…. :blush:

1 « J'aime »

Merci pour le partage et merci @McFly pour le tag :stuck_out_tongue_winking_eye: j’ai vu passer le poste et mis un suivi et signer dessus dessus direct.

Effectivement je cherche le temps de fonctionnement d’un prise par exemple et même plus.
Mais ça va me faire une base de départ à ma recherche.
Ensuite je cherche aussi à le faire via Node Red :smile:

Les plus que je cherche c’est sur le temps de fonctionnement :

  • la puissance consommée
  • la puissance consommée et cumulée
  • nombre de cycle d’allumage on / off de la prise
  • tps de fonctionnement cumulé

Pour permettre de faire ce genre de notification

3 « J'aime »

Oui, pas mal d’arriver à cela effectivement… Je vais essayer aussi… On a la base de temps, donc à partir de là, ce ne sont que des maths… Cela ne devrait pas être trop compliqué…

Oui, remis à 0 tous les jours à minuit pour le today… Remis à 0 le 1er jour du mois, ou de la semaine… Tout est bien expliqué dans le chapitre sur le history_stats de HA.

1 « J'aime »

Il faut aussi au même moment prendre la conso en Wh au début et à la fin et faire des maths on est d’accord.
Ensuite je suis débutant sur HA donc l’évidence n’est pas si évidente que ça parfois :slight_smile:

1 « J'aime »

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 »