Probleme mit AC_AddLoggedValues

Ich möchte Daten zu einer Float Variable hinzufügen. Folgender Code wird verwendet:

foreach ($daten as &$eintrag) {

$date = DateTime::createFromFormat('d.m.Y H:i:s', $eintrag['TimeStamp']);
$eintrag['TimeStamp'] = $date->getTimestamp();

// Komma in Float umwandeln
$eintrag['Value'] = floatval(str_replace(',', '.', $eintrag['Value']));

}

AC_AddLoggedValues (38103, 24896, $eintrag);
print_r($eintrag);

Ich erhalte folgende Fehlermeldung:
Warning: Cannot auto-convert value for parameter Value (Type does not match) in /var/lib/symcon/scripts/15148.ips.php on line 29
Array
(
[TimeStamp] => 1779656400
[Value] => 154.5
)

(Line 29 ist die Funktion AC_AddLoggedValues)

Ich kann mir das nicht erklären. Das selbe Ergebnis erhalte ich auch wenn ich Value nur eine Zahl zuordne. Kann mir einer weiterhelfen?

Danke Dirk

Sieh dir mal das Beispiel aus der Doku an

AC_AddLoggedValues(12345, 34567, [
  [
    'TimeStamp' => 1128255120,
    'Value' => 30
  ],
  [
    'TimeStamp' => 1128257851,
    'Value' => 50
  ],
  [
    'TimeStamp' => 1128278514,
    'Value' => 130
  ]
]);

Ich würde sagen, dir fehlt noch eine [ am Beginn und eine am ] am Ende. Es ist ein zweidimensionales Array [[timestam,value],[timestamp,value],..]

Vielen Dank für die rasche Antwort
Ich bin eigentlich davon ausgegangen, dass der Timestamp und Value die Schlüsselbezeichnungen sind für den einzelnen Datensatz.

Auch im folgenden Beitrag AC_AddLoggedValues wird dasselbe Ergebnis erzielt und es funktioniert auch.

Dirk

Welchen Typ hat denn die Zielvariable 24896?

Die Variable ist vom Typ Float

Dein Array ist nicht korrekt. Es fehlt eine „Tiefe“.

Mit den Arrays habe ich ja auch durchaus meine Schwierigkeiten. Wie erzeuge ich die Tiefe?

Ungetestet. Hab [ ] vor Timestamp und Value hinzugefügt

Ich verwende die Funktion hier. Ist ein Skript aus dem Forum zum Übertragen von Archivwerten, wenn der Typ sich ändert (Integer←→Float)

const VARIABLE_ID_FROM = ;
const VARIABLE_ID_TO = ;
const MAX = 100000;

$archiveID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0];

AC_SetLoggingStatus($archiveID, VARIABLE_ID_TO, true);
AC_SetAggregationType($archiveID, VARIABLE_ID_TO, AC_GetAggregationType($archiveID, VARIABLE_ID_FROM));

$endtime = 0;
$count = 0;

do {
    $items = AC_GetLoggedValues($archiveID, VARIABLE_ID_FROM, 0, $endtime, MAX);
    $values = [];

    foreach ($items as $item) {
        $endtime = $item['TimeStamp'] - 1;
        // hier erfolgt die Konvertierung nach Integer
        $values[] = ['TimeStamp' => $item['TimeStamp'], 'Value' => $item['Value']];
    }
    $count += count($values);
    AC_AddLoggedValues($archiveID, VARIABLE_ID_TO, $values);

} while (count($items) === MAX);

AC_ReAggregateVariable($archiveID, VARIABLE_ID_TO);

echo sprintf('Es wurden %s Datensätze übertragen.', $count);

Das sagt unsere firmenintere KI :wink:

$values = [];

foreach ($daten as $eintrag) {

    $date = DateTime::createFromFormat('d.m.Y H:i:s', $eintrag['TimeStamp']);
    if ($date === false) {
        // optional: Fehlerbehandlung / Logging
        continue;
    }

    $values[] = [
        'TimeStamp' => $date->getTimestamp(),
        'Value'     => floatval(str_replace(',', '.', $eintrag['Value'])),
    ];
}

// Jetzt das gesamte Array an AC_AddLoggedValues übergeben
AC_AddLoggedValues(38103, 24896, $values);
print_r($values);

Die firmeninterne KI (was immer das ist) hat die Lösung, jetzt hat es funktioniert.

Vielen Dank für die Hilfe.

Dirk

Auf Firmenlaptops (bzw. in internen Netzwerk) sind alle KI’s gesperrt. Aber wir haben eine eigene, die IPS und PHP kennt :wink: Ich war zu faul um die Frage am privaten Laptop zu stellen :smiley:

Tolles Ding, da wird man ja echt neidisch