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
Si quelqu’un à une idée sur la façon d’interpréter cette carte
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
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
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
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 .
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 ?