Gleitenden Mittelwert oder gleitenden Median berechnen

Ok ich glaube ich habe das Problem gefunden. Wenn er den Wert 1000 erreicht und sich nichts ändert, wird auch effektiv kein neuer Wert ins Archiv geschrieben und somit hat er für den vergangenen Zeitraum auch keine Daten.

Wie kann ich dieses Problem umgehen, habt ihr da Tipps für mich ?

Ich würde vorschlagen direkt über die aggregierten Werte zu gehen, beispielsweise die 5-Minuten-Aggregation.

Hallo,

ich habe mir das Skript mal genauer angeschaut, verstehe es aber leider nicht so ganz. Die „varID“ ist die zu loggende Variable, soweit verstanden. Aber wo ist der Mittelwert, den ich dann in eine (Mittelwert)-Variable mit zB. SetValue(ID „Mittelwert“) schreiben würde.
Da komme ich noch nicht klar.

(Meine Frage bezog sich auf das erste der beiden verlinkten Beispiele.)

Mag mir da einer einen Tipp geben?

Gruß
Marc

Hi,
meinst Du das erste Script von Bayaro? Von getMedian() bekommst Du einen Wert zurück und im Beispiel wird er nur angezeigt. Mit
SetValue(ID-deiner-Variablen, getMedian ($IDArchiveHandler,$varId,$interval,$default)); würde sie abgespeichert werden.

Ralf

Ja, ich meinte das von bbernhard, worauf sich auch Bayaro bezog.
Das mit getMedian habe ich noch nicht ganz verstanden.
Müsste das am Ende des Skripts genau so eingestellt werden?

SetValue(ID-deiner-Variablen, getMedian ($IDArchiveHandler,$varId,$interval,$default)); 

Und wird da dann auch nur der Mittelwert in der Variable erzeugt?

Ok.
Ich habe mich getraut und es scheint zu funktionieren.
Aber, wie stelle ich das ein, dass das Skript auch dauerhaft ausgeführt wird?
Oder wird es im Hintergrund ausgeführt und ich muss es dann zyklisch abrufen? Würde dann aber irgendwie keinen Sinn ergeben, da ich ja schon den Intervall vorgebe.

Das Intervall ist ja nur für den Zeitraum, den du auswertest.

Wenn du diese Auswertung gern regelmäßig aktuell haben möchtest, dann solltest du dem Script ein zyklisches Ereignis geben, damit es regelmäßig aufgerufen wird ;).

Jetzt noch mal blöd gefragt:
Derzeit sieht mein Skript so aus:

<?php

$IDArchiveHandler = 46602 /*your Archive Handler ID*/;
$varId = 52532 /*Var Id you want to examine*/;
$interval = 30; /*Timespan in seconds for Mean/Median Calculation*/;
$default = 0; /* default value in case no data capturd */

echo "Mean: ".getMean ($IDArchiveHandler,$varId,$interval,$default);
echo chr (13). chr (10);
echo "Median: ".getMedian ($IDArchiveHandler,$varId,$interval,$default);



function getMean ($IDArchivehandler,$varId,$log_interval,$default) {
$logData = AC_GetLoggedValues ($IDArchivehandler, $varId, time()- $log_interval,time(),-1);
if (count($logData) <1) return $default;
foreach ($logData as $key => $data)
{
    $value[$key] = $data['Value'];
}
return array_sum($value)/count($value);
}

function getMedian ($IDArchivehandler,$varId,$log_interval,$default) {
$logData = AC_GetLoggedValues ($IDArchivehandler, $varId, time()-$log_interval,time(),-1);
if (count($logData) <1) return $default;
foreach ($logData as $key => $data)
{
    $value[$key] = $data['Value'];
}
asort($value);
return $value[count($value)/2];
}

SetValue(43254, getMedian ($IDArchiveHandler,$varId,$interval,$default)); 

?> 

Die Abfrage erfolgt zyklisch.

Müsste es nicht so sein, dass das Skript im Hintergrund ohne zyklische Abfrage läuft und nur die letzte Zeile in einem separatem Skript zyklisch nach Bedarf aus dem Archivhandler ausgelesen wird?

SetValue(43254, getMedian ($IDArchiveHandler,$varId,$interval,$default)); 

Ein Script läuft im Symcon nicht im Hintergrund, es wird über ein Ereignis aufgerufen und wenn es nicht aufgerufen wird, dann setzt es auch den Wert mit dem Kommando in der Zeile am Ende nicht ;).

Danke,
dann habe ich das soweit verstanden und es läuft ja auch. :slight_smile: