SVG: Unterstützung für Templates, einstellbares gplot-Dir

Begonnen von Dr. Boris Neubert, 18 März 2017, 20:34:24

Vorheriges Thema - Nächstes Thema

Dr. Boris Neubert

Hallo,

bevor ich mir die Mühe mache, Patches zu erstellen, möchte ich zunächst hören, ob diese akzeptiert werden.

SVG

Es soll möglich sein, dieselbe Vorlage einer gplot-Datei für mehrere SVG-Geräte zu verwenden. Dazu erhält SVG ein neues Attribut template (oder einen anderen Namen). Das Attribut nimmt eine durch Leerzeichen getrennte Liste von <parameter>=<value>-Paaren auf. Taucht in der gplot-Datei dann %<parameter>% auf, wird dieser String durch <value> ersetzt. Das ist nützlich, wenn alle Plots zu Heizungen, Temperaturfühlern, Bewegungsmeldern gleich aussehen sollen, und man nicht für jeden Plot eine gplot-Datei anlegen will. Der Plot-Editor wird gesperrt, wenn das Attribut gesetzt ist.

$FW_gplotdir

Diese Variable ist fest auf $FW_dir/gplot gesetzt. Sie soll künftig per Attribut gplotDir einstellbar sein. Das ermöglicht es, Installation der Software FHEM und Konfiguration voneinander zu trennen. Selbiges wäre auch für $FW_cssdir und $FW_icondir (nicht zu verwechseln mit der existierenden Einstellung für iconPath) sinnvoll.


Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

KernSani

Hi Boris,
bei SVGs gibt es das Attribut plotfunction. Damit kann man eine gplot Datei für beliebig viele plots verwenden...
Grüße,
Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Dr. Boris Neubert

Zitat von: KernSani am 18 März 2017, 21:24:26
bei SVGs gibt es das Attribut plotfunction. Damit kann man eine gplot Datei für beliebig viele plots verwenden...

Fast...

Meine aktuellen Anwendungsfälle sehen so aus:

3.dz.hzg.gplot
# Created by FHEM/98_SVG.pm, 2017-01-29 16:11:12                                                                                                     
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 nomirror                                                                                                                                   
set y2tics                                                                                                                                           
set grid y2tics                                                                                                                                       
set ylabel "Aktor / %"                                                                                                                               
set y2label "Temperatur / °C"                                                                                                                         
set yrange [0:99]                                                                                                                                     
                                                                                                                                                     
#3.dz.hzg.log 4:3.dz.hzg.measured-temp\x3a:0:                                                                                                         
#3.dz.hzg.log 4:3.dz.hzg.actuator\x3a:0:int

plot "<IN>" using 1:2 axes x1y2 title 'Temperatur' ls l0 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Actuator / %' ls l1 lw 1 with lines


waveform.gplot
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 'waveforms'
set ytics
set y2tics
set grid ytics y2tics
set ylabel "Voltage / V"
set y2label "Current / A"
set xrange [:]

#Node52_waves_proxy Func:logProxy_xyFile2Plot("%L/Node52_waves.log",4,"V_INST:")
#Node52_waves_proxy Func:logProxy_xyFile2Plot("%L/Node52_waves.log",4,"IA_INST:")
#Node52_waves_proxy Func:logProxy_xyFile2Plot("%L/Node52_waves.log",4,"IB_INST:")
#Node52_waves_trigger 4:Node52_ade.INSTready\x3a:0:

plot "<IN>" using 1:2 axes x1y2 title 'V' ls l0 lw 1 with quadraticSmooth,\
     "<IN>" using 1:2 axes x1y2 title 'IA' ls l1 lw 1 with quadraticSmooth,\
     "<IN>" using 1:2 axes x1y2 title 'IB' ls l2 lw 1 with quadraticSmooth,\
     "<IN>" using 1:2 axes x1y2 notitle ls l0 lw 1 with lines


Zu ersetzen wären die Strings 3.dz.hzg bzw. Node52. Wenn ich der Commandref glaube, muss ich aber eine #FileLog- oder #DbLog-Zeile haben. Das macht der aktuelle GPlot-Editor ja noch nicht einmal mehr.

Möglicherweise muss ich mir den Code zu plotfunction mal anschauen.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

KernSani

Ich bin kein gplot-Spezialist, aber letztendlich macht plotfunction nichts anderes als die Variablen <SPEC1>..<SPECn> im gplot file durch die in plotfunction angrgebenen Werte zu ersetzen. Das enspricht m. E. Ziemlich genau dem, was der template Befehl macht...
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

rudolfkoenig

ZitatDazu erhält SVG ein neues Attribut template (oder einen anderen Namen)

Grrr. Wir haben in 98_SVG.pm 3 Mechanismen, die eine Ersetzung durchfuehren (title, label und plotfunction), leider wird der Teil, was Boris benoetigt, nicht beruehrt. Ich habe jetzt ein plotReplace Attribut eingefuegt, was title, label und plotFunction abloesen soll. Verwendet parseParams von Andre, d.h. Syntax ist key1=value1 key2=value2 ...
Value kann mit " " Lerzeichen enthalten, und mit {} wird es evaluiert.

Den Bedarf fuer gplotDir sehe ich, ich meine aber, dass diese Loesung zu kurz greift. Es muesste irgendetwas sein, was alle fuer FHEM notwendigen Verzeichnisse, die von FHEM modifiziert werden, enthaelt, ich denke an sowas wie der Docker-Vortrag gestern. Da ich unsicher ueber den Umfang bin, habe ich noch nichts unternommen.

Dr. Boris Neubert

Großartig! Vielen Dank. Und gut, dass die alten Zöpfe abgeschnitten werden.

Noch eine Auffälligkeit: Zeile 773 sollte

    map { $l =~ s/<$_>/$pr->{$_}/g } keys %$pr if($plotReplace);

lauten, da wir alle Vorkommen in einer Zeile ersetzen wollen (ich habe den g-Modifier im Match ergänzt). Damit klappt es perfekt.

Zu den Verzeichnissen sollten wir ein neues Thema in FHEM-Development eröffnen.

Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig

ZitatNoch eine Auffälligkeit: Zeile 773 sollte
Danke, habs eingecheckt.

JoeALLb

Sehr schönes Feature!!
Schade jedoch, dass beim Anzeigen der Plots-Definition die Variablen bereits ersetzt werden.
Wenn ich jetzt ENTER drücke, wird die gplot-Datei neu abgespeichert und die Variablen werden wieder durch den Wert aus plotReplace ersetzt.
Es wird zwar eine Warnung angezeigt, diese hatte bisher aber eine (etwas) andere Bedeutung.

Wäre es möglich, in der Define-Ansicht (vorallem im DbLog-Modus) die Keys auch als Keys anzuzeigen?
Ich denke dass dies auch intuitiver ist und dadurch zu weniger Rückfragen von Anwendern kommen würde!
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

rudolfkoenig

Ich bin aber der Ansicht, dass die Ersetzung dem Benutzer hilft. Rueckfragen hatte ich bisher auch keine :)

Virsacer

Also ich weiß nicht, ob ich mich grade zu blöd anstelle, aber bei mir klappt das nicht...

Aus
attr SVG_Thermometer title "$data{min1} °C ≤ $data{currval1} °C ≤ $data{max1} °C"

hab ich erstmal nur
attr SVG_Thermometer plotReplace <TL>=Test
gemacht, aber das geht schon nicht!?

rudolfkoenig


Virsacer

Ok, mit attr SVG_Thermometer plotReplace TL={"$data{min1} °C ≤ $data{currval1} °C ≤ $data{max1} °C"} funktionierts jetzt. Danke :)

Allerdings vertauscht er jetzt, wenn mehrere Plots auf einer Seite angezeigt werden, manchmal die Daten :o

rudolfkoenig

@Virsacer: Hast recht, die plotReplace Ersetzung wird ausgefuehrt, bevor die Daten geholt sind, damit ist $data{min1},etc aus dem vorherigen Lauf.

Eigentlich muesste ich statt plotReplace zwei Attribute einfuehren: plotReplaceBeforeDataGet und plotReplaceAfterDataGet.
Hat irgendwer eine bessere Idee?

Virsacer

Ah, jetzt hab ichs glaube ich vollständig verstanden :-)

Eigentlich würde es doch schon reichen, wenn man schaut, ob der String "$data{" (oder ne Regex mit min\d|max\d usw.) in einer Ersetzungsregel vorkommt und die entsprechenden Regeln dann erst nach dem holen der Daten ausführt, oder?

Dr. Boris Neubert

Hallo,

<TL> wird ja erst in substcfg() ersetzt, während plotReplace die .gplot-Datei als Vorlage interpretiert und die Ersetzungen vorab macht.

Aus meiner Sicht ist es logisch, plotReplace weiter genau so funktionieren zu lassen, also aus einer Vorlage durch stumpfe Substitution den Text der .gplot-Datei zu erzeugen, die dann verwendet wird. plotReplace darf daher in

attr SVG_Thermometer plotReplace TL={"$data{min1} °C ≤ $data{currval1} °C ≤ $data{max1} °C"}

den Perl-Code nicht auswerten. Würde es nicht reichen, wenn der Anwender den Perl-Code maskiert, so dass der Text nach dem Gleichheitszeichen wörtlich übernommen wird, und der Perl-Code erst hinterher ausgewertet wird?

Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!