[patch] 93_DbLog.pm - add "set" commands

Begonnen von betateilchen, 25 Februar 2014, 20:08:45

Vorheriges Thema - Nächstes Thema

betateilchen

Fügt der 93_DbLog eine reopen Funktion zu, die ein commit & schließen der Datenbank mit anschließendem wiederverbinden durchführt.

Hintergrund:

Die Journaldatei kann bei längerem Gebrauch (mehrere Tage) von DbLog so groß werden, dass der Speicherplatz auf einem Einplatinencomputer knapp wird, was bis Totalausfall führen kann.

Mit "set <dbLog> reopen" kann z.B. ein at definiert werden, das einmal pro Tag (vorzugsweise nachts) ein Schließen und Wiederöffnen der Log-Datenbank durchführt.

-- edit --- Patch zur Überarbeitung entfernt
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Ich habe den ursprünglichen Patch nochmal überarbeitet, um eine einfache Möglichkeit zu schaffen, ggf. weitere Set-Kommandos zu implementieren (ich hab dazu noch ein paar Ideen im Hinterkopf)



Index: 93_DbLog.pm
===================================================================
--- 93_DbLog.pm (revision 5050)
+++ 93_DbLog.pm (working copy)
@@ -17,6 +17,7 @@
use warnings;
use DBI;
use Data::Dumper;
+use feature qw/say switch/;

my %columns = ("DEVICE"  => 64,
                "TYPE"    => 64,
@@ -34,6 +35,7 @@
   $hash->{DefFn}    = "DbLog_Define";
   $hash->{UndefFn}  = "DbLog_Undef";
   $hash->{NotifyFn} = "DbLog_Log";
+  $hash->{SetFn}    = "DbLog_Set";
   $hash->{GetFn}    = "DbLog_Get";
   $hash->{AttrFn}   = "DbLog_Attr";
   $hash->{ShutdownFn} = "DbLog_Shutdown";
@@ -1019,6 +1021,32 @@
   }
}

+sub
+DbLog_Set($@) {
+       my ($hash, @a) = @_;
+       my $name = $hash->{NAME};
+       my $usage = "Unknown argument, choose one of reopen:noArg";
+       return $usage if(int(@a) < 2);
+       my $ret;
+
+       given ($a[1]) {
+
+               when ('reopen') {
+                       my $dbh= $hash->{DBH};
+                       Log3($name, 4, "DbLog $name: Reopen requested.");
+                       $dbh->commit();
+                       $dbh->disconnect();
+                       DbLog_Connect($hash);
+                       $ret = "Reopen executed.";
+               }
+
+               default { $ret = $usage; }
+       }
+
+       return $ret;
+}
+
+
################################################################
#
# Charting Specific functions start here


-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#2
"set" Funktionalität um eine Zählfunktion erweitert

(http://up.picr.de/17502632pq.png)



sub DbLog_Set($@) {
my ($hash, @a) = @_;
my $name = $hash->{NAME};
my $usage = "Unknown argument, choose one of reopen:noArg count:noArg";
return $usage if(int(@a) < 2);
my $dbh = $hash->{DBH};
my $ret;

given ($a[1]) {

when ('reopen') {
Log3($name, 4, "DbLog $name: Reopen requested.");
$dbh->commit();
$dbh->disconnect();
DbLog_Connect($hash);
$ret = "Reopen executed.";
}

when ('count') {
my $c = $dbh->selectrow_array('SELECT count(*) FROM history');
readingsSingleUpdate($hash, 'countHistory', $c ,1);
$c = $dbh->selectrow_array('SELECT count(*) FROM current');
readingsSingleUpdate($hash, 'countCurrent', $c ,1);
}

default { $ret = $usage; }

}

return $ret;

}



Als nächstes kommen Löschbefehle, um alte Einträge zu löschen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JoeALLb

Schön wäre mE die Möglichkeit, beliebige SQL-Befehler per notify abzusetzen?
Wenn dies über dieses Modul ginge, müsste man keinen eigenes Notify mit Passwort im Klartext verwenden...
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

betateilchen

#4
kein Problem.... aber die Nutzung geht dann nur auf eigene Verantwortung  8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JoeALLb

Na klar!! :D
Hab auch schob überlegt, das ganze abzusichern, indem man zB nur stored procedures erlaubt.... aber viel zu aufwendig!!
Und wer ein "delete all" absetzt, ist selber schuld!
Damit möchte ich gerne meine Stundenzusammenfassungen der Readings in die DB schreiben.
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

betateilchen

und wer immer nur an Microsoft SQL Server denkt, ist doof...  8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JoeALLb

FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

betateilchen

ja, mag sein, ändert nichts daran, dass sqlite keine stored procedures kennt ;)

userCommand funktioniert (siehe zugehörige Readings im Screenshot)

(http://up.picr.de/17502949sr.png)

Man müsste natürlich noch eine ganze Reihe komplexerer Befehle testen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

set <dbLog> deleteOldDays <n>

Funktioniert inzwischen auch, es werden alle Einträge gelöscht, die älter als <n> Tage sind.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JoeALLb

bekomm ich eine Version zum testen?
gibt es auch mehrere Usercommands?  ;-)
Ich bräuchte je eines für: Tages-Wochen-Monats-Jahresstatistik, ...
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

betateilchen

Du kannst als userCommand eingeben, was auch immer Du möchtest, das ist ja gerade Sinn und Zweck.

Das Modul protokolliert lediglich den eingegebenen Befehl (und sein Ergebnis) als reading, damit man sich das "delete from history" danach nochmal vor Augen führen kann  ;D

Schick mir eine email hier über das Forum zweckst Testversion. Ich will die hier nicht reinstellen, um keine Verwirrung mit unterschiedlichen Versionen zu stiften, zumal es überhaupt nicht "mein" Modul ist.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JoeALLb

Zitat von: betateilchen am 28 Februar 2014, 13:52:11
Schick mir eine email hier über das Forum zweckst Testversion.


Mitglied 'betateilchen' hat deine Mitteilungen geblockt.
;-)
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

betateilchen

Ja, und weiter? Wer lesen kann, ist klar im Vorteil, guckst Du nochmal genau ...

Hatte ich EMAIL oder hatte ich PN geschrieben?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JoeALLb

Ohne deine emailadresse zu haben, nicht so einfach.
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270