Archiv durchlaufen

Ich möchte gerne alle Werte eines Archivs von Beginn bis zum Ende durchlaufen. Aber irgendwie ist das nicht möglich. AC_GetLoggedValues läuft falsch herum, so dass ich nichtmal mit 0 startend mir 10.000 Datensätze geben lasse und dann den entsprechenden Timestamp für den nächsten Lauf zu nutzen.

Ist sowas simples nicht vorgesehen oder übersehe ich was?

Das könnte dir vielleicht helfen.

Also liege ich damit richtig. Oh das macht mich innerlich so richtig aggressiv. Ich habs erstmal durch ein kompliziertes Rücklaufen selber gebaut. Ist halt um ein vielfaches komplizierter…

Was ist denn dein Use-Case? Das Archiv ist für diese Operation nicht optimiert, da diese ja auch bei immer längerer Log-Zeit immer länger in der Ausführung dauern wird. Deshalb aggregieren wird die Daten fortlaufend um dadurch für unsere Use-Cases kostante Antwortzeiten zu garantieren.

Wenn du „komplett“ durchlaufen willst, ist es wahrscheinlich einfacher alle CSV Dateien im DB Ordner selbst zu durchlaufen.

Beachte, dass du in PHP auch ein Memory Limit hast, das ggf. nach Jahren des Loggens bei Millionen von Einträgen greifen kann.

paresy

In meinem Fall wollte ich die Zündphasen meiner Heizung ermitteln. Dazu muss ich den Stromverbrauch durchlaufen. Wenn der Wert zwischen 1200 und 1400W liegt und dann 8 Minuten anhält ist es eine Zündphase. Damit befülle ich dann eine Zähler-Variable. Durch das Rückwärts laufen muss ich alles zwischen Speichern und umkehren und dann erst in eine Variable schreiben. So kann ich dann dann im Char sehen wie hoch die Taktung der Heizung ist.

Generell wären mir solche Grundfunktionen im Symcon lieber.

So sieht das Ganze grob aus. Das könnte man deutlich einfacher haben.

<?php

$pos = time();
$run = true;
$high = false;
$end = 0;
$max_iterate = 200;
$result = array();

$i = 0;
while($run) {
    $i++;

    $list = AC_GetLoggedValues(29620, 51034, 0, $pos, 0);
    foreach($list as $data) {
        $value = $data['Value'];
        $pos = $timestamp = $data['TimeStamp'];
        if(!$high && $value > 1000 && $value < 1400) {
            $high = true;
            $end = $timestamp;
        }
        if ($high && $value <= 1000) {
            $start = $prev_timestamp;
            $duration = round((($end - $start) / 60), 1);
            if ($duration > 5 && $duration < 8) {
                $result[] = $end;
                #echo strftime("%d.%m.%Y %H:%M:%S", $start) . ' - (' . $duration ." min)\n";
            }
            $high = false;
        }
        $prev_timestamp = $timestamp;
        $prev = $data;
    }
    if ($i >= $max_iterate && !$high) {
        $run = false;
        #echo $pos."\n";
    }
    if ($i >= ($max_iterate+1)) $run = false;
}

$result2 = array();
$result = array_reverse($result);
$r = 0;
foreach($result as $row) {
    $r++;
    $result2[] = array('TimeStamp' => $row, 'Value' => $r);
}
SetValueInteger(21019, $r);

print_r($result2);

AC_DeleteVariableData(29620, 21019, 0, 0);
AC_SetLoggingStatus(29620, 21019, true);
AC_SetAggregationType(29620, 21019, 1);
AC_AddLoggedValues(29620, 21019, $result2);
AC_ReAggregateVariable(29620, 21019);