ich habe dazu folgendes Skript geschrieben und lasse es einmal am Tag triggern.
<?
/*****
*
* Archive Handler Cleanen
*
* Dieses Skript hält die Datenbank sauber. Hier werden die Daten in der Datenbank auf
* den jeweiligen Tageszeitraum beschänkt. Sodass die Datenbank nicht zugemüllt wird mit Daten die
* eh nicht lange geloggt werden sollen.
* Es wird bis zu einem Jahr zurückgegangen zum löschen!
*
*
*
* Bitte diesem Skript ein Ereignis zuweisen. 1 mal am Tag!
*****/
// ID des Archivhandlers eingeben
$archiveID = 55837 /*[Archive Handler]*/;
// Hier die IDs eintragen die nur bis zu 2 Tage geloggt werden sollen!
$zweitage = array(
28379 /*[Info\Datenerfassung\Stromzähler Digital\Current]*/,
43606);
// Hier die IDs eintragen die nur bis zu 7 Tage geloggt werden sollen!
$siebentage = array(
12285 /*[Info\Datenerfassung\Stromzähler Digital\Verbrauch von Gestern]*/,
33460,
43606 /*[Keller / Dachgeschoss\Heizungsraum\Temperaturen\Holzofen\Temperatur]*/,
14500,
57778 /*[Keller / Dachgeschoss\Heizungsraum\Temperaturen\Pufferspeicher - unten\Temperatur]*/);
// Hier die IDs eintragen die nur bis zu 30 Tage geloggt werden sollen!
$dreinulltage = array(
19069 /*[Aussenbereich\Aussentemperatur\Temperatur]*/,
38455,
43480 /*[Keller / Dachgeschoss\Heizungsraum\Temperaturen\Heizungsvorlauf\Temperatur]*/);
/***********************************
* *
* Ab hier nichts mehr ändern. *
* *
************************************/
foreach($zweitage as $item){
$objectID = ($item);
//echo $objectID. "
";
// Zeitraum eintragen die noch in Database erhalten bleiben sollen!
$starttime = time()-(2*24*60*60);
// Zeitraum ab dem gelöscht wird! Von heute bis zum 1 Jahr zurück an wird gelöscht.
$starttime_del = time()-(365*24*60*60);
// Gespeicherte Werte, die älter sind als zur Bewertung relevant (bis 21 Tage zurück) aus DB löschen
$endtime_del = $starttime;
AC_DeleteVariableData($archiveID, $objectID, $starttime_del, $endtime_del);
}
foreach($siebentage as $item){
$objectID = ($item);
//echo $objectID. "
";
// Zeitraum eintragen die noch in Database erhalten bleiben sollen!
$starttime = time()-(7*24*60*60);
// Zeitraum ab dem gelöscht wird! Von heute bis zum 1 Jahr zurück an wird gelöscht.
$starttime_del = time()-(365*24*60*60);
// Gespeicherte Werte, die älter sind als zur Bewertung relevant (bis 21 Tage zurück) aus DB löschen
$endtime_del = $starttime;
AC_DeleteVariableData($archiveID, $objectID, $starttime_del, $endtime_del);
}
foreach($dreinulltage as $item){
$objectID = ($item);
//echo $objectID. "
";
// Zeitraum eintragen die noch in Database erhalten bleiben sollen!
$starttime = time()-(30*24*60*60);
// Zeitraum ab dem gelöscht wird! Von heute bis zum 1 Jahr zurück an wird gelöscht.
$starttime_del = time()-(365*24*60*60);
// Gespeicherte Werte, die älter sind als zur Bewertung relevant (bis 21 Tage zurück) aus DB löschen
$endtime_del = $starttime;
AC_DeleteVariableData($archiveID, $objectID, $starttime_del, $endtime_del);
}
?>
vielen Dank für den „Früheinsatz“!
Das sieht schon sehr nach dem aus, was ich gesucht habe, von daher werde ich es heute abend mal versuchen bei mir zu integrieren…
Eine Frage noch dazu: Als ich gestern diverse Daten „manuell“ über den Archiv Handler gelöscht habe, konnte ich nicht erkennen, dass die logging.db kleiner geworden ist (mag mich täuschen…). Bei Access gibt es dazu eine Funktion, die Datenbanken nach dem Löschen von Datenmengen wieder „komprimiert“ (aber extra ausgeführt werden muss unter Extras|Datenbank-Dienstprogramme|Datenbank komprimieren und reparieren…).
Ist so etwas hier bei der SQLite-Datenbank auch sinnvoll bzw. erforderlich und möglich?
Dank des Beispiels von Hollowman habe ich mir jetzt folgendes Skript „zusammengestrickt“:
<?
/*****
*
* Archive Handler Cleanen
*
* Dieses Skript hält die Datenbank sauber. Hier werden die Daten in der Datenbank auf
* den jeweiligen Tageszeitraum beschänkt. Sodass die Datenbank nicht zugemüllt wird mit Daten die
* eh nicht lange geloggt werden sollen.
* Es wird bis zu einem Jahr zurückgegangen zum löschen!
*
*
*
* Bitte diesem Skript ein Ereignis zuweisen. 1 mal am Tag!
*****/
// ID des Archivhandlers eingeben
$archiveID = 58740 /*[Archive Handler]*/ ;
// $GV=GeloggteVariable; [x][0] = ID der geloggten Variable; [x][1]= Dauer verbleibenden Daten in Tagen
$GV[0][0]= 44864 /*[Sonstige Daten\Heizung\Zirkulation Vorlauf\Temperatur]*/ ; $GV[0][1]= 7;
$GV[1][0]= 53002 /*[Sonstige Daten\Heizung\Zirkulation Rücklauf\Temperatur]*/ ; $GV[1][1]= 7;
$GV[2][0]= 33934 /*[Sonstige Daten\Heizung\Wärme Vorlauf\Temperatur]*/ ; $GV[2][1]= 7;
$GV[3][0]= 25888 /*[Sonstige Daten\Heizung\Warmwasserspeicher\Temperatur]*/ ; $GV[3][1]= 7;
// usw...
If (GetValueBoolean(10900 /*[Sonstige Daten\Einstellungen\Datenbank-Bereinigung\Automatische Datenbank-Bereinigung]*/ ) == true)
{
for ($i = 0; $i < count($GV); $i++)
{
// Zeitraum ab dem gelöscht wird! Von heute bis zum 1 Jahr zurück an wird gelöscht.
$starttime_del = time()-(365*24*60*60);
// Gespeicherte Werte, die älter sind als zur Bewertung relevant (bis 21 Tage zurück) aus DB löschen
$endtime_del = time()-($GV[$i][1]*24*60*60);
AC_DeleteVariableData($archiveID, $GV[$i][0], $starttime_del, $endtime_del);
$Datum = GetValueString(23632 /*[Sonstige Daten\Variablen\Sonstige Variablen\Aktuelles Datum]*/ );
$Uhrzeit = GetValueString(37001 /*[Sonstige Daten\Variablen\Sonstige Variablen\Aktuelle Uhrzeit]*/ );
SetValueString(20744 /*[Sonstige Daten\Einstellungen\Datenbank-Bereinigung\Letzte Datenbank-Bereinigung]*/ , $Datum." ".$Uhrzeit);
}
}
?>
Vielen Dank!
Leider verändert sich aber die Größe der logging.db nicht. Wenn da also noch jemand einen Tipp hätte…
Meine abgewandelte Version bereinigt ALLE geloggten Daten automatisch mit einem Alterswert. Hatte keine Lust alle einzutippen ;). Spezielle Aufbewahrungsdauer können für die Variablen eingetragen werden.
// ID des Archivhandlers eingeben
$archiveID = 44065 /*[Archive Handler]*/ ;
// alle geloggten Variablen
$var = AC_GetAggregationVariables($archiveID,True);
$z=0;
foreach($var as $key)
{
$GV[$z][0] = $key['VariableID'];
//Standard verbleibende Tage (dieser Wert ist für alle Variablen gültig)
$GV[$z][1] = 365;
//abweichende Daten
If ($GV[$z][0] == 20790 /*[Zentral\Server\PC Daten\CPU_0]*/) {$GV[$z][1] = 60;}
If ($GV[$z][0] == 36571 /*[Zentral\Server\PC Daten\HDD0]*/) {$GV[$z][1] = 90;}
$z=$z+1;
}
// geloggte Daten werden bereinigt
for ($i = 0; $i < count($GV); $i++)
{
// Zeitraum ab dem gelöscht wird! Von heute bis zu 400 Tage zurück an wird gelöscht.
$starttime_del = time()-(400*24*60*60);
// Gespeicherte Werte, die älter als vorgebener Wert aus DB löschen
$endtime_del = time()-($GV[$i][1]*24*60*60);
// Löschvorgang
AC_DeleteVariableData($archiveID, $GV[$i][0], $starttime_del, $endtime_del);
}
die Daten werden vom Script gelöscht (kleine Abwandlung Deiner Version) und sind damit verschwunden.
Mit dem SQLite Administrator kannst Du die Dateigröße der Datenbank logging.db verkleinern, vorausgesetzt es wurden auch Daten gelöscht. Also: Erst löschen, dann komprimieren.
probiere dein Script gerade, erhalte aber leider folgende Fehlermeldung:
[u]
Warning: Wrong parameter count for ac_getaggregationvariables() in C:\Programme\IP-Symcon_2_0\scripts\15338.ips.php on line 7
Warning: Invalid argument supplied for foreach() in C:\Programme\IP-Symcon_2_0\scripts\15338.ips.php on line 9
Notice: Undefined variable: GV in C:\Programme\IP-Symcon_2_0\scripts\15338.ips.php on line 24[/u]
Mein Script sieht so aus:
// ID des Archivhandlers eingeben
$archiveID = 13953 /*[Archive Handler]*/;
// alle geloggten Variablen
$var = AC_GetAggregationVariables($archiveID);
$z=0;
foreach($var as $key)
{
$GV[$z][0] = $key['VariableID'];
//Standard verbleibende Tage (dieser Wert ist für alle Variablen gültig)
$GV[$z][1] = 1825;
//abweichende Daten
If ($GV[$z][0] == 16135 /*[System\Server Infos\CPU Last]*/) {$GV[$z][1] = 160;}
// If ($GV[$z][0] == 36571 /*[Objekt #36571 existiert nicht]*/) {$GV[$z][1] = 190;}
$z=$z+1;
}
// geloggte Daten werden bereinigt
for ($i = 0; $i < count($GV); $i++)
{
// Zeitraum ab dem gelöscht wird! Von heute bis zu 400 Tage zurück an wird gelöscht.
$starttime_del = time()-(400*24*60*60);
// Gespeicherte Werte, die älter als vorgebener Wert aus DB löschen
$endtime_del = time()-($GV[$i][1]*24*60*60);
// Löschvorgang
AC_DeleteVariableData($archiveID, $GV[$i][0], $starttime_del, $endtime_del);
}
Hast Du, oder jemand anderes eine Idee woran es liegen könnte?
Ich würde aufgrund der erschreckenden Größe meiner logging.db diese auch gerne individuell kürzen aber stoße auf gleiche Probleme.
Leider finde ich auch in der Doku keinen Ansatz.
Habe gerade selber die Fehlermeldung entdeckt. Die Funktion AC_GetAggregationVariables hat wohl irgendwann einen zusätzlichen Parameter erhalten. Kenne zwar die Bedeutung von „QueryDatabase:Boolean“ noch nicht (in der Doku auch noch nichts gefunden), aber mit folgendem Befehl funktioniert es wieder:
hab heute auch damit rumgespielt, ich vermute „true“ bedeutet: zeige alle Vars die Daten beinhalten/ oder das Flag „logging aktiv“ haben … oder so ähnlich