Creating Plots - caching SVG's: Unterschied zwischen den Versionen

Aus FHEMWiki
(Ersetzung von Forum-Links mit Vorlage Link2Forum)
 
(4 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
= Creating Plots - caching SVG's =
{{Randnotiz|RNTyp=Fehl|RNText=Dieser Wiki-Artikel bezieht sich auf alte Fhem-Versionen. In aktuellen Fhem-Versionen ist das Zwischenspeichern von vollständigen/abgeschlossen Plots integriert. Es kann mit dem Attribut <code>SVGcache</code> von [[FHEMWEB]] gesteuert werden{{Link2Forum|Topic=11053|Message=279262}}.}}
== Das Problem: ==
== Das Problem: ==
Die Anzeige von Grafiken in FHEM benötigt relativ lange Zeit. Speziell, wenn es um längere Zeiträume (Monat/Jahr) geht, und viele Werte gespeichert sind, kann das schon in die 10+ Sekunden gehen.
Die Anzeige von Grafiken in FHEM benötigt relativ lange Zeit. Speziell, wenn es um längere Zeiträume (Monat/Jahr) geht, und viele Werte gespeichert sind, kann das mehrere Sekunden dauern.


Die Anleitung geht davon aus, dass grundsätzliches knowhow über fhem und wie Grafiken erstellt werden besteht. Grundlegende Infos sich unter: [http://www.fhemwiki.de/wiki/Creating_Plots Creating_Plots] zu finden.
Diese Anleitung geht davon aus, dass grundsätzliche Kenntnisse über Fhem sowie über die Vorgehensweise, wie Grafiken erstellt werden, besteht. Grundlegende Infos sind im Artikel [[Creating Plots]] zu finden.


== Der Lösungsansatz: ==
== Der Lösungsansatz ==
Alle Grafiken, die sich auf Werte in der Vergangenheit beziehen, ändern sich nicht mehr, werden aber dennoch jedesmal neu abgefragt und neu berechnet.
Alle Grafiken, die sich auf Werte in der Vergangenheit beziehen, ändern sich nicht mehr, werden aber dennoch jedesmal neu abgefragt und neu berechnet. Für diese Art von Grafiken wird eine caching Lösung aufgezeigt.
Für diese Art von Grafiken wird eine caching Lösung aufgezeigt.


== Voraussetzungen: ==
== Voraussetzungen ==
dieses Beispiel geht von folgendener Situation aus:
Dieses Beispiel geht von folgendener Situation aus:


* es gibt ein DbLog (in diesem Beispiel myDbLog), dass alle readings speichert.
* es gibt ein DbLog (in diesem Beispiel myDbLog), das alle readings speichert.
* es gibt einen Sensor (in diesem Beispiel '''AussenTempHum'''), der die readings '''temperature''' und '''humidity''' liefert.
* es gibt einen Sensor (in diesem Beispiel '''AussenTempHum'''), der die readings '''temperature''' und '''humidity''' liefert.
* Das Beispiel geht davon aus, dass FHEM unter dem User fhem läuft.
* Das Beispiel geht davon aus, dass Fhem unter dem User fhem läuft.


== Definitionen: ==
== Definitionen ==
=== Definition eines weblinks: ===
=== Definition eines weblinks ===
  <nowiki>define AussenTempHum_current_day weblink dbplot myDbLog:TempHum_MH
  define AussenTempHum_current_day weblink dbplot myDbLog:TempHum_MH
attr AussenTempHum_current_day label &quot;Temp- min: $data{min1}, max: $data{max1}, last: $data{currval1}, Feuchte- min: $data{min2}, max: $data{max2}, last: $data{currval2}&quot;
attr AussenTempHum_current_day label &quot;Temp- min: $data{min1}, max: $data{max1}, last: $data{currval1}, Feuchte- min: $data{min2}, max: $data{max2}, last: $data{currval2}&quot;
attr AussenTempHum_current_day plotfunction AussenTempHum
attr AussenTempHum_current_day plotfunction AussenTempHum
attr AussenTempHum_current_day title &quot;Aussen&quot;</nowiki>
attr AussenTempHum_current_day title &quot;Aussen&quot;
Das Attribut '''plotfunction''' bestimmt welches device in der Datenbank selektiert wird (in diesem Beispiel AussenTempHum).


Das Attribut '''title''' und ''' label'''bestimmt was in der Überschriftszeile des Plots steht.
Das Attribut '''plotfunction''' bestimmt, welches device in der Datenbank selektiert wird (in diesem Beispiel AussenTempHum).


=== Definition des gplotfile (TempHum_MH.gplot): ===
Die Attribute '''title''' und '''label''' bestimmen, was in der Überschriftszeile des Plots steht.
  <nowiki># TempHum_MH.gplot
 
# MH 12/2012 support both dblog and filelog
=== Definition des gplotfile (TempHum_MH.gplot) ===
# Attribute 'small' is useful for gnuplot/-scroll only,
 
# if plotsize is less than 800,400
  # TempHum_MH.gplot
#set terminal png transparent small size &lt;SIZE&gt; crop
# MH 12/2012 support both dblog and filelog
set terminal png transparent size &lt;SIZE&gt; crop
# Attribute 'small' is useful for gnuplot/-scroll only,
set output '&lt;OUT&gt;.png'
# if plotsize is less than 800,400
set xdata time
#set terminal png transparent small size &lt;SIZE&gt; crop
set timefmt &quot;%Y-%m-%d_%H:%M:%S&quot;
set terminal png transparent size &lt;SIZE&gt; crop
set xlabel &quot; &quot;
set output '&lt;OUT&gt;.png'
set ytics nomirror
set xdata time
set y2tics
set timefmt &quot;%Y-%m-%d_%H:%M:%S&quot;
#set ytics
set xlabel &quot; &quot;
set title '&lt;TL&gt; &lt;L1&gt;'
set ytics nomirror
set grid xtics y2tics
set y2tics
set y2label &quot;Temperature (°C)&quot;
#set ytics
set ylabel &quot;Humidity (%RF)&quot;
set title '&lt;TL&gt; &lt;L1&gt;'
set yrange [0:99]
set grid xtics y2tics
#FileLog 4:temperature:10:
set y2label &quot;Temperature (°C)&quot;
#FileLog 4:humidity:50:
set ylabel &quot;Humidity (%RF)&quot;
#DbLog &lt;SPEC1&gt;:temperature:10:
set yrange [0:99]
#DbLog &lt;SPEC1&gt;:humidity:50:
#FileLog 4:temperature:10:
plot \
#FileLog 4:humidity:50:
ls l0 axes x1y2 title 'Measured temperature' with lines
#DbLog &lt;SPEC1&gt;:temperature:10:
ls l1fill axes x1y1 title 'Humidity' with lines</nowiki>
#DbLog &lt;SPEC1&gt;:humidity:50:
Nachdem diese beiden Definitionen erledigt sind, sollte es in FHEM eine Grafik geben, die in etwa so aussieht:
plot \
  ls l0 axes x1y2 title 'Measured temperature' with lines
  ls l1fill axes x1y1 title 'Humidity' with lines
 
Nachdem diese beiden Definitionen aktiviert worden sind, sollte es in Fehm eine Grafik geben, die in etwa so aussieht:


[[File:Cachesvg.png|800px]]
[[File:Cachesvg.png|800px]]


'''Bis hierher war alles standard fhem, das sollte also funktionieren bevor es zum schwierigen Teil kommt&#160;;-)'''
Bis hierher war alles standard Fhem, das sollte also funktionieren bevor es zum schwierigen Teil kommt.
Wir brauchen ein Verzeichnis, um die Grafiken zu speichern, wo FHEM sie nachher auch wieder finden kann und darf:
In diesem Beispiel (telnet/SSH auf Raspberry PI):


<nowiki>sudo mkdir /opt/fhem/svgcache/
Es wird ein Verzeichnis benötigt, um die Grafiken zu speichern, wo Fhem sie nachher auch wieder finden kann und darf, in diesem Beispiel (telnet/SSH auf Raspberry PI):
sudo chown -R fhem:root /opt/fhem/svgcache/</nowiki>


sudo mkdir /opt/fhem/svgcache/
sudo chown -R fhem:root /opt/fhem/svgcache/


[[Kategorie:HOWTOS]]
== Erster Test ==
Ein erster Test (von der telnet/SSH commandline) wird mit den folgenden Kommandos durchgeführt:
 
:<code>cd /opt/fhem/svgcache/</code>
:<code>sudo -u fhem wget -O testx.svg <nowiki>'http://localhost:8083/fhem?cmd=showlog</nowiki> AussenTempHum_current_day myDbLog  TempHum_MH -&amp;pos=zoom=month;off=0'</code>


== erster Test ==
Die wesentlichen Parameter sind:
Ein erster Test (von der telnet/SSH commandline):
;sudo -u fhem :damit läuft das wget unter dem user 'fhem', damit es keine Probleme mit Dateiberechtigungen gibt.
;-O testx.svg :das ist der Dateiname, unter dem die erstellte svg gespeichert wird.
;<nowiki>http://localhost:8083</nowiki> : muss jeweils angepasst werden....
;&amp;pos=zoom=xxx;off=yyy : xxx: year, month, week, day - die Zeitspanne <br>  yyy: 0, -1, -2, ...    - wieviele Zeitspannen zurück, 0==aktuell <br> Beipiel: &amp;pos=zoom=month;off=-1 - ergibt die Grafik des vorherigen Monats.


<nowiki>cd /opt/fhem/svgcache/
sudo -u fhem wget -O testx.svg 'http://localhost:8083/fhem?cmd=showlog AussenTempHum_current_day myDbLog TempHum_MH -&amp;pos=zoom=month;off=0'</nowiki>
<nowiki>Die wesentlichen Parameter sind:
sudo -u fhem  - damit läuft das wget unter dem user 'fhem', damit es keine Probleme mit Dateiberechtigungen gibt.
-O testx.svg - das ist der filename, unter dem die erstellte svg gespeichert wird.
[http://localhost:8083 http://localhost:8083]    - muß jeweils angepasst werden....
&amp;pos=zoom=xxx;off=yyy
  xxx: year, month, week, day - die Zeitspanne
  yyy: 0, -1, -2, ...    - wieviel Zeitspannen zurück, 0==aktuell
Beipiel: &amp;pos=zoom=month;off=-1 - ergibt die Grafik des vorigen Monats.</nowiki>
Und das Ergebnis bewundern (im Browser):
Und das Ergebnis bewundern (im Browser):
  <nowiki>http://localhost:8083/fhem/svgcache/testx.svg</nowiki>
  <nowiki>http://localhost:8083/fhem/svgcache/testx.svg</nowiki>
Es sollte jetzt die gewünschte Grafik aufgebaut werden.  
Es sollte jetzt die gewünschte Grafik aufgebaut werden.  


=== Todo ===
=== Todo ===
Automatisieren der Grafikerstellung mittels fhem at....
Automatisieren der Grafikerstellung mittels fhem at.


== Die gespeicherten SVG's von FHEM anzeigen lassen ==
== Die gespeicherten SVGs von Fhem anzeigen lassen ==
=== Definitionen: ===
=== Definitionen ===
<nowiki>define AussenTempHum_lastmonth weblink htmlCode &lt;br/&gt;&lt;object data=&quot;/fhem/svgcache/AussenTempHum_month-last.svg&quot; type=&quot;image/svg+xml&quot; width=&quot;800&quot; height=&quot;160&quot; name=&quot;weblink_test&quot;&gt;&lt;/object&gt; &lt;br/&gt; &lt;a href=&quot;/fhem?detail=AussenTempHum_lastmonth&quot;&gt;AussenTempHum last month&lt;/a&gt;&lt;br/&gt;</nowiki>
Die folgende Definition ist als eine Zeile (ohne Zeilenumbrüche) einzutragen.
Damit teilen wir fhem mit, wo die Grafik zu finden ist (object data="'''/fhem/svgcache/Au...''').
 
Der file-name muß natürlich mit dem aus dem vorigen wget übereinstimmen!
:<code>define AussenTempHum_lastmonth weblink htmlCode &lt;br/&gt;&lt;object data=&quot;/fhem/svgcache/AussenTempHum_month-last.svg&quot; type=&quot;image/svg+xml&quot; width=&quot;800&quot; height=&quot;160&quot; name=&quot;weblink_test&quot;&gt;&lt;/object&gt; &lt;br/&gt; &lt;a href=&quot;/fhem?detail=AussenTempHum_lastmonth&quot;&gt;AussenTempHum last month&lt;/a&gt;&lt;br/&gt;</code>
 
Damit wird Fhem mitgeteilt, wo die Grafik zu finden ist (object data="'''/fhem/svgcache/Au...''').
Der Dateiname muss natürlich mit dem aus dem vorherigen wget übereinstimmen!


== Fazit ==
== Fazit ==
Damit können beliebige plots definert und gepeichert werden und von fhem relativ schnell abgerufen werden.
Damit können beliebige plots definiert, gepeichert und von Fhem relativ schnell abgerufen werden. Grundsätzlich wäre diese Lösung auch ohne DbLog möglich, allerdings müssten dazu die Beispiele überarbeitet werden.
Grundsätzlich wäre diese Lösung auch ohne DbLog möglich, allerdings müssten dazu die Beispiele überarbeitet werden.


Have fun
<!-- Have fun Erwin. -->
Erwin.
 
[[Kategorie:HOWTOS]]

Aktuelle Version vom 19. März 2017, 21:45 Uhr

X mark.svgDieser Wiki-Artikel bezieht sich auf alte Fhem-Versionen. In aktuellen Fhem-Versionen ist das Zwischenspeichern von vollständigen/abgeschlossen Plots integriert. Es kann mit dem Attribut SVGcache von FHEMWEB gesteuert werdenBeitrag.

Das Problem:

Die Anzeige von Grafiken in FHEM benötigt relativ lange Zeit. Speziell, wenn es um längere Zeiträume (Monat/Jahr) geht, und viele Werte gespeichert sind, kann das mehrere Sekunden dauern.

Diese Anleitung geht davon aus, dass grundsätzliche Kenntnisse über Fhem sowie über die Vorgehensweise, wie Grafiken erstellt werden, besteht. Grundlegende Infos sind im Artikel Creating Plots zu finden.

Der Lösungsansatz

Alle Grafiken, die sich auf Werte in der Vergangenheit beziehen, ändern sich nicht mehr, werden aber dennoch jedesmal neu abgefragt und neu berechnet. Für diese Art von Grafiken wird eine caching Lösung aufgezeigt.

Voraussetzungen

Dieses Beispiel geht von folgendener Situation aus:

  • es gibt ein DbLog (in diesem Beispiel myDbLog), das alle readings speichert.
  • es gibt einen Sensor (in diesem Beispiel AussenTempHum), der die readings temperature und humidity liefert.
  • Das Beispiel geht davon aus, dass Fhem unter dem User fhem läuft.

Definitionen

Definition eines weblinks

define AussenTempHum_current_day weblink dbplot myDbLog:TempHum_MH
attr AussenTempHum_current_day label "Temp- min: $data{min1}, max: $data{max1}, last: $data{currval1}, Feuchte- min: $data{min2}, max: $data{max2}, last: $data{currval2}"
attr AussenTempHum_current_day plotfunction AussenTempHum
attr AussenTempHum_current_day title "Aussen"

Das Attribut plotfunction bestimmt, welches device in der Datenbank selektiert wird (in diesem Beispiel AussenTempHum).

Die Attribute title und label bestimmen, was in der Überschriftszeile des Plots steht.

Definition des gplotfile (TempHum_MH.gplot)

# TempHum_MH.gplot
# MH 12/2012 support both dblog and filelog
# Attribute 'small' is useful for gnuplot/-scroll only,
# if plotsize is less than 800,400
#set terminal png transparent small size <SIZE> crop
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 ytics nomirror
set y2tics
#set ytics
set title '<TL> <L1>'
set grid xtics y2tics
set y2label "Temperature (°C)"
set ylabel "Humidity (%RF)"
set yrange [0:99]
#FileLog 4:temperature:10:
#FileLog 4:humidity:50:
#DbLog <SPEC1>:temperature:10:
#DbLog <SPEC1>:humidity:50:
plot \
 ls l0 axes x1y2 title 'Measured temperature' with lines
 ls l1fill axes x1y1 title 'Humidity' with lines

Nachdem diese beiden Definitionen aktiviert worden sind, sollte es in Fehm eine Grafik geben, die in etwa so aussieht:

Cachesvg.png

Bis hierher war alles standard Fhem, das sollte also funktionieren bevor es zum schwierigen Teil kommt.

Es wird ein Verzeichnis benötigt, um die Grafiken zu speichern, wo Fhem sie nachher auch wieder finden kann und darf, in diesem Beispiel (telnet/SSH auf Raspberry PI):

sudo mkdir /opt/fhem/svgcache/
sudo chown -R fhem:root /opt/fhem/svgcache/

Erster Test

Ein erster Test (von der telnet/SSH commandline) wird mit den folgenden Kommandos durchgeführt:

cd /opt/fhem/svgcache/
sudo -u fhem wget -O testx.svg 'http://localhost:8083/fhem?cmd=showlog AussenTempHum_current_day myDbLog TempHum_MH -&pos=zoom=month;off=0'

Die wesentlichen Parameter sind:

sudo -u fhem
damit läuft das wget unter dem user 'fhem', damit es keine Probleme mit Dateiberechtigungen gibt.
-O testx.svg
das ist der Dateiname, unter dem die erstellte svg gespeichert wird.
http://localhost:8083
muss jeweils angepasst werden....
&pos=zoom=xxx;off=yyy
xxx: year, month, week, day - die Zeitspanne
yyy: 0, -1, -2, ... - wieviele Zeitspannen zurück, 0==aktuell
Beipiel: &pos=zoom=month;off=-1 - ergibt die Grafik des vorherigen Monats.

Und das Ergebnis bewundern (im Browser):

http://localhost:8083/fhem/svgcache/testx.svg

Es sollte jetzt die gewünschte Grafik aufgebaut werden.

Todo

Automatisieren der Grafikerstellung mittels fhem at.

Die gespeicherten SVGs von Fhem anzeigen lassen

Definitionen

Die folgende Definition ist als eine Zeile (ohne Zeilenumbrüche) einzutragen.

define AussenTempHum_lastmonth weblink htmlCode <br/><object data="/fhem/svgcache/AussenTempHum_month-last.svg" type="image/svg+xml" width="800" height="160" name="weblink_test"></object> <br/> <a href="/fhem?detail=AussenTempHum_lastmonth">AussenTempHum last month</a><br/>

Damit wird Fhem mitgeteilt, wo die Grafik zu finden ist (object data="/fhem/svgcache/Au...). Der Dateiname muss natürlich mit dem aus dem vorherigen wget übereinstimmen!

Fazit

Damit können beliebige plots definiert, gepeichert und von Fhem relativ schnell abgerufen werden. Grundsätzlich wäre diese Lösung auch ohne DbLog möglich, allerdings müssten dazu die Beispiele überarbeitet werden.