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

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 »

A l’époque où j’étais sur Jeedom, j’avais un scénario pour la mise ne route qui regardait sur Puissance > x W puis 120 secondes plus si la Puissance > x W toujours alors c’est que la machine est bien démarrée.
De cette manière, on évite le ON/OFF par erreur entre autre

et pour le le scénario de OFF j’attendais 60 secondes pour affirmer que la machine est terminée

Je mettais un sleep dans le scénario

PS :
je viens de faire un vague de test pour faire un message embed discord (avec les infos sensor dedans) : un échec pour ce soir :slight_smile:
Par contre dans le fichier csv il y a un hic il y 7h60m ! et un 8h2m au lieu de 8h02 pas méchant celui ci je pense mais pas encore regardé

Ton scénario ne fonctionne pas avec mon lave-vaisselle :
en fin de cycle, pendant le séchage, celui-ci consomme presque rien mais n’a pas fini.

Sur le graph ci-joint, mon cycle est vraiment fini a 16h19 (le tout petit pique d’environ 20watt pendant moins d’une minutes ) et non 15h08 comme l’aurais indiquer ton Jeedom scénario :

Bizarre, moi j’ai un résultat différent mais pas forcement mieux :

07/04/2023 ; 14h19 ; 17h19 ; 3h0m ; 948Wh ; 0.14€ ;

Idéalement, il faudrait écrire 3h et non 3h0m

Par contre changer ça, c’est un peut la galère et pas facile , … ( le code incriminé est {{ ((((state_attr('automation.lave_vaisselle_fin','last_triggered')) - (state_attr('automation.lave_vaisselle_start','last_triggered'))).seconds % 3600 )/60 )| round }}m

il faudrait y rajouter un test, si c’est 60 ou 0, ne rien mettre (même pas le m)

Tu pense qu’il faudrait écrire 8h02 et non 8h2m ? ( si oui, il doit y avoir une fonction python pour que le nombre soit forcement sur 2 chiffres mais je connais pas.

Sinon, peut-être qu’on peut demander une évolution sur easy-time ( nouvelle fonctionne de macro ) pour permettre d’afficher « joliment » des différences de temps :
GitHub - Petro31/easy-time-jinja: Easy Time calculations for Home Assistant templates

Oui oui je comprends bien la difficulté, je partageais déjà le soucis vu sur les tests
J’ai un vrai cycle aujourd’hui sur mon lave vaisselles on verra ce que cela donne

J’ai pas encore pris le temps de regarder le sujet macro sur le temps les évolutions vont plus vite que moi :slight_smile:

Mais oui dans l’idéal il faudrait écrire sur 2 digit c’est plus propre je trouve et autorisé aussi le 36hxx pas pour la machine à laver mais pour d’autres usages sur temps long sur deux journées plus !!

Les calculs sur dates et times sont pénibles c’est clair mais c’est la base

J’ai trouver comment faire (et rendre le code également un peut plus lisible également)
au début, il faut rajouter ça :

{%- set time = ((state_attr('automation.lave_linge_fin','last_triggered')) - (state_attr('automation.lave_linge_start','last_triggered'))).seconds -%}
{%- set minutes = ((time % 3600) / 60) | round | int -%}
{%- set hours = ((time % 86400) / 3600) | int -%}

Du coup, on peut remplacer ce gros pâter

{{ (((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

par

{{ '{:01}h{:02}m'.format(hours, minutes) }}
1 « J'aime »

Top ça pas certain de mettre en route to day mais je regarde

@roumano , super simplification. Je vais essayer aussi.
Lorsque tu dis « au début, il faut rajouter ça : », tu parles du début des actions de l’automatisation des notifications je présume. Correct?
De mon côté, je galère pour la mise en forme des notifications. Le formatage du Yaml pour arriver à générer des retours à la ligne est loin d’être évident, malgré la lecture de multiples threads sur les options de formatage de texte.
Je vais bien finir par y arriver, mais à chaue fois il faut attendre de lancer un lave-vaisselle pour tester :wink:

Au début de la notification, comme ça :

service: notify.lave_vaisselle
data:
  message: >
    {%- set time =
    ((state_attr('automation.lave_vaisselle_fin','last_triggered')) -
    (state_attr('automation.lave_vaisselle_start','last_triggered'))).seconds
    -%} {%- set minutes = ((time % 3600) / 60) | round | int -%} {%- set hours =
    ((time % 86400) / 3600) | int -%} {{ 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") }} ; {{ '{:01}h{:02}m'.format(hours, minutes) }}
    ; {{ 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) }}€ ;

Tu peut lancer manuellement l’automatisation, …

Bonsoir

Sans avoir vraiment eu le temps de regarder je viens de copier coller à l’instant le dernier bout de code en changeant avec mes sensors et j’ai ce retour

Error: Error rendering data template: TypeError: unsupported operand type(s) for -: 'NoneType' and 'datetime.datetime'

EDIT :
Une erreur sur le nom de mon automation !!
Un sujet ICC encore une fois :wink:

Voici une adaptation de la notification
image

En fait 2 en une soit en texte soit en fields via l’automation HA

1 « J'aime »

Avec les images ça passe sur smartphone ?
Tu peut partager ton code?
Merci et bon boulot, ça présente bien

Oui oui je peux partager mais j’étais pas en posture de pouvoir le faire (ipad et métro au moment du screen)

Dès que je suis sur le PC je partage le code sans soucis.

Sur téléphone c’est plus ramassé mais les images passe il faut les avoir sur une adresse https://
Pour faire ça j’ai déposé des images sur imgur.com si je me trompe pas l’adresse dans mon code marchera tant que je supprime pas l’image.

J’ai aussi ajouté un bout pour publier les résultats en mqtt afin d’utiliser ces infos dans un flow éventuel de Node Red car mon centre de notification est dans Node Red.

Bref je mettrais tout ça au propre :smiley:

@roumano et tous ceux qui sont intéressés :wink:

Voici le code de la notification via bot discord

Notification discord simple sans fields
service: notify.VOTRE_BOT_DISCORD
data:
  message: ""
  target:
    - "CHANNEL_ID"
  data:
    embed:
      title: ""
      description: >-
        {%- set time =
        ((state_attr('automation.lave_vaisselle_fin_notification','last_triggered'))
        -
        (state_attr('automation.lave_vaisselle_start','last_triggered'))).seconds-%}
        {%- set minutes = ((time % 3600) / 60) | round | int -%} {%- set hours =
        ((time % 86400) / 3600) | int -%} 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_notification','last_triggered')
        | as_local).strftime("%Hh%M") }}**

        Pour une durée de **{{ '{:01}h{:02}'.format(hours, minutes) }}**

        Le cycle à consommé
        **{{states('sensor.pc_cuisine_lave_vaisselles_energy_kwh_heure') | round
        }}** Wh

        Pour un coût de
        **{{(states('sensor.pc_cuisine_lave_vaisselles_energy_kwh_heure') |
        float * (states('input_number.hp_energy_cout')| float)) | round(2) }}**
        €
      url: https://www.home-assistant.io
      color: 199363
      author:
        name: Gestion des machines
        url: https://www.home-assistant.io
        icon_url: https://i.imgur.com/f9u45dD.png
      footer:
        text: "HA - Lave-Vaisselles Fin : Notification"
        icon_url: https://www.home-assistant.io/images/favicon-192x192-full.png
      thumbnail:
        url: https://i.imgur.com/f9u45dD.png 

Pour avoir ceci :
image

Sinon pour utiliser le fields :

Notification discord avec fields uniquement
service: notify.VOTRE_BOT_DISCORD
data:
  message: ""
  target:
    - "CHANNEL_ID"
  data:
    embed:
      title: ""
      description: ""

      url: https://www.home-assistant.io
      color: 199363
      author:
        name: Gestion des machines
        url: https://www.home-assistant.io
        icon_url: https://i.imgur.com/f9u45dD.png
      footer:
        text: "HA - Lave-Vaisselles Fin : Notification"
        icon_url: https://www.home-assistant.io/images/favicon-192x192-full.png
      thumbnail:
        url: https://i.imgur.com/f9u45dD.png
      fields:
        - name: Début du cycle
          value: >-
            {{((state_attr('automation.lave_vaisselle_start','last_triggered'))
            | as_local).strftime("%Hh%M") }}
          inline: true
        - name: Fin du cycle
          value: >-
            {{(state_attr('automation.lave_vaisselle_fin_notification','last_triggered')
            | as_local).strftime("%Hh%M") }}
          inline: true
        - name: Durée du cycle
          value: >-
            {%- set time =
            ((state_attr('automation.lave_vaisselle_fin_notification','last_triggered'))
            -
            (state_attr('automation.lave_vaisselle_start','last_triggered'))).seconds-%}
            {%- set minutes = ((time % 3600) / 60) | round | int -%} {%- set
            hours = ((time % 86400) / 3600) | int -%} **{{
            '{:01}h{:02}'.format(hours, minutes) }}**
          inline: true
        - name: Consommation
          value: >-
            {{ states('sensor.pc_cuisine_lave_vaisselles_energy_kwh_heure') |
            round }} Wh
          inline: true
        - name: Coût
          value: >-
            {{(states('sensor.pc_cuisine_lave_vaisselles_energy_kwh_heure') |
            float * (states('input_number.hp_energy_cout')| float)) | round(2)
            }} €
          inline: true

        - name: Nombre de cycle
          value: >-
            {{states('counter.cycle_lave_vaisselles') | float(default=0) |
            round(0)}}
          inline: true

pour avoir ceci
image

Ne pas oublier de modifier les sensors et les entités à votre propre usage.
Les valeurs sur mes screens sont des valeurs fictives de test bien entendu

Le test grandeur nature
Sur mon Jeedom :
image

Sur HA avec les automatisation de ce post :
image

Il semble que j’ai un soucis sur la partie conso qui n’est pas énorme :slight_smile: