Regelmäßiges Löschen von DB-Einträgen mit Ausschluss von best. Devices (DBRep)

Begonnen von der-pw, 22 September 2018, 13:21:47

Vorheriges Thema - Nächstes Thema

der-pw

Hallo in die Runde!

Das Löschen von DB-Einträgen mit Ausschluss meiner Wetterstation habe ich unter "SQLite" über ein at mit folgendem Eintrag geregelt
delete from history where TIMESTAMP < datetime('now', '-90 days') and DEVICE <> 'ESPEasy_Blkn_Wetterstation_Env'

Vor kurzem habe ich auf MySQL umgestellt und nebenbei DBRep als mächtiges Tool kennen- und lieben gelernt.
Über einen Punkt stolpere ich aber gerade.
Unter https://wiki.fhem.de/wiki/DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten#.28regelm.C3.A4.C3.9Figes.29_l.C3.B6schen_von_Datenbanks.C3.A4tzen
wird auch gut erklärt wie die DB-Einträge älter als n Tage löschen lassen und mit dem Attribut "device" auch noch sehr schön eingegrenzt.
Ich möchte aber nicht die Devices bestimmen, sondern lediglich eines vom Löschen ausschließen und habe gerade keine Idee wie ich das löse.

Vielleicht kann mir jemand die Augen öffnen?

yersinia

Hi,
für DbRep benötigst du doch DbLog, oder? Hier könnte zB reduceLog bzw. reduceLogNbl helfen (löscht aber nur alle bis auf einen Eintrag/Stunde):
Zitatset <name> reduceLog <no>[:<nn>] [average[=day]] [exclude=device1:reading1,device2:reading2,...]

    Reduziert historische Datensätze, die älter sind als <no> Tage und (optional) neuer sind als <nn> Tage auf einen Eintrag (den ersten) pro Stunde je Device & Reading.
    Innerhalb von device/reading können SQL-Wildcards "%" und "_" verwendet werden.

    Das Reading "reduceLogState" zeigt den Ausführungsstatus des letzten reduceLog-Befehls.

    Durch die optionale Angabe von 'average' wird nicht nur die Datenbank bereinigt, sondern alle numerischen Werte einer Stunde werden auf einen einzigen Mittelwert reduziert.
    Durch die optionale Angabe von 'average=day' wird nicht nur die Datenbank bereinigt, sondern alle numerischen Werte eines Tages auf einen einzigen Mittelwert reduziert. (impliziert 'average')

    Optional kann als letzer Parameter "exclude=device1:reading1,device2:reading2,...." angegeben werden um device/reading Kombinationen von reduceLog auszuschließen.

    Optional kann als letzer Parameter "include=device:reading" angegeben werden um die auf die Datenbank ausgeführte SELECT-Abfrage einzugrenzen, was die RAM-Belastung verringert und die Performance erhöht.

        Beispiel:
        set <name> reduceLog 270 average include=Luftdaten_remote:%

    ACHTUNG: Es wird dringend empfohlen zu überprüfen ob der standard INDEX 'Search_Idx' in der Tabelle 'history' existiert!
    Die Abarbeitung dieses Befehls dauert unter Umständen (ohne INDEX) extrem lange. FHEM wird durch den Befehl bis zur Fertigstellung komplett blockiert !


set <name> reduceLogNbl <no>[:<nn>] [average[=day]] [exclude=device1:reading1,device2:reading2,...]

    Führt die gleiche Funktion wie "set <name> reduceLog" aus. Im Gegensatz zu reduceLog wird mit FHEM wird durch den Befehl reduceLogNbl nicht mehr blockiert da diese Funktion non-blocking implementiert ist !

    Hinweis:
    Obwohl die Funktion selbst non-blocking ist, muß das DbLog-Device im asynchronen Modus betrieben werden (asyncMode = 1) um FHEM nicht zu blockieren !
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

DS_Starter

Du kannst für deinen Einsatzfall ebenfalls die Non-Blocking Arbeitsweise von DbRep nutzen.
Da das spezielle Ausschließen eines oder mehrer Devices nicht out of the box eingebaut ist (nur das inkludieren wie du bereits richtig geschrieben hast), nimmst du für diesen Fall einfach das DbRep-set sqlCmd Kommando.

Zum Beispiel:


set <DbRep-name> sqlCmd delete from history where TIMESTAMP < DATE_SUB(CURDATE(),INTERVAL 90 DAY) and DEVICE <> "ESPEasy_Blkn_Wetterstation_Env"


oder


set <DbRep-name> sqlCmd delete from history where TIMESTAMP < DATE_SUB(CURDATE(),INTERVAL 90 DAY) and DEVICE NOT IN ("ESPEasy_Blkn_Wetterstation_Env")


Im letzteren Fall kannst du in der Klammer mehrere Devices mit Komma getrennt angeben.

DbRep gibt dir wie gewohnt die Infos zu den gelöschten Sätzen.
Das ganze mit At regelmäßig einplanen und fertig.

Aber dein Einsatzfall ist eine Anregung für mich mal sowas im Standard einzubauen wenn es gut möglich ist und setze es auf meine ToDo-Liste.

LG,
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

der-pw

Hallo Heiko,

vielen Dank für den Ansatz!
Dass sich SQL-Commands über DBRep ausführen lassen habe ich irgendwie aus den Augen verloren.
Ich arbeite mich zwar durch die sehr umfangreiche/ausführliche Dokumentation, aber manchmal sieht man dann wohl den Wald vor lauter Bäumen nicht.
Werde ich nachher, wenn ich wieder zu Hause bin gleich mal einbauen und berichten.

Aber es freut mich natürlich, wenn ich dir Inspiration liefern konnte.  :)
Gibt ja bestimmt noch den ein oder anderen Einsatzfall, ein Device auszuschließen.

Schöne Grüße,
Patrick

Edit:
So, das Löschen läuft (wer hätte es anders gedacht) wieder wunderderbar!
  ;)

der-pw

Zitat von: yersinia am 22 September 2018, 13:37:03
[...]Hier könnte zB reduceLog bzw. reduceLogNbl helfen [...]

Vielen Dank,

reduceLog bzw. reduceLogNbl sind mir bekannt, setze ich auch ein.
So dünne ich schon die Logs nach 3 Wochen aus. Allerdings wird vieles nach einiger Zeit gar nicht mehr benötigt.


Heiko hatte den passenden Lösungsansatz.  ;)

DS_Starter

Hallo Patrick,

jetzt habe ich deine Anforderung/Inspiration zum Exclude von Devices umgesetzt. Ich habe dieses Feature gleich noch auf Readings ausgeweitet.

Einzelheiten dazu hier: https://forum.fhem.de/index.php/topic,53584.msg850361.html#msg850361

LG,
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

der-pw

Hallo Heiko,

sorry für die verspätete Antwort.
Toll dass du das umgesetzt hast!  :D

Ich werde mich am Wochenende mal dransetzten.
Die Syntax sieht ja doch sehr einfach aus.

Schöne Grüße,
Patrick