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!
userereading ist dein Freund
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... :-[
Der neue Hinweis lautet: commandref ;) Dort ist UserReading ausführlich beschrieben.
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.
attr THGR228N_2 userReadings realTemp:temperature { ReadingsVal("THGR228N_2 ","temperature",0)-3.5 }
Im Grunde stehe es aber alles in der Commandref.
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?
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.
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 (https://www.dropbox.com/s/huwoq83r6co5wpr/Screenshot%202014-03-18%2016.47.35.png)
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 }
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 }
Du bist mein Held ;)
Das wars, jetzt passt die Ausgabe!
Und ich hab wieder (ein bisschen) was dazu gelernt.
Hallo,
Screenshots bitte über die Forumsfunktion einbetten.
Nicht jeder will auf externen Hostern vorbei schauen ;)
Danke.
Grüße
Ich hab dann noch eine Frage. Bekomme ich es jetzt noch irgendwie hin das Grad Celsius dahinter steht?