Bon ça a l’air de marcher. Encore merci @Pulpy-Luke pour tes éclaircissements.
Les calculs sont faits avec les automations/scripts ci-dessous. Note: j’utilise un input_boolean input_boolean.cloucloute_session_charge_encours pour éviter les bagots sur switch.cloucloute_charger_switch (qui repasse aléatoirement à on après un endormissement / réveil de la voiture).
Début de charge (lorsqu’on branche la voiture nommée cloucloute dans l’exemple)
alias: Début de session de charge (cloucloute)
description: >-
Début de la session de charge lorsque le chargeur passe de off à on
trigger:
- platform: state
entity_id:
- switch.cloucloute_charger_switch
from: 'off'
to: 'on'
condition:
- condition: state
entity_id: input_boolean.cloucloute_session_charge_encours
state: 'off'
action:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.cloucloute_session_charge_encours
data: {}
- service: notify.notify
data:
message: 'Cloucloute : Début d''une session de charge'
title: Cloucloute session de charge
mode: restart
Fin de charge (lorsqu’on stoppe une charge) :
alias: FIn de session de charge (Cloucloute)
description: Calcule l'énergie ajoutée dans une session de charge
trigger:
- platform: state
entity_id:
- switch.cloucloute_charger_switch
from: 'on'
to: 'off'
condition:
- condition: and
conditions:
- condition: state
entity_id: input_boolean.cloucloute_session_charge_encours
state: 'on'
- condition: template
value_template: '{{ states("sensor.cloucloute_energy_added_sensor") != ''unknown'' }}'
action:
- service: input_number.set_value
data:
value: >-
{{ (states("sensor.cloucloute_energy_added_sensor") | float) +
(states("input_number.cloucloute_total_energie_chargee") | float) }}
target:
entity_id: input_number.cloucloute_total_energie_chargee
- service: input_boolean.turn_off
data: {}
target:
entity_id: input_boolean.cloucloute_session_charge_encours
- service: notify.notify
data:
message: >-
Cloucloute : fin d'une session de charge: + {{
states("sensor.cloucloute_energy_added_sensor") }} kWh
title: Cloucloute session de charge
mode: queued
max: 5
Ensuite j’ai 2 sensors sur InfluxDB pour aller chercher les valeurs d’il y a un mois :
- platform: influxdb
api_version: 1
username: !secret influxDB_user
password: !secret influxDB_password
host: xxxx
port: 8086
queries:
- name: last_cloucloute_km_mois
unit_of_measurement: "km"
value_template: '{{ value | round(0, default=0) }}'
group_function: last
where: '"entity_id" = ''cloucloute_mileage_sensor'' AND time < now() - 30d'
measurement: "km"
field: value
database: hadb
- name: last_cloucloute_total_energie_chargee_mois
unit_of_measurement: "kWh"
value_template: '{{ value | round(2, default=0) }}'
group_function: last
where: '"entity_id" = ''cloucloute_total_energie_chargee'' AND time < now() - 30d'
measurement: "kWh"
field: value
database: hadb
Et tous les jours à minuit je peux calculer la moyenne en kwh/100.km de la façon suivante:
alias: Calcul consommation Cloucloute
description: >-
Lance le calcul journalier de la consommation de Cloucloute sur les 30
derniers jours glissant
mode: single
icon: mdi:chart-bar
variables:
mileage: '{{states(''sensor.cloucloute_mileage_sensor'') | float(default=0)}}'
range: '{{states(''sensor.cloucloute_range_sensor'') | float(default=0)}}'
last_mileage: '{{states(''sensor.last_cloucloute_km_mois'') | float(default=0)}}'
last_conso: >-
{{states('sensor.last_cloucloute_total_energie_chargee_mois') |
float(default=0)}}
conso: >-
{{ states('input_number.cloucloute_total_energie_chargee') |
float(default=0) }}
km_mensuel: '{{ mileage + range - last_mileage }}'
conso_mensuel: '{{ conso - last_conso }}'
sequence:
- if:
- condition: template
value_template: '{{ mileage == 0 or last_mileage == 0 or range == 0 or conso == 0}}'
then:
- service: notify.notify
data:
message: >-
Calcul de la conso impossible mileage={{mileage}}, range={{range}},
last_mileage={{last_mileage}}, last_conso={{last_conso}},
conso={{conso}}, km_mensuel={{km_mensuel}},
conso_mensuel={{conso_mensuel}}
title: Erreur lors du calcul de la conso
else:
- service: input_number.set_value
data:
value: ' {{ (conso_mensuel / km_mensuel * 100) | round(2, default=0) }}'
target:
entity_id: input_number.cloucloute_consommation_30j
- service: system_log.write
data:
message: >-
Calcul conso pour {{ now() }}, km_mensuel={{km_mensuel}},
conso_mensuel={{conso_mensuel}} -> {{
states('input_number.cloucloute_consommation_30j') }} kWh/100.km
logger: homeassistant.components.script.calcul_consommation_cloucloute
level: info
- service: notify.notify
data:
title: Consommation Cloucloute
message: >-
Consommation sur 30j glissant {{
states('input_number.cloucloute_consommation_30j') }} kWh/100.km
Y a plus qu’à afficher le input_number.cloucloute_consommation_30j dans des beaux graphiques et on est bon:
type: custom:apexcharts-card
apex_config:
chart:
height: 500px
header:
show: true
title: Consommation journalière sur 30 jours glissants
show_states: true
colorize_states: true
experimental:
color_threshold: true
brush: true
graph_span: 120d
yaxis:
- id: left
show: true
- id: right
show: true
opposite: true
series:
- entity: sensor.archive_cloucloute_consommation_30j
yaxis_id: left
data_generator: |
let res = [];
for (const [key, value] of Object.entries(entity.attributes)) {
let d = new Date(key).getTime();
if (d > 0)
res.push([d, value]);
}
return res.sort((a, b) => { return a[0] - b[0] });
type: area
color_threshold:
- value: 1
color: green
opacity: 0.25
- value: 10
color: yellow
opacity: 0.25
- value: 15
color: orange
opacity: 0.5
- value: 30
color: red
opacity: 0.75
stroke_width: 5
show:
in_brush: true
- entity: input_number.cloucloute_total_energie_chargee
type: line
stroke_width: 2
opacity: 0.5
yaxis_id: right
- entity: sensor.cloucloute_energy_added_sensor
type: line
stroke_width: 2
opacity: 0.5
yaxis_id: right
color: lightgreen
brush:
selection_span: 7d
Ca me fait quelque chose comme ça:
N’hésitez pas si ce n’est pas clair ou si vous voyez des améliorations / bugs.