Readings ignorieren / filtern

Begonnen von Stephan, 02 Februar 2014, 16:38:16

Vorheriges Thema - Nächstes Thema

CoolTux

Für was brauchst du es denn? FileLog oder Reading?
Du könntest es mit einem userReading probieren.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

killah78

Hallo CoolTux,
also ich habe einen Funk Thermostat im Kellergefrierschrank liegen und überwache damit die Temperatur. Diese geht im Normalfall so zwischen -15 und -20 Grad. Machmal gehen die Messwerte aber auf -40 und weniger. Ich glaube der Gefrierschrank kann garnicht soweit runter. Das ist ein Messfehler. Deswegen würde ich gerne die Werte kleiner -25 ignorieren.

Soweit zur Vorgeschichte.
Im Grunde könnten diese Werte im Log verbleiben und ich filtere mir sie über den Plot heraus.
Hier habe ich aber nur dieses (?!85) gefunden. Was muss ich hier tun, wenn ich einen Wert ausschließen möchte? Ein (?!le-25) geht nicht. Wie ist dafür die Syntax?
Aber auch den anderen Fall würde ich gerne beherrschen. Ist das möglich, bestimmte Ranges für das Logfile zu ignorieren? Wie würde sowas mit einem userReading funktionieren?

Danke und Gruss
killah78

HB86

#17
Hat schon jemand eine Lösung gefunden Bereiche bei Readings zu filtern?

Hab auch das Problem, dass meine Temperatursensoren manchmal komische Werte liefern. Die würde ich auch gerne filtern, da über die Temperatur Reading meine Heizkörper geregelt werden.

HB86


haneub

Hallo,
hab ein ähnliches Problem:
In einem reading steht manchmal auf 32, mich interessieren aber nur 0 und 4:
Im Filelog steht:
2017-01-02_12:19:16 VSR_d REG_DI: 32
2017-01-02_12:19:22 VSR_d REG_DI: 0
Mein Versuch im Filelog u.a. mit:
VSR_d:REG_DI.REG_DI\x3a.(?!32):0:

zu filtern funktioniert nicht.
Wie bekomme ich Zeilen wie
2017-01-02_12:19:16 VSR_d REG_DI: 32
aus dem log?

Vielen Dank für Tips, Harald

Kehemann

#20
Hallo,

bei mir liefern die DS18B20-Sensoren auch ab und zu zu hohe Werte. Nun kann man sicher versuchen die Ursache zu beseitigen, jedoch ist mir der Aufwand dafür einfach zu hoch, da die Messwerte ansonsten zuverlässig liegen, mit einigen Ausnahmen eben. Ich habe dafür zwei Lösungen mit einem oder zwei userReadings gefunden. Die userReadings erzeugen bei den Ausreißern einen Standardwert, in meinem Fall 85, den ich über eine regex in dblog rausfiltere. Ob der Messwert zu hoch ist, wird entweder über einen Vergleich mit einem festen Wert oder über den Vergleich der Differenz zum Vorgänger des Messwertes geprüft.

Variante 1:
set Sensor userReadings Temp {sprintf "%.1f", ReadingsVal($name,"temperature",0)<60 ? ReadingsVal($name,"temperature",0) : "85"}

Das userreading Temp wird erzeugt nachdem geprüft wird, ob das Reading temperature des Sensors < 60 ist. Wenn ja ist Temp = temperature, wenn nein ist Temp=85.

Variante 2:
set Sensor userReadings Differenz difference {abs(ReadingsVal($name,"temperature",0))},
Temp {sprintf "%.1f", ReadingsVal($name,"Differenz",0)<10 ? ReadingsVal($name,"temperature",0) : "85"}


Das userReading Differenz  ist die Differenz des aktuellen Messwertes zum Vorgänger. Danach wird geprüft, ob die Abweichung kleiner als 10 ist. Wenn ja ist Temp = temperature, wenn nein ist Temp=85.

Die Definition meiner dblog sieht dann so aus:
define myDbLog DbLog ./db.conf .*:(Temp).*(?!85.0)

Damit wird ausschließlich das Reading Temp geloggt, mit Ausnahme des Wertes 85.

Grüße Kehemann

HB86

Besteht auch irgendwie die Möglichkeit die "Ausreisser" komplett zu ignorieren, also direkt als reading zu ignorieren?

DeeSPe

Ja, mit dem Attribut "suppressReading" und entsprechend gesetztem Regex.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

HB86

zu suppressReading finde ich leider nicht sonderlich viel.
Kann ich damit auch ganze Bereiche ignorieren, also zum Beispiel alle temperature Werte < 5 ?
Und wie müsste sowas aussehen?

DeeSPe

Sorry, das habe ich verwechselt, ich dachte Du willst wirklich das Reading komplett unterdrücken, aber es sollen ja nur bestimmte Werte unterdrückt werden.
Da kenne ich mich leider nicht gut genug aus...

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

M.Piet

Zitat von: DeeSPe am 24 April 2017, 14:45:20
Ja, mit dem Attribut "suppressReading" und entsprechend gesetztem Regex.

Gruß
Dan
Das scheint doch genau das richtige zu sein. Ich möchte auch Readings mit genau 85° bei meinen 1wire ignorieren.

Mit welchem Wert müsste ich das Attribut füllen, damit 85° ignoriert wird und alle anderen nicht ignoriert werden?
suppressReading mit dem Wert "^85" oder "$85"?

Bin aus der Suche nicht so ganz schlau geworden. Danke schon mal. :) Und ausprobieren ist schwer, da ich nur alle 1-2 Wochen mal einen mit 85° habe...

Aeroschmelz

Hallo Kehemann,

mich würde interessieren, wie man bei Variante 2, den Wert von Temp nicht standardmäßig auf 85 setzt, wenn die Differenz zu groß ist, sondern auf den vorherigen Wert? $name muss immer durch den Namen des betroffenen Devices ersetzt werden? Was macht das sprintf "%.1f?

Zitat von: Kehemann am 23 April 2017, 15:05:04
Variante 2:
set Sensor userReadings Differenz difference {abs(ReadingsVal($name,"temperature",0))},
Temp {sprintf "%.1f", ReadingsVal($name,"Differenz",0)<10 ? ReadingsVal($name,"temperature",0) : "85"}


Das userReading Differenz  ist die Differenz des aktuellen Messwertes zum Vorgänger. Danach wird geprüft, ob die Abweichung kleiner als 10 ist. Wenn ja ist Temp = temperature, wenn nein ist Temp=85.

Danke und viele Grüsse
Marcus

huhu

Zitat von: Kehemann am 23 April 2017, 15:05:04

Variante 2:
set Sensor userReadings Differenz difference {abs(ReadingsVal($name,"temperature",0))},
Temp {sprintf "%.1f", ReadingsVal($name,"Differenz",0)<10 ? ReadingsVal($name,"temperature",0) : "85"}


Das userReading Differenz  ist die Differenz des aktuellen Messwertes zum Vorgänger. Danach wird geprüft, ob die Abweichung kleiner als 10 ist. Wenn ja ist Temp = temperature, wenn nein ist Temp=85.



Hallo,

ich benutze seit einigen Wochen einen Ultraschallsensor in der Zisterne. Anfangs lief dies ganz gut, allerdings erhalte ich jetzt viele Fehlmessungen. Ich versuche Variante2 umzubauen, aber irgendwie will es nicht ganz funktionieren..

cleanlevel difference {abs(ReadingsVal("ESPEasy_ESP_Zisterne_LEVEL","level",0))},
lastlevel {sprintf "%.1f", ReadingsVal("ESPEasy_ESP_Zisterne_LEVEL","cleanlevel",0)<0.5 ? ReadingsVal("ESPEasy_ESP_Zisterne_LEVEL","cleanlevel",0) : "85"}


Weiß jemand wo der Denkfehler ist? Es soll der aktuelle Wert aus dem Reading ("ESPEasy_ESP_Zisterne_LEVEL","level",0) mit dem letzten Wert (lastlevel) verglichen werden. Bei Abweichung von mehr als 0.5cm soll der default Wert genommen werden; noch besser wäre es, den Wert zu ignorieren statt einen fest zu setzen.

Viele grüße
huhu

huhu

Zitat von: huhu am 09 August 2019, 00:01:22

Hallo,

ich benutze seit einigen Wochen einen Ultraschallsensor in der Zisterne. Anfangs lief dies ganz gut, allerdings erhalte ich jetzt viele Fehlmessungen. Ich versuche Variante2 umzubauen, aber irgendwie will es nicht ganz funktionieren..

cleanlevel difference {abs(ReadingsVal("ESPEasy_ESP_Zisterne_LEVEL","level",0))},
lastlevel {sprintf "%.1f", ReadingsVal("ESPEasy_ESP_Zisterne_LEVEL","cleanlevel",0)<0.5 ? ReadingsVal("ESPEasy_ESP_Zisterne_LEVEL","cleanlevel",0) : "85"}


Weiß jemand wo der Denkfehler ist? Es soll der aktuelle Wert aus dem Reading ("ESPEasy_ESP_Zisterne_LEVEL","level",0) mit dem letzten Wert (lastlevel) verglichen werden. Bei Abweichung von mehr als 0.5cm soll der default Wert genommen werden; noch besser wäre es, den Wert zu ignorieren statt einen fest zu setzen.

Viele grüße
huhu

Die Lösung sieht so aus, wer es mal brauchen sollte :)

Setze immer den Wert, es sei denn, er ist 150 - dann vorherigen behalten.
level {
my $lastlevel=ReadingsNum("ESPEasy_ESP_Zisterne_DISTANCE","level",0);
my $level=150-(ReadingsNum("ESPEasy_ESP_Zisterne_DISTANCE","distance",0));
return $level unless($level == 150);
return $lastlevel }, liter {
my $level=ReadingsNum("ESPEasy_ESP_Zisterne_DISTANCE","level",0);
my $liter=50.2*($level);
use Math::Round qw/round/;
return $liter= Math::Round::nearest('10',$liter) }

rob

Zitat von: huhu am 09 August 2019, 00:01:22
ich benutze seit einigen Wochen einen Ultraschallsensor in der Zisterne.
Hi.

Bitte nimm mir das OT nicht übel, aber könntest Du bitte ein Foto einstellen wie Du physisch den Sensor im Einsatz hast? Ich möchte auch meine Zisterne messen und schwanke noch zw. Ultraschall- und Kapazitivmessung.
Den Auswerteansatz sieht man ja hier schon  ;D

Danke und viele Grüße
rob