logProxy
logProxy | |
---|---|
Zweck / Funktion | |
manipulieren und ergänzen von Plotdaten | |
Allgemein | |
Typ | Inoffiziell |
Details | |
Dokumentation | siehe Forum |
Support (Forum) | Frontends |
Modulname | 98_logProxy.pm |
Ersteller | Andre (Forum / Wiki) |
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref! |
Das Hilfsmodul logProxy bietet die Möglichkeit, die Daten, die in einem SVG-Plot dargestellt werden, auf die folgenden Arten zu ergänzen und zu manipulieren:
- horizontale und vertikale Linien an festen Positionen hinzufügen
- Linien an dynamischen und von anderen Plots anhängigen Positionen hinzufügen (über die SVG specials min, max, mindate, maxdate, avg, currdate und currval)
- plotten von dynamisch berechneten Kurven wie die Wochenprofile von Heating_Control und WeekdayTimer devices sowie HomeMatic und Max Thermostaten
- mischen von Plots aus unterschiedlichen Quellen (DbLog und/oder mehrere FileLog devices)
- horizontales Verschieben von plots zueinander um die Daten aus den average oder statistic Modulen auf den richtigen Tag, Woche oder Monat zu schieben
in progress:
- Auffüllen am Anfang und Ende des Plots um den Plotabriss zu vermeiden ohne zusätzliche Daten zu loggen.
Alle Funktionen die logProxy bereit stellt werden im .gplot file über #logProxy Zeilen konfguriert. Zusätzlich muss natürlich genau wie für die #FileLog bzw. #DbLog Zeilen jeweils eine eigene Plot-Zeile vorhanden sein.
Der Plot-Editor wird (hoffentlich) so gut es geht unterstützt. Leider sind die Drop-Down Listen nicht dynamisch abhängig von einem anderen Feld konfgurierbar.
Das Modul ist noch nicht eingecheckt und zur Zeit im Forum zu finden.
Vorbereitung:
- Anlegen eines logProxy devices:
define lp logProxy
- Wenn Daten zu einem bestehenden Plot hinzugefügt werden sollen muss
- das SVG device vom jeweiligen DbLog oder FileLog device auf das logProxy device umgestellt werden
- im .gplot file die
#FileLog
bzw.#DbLog
zeilen in#logProxy
geändert - und an den anfang der column_spec zusätzlich
FileLog:<logDevice>: bzw DbLog:<logDevice>:
eingefügt werden:
aus:
#DbLog myDevice:myReading #FileLog 4:PCA301_076035:power:: #FileLog 4:<SPEC1>:consumption::
wird dann:
#logProxy DbLog:myDb:myDevice:myReading #logProxy FileLog:FileLog_PCA301_076035:4:PCA301_076035.power:: #logProxy FileLog:FileLog_<SPEC1>:4:<SPEC1>.consumption::
column-spec
in einer solchen #logProxy zeile kann dann folgendes stehen:
FileLog:<log device>[,<options>]:<(alte) FileLog column_spec>
Plot mit Daten aus dem FileLog <log device>DbLog:<log device>,[<options>]:<(alte) DbLog column_spec>
Plot mit Daten aus dem DbLog <log device>ConstX:<zeit>,<y>[,<y2>]
Vertikale Linie zwischen <y> und <y2> am Zeitpunkt <zeit>ConstY:<y>[,<von>[,<bis>]]
Horizintale Line bei <y>, optional nur zwischen <von> und <bis>Func:myFunc(...)
über myFunc() dynamisch erzeugter Plot
Alles nach dem : hinter ConstX, ConstY und Func wird als Perl-Ausdruck mit eval ausgewertet. Es dürfen keine weiteren : in diesen Zeilen vorhanden sein.
Mögliche <options>
Ein oder mehrere der folgenden Optionen sind durch Komma getrennt möglich:
offset=<wert>
Verschiebt den Plot um <wert> Sekunden (oder um <wert> Monate wenn <wert> mit einem m endet)extend=<wert>
Erweitert den aus dem log device abgefragten Bereich am Anfang und am Ende um <wert> Sekunden (oder um <wert> Monate wenn <wert> mit einem m endet)
Damit kann ein Abriss des Plots am Anfang und Ende verhindert werden. Aktiviert automatisch auchinterpolate
.interpolate
Aktiviert die Interpolation zwischen dem ersten/letzen wert Innerhalb des Plots und dem zugehörigen Wert imextend
Bereich um die Werte für den Rand des Plots zu bestimmen. Sinnvoll für Plot-Typelines
.clip
Beschneidet die Plotdaten auf den zum Plotten ausgewählten Bereich. Nur in Verbindung mitoffset=<wert>
und/oderextend=<wert>
sinnvoll.
Eigene Funktionen
Im Aufruf eigener Funktionen die Daten zum Plotten liefern kann auf $from
und <cpde>$to (jeweils ein String mit dem Start- bzw. End zeitpunkt) zugegriffen werden. Die Funktion selber muss vier Werte zurück liefern:
- Die eigentlichen Punkte des Plots als String mit durch \n getrennten Elemente der Form
yyyy-mm-dd_hh:mm:ss <wert>
- die
min
,max
undcurrval
werte (optional)
Ein Beispiel für eine solche Funktion ist logProxy_WeekProfile2Plot mit dem das Temperaturprofil von Heating_Control und WeekdayTimer devices sowie von HomeMatic und MAX Thermostaten geplottet werden kann.
Wenn der erste Paramter der Name eines passenden devices ist wird mit logProxy_Heating_Controll2WeekProfile, logProxy_HM2WeekProfile bzw. logProxy_MAX2WeekProfile aus den intern Daten bzw. readings ein Wochenprofil erzeugt und dieses dann geplottet. Alternativ kann statt eines device namens auch direkt das aufbereitetes Wochenprofil als hash der form {$wday}{$time}{$value}
(bei dem ein $wday
von 0 Sonntag entspricht) übergeben werden.
logProxy_WeekProfile2Plot hat noch einen vierten, optionalen, Paramter. Hier kann eine Regex angegeben werden um aus dem Heating_Controll oder WeekdayTimer Schaltwert den zu plottenden Wert zu extrahieren z.B. so:
logProxy_WeekProfile2Plot("myHeatingControl",$from,$to,"(\\d*)\$")
Hilfen zum Manipulieren von Zeitpunkten
SVG_time_to_sec($time)
Wandelt den String$time
im format yyyy-mm-dd_hh:mm:ss in Sekunden um.logProxy_shiftTime($time,$offset)
Verschiebt den Zeitpunkt$time
(als String) um$offset
Sekunden (oder um$offset
Monate wenn$offset
mit einem m endet).logProxy_Range2Zoom($seconds)
Direkt verwendbare Beispielfunktionen
logProxy_WeekProfile2Plot($device, $from, $to [,$regex])
logProxy_Func2Plot($from, $to, $func [,$step])
Beispiele
x-achse bei y=0 einblenden
Für Plots mit negativen Temperaturen oder Energie erzeugungs/verbrauchs Plots:
#logProxy DbLog:dbLog:s300ht:temperature:: #logProxy ConstY:0 plot "<IN>" using 1:2 axes x1y1 title 'temp' ls l1 lw 1 with steps,\ "<IN>" using 1:2 axes x1y1 ls l5 lw 1 with lines,\
Horizontale Linie an einer dynamisch berechneten Position einbenden
#logProxy ConstY:myFunc(123)
Horizontale Line auf y-position des Durchnisttswertes eines anderen Plots einblenden
#logProxy DbLog:dbLog:s300ht:temperature:: #logProxy ConstY:$data{avg1} plot "<IN>" using 1:2 axes x1y1 title 'temp' ls l1 lw 1 with steps,\ "<IN>" using 1:2 axes x1y1 title 'avg' ls l3 lw 1 with lines,\
Min- und Max- Position eines Plots hervorheben
#logProxy DbLog:dbLog:s300ht_1:temperature:: #logProxy ConstY:$data{avg1} #logProxy ConstX:$data{mindate1},$data{min1} #logProxy ConstX:$data{maxdate1},$data{max1} #logProxy ConstX:$data{mindate1},$data{min1},$data{avg1} #logProxy ConstX:$data{maxdate1},$data{max1},$data{avg1} plot "<IN>" using 1:2 axes x1y1 title 'temp' ls l2 lw 1 with steps,\ "<IN>" using 1:2 axes x1y1 title 'avg' ls l5 lw 1 with lines,\ "<IN>" using 1:2 axes x1y1 ls l0 lw 1 with points,\ "<IN>" using 1:2 axes x1y1 ls l0 lw 1 with points,\ "<IN>" using 1:2 axes x1y1 ls l0 lw 1 with lines,\ "<IN>" using 1:2 axes x1y1 ls l0 lw 1 with lines,\
Punkt ans Ende des geplottenen Bereiches eines anderen Plots setzen
#logProxy DbLog:dbLog:s300ht:temperature:: #logProxy ConstX:logProxy_shiftTime($data{currdate1},0),$data{currval1}+0.00001 plot "<IN>" using 1:2 axes x1y1 title 'temp' ls l1 lw 1 with steps,\ "<IN>" using 1:2 axes x1y1 ls l0 lw 1 with points,\
Vertikale Line zwischen Min- und Max Wert eines anderen Plots 60 minuten nach Plotanfang zeichnen
#logProxy DbLog:dbLog:s300ht:temperature:: #logProxy ConstX:logProxy_shiftTime($from,60*60),$data{min1},$data{max1} #logProxy ConstX:logProxy_shiftTime($from,60*60),$data{min1},$data{max1} plot "<IN>" using 1:2 axes x1y1 title 'temp' ls l1 lw 1 with steps,\ "<IN>" using 1:2 axes x1y1 title 'minmax' ls l0 lw 1 with lines,\ "<IN>" using 1:2 axes x1y1 ls l0 lw 1 with points,\
Ploten von dynamisch erzeugten Werten aus einer eigenen Funktion
#logProxy Func:myFunc($from,$to) plot "<IN>" using 1:2 axes x1y1 title 'avg' ls l1 lw 1 with lines,\
Plotten eines Weekday_Timer Wochenprofils
#logProxy Func:logProxy_WeekProfile2Plot("myHeatingTimer",$from,$to) plot "<IN>" using 1:2 axes x1y1 title 'profile' ls l2 lw 1 with steps,\
Verschieben der avg_day Werte aus dem average modul um -24 Stunden um sie auf den richtigen Tag zu bekommen
#logProxy DbLog:dbLog:s300ht_1:temperature:: #logProxy DbLog:dbLog:s300ht_1:temperature_avg_day:: #logProxy DbLog:dbLog,offset=-60*60*24:s300ht_1:temperature_avg_day:: #logProxy ConstY:$data{avg1} plot "<IN>" using 1:2 axes x1y1 title 'temp' ls l2 lw 1 with steps,\ "<IN>" using 1:2 axes x1y1 title 'avg_day' ls l4 lw 1 with steps,\ "<IN>" using 1:2 axes x1y1 title 'avg_day_shifted' ls l0 lw 1 with steps,\ "<IN>" using 1:2 axes x1y1 title 'avg' ls l5 lw 1 with lines,\
Der Effekt ist auf dem Screenshot am besten 21. März zu sehen. Ohne die verschiebung wäre der Wert für den 21. erst am 22. zu sehen (dunkel rot), mit Verschiebung ist er korrekt am 21. zu sehen (hell rot).
Mischen von Daten aus meheren Quellen
Hier zwei FileLogs mit je zwei readings über plotfunction konfiguriert, ein reading aus einem DbLog und ein dynamisch erzeugtes wochenprofil direkt aus einem HM Thermostaten:
#logProxy FileLog:FileLog_<SPEC1>:4:<SPEC1>.consumption:: #logProxy FileLog:FileLog_<SPEC1>:4:<SPEC1>.power:: #logProxy FileLog:FileLog_<SPEC2>:4:<SPEC2>.consumption:: #logProxy FileLog:FileLog_<SPEC2>:4:<SPEC2>.power:: #logProxy DbLog:dbLog:s300ht:temperature:: #logProxy Func:logProxy_WeekProfile2Plot("myTcClimate",$from,$to)
Erweitern des zu plottenden Bereichs um ausserhalb liegende Anfangs- und End- Werte
#logProxy DbLog:dbLog:s300ht_1:temperature:: #logProxy DbLog:dbLog:s300ht_1:temperature_avg_day:: #logProxy DbLog:dbLog,offset=-60*60*24,extend=60*60*24:s300ht_1:temperature_avg_day:: #logProxy ConstY:$data{avg1} plot "<IN>" using 1:2 axes x1y1 title 'temp' ls l2 lw 1 with steps,\ "<IN>" using 1:2 axes x1y1 title 'avg_day' ls l4 lw 1 with steps,\ "<IN>" using 1:2 axes x1y1 title 'avg_day_shifted' ls l0 lw 1 with steps,\ "<IN>" using 1:2 axes x1y1 title 'avg' ls l5 lw 1 with lines,\
nachher:
Auf dem untern Bild ist vor allem links noch zu sehen das die mit extend erweiterte Kurve aus dem Plotbereich hinausläuft. Das ist in der aktuellen Version behoben.
Sonnenauf- und -untergangszeiten plotten
logProxy_Func2Plot() ist eine Funktion die eine beliebige übergebene Funktion jeweils für unterschiedliche Zeitpunkte auswertet um die zu plottenden Daten zu bestimmen. Das 'Zeitraster' in dem die Werte bestimmt werden ist konfigurierbar und dynamisch von der aktuellen Zoomstufe abhängig. Der default für Jahres- und Monatsplots sind tägliche, für Wochen- und Tagesplots stündliche, usw. aufrufe.
Anbei ein Beispiel das auf dieser Basis die Idee zum Plotten von Sonnenauf- und -untergangzeiten die im Forum vorgestellt wurde durch 'live' berechnete (statt täglich geloggte) Daten umsetzt.
#logProxy Func:logProxy_Func2Plot($from,$to,'{logProxy_hms2dec(sunrise_abs_dat($sec))}') #logProxy Func:logProxy_Func2Plot($from,$to,'{logProxy_hms2dec(sunset_abs_dat($sec))}') plot "<IN>" using 1:2 axes x1y1 title 'Sonnenaufgang' ls l2 lw 1 with steps,\ plot "<IN>" using 1:2 axes x1y2 title 'Somnnenuntergang' ls l0 lw 1 with steps,