SVG-Plots von FileLog auf DbLog umstellen

Aus FHEMWiki
Wechseln zu: Navigation, Suche

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

Eine bestehende FileLog Definition für ein Thermostat könnte zB 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.