Limiter les valeurs reçues

Bonjour,

J’ai un capteur ultrason pour ma citerne à eau de pluie de 8m3.
Ça marche nickel mais bon, pour le moment elle est pleine mais mes capteurs indique parfois 101% ou 8036L. Rien de bien méchant mais pensez-vous qu’il est possible de limiter les valeurs (le mieux directement dans esphome) pour que le maximum affiché soit 8000L et 100%?.
J’ai regardé dans les filtres mais je n’y comprends pas grand chose.

Merci

Je suis pas un as en esphome mais n’aurais tu pas moyen de mettre à jour la valeur haute de ton sensor par celle qui te donne 101%.
Sinon, dans le genre bricole. Tu peux définir un autre sensor dans se réfère à ta valeur tant qu’elle est inférieure à 100% et te donne 100% si la valeur est supérieur.
Certains trouverons certainement une meilleure solution …

La solution de @Twinsen semble pas mal pour ça.
Maintenant comme tu partages pas ton yaml c’est difficile de dire plus précisément.

Salut,
Merci pour ta réponse mais je dois t’avouer que je n’ai pas compris grand chose.
Pour ce qui est d’un autre sensor, j’y ai pensé mais d’abord, je ne sais pas comment faire et en plus, ce serait dommage de multiplier les sensors si il y a moyen de le faire en natif…
Mais si tu savais me donner un bout de code pour un second sensor, ce serait gentil.

Merci

Si tu passes ton code y’aura moyen de t’aider je pense.
Tu dois bien avoir un sensor avec une logique qui convertit la distance mesurée par l’ultrason en % et en litres. C’est dans cette logique que tu dois pouvoir rajouter un truc qui s’assure de toujours limiter à 100%

Effectivement il faut créer dans ESPHome un template sensor qui reprend la valeur du sensor initial et retourne la bonne valeur. Le code est a écrire dans un lambda

Template Sensor — ESPHome

Bonjour,
Je vous donne la partie intéressante du code pour plus de lisibilité car l’ESP contient d’autre chose.

sensor:
  - platform: ultrasonic
    trigger_pin: 18
    echo_pin: 19
    name: "Niveau citerne"
    unit_of_measurement: "%"
    accuracy_decimals: 0
    update_interval: 10s
    filters:
      - lambda: return ((100*(185-((x*100)-40)))/185);
      - filter_out: nan
      - median
      
  - platform: ultrasonic
    trigger_pin: 18
    echo_pin: 19
    update_interval: 10s
    name: "Volume citerne"
    unit_of_measurement: "L"
    accuracy_decimals: 0
    filters:
      - lambda: return ((8000*(185-((x*100)-40)))/185);
      - filter_out: nan
      - median

Le soucis est que je ne sais pas comment faire.
C’est un peu comme le « median » que j’ai indiqué. c’est pour lisser ma courbe mais ca ne marche pas très bien non plus lol.

Merci

Accessoirement un truc du genre avec le min max ça marche très bien pour filtrer entre 2 bornes :

 {{ max(min(val,100),0) }}

Il y a plusieurs choix.
Mais il faut aussi savoir ce que tu veux:
L’ultrason mesure une distance. Donc s’il mesure 101% c’est que ton max, qui semble être 185 peut être dépassé.

Soit tu veux être précis alors faut revoir ou remesurer quel est vraiment ton maximum.
Soit la précision ne t’intéresse pas quand c’est rempli et là dans la lambda tu change pour renvoyer 100 si le résultat est plus de 100 et 8000 quand c’est plus de 8000.

Ca peut ressembler à ça:

lambda: |-
	int resultat = (100*(185-((x*100)-40)))/185;
    if(resultat > 100)
	   return(100);
	else
	   return(resultat);

Salut,

C’est pas mal mais je dois avouer que je ne comprends pas grand chose à la formule.

Mais merci de t’être penché sur le problème

Salut,

Merci pour cette formule. Une fois que tu l’as écrite, c’est tout bête mais je ne suis pas assez calé pour la pondre tout seul.
Alors, pour ce qui est de la précision, je pense que ma mesure est bonne. Souvent ça varie de 20 à 30L sur 8000. Ce n’est pas énorme puisque ça représente 4mm de différence. Les vrais problèmes viennent des vaguelettes qui se produisent lors de l’arrivée d’eau ou lorsque mon flotteur qui puise l’eau passe devant la sonde.
Mon médian qui marche très moyennement, tu n’aurais pas une idée pour lisser ma courbe ? Et accessoirement éliminer les pics?

En tout cas, merci beaucoup pour ton aide

Pour que ce soit plus lissé à la place de median, y’a peut être exponential_moving_average
mais il semble par défaut envoyer moins de valeurs. Y’a des options additionnelles possibles pour contrôler le filtre.

C’est un lien vers les filtres de sensor et leur doc: