SVG: Unterschied zwischen den Versionen

Aus FHEMWiki
(Ergänzung von Beispiel "Leistungsdaten einer Steckdose (FileLog)")
K (Sichtung der letzen Änderungen; Forenlink auf Vorlage umgestellt)
 
(10 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Todo|Diese Beschreibung ist noch zu ergänzen / erweitern.}}
{{Infobox Modul
{{Infobox Modul
|ModPurpose=Erstellung von Diagrammen aus Logdaten
|ModPurpose=Erstellung von Diagrammen aus Logdaten
Zeile 7: Zeile 6:
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])}}
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])}}


Das Modul [[SVG]] generiert Diagramme aus [[FileLog|Logdateien]] oder [[DbLog|-datenbanken]].
Das Modul [[SVG]] generiert Diagramme aus [[FileLog|Logdateien]] oder [[DbLog|-datenbanken]]. Alternativen sind [[Grafana]] sowie {{Link2Forum|Topic=137009|LinkText=eCharts}}; beide Möglichkeiten basieren jedoch auf JavaScript.


Die Eigenschaften des zu erstellenden Diagrams werden in einer .gplot-Datei festgelegt.
Die Eigenschaften des zu erstellenden Diagrams werden in einer .gplot-Datei festgelegt.


== Definition ==
== Definition ==
Details in der {{Link2CmdRef|Anker=SVGlinkdefine}}.
Die Definition <syntaxhighlight lang="perl">
define <name> SVG <logDevice>:<gplotfile>:<logfile>
</syntaxhighlight>besteht lediglich in der Angabe einer Datenquelle, einer .gplot-File und der Angabe von entweder ''CURRENT'' (für LogFile-Quellen) bzw. ''HISTORY'' (für Datenbanken).


Details zur Definition sind in der {{Link2CmdRef|Anker=SVG-define}} dargestellt.
== Hintergründe ==
Ursprünglich wurde für das Rendern von Diagrammen in FHEM das Programmpaket ''[http://gnuplot.sourceforge.net/ gnuplot]'' verwendet. Daher entspricht die Syntax der ''.gplot''-Files in großen Teilen derjenigen von ''gnuplot'' (z.B. zu den Linientypen und -farben oder zur Gestaltung des Hintergrundes). Allerdings eben nur in großen Teilen, denn das Modul ''SVG'' implementiert eigenständige Rendering-Routinen, so dass die grundlegenden Formatierungsvorgaben dort, wo dies über spezielle Attribute gesteuert werden kann (z.B. zur Zahl der Achsen), auch über die Attribute vorgenommen werden sollte. Weiter sollte man nicht davon ausgehen, dass alle eventuell von gnuplot her bekannten Funktionen unterstützt werden.
Weitere Hinweise hierzu und zum Aufbau der ''.gplot''-Files sind in [[Plots_erzeugen#Individuell / Manuell|Plots erzeugen]] zu finden.
{{Hinweis|Der Artikel [[Plots_erzeugen|Plots erzeugen]] enthält auch eine Darstellung des gplot-Editors. Dieser kann ein gutes Hilfsmittel sein, um ein grundlegendes Verständnis der Funktionsweise zu erhalten. Man erhält damit allerdings ''.gplot''-Dateien, die sämtliche Angaben hart vercodet beinhalten. Falls Sie beabsichtigen, eine ''.gplot''-File zur Verwendung mit mehreren gleichartigen Geräten anzulegen, empfiehlt es sich, die Dateien direkt zu bearbeiten und die Verweise auf die darzustellenden Daten über Attribute zu steuern, wie nachfolgend dargestellt.}}
== Attribute ==
== Attribute ==
Details in der {{Link2CmdRef|Anker=SVGattr}}.
Das wichtigste spezifische Attribut ist  ''plotReplace'', das einige andere, ältere Attribute ersetzen kann. Durch dieses können Angaben in den .gplot-Dateien dynamisch ersetzt werden, wodurch es auf einfache Weise möglich ist, dieselbe .gplot-Datei zur Erstellung von mehreren Plots zu nutzen, die dann auch in einem Plot unterschiedliche Datenquellen verwenden können. Dabei ist zu beachten, dass die in ''plotReplace'' angegebenen Parameter-Wert-Paare in zwei Stufen ersetzt werden:
 
Wird in der .gplot-Datei die Schreibweise ''%key%'' verwendet, wird der Parameter bereits ersetzt, bevor die Datenquelle ausgewertet wurde, in der Schreibweise ''<key>'' erfolgt die Auswertung erst danach. Dies ermöglicht es z.B. auch, Informationen aus unterschiedlichen FileLog-Dateien zu visualisieren, ohne die betreffende Datenquelle hart in der .gplot-Datei zu verankern.
 
Weiter ist es über diesen Mechanismus möglich, auch angepaßten Perl-Code zur Datenauswertung und -formatierung zu verwenden.
 
Siehe dazu insbesondere auch die nachfolgenden beiden Beispiele "Leistungsdaten einer Steckdose (FileLog)" und "Temperatur- und Heizungsdaten eines Zimmers" (DBLog).
 
Weitere Details in der {{Link2CmdRef|Anker=SVG-attr}}.


== Funktionen ==
== Funktionen ==
Details in der {{Link2CmdRef|Anker=plotfunction}}.
Details in der {{Link2CmdRef|Anker=SVG-attr-plotfunction}}.


== Beispiele ==
== Beispiele ==


=== Leistungsdaten einer Steckdose (FileLog) ===  
=== Leistungsdaten einer Steckdose (FileLog) ===


* Inhalt der Datei '''SVG_PlugX.gplot'''
* Inhalt der Datei '''SVG_PlugX.gplot'''
{{Randnotiz|RNTyp=g|RNText=Gegebenenfalls sind die Feldnamen anzupassen}}<source>
{{Randnotiz|RNTyp=g|RNText=Gegebenenfalls sind die Feldnamen anzupassen}}
<syntaxhighlight lang="Gnuplot">
# Leistungsdaten einer Steckdose (FileLog)
# Leistungsdaten einer Steckdose (FileLog)
#
#
Zeile 58: Zeile 74:
     "<IN>" using 1:2 axes x1y2 title 'Strom' ls l1fill_stripe lw 1 with steps,\
     "<IN>" using 1:2 axes x1y2 title 'Strom' ls l1fill_stripe lw 1 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Schaltzustand' ls l3 lw 1 with steps
     "<IN>" using 1:2 axes x1y1 title 'Schaltzustand' ls l3 lw 1 with steps
</source>
</syntaxhighlight>


* Definition von SVG-Device '''SVG_Test'''
* Definition von SVG-Device '''SVG_Test'''
{{Randnotiz|RNTyp=g|RNText=Alle Vorkommen von ...Data-Device... und ...FileLog-Device... sind zu ersetzen}}
{{Randnotiz|RNTyp=g|RNText=Alle Vorkommen von ...Data-Device... und ...FileLog-Device... sind zu ersetzen}}
<source>
<syntaxhighlight lang="perl">
defmod SVG_Test SVG ...FileLog-Device...:SVG_PlugX:CURRENT
defmod SVG_Test SVG ...FileLog-Device...:SVG_PlugX:CURRENT
attr SVG_Test captionPos auto
attr SVG_Test captionPos auto
attr SVG_Test plotReplace DataDevice="...Data-Device..." FileLogDevice="...FileLog-Device..." stateOFFvalue="20" stateONvalue="30" stateUNKNOWNvalue="10" yrange="[0:75]" y2range="[0:300]" title={"Steckdose(Testgerät) --- W: $data{min1}...$data{max1} / $data{currval1} --- mA: $data{min2}...$data{max2} / $data{currval2}"}
attr SVG_Test plotReplace DataDevice="...Data-Device..." FileLogDevice="...FileLog-Device..." stateOFFvalue="20" stateONvalue="30" stateUNKNOWNvalue="10" yrange="[0:75]" y2range="[0:300]" title={"Steckdose(Testgerät) --- W: $data{min1}...$data{max1} / $data{currval1} --- mA: $data{min2}...$data{max2} / $data{currval2}"}
</source>
</syntaxhighlight>
 
* So sieht das resultierende Diagramm aus
[[Datei:SVG Leistungsdaten einer Steckdose.png|thumb|left|300px]]
 
 
 
 
 


=== Temperatur- und Heizungsdaten eines Zimmers ===  
=== Temperatur- und Heizungsdaten eines Zimmers ===  
Zeile 73: Zeile 97:


[[Datei:PlotReplace Example DBLog.png|thumb|right|300px]]
[[Datei:PlotReplace Example DBLog.png|thumb|right|300px]]
<source># Created by FHEM/98_SVG.pm, 2020-01-06
<syntaxhighlight lang="Gnuplot">
# Created by FHEM/98_SVG.pm, 2020-01-06
# to replace variables, use plotReplace like
# to replace variables, use plotReplace like
# attr SVG_Thermostat plotReplace SPEC1=Thermostat TL="My example thermostat" EXTERNALTEMPDEVICE=MYSENSOR_97 EXTERNALTEMPREADING=temperature2 \
# plotReplace-Parameter: SPEC1=Thermostat  (von diesem Gerät stammen die Thermostat-Daten)
#                        DBLogDevice      (in diesem Gerät werden die Daten geloggt)
#      Die übrigen plotReplace-Parameter sind selbsterklärend, Beispiel:
# attr SVG_Thermostat plotReplace DBLogDevice=DBLog 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
# ROOMHUMIDITYDEVICE=HUEDevice3 EXTERNALHUMIDITYREADING=humidity ROOMTEMPDEVICE=HUEDevice4 ROOMTEMPREADING=temperature WINDOW1=Window1_MyRoom WINDOW2=Window2_MyRoom


Zeile 93: Zeile 121:
set isosample 20
set isosample 20


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




Zeile 111: Zeile 139:
     "<IN>" using 1:2 axes x1y1 y2title '%WINDOW1%' ls l4fill lw 0.5 with steps,\
     "<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
     "<IN>" using 1:2 axes x1y1 y2title '%WINDOW2%' ls l5fill lw 0.5 with steps
</source>
</syntaxhighlight>
== Hinweise ==
* Plot-Abrisse vermeiden
Sind in den Quelldaten nicht genügend Datenpunkte vorhanden, kann es zu Lücken in der Darstellung kommen. Abhilfe kann man mit [[LogProxy]] schaffen oder, indem man zusätzliche Datenpunkte in den Datenquellen generiert, z.B. durch das Setzen von ''addLog''-Attributen an FileLog bzw. DBLog-Geräten. Weitere Hinweise sind in [[Plot-Abriss vermeiden]] zu finden.


== Links ==
== Links ==
* [[Plots erzeugen]]
* [[Plots erzeugen]]
* [[Creating Plots]]
* [[Creating Plots]]
<references /><syntaxhighlight lang="raw">
 
<references />
[[Kategorie:Logging]]
[[Kategorie:Logging]]

Aktuelle Version vom 18. März 2024, 11:06 Uhr

SVG
Zweck / Funktion
Erstellung von Diagrammen aus Logdaten
Allgemein
Typ Hilfsmodul
Details
Dokumentation EN / DE
Support (Forum) Frontends
Modulname 98_SVG.pm
Ersteller rudolfkoenig (Forum / Wiki)
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


Das Modul SVG generiert Diagramme aus Logdateien oder -datenbanken. Alternativen sind Grafana sowie eCharts; beide Möglichkeiten basieren jedoch auf JavaScript.

Die Eigenschaften des zu erstellenden Diagrams werden in einer .gplot-Datei festgelegt.

Definition

Die Definition

define <name> SVG <logDevice>:<gplotfile>:<logfile>

besteht lediglich in der Angabe einer Datenquelle, einer .gplot-File und der Angabe von entweder CURRENT (für LogFile-Quellen) bzw. HISTORY (für Datenbanken).

Details zur Definition sind in der commandref/SVG-define dargestellt.

Hintergründe

Ursprünglich wurde für das Rendern von Diagrammen in FHEM das Programmpaket gnuplot verwendet. Daher entspricht die Syntax der .gplot-Files in großen Teilen derjenigen von gnuplot (z.B. zu den Linientypen und -farben oder zur Gestaltung des Hintergrundes). Allerdings eben nur in großen Teilen, denn das Modul SVG implementiert eigenständige Rendering-Routinen, so dass die grundlegenden Formatierungsvorgaben dort, wo dies über spezielle Attribute gesteuert werden kann (z.B. zur Zahl der Achsen), auch über die Attribute vorgenommen werden sollte. Weiter sollte man nicht davon ausgehen, dass alle eventuell von gnuplot her bekannten Funktionen unterstützt werden. Weitere Hinweise hierzu und zum Aufbau der .gplot-Files sind in Plots erzeugen zu finden.

Info blue.png
Der Artikel Plots erzeugen enthält auch eine Darstellung des gplot-Editors. Dieser kann ein gutes Hilfsmittel sein, um ein grundlegendes Verständnis der Funktionsweise zu erhalten. Man erhält damit allerdings .gplot-Dateien, die sämtliche Angaben hart vercodet beinhalten. Falls Sie beabsichtigen, eine .gplot-File zur Verwendung mit mehreren gleichartigen Geräten anzulegen, empfiehlt es sich, die Dateien direkt zu bearbeiten und die Verweise auf die darzustellenden Daten über Attribute zu steuern, wie nachfolgend dargestellt.


Attribute

Das wichtigste spezifische Attribut ist plotReplace, das einige andere, ältere Attribute ersetzen kann. Durch dieses können Angaben in den .gplot-Dateien dynamisch ersetzt werden, wodurch es auf einfache Weise möglich ist, dieselbe .gplot-Datei zur Erstellung von mehreren Plots zu nutzen, die dann auch in einem Plot unterschiedliche Datenquellen verwenden können. Dabei ist zu beachten, dass die in plotReplace angegebenen Parameter-Wert-Paare in zwei Stufen ersetzt werden:

Wird in der .gplot-Datei die Schreibweise %key% verwendet, wird der Parameter bereits ersetzt, bevor die Datenquelle ausgewertet wurde, in der Schreibweise <key> erfolgt die Auswertung erst danach. Dies ermöglicht es z.B. auch, Informationen aus unterschiedlichen FileLog-Dateien zu visualisieren, ohne die betreffende Datenquelle hart in der .gplot-Datei zu verankern.

Weiter ist es über diesen Mechanismus möglich, auch angepaßten Perl-Code zur Datenauswertung und -formatierung zu verwenden.

Siehe dazu insbesondere auch die nachfolgenden beiden Beispiele "Leistungsdaten einer Steckdose (FileLog)" und "Temperatur- und Heizungsdaten eines Zimmers" (DBLog).

Weitere Details in der commandref/SVG-attr.

Funktionen

Details in der commandref/SVG-attr-plotfunction.

Beispiele

Leistungsdaten einer Steckdose (FileLog)

  • Inhalt der Datei SVG_PlugX.gplot
Info green.pngGegebenenfalls sind die Feldnamen anzupassen
# Leistungsdaten einer Steckdose (FileLog)
#
# plotReplace-Parameter: DataDevice        (von diesem Gerät stammen die Daten)
#                        FileLogDevice     (in diesem Gerät werden die Daten geloggt)
#                        stateOFFvalue     (y-Wert zur Darstellung von ausgeschaltetem Zustand)
#                        stateONvalue      (y-Wert zur Darstellung von eingeschaltetem Zustand)
#                        stateUNKNOWNvalue (y-Wert zur Darstellung von unbekanntem Zustand)
#                        title             (in der Regel ein perl-Ausdruck zur Darstellung von Eckwerten in der Titelzeile)
#                        yrange            (Wertebereich für Darstellung in W vorgeben)
#                        y2range           (Wertebereich für Darstellung in mA vorgeben)

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 '<title>'
set ytics 
set y2tics 
set grid ytics y2tics
set ylabel "Leistung (W)"
set y2label "Strom (mA)"
set yrange %yrange%
set y2range %y2range%

#%FileLogDevice% 4:%DataDevice%.power\x3a:0:
#%FileLogDevice% 4:%DataDevice%.current\x3a:"":($fld[3]*1000)
#%FileLogDevice% 4:%DataDevice%.userRead_socket_state\x3a:"":($fld[3]=~"off"?%stateOFFvalue%:($fld[3]=~"on"?%stateONvalue%:%stateUNKNOWNvalue%))

plot "<IN>" using 1:2 axes x1y1 title 'Leistung' ls l0 lw 1 with steps,\
     "<IN>" using 1:2 axes x1y2 title 'Strom' ls l1fill_stripe lw 1 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Schaltzustand' ls l3 lw 1 with steps
  • Definition von SVG-Device SVG_Test
Info green.pngAlle Vorkommen von ...Data-Device... und ...FileLog-Device... sind zu ersetzen
defmod SVG_Test SVG ...FileLog-Device...:SVG_PlugX:CURRENT
attr SVG_Test captionPos auto
attr SVG_Test plotReplace DataDevice="...Data-Device..." FileLogDevice="...FileLog-Device..." stateOFFvalue="20" stateONvalue="30" stateUNKNOWNvalue="10" yrange="[0:75]" y2range="[0:300]" title={"Steckdose(Testgerät) --- W: $data{min1}...$data{max1} / $data{currval1} --- mA: $data{min2}...$data{max2} / $data{currval2}"}
  • So sieht das resultierende Diagramm aus
SVG Leistungsdaten einer Steckdose.png




Temperatur- und Heizungsdaten eines Zimmers

Quelle: Beitrag (Datenquelle ist ein DBLog-Device namens LogDB):

PlotReplace Example DBLog.png
# Created by FHEM/98_SVG.pm, 2020-01-06
# to replace variables, use plotReplace like
# plotReplace-Parameter: SPEC1=Thermostat  (von diesem Gerät stammen die Thermostat-Daten)
#                        DBLogDevice       (in diesem Gerät werden die Daten geloggt)
#       Die übrigen plotReplace-Parameter sind selbsterklärend, Beispiel:
# attr SVG_Thermostat plotReplace DBLogDevice=DBLog 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

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

Hinweise

  • Plot-Abrisse vermeiden

Sind in den Quelldaten nicht genügend Datenpunkte vorhanden, kann es zu Lücken in der Darstellung kommen. Abhilfe kann man mit LogProxy schaffen oder, indem man zusätzliche Datenpunkte in den Datenquellen generiert, z.B. durch das Setzen von addLog-Attributen an FileLog bzw. DBLog-Geräten. Weitere Hinweise sind in Plot-Abriss vermeiden zu finden.

Links