Filtrer des valeurs aberrantes d'un compteur energie

Bonjour,

J’ai différentes prises connectées Zigbee et Zwave qui relèvent des consommations d’énergie pour toute une partie d’équipements. Avec l’intégration PowerCalc, j’ai créé des groupes afin de rassembler les informations de consommation par grande famille afin de les faire apparaitre dans le tableau de bord énergie (ex : chauffage, electroménager, multimédia, etc).

Malheureusement, certains groupes remontent des infos aberrantes que j’ai essayé de corriger en créant des sensors de type filter mais que je n’arrive pas à configurer correctement.

Voici un exemple de sensor filter tel que je l’ai configuré :

- platform: filter
  name: "Chauffage ECS Energie"
  entity_id: sensor.chauffage_ecs_energy
  unique_id: filter.chauffage_ecs_energy
  filters:
    - filter: outlier
      window_size: 5          # Moyenne calculée sur les 10 dernières valeurs
      radius: 2.0              # Tolérance pour détecter les anomalies

Et voici un exemple d’aberration sur un sensor « groupe »

Vu qu’il s’agit de compteurs qui cumulent des valeurs (avec des valeurs incroyablement élevées à force des erreurs de relevés) mais que les consommations sont mesurées sur des intervalles de temps (5 minutes), je ne suis pas arrivé à trouver une réponse claire à ce type de situation.
Il me semble que les tests devraient se faire sur la variation entre 2 mesures mais je n’arrive pas à trouver la bonne formulation.

En vous remerciant pour votre aide,

Ma configuration


]## System Information

version core-2025.2.1
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.13.1
os_name Linux
os_version 6.6.73-haos
arch x86_64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
HACS Data ok
GitHub API Calls Remaining 4993
Installed Version 2.0.5
Stage running
Available Repositories 1522
Downloaded Repositories 36
Home Assistant Cloud
logged_in true
subscription_expiration October 5, 2025 at 2:00 AM
relayer_connected true
relayer_region eu-central-1
remote_enabled true
remote_connected true
alexa_enabled true
google_enabled true
cloud_ice_servers_enabled true
remote_server eu-central-1-9.ui.nabu.casa
certificate_status ready
instance_id 87a99d5c304e40439ec4e209a6647f0b
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 14.2
update_channel stable
supervisor_version supervisor-2025.02.0
agent_version 1.6.0
docker_version 27.2.0
disk_total 30.8 GB
disk_used 15.6 GB
healthy true
supported true
host_connectivity true
supervisor_connectivity true
ntp_synchronized true
virtualization kvm
board ova
supervisor_api ok
version_api ok
installed_addons Samba share (12.4.0), Let’s Encrypt (5.2.12), motionEye (0.21.0), Studio Code Server (5.18.1), Glances (0.21.1), SQLite Web (4.3.0), Advanced SSH & Web Terminal (20.0.0), Portainer (2.26.1), Whatsapp (1.5.0), Linky (1.5.0), Log Viewer (0.17.1), Matter Server (7.0.0), ZeroTier One (0.19.0), File editor (5.8.0)
Dashboards
dashboards 6
resources 10
views 2
mode storage
Network Configuration
adapters lo (disabled), enp0s18 (enabled, default, auto), hassio (disabled), docker0 (disabled), ztyou6ryln (disabled), veth82b4986 (disabled), veth9fb1ed7 (disabled), veth8b5f026 (disabled), veth7e47b09 (disabled), veth2ebfc28 (disabled), veth1ca2cb6 (disabled), veth2dce145 (disabled), vethfddcfe1 (disabled), veth2b9b62a (disabled), vethab94c9a (disabled)
ipv4_addresses lo (127.0.0.1/8), enp0s18 (192.168.0.22/24), hassio (172.30.32.1/23), docker0 (172.30.232.1/23), ztyou6ryln (192.168.195.130/24), veth82b4986 (), veth9fb1ed7 (), veth8b5f026 (), veth7e47b09 (), veth2ebfc28 (), veth1ca2cb6 (), veth2dce145 (), vethfddcfe1 (), veth2b9b62a (), vethab94c9a ()
ipv6_addresses lo (::1/128), enp0s18 (fe80::96a4:5856:56be:7839/64), hassio (fe80::42:afff:fe02:4f86/64), docker0 (fe80::42:58ff:fe5e:e8ef/64), ztyou6ryln (fe80::5c77:5aff:feb0:450/64), veth82b4986 (fe80::385d:25ff:fec8:7738/64), veth9fb1ed7 (fe80::c444:6fff:fe42:287c/64), veth8b5f026 (fe80::6c40:1aff:fe35:1709/64), veth7e47b09 (fe80::b850:b8ff:fe5e:d41d/64), veth2ebfc28 (fe80::f0d7:c6ff:fe06:f77a/64), veth1ca2cb6 (fe80::e8a0:75ff:fe9d:8d17/64), veth2dce145 (fe80::2441:e5ff:fea4:38ac/64), vethfddcfe1 (fe80::f4f6:f6ff:fe77:87b3/64), veth2b9b62a (fe80::f865:b4ff:fec3:5127/64), vethab94c9a (fe80::b44b:3dff:fe90:bbdb/64)
announce_addresses 192.168.0.22, fe80::96a4:5856:56be:7839
Recorder
oldest_recorder_run January 28, 2025 at 9:07 AM
current_recorder_run February 8, 2025 at 6:09 AM
estimated_db_size 930.33 MiB
database_engine sqlite
database_version 3.47.1
Sonoff
version 3.8.2 (c4b6fda)
cloud_online 8 / 10
local_online 7 / 7
Xiaomi Miot Auto
component_version 1.0.8
can_reach_server ok
can_reach_spec ok
logged_accounts 1
total_devices 13

Bonjour,

As-tu trouvé une solution depuis ?

Je me permets de relancer car je suis intéressé également par la solution… j’ai des Qubino qui me permettent de suivre des consommations et il arrive qu’ils remontent des valeurs délirantes. Je leur pardonne, mais j’aimerais que cela ne fausse pas mes calculs/graphiques ensuite.

Exemple :

Bonjour,

Non, je n’ai pas obtenu de réponse.

Bonjour,

J’ai l’impression que vous avez 2 problèmes différents :

@JC38 a un problème sur des valeurs cumulés

@jlegrand a un problème sur des valeurs instantanés

Pour @jlegrand 2 solutions :

  • Créer un template qui prend les valeurs du sensor que si les valeurs sont admissibles (par exemple <4000W)
  • Utiliser un filtre range Filter - Home Assistant

Pour @JC38,

  • il faudrait peut être faire faire par HA le calcul des données cumulées sur un sensor filtré avec un plafond

@armavi
Bonjour, désolé de répondre si tard, je n’avais pas eu ou reçu de notification de réponse.
Mon pb, c’est qu’il s’agit de valeurs de type compteurs energie en kwh. Je ne sais pas comment mettre un filtre qui éviterait des augementations incohérentes du compteur.

C’est un peu comme si un compteur kilométrique d’une voiture passait en 5 minutes de 12345 km à 98765 km. Comment filtrer, un compteur kilométrique peut très bien atteindre ces valeurs. Mon pb c’est la variation qui est incohérente et qu’il faudrait rectifier. Je le fais manuellement mais ce n’est pas très pratique, si on a n valeurs incohérentes à corriger, il faut faire la manip dans les statistiques autant de fois (n recherches dans les stats des valeurs aberrantes).

Hello,
Le filtre outliner est justement fait pour filtrer les valeurs aberrantes. Je l’utilise avec succès mais il faut que les valeurs aberrantes ne soient que ponctuelles.

Voir : Filter - Home Assistant

Exemple :

sensor:
  - platform: filter
    name: mon_sensor_avec_filtre
    unique_id: mon_sensor_avec_filtre
    entity_id: sensor.mon_sensor
    filters:
      - filter: outlier
        window_size: 6
        radius: 2.0

Le filtre considère les n dernières valeurs, n étant fixé par le paramètre window_size (6 dans mon exemple).
Si l’écart entre la valeur mesurée et la moyenne des n dernières valeurs est supérieure à un seuil fixé par le paramètre radius, alors le filtre retourne la précédente valeur mesurée.

Autre solution que j’utilise avec succès dans certains cas ou outliner n’est pas suffisant : utiliser un template dédié avec ses propres règles :

Exemple :

template:
  - sensor:
      - name: mon_sensor_avec_filtre
        unique_id: mon_sensor_avec_filtre
        state: >
          {% set valeur= states('sensor.mon_sensor') | int(0) %}
          {% if valeur < 1000 %}
              {{ valeur }}
          {% else %}
              {{ states('sensor.mon_sensor_avec_filtre') }}
        {% endif %}
        unit_of_measurement: "W"

Dans cet exemple, on prend la valeur mesurée si elle est inférieure à 1000, le précédente valeur autrement. Ainsi, toute valeur considérée comme aberrante car supérieure à 1000 serait filtrée. Mais le code peut introduire des règles plus complexes et impliquer par exemple d’autres entités pour des règles plus complexes…

En effet, les solutions de filtre ne marche que pour des valeurs instantanées par exemple la puissance instantanée (en W par ex) comme @jlegrand

J’en déduis que tu n’as aucun accès à la valeur instantanée.

Dans ce cas, on peut créer un template à partir du compteur (en Kwh)

Il faut créer des valeurs intermédiaires pour faire les calculs et garder en mémoir la dernière valeur

input_number:
  compteur_kwh_filtre_valeur:
    name: "Valeur compteur kwh filtré"
    min: 0
    max: 100
  compteur_kwh_ancien_valeur:
    name: "Valeur compteur kwh ancien"
    min: 0
    max: 100

template:
  - sensor:
      - name: "compteur_kwh_filtre"
        unit_of_measurement: "kWh"
        state: >
          {{ states('input_number.compteur_kwh_filtre_valeur') }}

Puis une automatisation qui se met à jour à chaque modif du sensor.compteur_kwh qu’il faut remplacer par ton sensor

automation:
  alias: Filtrer des valeurs aberrantes d'un compteur energie
  description: ''
  triggers:
  - entity_id: sensor.compteur_kwh
    trigger: state
  conditions: []
  actions:
  - variables:
      filtre: '{{ states("input_number.compteur_kwh_filtre_valeur") }}'
      current: '{{ states("sensor.compteur_kwh") | float() }}'
      previous: '{{ states("input_number.compteur_kwh_ancien_valeur") | float() }}'
      delta: '{{ current - previous }}'
      max_variation: 5
  - if:
    - condition: template
      value_template: '{{ delta <= max_variation }}'
    then:
    - action: input_number.set_value
      target:
        entity_id: input_number.compteur_kwh_filtre_valeur
      data:
        value: '{{ filtre + delta }}'
    - action: input_number.set_value
      target:
        entity_id: input_number.compteur_kwh_ancien_valeur
      data:
        value: '{{ current }}'
    else:
    - action: input_number.set_value
      target:
        entity_id: input_number.compteur_kwh_ancien_valeur
      data:
        value: '{{ current }}'
  mode: queued

Et sur un test, voilà ce que cela donne. Les augmentations supérieures à 5 ne sont pas prises en compte. Toutes les autres le sont.

@armavi.
Je viens de voir ta réponse, merci, je vais la lire en détail. je ne comprends pas pourquoi je n’ai pas reçu la notification alors que je surveille le sujet. Rien dans mes spams non plus.