Zeitdauern der RESIDENTS-Module in der Form HH:MM:ss plotten

Begonnen von Zephyr, 05 April 2014, 15:32:36

Vorheriges Thema - Nächstes Thema

Zephyr

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
FHEM 5.5 auf Fritz!Box 7390 und Beagle Bone black mit RFXtrx433

Loredo

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...
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

marvin78

#2
Wäre es nicht eventuell einfacher, ein UserReading zu machen, das die Zeit in eineim plotbaren Format enthält (Umrechnung in einer myUtils)?

Loredo

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 ;)
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

marvin78

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.

Loredo

Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

marvin78

Lesen kann ich ;) Klar ausgedrückt: Ich plädiere für beides.

Zephyr

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
FHEM 5.5 auf Fritz!Box 7390 und Beagle Bone black mit RFXtrx433

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.
FHEM 5.5 auf Fritz!Box 7390 und Beagle Bone black mit RFXtrx433

Loredo

#9
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.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Loredo

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.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Zephyr

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
FHEM 5.5 auf Fritz!Box 7390 und Beagle Bone black mit RFXtrx433

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.
FHEM 5.5 auf Fritz!Box 7390 und Beagle Bone black mit RFXtrx433

Zephyr

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
FHEM 5.5 auf Fritz!Box 7390 und Beagle Bone black mit RFXtrx433