DS18B20 - falsche Werte ausfiltern

Begonnen von Shuzz, 18 November 2016, 22:16:41

Vorheriges Thema - Nächstes Thema

Shuzz

Hallo zusammen!

Mein erster Post hier, bitte gebt mir Bescheid falls das hier der verkehrte Bereich ist.

Ich betreibe seit kurzem FHEM auf einem Raspberry Pi und steuere damit relativ erfolgreich meine Heirkörper an, derzeit per MAXLAN, demnächst per CUL.
Ich befinde mich derzeit in der Experimentierphase, d.h. ich probiere vieles aus und versuche rauszufinden wohin die Reise gehen wird.

Im Zuge dieser Experimente habe ich mir mal ein paar DS18B20 zugelegt und einen davon mal fix an den GPIO Port des RasPi angeschlossen.
Der DS18B20 ist über zwei Adern mit Pullup angeschlossen (parasitäre Speisung), die Kabellänge von Raspi bis Sensor beträgt in etwa 2-3m.
Funktionierte auf Anhieb, es werden nun minütlich die aktuellen Temperaturwerte in ein Logfile geschrieben (sofern sie sich ändern, event-on-change-reading).

Das Ganze wird in einem Plot ausgegeben. Soweit so gut.

Nun schleichen sich aber in unterschiedlichen Zeitabständen offenbar falsche Meßwerte ein. Jedenfalls bin ich mir sicher, dass die Außentemperatur hier nicht zwischendrin kurzfristig auf über 80°C hochschnellt... :D

Nun die Frage: Woran kann es liegen, dass ich diese Unsinnswerte erhalte?
Alternativ: Wie kann ich verhindern, dass diese Ausreißer ins Logfile geschrieben werden und mir meinen schönen Plot "verschandeln"? Bzw. die Werte vor/bei dem Plotten ausfiltern?


Schonmal vielen Dank und beste Grüße,

Shuzz

Edit: Nachtrag - die Kernelmodule wurden selbstverständlich mit pullup=1 geladen, also eigentlich alles nach Vorschrift. Pullup ist 4K7.

fiedel

Hallo Shuzz und herzlich willkommen im Forum!

Das ist nur eine Fehlermeldung und sagt dir, dass es noch Probleme mit dem Bus gibt (oft Verkabelung, Stromversorgung). Suche am Besten im Forum und auch im Netz nach "DS18B20 85°C".

Um Ausreißer bei einem Füllstandssensor auszufiltern habe ich das hier gestrickt:

##################################################
# Zisterne Filter und Faktor für Füllstand in m³:#
##################################################
sub tek603_filter($) {

  my ($tek603_name) = @_;
  my $lev = ReadingsNum("$tek603_name","RemainingUsableLevel",0);
  my $cap = ReadingsNum("$tek603_name","TotalUsableCapacity",0);
 
if (($lev - 300) <= $cap) {
return $lev*0.001
}
}


Nur für den Fall, dass du lieber kaschierst, als Fehler zu suchen...  ;)

Gruß
Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

Shuzz

Hi fiedel,

ja, dass es ne Fehlermeldung ist habe ich heute Nacht auch noch irgendwann rausbekommen... :D
Parasitäre Speisung und RaspberryPi vertragen sich anscheinend nicht so richtig (obwohl die allermeisten Messungen problemlos funktionieren). Schade, wäre schon schick gewesen.
Naja, war ja erstmal nur ein Test. Ich werde mal ein bissl mit dem Pullup spielen und hoffen, dass es reicht. Falls nicht muss ich zukünftig halt mit ner Ader mehr verkabeln.

Für den Moment bleibe ich aber bei 2 Drähten und würde gern versuchen, den Code mal einzusetzen.
Die Frage ist nun: Wie setze ich Deine Routine ein?
Verstanden habe ich den Code, aber wie triggere ich ihn? Über ein Notify und ein Dummy-Device mit FileLog?

Sorry, bin halt noch ein FHEM-Neuling.

Shuzz

#3
Habe jetzt einen Dummy (DS_Dummy) angelegt und dazu ein Notify, aber es tut nich so wie erhofft:


define GPIO4_DS18B20_04168125dbff GPIO4 28-04168125dbff
attr GPIO4_DS18B20_04168125dbff event-on-update-reading temperature
attr GPIO4_DS18B20_04168125dbff model DS18B20

define DS_Dummy dummy

define n_DS18B20_Dummy notify GPIO4_DS18B20_04168125dbff.temperature {\
  my $tempVal = ReadingsNum("GPIO4_DS18B20_04168125dbff","temperature",0);;\
  if($tempVal < 80){\
    fhem "set DS_Dummy $tempVal";;\
  }\
}

attr GPIO4_DS18B20_04168125dbff room GPIO4
attr DS_Dummy room GPIO4
attr n_DS18B20_Dummy room GPIO4


Genau genommen tut es genau gar nix... ^^

EDIT: OK, Problem gelöst: Die Regex war verkehrt, da hat nach dem "temperature" noch das ":.*" gefehlt... ;)

fiedel

So kann man es natürlich auch machen. Ich habe zu dem Sensor ein userReading hinzugefügt:
content {tek603_filter($name)}
Die kleine Routine kommt in die 99_myUtils. Dieses Reading könnte dann noch per stateFormat auf den STATE gelegt werden. Bei mir landet es dagegen in einem readingsProxy.
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

Wzut

Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Shuzz

Danke für die weiteren Antworten. :)

Derzeit habe ich das (etwas umständliche) Notify durch ein DOIF ersetzt und das funktioniert wunderbar.

Wie gesagt ist das alles derzeit noch Testbetrieb, in der fertigen Installation nach dem Umzug Mitte 2017 werde ich einfach 3 Leiter verwenden und das Problem dadurch lösen.