Hallo,
ich nutze ja mit Begeisterung die RESIDENTS-Modulgruppe seit einigen Wochen.
Für jeden Mitbewohner und für jeden Gast sammeln die Module wie lange jemand da war, geschlafen hat oder weg war.
Das würde ich gerne in Plots darstellen.
Geloggt wird bei mir mit Hilfe des DbLog-Moduls.
Die Schlafdauern des Bewohners Karsten, die geloggt wurden bekomme ich über folgenden Befehl:
get DbLog - - - - rr_Karsten:lastDurSleep:::
Und so sieht das Ergebnis aus:
2014-03-15_00:13:04 00:00:03
2014-03-16_21:43:23 00:07:07
2014-03-21_15:26:41 00:04:42
2014-03-23_21:52:25 02:02:26
2014-04-04_22:39:10 00:00:17
Die Angaben sind in HH:MM:ss
Das lässt nicht nicht plotten. Also muss alles in Minuten umgerechnet werden. Dazu habe ich ein kleines awk-Script gebastelt, das auf der Kommandozeile zuverlässig funktioniert. Die Datensätze habe ich dazu halt in eine einzelne Datei (gplot.txt) gepackt.
Hier das Script:
awk '{split($2,zeit,":")}{print $1, zeit[1]*60+zeit[2]+zeit[3]/60}' /tmp/gplot.txt
Und das Ergebnis stimmt auch zuverlässig:
2014-03-15_00:13:04 0.05
2014-03-16_21:43:23 7.11667
2014-03-21_15:26:41 4.7
2014-03-23_21:52:25 122.433
2014-04-04_22:39:10 0.283333
Also das Ganze noch in eine gplot-Datei schieben:
#### Inhalt der gplot.txt ####
# Created by FHEM/98_SVG.pm, 2014-03-21 17:08:33
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 "Phasen"
set y2label ""
#DbLog rr_Karsten:lastDurSleep:::
plot "< awk '{zeitdauer=$2}{split(zeitdauer,zeit,":")}{print $1, zeit[1]*60+zeit[2]}' <IN>" using 1:2 axes x1y1 title 'Phasen' ls l3fill lw 1 with bars
####
Und da fängt das Problem an: Was mache ich denn mit dem Parameter ":" in der Funktion split() in der gplot-Datei? Kann man den maskieren? Backslash \ habe ich schon probiert. Tut nicht.
Backticks an unterschiedlichen Stellen leider auch nicht.
An einer Lösung ähnlich awk -F: scheitert es auch, ich will ja nicht den kompletten String gleich am Anfang anhand der Doppelpunkte splitten. Außerdem bekomme ich so ein bisschen Probleme, das Ding hinterher zusammen zu bauen, weil ja einmal Uhrzeiten des Timestamp und einmal die Zeitdauern drin sind.
Andere Möglichkeiten? Ansonsten sind diese Daten ja schlichtweg nicht zu plotten. Oder müsste man dafür ein Modul schreiben?
Viele Grüße
Zephyr
Man könnte auch überlegen, das Format des Readings auf Sekunden umzustellen. Mir war bisher nicht klar, ob man den Wert mal plotten will oder bevorzugt als lesbaren String irgendwo darstellen möchte. Möglich sollte eigentlich beides sein... man könnte auch noch ein maschinenlesbares Reading zusätzlich hinzufügen.
Bei deinem konkreten Plotting Problem nach der Umrechnung kann ich dir allerdings nicht helfen...
Wäre es nicht eventuell einfacher, ein UserReading zu machen, das die Zeit in eineim plotbaren Format enthält (Umrechnung in einer myUtils)?
Geht alles, muss aber dann jeder für sich selbst machen. Ich denke immer es macht Sinn sowas im Modul zu haben, wenn es mehr als ein paar Leute potentiell benutzen würden ;)
Aber das vorhandene Reading nun in ein "Sekundenreading" umzuwandeln ist, meiner Ansicht nach, zu vermeiden, weil ein lesbares Reading nicht verkehrt ist. Zusätzlich die Sekunden zu haben wäre sicher hilfreich und sinnvoll.
Diese Option wurde oben ebenso genannt ;)
Lesen kann ich ;) Klar ausgedrückt: Ich plädiere für beides.
Ich bastele an einer Lösung, die das kleine AWK-Programm auslagert in eine eigene Datei. Aufgerufen würde dann mit awk -f /opt/fhem/contrib/lastDur.awk oder ähnlich.
Ganz fertig ist das aber noch nicht. UserReadings habe ich noch nie genutzt. Müsste ich mir mal anschauen, was genau das ist und ob es taugt.
Vielen Dank
viele Grüße
Zephyr
Nachtrag: Die Dauer in Sekunden anzugeben wäre am einfachsten. Allerdings mit den alten bereits geloggten Daten nicht kompatibel. Das ist eigentlich nicht so schön.
Ich habe jetzt eine neue Version 1.1.0 der Module eingecheckt:
# -- new readings in computer readable format (*_cr)
# -- format of readings durTimer readings changes from minutes to HH:MM:ss
Neue Readings:
durTimerAbsence_cr
durTimerPresence_cr
durTimerSleep_cr
lastDurAbsence_cr
lastDurPresence_cr
lastDurSleep_cr
Die neuen Readings geben die Dauer in Minuten an (Sekunden erschien mir für's Plotten dann doch zu fein).
Wie man sieht habe ich auch die DurationTimer angepasst. Um die Benennung einheitlich zu haben, musste deshalb das Format der vorhandenen Readings durTimerAbsence und durTimerPresence von Minuten auf HH:MM:ss umgeändert werden.
Zitat von: Zephyr am 07 April 2014, 11:59:04
Nachtrag: Die Dauer in Sekunden anzugeben wäre am einfachsten. Allerdings mit den alten bereits geloggten Daten nicht kompatibel. Das ist eigentlich nicht so schön.
Lässt sich aber auch nicht ändern. Ich folge tendenziell eher dem Apple statt dem Microsoft Ansatz: Altes über Board werfen und das Neue nicht zu stark vom Alten beeinflussen lassen ;D
Du kannst dir aber ja per Script einmalig die Werte in deinem Log entsprechend umrechnen. Ansonsten messe ich persönlich historischen Daten eher weniger Wichtigkeit bei; es sammeln sich ja wieder welche an, so what 8)
Aber das sieht vermutlich auch jeder etwas anders.
Ohha, gestern als ich spät nach Hause kam, hätte ich gern noch den Ansatz mit AWK -f versuchen wollen. Jetzt bist du mir mal eben zuvorgekommen. :D
Was wirklich großartig ist, weil's mir enorme Kopfschmerzen erspart.
Hab herzlichen Dank für die Änderung, ich hoffe ich komme heute Abend dazu auf dem Testserver das Update zu machen. Habe die Nachricht aus des Repo schon gesehen.
LG
Zephyr
Zitat von: Loredo am 07 April 2014, 16:50:17
Lässt sich aber auch nicht ändern. Ich folge tendenziell eher dem Apple statt dem Microsoft Ansatz: Altes über Board werfen und das Neue nicht zu stark vom Alten beeinflussen lassen ;D
Ist schon der richtige Ansatz, die Migration der Altdaten ist ja problemlos möglich. einmal umrechnen und ein paar SQL-Statements drüber laufen zu lassen ist kein Ding.
Vielen Dank noch mal, Loredo, et tut - siehe Grafik. :)
Nur wenn ich Balken zur Darstellung benutzen will verschwindet die Darstellung. Aber das mit was mit dem SVG-Modul zu tun haben, denke ich.
Viele Grüße
Zephyr