Logging: Bestimmte Reading-Werte NICHT loggen

Begonnen von hulzer, 09 März 2015, 15:34:32

Vorheriges Thema - Nächstes Thema

hulzer

Hallo zusammen,

lässt sich z. B. DbLog so konfigurieren, dass es bestimmte Werte eines Readings nicht loggt?

Danke,

Gruß
Hulzer

marvin78

Du kannst DbLog mit einem RegEx definieren. Außerdem gibt es das Attribut DbLogExclude (siehe Commandref).

hulzer

Das ist mir alles bekannt, nur finde ich keinerlei Beispiel zum Ausschluss eines oder mehrere Werte.

marvin78

attr DEVICE DbLogExclude READING1,READING2

Ist dir das zu anstregend, kannst du bei der Definition von DbLog einen cleveren RegEx verwenden. Es gibt gefühlt 100 Millionen Seiten im Netz, die RegEx erklären. Alles weitere steht in der Commandref.

Beispiel: http://www.danielfett.de/internet-und-opensource,artikel,regulaere-ausdruecke

hulzer

Danke,

das habe ich alles ja schon durch.

define myDbLog DbLog ./db.conf .*:(temperature|valveposition|humidity).*

Hier kann ich ja nur die Readings selbst definieren die geloggt oder nicht geloggt werden oder? Ich möchte aber z. B. der Wert 23.5 für das Reading temperature nicht loggen  :)

nesges

Eine elegante Lösung findest du in http://forum.fhem.de/index.php/topic,33697.msg264127.html#msg264127. Für eine Lösung mit mehrere Regexen siehe den Rest der Diskussion, aber lies sie vollständig - meine dort vorgestellte Lösung hat Tücken!

hulzer

Zitat von: nesges am 09 März 2015, 16:02:22
Eine elegante Lösung findest du in http://forum.fhem.de/index.php/topic,33697.msg264127.html#msg264127. Für eine Lösung mit mehrere Regexen siehe den Rest der Diskussion, aber lies sie vollständig - meine dort vorgestellte Lösung hat Tücken!

Danke für den Link, aber möchte einen Wert ausschließen und nicht das komplette Reading.

karl0123

Hast du das probiert?

define myDbLog DbLog ./db.conf .*:(temperature|valveposition|humidity).*(?!23.5)

hulzer

@karl0123
Klappt leider auch nicht; ich habe es sowohl mit DbLogExclude wie auch über die DbLog Definition versucht. Entweder geht es wirklich nicht oder ich stelle mich gerade etwas dämlich an....

betateilchen

#9
Das kann auch nicht klappen, weil DbLogExclude nur auf das Reading reagiert und nicht auf den Wert des Readings.

Was Du machen willst, geht nicht so einfach, wie Du Dir das vorstellst.

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

hulzer

Hallo,

ich habe jetzt das DbLog entsprechend erweitert und kann damit entsprechend Werte filtern:

attr DEVICE DbLogExclude READING0,READING1:300,READING2::(ERROR|0|----),READING3:200:(ERROR)

Ich werde das ganze jetzt mal ein paar Stunden laufen lassen...

Gruß

frank

du könntest auch ein zusätzliches userreading erzeugen, das nicht mit "23.5" gefüttert wird und dieses dann loggen.

mich interessiert aber gewaltig, was du gegen diesen wert hast? ist doch eigentlich eine schöne zahl.  :)
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

thedude

Hallo

die Codezeile funktioniert bei mir leider nicht:


attr PufferOben DbLogExclude failures,T,temperature:30:(85)


Das ist ein DS18B20, und den 85°C Wert schreibt er trotzdem mit in das DbLog.

Ich habe versucht, die 93_DbLog.pm zu verstehen. Die Zeile 540:


$DoIt = 0 if(!$v2[1] && $reading =~ m/^$v2[0]$/); #Reading matcht auf Regexp, kein MinIntervall angegeben


sollte eigentlich den Wert 85 auch nicht loggen, wenn meine DbLogExclude Zeile


attr PufferOben DbLogExclude failures,T,85


lauten würde. $reading wäre ja in diesem Fall "temperature: 85", und wenn ich den Operator =~ richtig verstanden habe wird geprüft, ob die 85, also $v2[0], in $reading enthalten ist.

http://www.fhemwiki.de/wiki/DbLog#Einschr.C3.A4nkung_.C3.BCber_die_jeweiligen_Devices sagt das gleiche.

Muss ich die Zeile 540 in  93_DbLog.pm so


$DoIt = 0 if(!$v2[1] && (($reading =~ m/^$v2[0]$/) || ($value =~ m/^$v2[0]$/) );


verändern damit es klappt?

Wo ist mein Denkfehler?

Danke
Thomas

Zitat von: hulzer am 09 März 2015, 22:40:24
Hallo,

ich habe jetzt das DbLog entsprechend erweitert und kann damit entsprechend Werte filtern:

attr DEVICE DbLogExclude READING0,READING1:300,READING2::(ERROR|0|----),READING3:200:(ERROR)

Ich werde das ganze jetzt mal ein paar Stunden laufen lassen...

Gruß

hulzer

So sieht mein geänderter Code aus - bisher funktioniert das wunderbar; vielleicht schafft es ja die Änderung in den offiziellen Code?


#keine Readings loggen die in DbLogExclude explizit ausgeschlossen sind
        my $DoIt = 1;
        if($DbLogExclude) {
          # Bsp: "(temperature|humidity):300 battery:3600"
          my @v1 = split(/,/, $DbLogExclude);
          for (my $i=0; $i<int(@v1); $i++)
  {
            my @v2 = split(/:/, $v1[$i]);

if (@v2 == 3) # (temp):300:(100)
{
if ($reading =~ m/^$v2[0]$/ && $value =~ m/^$v2[2]$/) #Reading und Wert matcht
{
$DoIt = 0;
next;
}
}

$DoIt = 0 if(@v2 == 1 && $reading =~ m/^$v2[0]$/); #Reading matcht auf Regexp, kein MinIntervall angegeben
if(($v2[1] && $reading =~ m/^$v2[0]$/) && ($v2[1] =~ m/^(\d+)$/))
{
  #Regexp matcht und MinIntervall ist angegeben
  my $lt = $defs{$dev->{NAME}}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{TIME};
  my $lv = $defs{$dev->{NAME}}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{VALUE};
  $lt = 0 if(!$lt);
  $lv = "" if(!$lv);

  if(($now-$lt < $v2[1]) && ($lv eq $value))
  {
# innerhalb MinIntervall und LastValue=Value
$DoIt = 0;
  }
}
          }
        }
        next if($DoIt == 0);

thedude