Créer un capteur de conso moyenne sur 7 jours

Mon problème

Bonjour la communauté,

Je patauge un peu…
J’ai un graph Apex (colonnes) avec ma conso électrique et eau sur 7j.
Mon souhait de base est d’afficher en opacité sur une ligne droite la moyenne de cette conso sur 7 jours.
En pratique, il « suffit » de prendre la valeur de ma consommation de maintenant et de soustraire la valeur -168h puis la diviser par 7. Mais je n’ai aucune idée de comment procéder, ni de la syntaxe à proprement dit ? Sensor template ? average ? filter ?
J’ai bien essayé de le gérer via Apex directement mais la donnée obtenue est complètement farfelue :frowning:
Voir ci-dessous.
N.B. Je possède également un capteur d’entrée avec un total journalier de ma conso (remise à 0 à minuit).

Ma configuration


|Version|core-2024.5.5|
| — | — |
|Type d’installation|Home Assistant OS|
|Développement|false|
|Supervisor|true|
|Docker|true|
|Utilisateur|root|
|Environnement virtuel|false|
|Version de Python|3.12.2|
|Famille du système d’exploitation|Linux|
|Version du système d’exploitation|6.6.28-haos-raspi|
|Architecture du processeur|aarch64|
|Fuseau horaire|Europe/Brussels|
|Répertoire de configuration|/config|

Comment récupérer ma configuration :
Dans votre HA, Menu latéral Paramètres > Système > Corrections puis les trois petits points en haut a droite > Informations Système puis une fois en bas Copier


Tu peux utiliser history_stats

exemple :

- platform: history_stats
  name: Conso 7 derniers jours
  entity_id: sensor.xxxxxx
  state: 'xxxxx'
  type: time
  start: '{{ as_timestamp( now().replace(hour=0).replace(minute=0).replace(second=0) ) -now().weekday() * 86400 }}'
  end: '{{ now() }}'

- platform: template
  sensors:
      conso_7_jours:
      friendly_name: 'conso 7 derniers jours'
      value_template: >-
         {{ states.sensor.conso_7_derniers_jours.attributes.value }}

à ajuster pour ton cas

J’utilise cette technique pour savoir combien de temps la PS4 est allumé et donc utiliser par jours et sur la semaine en totalité.

Ou sinon voir avec :

exemple:

sensor:
  - platform: statistics
    name: "conso moyenne 7 jours"
    entity_id: sensor.xxxxxx
    state_characteristic: mean
    max_age:
      hours: 168

A noter une difference de calcul entre les 2 méthodes, avec ‹ Statistics › on fait la moyenne sur les 168 dernieres heures avec une date de début qui change a chaque évaluation de la statistique alors qu’avec ‹ History Stats › on fige l’heure de la date de début à minuit il y a x jours.
Pour le template de l’history_stat on peut aussi utiliser le timedelta pour se décaler de plusieurs jours et simplifier l’ecriture:

- platform: history_stats
  name: Conso 7 derniers jours
  entity_id: sensor.xxxxxx
  state: 'xxxxx'
  type: time
  start: '{{ now().replace(hour=0, minute=0, second=0)  - timedelta(days=6) }}'
  end: '{{ now() }}'
1 « J'aime »

Ta méthode me semble plus appropriée.
Mais pratiquement, je colle et adapte le code ci-dessus dans le sensors.yaml et il créé une nouvelle entité ? Comment se nomera t’elle ? Par quoi dois-je remplacer les ‹ xxxxx › de state ?

‹ history_stats › surveille le temps qu’un capteur (entity_id) est dans un état (state), on l’utilise par exemple pour savoir combien de temps est resté allumé (state: ‹ on ›) un équipement (prise, lumiére).

Pour faire la moyenne d’une valeur numérique il me semble que la seule solution est l’utilisation de ‹ statistics ›.

Pour le nom des sensors que l’on crée, HA prend la valeur de ‹ name › tout en minuscule et en remplaçant les espaces par des ’ _ '. Si le nom n’est pas unique il ajoute un chiffre à la fin qu’il incrémente.

1 « J'aime »

Bête question mais ne serait-ce pas possible et plus simple en utilisant un sensor template ?

Comme l’indiquer @Lexyan le nom du sensor est celui qui te fournie l’information de ta conso

Je pense que statistic est plus approprié, et il faut « jouer » avec :

  • sampling_size (Facultatif) : Taille de l’échantillonnage. Si la limite est atteinte, les valeurs pivotent. La valeur par défaut est « 20 ».
  • max_age (Facultatif) : Âge maximum des mesures. En définissant ceci sur un intervalle de temps, les valeurs plus anciennes seront ignorées.

Le sensor sera sensor.(l’information que tu auras mise après le « name: »)

Exemple pour le nom du sensor:


- platform: history_stats
  name: Conso 7 derniers jours
  entity_id: sensor.xxxxxx
  state: 'xxxxx'
  type: time
  start: '{{ now().replace(hour=0, minute=0, second=0)  - timedelta(days=6) }}'
  end: '{{ now() }}'

le sensor qui sera créer sera : sensor.conso_7_derniers_jours

je ne connaissais pas le « timedelta » merci pour l’info :slight_smile:

sinon en cherchant, je suis tombé sur cette intégration HACS :

1 « J'aime »

Merci pour vos retours.
J’ai rédigé dans mon sensors.yaml une syntaxe average et une stat. J’ai checké et relancé la config.
Je vérifie les données fournies dès que les entités sont créées (toujours rien mais peut-être pas instantané) et je vous reviens.

Malheureusement, pas une grande réussite :frowning:

Valeurs réelles :
Maintenant : 1024.98 kWh
Maintenant -7j : 990.61 kWh

Le résultat devrait être la différence des 2 pour le sensor statistics et la différence divisée par 7 pour le sensor average.

Il doit me manquer un paramètre d’après moi…

Voici le code que j’ai rédigé dans sensors.yaml :

# Sensor Moyenne conso appareils sur 7 jours
- platform: average
  name: "Moyenne conso appareils 7 jours"
  duration:
    days: 7
  entities:
    - sensor.consommation_totale_des_appareils

# Sensor conso appareils 7 deniers jours
- platform: statistics
  name: "conso appareils 7 derniers jours"
  entity_id: sensor.consommation_totale_des_appareils
  state_characteristic: mean
  max_age:
    hours: 168

Je pense qu’il y a un souci

tu indiques ici de faire une moyenne sur une valeur donnée d’un sensor (sensor. consommation_totale_des_appareils)

- platform: average
  name: "Moyenne conso appareils 7 jours"
  duration:
    days: 7
  entities:
    - sensor.consommation_totale_des_appareils

Hors comment il peut faire pour faire une moyenne alors qu’il n’a qu’une valeur.

Tu devrais avoir une valeur max et min pour ensuite faire la moyenne

as-tu utilisé/test l’intégration HACS mentionner plus haut, car ça semble faire le job que tu souhaites faire

Eureka !

J’ai changé le state char et j’ai bien la différence :

# Sensor conso appareils 7 deniers jours
- platform: statistics
  name: "conso appareils 7 derniers jours"
  entity_id: sensor.consommation_totale_des_appareils
  state_characteristic: distance_absolute
  max_age:
    hours: 168

Et le résultat :

Merci à tous !

Cool

Attention aux valeurs de :

sampling_size et max_age car il influence directement le résultat de la valeur de statistics :slight_smile:

J’ai vérifié les valeurs, elles sont bonnes sans ces params :wink:

1 « J'aime »