[geklärt] SVG+DBLog: plotReplace kann plotfunction nicht ersetzen

Begonnen von Beta-User, 01 November 2019, 06:35:32

Vorheriges Thema - Nächstes Thema

Beta-User

Hallo Rudi,

lt. commandref soll plotReplace plotfunction ersetzen. Leider funktioniert das nicht wie gewünscht, was auch immer man angibt, das abzufragende Device wird nicht in die DBLog-Abfrage übernommen, an anderen Stellen klappt das ohne weiteres.

Das Verhalten ist auch unabhängig davon, welche Variablennamen man im gplot-file angibt, ich habe u.A. "Device" versucht (im gplot-File sowohl als Ersatz für TL wie für SPEC1). Im Titel erscheint dann die Angabe des Device-Namens, in der DB-Abfrage (bei "show proprocessed ...") nicht, da ist an der betreffenden Stelle schlicht nichts (die abzufragenden Readings sind aber dann da).

Das Spiel kann man mit beliebigen Plots wiederholen.

Bitte um Rückmeldung, wenn mehr Details erforderlich wären.

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

rudolfkoenig

ZitatBitte um Rückmeldung, wenn mehr Details erforderlich wären.
Klar, etwas zum Nachstellen, oder wenigstens der Inhalt der .gplot Datei und Raw-Def der SVG.
Das Feature funktioniert prinzipiell, die Meldung "bei mir nicht" reicht nicht immer fuers erfolgreiche Raten.

Zitatin der DB-Abfrage (bei "show proprocessed ...") nicht,
Vielleicht funktioniert Raten doch: Zitat Commandref:
ZitatBei %Name% erfolgt die Ersetzung vor der Datenauswertung, das kann man verwenden, um Parameter für die Auswertung zu ersetzen.

Beta-User

Genau, es geht darum, Variablen vor der Auswertung zu ersetzen...
Das funktioniert leider nur in Teilen (nämlich hier mit "L1"), zum Nachstellen mal SYSMON-Daten usw.:

Datenlieferndes Device:
defmod Serverdaten SYSMON
attr Serverdaten DbLogInclude (cpu_freq|cpu0_temp|loadavg|cpu0_temp_avg):300,(ram|root|(fhem)?uptime):3600
attr Serverdaten room Steuerung->Allgemein
attr Serverdaten stateFormat Freq: cpu_freq MHz, Temp: cpu0_temp°C

setstate Serverdaten Freq: 798 MHz, Temp: 49.00°C
setstate Serverdaten 2019-11-01 12:16:23 cpu0_freq 798
setstate Serverdaten 2019-11-01 12:16:23 cpu0_freq_stat 787.00 1646.00 799.20
setstate Serverdaten 2019-11-01 12:16:23 cpu0_idle_stat 4.45 95.88 94.22
setstate Serverdaten 2019-11-01 12:16:23 cpu0_temp 49.00
setstate Serverdaten 2019-11-01 12:16:23 cpu0_temp_avg 49.1
setstate Serverdaten 2019-11-01 12:16:23 cpu0_temp_stat 47.62 58.50 49.09
[...]


gplot-file:
# SYSMON
#
# Anzeige verschiedener Statistiken aus SYSMON (DbLog)
#

set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<L1>'
set ytics
set grid ytics y2tics
set ylabel "Frequenz"
set y2label "Last + Temperatur"

#LogDB <SPEC1>:cpu0_temp:::
#LogDB <SPEC1>:cpu0_temp_avg:::
#LogDB <SPEC1>:cpu_freq:::
#LogDB <SPEC1>:loadavg:::$val=~s/([\d.]*).[\d.]*.[\d.]*/$1/eg
#LogDB <SPEC1>:loadavg:::$val=~s/[\d.]*.([\d.]*).[\d.]*/$1/eg
#LogDB <SPEC1>:loadavg:::$val=~s/[\d.]*.[\d.]*.([\d.]*)/$1/eg

plot \
   "<IN>" using 1:2 ls l0 axes x1y2 title 'Temp' lw 1 with lines \
   "<IN>" using 1:2 ls l1 axes x1y2 title 'Temp (avg)' lw 2 with lines \
   "<IN>" using 1:2 ls l2 axes x1y1 title 'MHz' lw 1 with lines \
   "< awk '/load avg:/ {print $1, $4}' <IN>" \
     using 1:2 ls l3 axes x1y2 title 'load 1 Min' lw 2 with lines \
   "< awk '/load avg5:/ {print $1, $4}' <IN>" \
     using 1:2 ls l4 axes x1y2 title 'load 5 Min' lw 1 with lines \
   "< awk '/load avg15:/ {print $1, $4}' <IN>" \
     using 1:2 ls l5 axes x1y2 title 'load 15 Min' lw 2 with lines

SVG-Definition:
defmod Serverstatus SVG LogDB:Serverstatus:HISTORY
attr Serverstatus plotReplace SPEC1=Serverdaten L1=Serverstatus
attr Serverstatus plotfunction Serverdaten

liefert als Antwort auf "Show proprocessed ...":
get LogDB HISTORY INT 2019-11-01_00:00:00 2019-11-01_23:59:59 Serverdaten:cpu0_temp::: Serverdaten:cpu0_temp_avg::: Serverdaten:cpu_freq::: Serverdaten:loadavg:::$val=~s/([\d.]*).[\d.]*.[\d.]*/$1/eg Serverdaten:loadavg:::$val=~s/[\d.]*.([\d.]*).[\d.]*/$1/eg Serverdaten:loadavg:::$val=~s/[\d.]*.[\d.]*.([\d.]*)/$1/eg

Löscht man das Attribut "plotfunction" (Merke: SPEC1 sollte nach meinem Verständnis weiter über plotReplace aufgelöst werden), erhält man nur noch:
get LogDB HISTORY INT 2019-11-01_00:00:00 2019-11-01_23:59:59 :cpu0_temp::: :cpu0_temp_avg::: :cpu_freq::: :loadavg:::$val=~s/([\d.]*).[\d.]*.[\d.]*/$1/eg :loadavg:::$val=~s/[\d.]*.([\d.]*).[\d.]*/$1/eg :loadavg:::$val=~s/[\d.]*.[\d.]*.([\d.]*)/$1/eg
Entsprechend sind auch in der Auswahl der Felder des plot-Editors die Vorgaben alle leer.

Das DBLog-Device heißt hier LogDB, es steckt eine (auf demselben Server laufende) MariaDB dahinter, das ganze auf Debian 10.1@x86, Perl 5.28.1.

Hoffe, das reicht zum Nachstellen?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

rudolfkoenig

ZitatHoffe, das reicht zum Nachstellen?
Ja, zeigt, dass ich vorhin richtig geraten habe :)

Man muss in der .gplot Datei <SPEC1> durch %SPEC1% ersetzen, wenn die Ersetzung _vor_ dem FileLog/DBLog get stattfinden soll.
<SPEC1> wird _nach_ dem get ersetzt, damit man in der Titelzeile Minimum/Maximum/etc verwenden kann.

Beta-User

Gut geraten, sorry für den Aufwand...

Irgendwie irritiert es mich, dass ich scheinbar der einzige bin, der den Text in der commandref nicht kapiert hat. Vorher nicht, und selbst nach dem Schubser fand/finde ich den Text nicht selbsterklärend. Der Zusammenhang mit der .gplot und den "%" ist weder im deutschen noch im englischen Text ganz eindeutig und im deutschen auch noch mit einem Absatz logisch abgekoppelt (nach meinem persönlichen Empfinden).

Eventuell hätte ich das so besser verstanden:
ZitatIn the .gplot file <key> and %key% will be replaced with the corresponding value. The evaluation of <key> and {} takes place after the input file is processed, so $data{min1} etc can be used. %key% will be repaced before the input file is processed, this expression can be used to replace parameters for the input processing.
Oder wenn eines der .gplot-Beispiele die Schreibweise %SPEC1% enthalten hätte (ich habe aber nur ein paar durchgesehen, u.a. auch die Sysmon-.gplots, oder die Suche hier (nach plotReplace) was ergeben.

Na ja, jetzt ist mir jedenfalls klar, wie es geht ;D .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

rudolfkoenig


Beta-User

Thx.

Weiß nicht, ob es Sinn macht, die vorhandenen gplot-Definitionen mal diesbezüglich durchzusehen (v.a. die SM_DB-Beispiele) und/oder weitere gplot-Beispiele einzufügen.

Hier jedenfalls mal mein aktualisierter .gplot für RT-DN mit zusätzlicher (optionaler) Anzeige der Außentemperatur:
# Created by FHEM/98_SVG.pm, 2019-11-03 15:07:40
# to replace variables, use plotReplace like
# attr SVG_Thermostat plotReplace SPEC1=Thermostat TL="My example thermostat" EXTERNALTEMPDEVICE=MYSENSOR_97 EXTERNALTEMPREADING=temperature2

set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<TL>'
set ytics
set y2tics
set grid
set ylabel "Valve"
set y2label "Temperature"
set yrange [-10:110]

#LogDB %SPEC1%:desired-temp::
#LogDB %SPEC1%:measured-temp:0:
#LogDB %EXTERNALTEMPDEVICE%:%EXTERNALTEMPREADING%::
#LogDB %SPEC1%:actuator:0:int

plot "<IN>" using 1:2 axes x1y2 title 'Desired' ls l0 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Measured' ls l1 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Outside' ls l2 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Valve' ls l3 lw 1 with histeps

Wäre der "Konkurrent" für das hm-rt-gplot-file...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Beta-User

Nachtrag:

Hier mal eine "generalisierter plotReplace"-gplot-File samt screeenshot dazu, zeigt die RT-DN-Daten (measured, desired und valve) an sowie Temp und Hum von je einem beliebigen Sensor und zwei Fenster.

Könnte man evtl. noch optimieren, wenn man die Fenster irgendwie in den (dreidimensionalen) Hintergrund bringen könnte und dasselbe mit den externen Sensoren macht, aber dazu hätte ich dann zu lange irgendwelche schwer auffindbaren Handbücher konsultieren müssen...

# Created by FHEM/98_SVG.pm, 2020-01-06
# to replace variables, use plotReplace like
# attr SVG_Thermostat plotReplace SPEC1=Thermostat TL="My example thermostat" EXTERNALTEMPDEVICE=MYSENSOR_97 EXTERNALTEMPREADING=temperature2 \
# ROOMHUMIDITYDEVICE=HUEDevice3 EXTERNALHUMIDITYREADING=humidity ROOMTEMPDEVICE=HUEDevice4 ROOMTEMPREADING=temperature WINDOW1=Window1_MyRoom WINDOW2=Window2_MyRoom

set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<TL>'
set ytics
set y2tics
set grid
set ylabel "Valve/Window"
set y2label "Temperature"
set yrange [-5:105]
set y2range [-15:35]
set isosample 20

#LogDB %SPEC1%:desired-temp::
#LogDB %SPEC1%:measured-temp:0:
#LogDB %EXTERNALTEMPDEVICE%:%EXTERNALTEMPREADING%::
#LogDB %SPEC1%:actuator:0:int
#LogDB %ROOMHUMIDITYDEVICE%:%EXTERNALHUMIDITYREADING%:0:
#LogDB %ROOMTEMPDEVICE%:%ROOMTEMPREADING%:0:
#LogDB %WINDOW1%:state:::$val=~s/(open|closed|tilted)(\d*).*/$1eq"open"?60:$1eq"tilted"?45:0/eg
#LogDB %WINDOW2%:state:::$val=~s/(open|closed|tilted)(\d*).*/$1eq"open"?60:$1eq"tilted"?45:0/eg


plot "<IN>" using 1:2 axes x1y2 title 'Desired' ls l0 lw 1 with lines,\
     "<IN>" using 2:2 axes x1y2 title 'Measured actuator' ls l7 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Aussen' ls l1 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 y2title 'Valve' ls l5 lw 1 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Humidity' ls l2 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Measured roomsensor' ls l3 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 y2title '%WINDOW1%' ls l4fill lw 0.5 with steps,\
     "<IN>" using 1:2 axes x1y1 y2title '%WINDOW2%' ls l5fill lw 0.5 with steps
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

OdfFhem

Wenn Beta-User ein neues Thema aufmacht, lohnt es nicht selten mitzulesen; so auch hier. Die Anregungen zur Vereinheitlichung von gplot-Dateien "nötigten" mich dazu, das Attribut plotReplace noch ein wenig umfangreicher einzusetzen. Die %%-Theorie war neu für mich, die <>-Theorie wurde eigentlich schon flächendeckend eingesetzt. Im Endeffekt ist die Zahl der gplot-Dateien nun drastisch zurückgegangen - sehr schön.


ABER ich habe auch noch einen kleinen Dorn im Auge, der vielleicht entfernt werden könnte ...


Momentan habe ich in etlichen plotReplace-Attributen u.a. folgenden Platzhalter definiert:

V1={"Min $data{min1}, Max $data{max1}, Last $data{currval1}"}

In der gplot-Datei steht das passende Gegenstück:

set title 'Steckdose (<Alias>) --- Power (W):<V1>'

Funktioniert wie erwartet und die Darstellung stimmt - also erstmal kein Problem.

Bei der Definition des Platzhalters fällt aber auf, dass dort eigentlich keine gerätespezifische Komponente enthalten ist. Bedeutet indirekt, dass in jedem plotReplace eine eigentlich überflussige Platzhalter-Definition enthalten ist.


Jetzt kann es natürlich sein, dass es dafür schon eine - vielleicht sogar naheliegende - Lösung gibt; gefunden habe ich aber bislang keine.


Daher hatte ich einfach mal die Platzhalter-Definition ignoriert und folgende Varianten in der gplot-Datei ausprobiert:


#set title 'Steckdose (<Alias>) --- Power (W):{"Min $data{min1}, Max $data{max1}, Last $data{currval1}"}'

Da hatte ich sowieso nicht viel Hoffnung und so war es dann auch - es findet keine Auswertung statt.


set title {'Steckdose (<Alias>) --- Power (W):Min $data{min1}, Max $data{max1}, Last $data{currval1}'}

Hier war ich ja schon fast euphorisch und dachte, dass könnte/müsste doch eigentlich klappen, tat es dann aber doch nicht.


Jetzt stellt sich mir die Frage, ob man nicht folgende Theorie umsetzen könnte:
1) %%-Platzhalter werden vor der Extraktion ersetzt - nichts Neues, erfordert also keine Moduländerung
2) <>-Platzhalter werden nach der Extraktion ersetzt - nichts Neues, erfordert also keine Moduländerung
3) Ein sich ergebender Wert, der nach all den vorangehenden Ersetzungen vollständig von {} umschlossen wird, wird abschließend noch als Perl-Ausdruck ausgewertet.

Inhalt der gplot-Datei:

set title {'Steckdose (<Alias>) --- Power (W):Min $data{min1}, Max $data{max1}, Last $data{currval1}'}

Ersetzung der %%-Platzhalter im ersten Schritt sorgt für keine Veränderung. Deren Verwendung macht in diesem Fall eigentlich auch keinen Sinn, denn entweder enthält eine gplot-Zeile nur %%- oder nur <>-Platzhalter.
Ersetzung der <>-Platzhalter im zweiten Schritt hingegen sorgt für folgende Veränderung:

set title {'Steckdose (IrgendeinAliasWert) --- Power (W):Min $data{min1}, Max $data{max1}, Last $data{currval1}'}

Der Wert ist nun vollständig ersetzt, wird aber noch von {} umschlossen. Also würde dieser Wert abschließend noch als perl-Ausdruck ausgewertet. Es ergibt sich beispielhaft:

set title {'Steckdose (<Alias>) --- Power (W):Min 000000, Max 999999, Last 123456'}



Bleibt also die Frage, ist die Idee umsetzbar (oder gibt es vielleicht schon eine Lösung für das geschilderte "Problem")?

Beta-User

Vorab mal Danke für die Rückmeldung :) !

Ich habe das jetzt nicht im Detail nachvollzogen (das mit dem Perl in plotReplace war mir bisher entgangen), aber eine Idee... Kann es sein, dass die einfachen Quotes mit das Problem sind?

Als kurzen Test:
set title {"Steckdose (<Alias>) --- Power (W):Min $data{min1}, Max $data{max1}, Last $data{currval1}"}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

OdfFhem

Guter Hinweis, aber ...

Bei den einfachen steht nachher als Titel

{Steckdose (Lichterbogen) --- Power (W):Min $data{min1}, Max $data{max1}, Last $data{currval1}}


Bei den doppelten steht nachher als Titel

{"Steckdose (Lichterbogen) --- Power (W):Min $data{min1}, Max $data{max1}, Last $data{currval1}"}

rudolfkoenig

Ich verstehe das Problem, bin aber z.Zt noch nicht geneigt (angesichts der Schwere der Nachteile), den Code zu erweitern. :)

Beta-User

@OdfFhem:
Ist das ein filelog-plot?

Es würde evtl. Sinn machen, den/die Wiki-Artikel noch etwas aufzubohren. Hab's nur kurz überflogen, aber insbesondere https://wiki.fhem.de/wiki/SVG ist ziemlich "dürr", vielleicht könnten wir das mit einigen wenigen Beispielen etwas "aufhübschen". Dann würden andere, die sowas interessiert nicht so ganz im Dunkeln tappen, wenn die nicht zufällig hier mitlesen...?
(Aber mit DBLog-Beispielen finde ich das nur begrenzt tauglich...).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

OdfFhem

@Beta-User

Ja, sind reine FileLog-Fälle ... eigentlich ideal fürs Wiki ...


@rudolfkoenig
Ich bin zumindest ein wenig verwirrt, denn ich hatte hier eigentlich gar keine Nachteile erwartet; es ist ja eigentlich "nur" ein zusätzlicher Schritt beim <>-Ersetzen. Ohne dass ich die Beurteilung der Lage anzweifle, würde es mich doch mal interessieren, welche schweren Nachteile dabei entstehen könnten?

rudolfkoenig

Noch mehr Code, Dokumentation, Test, Support.
Es waere vmtl. von allem nicht uebertrieben viel, aber mit plotReplace gibt es bereits eine Loesung.