Input_number archive ajoutée au redémarrage

Mon problème

Bonjour,

J’ai un soucis et j’arrive pas à m’en sortir. J’ai un input_number qui stocke l’énergie chargée lors d’une session de charge de mon veh electrique. Je le calcule à chaque fois que l’on débranche la voiture.
Tous les jours, je calcule la somme des sessions de la journée et je fais des calculs de consommation, …
Jusque là tout va bien.

Mon soucis c’est que lorsque le système redémarre, j’ai systématiquement une valeur insérée dans l’historique de cet input_number. C’est bien la valeur précédente (au stop) mais ca compte comme si il y avait eu une charge supplémentaire égale à la précédente.
Est-ce que vous connaissez un moyen pour éviter cet historisation au démarrage des valeurs des input_number ?

Ma configuration


[center]## System Health

version core-2022.6.6
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.9.12
os_name Linux
os_version 5.15.32-v8
arch aarch64
timezone Europe/Paris
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 5000
Installed Version 1.25.5
Stage running
Available Repositories 1045
Downloaded Repositories 17
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 8.2
update_channel stable
supervisor_version supervisor-2022.05.3
agent_version 1.2.1
docker_version 20.10.14
disk_total 118.3 GB
disk_used 14.2 GB
healthy true
supported true
board rpi4-64
supervisor_api ok
version_api ok
installed_addons Home Assistant Google Drive Backup (0.108.2), Samba share (9.7.0), InfluxDB (4.5.0), Glances (0.16.0), Let’s Encrypt (4.12.2), NGINX Home Assistant SSL proxy (3.1.1), SQLite Web (3.6.0)
Dashboards
dashboards 3
resources 8
views 16
mode storage
Recorder
oldest_recorder_run 8 juin 2022, 05:32
current_recorder_run 15 juin 2022, 07:54
estimated_db_size 144.63 MiB
database_engine sqlite
database_version 3.34.1
Smart EQ Connect
api_endpoint_reachable ok
Sonoff
version 3.0.5 (200f243)
cloud_online 8 / 8
local_online 8 / 8
[/center]

Partage ton code :+1:

Tu dois avoir un soucis au niveau des déclencheurs ou conditions

L’automation qui set le input_number :

alias: Calcul énergie par session de charge (Cloucloute)
description: Calcule l'énergir ajoutée dans une session de charge
trigger:
  - platform: state
    entity_id:
      - switch.cloucloute_charger_switch
    from: 'on'
    to: 'off'
condition: []
action:
  - if:
      - condition: template
        value_template: >-
          {{ (states('input_number.cloucloute_energie_session_charge') | float)
          > 0.0 }}
    then:
      - service: notify.notify
        data:
          message: >-
            Cloucloute : fin d'une session de charge: déjà comptabilisée. On
            ignore.
          title: Cloucloute session de charge
    else:
      - service: input_number.set_value
        data:
          value: '{{ states("sensor.cloucloute_energy_added_sensor") | float }}'
        target:
          entity_id: input_number.cloucloute_energie_session_charge
      - service: notify.notify
        data:
          message: >-
            Cloucloute : fin d'une session de charge: + {{
            states("input_number.cloucloute_energie_session_charge") }} kWh
          title: Cloucloute session de charge
mode: queued
max: 5

Pour limiter les faux positif, je ne set le input_number que si la valeur précédente était 0 (et je le mets à 0 lorsqu’on branche le vehicule).
Mais malgré ça, j’ai quand même des modifications de l’input_number à chaque démarrage.

Salut,

J’ai bien l’impression que tu fais compliqué.
Plutôt que de mémoriser la valeur par session, tu devrais faire un cumul (charge n°3 => 50KW, charge n°4=>55KW, donc la charge coute 5KW). Déjà dans ce cas au redémarrage, tu prends la même valeur qu’avant (55KW) sans variation, la charge suivant incrémente le total etc.
Après je pense que dashboard energie fait ça tout seul… et qu’il sait reventiller sous forme d’un histogramme par charge

1 « J'aime »

Oui c’est aussi mon impression. Mon objectif est de calculer une consommation en kwh par 100km en moyenne glissante sur un moins. Le Tesla Wall Connector le fait mal (c’est buggé, on a de tant en tant des pics inexplicables et je ne suis pas le seul à avoir ce problème).

Donc tous les jours, j’ai besoin de savoir combien a été rechargé, combien de km ont été roulés et combien de km restant avec la charge actuelle et donc de faire les totaux sur le mois glissant en utilisant les valeurs historiques.

Je note l’idée de cumuler tous les jours les charges (lors du stop charge) et de resetter cette valeur tous les jours à minuit, en effet ca doit le faire. Mais ca ne résout pas le fait que le input_number est revalorisé à chaque démarrage avec une entrée dans l’historique. Le total je dois bien le stocker dans un input_number non ? Si il est modifié à chaque démarrage c’est pas bon non plus. Ou alors il y a un autre moyen de stocker des valeurs journalière ?

Je m’y prend certainement mal mais j’ai pas l’impression que juste stocker un cumul (dans un input_number du coup) va m’aider

Je crois que je vois finalement, ce que tu veux dire:

Tous les jours, je prends le total il y a un mois du cumul des charges que je divise par le nb de km parcourus dans le mois. Dans ce cas en effet si l’input_number est valorisé au démarrage avec la même valeur qu’à l’arrêt ca ne change rien à mon calcul. Ca doit en effet contourner le soucis.

Merci @Pulpy-Luke j’étais sur que je m’y prenais pas comme il faut.

(N’empêche que si on arrive a savoir pourquoi à chaque démarrage les input_number sont revalorisés, la réponse m’intéresse)

1 « J'aime »

Oui
J’étais entrain de faire une réponse, mais tu as pigé le principe…

Pour la revalorision de la valeur : avec ton usage actuel c’est peut-être pas terrible mais tu imagines bien les gens s’attendent généralement à retrouver un système identique avant et après l’arrêt.
Je te donne un autre exemple : je gére mon chauffage avec des consignes : 19°C pour le confort… Si à chaque reboot de HA, je me retrouve avec 0 ou une valeur aléatoire, je te raconte pas la crise à la maison.

Dernier point jette un oeil là, j’ai pas beaucoup de détails à te donner mais il y a déjà des trucs qui semblent exister

et ces calculs ? tu peux les partager ?

Oui je fais ma petite refonte et je vous partage tout ça

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.

1 « J'aime »