Korrektur eines Messwertes Temp/Hum Sensors

Begonnen von Zündi, 18 März 2014, 15:18:56

Vorheriges Thema - Nächstes Thema

Zündi

Hi,

habe mir eine defekte Oregon RAR 501 (Basis defekt) mit drei Sensoren (auf die ich scharf war) zugelegt. Leider tanzt einer gehörig aus der Reihe und zeigt ordentlich zu viel an (3,5 C)
Hat jemand eine Idee, wie ich den Wert im FHEM korrigieren kann, so dass er mir im Plotfile korrekt angezeigt wird?
Leider gibts kein Attribut zum korrigieren.

Bei dem verkorkstem Sensor handelt es sich um einen THGR122NX.
Da ich mehr da Hardware-Typ bin, und mich erst so langsam in die Programmierwelt einlerne, benötige ich Hilfe...

Zur Zeit ist der so definiert:

Zitatdefine THGR228N_2 TRX_WEATHER THGR228N_2
attr THGR228N_2 IODev TRX_0
attr THGR228N_2 alias 2
attr THGR228N_2 room TRX_WEATHER
define FileLog_THGR228N_2 FileLog ./log/THGR228N_2-%Y.log THGR228N_2
attr FileLog_THGR228N_2 logtype temp4hum4:Temp/Hum,text
attr FileLog_THGR228N_2 room TRX_WEATHER
define SVG_THGR228N_2 SVG FileLog_THGR228N_2:temp4hum4:CURRENT
attr SVG_THGR228N_2 label "THGR228N_2 Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr SVG_THGR228N_2 room Plots

Danke im Voraus für Eure Antworten!

Joachim

FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

Zündi

Danke für die schnelle Antwort, aber die hilft mir (wie oben geschrieben) in Ermangelung von Programmierkenntnissen nicht wirklich weiter... :o
So den einen oder anderen Hinweis benötige ich schon...  :-[

marvin78

Der neue Hinweis lautet: commandref ;) Dort ist UserReading ausführlich beschrieben.

Zündi

Ja, danke. Da war ich schon drüber gestolpert, da ich nach offset gesucht hatte...
Nur bin ich offensichtlich zu blöd, um zu erkennen, wie ich mit den vorhanden Korrekturmöglichkeiten des userReadings so was einfach hinbekomme, wie von einem Messwerten einen Konstanten Wert zu subtrahieren. Leider... :(

userReadings
Komma getrennte Liste von benutzerdefinierten Readings. Jede Definition hat folgendes Format:

    <reading>[:<trigger>] [<modifier>] { <perl code> }

Diese benutzerdefinierte Readings werden bei jeder Aktualisierung der Gerätereadings gesetzt, indem das spezifizierte perl code { <perl code> } ausgeführt wird, und dessen Wert dem Reading zugewiesen wird. Falls <trigger> spezifiziert ist, dann findet diese Ausführung nur dann statt, falls einer der aktualisierten Readings dem regexp <trigger> entspricht (matched).
Beispiele:

    attr myEnergyMeter userReadings energy { ReadingsVal("myEnergyMeter","counters.A",0)/1250.0;; }
    attr myMultiMeter userReadings energy1:counters.A {ReadingsVal("myMultiMeter","counters.A",0)/1250.0}, energy2:counters.B {ReadingsVal("myMultiMeter","counters.B",0)/1250.0}

<modifier> kann die folgenden Werte haben:

    none: als ob man es gar nicht spezifiziert hätte.
    difference: das Reading wird auf die Differenz zw. dem aktuellen und dem vorherigen Wert gesetzt.
    differential: das Reading wird auf die Differenz zw. dem aktuellen und dem vorherigen Wert, geteilt durch die Sekunden zw. der aktuellen Zeit und der letzten Auswertung, sekundengenau. Kein Wert wird berechnet, falls der Unterschied unter eine Sekunde liegt.
    offset: wenn der aktuellen Wert kleiner als der vorherige Wert ist wird der vorherige Wert zum Reading addiert. Das Reading kann dann als offset verwendet werden um einen Zähler der durch Sromverlust zurückgesetzt wird zu korrigieren.
    monotonic: wenn die Differenz zw. dem aktuellen und dem vorherigen Wert positiv ist wird diese Differenz zum Reading addiert. Damit lässt sich von einem Zähler der bei Stromverlust zurückgesetzt wird ein monoton wachsender Zähler ableiten.

Beispiel:

    attr myPowerMeter userReadings power differential { ReadingsVal("myPowerMeter","counters.A",0)/1250.0}

Achtung: Falls difference oder differential spezifiziert ist, dann werden für die Berechnung ältere Werte benötigt, d.h. der Wert wird frühestens beim zweiten Änderung gesetzt.

marvin78

attr THGR228N_2 userReadings realTemp:temperature { ReadingsVal("THGR228N_2 ","temperature",0)-3.5 }

Im Grunde stehe es aber alles in der Commandref.

Zündi

Hi marvin,

mag sein, setzt aber voraus, dass man Perl versteht.
ICH habe zumindestens nun verstanden, dass ich mich die nächste Zeit mal intensiv mit Perl auseinandersetzen muss.

Danke für den fertigen Codeschnipsel!  :)

Nur zum Verständnis, damit ich hier auch etwas draus lerne:
Ist realTemp eine Systemvariable (der Trigger) für den tatsächlichen Messwert oder frei gewählt?
Wenn es der Trigger ist, wie bekomme ich den Name der Variablen heraus?


marvin78

#7
Das hat mir Perl eigentlich fast nichts bis nichts zu tun. Commandref lesen hätte hier tatsächlich geholfen. Ein / (geteilt durch) durch ein - (Minus) zu ersetzen setzt kein Wissen in Perl voraus.

realTemp ist frei gewählt und ist dein neues Reading im Sensor. Steht aber auch alles in der Commandref. Ganz ohne Perl.

Der Trigger ist temperature und ist dein Temperatur-Reading aus dem Sensor welches den falschen Wert beinhaltet.

Zündi

Mhmm, funktioniert bloss nicht. Damit setzt er die RealTemp statisch auf -3,1 (entspricht der Abweichung)
siehe Link:

https://www.dropbox.com/s/huwoq83r6co5wpr/Screenshot%202014-03-18%2016.47.35.png

Zündi

Internals:
   CFGFN     
   CODE       THGR228N_2
   DEF        THGR228N_2
   IODev      TRX_0
   LASTInputDev TRX_0
   MSGCNT     355
   NAME       THGR228N_2
   NR         142942
   STATE      T: 24.3 H: 43 BAT: ok
   TRX_0_MSGCNT 355
   TRX_0_RAWMSG 0a52012b580200f32b0189
   TRX_0_TIME 2014-03-18 16:55:54
   TYPE       TRX_WEATHER
   Readings:
     2014-03-18 16:55:55   battery         ok
     2014-03-18 16:55:55   humidity        43
     2014-03-18 16:55:55   realTemp        -3.1
     2014-03-18 16:55:55   state           T: 24.3 H: 43 BAT: ok
     2014-03-18 16:55:55   temperature     24.3
Attributes:
   IODev      TRX_0
   alias      2
   event-min-interval 600
   event-on-change-reading state
   event-on-update-reading .*
   room       TRX_WEATHER
   userReadings realTemp:temperature { ReadingsVal("THGR228N_2 ","temperature",0)-3.1 }

marvin78

userReadings realTemp:temperature { ReadingsVal("THGR228N_2 ","temperature",0)-3.1 }

Da ist ein Leerzeichen zu viel (zugegegen aus meinen Code, der aber ja nur ein Pseudocode war):

userReadings realTemp:temperature { ReadingsVal("THGR228N_2","temperature",0)-3.1 }

Zündi

Du bist mein Held  ;)
Das wars, jetzt passt die Ausgabe!

Und ich hab wieder (ein bisschen) was dazu gelernt.

Puschel74

Hallo,

Screenshots bitte über die Forumsfunktion einbetten.
Nicht jeder will auf externen Hostern vorbei schauen  ;)
Danke.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

mcbuh

Ich hab dann noch eine Frage. Bekomme ich es jetzt noch irgendwie hin das Grad Celsius dahinter steht?