Archive: Mittelwert

Das folgende Beispiel zeigt, wie man für eine Steuerung einer Beschattung den Mittelwert über 30 Minuten erhält.
Dies ist darum wichtig, damit die Rollläden bei jeder kleinen Wolke sich nicht wieder öffnen.
ACHTUNG: man erhält NICHT den zeitlich gewichteten Mittelwert,
da die Werte nur bei jeder Änderung im Archiv gespeichert werden.
Beispiel: über 10 Stunden haben wir 20 Grad und 5 Minuten 30 Grad
Es gibt dann 2 Datensätze im Archiv - logisch, daß es nicht 25 Grad im Durchschnitt waren.

MST

Demo-Skript (IDs sind anzupassen, ‚echo‘ zu Testzwecken):

$archiveID = 23247 /*[Archive Handler]*/;
$objectID = 37855 /*[Wetter\Pyranometer\Helligkeit]*/;
$endtime = time(); // time() for "now"
$starttime = time()-(30*60); // for n minutes ago
$limit = 0; // kein Limit

//print_r(AC_GetLoggedValues($archiveID, $objectID, $starttime, $endtime, $limit));
$buffer = AC_GetLoggedValues($archiveID, $objectID, $starttime, $endtime, $limit);
$anzahl = 0;
$summe = 0;
foreach ($buffer as $werte){
	$wert = $werte["Value"];
	$anzahl = $anzahl +1;
	$summe = $summe + $wert;
}
echo "N-Werte: ".$anzahl. "
";
$mittelw = $summe / $anzahl;
echo "Mittelwert: " . $mittelw . "
";
SetValue(35648 /*[Wetter\Pyranometer\Helligkeit Mittel 30min]*/,$mittelw);

Hallo Michael,

danke für das Script;)

Gibt es auch noch die Möglichkeit den TimeStamp zu jedem Wert zu bekommen? Wenn Ja wie lautet da der IPS-Befehl?

Danke & Gruß

Philipp

Es gibt dann 2 Datensätze im Archiv - logisch, daß es nicht 25 Grad im Durchschnitt waren.

Ich würde vermuten, überhaupt nicht :eek:. Es gibt die Zwischenwerte ja nicht.

@Ralf,

was möchtest Du mir sagen :confused:

@Philipp,

print_r(AC_GetLoggedValues($archiveID, $objectID, $starttime, $endtime, $limit));

damit sollten alle Klarheit beseitigt sein :rolleyes:

MST

Sorry, die Antwort sollte an Phillip gehen. Er möchte ja den „TimeStamp zu jedem Wert“ herausfinden.

Und so wie du es beschrieben hast

und wenn ich das dann richtig verstanden habe, bekommt er die Zwischentimestamps nur bedingt per Abfrage.
Er kann den ersten Wert abfragen und muss dann jeweils solange das Abfrageintervall addieren bis der nächste Datensatz erreicht ist.

Hallo steiner,

interessantes Script.
Ich hatte meine Rollladensteuerung bisher über drei Hilfsvariablen realisiert.
Einmal der addierte Helligkeitswert(*1) und als zweites einen Counter(*2).
Nach fünf addierten Werten wurde *1 durch *2 geteilt und dann der Mittelwert in die Durchschnittsvariable (*3) geschrieben, welche dann bei Aktualisierung das Rollladenscript triggerte. Das habe ich nun schon seit IPS V1 in Anwendung.
Da gabs ja noch kein Logging von Daten :slight_smile:

Ich werde auf alle Fälle mal deine Version ausprobieren und dann eventuell ein paar Variablen einsparen können…

Sorry, die Antwort sollte an Phillip gehen. Er möchte ja den „TimeStamp zu jedem Wert“ herausfinden.

Hallo Ralf,

nein nicht von jedem Wert, sondern von den gespeicherten und abgerufenen Werten. Damit kann ich dann die Dauer der einzelnen Werte herausfinden, und damit einen gewichteten Mittelwert ermitteln.

@Michael: Danke für den Hinweis:D

Hat auch geklappt:D

ANbei das Script um die gewichtete Mittelwertbildung angepasst:

<?
$archiveID = 29117 /*[Archive Handler]*/;
$objectID = 37549 /*[LCN\Schopf\Helligkeit\Helligkeit]*/;
$endtime = time(); // time() for "now"
$starttime = time()-(30*60); // for n minutes ago
$limit = 0; // kein Limit

//print_r(AC_GetLoggedValues($archiveID, $objectID, $starttime, $endtime, $limit));
$buffer = AC_GetLoggedValues($archiveID, $objectID, $starttime, $endtime, $limit);
$anzahl = 0;
$summe = 0;
$totaldauer = 0;
foreach ($buffer as $werte){
    $wert = $werte["Value"];
    $dauer = $werte["Duration"];
    $anzahl = $anzahl + 1;
    $totaldauer = $totaldauer + $dauer;
	 $summe = $summe + ($wert*$dauer);
}
echo "N-Werte: ".$anzahl. "
";
$mittelw = $summe / $totaldauer;
echo "Mittelwert: " . $mittelw . "
";

?>

Gruß Philipp

Für alle, die nicht ewig die Helligkeitswerte mitloggen wollen, habe ich nochmal das Script von philipp modifiziert.
Dabei werden alle Werte, ab 2 Tage vorher bis zum relevanten Zeitraum, aus der Datenbank gelöscht… unwiderruflich!
Zum besseren Verständnis habe ich dazu neue Variablennamen verwendet.

<?
$archiveID = 30962 /*[Archive Handler]*/ ;
$objectID = 42405 /*[-Wetter-\Helligkeit]*/ ;
$endtime = time(); // time() for "now"
$starttime = time()-(30*60); // for n minutes ago
$limit = 0; // kein Limit

//print_r(AC_GetLoggedValues($archiveID, $objectID, $starttime, $endtime, $limit));
$buffer = AC_GetLoggedValues($archiveID, $objectID, $starttime, $endtime, $limit);
$anzahl = 0;
$summe = 0;
$totaldauer = 0;
	foreach ($buffer as $werte)
	{
   $wert = $werte["Value"];
   $dauer = $werte["Duration"];
   $anzahl = $anzahl + 1;
   $totaldauer = $totaldauer + $dauer;
   $summe = $summe + ($wert*$dauer);
	}
echo "N-Werte: ".$anzahl. "
";
$mittelw = $summe / $totaldauer;
echo "Mittelwert: " . $mittelw . "
";
SetValueFloat(34586 /*[Test\Helligkeit-Mittelwert]*/ ,$mittelw);

// Gespeicherte Werte, die älter sind als zur Bewertung relevant (bis 2 Tage zurück) aus DB löschen
$starttime_del = time()-(2880*60);
$endtime_del = $starttime;
AC_DeleteVariableData($archiveID, $objectID, $starttime_del, $endtime_del);
?>

Kurze Frage, wird das Script über die Helligkeit getriggert ? oder alle 30 Minuten gestartet ? Ich kann das irgendwie nicht rauslesen …

Ja.
Sonst würde es ja nicht dynamisch reagieren und am sturen „Halbe Stunde-Rythmus“ kleben.

Ok, dann hab ichs ja richtig :wink:

Hmmm , wenn ich 30 minuten keine geänderten Daten bekomme hab ich Probleme.
Beispiel 33 Minuten ist VOLLER Sonneneinfall, im Archiv kommen KEINE weiteren Einträge. Nun kommt ne dunkle Wolke 18000lux, das ist dann der EINZIGE Eintrag seit 33 Minuten, … Durchschnitt 18000lux…
Mach ich da was falsch ?

Hoffe ich hab mich klar ausgedrückt.

P.S. habe das Löschen von Dir mal rausgenommen, das hat mir maximal 30 minuten an Daten im Archiv gelassen.( Ist ja auch so gewollt). ABER:Wenn dann älter ( also 33minuten ) war der weg.Und als einziges steht noch der grade gekommene !

Heisst das, dass dein Enocean-Helligkeitssensor nicht regelmäßig Daten sendet?

Ich habe einen Helligkeitssensor der WS2000 mit dem Wettersensorempfänger, der regelmäßig Daten sendet (ca. alle 177 - 179 Sekunden).
D.h. auch wenn sich die Helligkeit nicht ändert, werden die Daten in die DB geschrieben.
Was sehr unwahrscheinlich ist, aber theoretisch…
Wenn die Helligkeit um z.B. 15:00 Uhr 50000 lux war und um 15:27 Uhr 20000 lux, dann stehen zwar in der DB, wenn man sie über IPS ansieht, nur 2 Werte, aber zwischen 15:00 und 15:24 Uhr wurden weiterhin 50000 lux geloggt.

Sollte dein Sensor tatsächlich nur bei Änderung Daten verschicken, dann hast du ein Problem mit dem Script und der Mittelwertbildung und kannst es in der Art nicht einsetzen.

Es werden NUR geänderte Daten geloggt ! Ich kann in der Zwischenzeit 30mal die Variable neu schreiben mit ein und dem selben Wert, im Archiv steht sie nur einmal drin.
Muß ich als Zähler loggen ?

hmm das muß ich nochmal überprüfen, aber ich denke meinen Sensor kannste als Fehlkauf abschreiben :(.


foreach ($buffer as $werte)
{
   $wert = $werte["Value"];
   $dauer = $werte["Duration"];
   $anzahl = $anzahl + 1;
   $totaldauer = $totaldauer + $dauer;
   $summe = $summe + ($wert*$dauer);
}

wird zu


foreach ($buffer as $werte)
{
   $anzahl++;
   $totaldauer += $werte["Duration"];
   $summe += ($werte["Value"] * $werte["Duration"]);
}

Macht zwar das gleiche, ist aber kürzer und ohne die - unnötigen - Hilfsvariablen übersichtlicher und leichter zu verstehen.