AC_AddLoggedValues

foreach ($VData as $Key => $VDat) {
            print_r($Key."\n");
            print_r($VDat);
            AC_AddLoggedValues (CONST_GENERALLY_ID_ARCHIVHANDLER,$Key , $VDat);
            AC_ReAggregateVariable(CONST_GENERALLY_ID_ARCHIVHANDLER,$Key);
        }

Ich will Daten in eine Variable schreiben aber es funktioniert nicht. Es kommt aber kein Fehler.
Im Screenshot sieht man die Daten als Array ($VDat) und die ID der Variable (sKey)

Was mache ich falsch?

VG Dirk

hier muss doch die ID des Archivs rein.
Gruß, Peter

außer er hat sie über define als Konstante angelegt :wink:

Ja das ist eine Konstante. :slight_smile:
Ich hab es gefunden. Man muss das Array Value typecasten (intval) auf integer dann funktioniert es. Offensichtlich hat die Funktion ein Problem damit.

der folgende Code funktioniert:

$VDat[] = array(
   'TimeStamp' => strtotime($Time),
   'Value' => intval($Value)
); 
AC_AddLoggedValues (CONST_GENERALLY_ID_ARCHIVHANDLER,$Key , $VDat);

Ich wuerde erst einmal diesen Befehl ausserhalb der Schleife setzen.
Du benutzt ihn nach jedem Eintrag in das Archiv ohne zu wissen ob
er fertig ist.

Das funktioniert jetzt nach dem Typecasten und ich reaggregiere erst wenn ich fertig bin.
Gibt es eine Möglichkeit das ein Zeiteintrag eine Art unique Index besitzt. Es ist ja recht komplex jedes Mal zu prüfen ob es den Zeiteintrag schon gibt. Wenn die Routine doppelt läuft sind alle Einträge doppelt. Es ist doch nicht logisch das es zu einer Zeit 2 Werte gibt.

Doch, natürlich können zu einem Zeitpunkt in Sekundenauflösung mehrere Werte drin stehen. Stelle dir vor, dein Wert aktualisiert sich alle 100ms, dann sind das 10 verschiedene Werte in einer Sekunde, mit dem gleichen Zeitstempel aber chronologisch sortiert.

Aber die Zeit wird doch nur als integer gespeichert. Also max. Sekunde.

Ja, und deswegen können ja mehrere Werte in einer Sekunde abgespeichert werden, unabhängig jetzt von deiner Verwendung von AC_AddLoggedValues. Ich wollte nur ausführen, dass die Annahme, das ja der Zeitpunkt ein eindeutiger Schlüssel ist, leider nicht korrekt ist. Es können halt in absolut validen Beispielen mehrere Werte den gleichen Zeitstempel haben.

Also muss ich das selbst Prüfen wenn ich es verhindern will.

Hier falls einer die Funktion benötigt…


function AddLoggedValuesUnique($ID_Archive, $VarID, $arValues) {
    
    foreach ($arValues as $key => $Value) {
        if (count(AC_GetLoggedValues ($ID_Archive, $VarID, $Value['TimeStamp'], $Value['TimeStamp'], 0)) > 0) {
           unset($arValues[$key]);
        }
    }
    //neu sortieren
    $arValues = array_values($arValues);
    AC_AddLoggedValues ($ID_Archive,$VarID, $arValues);
}

// Übergeben wird ein normales Wertearray wie in der original Funktion
/*
$arVal[] = array(
             'TimeStamp' => strtoTime("09.07.2024 21:25:00"),
             'Value' => intval(25)
           ); 

$arVal[] = array(
             'TimeStamp' => strtoTime("09.07.2024 21:26:00"),
             'Value' => intval(26)
           ); 

AddLoggedValuesUnique($ID_Archive, $VarID, $arVal) ;

*/