FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: hulzer am 09 März 2015, 15:34:32

Titel: Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag von: hulzer am 09 März 2015, 15:34:32
Hallo zusammen,

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

Danke,

Gruß
Hulzer
Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag von: marvin78 am 09 März 2015, 15:35:42
Du kannst DbLog mit einem RegEx definieren. Außerdem gibt es das Attribut DbLogExclude (siehe Commandref).
Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag von: hulzer am 09 März 2015, 15:41:57
Das ist mir alles bekannt, nur finde ich keinerlei Beispiel zum Ausschluss eines oder mehrere Werte.
Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag von: marvin78 am 09 März 2015, 15:48:34
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 (http://www.danielfett.de/internet-und-opensource,artikel,regulaere-ausdruecke)
Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag von: hulzer am 09 März 2015, 16:00:34
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  :)
Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag 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!
Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag von: hulzer am 09 März 2015, 16:21:27
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.
Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag von: karl0123 am 09 März 2015, 16:25:20
Hast du das probiert?

define myDbLog DbLog ./db.conf .*:(temperature|valveposition|humidity).*(?!23.5)
Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag von: hulzer am 09 März 2015, 21:01:18
@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....
Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag von: betateilchen am 09 März 2015, 21:39:49
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.

Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag 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ß
Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag von: frank am 10 März 2015, 10:32:18
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.  :)
Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag von: thedude am 11 März 2015, 18:16:25
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 (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ß
Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag von: hulzer am 12 März 2015, 15:59:32
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);
Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag von: thedude am 20 März 2015, 20:12:23
Super! Klappt auch bei mir. Danke!
Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag von: AndiB am 11 Januar 2016, 21:23:41
Hallo zusammen ich möchte genau gleich wie thedude auch den Wert temperature: 85 eines 1WireOWFS DS18B20 Sensors nicht loggen. Da sich der Code von 93_DBLog.pm seit dem letzten Eintrag in diesem Thread stark verändert hat, getraue ich mich als Anfänger nicht mehr einfach den Codeblock aus der Antwort von hulzer zu kopieren und einzufügen.

kann mir jemand helfen, wie der Code heute aussehen würde, bzw frage ich gerne an, wieso es nicht in den Quellcode übernommen wurde.

Herzlichen Dank für jede Hilfe
Andi
Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag von: AndiB am 17 Januar 2016, 18:00:37
ok ... mit dem code ist es bisher nichts geworden .... Schade, wäre super, wenn das nochmals aufgegriffen würde.

Meine Lösung  des Problems sieht, da ich mit dblog arbeite wie folgt aus:

define Datenbankbereinigung1 at +*00:05:00 set logdb userCommand DELETE FROM history where EVENT = 'temperature: 85'

Dies bewirkt, das alle 5 minuten alle Werte mit Temperatur = 85 aus der datenbank gelöscht werden ....

der Codeblock von thedude im Quellcode wäre aber viel besser!! Ich gebe die Hoffnung noch nicht auf  ;)

Titel: Antw:Logging: Bestimmte Reading-Werte NICHT loggen
Beitrag von: Gizmoh am 18 Januar 2016, 12:36:30
Gibt es evtl auch die Möglichkeit leere werte auszuschließen?
Ich habe bei mir das Problem mit MAX Thermostaten, die bekommen bei mir mit
set MAX_03bc87 desiredTemperature auto
den Automatikmodus. In der Datenbank wird "auto" nicht abgelegt (was gut ist), dafür wird aber ein leerer Value geschrieben, was dann bei den Plots zu fehlern führt.

Danke und Grüße
Gizmoh