(Gelöst) Daten aus DBLog plotten

Begonnen von Puschel74, 09 Dezember 2013, 09:16:24

Vorheriges Thema - Nächstes Thema

Puschel74

Hallo,

ich mal wieder  8)

Mit dem Modul SYSMON logge ich mir die Daten meines RasPi in die Datenbank.
Nun wollte ich mir gestern einen Plot bauen der die load des RasPi im Raster 1 Minute, 5 Minuten und 15 Minuten plottet.
Die Daten sind auch vorhanden nur weiß ich nicht wie ich da am besten dran komme da alle 3 Werte in einer Reihe stehen.

Der Plot für 1 Minute funktioniert nur die anderen beiden Werte werden nicht geplottet.
Im Screenshot mal der Auszug aus der Datenbank und wie der Plot zur Zeit aussieht.

Und hier meine gplot-Datei.
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 '<L1>'
set grid xtics y2tics

set ylabel "Last"
set y2label "Last"

#DbLog <SPEC1>:loadavg::

plot \
     "< awk '/load avg:/ {print $1, $4}' <IN>" \
   using 1:2 ls l0fill axes x1y1 title '1 min' lw 0 with lines \
   "< awk '/load avg5:/ {print $1, $4}' <IN>" \
   using 1:2 ls l1 axes x1y1 title '5 min' lw 2 with lines \
  "< awk '/load avg15:/ {print $1, $4}' <IN>" \
   using 1:2 ls l2 axes x1y1 title '15 min' lw 3 with lines


Ich vermute das ich noch 2 #DBLog <SPEC1>:loadavg:: benötige die mir die Daten passend extrahieren.
Kann damit aber auch total falsch liegen und es geht noch viel einfacher.

Wenn sich also mal jemand erbarmen könnte (mal wieder) und mir einen kleinen Schupps in die richtige Richtung geben würde wäre ich dankbar.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

justme1968

z.b. so:#DbLog <SPEC1>:loadavg:::$val =~ s/([\d.].*) [\d.].* [\d.].*/$1/eg
#DbLog <SPEC1>:loadavg:::$val =~ s/[\d.].* ([\d.].*) [\d.].*/$1/eg
#DbLog <SPEC1>:loadavg:::$val =~ s/[\d.].* [\d.].* ([\d.].)*/$1/eg


gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Puschel74

Hallo,

und danke für die Hilfe.
Hast du die Codes irgendwo abgespeichert oder schüttelst du sowas einfach so aus dem Ärmel  :o

Aber zurück zum Thema.

Das:
#DbLog <SPEC1>:loadavg:::$val =~ s/([\d.].*) [\d.].* [\d.].*/$1/eg
#DbLog <SPEC1>:loadavg:::$val =~ s/[\d.].* ([\d.].*) [\d.].*/$1/eg
#DbLog <SPEC1>:loadavg:::$val =~ s/[\d.].* [\d.].* ([\d.].)*/$1/eg

ich vermute in der letzten Zeile am Schluss sollte es so aussehen ([\d.].*) - hab ich aber auch versucht.
Sowie das:
#DbLog <SPEC1>:loadavg:::$val =~ s/(\d.).* [\d.].* [\d.].*/$1/eg
#DbLog <SPEC1>:loadavg:::$val =~ s/[\d.].* (\d.).* [\d.].*/$1/eg
#DbLog <SPEC1>:loadavg:::$val =~ s/[\d.].* [\d.].* (\d.).*/$1/eg

sowie das:
#DbLog <SPEC1>:loadavg:::$val =~ s/([\d.]).* [\d.].* [\d.].*/$1/eg
#DbLog <SPEC1>:loadavg:::$val =~ s/[\d.].* ([\d.]).* [\d.].*/$1/eg
#DbLog <SPEC1>:loadavg:::$val =~ s/[\d.].* [\d.].* ([\d.]).*/$1/eg

brachte leider keinen Erfolg.

Wenn ich nur ansatzweise verstünde was die ganzen Klammern machen würde ich ja selbst weiter probieren.
Ich werd mal Onkel Google bemühen - ich vermute es geht hier um Perl-Expressions?

Grüße und danke mal wieder für deine Geduld  ;D
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

justme1968

na wenn ich es abgespeichert hätte würde es ja immer gehen :)

da ist beim eingeben und kopieren was verrutsch.

der zweite fehler war das keine leerzeichen drin sein dürfen. sonst kommt dblog beim parsen durcheinander. also so:
#DbLog <SPEC1>:loadavg:::$val=~s/([\d.]*).[\d.]*.[\d.]*/$1/eg
#DbLog <SPEC1>:loadavg:::$val=~s/[\d.]*.([\d.]*).[\d.]*/$1/eg
#DbLog <SPEC1>:loadavg:::$val=~s/[\d.]*.[\d.]*.([\d.]*)/$1/eg


eine ganz nette einführung zu den reges findest du hier:
http://www.troubleshooters.com/codecorn/littperl/perlreg.htm

die idee oben ist den eingrabe string durch den teil zu ersetzten der gerade relevant ist. dazu wird der erst mal in die drei teile zerlegt. jeder teil kann aus zahlen (\d) und dem Punkt bestehen. die [] geben an welche zeichen erlaubt sind. jeweils mit * dahinter. d.h. beliebig oft. dazwischen kommen dann jeweils leerzeichen. weil die nicht erlaubt sind ein '.'. der bedeutete ausserhalb der [] aber nicht punkt sondern ein beliebiges zeichen. statt dessen könnte man auch \s für whitespace verwenden. die () merkt sich das was in den klammern steht um es später wieder zu verwenden -> beim ersetzen. also wird in jeder zeile jeweils wird der komplette string durch das was in der ersten runden klammer steht ersetzt.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Puschel74

Hallo,

aha  :o

Danke für die Erklärung und den Link.
Meine Lesezeichensammlung nimmt schön langsam Gestalt an  8)

Nu hat es funktioniert.
Jetzt kann ich mich mit der Darstellung anfangen zu spielen damit man auch was erkennt.

Vielen Dank nochmal.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Puschel74

#5
Hallo,

soviel zum Thema gelöst.  ::)

Anhand der Links wollte ich mich nun mal dran machen und das
Zitat2013-11-21_00:00:27 CUM_DAY: 13.695 CUM: 38482.875 COST: 0.74
2013-11-22_00:03:32 CUM_DAY: 14.505 CUM: 38497.380 COST: 0.78
2013-11-23_00:01:38 CUM_DAY: 10.710 CUM: 38508.090 COST: 0.58
#Gas:cum_day:::
in einen Plot werfen der mir den täglichen Verbrauch CUM_DAY aufzeichnet.

Das ist dabei heraus gekommen und ... funktioniert natürlich nicht  ::)
#DbLog <SPEC1>:cum_day::$val=~s/[\D_:]*.([\d.]*).[\D:]*.[\d.]*.[\D:]*.[\d.]*/$1/eg

Ausgehend von der Erklärung über die [] und () und . und * und \d war ich der Meinung das ich mit \D (für nicht-Zahlen) mit _ und : im Namen beliebig oft anfangen müsste usw. usw.   :o

Könnte mir hier nochmal jemand auf die Sprünge helfen bitte.
Perl regexp sind doch nicht so einfach zum zusammen bauen - zumindest für mich

Danke mal wieder - das nächste Mal geb ich einen aus  ;D

Grüße

Edith: Was ein : so alles ausmacht  ::)
#DbLog <SPEC1>:cum_day:::$val=~s/[\D.*]*.([\d.]*).[\D.]*.[\d.]*.[\D.]*.[\d.]*/$1/eg
und klappt.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

justme1968

das sollte auch noch ein bischen einfacher gehen :)

#DbLog <SPEC1>:cum_day:::$val=~s/^CUM_DAY..([\d.]*)/$1/eg

alles was nach dem teil kommt der dich interessiert brauchst du ja nicht mehr matchen. und den anfang kannst du in diesem fall ganz genau hinschreiben.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Puschel74

#7
Hallo,

wobei aber dann 2 unterschiedliche Plots dabei rauskommen  :o

Screenshot 1 ist die umständliche Variante (mit der ich schon froh bin das ich die überhaupt hinbekommen habe).
Screenshot 2 ist die "vereinfachte" Variante (von der ich schon froh bin das du mir immer wieder hilfst  :D ).

Grüße

Edith: Wobei deine Variante die richtige ist - wie nicht anders zu erwarten  ;D
Nu frag ich mich aber wo ich den Fehler habe  :o
Edith2: Sieht so aus als ob ich die erste Ziffer abschneide  :(
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

justme1968

ich tippe mal das liegt daran das deine version die erste stelle des wertes noch abschneidet :)

[\D_:]* matched alles bis zur ersten ziffer (das ginge übrigens auch einfacher als \D* weil _ und : auch keine ziffern sind, bzw als korrekt als [\w:]*) dann kommt ein . der matched die erste ziffer dann erst kommt deine () mit dem was dann zurück gegeben wird.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Puschel74

Hallo,

jep

Zitatich tippe mal das liegt daran das deine version die erste stelle des wertes noch abschneidet
Da hast du haarscharf ins schwarze getippt.

Ich habs nun mal so versucht:
#DbLog <SPEC1>:cum_day:::$val=~s/[\D*]*([\d.]*).[\D.]*.[\d.]*.[\D.]*.[\d.]*/$1/eg
#DbLog <SPEC2>:cum_day:::$val=~s/[\D*]*([\d.]*).[\D.]*.[\d.]*.[\D.]*.[\d.]*/$1/eg

(Die erste Variante mit \D_: hatte ich wieder verworfen als ich die Fehlermeldungen im FHEM-LogFile gesehen habe).

Das "unschöne" an deiner Variante ist das im Titel nicht nur die einzelnen CUM_DAY angezeigt werden sondern immer noch der gesamte String.
Aber ich vermute mal das ich da wieder einen copy&paste Fehler hatte.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

justme1968

nö. ich war mal wieder zu schnell :)
#DbLog <SPEC1>:cum_day:::$val=~s/^CUM_DAY..([\d.]*).*/$1/eg

das ist ja die suchen und ersetzen variante. da muss man natürlich auch bis zum ende matchen um alles zu ersetzen.

wenn du nur mit m/.../ ein teil rausholen willst reicht es nicht bis zum ende zu suchen. etwa so:#DbLog <SPEC1>:cum_day:::$val=($val=~m/^CUM_DAY..([\d.]*)/)[0];

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Puschel74

Hallo,

wenn das

Zitat#DbLog <SPEC1>:cum_day:::$val=~s/^CUM_DAY..([\d.]*).*/$1/eg

nicht geklappt hääte hätt mich das auch gewundert  ::)

Wen du jetzt noch einen Tipp hast wie ich in der sqlite3-DB einen Wert zu einem bestimmten Datum "verändern" kann wäre das die Krönung.

Problem - siehe Screenshot.
Der EM1000WZ und -GZ haben mir da wohl "etwas" falsche Werte geliefert - die würde ich an diesem Datum gerne änder damit der Rest des Plots "sichtbar" wird.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

hexenmeister

Hallo Puschel74,

mich würde Deine Plots für SYSMON mit DbLog interessieren. Wenn Du nichts dagegen hast, würde ich diese zu dem Modul selbst in GitHub einchecken, das wird bestimmt auch andere Nutzer erfreuen ;)

Grüße,

Alexander
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

justme1968

#13
mit select * from history where device='xxx'; bekommst du alle einträge aufgelistet, mit delete from history where timestamp='xxx'; und xxx durch einen timestamp aus der ersten liste kannst du eine zeile löschen.

oder mit delete from history where value>'xxx';

du solltest fhem dabei anhalten. sqlite mag keine gleichzeitigen zugriffe.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Puschel74

Hallo,

Zitatselect * from history where device='xxx';
kenn ich schon - das listet mir aber ALLES von Anbeginn der Aufzeichnung auf.

In meinen Fall laufen da jede Menge Daten durch - ich bin leider nicht so der Datenbank-Crack.
Ich hab schon gesehen das man bei select auch mehr <Bedingungen> angegeben kann.

Das schöne ist nur das das über die FHEM-Befehlszeile auch klappt - mit <get mydbLog ________>

Ich möcht jetzt nur nicht einen bestimmten timestamp löschen sondern manipulieren - wenn das geht.
Klar geht das - wenn man weiß wie  ;D

Und da bist du wieder mal gefordert  ;D

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.