Home Assistant : Un Sensor SQL pour afficher une variation de données sur 24h

Home Assistant est une solution domotique puissante mais des fois il faut recourir à quelques astuces pour afficher une donnée particulière.

Dans mon cas, j’ai à ma disposition une valeur provenant d’un pluviomètre qui ne se remet à zéro que sur de longues période (1 an). Recevoir des valeurs de 250 mm ou 400 mm n’est pas anormal. J’ai ainsi voulu afficher quelque chose de plus parlant avec la pluie tombée lors des dernières 24h. La solution (ce n’est peut-être pas la seule) a été de créé un capteur SQL Sensor.

Dans mon cas, le capteur affichant de grandes valeurs s’appelle sensor.pluviometre et je veux créer un capteur sensor.pluviometrie_24h

Voici le code du sensor SQL à mettre dans le fichier configuration.yaml :

sensor:
  - platform: sql
    scan_interval: 600
    queries:
      - name: Pluviometrie 24h
        query: "SELECT CAST(max(state)-min(state) AS CHAR CHARACTER) AS value FROM states WHERE entity_id='sensor.pluviometre' AND state!='unknown' AND datetime(last_changed) > datetime('now', '-1 days');"
        column: 'value'
        unit_of_measurement: 'mm'
        value_template: "{{ value | round(1) }}"
Sensor SQL : Variation d'une donnée sur 24h

Quelques explications :

scan_interval: 600

Va définir le temps de rafraîchissement du capteur. Ici, j’ai défini sur 600 secondes (10 minutes)

"SELECT CAST(max(state)-min(state) AS CHAR CHARACTER) AS value FROM states WHERE entity_id='sensor.pluviometre' AND state!='unknown' AND datetime(last_changed) > datetime('now', '-1 days');"

Au niveau de la requêtes SQL, il est important de définir AS CHAR CHARACTER pour que l’on puisse formater la données. En effet, si l’on renvoie un float ou un int il est impossible d’effectuer un arrondi dans le value_template (voir ci-dessous).

La condition datetime(last_changed) > datetime(‘now’, ‘-1 days’) me permet d’effectuer la requête sur les valeurs du capteur reçues depuis 24h.

Il faudra probablement que vous ayez activé le component recorder pour que Home Assistant stocke les valeurs des capteurs dans la base de données.

value_template: "{{ value | round(1) }}"

Ici, on arrondi à un chiffre après la virgule. J’aurais pu probablement pu arrondir à 0 car l’unité de mesure est le mm et les pluviomètres électroniques ne sont déjà pas réputés pour être ultra-précis.

Améliorations à apporter

Le code n’est pas encore totalement parfait, car les capteurs si la valeur de change pas, ne créent pas d’enregistrement en BDD. Imaginons le cas suivant :

Il est actuellement 8h le jour J. Le jour J-1, il a plu seulement à partir de 10h. Lorsque je récupère les valeurs à partir de 8h, la première valeur retournée par la requête SQL (qui sert de minimum) sera celle de 10h. En effet la valeur de 8h est enregistrée en BDD mais seulement la dernière fois il a plu, ce qui peut être à J-3 et donc la requête SQL ne me la renvoie pas.

Si vous avez une idée pour traiter cela simplement, n’hésitez pas à laisser un commentaire.

Laissez un commentaire





Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.