Configuration pour transformer un contact binaire en fréquence lissée

Bonjour,

Je débute dans la fermentation de jus de pomme en cidre, et pour mieux appréhender la fermentation, j’aimerais collecter certaines données pour le suivi.

Lors de la fermentation, le moût dégage du gaz carbonique, gaz qui s’échappe par une bonde anti-sceptique (bonde comme dans une douche ou sous un lavabo, formée par un “bouchon” d’eau qui ne laisse pas passer les insectes ou autres, mais qui permet au gaz en surpression côté fermentation de pousser l’eau jusqu’à pouvoir s’échapper ponctuellement vers l’extérieure réduisant alors la pression).

L’évacuation d’une bulle de gaz provoque une secousse sur la bonde qui s’élève lentement sous l’effet de la pression, puis redescend d’un coup lorsque du gaz s’échappe.

J’ai placé un capteur de vibration sur la bonde, ce qui me permet de collecter les événements de dégazage sous forme de capteur binaire.

J’aimerais transformer cette suite de on/off en fréquence pour suivre l’accélération, ou la décélération de la fermentation.

Je vous décris ci-dessous ce que j’ai fait et en quoi ça ne me satisfait pas, merci de soit m’aider à amélioré ma configuration, soit de m’orienter sur une autre méthode plus pertinente :

  • J’ai créé un compteur journalier de basculement via “history_stats”
- platform: history_stats
  name: fermentation 01 flips
  entity_id: binary_sensor.0x00158d00039dc4fc_vibration
  state: "off"
  type: count
  start: "{{ now().replace(hour=0, minute=0, second=0) }}"
  end: "{{ now() }}"
  • J’ai créé (inutilement peut-être, c’est une copie de mon compteur d’eau de pluie) un compteur basé sur le capteur précédant
- sensor:
    - name: Fermentation today
      state_class: total_increasing
      unique_id: fermentation_today
      state: "{{ states('sensor.fermentation_01_flips') | int(0) }}"
      availability: "{{ (states('sensor.fermentation_01_flips') not in ('unknown', 'unavailable')) }}"
  • J’ai créé un “trend” sur ce compteur
- platform: trend
  sensors:
    vibration_01_trend:
      entity_id: sensor.fermentation_today
      max_samples: 2
  • J’ai créé un capteur qui affiche le “gradient” de ce “trend” ramené à l’heure
- sensor:
    - name: Fermentation intensity
      unit_of_measurement: /h
      state_class: measurement
      unique_id: fermentation_per_hour
      state: >-
        {% set value_hour = ((state_attr('binary_sensor.vibration_01_trend', 'gradient') | float(0)) * 3600) | round(1, 'floor') %}
        {% if value_hour >= 0 %}
          {{ value_hour }}
        {% else %}
          {{ 0 }}
        {% endif %}

L’inconvénient de cette méthode, c’est que j’ai une « fréquence » de basculement déterminée sur le temps passé entre les 2 derniers évènements, mais comme la position de la bonde varie un peu à chaque échappement, la quantité de gaz qui arrive à s’échapper n’est pas toujours strictement la même, il arrive que 2 évènements se suivent de façon rapproché, ou au contraire plus éloigné, ce qui ponctuellement affiche des valeurs peu pertinentes. J’aimerai donc une moyenne et pas une valeur instantanée.

Dans l’idéal, j’aimerais plutôt que de convertir le temps entre 2 basculements consécutifs en nombre de basculements par heure avoir plutôt un compteur glissant sur 1h.

Merci pour votre aide.

Salut,

Regarde un peu plus en détails platform: filter

tu as moyen d’y faire des opérations, par exemple moyenne sur période glissante

  filters:
    - filter: time_simple_moving_average
      window_size: "00:05"
      precision: 1

Avec une fenêtre assez large et le trend dessus que tu mentionnes, tu dois pouvoir obtenir un truc un peu meilleur.
Evidement comme le mécanisme de la bonde est assez simple, il y a une limite à la précision, donc mettre trop de temps ne sera pas bon non plus

J’ai créé quelques filtres avec différends paramètres, la moyenne glissante sur 1h semble correspondre, je vais laisser filer le temps pour voir ce que ça donne.
Pour information, l’ordre de grandeur est de 5 à 20 dégazages/h, actuellement la moyenne glissante donne environ 12/h avec des valeurs ponctuelles qui peuvent aller de 6 à 30/h sans filtre.
Merci.

Pour le moment, ce qui donne le meilleur résultat, c’est un compteur glissant sur 1h, car les filtres passe bas ou moyenné ont comme inconvénient de se baser sur le temps entre 2 évenènements, sauf que cette valeur ne se met à jour qu’au prochain évènement, donc quand 2 évènements sont plus espacés, la valeur reste constante jusqu’à sa mise à jour, et plus le temps est long, plus on s’éloigne car plus la mise à jour sera basse alors que le filtre prend en compte une valeur resté plus haute, les 2 filtres ont tendance à monter quand la succession d’évèneemnt ralenti.

L’inconvénient du simple compteur, c’est qu’il n’affiche des données pertinentes qu’au bout d’une heure, et c’est l’image de ce qui s’est passé l’heure précédente alors que les filtres indiquent une valeur instantanée lissée par les données incluses dans le filtre.

Il faut aussi que je crée un vrai compteur, l’historique nécessite une remise à zéro au début d’un interval de surveillance, et ça plante toutes les courbes le temps que l’anomalie sorte des filtres.

Si quelqu’un a d’autres idées pour implémenter ça, je suis tout ouïe.

Salut

Et time_throttle la description semble correspondre à ton cas : capteur avec taux de refresh variable ?

A priori seul ce n’est pas bon car ça ne lisse pas, en revanche en entrée des autres filtres, à voir si ça permet de réduire le poids de chaque valeur et donc ne pas prendre en compte une valeur non mise à jour pour toute la durée où elle reste constante, je vais tester merci.

Il y a de rares micro-différences entre le filtre directement sur le compteur, et l’insertion du filtre time_throttle entre les 2, soit je n’ai pas compris son fonctionnement, soit je ne l’utilise pas où il faudrait, soit les deux…

Je pense qu’il va falloir un petit script pour ajouter des données intermédiaires si le temps avance sans événements pour ne pas garder la dernière valeur constante quand on s’en éloigne fortement avec le temps qui passe.

Exemple d’aberration, si il ne se passe plus rien pendant 1h, l’évènement suivant calcule la fréquence en fonction du temps qui sépare les 2 derniers évènement, soit 1h, donc fréquence de 1/h, mais pour le filtre, cette valeur est utilisée avec les valeurs précédentes dont l’avant dernière avec un poids qui correspond à 1h, la baisse de la courbe est presque insignifiante
Alors que si j’ajoute régulièrement la valeur de fréquence si le nouvel évènement arrivait à cet instant, le temps entre le dernier vrai évènement et le calcul intermédiaire augmentant, la fréquence baisserait au fur et à mesure jusqu’au nouvel évènement réel qui sera dans la continuité de cette baisse.

Avez-vous des références de capteurs de vibration zigbee qui n’ont pas la limitation des aqara d’une alerte par minute ? Au plus actif j’ai besoin d’une détection toutes les 10s.

Ce sujet a été automatiquement fermé après 60 jours. Aucune réponse n’est permise dorénavant.