Hi,
ich hatte es explizit für einzelne Ausreißer geschrieben. In deinem Fall gibt es öfter zwei Nullen hintereinander deswegen geht es nicht.
Für 2 Ausreißer hintereinander muss der Filter für das Script unten so aussehen:
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
// $start = mktime(0, 0, 0, 1 , 1, 2019);
// $logData = AC_GetLoggedValues($ArchiveID, $VariableID, $start, time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
$entries = count($logData);
if ($entries < 4) return;
$changes = 0;
for ($i = 4; $i < $entries; $i++){
$diff1 = $logData[$i - 2]['Value'] - $logData[$i - 4]['Value'];
$diff2 = $logData[$i]['Value'] - $logData[$i - 2]['Value'];
if ((($diff1 < -0.1) && ($diff2 > 0.1)) ||
(($diff1 > 0.1) && ($diff2 < -0.1))){
AC_DeleteVariableData ($ArchiveID, $VariableID, $logData[$i - 2]['TimeStamp'] - 1, $logData[$i - 2]['TimeStamp'] + 1);
IPS_LogMessage("Zählerfilter", IPS_GetName(IPS_GetParent($VariableID)).' - '.IPS_GetName($VariableID).' Zeit:'.date("Y-m-d H:i:s", $logData[$i - 2]['TimeStamp']).' diff1:'.$diff1.' $diff2:'.$diff2);
$changes++;
}
}
if ($changes > 0){
AC_ReAggregateVariable ($ArchiveID, $VariableID);
IPS_LogMessage("Zählerfilter", $VariableID.': Fehlerhafte Werte:'.$changes);
IPS_SetScriptTimer($_IPS['SELF'], 300);
}
else{
IPS_LogMessage("Zählerfilter", IPS_GetName(IPS_GetParent($VariableID)).' - '.IPS_GetName($VariableID).' Alles OK');
IPS_SetScriptTimer($_IPS['SELF'], 10);
}
}
Wenn Du wirklich nur 0 weg haben willst sollte es so gehen:
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
// $start = mktime(0, 0, 0, 1 , 1, 2019);
// $logData = AC_GetLoggedValues($ArchiveID, $VariableID, $start, time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
$entries = count($logData);
$changes = 0;
for ($i = 0; $i < $entries; $i++){
if ($logData[$i]['Value'] < 0.1){
AC_DeleteVariableData ($ArchiveID, $VariableID, $logData[$i]['TimeStamp'] - 1, $logData[$i]['TimeStamp'] + 1);
IPS_LogMessage("Zählerfilter", IPS_GetName(IPS_GetParent($VariableID)).' - '.IPS_GetName($VariableID).' Zeit:'.date("Y-m-d H:i:s", $logData[$i]['TimeStamp']));
$changes++;
}
}
if ($changes > 0){
AC_ReAggregateVariable ($ArchiveID, $VariableID);
IPS_LogMessage("Zählerfilter", $VariableID.': Fehlerhafte Werte:'.$changes);
IPS_SetScriptTimer($_IPS['SELF'], 300);
}
else{
IPS_LogMessage("Zählerfilter", IPS_GetName(IPS_GetParent($VariableID)).' - '.IPS_GetName($VariableID).' Alles OK');
IPS_SetScriptTimer($_IPS['SELF'], 10);
}
}
Ich habe auch noch ein Problem gefunden. Wenn 2 Variablen reaggrigiert werden müssen klappt es bei der 2ten Variablen meist nicht. Die Doku erwähnt ja auch das es lange dauern kann und wenn die 2te Variable reaggrigiert werden soll läuft es noch für die 1te Variable und das wird dann nicht mehr ausgeführt.
Dieses Script lässt IPS 5 Minuten Zeit wenn eine Variable reaggrigiert werden muss:
<?php
$variablen = array( 18122,
30980,
25391,
53556,
15741,
48510,
32294,
48724,
14835,
22373
);
$CountID = IPS_GetObjectIDByIdent("Count", $_IPS['SELF']);
if ($CountID == false){
$CountID = IPS_CreateVariable(1);
IPS_SetName($CountID, "Count"); // Variable benennen
IPS_SetParent($CountID, $_IPS['SELF']);
IPS_SetIdent($CountID, "Count");
}
$IndexID = IPS_GetObjectIDByIdent("Index", $_IPS['SELF']);
if ($IndexID == false){
$IndexID = IPS_CreateVariable(1);
IPS_SetName($IndexID, "Index"); // Variable benennen
IPS_SetParent($IndexID, $_IPS['SELF']);
IPS_SetIdent($IndexID, "Index");
}
if($_IPS['SENDER'] == "TimerEvent"){
if (IPS_GetName($_IPS['EVENT']) == 'ScriptTimer'){
$Index = GetValue($IndexID);
$Count = GetValue($CountID);
filter_variable(32968, $variablen[$Index]);
$Index++;
SetValue($IndexID, $Index);
if ($Index == $Count) IPS_SetScriptTimer($_IPS['SELF'], 0);
return;
}
}
if (IPS_GetScriptTimer($_IPS['SELF']) != 0) return;
SetValue($CountID, count($variablen));
SetValue($IndexID, 0);
IPS_SetScriptTimer($_IPS['SELF'], 10);
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
// $start = mktime(0, 0, 0, 1 , 1, 2019);
// $logData = AC_GetLoggedValues($ArchiveID, $VariableID, $start, time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
$entries = count($logData);
if ($entries < 2) return;
$changes = 0;
for ($i = 2; $i < $entries; $i++){
$diff1 = $logData[$i - 1]['Value'] - $logData[$i - 2]['Value'];
$diff2 = $logData[$i]['Value'] - $logData[$i - 1]['Value'];
if ((($diff1 < -0.1) && ($diff2 > 0.1)) ||
(($diff1 > 0.1) && ($diff2 < -0.1))){
AC_DeleteVariableData ($ArchiveID, $VariableID, $logData[$i - 1]['TimeStamp'] - 1, $logData[$i - 1]['TimeStamp'] + 1);
IPS_LogMessage("Zählerfilter", IPS_GetName(IPS_GetParent($VariableID)).' - '.IPS_GetName($VariableID).' Zeit:'.date("Y-m-d H:i:s", $logData[$i - 1]['TimeStamp']).' diff1:'.$diff1.' $diff2:'.$diff2);
$changes++;
}
}
if ($changes > 0){
AC_ReAggregateVariable ($ArchiveID, $VariableID);
IPS_LogMessage("Zählerfilter", $VariableID.': Fehlerhafte Werte:'.$changes);
IPS_SetScriptTimer($_IPS['SELF'], 300);
}
else{
IPS_LogMessage("Zählerfilter", IPS_GetName(IPS_GetParent($VariableID)).' - '.IPS_GetName($VariableID).' Alles OK');
IPS_SetScriptTimer($_IPS['SELF'], 10);
}
}
?>
Ralf