Hauptmenü

Ereignis öfter prüfen

Begonnen von laisch, 27 Februar 2018, 00:23:20

Vorheriges Thema - Nächstes Thema

laisch

Ich habe mir einen Ultraschallsensor in meinem Pelletsvorratsbehälter eingebaut um so den Füllstand zu messen. Sobald dieser einen gewissen Schwellwert unterschreitet, soll ich per Smartphone benachrichtigt werden.
Leider liefert der Sensor sehr oft falsche Werte und mit meinem jetzigen DOIF bekomme ich sehr oft false positives.


defmod di_Heizung_20 DOIF ([ESP003_Hz:Fuellstand] < 20) (set Homebot message  @xxxxxxxx Heizung Nachfüllen! Füllstand bei [ESP003_Hz:Fuellstand] %) DOELSE (set di_Heizung_20 initialize)
attr di_Heizung_20 do always
attr di_Heizung_20 repeatsame 1
attr di_Heizung_20 room Homebot
attr di_Heizung_20 waitsame 180



Waitsame schlägt soviel ich verstanden habe beim 2. positiven Ereignis innerhalb der angegebenen Zeitspanne zu. Da die Messfehler aber meist 3-4 mal hintereinander auftreten ist waitsame nicht Zielführend.
Gibt es eine Möglichkeit das Reading 10x hintereinander zu prüfen und erst dannach die Telegramnachricht abzusetzen?
Oder müsste man hier den Umweg über dummys machen

Danke und Schöne Grüße

Ellert

#1
ZitatGibt es eine Möglichkeit das Reading 10x hintereinander zu prüfen und erst dannach die Telegramnachricht abzusetzen?
Das wird nicht die Lösung sein.

Du fragst die Bedingung 10x ab, dann gibt es eine Meldung. Aber, was ist wenn 9 Werte richtig sind und der 10. ein Fehler ist? Dann gibt es auch eine unerwünschte Meldung.

Du müsstest die Fehler filtern. Im einfachsten Fall über einen gleitenden Mittelwert.

Zum Beispiel im Ursprungsgerät über das Attribut event-aggregator und dann auf das Ergebnis triggern.

laisch

Zitat von: Ellert am 27 Februar 2018, 05:46:37
Du fragst die Bedingung 10x ab, dann gibt es eine Meldung. Aber, was ist wenn 9 Werte richtig sind und der 10. ein Fehler ist? Dann gibt es auch eine unerwünschte Meldung.


Was ich meinte, war dass 10x hintereinander der Wert unter 20 liegen muss um das Event zu triggern. Liegt er bei den 10 Messungen nur einmal über 20, dann soll nichts passieren bis das nächste mal 10x hintereinander <20 wahr wird.

Gemessen wird alle 60 Sek der Abstand vom Deckel zur Pelletsobergrenze des Vorratsbehälters und das ganze wird über ein Userreading in einen Füllstand in % umgerechnet.

Ich hab dieses Setup mal eine Woche mitloggen lassen und Messfehler treten meistens 2-4x hintereinander auf. Ansonsten sind die Ergebnisse für eine bis mehrere Stunden konstant und richtig.
Die falschen Messungen geben immer einen größeren Abstand (niemals einen kleineren) als der wirkliche.
Ich vermute, das liegt daran, dass die Pellets keine schöne Oberfläche bilden und das Triggersignal ab und an über die Behälterwände zurück an den Sensor geworfen wird.
Somit würde sobald der Füllstand unter den Schwellwert (20% oder ~60 cm) fällt ein potentieller Messfehler nicht mehr ins Gewicht fallen und das Ereignis ausgelöst werden.
Bei Wenn also 10 aufeinanderfolgende Messungen bei <20% liegen, kann ich mir ziemlich sicher sein, dass der Füllstand auch unter 20% liegt.

Das mit dem Event Aggregator muss ich mir mal ansehen, Danke für die Info.
Wobei ich befürchte, dass die Messreihe für eine aussagekräftige Glättung recht groß sein muss da die Messfehler teils Gravierend sind.

Bei einer Messreihe mit 10 Messungen reale 90% Ausreißer mit 10%
(90%, 90%, 90%, 10%, 10%, 90%, 10%, 90%, 90%, 90%) wäre 57% der Mittelwert

Als Anhang ein Plott Auszug aus den Logs für die Veranschaulichung der Ausreißer

Ellert

#3
ZitatDie falschen Messungen geben immer einen größeren Abstand (niemals einen kleineren) als der wirkliche.
Dann könntest Du im statt einem gleitenden Mittelwert das Minimum einer Anzahl von Werten berechnen (event-aggregator).

Zusätzlich solltest Du mit einer Umschaltschwelle arbeiten, z.B.

Zweig 1: Wenn der Füllstand kleiner 20% ist, gibt es 1 Alarm.
Zweig 2 (DOELSEIF):Wenn der Füllstand wieder größer 90% ist nachdem ein Alarm erzeugt wurde, wird der Alarm und das gleitende Minimum wird zurückgesetzt.

Alle 60 s einen Wert auszuwerten halte ich für übertrieben, selbst bei einem Verbrauch von mehreren Prozent pro Tag.


Per

Du kannst einfach einen Dummy hochzählen, wenn ein Wert unter 20% auftritt. Über 20% wird der Dummy jedesmal zurückgesetzt.
Ist der Dummy 10 oder größer, löst du den Alarm aus.

Wenn du zu oft misst, kann es passieren, dass sich der Stand gar nicht ändert und ein "komisch" liegendes Pellet jedesmal den US-Sensor täuscht. Kommt etwas Bewegung (Verbrauch, Ausdehnung durch Luftfeuchte oder Temperatur) dazu, ist die Wahrscheinlichkeit viel geringer.