DbLog ausdünnen bzw. optimieren

Begonnen von dt2510, 30 Oktober 2019, 14:23:17

Vorheriges Thema - Nächstes Thema

dt2510

Ich habe vor etwas über einem Jahr von Logfiles auf ein DbLog Device umgestellt, die alten Logfiles importiert, aber noch nicht wirklich optimiert.

Hier mal meine Definition
define logdb DbLog ./db.conf .*:.*
attr logdb event-on-change-reading .*


alle Devices haben das Attribut
attr <device> event-on-change-reading .*

Sensoren zusätzlich
attr <device> event-on-update-reading batteryPercent

Wenn ich soweit alles richtig verstanden habe, werden alle Readings in die Datenbank geschrieben, und zwar
- bei Änderung des Inhaltes eines Readings
- bei erneuter Meldung des gleichen Wertes für das Reading batteryPercent

Meine Datenbank ist daher aktuell auch schon 1,2GB groß und bekommt z.B. minütlich Batteriestände eingestellt.
Um die Daten in einer erträgliche Geschwindigkeit auszuwerten, ist das natürlich viel zu viel.

Prinzipiell brauche ich für Diagramme nur Temperaturen, Luftfeuchtigkeits-, Batterie- und Verbrauchswerte (z.B. bei Steckdosen).
Diese Werte sollen auf jeden Fall bei Veränderung geschrieben werden - allerdings brauche ich auch immer einen mehr oder weniger aktuellen Wert, damit das Diagramm nicht vorzeitig abbricht.
Dieser Wert kann dann ggfs. häufiger in die Tabelle geschrieben werden (z.B. Batteriestände, die sehr lange auf 100% bleiben).

Wie schränke ich das Logging am Besten ein ?

Bei Temperatur und Luftfeuchtigkeit reicht mir denke ich ein stündlicher Eintrag, wenn der Messwert mit dem vorherigen identisch ist - bei Batterien reicht er mit 1x täglich

Kann ich das Logging für einzelne Devices auch komplett abschalten ?

marvin78

Im Define einfach ein einschränkendes Regex verwenden. So loggt es eben alles

define logdb DbLog ./db.conf .*:.*

So bspw. nur ein bestimmtes Device und Reading:

define logdb DbLog ./db.conf DEVICE:READING

Außerdem kann man mit DbLogInclude und DbLogExclude spielen. DbLog bietet auch einige Funktionen zum nachträglichen Ausdünnen. Einfach mal die Doku lesen.

dt2510

Ich hab' mal ein bisschen nachgelesen

define logdb DbLog ./db.conf .*:.*
attr logdb DbLogSelectionMode Include


würde nur Werte in die Datenbank schreiben, die explizit angegeben werden.

eine Angabe von
attr <device> DbLogInclude (temperature|humidity):3600,batteryPercent:84000

sollte demnach dafür sorgen, dass ausschließlich die Readings temperature, humidity und batteryPercent in die Datenbank geschrieben werden und zwar bei Änderung ODER wenn der letzte gespeicherte Wert identisch und mindestens 1 Stunde bzw. 1 Tag (batteryPercent) alt ist. Fehlt das Attribut sollte auch nichts in die Datenbank geschrieben werden.

Events würde ich ja auf diese Weise nicht einschränken - NUR die Protokollierung in die Datenbank oder sehe ich das falsch ?
Muss ich zusätzlich mit event-on-change/update und event-min-interval arbeiten oder führt das zu Wechselwirkungen ?

DS_Starter

Du siehst das absolut richtig.
Die von die erwähnten Attribute steuern nur die Eventprotokollierung. Die Generierung wird durch die event* Attribute beeinflusst.
Wenn du den Aufwand mit DbLogInclude nicht betreiben willst, könnte dir das excludeDevs Attribut auch noch nützen.
Proxmox+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

dt2510

Zitat von: DS_Starter am 30 Oktober 2019, 17:38:01
Du siehst das absolut richtig.
Die von die erwähnten Attribute steuern nur die Eventprotokollierung. Die Generierung wird durch die event* Attribute beeinflusst.
Wenn du den Aufwand mit DbLogInclude nicht betreiben willst, könnte dir das excludeDevs Attribut auch noch nützen.

Ich glaube DbLogInclude ist mir lieber, da hab' ich es in der Hand was in die DB läuft und was nicht.