Hi,
warum auch immer jetzt hat AC_GetLoggedValues so funktioniert wie ich es erwartet habe. Als Ergebnis habe ich ein Script geschrieben das meine Verbrauchswerte (Variablen als Zähler) quasi Median filtert. Quasi weil es ein spezieller Filter für Verbrauchswerte ist. Verbrauchswerte können nur größer werden. Ich beachte 3 Werte und wenn Wert1 < Wert2 < Wert3 ist alles OK. Ist Wert1 > Wert2 < Wert3 oder Wert1 < Wert2 > Wert3 stimmt was nicht. Ich benutze Differenzen und habe eine Toleranz von 0.1 Wh weil die Werte rauschen können.
Hier das Filterscript:
<?php
// Keller
$summeID = 18122 /* ID der Variablen im Archive */;
filter_variable(32968, $summeID) /* ID der Archive-Instanz */;
function filter_variable($ArchiveID, $VariableID) {
//Alle Datensätze der letzten Stunden abfragen
$logData = AC_GetLoggedValues($ArchiveID, $VariableID, strtotime("yesterday 00:00"), time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
// Anzahl der Werte
$entries = count($logData);
// 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
IPS_LogMessage("Medianfilter", $VariableID.' '.$changes.'. diff1:'.$diff1.' $diff2:'.$diff2);
// 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);
}
else{
IPS_LogMessage("Medianfilter", $VariableID.': Alles OK');
}
}
?>
vielleicht kann es ja jemand gebrauchen.
Ralf