Bonjour à tous
J’ai une voiture électrique que je recharge en 16 ampères sur une prise renforcée protégée par un disjoncteur et un différentiel indépendant en 20A ampère, Avec en 1 petit module zigbee Qui me permet d’analyser la consommation et potentiellement de désactiver la prise.
cf sujet ici
Je voulais désormais être capable d’avoir une trace de toutes mes sessions de charge. Ainsi qu’une synthèse Du coup de toutes mes recharges du mois dernier.
J’ai fouillé un peu sur les forums et je vais vous partager du coup ce que j’ai fait car ça intéressera certainement certains d’entre vous et puis je suis preneur des remarques.
1) installer hass-variable
Cela permet ensuite de pouvoir créer des entité/var qui ne s’initialise pas au redémarrage.
2) Les entités que j’utilise
- sensor.chargeur_voiture_power : Fourni en watts la puissance instantanée délivrée par la prise de recharge.
- sensor.consommation_chargeur_voiture : Ceci est une entité créée manuellement basée sur sensor.chargeur_voiture_power afin d’en calculer la consommation en kw/h
- input_number.cout_kwh_electricite : Entité créée manuellement numérique qui définit le coût fixe de mon électricité en EUR/kwh
- sensor.charge_voiture : Variables+History (cf point 1) créé pour l’occasion
3) L’initialisation
Un petit script ou automatisation à lancer une seule fois de façon manuelle, Il va définir les attributs de l’entité sensor.charge_voiture , Et si les attributs existent déjà ils vont être purgés et réinitialisés.
alias: Init Session charge
description: ""
trigger: []
condition: []
action:
- alias: Init
action: variable.update_sensor
metadata: {}
data:
replace_attributes: "no"
value: INIT
attributes:
sessionscharge: null
target:
entity_id: sensor.charge_voiture
enabled: true
mode: single
4) Détection automatique des sessions de charge
Nouveau script d’automatisation
alias: Enregistrer les sessions de charges de voiture
description: ""
trigger:
- platform: numeric_state
entity_id:
- sensor.chargeur_voiture_power
for:
hours: 0
minutes: 1
seconds: 0
below: 5
- platform: numeric_state
entity_id:
- sensor.chargeur_voiture_power
above: 5
condition: []
action:
- alias: Si début de charge
if:
- condition: and
conditions:
- condition: template
value_template: >-
{% if state_attr('sensor.charge_voiture', 'start_time') is not
none %}
false
{% else %}
true
{% endif %}
alias: Vérifier qu'une charge est pas déjà en cours
- condition: numeric_state
entity_id: sensor.chargeur_voiture_power
above: 10
then:
- action: variable.update_sensor
metadata: {}
data:
replace_attributes: "no"
value: En charge
attributes:
start_time: "{{ now().timestamp() }}"
start_conso: "{{ states('sensor.consommation_chargeur_voiture') }}"
target:
entity_id: sensor.charge_voiture
- alias: Si fin de charge
if:
- condition: numeric_state
entity_id: sensor.chargeur_voiture_power
below: 5
then:
- if:
- condition: template
value_template: >-
{% if state_attr('sensor.charge_voiture', 'start_time') is not
none %}
true
{% else %}
false
{% endif %}
then:
- action: variable.update_sensor
metadata: {}
data:
replace_attributes: true
value: Fin de charge
attributes:
sessionscharge: >-
{% set diff_seconds = now().timestamp() -
state_attr('sensor.charge_voiture','start_time') %} {% set
conso = (states('sensor.consommation_chargeur_voiture') |
float) - state_attr('sensor.charge_voiture','start_conso') %}
{% set hours = (diff_seconds / 3600) | int %} {% set minutes =
((diff_seconds % 3600) / 60) | int %} {% set sessioncharge =
{
'consommation': conso | float | round(2),
'durée': '%02d:%02d' | format(hours, minutes) ,
'début': state_attr('sensor.charge_voiture','start_time') | int | timestamp_custom('%d/%m/%Y %H:%M', true),
'fin': now().strftime('%d/%m/%Y %H:%M'),
'coût': ((conso | float) * (states('input_number.cout_kwh_electricite') | float) / 1000) | round(2),
'puissance_start': state_attr('sensor.charge_voiture','start_conso'),
'puissance_end': (states('sensor.consommation_chargeur_voiture') | float)
}
%}
{% if state_attr('sensor.charge_voiture', 'sessionscharge') is
not none %}
{{ state_attr('sensor.charge_voiture', 'sessionscharge') + [sessioncharge] }}
{% else %}
[ {{ sessioncharge }} ]
{% endif %}
target:
entity_id: sensor.charge_voiture
else:
- action: system_log.write
metadata: {}
data:
level: error
message: >-
Erreur : Fin de charge détecté mais absence de début de charge
dans le modèle
- alias: Init
action: variable.update_sensor
metadata: {}
data:
replace_attributes: "no"
value: INIT
attributes:
sessionscharge: null
target:
entity_id: sensor.charge_voiture
enabled: false
mode: single
5) lovelace card
Et pour l’instant j’ai fait une rapide carte en markdown
type: markdown
content: >-
{% if state_attr('sensor.charge_voiture', 'start_time') is not none %}
# Charge en cours
{% endif %}
{% set sessions = state_attr('sensor.charge_voiture','sessionscharge') %}
{% if sessions is defined and sessions is not none and sessions | length > 0
%}
## Dernière charge
{% set dernier_session = sessions[-1] %}
{% set consommation = dernier_session['consommation'] %}
{% set cout = dernier_session['coût'] %}
{% set duree = dernier_session['durée'] %}
- Coût : {{cout}} €
- Durée : {{duree}}
- Puissance {{(consommation / 1000) | round(2)}} kW/H
## Synthèse
{% set total_cost = namespace(mc=0,mp=0) %}
{% set mois_precedent = (now().month - 1) %}
{% set annee_mois_precedent = (now().year) %}
{% if mois_precedent == 0%}
{% set mois_precedent = 12 %}
{% set annee_mois_precedent = (now().year - 1) %}
{% endif %}
{% for session in state_attr('sensor.charge_voiture', 'sessionscharge') %}
{% set fin_date = strptime(session.fin, '%d/%m/%Y %H:%M') %}
{% if fin_date.month == now().month and fin_date.year == now().year %}
{% set total_cost.mc = total_cost.mc + session.coût %}
{% endif %}
{% if fin_date.month == mois_precedent and fin_date.year == annee_mois_precedent %}
{% set total_cost.mp = total_cost.mp + session.coût %}
{% endif %}
{% endfor %}
- Coût de la recharge pour le mois précédent : {{ total_cost.mp | round(2) }}
€
- Coût de la recharge pour le mois en cours : {{ total_cost.mc | round(2) }} €
{% else %}
## Aucune session de charge trouvée
Dès qu'une charge complète aura été effectuée, vous trouverez des informations ici.
{% endif %}