ccu-historian
ccu-historian copied to clipboard
Option um Daten älter als x Monate/Jahre aus Datenbank automatisch zu entfernen
NOOB-Frage/-Request: Falls noch nicht existent, wäre es schön eine Option zu haben, dass Daten die älter als x Monate/Jahre sind, automatisch aus der Datenbank entfernt werden, damit der USB-Stick nicht irgendwann überläuft.
Einstellbar global, evtl. aber auch für einzelne Datenpunkte mit unterschiedlichen Laufzeiten ... und das kombinierbar (globaler Wert, der durch einzeln gesetzte Werte für den entsprechenden Datenpunkt ersetzt wird).
Siehe auch #159.
Mit dem Skript "Alte Zeitreihendaten löschen" kann der Löschvorgang nun zumindest manuell ausgeführt werden.
Ein automatische Ausführung des Löschvorgangs, würde ich dann allgemein mit einer neuen Funktionalität für eine geplante Ausführung von Skripten erschlagen.
Hallo Mathias! Danke für das Skript - dadurch laufen Diagramm Darstellungen wieder flot! Frage: Ich würde gerne Alte Zeitreihendaten löschen automatisch auf meinem RaspberryPI laufen lassen. Wie sollte das script dazu aussehen? etwa so: CCU Historian stop, Alte Zeitreihendaten löschen, CCU Historian start ?
#!/bin/bash
# MG
# stop ccu-historian
sudo bash /etc/init.d/ccu-historian stop
echo
# calculate expiration date
exp=$(date -d "-30 days" +%F)
echo "expiration date: " $exp
# start ccu-historian with option clean
sudo java -jar /opt/ccu-historian/ccu-historian.jar -clean $exp
echo
# start ccu-historian
sudo bash /etc/init.d/ccu-historian start
echo
Ja, das sollte funktionierten. Eventuell kannst Du dann noch ein -compact
ausführen, damit die Datenbankdatei auch kleiner wird.
Das ganze Skript kann dann noch per cron-Job regelmäßig gestartet werden.
Ich arbeite gerade daran, dass Skripte (s.a. Skriptumgebung) zyklisch automatisch ausgeführt werden können (ab V3.2.0). Die Aufgabenstellung könnte dann mit einem Skript in der ccu-historian.config
gelöst werden:
database.tasks.clean.enable=true
database.tasks.clean.cron="0 0 2 * * ?"
database.tasks.clean.script={
/*
Alte Zeitreihendaten löschen V1.0.0
Wichtig: Vor Anwendung des Skripts ein Backup der Datenbank erstellen!
*/
// *** Konfiguration ***
// Anzahl der Tage, die in der Datenbank verbleiben sollen.
def daysToKeep = 365
// Testlauf durchführen? Bei einem Testlauf wird die Datenbank nicht verändert.
// (Ja: true, Nein: false)
def testRun = true
// *** Skript ***
log.info "Alte Zeitreihendaten werden gelöscht:"
def deleteDate=new Date()-daysToKeep
log.info "Löschdatum: ${deleteDate.format("dd.MM.YYYY")}"
def totalCnt=0
database.dataPoints.each { dp ->
def cnt
if (testRun) {
cnt=database.getCount(dp, null, deleteDate)
} else {
cnt=database.deleteTimeSeries(dp, null, deleteDate)
}
totalCnt+=cnt
log.info "$dp.displayName: $cnt Einträge"
}
log.info "Gesamtanzahl der gelöschten Einträge: $totalCnt"
}
Hinweis: Jeweils um 2 Uhr nachts werden alle Einträger älter als 365 Tage gelöscht. Damit das Skript auch die Datenbank verändert, die Zeile def testRun = true
auf def testRun = false
abändern.
Hallo Mathias! Großartig! Vielen Dank! Ich habe heute auf V3.2.0 upgraded und das script oben auf 31 Tage gestellt. Schöne Grüße, Martin