Comment récupérer l'avant dernière valeur d'une entité?

Mon problème

Bonjour,

Je commence à m’intéresser a Jinja2 et je ne trouve pas de paramètre qui permette de parcourir les valeurs historique comme dans un array() en python.
J’ai trouvé un sujet qui se rapproche de ma demande mais il n’est pas compatible avec la console de développement Recupérer la valeur d'un compteur a n-1

Je souhaite récupérer l’avant dernière valeur pour calculer l’écart en pourcentage par rapport à la valeur actuelle.
C’est pour suivre l’évolution de la désinfection au Brome qui est lente pendant la phase de correction, tant que la désinfection augmente de 10% je souhaite temporiser les notifications.

Je récupère la dernière valeur avec
{{ states.sensor.spa_flipr_red_ox.state }}
Qui retourne 636.0

J’ai les attribut de l’entité avec
{{ states.sensor.spa_flipr_red_ox.attributes }}
Qui retourne le bloc suivant

{‹ state_class ›: <SensorStateClass.MEASUREMENT: ‹ measurement ›>, ‹ unit_of_measurement ›: <UnitOfElectricPotential.MILLIVOLT: ‹ mV ›>, ‹ attribution ›: ‹ Flipr Data ›, ‹ icon ›: ‹ mdi:water-opacity ›, ‹ friendly_name ›: ‹ Désinfection Red OX ›}

J’ai pensé utiliser les dates pour parcourir l’historique mais là aussi je ne sais pas récupérer une liste de date ou de remonter dans le jeu de donnée… le serpent se mord la queue :slight_smile:
Je récupère la date de la dernière relève avec
{{ states.sensor.spa_flipr_red_ox.state | as_datetime }}
Qui retourne 2023-08-26 09:53:53.652389+00:00

Il me manque la méthode me permettant de remonter dans le temps jusqu’à l’avant dernière valeur (ou enregistrement précédent) qui est 564.0 (relevé manuellement sur un graphique)

Auriez-vous des pistes de recherche ? De la doc sur ce cas précis ?
En vous remerciant d’avance

Ps : au fil de mes recherches je n’ai pas trouvé d’outil permettant de recommander le type et la quantité de traitement à appliquer sur une piscine/spa. A mon niveau quand ce sera validé je pourrais vous partager les notifications pH et Red OX (désinfection) à adapter à votre bassin. Elles indiquent le volume de traitement à appliquer.

Ma configuration


System Information

version core-2023.8.4
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.11.4
os_name Linux
os_version 6.1.45
arch x86_64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 5000
Installed Version 1.32.1
Stage running
Available Repositories 1267
Downloaded Repositories 13
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 10.5
update_channel stable
supervisor_version supervisor-2023.08.1
agent_version 1.5.1
docker_version 23.0.6
disk_total 30.8 GB
disk_used 4.4 GB
healthy true
supported true
board ova
supervisor_api ok
version_api ok
installed_addons File editor (5.6.0), Samba share (10.0.2), Terminal & SSH (9.7.1)
Dashboards
dashboards 3
resources 9
views 18
mode storage
Recorder
oldest_recorder_run 16 août 2023 à 03:01
current_recorder_run 26 août 2023 à 09:14
estimated_db_size 67.62 MiB
database_engine sqlite
database_version 3.41.2
___

Bj

essai comme ceci

{% set attributes = states.sensor.spa_flipr_red_ox.attributes %}
{{ attributes }}

Cela me retourne le même bloc mais l’appel pour l’afficher est plus court.

Je ne comprend pas ce que ça amène :thinking:
Est-ce que ton msg n’a pas été tronqué ? :grin:

Bonjour,

Pour l’avant dernière valeur, avec une automatisation ça peut le faire.

Le trigger doit être le capteur :

trigger:
  - platform: state
    entity_id: sensor.spa_flipr_red_ox
    to:

Et dans la partie action de l’automatisation vous pouvez récupérer la valeur précédente avec : trigger.from_state.state (la valeur ayant déclenché le trigger est trigger.to_state.state)

Merci @Makai pour me mettre sur la piste mais j’ai bien l’impression que je fait une erreur de syntaxe lors de mes tests.

Le test consiste à m’envoyer une notification avec la valeur précédente et la valeur actuelle.
J’ai le retour erreur :

Error: Error rendering data template: UndefinedError: ‹ dict object › has no attribute ‹ to_state ›

J’ai parcouru pas mal de sujet comme celui-ci sans comprendre d’où viens mon problème. Il y a un concept qui doit m’échapper pour me lancer à l’utilisation des variables.
Le code de mon test est le suivant

alias: Test écart
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.spa_flipr_red_ox
condition: []
action:
  - service: notify.mobile_app_huawei
    data:
      message: >-
        Valeur précédente {{ trigger.to_state.entity_id }} et actuelle {{
        trigger.to_state.state }} 
mode: single

Il faut remplacer trigger.to_state.entity_id par trigger.from_state.state pour la valeur précédente.

Exemple d’une de mes automatisations :

    - service: notify.mobile_app_x
      continue_on_error: true
      data:
        title: "External IP has changed"
        message: "External IP changed from {{ trigger.from_state.state }} to {{ trigger.to_state.state }}"

Merci pour le complément d’information

Cette fois l’erreur retourne

Error: Error rendering data template: UndefinedError: ‹ dict object › has no attribute ‹ from_state ›

Là je suis perdu

Hum je dirai à cause du format du trigger.

Remplacer par :

trigger:
  - platform: state
    entity_id: sensor.spa_flipr_red_ox

C’est à dire en enlevant le tiret.

Le message d’erreur est toujours le même. Est-ce que ça pourrait venir de l’entité elle même ? Peut être que ce n’est pas possible de le faire

A moins que je doivent activer un mode avancé sur mon profil ?

Vraiment bizarre. Pouvez-vous essayer avec une autre entité ?
Et créer une notification plutôt que d’envoyer sur votre téléphone :

- service: persistent_notification.create
  data:
    title: "External IP has changed"
    message: "External IP changed from {{ trigger.from_state.state }} to {{ trigger.to_state.state }}"
   

Question bête

Je suis dans la rubrique Automatisation et Scène
Est-ce que ce que je ne devrait pas plutot être dans le fichier configuration.yaml ?

C’est tout à fait possible…

Dans ce cas, dans configuration.yaml, il vous faut avoir les 2 lignes suivantes (la 1ere doit déjà y être, les 2 permettent de pouvoir utiliser l’interface et le yaml pour faire des automatisations) :

automation: !include automations.yaml
automation manual: !include_dir_merge_list automations

Ensuite, dans le dossier config, vous devez créer un dossier nommé automations. Dans ce dossier vous créez un fichier yaml nommé par exemple test.yaml dans lequel vous copiez-collé l’automatisation

Je prends le problème dans tous les sens et il est certains que je me mélange les pinceaux.

Je suis très embêté de te demander plus d’explications. Est-il possible de me partager l’exemple complet que tu utilise sur le changement d’adresse IP ?
Pour recopier ton exemple :

  • Est-ce que je doit créer une nouvelle entrée ?
  • Est-ce que je doit ajouter des infos dans configuration.yaml
  • Est-ce que tout est saisi dans l’automatisation ou y a t’il un template à créer ?

Encore une fois, j’apprécie grandement le temps que tu passe à m’aider et je suis mal à l’aise de te demander autant d’informations.
J’espère à partir de cet exemple fonctionnel pouvoir l’adapter à mon besoin.

J’ai pas de souci à aider :slight_smile: Ca m’intrigue tout ça.

  • Non pas de nouvelle entrée à créer
  • Oui, voir mon post au dessus
  • Tout est dans l’automatisation

Si on reprend :

  1. Suivre mon post ci-dessus
  2. Voici une automatisation que j’ai créé et testé et qui fonctionne, à placer telle quelle dans le fichier test.yaml (ou autre nom que vous aurez donné au fichier se trouvant dans le dossier automations) en changeant bien sur le nom de l’entité (ici mon capteur de température du jardin)
- alias: Test - changement
  id: 7e1dd1ba-39f6-4732-960e
  trigger:
    - platform: state
      entity_id: sensor.jardin_th_temperature
      to:
  condition: []
  action:
    - service: persistent_notification.create
      data:
        title: "Nouvelle valeur"
        message: "Ancienne valeur : {{ trigger.from_state.state }}, nouvelle valeur : {{ trigger.to_state.state }}"
    - service: notify.mobile_app_x
      continue_on_error: true
      data:
        message: >-
          Ancienne valeur : {{ trigger.from_state.state }}, nouvelle valeur : {{ trigger.to_state.state }}

Ce qui donne :

Arghh c’est toujours pareil pourtant tout semble parfaitement parfait.

  1. ajout dans configuration.yaml de automation manual: !include_dir_merge_list automations
  2. création de test.yaml avec ton code (sauf la partie notification vers mobile), j’ai remplacé mon sensor
  3. redémarrage
  4. dans automatisation, exécution manuelle de Test - changement
  5. retourne toujours Error: Error rendering data template: UndefinedError: 'dict object' has no attribute 'from_state'

C’est à croire qu’il y a un bug dans mon système. Je continue mes recherches sur cette anomalie mais ça ne semble pas venir de l’automatisation en elle même :exploding_head:

En fait c’était tout bête, j’ai trouvé la réponse ici : community.home-assistant.io

La réponse traduite :

Je suppose que vous déclenchez cela à partir de l’interface utilisateur ? Si oui, il y aura une erreur car il n’y a pas de déclencheur. Attendez que l’automatisation se produise naturellement ou utilisez une entité de test pour déclencher l’automatisation. Vous pouvez utiliser une aide input_number comme entité de test.

J’ai attendu un rafraichissement et ça fonctionne parfaitement.
Merci pour toute l’aide que tu m’a apporté, c’était un problème d’usage au lieu d’un problème technique.

1 « J'aime »

Ah oui :joy: je l’ai pas vu venir celle la. Effectivement si on déclenche manuellement il n’y a pas de trigger et donc de variable contenant la valeur de celui-ci !
J’aurai pu chercher longtemps :sweat_smile:

1 « J'aime »

Grâce à toi je vais avancer sur mon algorithme de traitement de l’eau du spa / jacuzzi

Le code est déjà pas mal étoffé et ça servira de garde fou le temps que les traitements fassent leurs effets
Actuellement j’affine la quantité des traitements et les déclencheurs. Dès que je le mettrait en ligne je te ferait une notification pour que tu puisse consulter le résultat

Encore merci pour ton aide

1 « J'aime »