Hallo zusammen,
lässt sich z. B. DbLog so konfigurieren, dass es bestimmte Werte eines Readings nicht loggt?
Danke,
Gruß
Hulzer
Du kannst DbLog mit einem RegEx definieren. Außerdem gibt es das Attribut DbLogExclude (siehe Commandref).
Das ist mir alles bekannt, nur finde ich keinerlei Beispiel zum Ausschluss eines oder mehrere Werte.
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)
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 :)
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!
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.
Hast du das probiert?
define myDbLog DbLog ./db.conf .*:(temperature|valveposition|humidity).*(?!23.5)
@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....
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.
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ß
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. :)
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ß
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);
Super! Klappt auch bei mir. Danke!
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
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 ;)
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