Script zur Prüfung von geloggten Daten

Ich hatte das Problem das bei mir immermal komische Temperaturdaten ankamen wenn die Batterie von der HM Wetterstation zu schwach war.

Diese Werte kann man einfach mit dem folgenden Script korrigieren.
Einfach ein bisschen Mathematik.
Es basiert auf statistischen Funktionen und arbeitet mit der Standardabweichung.
Es berechnet die Standardabweichung aus vorangegangenen Werten und prüft so ob die aktuellen Werte gültig sind.

Einfach Script anlegen und mit den gewünschten Variablen auf Aktualisierung triggern.

Wichtig!! Die Variable muss geloggt sein und darf nicht als Zähler aggregiert sein!!!


<?
 //Diese Funktion berechnet die Standardabweichung
function getStandardabweichung(&$werte) {
     $mittelwert = (array_sum($werte) / count($werte));
     $delta = 0;
     foreach ($werte as $wert)
         $delta = $delta + pow(($mittelwert - $wert), 2);

     return (round(sqrt($delta / count($werte)), 3));
}

function getMittelwert($werte) {
     return (round((array_sum($werte) / count($werte)), 3));
}

function getMedian($werte) {
  sort($werte);
  if (count($werte) % 2)
      return ($werte[(count($werte) + 1) / 2]);
  return (round(($werte[count($werte) / 2] +
      $werte[((count($werte) / 2) + 1)]) / 2, 2));
}

if ($_IPS['VARIABLE'] > 0) {
   	$ID_ArchivHandler = 46855 /*[Archive Handler]*/;
   	$VergleichszeitraumDauerSec = 1800; //Zeit welche als Vergleichszeit verwendet wird
   	$FaktorAbweichung = 5;
		$ZeitAktuell = time();
		$VonVergleichsZeitraum = $ZeitAktuell - $VergleichszeitraumDauerSec;
		$BisVergleichsZeitraum = $ZeitAktuell;
		$Datas = AC_GetLoggedValues($ID_ArchivHandler,$_IPS['VARIABLE'] ,$VonVergleichsZeitraum  ,$BisVergleichsZeitraum  ,0);
		if (count($Datas) > 3) {
			//print_r ($Datas);
			//array ab dem 2. Wert ausschneiden)
			$DatasVergleichszeitraum = array_slice($Datas,1);
			$WerteVergleichsZeitraum = array();
			$i = 0;
			foreach ($DatasVergleichszeitraum as $data) {
			   $WerteVergleichsZeitraum[$i] = $data["Value"];
				$i++;
		 	}
		 	//print_r($DatasVergleichszeitraum);
			//print_r ($werte);
		   $sa = getStandardabweichung($WerteVergleichsZeitraum);
		   $mw = getMittelwert($WerteVergleichsZeitraum);
		   //print_r ("Standardabweichung ".$sa);
	      //print_r (" Mittelwert ".$mw);

	      //aktuellen Wert zuweisen steht im Array an Index 0
			//print_r ($DataCheck);
			//print_r ($Datas[0]["Duration"]."  ".date("G:i:s",$Datas[0]["LastTime"])."  ".date("G:i:s",$Datas[0]["TimeStamp"])."  ".$Datas[0]["Value"]."
" );

			if ((($Datas[0]['Value'] < ($mw - ($FaktorAbweichung * $sa))) or ($Datas[0]['Value'] > ($mw + ($FaktorAbweichung * $sa)))) and ($sa > 0) and ($mw > 0)) {
			      AC_DeleteVariableData($ID_ArchivHandler,$_IPS['VARIABLE'],$Datas[0]['TimeStamp'],$Datas[0]['TimeStamp']);
			}
		  	/*print_r ("Standardabweichung ".$sa);
			print_r (" Mittelwert ".$mw);
		   print_r (" Varianz ".$vz);
		   print_r (" Median ".$md . "
");
		   print_r (" Bereich von ".($mw - (2 * $stabwGrund))." bis ".($mw + (2 * $stabwGrund)));*/
		}
}
	  	
?>

Viel Spass!:wink: