[patch] 93_DbLog.pm - add FW_detailFn und SVG_sampleDataFn

Begonnen von betateilchen, 03 Mai 2014, 16:43:17

Vorheriges Thema - Nächstes Thema

betateilchen

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.

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

Tobias

Grundsätzlich wird z.Z. alles geloggt. Ausnahmen werden über DbLogExclude definiert
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

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