93_DbLog - Überlegungen zur Optimierung (RPI und andere Systeme)

Begonnen von JoeALLb, 27 Januar 2017, 22:16:19

Vorheriges Thema - Nächstes Thema

DS_Starter

Hallo Joe & stromer-12,

danke für euren Input. Ich werde mal eine Testversion bauen.

Bezüglich der Zeile

$lv = "" if(!$lv);

bin ich der Meinung dass auch


$lv = "" if(!defined($lv));


nicht zu dem gewünschten Ziel führt. Aber wir können es probieren ... ich baue es mal ein und wir sehen und das Ergebnis an.
Im Normalfall arbeitet DbLog mit DbLogSelectionMode=Exclude, d.h. es wird alles geloggt was mit dem Regex von DEF matcht wenn man in dem Quelldevice nicht explizit DbLogExclude gesetzt hat.

Das bedeutet auch, dass im Normalfall nicht in den If-Zweig (Zeile 1052) gegangen wird in dem die Zuweisung "$lv = "" if(!$lv);" stattfindet.
Habt ihr denn DbLogExclude gesetzt ? Und wenn ja ... verwendet ihr dabei ebenfalls die MinInterval-Angabe ?

Ich muß das auch mal ausprobieren. Brauche ich normal nicht.

Grüße
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

JoeALLb

#226
Hallo Heiko,

ich nutze das immer öfter.
Bisher nutzte ich oft "event-on uptate" und ggf. "event-min-interval"um zu häufige events nicht zu loggen.
Jetzt werden aber immer häufiger Devices miteinander verknüpft (telegramBot mit postMe, telegramBot mit TALKTOME, etc...).
Diese reagieren oft allergisch auf fehlende Events... daher muss ich dies öfter auf DbLogExclude mit angegebenem miInterval anpassen.

Ich verhindere damit, zu seltenes und auch zu häufiges Loggen von gleichen Werten, im Sommer ist das die 0 für off bei der Heizung.
2 Einträge pro Tag hätte ich jedoch trotztdem gerne, damit Plots dargestellt werden können...

wenn es die addLog-Routine für DbLog gibt, und ich damit um Mitternacht nötige Zusatzlogeinträge generiere, möchte ich diese minInterval-Zeiteinheiten rücksetzen können... aber das ist wohl de rnächste Schritt.

Ich habe meinen Patch oben jetzt seit ein paar Stunden im Einsatz, und hoffe nichts vergessen zu haben. Probleme kann ich jedoch aktuell nicht feststellen...
Ich stelle mir nur die Frage, ob man der Konsistenz halber auch hier die Verarbeitungszeit mitloggen sollte? Jedoch vergeht diese bei mir immer noch recht schnell!

Ich denke schon, dass uns
$lv = "" if(!defined($lv));
helfen wird... nächste Woche werde ich mich intensiv am Testen beteiligen können!

Noch etwas, was mit beim Zusammensuchen des Codes hier aufgefallen ist:

Sollten diese beiden Zeilen (gemeint sind die die SQL-Befehle)
      # insert current mit/ohne primary key, insert-values für current werden generiert
  if ($usepkc && $hash->{DBMODEL} eq 'MYSQL') {
          eval { $sth_ic = $dbh->prepare("INSERT IGNORE INTO current (TIMESTAMP, DEVICE, TYPE, EVENT, READING, VALUE, UNIT) VALUES (?,?,?,?,?,?,?)"); };  

und
  if ($usepkc && $hash->{DBMODEL} eq 'MYSQL') {
      # update current (mit PK), insert-values für current wird generiert
  $sth_uc = $dbh->prepare("REPLACE INTO current (TIMESTAMP, DEVICE, TYPE, EVENT, READING, VALUE, UNIT) VALUES (?,?,?,?,?,?,?)");

nicht duch einen einzigen in der Form von

INSERT INTO current (TIMESTAMP, DEVICE, TYPE, EVENT, READING, VALUE, UNIT) VALUES (?,?,?,?,?,?,?)")
ON DUPLICATE KEY UPDATE VALUE=VALUES(VALUE), timestamp=VALUES(timestamp);


Durch "ON DUPLICATE KEY UPDATE" wird das Update gleich im selben Durchgang gemacht und eine zweite Kontaktaufnahme mit dem Server wird nicht notwendig...
Ich habe es aber nicht konkret getestet, wollte vorher eure Meinung hören.

schöne Grüße
Joe
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

DS_Starter

#227
Hallo zusammen,

so ... habe eine Testversion erstellt mit den folgenden Ergänzungen

* in dem Exclude / Include-Zweig auf "$lv = "" if(!defined($lv));" umgestellt wie von stromer-12 vorgeschlagen

* neues Attribut "valueFn"
 
Für das Attribut valueFn habe ich noch den perlSyntaxCheck eingebaut. Dadurch wird gleich bei der Erstellung der Funktion die Validität geprüft.
Innerhalb der valueFn hat man Zugriff auf alle Log-Werte über die Variablen $TIMESTAMP, $DEVICE, $DEVICETYPE, $EVENT, $READING, $VALUE, $UNIT.   
Verändern kann man auch alle außer $TIMESTAMP und  $EVENT.
Ich halte es für gut wenn der Nutzer den gelieferten $TIMESTAMP nicht verändern kann um möglichen Fehlern durch die Veränderung vorzubeugen. Und $EVENT bleibt zum Vergleich somit immer unverändert.

@Joe ... die Verarbeitungszeit der DbLog-Schleife kann man bisher bereits mit dem Attribut showNotifyTime einschalten.
Die Zusammenfassung der DB-Befehle kann ich nochmal testen wenn ich wieder Zeit habe. Aber wenn mich nicht alles täuscht hatte ich das schon mal so versucht. Kann aber auch etwas anderes gewesen sein ... vermag mich bei den ganzen Änderungen nicht mehr so recht erinnern.

Dann testet es mal und ich bin gespannt auf eure Ergebnisse. (Commandref kommt später)

EDIT: Habe noch den Wunsch von Andreas https://forum.fhem.de/index.php/topic,69781.msg614746.html#new eingebaut

viele Grüße
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

JoeALLb

#228
Hallo zusammen, Hallo Heiko,

danke für die neue Version...
bezüglich den unveränderbaren Timestamps: genau diese Funktion nutze ich aktuell um um Mitternacht Logeinträge zu schreiben...
Da um Mitternacht viel zu tun ist, wird das Notify manchmal erst um 00:00:01 tatsächlich gespeichert, was dann zu Plot-Abbrüchen kommt.
In diesem Fall habe ich das Timestamp auf 00:00:00 umgeschrieben.

Da dies aber nur eine Übergangslösung für mich war, werde ich mir wohl bald auch das addLog ansehen, vielleicht komme ich da einen Schritt weiter...

Anbei ein Vorschlag für Commandref, kann gerne ergänzt oder verändert werden.
Ich arbeite auch noch an anderen Beispielen, vielleicht habe ich morgen noch mehr.


valueFn
perl expresion that can use and change values for $DEVICE $DEVICETYPE, $READING, $VALUE and $UNIT.
It also has readonly-access to $TIMESTAMP and $EVENT.
Example: (change off to 0, round e-power to 1f)
attr sqlLogDevice valueFn {if ($DEVICE eq "living_Clima" && $VALUE eq "off" ){$VALUE=0;} elsif ($DEVICE eq "e-power"){$VALUE= sprintf "%.1f", $VALUE;;}}

FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

DS_Starter

Zitatbezüglich den unveränderbaren Timestamps: genau diese Funktion nutze ich aktuell um um Mitternacht Logeinträge zu schreiben...

uups ... sorry  ;)  ... kannst dir die Zeile 1154 einfach entkommentieren.


      my $res = eval $value_fn;
  Log3 $name, 2, "DbLog $name -> error valueFn: ".$@ if($@);

--->       # $timestamp= $TIMESTAMP  if($TIMESTAMP ne '');
      $dev_name = $DEVICE     if($DEVICE ne '');
      $dev_type = $DEVICETYPE if($DEVICETYPE ne '');
      # $event    = $EVENT      if($EVENT ne '');


Danke für den Commandref-Vorschlag. Morgen habe ich sicherlich wieder etwas mehr Zeit und kann mir auch mal die Sache mit dem addlog anschauen und evtl. einbauen.

Grüße
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

JoeALLb

Hallo Heiko,

Zitat von: DS_Starter am 02 April 2017, 14:33:22
uups ... sorry  ;)  ... kannst dir die Zeile 1154 einfach entkommentieren.

Danke, das hatte ich gefunden :D.
Noch etwas ist mir brim Einsatz eingefallen: Ich möchte gewisse Werte(state) NICHT loggen. fileLog loggt diese nicht, DbLog manchmal schon.Manchmal nimmt DbLog bei unbekannten Devices auch einfach an, es könnte sich um STATE handeln. Schön wäre also noch (als Wunsch), wenn ich $VALUE auf undef setze, dass dann dieser Logeintrag komplett ignoriert wird.
Hast Du dazu eine Idee? Eigentlich müsste man nur die FOR-Schleife aus 1060 verlassen, oder?

schöne Grüße
Joe
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

DS_Starter

ZitatHast Du dazu eine Idee? Eigentlich müsste man nur die FOR-Schleife aus 1060 verlassen, oder?

So einfach nicht. Es wird immer ein ganzer Block von Events die ein Device liefert (bzw. die Funktion deviceEvents) abgearbeitet und mittels array-insert in die DB geschrieben. Da müssen wir uns ein bisschen was ausdenken .... aber heute nicht mehr, muß los ...

Bis später,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Omega

Mein Skiurlaub ist – leider – vorbei.
Dafür komme ich jetzt aber auch wieder zum Testen. Auch ich hatte ja Fehler bei plotfork=1 gemeldet und kann nun – wie ja andere auch schon – bestätigen, dass diese Fehler mit der Version 2.14.4 weg sind. Super!

Und danke
Holger
NUC6i3SYH (FHEM 5.8 in VM)
Homematic: HMLAN, HMUSB, HM-Sec-SD, HM-CC-RT-DN, HM-TC-IT, ... + diverse weitere
LaCrosseGateway, ESPEasy
ZWave

DS_Starter

Hi Joe, @all,

es ist mir über Nacht eine Idee gekommen wie man einen Logeinrag ignorieren kann.

Für die valueFn habe ich noch eine setzbare Variable $IGNORE eingeführt. Wenn man in der Funktion diese Variable setzt wird der Datensatz, auf den diese Logik zutrifft, nicht geloggt.

Also zum Beispiel um Reading state von Device SMA_Energymeter nicht zu loggen:


{
  if ($DEVICE eq "SMA_Energymeter" && $READING eq "state"){
    $IGNORE=1;
  }
}


Hier die neue Testversion ....

Grüße
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

JoeALLb

Hallo Heiko,
Zitat von: DS_Starter am 03 April 2017, 08:34:40

    $IGNORE=1;


Hier die neue Testversion ....

sehr cool, danke! Ich habe einen Stromzähler, der bei Funkproblemen "-1" sendet.., was mir jegliche Plots "versaut", denn die Summe beim nächsten
funktionierenden Funkkontakt stimmt trotzdem. Dafür kann ich das auch gleich nutzen! :D
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Alibaba

Hallo Heiko,

vielen Dank für deine Änderung für ZWAVE-Module. Jetzt wird Value und Unit richtig gespeichert.
Den anderen Thread schließe ich.

Gruß
Andreas

DS_Starter

Hallo miteinander,

in der angehängten Version 2.16.0 gibt es einen neuen set-Befehl "set addLog".
Über dieses Kommando kann man z.B. per At zu einem bestimmten Zeitpunkt ein Reading eines Quelldevices in die
DB loggen lassen. Die valueFn wirkt dabei ebenfalls. Unterschied zum addlog im Wiki ist, dass nicht mit trigger gearbeitet wird
und damit keine zusätzlichen Events erzeugt werden.

Aufrufsyntax ist:

set <DbLog-Device> addLog <Devspec>,<Reading>,<[Unit]>

Also zum Beispiel:

set LogDB addLog SMA_Energymeter,Bezug_Wirkleistung,W

Die Angabe der Einheit als letzter Parameter ist optional. Das Device kann wieder als Devspec angegeben werden.
D.h. mit:

set LogDB addLog TYPE=IT,state

bekäme man für alle IT-Devices den state geloggt. Dabei wird TYPE und EVENT fix auf "addlog" gesetzt. Damit erkennt man in der DB auch leicht den Ursprung.

Ein AT könnte so aussehen:


defmod at.addlog.1 at *23:59:59 set LogDB addLog SMA_Energymeter,Bezug_Wirkleistung,W
attr at.addlog.1 room DbLog


Die Commandref für die valueFn hab ich hier bereits eingearbeitet.

Frage .... gibt es schon Erkenntnisse ob die Änderung "$lv = "" if(!defined($lv));" in DbLogExclude / DbLogInclude irgendetwas gebracht hat ?

Viel Spaß beim Testen und natürlich gerne wieder Feedback.
Danke für eure bisherigen Rückmeldungen !

Grüße
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

JoeALLb

Hallo Heiko,

vielen Dank! Ich habe versucht es ausgiebig zu testen, was mir aufgefallen ist ist:

1: Wenn ich addLog oder commitCache absetze, bekomme ich im FHEM häufig die Meldung "Connection lost retrying after 5 sek". Ich habe auf diesem Gerät longpoll auf websocket gestellt. Negativen Effekt bis auf den Optischen hat es jedoch vermutlich keinen.
2: excludeDevs

attr sql widgetOverride excludeDevs:textField-long
attr sql excludeDevs global\
TYPE=SONOSPLAYER\
TYPE=SONOS\
TYPE=DOIF

funktioniert bei mir nicht. (Achtung, die \ encoden nur den Zeilenwechsel in der fhem.cfg, in der Oberfläche werden diese nicht angezeigt.) "DOIFS" werden weiterhin geloggt. Ohne Zeilenwechsel mit , als Trenner funktioniert es. Zeile 1030 dürfte hier nicht greifen...
3: kleiner Hinweis zur Beschreibung: TYPE und EVENT werden auf "addLog", nicht "addlog" gesetzt. Ist auch stimmiger so!
4: Thema Timestamp: Leider schaffe ich es nicht, den Timestamp veränderbar zu machen. Ich habe dazu
$timestamp = $TIMESTAMP     if($TIMESTAMP ne '');
in Zeile 1162 eingefügt, ohne Erfolg. @Heiko, hast Du dazu eine Idee? Glaubst du wirklich, dass dies auf readonly gesetzt werden sollte? Eigentlich sehe ich da kein Risiko....
5: listCache ist nicht nummerisch sortiet. Die Daten werden als
1
10
100

angezeigt.
6: Ich hätte einen Einsatzbereich, wo addLog auch mit einem konkreten Wert, in meinem Fall der 0 geschrieben werden sollte. Dies Ist für mich persönlich aber nicht überaus wichtig, und muss jetzt nicht direkt mit entwickelt werden.
  In dem Fall wird der aktuelle Stromverbrauch regelmäßig geloggt. Wenn ich also um 23:58 100W Strom verbrauche, sollte ich das um 00:00 nicht nochmals auf 100W setzen, sondern auf 0. um 00:02 wird dann wieder der aktelle und korrekte Verbrauch geloggt. Ohne die 0 um Mitternacht würde ich den Stromverbrauch fälschlicherweise um 100W erhöhen, er wäre also höher als das Reading "Tagesverbrauch".
Ich denke,
set <DbLog-Device> addLog <Devspec>,<Reading>,<[Unit]>,<[Value]>
wäre auch möglich, mit ",," könnte man die Units ja auch leer lassen.

Vielen Dank für die neue Version!!!

schöne Grüße
Joe
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

DS_Starter

#238
Hi Joe,

Zu 1:
Den Effekt habe ich auch bei mir, aber unabhängig von DbLog, generell. Deswegen benutze ich noch das longpoll=1.
Habe allerdings im Forum nicht nach Lösungsansätzen gesucht ... immer was anderes was vorgeht.

Zu2:

Hast du es mal so versucht:


attr sql widgetOverride excludeDevs:textField-long
attr sql excludeDevs global\
TYPE=SONOSPLAYER,\
TYPE=SONOS,\
TYPE=DOIF


Zu 4:  muss ich mir im Code anschauen wenn ich wieder zu Hause bin.

Zu5:
Das ist doch numerisch sortiert 😉
Aber ich weiss was du sagen willst. Geht IMHO mit führenden Nullen zu verbessern, aber den Aufwand will ich nicht treiben.

Zu 6:

Muss die addLog Funktion wahrscheinlich nochmal ändern. Das mit unit ist unschön gelöst weil eine evtl vorhandene DbLog_splitFn nicht berücksichtigt wird. Das mach ich anders und kann die Sache von dir dann mit vorsehen.

Grüße
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

JoeALLb

#239
Zitat von: DS_Starter am 04 April 2017, 12:45:04
Zu2:

Hast du es mal so versucht:
Ja, selbes Ergebnis.

Mit folgendem Patch funktioniert es bei mir. (habe sicherheitshalber vor und nach dem \n noch Leerzeichen erlaubt, kann aber weggelassen werden)

--- C:/Users///93_DbLog_V2.16.0.pm Tue Apr 04 10:43:22 2017
+++ C:/Users///93_DbLog_V2.16.1.pm Tue Apr 04 13:25:38 2017
@@ -1026,8 +1026,9 @@
   
   # Devices ausschließen durch Attribut "excludeDevs" (nur wenn kein $hash->{NOTIFYDEV} oder $hash->{NOTIFYDEV} = .*)
   if(!$hash->{NOTIFYDEV} || $hash->{NOTIFYDEV} eq ".*") {
-      my @exdvs = devspec2array(AttrVal($name, "excludeDevs", ""));
-   for(@exdvs){s/\n/,/g}
+      my $attrExc = AttrVal($name, "excludeDevs", "");
+      $attrExc =~ s/\s*\n\s*/,/g;
+      my @exdvs = devspec2array($attrExc);
  if(@exdvs) {
      # Log3 $name, 4, "DbLog $name -> excludeDevs: @exdvs";
      foreach (@exdvs) {




Zitat von: DS_Starter am 04 April 2017, 12:45:04
Zu5:
Das ist doch numerisch sortiert
Aber ich weiss was du sagen willst. Geht IMHO mit führenden Nullen zu verbessern, aber den Aufwand will ich nicht treiben.

Sicher? Ich hatte es so im Kopf ...
Nummerisch wäre 8,9,10,11; Alphabetisch wäre 1,10,2,20,3,4,A,B,a,b; , Alphanumerisch wäre 1,2,3,4,10,20,A,a,B,b;
Wie auch immer... ich dachte dass der memCache direkt eine Sortierung (nach Einfügereihenfolge) hat, dies lediglich aus irgendeinem Grund vor der Ausgabe nochmal umsortiert wird. So wichtig ist das tatsächlich nicht, hatte mich nur beim Debuggen verwirrt, da ich dachte, mir fehlen Einträge.
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270