Abfangen geht nur, mit einer 2. Zählervariable, die nur die richtigen Zählerwerte aufzeichnet.
Im Nachhinein, gbt’s ein kleines Hilfsmittel.
Ein Skript, dass z.B. von gestern bis Jetzt die Daten einer Zähler Variable kontrolliert.
Anfangs, war ich vorsichtig und habe kontrolliert gelöscht.
Jetzt mach ich dies Automatisch, wenn ein Fehler erkannt wird.
Hier das Skript:
<?php
// Automatisches Korrigieren bei Zählerfehler ( alle 10Minuten )
$zähler_fehler_merker=51315;
$summeID = 23720 /* ID der Variablen im Archive */;
filter_variable(51452, $summeID) /* ID der Archive-Instanz */;
function filter_variable($ArchiveID, $VariableID)
{
//Alle Datensätze ab Startzeitpunkt oder der letzten Stunden abfragen ( gestern 0Uhr bis jetzt ) Maximal 21000 Einträge ca. 5 Tage Spezialschalter!!!!!!!
// $start = mktime(0, 0, 0, 1, 1, 2022); /* Stunde, Minute, Sekunde, Monat, Tag, Jahr */
// $end = mktime(0, 0, 0, 9, 1, 2022);
//echo "DELTA seit letzter Aktualisierung (sekunden): ".$Delta."\n";
//WFC_PushNotification(51609, 'VID', $VariableID.' '.$changes.'. Time start:'.$start.'. Time end:'.$end, '', 0);
$logData = AC_GetLoggedValues($ArchiveID, $VariableID, strtotime("yesterday 00:00"), time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control: der letzten Stunden abfragen ( gestern 0Uhr bis jetzt )
// $logData = AC_GetLoggedValues($ArchiveID, $VariableID, $start, $end, 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
// Anzahl der Werte
$entries = count($logData);
//echo "VID ".$VariableID." ".$entries." ". Einträge ".$Delta."\n";
// Macht erst ab 3 Werten Sinn
if ($entries < 2) return;
// Anzahl der Fehler protokolieren
$changes = 0;
for ($i = 2; $i < $entries; $i++)
{
// Differenz Wert2-Wert1
$diff1 = $logData[$i - 1]['Value'] - $logData[$i - 2]['Value'];
// Differenz Wert3-Wert2
$diff2 = $logData[$i]['Value'] - $logData[$i - 1]['Value'];
// Wenn der mittlere Wert entweder der größte oder kleinste Wert ist stimmt was nicht
if ((($diff1 < -0.1) && ($diff2 > 0.1)) ||
(($diff1 > 0.1) && ($diff2 < -0.1)))
{
// lösche mittleren Wert
AC_DeleteVariableData ($ArchiveID, $VariableID, $logData[$i - 1]['TimeStamp'] - 1, $logData[$i - 1]['TimeStamp'] + 1);
// Fehler in Logfile eintragen
$time = $logData[$i - 1]['TimeStamp'] ;
IPS_LogMessage("Medianfilter", $VariableID.' '.$changes.'. diff1:'.$diff1.' $diff2:'.$diff2);
//WFC_PushNotification(51609, 'VID', $VariableID.' '.$changes.'. Time:'.$time, '', 0);
// eine Änderung mehr
$changes++;
}
}
// Wenn es Änderungen gab
if ($changes > 0)
{
// Variable neu aggregieren
AC_ReAggregateVariable ($ArchiveID, $VariableID);
// Anzahl der Fehler ins Logfile
IPS_LogMessage("Medianfilter", $VariableID.': Fehlerhafte Werte:'.$changes);
//WFC_PushNotification(51609, 'VID', $VariableID.': Fehlerhafte Werte:'.$changes, '', 0);
}
else
{
IPS_LogMessage("Medianfilter", $VariableID.': Alles OK');
WFC_PushNotification(51609, 'VID', $VariableID.': Alles OK:'.$changes, '', 0);
}
}
SetValueBoolean($zähler_fehler_merker, false); // Fehler Merker zurücksetzten
Mal Vorsichtig anwenden und kontrolliert löschen.
Sollte kein Programierfehler vorhanden sein und Du sicher bist,
kannst es auch automatisch machen.
LG Willi