Nach dem ich kürzlich auf DbLog umgestellt habe, muss ich mich nun um die Datenpflege kümmern. Die Funktion reduceLog scheint das zu sein wonach ich gesucht habe. Dazu die folgenden Fragen.
- Welche gültigen Werte gibt es für den Parameter average=In der Hilfe habe ich Hinweise auf hour und day gefunden.
Sind auch andere Werte wie z.B. Minuten oder Wochen gültig.
- Ist es auch möglich auf 5, 10, 15, Minuten Einheiten zu reduzieren?
- Um nur ein bestimmtes Device zu reduzieren habe ich es wie folgt versucht.
set myDbRep reduceLog 11 average=hour INCLUDE=ShellyEM3:power_0
Wenn ich mir das Log ansehe scheint das definierte Device nicht erkannt worden zu sein. -> %
Habe ich da etwas falsch gemcht oder verstanden?
2025.06.20 19:44:06 5: DbRep myDbRep - BlockingCall with PID "64621" started
2025.06.20 19:44:06 4: DbRep myDbRep - Database Model: POSTGRESQL
2025.06.20 19:44:06 4: DbRep myDbRep - Database connect - user: fhem, UTF-8 option set: no
2025.06.20 19:44:06 5: DbRep myDbRep - Devices for operation -
included (1): %
included with wildcard:
excluded (0):
excluded with wildcard:
Hallo birdy,
ZitatWelche gültigen Werte gibt es für den Parameter average=In der Hilfe habe ich Hinweise auf hour und day gefunden.
Sind auch andere Werte wie z.B. Minuten oder Wochen gültig.
Nein, es gibt nur average=day und average=hour.
ZitatIst es auch möglich auf 5, 10, 15, Minuten Einheiten zu reduzieren?
Nein, siehe oben.
ZitatUm nur ein bestimmtes Device zu reduzieren habe ich es wie folgt versucht.
Code Auswählen
set myDbRep reduceLog 11 average=hour INCLUDE=ShellyEM3:power_0
Wenn ich mir das Log ansehe scheint das definierte Device nicht erkannt worden zu sein. -> %
Das scheint ein Bug zu sein den ich mir anschauen muß.
Alternativ setze dir einstweilen die Attr device/reading entsprechend.
LG,
Heiko
Hallo Heiko
Vielen Dank für die schnelle Antwort.
Schade gibt es diese Möglich nicht. Ich hätte mir gewünscht Daten, je älter sie sind, umso mehr zu komprimieren/aggregieren. Da ich eine Solche Funktion benötige (zumindest bilde ich mir das ein) werde ich mir eine Lösung zusammenstellen die dann gleich für meine Bedürfnisse massgeschneidert ist.
(Mein Smart Meter z.B. liefert seine Readings via MQQT im 5 Sekunden Takt. Die die möchte ich über verschiede Stufen aggregieren, biss ich sie dann nach Jahren vollständig lösche.)
Danke und Gruss
birdy
Wenn du dir dazu Gedanken machst und eine Lösung für weitere Aggregationen ausarbeitest, kann ich die durchaus in DbRep überführen wenn es sich einfügen lässt. Ich selbst komme aktuell nicht dazu.
LG,
Heiko
Ich sehe dafür keinen Bedarf. Wenn es SQL kann, dann kann man es ja auch mit sqlcmd machen.
Wenn es SQL nicht kann, dann wird es auch nichts.
Moin,
ich konnte den Fehler finden und beheben.
Es war ein Fehler im Filter-Regex der sich durch das letzte Zeichen des INCLUDE
INCLUDE=ShellyEM3:power_0
gezeigt hat.
Der Fix ist eingecheckt aber die V8.53.18 ebenfalls in meinem contrib verfügbar wer sie vorab laden und den Fix anwenden möchte.
LG,
Heiko
Zitat von: DS_Starter am 20 Juni 2025, 23:04:59Wenn du dir dazu Gedanken machst und eine Lösung für weitere Aggregationen ausarbeitest, kann ich die durchaus in DbRep überführen wenn es sich einfügen lässt. Ich selbst komme aktuell nicht dazu.
LG,
Heiko
Hallo Heiko
Dazu eine kurze Rückmeldung von meiner Seite.
Ich zweifle ob das etwas für DbRep sein könnte. Ich mache es für mich wie folgt.
Ich habe mir in der 99_myUtils.pm eine Sub gebaut, die ich täglich via AT Befehl aufrufe. Mit ein paar Parametern damit ich flexibel bin.
Vorgängig stelle aber sicher, dass in der DB für das zu aggregierende Zeitfenster und das gewünschte Device nur sinnvoll aggregierbare Werte vorhanden sind. Es macht keinen Sinn Stati wie open/close zu aggregieren
In der SUB habe ich ein paar SQL Befehle platziert. Zuerst mach ich mir mit DBI eine eigene DB Verbindung. Dann ermittle ich für das gewünschte Device alle vorhanden Readings. Im nächsten Schritt bilde ich für die Readings des gewünschten Device und den gewünschten Zeitabschnitt via AVG Funktion einen Durchschnittswert. Die Resultate schreibe ich in ein Worktabelle. Sobald ich alle gewünschten Durchschnittswerte abgespeichert habe, werden die Originalwerte in der History gelöscht. Danach noch Work wieder zurück in Historytabelle übertragen. Am Schluss lösche ich noch alle Einträge aus Work, fertig.
Gruss, birdy