Hi,
ich habe ein DbRep device, über das ich verschiedene SQL-Kommandos auf meine MySQL Db loslasse. Dafür verwende ich Perl Code wie z.B.:
sub getIrrigationTimeLastDaysFromDatabase($$)
{
my ($numDays, $event) = @_;
my $dbRepDevice = 'dbrep_rain';
my $sqlCmd = "SELECT SUM(VALUE) FROM history WHERE DEVICE = 'mqtt2_pi_relay' and READING = '$event' and DATE_SUB(CURDATE(), INTERVAL $numDays DAY) <= TIMESTAMP";
my $ret = fhem("get $dbRepDevice sqlCmdBlocking $sqlCmd");
return $ret ? $ret : 0;
}
Diese Funktion wird relativ häufig (ca. alle 10min) aufgerufen. Scheinbar kommt jedes mal wenn das passiert folgende Meldung im Log:
2022.05.02 09:36:01 3: get dbrep_rain sqlCmdBlocking SELECT SUM(VALUE) FROM history WHERE DEVICE = 'mqtt2_pi_relay' and READING = 'drip_hedge_front' and DATE_SUB(CURDATE(), INTERVAL 3 DAY) <= TIMESTAMP : 30
Aufgrund der Häufigkeit ist das relativ störend. Ich habe schon versucht das über das Attribut "verbose" des DbRep device zu unterbinden, das scheint aber nicht zu funktionieren.
Wie kann ich die Log-Messages weg bekommen?
Vermutlich startest du die Funktion über ein at oder notify Device.
Du müsstest den verbose Level in _diesem_ Device auf 2 setzen.
Hm. Also das auslösende device ist in meinem Fall ein DOIF. Dieses hat userReadings, welches bei Triggerung berechnet werden, und im Zuge dieser Berechnungen wird obige Funktion aufgerufen.
Ich habe das verbose vom DOIF mal auf 2 gestellt, aber die Meldungen werden leider immer noch gelogged... :-(
DOIF kenne ich jetzt nicht, evtl. dort mal fragen.
Aber generell gibst du mit
my $ret = fhem("get $dbRepDevice sqlCmdBlocking $sqlCmd");
return $ret ? $ret : 0;
immer den SQL-Aufruf zurück. Das brauchst du m.M. nach nicht, d.h. ich weiß natürlich nicht wofür.
Am einfachsten gibst du nichts zurück, also:
my $ret = fhem("get $dbRepDevice sqlCmdBlocking $sqlCmd");
return;
DAmit sollte das Log stumm sein.
Oder du verwendest diese Form um das Ergebnis der Berechnung zu retouren:
my $ret = CommandGet(undef,"$dbRepDevice sqlCmdBlocking $sqlCmd");
return $ret;
Es wird dann vermutlich aber auch im Log erscheinen.
Ok. Also das SQL-Kommando gibt aufgrund der SUM() Funktion ja immer einen einzelnen Wert zurück, den die Funktion zurück liefern soll. Der Gedanke hinter dem
return $ret ? $ret : 0
war der, dass wenn gar kein Eintrag in der Datenbank gefunden wird, eine 0 zurück gegeben wird, denn mit dem Wert wird später weiter gerechnet. Ansonsten gab es sowas wie "uninitialised value" warnings. Ich habe es jetzt mal so geändert wie vorgeschlagen:
my $ret = CommandGet(undef,"$dbRepDevice sqlCmdBlocking $sqlCmd");
return $ret;
Damit kommt weder eine warning, noch erscheint die Log Meldung, also eigentlich genau das, was ich brauche.
Verstehe ich jetzt nicht zu 100%, aber zumindest passt es so :-) Danke!
Schonmal gut :)
Dann noch so verbessern:
my $ret = CommandGet(undef,"$dbRepDevice sqlCmdBlocking $sqlCmd");
return $ret ? $ret : 0;
oder vllt. noch besser:
my $ret = CommandGet(undef,"$dbRepDevice sqlCmdBlocking $sqlCmd") // 0;
return $ret;
Einfach mal probieren.
Danke!
Wieder was gelernt, ich kannte diese Defaultwert-Syntax gar nicht :D
Habe es jetzt so geändert:
return CommandGet(undef,"$dbRepDevice sqlCmdBlocking $sqlCmd") // 0;