Hi zusammen,
ich hab ein kleines "Problem". Ich möchte die desiredTemperature meines MAX!-Heizkörperthermostats loggen und plotten.
Funktioniert soweit auch ganz gut, nur leider hat das Reading nicht nur numerische Werte, sondern auch "eco" und "boost", ist aber auch mal komplett leer:
2018-02-13_16:08:33 22.0
2018-02-13_16:12:45 22.0
2018-02-13_16:14:13
2018-02-13_16:14:13 boost
2018-02-13_16:27:56 eco
2018-02-13_16:28:04 18.0
Dies hat zur Folge, dass der Plot an der Stelle auf 0 runtergeht (Siehe Screenshot, gelbe Linie "SollTemperatur"). Desweiteren müllt es mir das Log mit folgendem zu:
2018.02.13 19:39:15 1: PERL WARNING: Argument "eco" isn't numeric in numeric gt (>) at ./FHEM/98_SVG.pm line 1566.
2018.02.13 19:39:15 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at ./FHEM/98_SVG.pm line 1566.
2018.02.13 19:39:15 1: PERL WARNING: Argument "boost" isn't numeric in numeric gt (>) at ./FHEM/98_SVG.pm line 1566.
Jetzt dachte ich, ich filter diese 3 Möglichkeiten einfach raus. Ich benutze DBLogging mit der Einstellung DbLogType: History und dachte daher an sowas:
WZ.Heizung:desiredTemperature:::$val=~s/(?!d)//g
oder
WZ.Heizung:desiredTemperature:::$val=~(?!d)
Ich hab zig Kombinationen ausprobiert, diverse Klammern, "" und '' gesetzt, Google und die Forensuche bemüht, hab aber leider bisher keinen Erfolg erzielen können. Entweder war die Linie komplett auf 0, oder es sieht aus wie im Screenshot.
Was für Möglichkeiten habe ich jetzt? Ein userreading? Wie müsste sowas aussehen? Oder gibt es da eine Filtermöglichkeit bei SVG? Kann ich bestimmte Werte ignorieren? Irgendwie seh ich grade den Wald vor lauter Bäumen nicht...
Ich dachte auch gleich an ein userReading. Könnte so ausehen.
attr WZ.Heizung userReadings filteredTemp {my $r=ReadingsVal("WZ.Heizung","desiredTemperature",""); $r=~/^\d/ ? $r : ReadingsVal("WZ.Heizung","filteredTemp","") }
Perfekt, hat sofort funktioniert :)
Vielen Dank! :)
Ich würde die fehlerhaften Datensätze schon vom Loggen ausnehmen. Du verwendest DBlog, schau dir mal das DBLog-Attribut "valueFn" und IGNORE=1 im selben Zusammenhang an. Damit kannst du Werte ändern bevor diese in dei DB kommen (eco = xxx Grad, boost = xxx Grad), oder Sätze ignorieren.
Das hat den Vorteil, dass du das in einem Aufwasch für alle MAX-Thermostate machst, und nicht überall ein Userreading füttern musst.
Hmmm, das klingt sogar noch besser. Das schau ich mir mal an, vielen Dank! :)