SVG-Plots von FileLog auf DbLog umstellen

Aus FHEMWiki
Version vom 20. September 2021, 14:14 Uhr von Ph1959de (Diskussion | Beiträge) (Störenden whitespace entfernt)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Grundsätzlich verhält sich DbLog bei der Verwendung in SVG-Plots sehr ähnlich wie ein FileLog. So kann ein neuer Plot auf DbLog-Daten in der FHEM-Oberfläche genauso angelegt werden wie beim FileLog, indem man an der Definition des DbLog Devices auf "Create SVG plot from DbLog" klickt. Wenn man von FileLog auf DbLog umstellt, möchte man aber evtl. nur die Definitionen der SVG-Plots anpassen. Hier einige Anmerkungen dazu.

Define

Info green.pngDas Arbeiten mit dem plot-Editor ist ausreichend für einfache Plots aus vorhandenen Daten. Müssen diese noch "vorverarbeitet" werden, z.B. open/closed auf 1/0 umgestellt werden, muß die gplot-Datei direkt editiert werden, z.B. per Edit files. Eine so geänderte gplot-Datei wird allerdings beim klick auf Write .gplot file im plot-Editor wieder überschrieben! Deshalb könnte man den plot-Edior benützen, um einen Plot erstmalig zu erstellen mit der Auswahl der benötigten Quelldaten, Farben etc, alles weitere dann über Edit files und den Plot-Editor nur noch zur Kontrolle verwenden. Wer noch keine Erfahrungen mit .gplot-Dateien hat, findet weitere Informatione bei gnuplot-syntax und SVG.

Eine bestehende FileLog Definition für ein Thermostat könnte z.B. so aussehen:

define FileLog_W_HEIZUNG FileLog ./log/W_HEIZUNG-%Y.log W_HEIZUNG
attr FileLog_W_HEIZUNG logtype text
attr FileLog_W_HEIZUNG room hidden

define SVG_FileLog_W_HEIZUNG_1 SVG FileLog_W_HEIZUNG:SVG_FileLog_W_HEIZUNG_1:CURRENT
attr SVG_FileLog_W_HEIZUNG_1 room hidden

Bei Umstellung auf DbLog kann das FileLog-Device natürlich gelöscht werden, nachdem es durch ein allgemeines DbLog-Device ersetzt worden ist (siehe DbLog). Die Definition des Plots wird danach folgendermassen geändert:

define DBLOG DbLog mydb.conf .*:.*

define SVG_W_HEIZUNG_1 SVG DBLOG:SVG_DBLOG_W_HEIZUNG_1:CURRENT
attr SVG_W_HEIZUNG_1 room hidden

Mit dieser Anweisung wird ein SVG-Plot mit Namen SVG_W_HEIZUNG_1 (der Name muss natürlich nicht geändert werden, soviel Zeit sollte man sich allerdings nehmen) angelegt, der seine Daten vom DbLog-Device DBLOG bezieht und mit Hilfe der Gplot-Datei SVG_DBLOG_W_HEIZUNG_1.gplot (auch dieser Name muss nicht zwingend geändert werden) rendert.

Gplot-Datei

Die bestehende Gplot-Datei SVG_FileLog_W_HEIZUNG_1.gplot (im Verzeichnis www/gplot) wird zunächst nach SVG_DBLOG_W_HEIZUNG_1.gplot kopiert. Sie kann gelöscht werden, wenn die Umstellung zufrieden stellend abgeschlossen ist. Geändert werden müssen nur die Zeilen, die mit #FileLog beginnen:

#FileLog 4:W_HEIZUNG.temperature\x3a:0:
#FileLog 4:W_HEIZUNG.desiredTemperature:0:
#FileLog 4:W_HEIZUNG.valveposition\x3a:0:

Daraus wird:

#DbLog W_HEIZUNG:temperature:0:
#DbLog W_HEIZUNG:desiredTemperature:0:
#DbLog W_HEIZUNG:valveposition:0:

#FileLog wird durch #DbLog ersetzt. Die Angabe der Feldnummer vor dem Device (hier: "4") fällt weg, ebenso evtl. notierte Sonderzeichen am Ende der Readings-Bezeichnung (hier "\x3a"). Ansonsten bleibt der Inhalt der Gplot-Datei gleich.

@fld

Ein Sonderfall in der Notation liegt in der Verwendung von Mappings mit Hilfe des @fld-Arrays (siehe auch Creating Plots). Da es dieses Array in der Form in DbLogs nicht gibt, muss auf eine Zuweisung der Variable $val umgestellt werden. Lautet die Anweisung bei Verwendung von FileLog zB:

#FileLog 3:W_FENSTER:onoff::$fld[2]=~"1"?24:-10

muss sie für DbLog folgendermassen geändert werden:

#DbLog W_FENSTER:onoff:::$val=($val=~'1'?24:-10)

Insbesondere ist auch der zusätzliche Doppelpunkt vor der Anweisung zu beachten (Grund ist mir leider nicht bekannt, bitte ergänzen!).

Falls on/off-Werte geloggt werden sollen, muss der Code wie folgt lauten:

.gplot-File:

#DbLog HMW02.O05_4k7:state:::$val=($val=~"on"?10:1)

SVG-Editor:

RE_TEMP_BRT:temperature:::$val=$val/10

Um auch noch dim-Werte abzufangen und mit dem entsprechenden Value zu loggen, bietet sich folgendes an:

#DbLog Stellantrieb_Buero:state:::$val=~s/(on|off)(\d*).*/$1eq"on"?1:($1eq"dim"?$2*0.01:0)/eg

Bei Logeinträgen die aus mehreren Werten bestehen, muss der richtige Wert über eine Perl Expression extrahiert und der Variablen $val zugewiesen werden. Hierbei sind im replace Teil der Expression auch arithmetische Operationen möglich. Um z.B. aus dem Log des eState Readings eines HomeMatic Schaltaktors mit Leistungsmessung (HM-ES-PMSw1-Pl) den Strom in Ampere darzustellen, muss dieser erst extrahiert und dann von mA in A umgerechnet werden. Die Logzeile sieht Beispielsweise so aus:

2018-04-28_00:00:35 E: 24019.7 P: 0.82 I: 150 U: 234

Mit filelog konnte der Wert über den Eintrag

#FileLog 4:UG_WK_Waschmaschine_Pwr.eState\x3a::$fld[6]/1000

extrahiert und durch 1000 geteilt werden. Mit DbLog muss stattdessen eine Regular Expression mit arithmetischem Ausdruck im Zuweisungsteil verwendet werden:

#logdb UG_WK_Waschmaschine_Pwr:eState:::$val=~s/.*I:\s([-\.\d]+).*/$1\/1000/eg

Mit ähnlichen Ausdrücken ist z.B. auch eine Umsetzung von zwei Wertebereichen auf 1/0 Werte für einen Plot, der on/off darstellen soll, möglich. Um z.B. bei Werten unter 250mA eine 0 (off) und über 250mA eine 1 (on) zurück zu liefern, kann dieser Ausdruck verwendet werden:

#logdb UG_WK_Waschmaschine_Pwr:eState:::$val=~s/.*I:\s([-\.\d]+).*/$1<250?0:1/eg

logProxy

#logProxy FileLog:FileLog_W_HEIZUNG:4:W_HEIZUNG.valveposition\x3a:0:

wird zu

#logProxy DbLog:DBLOG:W_HEIZUNG:valveposition:0:

Näheres dazu unter LogProxy.