Archivwerte übertragen zwischen Variablen verschiedenen Typs

Hallo,

ich möchte gerne die Archivwerte von einer Float-Variablen zu einer Integer Variablen transferieren.

Hat da vielleicht schon jemand ein Skript zu?

Burkhard

Ok, dann habe ich mich mal selber hingesetzt :slight_smile:

Folgendes ist dabei herausgekommen:

<?php

const VARIABLE_ID_FROM = 42406;
const VARIABLE_ID_TO = 38173;
const MAX = 1000;

$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' => (int) $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);

Vielleicht kann es mal jemand gebrauchen.

Burkhard

Achtung: bei einer Variablen mit vielen Datensätzen (so ab 1 Mio) dauert das Übertragen schon etwas länger :slight_smile:
In diesen Fällen das Skript bitte nicht über den Skripteditor starten. Besser ist es, dann den Weg über das Kontextmenü → Automation ausführen zu wählen.

2 „Gefällt mir“

Vielen Dank,
konnte ich grade gut gebrauchen !
Sollte eigentlich Standard sein bei den Archivfunktionen :frowning:

Guten Morgen Burkhard,
für mein besseres Verständnis.
Überträgt das Script alle Daten oder gibt es da eine Limitierung auf Anzahl Datensätze oder ähnliches?
Funktioniert es mit normalen und mit Zähler Logs?

Hintergrund ist ich habe eine Float Variable mit Zählerdaten seit 2009 und würd diese gerne in eine integer Variable transferieren, nachdem der Stromzähler getauscht wurde möchte der neue eben als integer weiter arbeiten.

Hat sich erledigt.
Habe es zuerst an einer weniger wichtigen Variablen getestet und dann mit den richtigen.
Das Script von bumaas funktioniert perfekt. Die Daten werden kopiert und bleiben sogar in der Quell Variable erhalten.

Wirklich tolle Arbeit.
Würde es sehr begrüssen wenn man so etwas auch direkt im ArchivControl machen könnte.

Gruß
Giuseppe

Hi,

danke für das Script @bumaas

Ich habe es für meine Anwendung genutzt und das funktioniert auch alles.
Kann es aber doch sein das es eine Limitierung gibt, weil die Datensätze hören alle bei mir bei 65535 auf.

Im Archive habe ich für die Variabel die Anzahl der Datensätze geprüft und dort sind weit aus mehr Datensätze vorhanden.

Kann man denn überhaupt die Daten vollständig vom ersten bis zum letzten Datensatz portieren/kopieren ?

Gruß

65535 ist nicht nur durch Zufall 2^16 (also 2 Byte).

Wo das aber genau greift, weiß ich auch nicht.

Hi,

ich habe nochmal bei mir im IPS geschaut. Ich denke das kommt ja von den Spezialschalter Einstellungen, genau der die Werte tauchen dort auf.

Ich werde noch mit den Werten spielen und umstellen.

Falls aber doch Begrenzungen vorliegen, wäre interessant wie man das kopieren der Daten für alle Datensätze vornimmt.

Dann könnten die Daten ja nur anhand von einer kleiner Menge von Datensätze und im Zusammenhang vom Datum kopiert werden, oder ?

Gruß

An welche Spezialschalter denkst du? Es werden immer Portionen von 1000 Sätzen (== MAX) übertragen. Da sollten die Einstellungen eigentlich keine Rolle spielen.

An den Spezialschalter „ArchiveRecordLimit“. Wenn ich das richtig sehe sagt dieser ja aus das die Archive Funktionen mit diesen Wert begrenzt werden.

Deshalb werden ja auch immer nur Pakete von 1000 Sätzen gelesen und geschrieben. Das Limit sollte nicht greifen.

In der Do.-/While-Schleife ist das nicht das Thema, so wie du das erstellt hast, werden immer wieder neue Datensätze abgerufen.

Ich glaube mit der Funktion „AC_SetAggregationType“ sind im Archive eine begrenzte Anzahl von Datensätze nur zu sehen gewesen.

Ich habe gerade einen Test gemacht mit 13 Mio Einträgen (Float nach Integer übertragen). Dabei kommt es bei mir (unter Windows) zu Fehlermeldungen im Logfile

...
27.12.2022, 10:04:02 | Archive Control      | Could not rename file 2022/12//24998.csv on 5. try, will retry: rename: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.: "C:\ProgramData\Symcon\db/2022/12//_24998.csv", "C:\ProgramData\Symcon\db/2022/12//24998.csv"
...
27.12.2022, 10:08:01 | Archive Control      | Could not delete file 2022/12//24998.csv on 5. try, will retry: remove: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.: "C:\ProgramData\Symcon\db/2022/12//24998.csv"

Im Filesystem sieht man auch, dass nur 2 von 26 Monaten übertragen wurden. Das benötigt wohl noch eine genauere Analyse :frowning:

Burkhard

Edit: jetzt nach mehr als einer halben Stunde sind nun doch schon 3 Monate übertragen. Es sieht so aus, als ob das Skript zwar beendet wurde, aber im Hintergrund läuft wohl noch die Übertragung :thinking:
Man sieht auch am Zeitstempel er CSV Dateien, dass noch gearbeitet wird.

Ok, also 13Mio ist eine Hausnummer. Bei mir wären es gerade mal 2,3Mio.

Aber könnte es denn sein das deswegen ich im Archive nur diese Anzahl von 65535 gesehen habe?
Wobei dann genau nur die 65535 wäre ja irgendwie ein komischer Zufall.

Ist halt die Frage was passiert denn jetzt genau im Hintergrund oder auch nicht ?

Du hast dann in den dem DB Ordner noch zur Sicherheit überprüft ob die Dateien auch erzeugt bzw.
geschrieben wurden?

Mir war aufgefallen, dass wenn ich im Archiv die neue Variable erneut aggregiere, die Anzahl der Datensätze stieg.

Daraufhin habe ich mir das Archiv genauer angesehen und sehe, dass jetzt um 10:42 noch der 3. Monat in Arbeit ist:

Also: abwarten. Bei 26 Monaten wird er noch ein paar Stunden brauchen.

ah ok verstehe. Mhhh, kann man denn aber irgendwie erkennen oder irgendwo sehen
wie der aktuelle Zustand generell ist.

Wie würde man denn jetzt sowas sicherstellen können das alle Daten portiert worden sind?
Irgendwie fehlt mir da jetzt die Sicherheit oder das vertrauen das alles gut gegangen ist

Ich finde da hängt man irgendwie in der Luft.

In den PHP Informationen sieht man, dass das Skript noch läuft:

Ich habe mich jedoch vom Skripteditor irritieren lassen, der den Anschein machte, als ob das Skript schon beendet sei. Das Fenster war nach ein paar Minuten wieder „aktiv“.

Lediglich die finale Ausgabe der übertragenen Sätze hatte ich etwas vermisst.

das gleiche Verhalten habe ich auch.

Nur mit dem Unterschied das gerade Symcon die Verbindung zur ProKonsole verloren hat.

In der PHP Info bleibt das Script weiter im Aufruf vorhanden. Ob das jemals wieder frei gegeben wird ist absolut fraglich. Ich lasse das erstmal weiter so laufen. Im Editor kann ich aber wieder das Script bearbeiten.

Aber ich sehe da gerade echt das Problem das man nicht sicher die Daten transferieren kann.

ich habe das Script bei mir weiter laufen lassen. Grundlegend werden die Scripte nicht mehr frei.

Aber das Daten transferieren läuft im IPS Hintergrund weiter, was genau passiert kann man nicht erkennen. Das ist bei so einer Menge von Daten und langer Laufzeit nicht gut.

Irgendwann sind die Datensätze dann doch im Archive zu sehen, wenn man mehrmals nach und nach immer wieder in das Archive geht sind mehr Datensätze vorhanden.

Aber dieses Verhalten finde ich sehr kritisch und aktuell im IPS Hintergrund nicht gut gelöst wenn man keine Chance hat zu erkennen was gerade im Hintergrund abgearbeitet wird.

Ich wollte dann das Szenario wiederholen. Ich habe dann die Daten im Archive gelöscht und der Dienst ist abgestürzt !!!

Das kann ich nicht bestätigen.

Da könnte man sicherlich eine Hilfsvariable mit Zwischenwerten füllen. Oder einfach im Kommentar vermerken, dass die Verarbeitung großer Datenmengen entsprechend Zeit benötigt.

Das ist klar, dass dann unerwartete Dinge passieren können.