Seit dem Wechsel von 6.3 auf 8.0 bekomme ich beim anzeigen von Graphen immer wieder mal die Fehlermeldung “Timestamps need to be in correct order” wenn ich diese Var dann manuell nachaggregiere geht es wieder.
Kommen diese immer wieder? Was ist das für eine variable? Kannst du das Problem provozieren?
paresy
Ich hatte das Problem auch mal eine Zeitlang und habe dafür eine Bereinigungsroutine geschrieben:
<?php
declare(strict_types=1);
ini_set('memory_limit', '-1');
$ahID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archive Handler
$count = 0;
//alle Variablen durchgehen...
$errorItems = [];
//$startTime = strtotime('-25 day');
$startTime = strtotime('-120 day');
$endTime = time();
//foreach ([0 => 29046] as $key => $varID) {
//foreach ([0 => 13407] as $key => $varID) {
foreach (IPS_GetVariableList() as $key => $varID) {
//... und prüfen, ob sie gelogged werden und falsche Einträge löschen
if (AC_GetLoggingStatus($ahID, $varID) && deleteEntriesWithTimeStampsOutOfOrder($ahID, $varID, $startTime, $endTime)) {
$errorItems[] = $varID;
}
}
if (count($errorItems) > 0) {
IPS_LogMessage(
basename(__FILE__, '.ips.php'),
sprintf(
'Es wurden inkonsistente Archivdaten bei %s Variablen gefunden (%s)',
count($errorItems),
implode (', ', $errorItems)
)
);
}
//---------------------------------------------------------------------
// es werden Archiveinträge mit falsch sortierten Zeiteinträgen des vorgegebenen Zeitraums gelöscht wenn der $test auf false gesetzt wird
function deleteEntriesWithTimeStampsOutOfOrder(int $ahID, int $varID, int $startTime, int $endTime): bool
{
$test = true;
//alle Einträge für den Zeitraum holen
$values = AC_GetLoggedValues($ahID, $varID, $startTime, $endTime, 0);
$ts = time();
$ret = false;
foreach ($values as $value) {
//prüfen, ob der TimeStamp hinter dem letzen TS liegt
if ($value['TimeStamp'] > $ts) {
//zukünftige Timestamps werden gelöscht
if ($test || AC_DeleteVariableData($ahID, $varID, $value['TimeStamp'], $value['TimeStamp'])) {
IPS_LogMessage(
basename(__FILE__, '.ips.php'),
sprintf(
'Variable: #%s, Eintrag %s liegt hinter %s',
$varID,
date('Y.m.d H:i:s', $value['TimeStamp']),
date('Y.m.d H:i:s', $ts)
)
);
$ret = true;
}
} else {
//TimeStamp merken
$ts = $value['TimeStamp'];
}
}
return $ret;
}
Die Ursache ist nicht wirklich gekärt worden. Vermutlich lag es an einer falsch laufenden Systemuhr.
Vielleicht hilft das Skript bei der Suche und Behebung.
Hallo,
dieses mal war es mein Stromzähler “aktueller verbrauch”, der liefert sehr häufig Werte. Die Var. wird dann aber verdichtet auf einen Wert pro Minute.
Das skript probier ich mal aus. Wie oft lässt du das laufen?
Gruß
Oliver
Ich lasse das Skript jeden Tag kurz vor Mitternacht laufen.
Mit
$startTime = strtotime('-1 day');