Hallo,
mein 1-Wire Sensor liefert Temperaturdaten. Ganz ganz selten kommt es vor, dass er mir einen falschen Wert liefrt, der wohl defaultmässig vom Hersteller so vorgegeben ist. Dieser beträgt genau 85.00 Grad Celsius.
hier ein kurzer Schnipsel, in dem das vorkommt:
--------------------------------------------------
2014-01-25_19:56:13 Heizung_Ruecklauf temperature: 23.25
2014-01-25_19:56:13 Heizung_Ruecklauf T: 23.25 °C
2014-01-25_19:56:23 Heizung_Ruecklauf temperature: 23.25
2014-01-25_19:56:23 Heizung_Ruecklauf T: 23.25 °C
2014-01-25_19:56:40 Heizung_Ruecklauf temperature: 85
2014-01-25_19:56:40 Heizung_Ruecklauf T: 85.00 °C ▴
2014-01-25_19:56:48 Heizung_Ruecklauf temperature: 23.375
2014-01-25_19:56:48 Heizung_Ruecklauf T: 23.38 °C ▾
2014-01-25_19:56:58 Heizung_Ruecklauf temperature: 23.4375
2014-01-25_19:56:58 Heizung_Ruecklauf T: 23.44 °C ▾
----------------------------------------------------------------
Ich möchte gerne genau diesen Wert 85.00 Grad Celsius ausfiltern, der soll gar nicht ins Filelog, villeicht könnte man den auch ändern in ein anderes Reading.
Kann mir jemand auf die Sprünge helfen, wo und vielleicht unter welchem Stichpunkt ich da suchen muss, um das zu bewerkstelligen?
An sich würde es mir reichen, wenn man genau diesen Wert gar nicht erst in das Filelog übernimmt.
Moin Stephan,
Primär gesehen würde ich das Problem auf dem Bus beseitigen.
Die 85° zeigen, das es ein Problem auf Deinem 1-Wire Bus gibt. Mehr Informationen gibt es, wenn man die Boardsuche nimmt.
Es bringt nichts, einfach nur die Symptome zu kaschieren, und nicht die Ursache zu beseitigen.
Gruß Jaochim
Das sehe ich grundsätzlich genauso und ich bin da auch schon deutlich weiter gekommen. Habe Stützkondensatoren, etc nachgerüstet. Verbindungen gelötet statt geklemmt, Stromversorgung verändert. Hat alles für sich genommen was gebracht. Ich habe allerdings die Befürchtung, dass mein EIB/KNX Kabel, welches ich verwendet habe, nichts taugt. Ich dachte, das wäre so ein tolles Kabel aber es wirkt auf mich wie ein billiges Telefonkabel, nur in grün. Verseilung mau, also ich weiss nicht, ob das so dole ist. Da wäre ein Cat5 Kabel vielleicht die bessere Alternative gewesen. Sei es drum, es liegt und kann nicht mehr geändert werden,
Die 85 Grad habe ich ganz ganz selten, vor allem, wenn der arduino startet. die versauen mir nur meine Kurven, deswegen würde ich sie trotzdem gerne rausfiltern, auch wenn es schöner wäre, sie träten nie auf.
ZitatDie 85 Grad habe ich ganz ganz selten, vor allem, wenn der arduino startet.
Kann es sein, dass Dir dann die Spannung auf dem Bus zusammenbricht?
Ansonsten mal mit Userreadings experimentieren, und die 85 filtern
Gruß Joachim
Ja, das ist auch meine Vermutung. Benutze im Moment ein gutes USB-Netzteil, das ist komischerweise im Betrieb stabiler als ein externes 9Volt Netzteil.
Aber grundsätzlich kann ich damit leben.
"Ansonsten mal mit Userreadings experimentieren, und die 85 filtern"
Hab ich
Du kannst das auch einfach aus dem Plot filtern, indem Du folgende RegEx verwendest:
#FileLog 4:T\x3a|temperature..(?!85):0:
Habe ich auch so am laufen.
ZitatJa, das ist auch meine Vermutung. Benutze im Moment ein gutes USB-Netzteil,
Kleiner Tip, um den Netzteilfehler auszuschliessen:
Computer ATX-Netzteil, dort die 5V klauen, natürlich nicht als Dauerlösung.
Da stehen die 5V mit 30 A stabil zur verfügung.
Zitat"Ansonsten mal mit Userreadings experimentieren, und die 85 filtern"
Hab ich
Na das ist schön, daann ist Dein Problem ja gelöst.
Gruß Joachim
Meine Zeile im Filelog sieht im Moment so aus
#FileLog 4:Heizung_Ruecklauf.temperature\x3a:15:
-------------------
#FileLog 4:T\x3a|temperature..(?!85):0:
Habe ich auch so am laufen.
--------------------
Wie müsste ich das jetzt konkret anpassen? Ich blick das echt noch nicht!?!
So sollte das funktionieren:
#FileLog 4:Heizung_Ruecklauf.temperature\x3a.(?!85):15:
Der originale Matchausdruck erlaubt beliebige Zeichen nach dem Doppelpunkt (\x3a) - wir wollen alles bis auf " 85" matchen. Der "." ist für das Freizeichen - die "(?!85)" schließt den Wert 85 aus - der Rest geht komplett durch. Leider läßt sich dieser Ausdruck nicht im Webinterface eintragen Du musst die Plotdatei direkt per Hand anpassen.
Bin erst jetzt dazu gekommen, das auszuprobieren. Danke, das funktioniert wie gewünscht!
Hallo,
trotz Lösung noch eine Bemerkung: ich habe diese "seltsamen" Ausreisser bei den Messwerten meiner Heizung ebenfalls und bin mir fast sicher, dass es sich um Kalibrier-Werte handelt.
Gruß
Blueberry63
85 grad ist der wert den der 1wire sensor als fehler wer zurück gibt. es bedeute ziemlich sicher das du irgendein problem auf dem 1wire bus hast.
gruss
andre
Ja, das das auf irgendein Problem auf dem bus hindeutet, das ist mit klar. Nun muss man aber auch sagen, dass so ein arduino ohne weitere Bauteile auch nicht so der hyperdupersuper Busmaster ist. Es ist eine günstig und einfach Lösung.
Von daher kann ich grundsätzlich damit leben, wenn ich zweimal am Tag diesen wert bekomme. Was ich störender Funde, ist, das owtherm ab dem 5. error das Intervall auf 9999 setzt. Das wurde ich gerne konfigurieren können...
Hallo!
Wie würde der Befehl lauten wenn ich nicht einen fixen Wert "85" sondern enen bereich möchte. z.B. "60-200"
lg
Wolfgang
Muss mich hier auch nochmal anhängen.
Ich kriege es ums Verrecken nicht hin einen Bereich zu filtern.
Vielleicht kann nochmal jemand erläutern was dieses (?!85) bedeutet und warum ein (?!<-25) nicht funktioniert.
Ich würde gerne für ein Thermostat, was ab und zu dumme Werte liefert gerne den Temperaturbereich festlegen.
Leider habe ich auch in anderen Themen dazu nichts gefunden, auch genrerelle Infos zum Regex hilft mir da nicht.
Danke vorab an den, der Licht reinbringen könnte.
Gruss
killah78
Für was brauchst du es denn? FileLog oder Reading?
Du könntest es mit einem userReading probieren.
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
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.
Niemand ne Idee??
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
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
Besteht auch irgendwie die Möglichkeit die "Ausreisser" komplett zu ignorieren, also direkt als reading zu ignorieren?
Ja, mit dem Attribut "suppressReading" und entsprechend gesetztem Regex.
Gruß
Dan
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?
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
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...
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
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
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) }
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
Hi Rob,
natürlich, beiliegend die Fotos. (Bitte Post löschen falls nicht erwünscht an dieser Stelle).
Der Sensor passt genau in ein Kabelleerrohr und zufälligerweise genau durch den Zisternendeckel.
Die Zisterne ist 2,60m tief bis Oberkante. Da das Wasser allerdings nur bis max 1,50 steigen kann, hängt das Leerrohr somit exakt 1m unter dem Deckel mittig im Schacht. (Besser wäre 90cm gewesen, da der Sensor ab 20cm nicht messen kann - wusste ich jedoch bei Installation noch nicht)
Die Platine habe ich in eine normale Verteilerdose untergebracht und mit einem 15m Cat7 Kabel bis zum ESP in der Garage verlängert.
Funktionierte am Anfang erstaunlich exakt, d.h. eine Toilettenspülung wurde mir in FHEM mit +-1Liter angezeigt. Mittlerweile schwanken die Wert ein wenig, bzw. liefert der Sensor jetzt öfters mal 0.0. Im großen und ganzen reicht das aber, da ich nur den Füllstand +-5% wissen möchte. Kosten für alles unter 20€ :)
Im Plot kann man gut erkennen, dass ab dem 5.8. die Werte etwas unruhiger geworden sind.. Warum weiß ich noch nicht.
Viele Grüße
huhu
Schaut klasse aus 8) Danke für Deine Mühe
VG
rob