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

Effectivement, si j’ouvre le fichier avec le bloc note, je n’ai pas de bug d’affichage

Lors du redémarrage de HA, ou suite à une indisponibilité du zigbee, je reçois de nouveau une notification.
voir photo ci dessous :

Comment faire pour éviter cela ?

Il y plusieurs solution mais moi j’ai pas ce souci, sûrement du fait que j’ai mis cette « protection » dans l’automatisation de fin :

  condition:
  - condition: state
    entity_id: input_boolean.lave_vaisselle_cycle
    state: 'on'

Pour ma part je n’utilise que 2 automatisations :

  • Celle de départ :
START
alias: "03a - Lave Vaisselle : Start"
description: Lave Vaisselle Start
trigger:
  - type: power
    platform: device
    device_id: 9f4a7bf121c459cf0544a0b0c2a464a5
    entity_id: sensor.0xa4c1389a6388b5b5_power
    domain: sensor
    above: 5
    for:
      hours: 0
      minutes: 5
      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
  - service: notify.telegram_pascal_ha
    data:
      title: ⚠️ Lave-Vaisselle Depart
      message: |
        ♻ Le cycle de lavage à commencé
mode: single

Et

  • celle de FIN : notification
FIN
alias: "03c - Lave-Vaisselle Fin : Notification"
description: |-
  a la fin du cycle : 
  - reset de l'utility meter
  - notification de la durée et de la consommation du cycle du lave-vaisselle
trigger:
  - type: power
    platform: device
    device_id: 9f4a7bf121c459cf0544a0b0c2a464a5
    entity_id: sensor.0xa4c1389a6388b5b5_power
    domain: sensor
    below: 8
    for:
      hours: 0
      minutes: 30
      seconds: 0
condition: null
action:
  - service: input_boolean.turn_off
    data: {}
    target:
      entity_id: input_boolean.lave_vaisselle_cycle
  - service: notify.telegram_pascal_ha
    data:
      title: ⚠️ Lave-Vaisselle :Fin de Lavage 🍽
      message: >
        {%- set time =
        ((state_attr('automation.03c_lave_vaisselle_notification_fin','last_triggered'))
        -
        (state_attr('automation.03a_lave_vaisselle_start','last_triggered'))).seconds
        -%} {%- set minutes = ((time % 3600) / 60) | round | int -%} {%- set
        hours = ((time % 86400) / 3600) | int -%} {{ now().strftime("%d/%m/%Y")
        }} 

        🔄 debut de cycle : {{
        ((state_attr('automation.03a_lave_vaisselle_start','last_triggered')) |
        as_local).strftime("%Hh%M") }} 

        🔃 Fin de cycle : {{
        (state_attr('automation.03c_lave_vaisselle_notification_fin','last_triggered')|
        as_local).strftime("%Hh%M") }} 

        🕐 Durée du cycle {{ '{:01}h{:02}m'.format(hours, minutes) }} 

        ⚡ Puissance : {{ states('sensor.lave_vaisselle_power_cycle') | round
        }}Kwh 

        💰 cout : {{ (states('sensor.lave_vaisselle_power_cycle') |
        float(default=0) * (states('sensor.edf_tempo_prix_actuel')|
        float(default=0)) /10) | round(3) }}€         
  - service: notify.telegram_isabelle_ha
    data:
      title: ⚠️ Lave-Vaisselle :Information 🍽
      message: >
        {%- set time =
        ((state_attr('automation.03c_lave_vaisselle_notification_fin','last_triggered'))
        -
        (state_attr('automation.03a_lave_vaisselle_start','last_triggered'))).seconds
        -%} {%- set minutes = ((time % 3600) / 60) | round | int -%} {%- set
        hours = ((time % 86400) / 3600) | int -%} {{ now().strftime("%d/%m/%Y")
        }} 

        🔄 debut de cycle : {{
        ((state_attr('automation.03a_lave_vaisselle_start','last_triggered')) |
        as_local).strftime("%Hh%M") }} 

        🔃 Fin de cycle : {{
        (state_attr('automation.03c_lave_vaisselle_notification_fin','last_triggered')|
        as_local).strftime("%Hh%M") }} 

        🕐 Durée du cycle {{ '{:01}h{:02}m'.format(hours, minutes) }} 

        ⚡ Puissance : {{ states('sensor.lave_vaisselle_power_cycle') | round
        }}Kwh 

        💰 cout : {{ (states('sensor.lave_vaisselle_power_cycle') |
        float(default=0) * (states('sensor.edf_tempo_prix_actuel')|
        float(default=0)) /10) | round(3) }}€  
  - service: notify.lave_vaisselle
    data:
      message: >
        {{ now().strftime("%d/%m/%Y") }} ; {{
        ((state_attr('automation.03a_lave_vaisselle_start', 'last_triggered')) |
        as_local).strftime("%Hh%M") }} ; {{ now().strftime("%Hh%M") }} ; {{
        ((now() - (state_attr('automation.03a_lave_vaisselle_start',
        'last_triggered'))).seconds / 3600 )| int }}h{{ (((now() -
        (state_attr('automation.03a_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_prix_actuel')| float(default=0)) /10) |
        round(3) }}€        
mode: single

J’ai ajouté cette condition dans FIN , Je vais tester. Merci

Salut,
C’est exactement ça.

Perso, je préfère avoir 3 automations pour que le temps de fin soit le plus précis possible

Oui, j’ai commencé avec les 3 automatisations, mais je recevais du coup l’information de fin de cycle avec 1 heure de retard (suivant le temps réglé)

Avec 3, tu peux être aussi précis que 2, il suffit de mettre les bonnes valeurs dans le trigger;)

Hello,
J’essaie d’appliquer la même chose, mais à l’utilisation de mon chauffe-eau.
En gros, mon chauffe-eau est autorisé (via switch Zigbee) à tourner 5h par jour, mais via le sensor power du chauffe-eau, on voit qu’il tourne moins que 5h.
L’idée, serait d’afficher le temps d’utilisation de l’appareil au-dessus de 2 000w par exemple
image
Si quelqu’un à une idée sur la façon d’interpréter cette carte :grinning:

Que ce soit un chauffe-eau, lave-linge, lave-vaisselle, charge de batterie, la solution fournie s’appplique également : Obtenir le temps d'utilisation d'un appareil électrique sur une période donnée - #21 par roumano

Après, si tu veut juste un sensor journalier qui affiche le temps utiliser, il te faut :

  • ce type de sensor : ( a adapter le nom & la source )
    - name: "portail_en_fonctionnement"
      unique_id: "portail_en_fonctionnement"
      state: >
        {% if states('sensor.circuit_12_power') | int >= 10 %}
          on
        {% else %}
          off
        {% endif %}

  • puis un history_stats sur celui-ci :
- platform: history_stats
  name: "temps allumage portail today"
  unique_id: "temps allumage portail today"
  entity_id: sensor.portail_en_fonctionnement
  state: 'on'
  type: time
  start: "{{ now().replace(hour=0, minute=0, second=0, microsecond=0) }}"
  end: "{{ now() }}"

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

C’est parfait, je te remercie :ok_hand:t2:
image

Salut,
j’ai repris ton principe , du sensor par rapport a la puissance de la prise.

    - name: 'Ordinateur en fonctionnement'
      unique_id: 'ordinateur_en_fonctionnement'
      state: >
        {% if states('sensor.0xa4c138244f6e91e3_power') | int(0) >= 10 %}
          on
        {% else %}
          off
        {% endif %}

    - name: 'Télévision en fonctionnement'
      unique_id: 'television_en_fonctionnement'
      state: >
        {% if states('sensor.0xa4c138d4c17833b3_power') | int(0) >= 10 %}
          on
        {% else %}
          off
        {% endif %}

Et les history_stats pour le calcul de la journée:

- platform: history_stats
  name: Temps Allumage Ordinateur
  unique_id: "temps_allumage_ordinateur"
  entity_id: sensor.ordinateur_en_fonctionnement
  state: 'on'
  type: time
  start: "{{ now().replace(hour=0, minute=0, second=0, microsecond=0) }}"
  end: "{{ now() }}"

- platform: history_stats
  name: Temps Allumage Télévision
  unique_id: "temps_allumage_television"
  entity_id: sensor.television_en_fonctionnement
  state: 'on'
  type: time
  start: "{{ now().replace(hour=0, minute=0, second=0, microsecond=0) }}"
  end: "{{ now() }}"

J’ai un problème de calcul de temps. Le premier des deux template sensor qui sera démarrer met l’heure du lancement + augmente les min, tandis que les deuxième ca cacul bien .
Pour aujourd’hui le PC a tourner que 3h30 , mais ca a calculer l’heure de lancement a 3h57 + 3h30 d’activité .Ca me donne un totaux de 7h28 au lieu de 3h30 :frowning:

Je vois pas ou j’aurais fait un erreur ?

Surement sur le % de la puissance ? a voir en veille la conso sur ton sensor ?

Bonjour,
@roumano @Doubledom j’ai trouver mon erreur, je m’étaait tromper sur la commande start:.

j’avais mis:

start: "{{ now().replace(hour=0, minute=0, second=0) }}"

au lieu de:

start: "{{ now().replace(hour=0, minute=0, second=0, microsecond=0) }}"

Fallai que j’attende 24h pour que je calcul soit bon. A minuit, tout c’est remis a zéro et compte comme il faut pour la journée :wink:

Ayant maintenant un fichier csv qui commence a avoir de la data, je me disais que ça serait bien d’avoir un/des graphs/camembert sur ces cycles d’utilisations.

J’arrive a parser le fichier via jq pour le transformer en json :

jq  -Rsn '
  {"occurrences":
    [inputs
     | . / "\n"
     | (.[] | select(length > 0) | . / ";") as $input
     | {"date": $input[0],"debut": $input[1],"fin": $input[2],"duree": $input[3],"Wh": $input[4],"€": $input[5],"mode": $input[6]} ]}
' < /data/git/cycle/lave_vaisselle.csv

Et le output ressemble a :

{
  "occurrences": [
    {
      "date": "Date",
      "debut": "Debut",
      "fin": "Fin",
      "duree": "Duree",
      "Wh": "Wh",
      "€": "€",
      "mode": ""
    },
...
...
    {
      "date": "01/10/2023",
      "debut": "22h35",
      "fin": "03h31",
      "duree": "4h56m",
      "Wh": "194Wh",
      "€": "0.02€",
      "mode": ""
    },
    {
      "date": "10/10/2023",
      "debut": "22h16",
      "fin": "03h12",
      "duree": "4h56m",
      "Wh": "817Wh",
      "€": "0.09€",
      "mode": ""
    }
  ]
}

(reste juste a supprimer la 1er occurrence qui est le titre de la colonne)
(j’ai rajouter la détection du mode du lave-vaisselle via le temps d’utilisation & la consommation du cycle)

Une idée de comment rajouter ça dans Home Assistant pour faire, par exemple un camenbert sur le mode choisi ?

(je peut, facilement changer le output de jq et/ou utiliser un autre soft )

hello,

je tombe sur ton post qui est m’intéresse. Une remarque il ne vaut pas mieux enregistrer la date et heure de début et date et heure pour la fin? car si ton cycle passe à j+1 tu risques de t’y perdre non?

Salut, non je m’y perd pas, Date c’est pour moi la date de début

Si il se lance a 22h30 et dure 4h30, c’est qu’il fini le j+1 mais quel intérêt de savoir ça ? pour l’instant j’en vois pas.

De faire de la reconciliation de data par exemple et ainsi expliquer si la duree n’est pas bonne. Apres perso je n’ai pas assez de data du coup peut etre que ca ne servira jamais mais on ne sait jamais :grin:.

extrait de mon fichier : (j’ai rajouter une colonne mode via la conso & temps du cycle)

# (head -1;tail -10) <  lave_vaisselle.csv
date;debut;fin;duree;Wh;prix;mode
30/11/2023;00h46;05h44;4h58m;895Wh;0.15€;eco
02/12/2023;00h46;05h45;4h59m;925Wh;0.15€;eco
03/12/2023;00h47;05h53;5h06m;1026Wh;0.14€;eco
04/12/2023;17h45;19h21;1h37m;1173Wh;0.16€;auto
07/12/2023;00h46;05h45;4h60m;964Wh;0.16€;eco
09/12/2023;00h14;05h13;4h59m;955Wh;0.12€;eco
11/12/2023;00h46;05h45;4h59m;937Wh;0.13€;eco
14/12/2023;00h46;05h45;4h59m;964Wh;0.16€;eco
16/12/2023;00h47;05h45;4h58m;912Wh;0.15€;eco
18/12/2023;00h46;05h45;4h60m;954Wh;0.7€;eco

J’ai maintenant plus d’une centaine de cycle dedans.

Je sais pas comment (et si c’est possible) mais j’aimerais bien intégrer des statistiques (aka un résumer) des valeurs dans Home Assistant, par exemple :

  • un camembert avec le nombre de cycle par mode
  • le coût par mois
  • nombre de cycle par mois
  • nombre de cycle en dehors des heures creuses

J’ai un peut chercher et j’arrive a parser les données pour les transformer en json :

  • via jq
jq  -Rsn '                                                                      
  {"occurrences":
    [inputs
     | . / "\n"
     | (.[] | select(length > 0) | . / ";") as $input
     | {"date": $input[0],"debut": $input[1],"fin": $input[2],"duree": $input[3],"Wh": $input[4],"€": $input[5],"mode": $input[6]} ]}
' < lave_vaisselle.csv
  • via csvtk
/usr/local/bin/csvtk csv2json lave_vaisselle.csv --delimiter ';'

mais après, je sais pas comment intégrer ça dans HA car ça dépasse la taille max d’une variable

J’ai testé un truc du même genre chez moi, mais pour un fonctionnement très simple sur passage de on à off d’un input_boolean.

- platform: history_stats
  name: Appareil
  entity_id: input_boolean.test
  state: "on"
  type: time
  start: "{{ now().replace(hour=0, minute=0, second=0, microsecond=0) }}"
  end: "{{ now() }}"
  duree_apparail_allume:
    friendly_name: Durée en min appareil allumé aujourd'hui
    value_template: >-
      {% set heures_str = states.sensor.appareil.state %}
      {% set heures = heures_str | float %}
      {%- set minutes = (heures * 60)  -%}            
      {{ minutes | int}}
    unit_of_measurement: "min"

Quand je lance il prend comme valeur dès que je commence l’heure de lancement puis incrémente de manière totalement normal

Si je clique à 14h32 alors il va prendre comme valeur de démarrage 14*60+32=872
Si je refait une simulation de on / off de 14h40 à 14h50 (10 minutes de plus) alors il va afficher 882 ce qui est logique.

Le truc que je trouve pas logique c’est l’initial il aurait du mettre 0 au lieu de 872.

Comment faire pour que cela se passe ainsi ? attendre demain simplement ?

Salut,
depuis mon dernier message, j’ai configurer comme telle:

    - name: 'Ordinateur en fonctionnement'
      unique_id: 'ordinateur_en_fonctionnement'
      state: >
        {% if states('sensor.0xa4c138244f6e91e3_power') | int(0) >= 15 %}
          on
        {% else %}
          off
        {% endif %}
      availability: "{{ states('sensor.0xa4c138244f6e91e3_power')|is_number }}"
- platform: history_stats
  name: Temps Allumage Ordinateur
  unique_id: "temps_allumage_ordinateur"
  entity_id: sensor.ordinateur_en_fonctionnement
  state: 'on'
  type: time
  start: "{{ now().replace(hour=0, minute=0, second=0, microsecond=0) }}"
  end: "{{ now() }}"

Attends peu être demain, voir si ca reset bien a minuit.

Je comprends pas ce template par rapport a l’history_stats.

Tu utilise une entité input_boolean.test dans le history_state ?