Damit man, wie hier im Screenshot zu sehen, künftig auch aus der Detailansicht eines DbLog direkt in den SVG Editor springen kann
(http://up.picr.de/18166379qb.png)
schlage ich folgenden Patch vor:
EDIT: patch entfernt, neue Version im nächsten Beitrag
- die erforderliche Vorlage templateDB.gplot wurde von mir bereits eingecheckt
- die Funktion für die Bereitstellung von Beispieldaten wird nachgereicht, wobei deren Sinnhaftigkeit bei DbLog noch nicht richtig abschätzen kann
Hier noch die Erweiterung für die sampleData
(http://up.picr.de/18169033jn.jpg)
Hallo betateilchen,
Danke für diesen Patch. Ich halte es für sehr Sinnvoll, zur Kontrolle auch die Sampledata zu sehen.
Was ich noch nicht verstanden habe, ist eine bestimmte Spalte aus der Ergebniszeile auszuwählen.
Ich will die sysmon Daten auf DbLog umstellen und komm da nicht weiter.
Wie muss ich die #DbLog Zeile in der gplot Datei anpassen um z.B. aus der Zeile 'Total: 3745.44 MB, Used: 572.84' den Totalwert bzw den Used Wert zu bekommen?
Wenn ich aus dem dropdown 'Device:Reading' auswähle kommt immer eine 0-Linie. Außer ich wähle ein Reading aus das in der ersten Spalte numerische werte stehen hat (auch da kann ich nur die erste Spalte auswählen)
Peter
Du solltest in DbLog die Einzelreadings "Total" und "Used" verwenden und nicht mit Spalten arbeiten - da ist etwas Umdenken angesagt. Falls das Modul solche Einzelreadings nicht bereitstellt, sollte der Modulautor das nachholen.
DbLog versucht bereits beim Loggen, aus den generierten Events die Werte "reading" "value" "unit" zu trennen, sodass Du dann in #DbLog nur noch die <device>:<reading> Kombination angibst, um den entsprechenden Wert zu plotten.
Hi Udo,
folgendes Statement im diff würde bei den meisten für die nächsten minuten bis Stunden, je nach DB-Größe und CPU den FHEM-Server lahmlegen:
select device,reading,value from history where device <> '' group by device,reading order by timestamp desc
Hier erfolgt faktisch ein "full table scan"
Mindestens ein Device und ein Zeitintervall muss angegeben werden.
Bei mir zb. würden 11Mio Datensätze selektiert werden. Ev. wäre es besser die Tabelle current zu nutzen.. Da steht alles drin, aber nur 1 sample. Dafür aber nach ein paar Millisekunden....
ja, ich weiss, dass das select problematisch ist. aber eine richtig gute Lösung ist mir noch nicht eingefallen. Die current scheidet aus Logikgründen genauso aus wie eine beliebig gewählte Eingrenzung. Aber ich werde nochmal zwei andere Ansätze testen. Den ersten Teil kannst Du aber ja schon übernehmen. übrigens: bei den Datenmengen, mit denen ich in meiner täglichen Arbeit zu tun habe, sind 11 Mio Datensätze geradezu lächerlich 8)
bei mir sind berufsbedingt 11Mio auch übelst lächerlich, aber da ist auch kein RPI bzw eine IConnect mit 1Ghz ARM CPU im Einsatz ;)
Nun habe ich drei weitere Varianten für die Beschaffung von Beispieldaten getestet, keine davon hat mich richtig glücklich gemacht. Ich habe mich nun dazu durchgerungen, doch die current zum Lesen zu verwenden. Das bedeutet natürlich, dass in dem Fall, wo ein Anwender sein DbLog so attributiert hat, dass nur History geschrieben wird, keine sample data zur Verfügung stehen. In dem Fall wird eine Zeile zur freien Eingabe der device:reading Parameter angeboten und ein entsprechender Hinweis ausgegeben:
(http://up.picr.de/18192293wh.png)
Das ist für mich ein vertretbarer Kompromiss und dem Anwender wird eindeutig signalisiert, warum er keine Beispieldaten und keine Dropdownliste zur Auswahl hat.
Einverstanden? Wenn ja, baue ich später nochmal ein diff. Muss dazu erst noch ein bisschen Debugging-Code aus meinem Coding entfernen.
Bin zufrieden ;)
Gesendet von meinem ALCATEL ONE TOUCH 997D mit Tapatalk
Hier kommt der versprochene patch :)
Ich habe gleich noch zwei Dinge eingebaut:
- Umstellung auf generisches FileRead, d.h. man muss im Modul nicht mehr auf configDB oder Konfigurationsdatei unterscheiden
- Das Splitten des Events kann nun im zugehörigen Gerätemodul erfolgen, sofern dieses Modul eine $hash->{DbLog_splitFn} bereitstellt
Zu Punkt 2: Der entscheidende Vorteil von DbLog_splitFn ist, dass ich bereits als Modulautor dafür sorgen kann, dass 93_DbLog die Daten "meines" Moduls richtig loggt und nicht bei jedem neuen Modul / Readingtyp das DbLog modifiziert werden muss, um das Splitten durchzuführen. Bei der aktuell anhaltenden inflationären Modulflut wird nämlich 93_DbLog irgendwann in diesem Punkt völlig unwartbar. Vermutlich wird diese Möglichkeit auch noch im Zusammenhang mit der aktuell von Boris stattfindenden Entwicklung RTypes hilfreich werden.
Kann das sein das du schon in einem Patch vorher den Status des defines von "active" auf "connected" gesetzt hast?
Bin gerade drüber gestolpert da einige Abfragen darauf nicht mehr funktionieren...
Jetzt nochmal mit einer richtigen Tastatur, auf dem Handy zu schreiben ist einfach eine Strafe ...
Die Änderung in "state" kam im Zusammenhang mit dem "Warten auf die Verbindung". Es ging darum, einen tatsächlich aussagekräftigen Inhalt in "state" zu haben. Das DbLog_Define() setzt den state ausschließlich auf "waiting for connection", bevor es die Kontrolle dann an DbLog_Connect() übergibt und sich danach nicht mehr um state kümmert.
In DbLog_Connect() wird der state auf "connected" gesetzt, sobald die Verbindung zur Datenbank erfolgreich hergestellt wurde.
Die blosse Anzeige "active" im state ist einfach nicht mehr korrekt interpretierbar, denn auch das Warten auf die Verbindung ist ein Zustand, in dem das definierte Device aktiv ist.
eingecheckt, sollte morgen dann verfügbar sein...
danke.
Bei der SVG_sampleDataFn besteht noch Optimierungspotenzial, aber für den Anfang funktioniert sie erstmal, und das war mir die Hauptsache.
Ist auch hier ergänzt:
http://www.fhemwiki.de/wiki/DevelopmentModuleIntro#X_DbLog_splitFn
Hallo Tobias,
hast Du einen Tipp für mich, was ich aus der splitFn als ($reading,$value,$unit) zurückliefern muss, damit ein $event überhaupt nicht geloggt wird? Ich dachte aus dem Verständnis von DbLog, wenn ich Leerstrings oder undef zurückgebe, sollte eigentlich nichts geloggt werden. Das funktioniert aber nicht wie gewünscht.
Grundsätzlich wird z.Z. alles geloggt. Ausnahmen werden über DbLogExclude definiert
Das mit DbLogExclude kenne ich schon, aber ich möchte gerne in der modulspezifischen splitFn entscheiden können, dass bestimmte Dinge nicht geloggt werden, weil es einfach events gibt, deren Logging keinen Sinn macht. Z.B. die ewig langen Wetterwarnmeldungen aus dem GDS Modul, die ohnehin nicht in die Datenbank passen. Bin gerade dabei, die splitFn für mein GDS Modul zu bauen.
So lässt sich die Aufgabenstellung ganz einfach lösen:
Index: 93_DbLog.pm
===================================================================
--- 93_DbLog.pm (revision 5790)
+++ 93_DbLog.pm (working copy)
@@ -138,16 +138,17 @@
my $reading;
my $value;
my $unit;
+ my $ignore;
my $dtype = $defs{$device}{TYPE};
if($modules{$dtype}{DbLog_splitFn}) {
# let the module do the job!
Log 4,"DbLog_ParseEvent calling external DbLog_splitFn for type: $dtype";
no strict "refs";
- ($reading,$value,$unit) =
+ ($reading,$value,$unit,$ignore) =
&{$modules{$dtype}{DbLog_splitFn}}($event);
use strict "refs";
- @result= ($reading,$value,$unit);
+ @result= ($reading,$value,$unit,$ignore);
return @result;
}
@@ -514,6 +515,10 @@
my $reading= $r[0];
my $value= $r[1];
my $unit= $r[2];
+ # $ignore can be set by DbLog_splitFn
+ # to prevent logging of current event
+ my $ignore = $r[3] if(defined($r[3]));
+ next if(defined($ignore) && $ignore == 1);
if(!defined $reading) { $reading= ""; }
if(!defined $value) { $value= ""; }
if(!defined $unit || $unit eq "") {
Damit kann splitFn optional ein $ignore=1 zurückliefern und DbLog wird dadurch den aktuellen $event ignorieren - im Prinzip die gleiche Vorgehensweise wie bei DbLogExclude, nur für den Einzelfall direkt von splitFn gesteuert.
*schubs*
was meinst Du zu dem Vorschlag?