Creating Plots - caching SVG's
Creating Plots - caching SVG's
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 Anleitung geht davon aus, dass grundsätzliches knowhow über fhem und wie Grafiken erstellt werden besteht. Grundlegende Infos sich unter: 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), dass 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 plotfunktionbestimmt welches device in der Datenbank selektiert wird (in diesem Beispiel AussenTempHum).
Das Attribut titleund labelbestimmt 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 erledigt sind, sollte es in FHEM eine Grafik geben, die in etwa so aussieht:
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):
sudo mkdir /opt/fhem/svgcache/ sudo chown -R fhem:root /opt/fhem/svgcache/
erster Test
Ein erster Test (von der telnet/SSH commandline):
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 filename, unter dem die erstellte svg gespeichert wird. [http://localhost:8083 http://localhost:8083] - muß jeweils angepasst werden.... &pos=zoom=xxx;off=yyy xxx: year, month, week, day - die Zeitspanne yyy: 0, -1, -2, ... - wieviel Zeitspannen zurück, 0==aktuell Beipiel: &pos=zoom=month;off=-1 - ergibt die Grafik des vorigen 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 SVG's von FHEM anzeigen lassen
Definitionen:
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 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!
Fazit
Damit können beliebige plots definert und gepeichert werden 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.
Have fun Erwin.