Ayant parfois dans les données de mes capteurs des valeurs hors norme, j’ai tenté de filtrer avec les moyens de HA (filter, outlier). Après plusieurs semaines d’essais, je constate qu’aucun de ces filtres n’écarte ‘réellement’ des valeurs farfelues.
J’envisage donc de réaliser ce filtrage par moi-même via de l’amortissement.
Ce que je souhaite faire :
If Nlle_donnée > (ancienne_valeur + 20) then ancienne_valeur + 5
If Nlle_donnée < (ancienne_valeur – 20) then ancienne valeur – 5
Else ancienne_valeur = Nlle_donnée
Ainsi, si la nouvelle donnée reste dans la plage + ou – 20 points, la valeur résultat (ancienne_valeur) prend la valeur de la nouvelle donnée.
Si celle-ci est hors limite, la valeur résultat suit la tendance, mais ne s’incrémente ou ne se décrémente que de 5 points.
J’ai bien regardé du côté des templates, mais je ne comprends pas vraiment comment faire.
Pourriez-vous m’aider ou me montrer comment l’écrire ?
Oui tu dois bien utiliser les templates, mais la dernière valeur ne sera pas dispo directement. Tu peux la stocker dans un input_number et réutiliser. Mais l’alternative plus propre est d’utiliser la fonction trend, tester si la tendance est trop forte, et si oui, « amortir » la valeur.
Bon, en fait, çà ne fonctionne pas.
La valeur ‹ sensor.tension_filtre_reserve_eau_pluie › prend la valeur du Shelly tant que celle-ci reste dans les bornes des if (+/- 0.5)
Dès que la valeur s’en écarte et rentre dans l’un des premiers cas, la valeur du sensor n’est pas incrémentée (ou décrémentée).
Je dois très certainement mal écrire ces lignes :
Maintenant, j’ai bien une prise en compte du test et une incrémentation par pas de 0.05 V.
Sauf que le template fonctionne en boucle et incrémente la variable jusqu’à rejoindre la tension du capteur. (En moins d’une seconde)
Il faudrait que l’incrémentation n’ait lieu qu’une seule fois, après chaque remontée d’information du capteur.
J’imagine qu’en rechargeant le fichier config, tous les templates qui y sont inscrits sont réinitialisés.
Dans ce cas, après essai, le sensor tension_filtre_reserve_eau_pluie repasse à 0 et se réincrémente à toute vitesse jusqu’à la valeur du sensor.shelly_cuve_pluie_adc.
Le temps est passé sur cette affaire. J’avais trouvé une solution fonctionnelle à partir de deux automations.
Automation A : si valeur supérieure de 0.1 V à ancienne valeur => incrémentation de 0.001V
Automation B : Si valeur inférieure de 0.1 V à l’ancienne valeur => décrémentation de 0.001V
Ainsi, la variable est traitée une fois à chaque acquisition de nouvelle valeur (toutes les 30 ’ environ’). Pas de risque de modification rapide. C’est pour le moment le meilleur moyen que j’ai trouvé pour filtrer les valeurs de mes sondes de niveau (tension 0/5V)
Cela fonctionne ainsi; mais en jetant un œil dans les log, je retrouve ces erreurs qui me laissent penser que j’ai mal traité mes variables. Le float semble inapproprié. Mais si je l’enlève, j’ai des erreurs et l’automation ne fonctionne plus.
2023-12-30 15:00:13.644 WARNING (MainThread) [homeassistant.components.automation] Error evaluating condition in 'automation 20':
In 'condition':
In 'template' condition: ValueError: Template error: float got invalid input 'unavailable' when rendering template '{{ (states('sensor.shelly_cuve_pluie_adc')| float) > ((states('input_number.tension_filtree_reserve_eau_pluie')| float) + 0.1) }}' but no default was specified
2023-12-30 15:00:13.646 WARNING (MainThread) [homeassistant.components.automation] Error evaluating condition in 'automation 21':
In 'condition':
In 'template' condition: ValueError: Template error: float got invalid input 'unavailable' when rendering template '{{ (states('sensor.shelly_cuve_pluie_adc')| float) < ((states('input_number.tension_filtree_reserve_eau_pluie') | float) - 0.1) }}' but no default was specified
Avez-vous une idée pour faire disparaitre ce soucis ?