Code um Archivdatum auszulesen

Ich kann ja verstehen, dass mein vorgeschlagener Beitrag etwas Nacharbeit benötigt, da er für ein Modul gedacht war. Aber der letzte Beitrag liefert doch genau, das was du suchst.

Ich habe es mal etwas angehübscht und mit Kommentaren versehen.


<?php

function GetFirst($end, $archiv, $var)
{
    $rc = "";
    $i = 100;  // max 100 iterations
    while ($i--)
    {
        $val = AC_GetLoggedValues ($archiv, $var, 0,$end, 10000); 
        $rc = $val[sizeof($val)-1];
        $end = $rc['TimeStamp'];            
        if (sizeof($val) <10000)   
        {
            return $rc;
        }
        echo $i . "
"; // das muss wieder raus
    }
    return $rc;
}  

$var = 42211; // hier die gewünschte Variable
$archiveHandlerID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0];

$val = AC_GetLoggedValues ($archiveHandlerID, $var, 0,0, 0);  // ersten Datensatz, 
if (sizeof($val) > 0)
{
    $tempdate = $val[sizeof($val)-1];

    // Check Limit --> rekursiv start ermitteln
    if (sizeof($val) >= 10000)   
    {
        $tempdate = GetFirst($tempdate['TimeStamp'], 28670, $var);
    }
}    

echo date("Y.m.d h:i", $tempdate['TimeStamp']);

Vielen Dank, genau so funktioniert es !!
Dieser Wert soll nun in eine Variable geschrieben werden und sollte sich der Wert ändern, sollte dieser automatisch aktualisiert werden…Wie könnte ich dieses Umsetzten?

Wenn du das Datum nur anzeigen möchtest, dann mit SetValueString in eine Variable schreiben.

Damit das regelmäßig aktualisiert wird, müsste das das Script regelmäßig aufrufen.

Vielleicht solltest du dir erstmal die Grundlagen von PHP und Symcon ansehen, bevor du so komplexe Probleme angehst ;).

Mir ist dein Problem absolut nicht klar, warum sollte sich das Startdatum einer geloggten Variable ändern, außer du löscht manuell über das Archivcontrol Werte?

ganz genau deshalb, wenn die Datensätze manuell gelöscht werden dann das aktualisierte Startdatum automatisch in die Variable.

Aber mal ganz von vorne: ich dachte ich finde ein Modul, in welchem die Betriebsstunden der Geräte aufgezeichnet werden. Ich habe aber nur den Betriebsstundenzähler in GitHub gefunden https://github.com/symcon/Betriebsstundenzaehler.git

So etwas in der Art habe ich mir vorgestellt, nur sollten hier…
a.) mehrere Geräte definierbar sein,
b.) einen Resetknopf für das löschen der Datensätze (Stundenzähler startet von vorne mit 0 Stunden)
c.) und das Startdatum der Aufzeichnung sollte angezeigt werden

Dieses Umzusetzen scheitert leider an meinen Kenntnissen, außer ich erhalte Unterstützung vom Forum.
Vielleicht ist ja hier jemand bereit, die Codes wären ja im Prinzip schon teilweise vorhanden…

Ansonsten, falls sich diesbezüglich niemand findet, kannst Du auch mal hier schauen Integratoren — IP-Symcon :: Automatisierungssoftware

Dort gibt es Menschen, die würden Dir auch helfen.

Grüße,
Christoph

SetValueString(33965, date("Y.m.d h:i", $tempdate['TimeStamp']);

funktioniert nicht, wo liegt der Fehler?

Jetzt wird ein Schuh draus :slight_smile:

Ich kenne zwar das Modul nicht, aber es scheint für deine Anforderung das richtige zu sein.

Gehe die Punkte am besten Schritt für Schritt an.

a) hier definierst du dir einfach mehrere Instanzen des „Betriebsstundenzählers“
b) der Resetknopf wäre ein Skript, das du in dein Webfront verlinkst. In dem Skript löscht du alle Archivdaten.
c) Als Zeitdatum des Aufzeichnungsstarts könntest du vielleicht die aktuelle Uhrzeit nehmen, wenn das Skript ausgeführt wird. Dann schreibst du die aktuelle Uhrzeit in deinem Skript noch in die Variable.

Das klingt doch machbar :slight_smile:

Wenn du den Weg gehen solltest, mach am besten einen neuen Thread auf. Dieser ist ja mit dem oben genannten Beispielcode gelöst.

Weiterhin Grundlagen ;), zähle die Klammern „)“ und finde den Fehler, da wird auch die Fehlermeldung drauf hindeuten.

Vielen Dank, dieser Fehler passiert mir immer wieder das man vor lauter Bäume den Wald nicht mehr sieht :slight_smile:
Gruß Yansop.

Das klingt gut, werde ich versuchen…

Gruß Yansop.

Die dann erscheinende Fehlermeldung besagt allerdings relativ genau, was dort schiefläuft :wink:

Anleitung zum löschen der Archivdaten: https://www.symcon.de/service/dokumentation/modulreferenz/archive-control/ac-deletevariabledata/

bei Startzeit=0 und Endzeit=0 wird allerdings die komplette Variable aus dem Archiv gelöscht

AC_DeleteVariableData(40680, 39034, 0, 0);

also setze ich die zuvor ermittelte Startzeit ein (Endzeit bleibt „0“)

<?php
function GetFirst($end, $archiv, $var)
{
    $rc = "";
    $i = 100;  // max 100 iterations
    while ($i--)
    {
        $val = AC_GetLoggedValues ($archiv, $var, 0,$end, 10000); 
        $rc = $val[sizeof($val)-1];
        $end = $rc['TimeStamp'];            
        if (sizeof($val) <10000)   
        {
            return $rc;
        }
        echo $i . "
"; // das muss wieder raus
    }
    return $rc;
}  

$var = 39034; // hier die gewünschte Variable
$archiveHandlerID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0];

$val = AC_GetLoggedValues ($archiveHandlerID, $var, 0,0, 0);  // ersten Datensatz, 
if (sizeof($val) > 0)
{
    $tempdate = $val[sizeof($val)-1];

    // Check Limit --> rekursiv start ermitteln
    if (sizeof($val) >= 10000)   
    {
        $tempdate = GetFirst($tempdate['TimeStamp'], 28670, $var);
    }
}    

echo date("Y.m.d h:i", $tempdate['TimeStamp']);
AC_DeleteVariableData(40680, 39034, $tempdate, 0);

Funktioniert so nicht, muss die Startzeit „$tempdate“ anders definiert werden?

Grundsätzlich wäre es hilfreich, wenn Du die Fehlermeldung hier mit posten könntest. Das würde es etwas erleichtern.

Die Fehlermeldung hier in diesem Fall lautet:

Cannot auto-convert value for parameter StartTime

Heißt also, dass $tempdate irgendwie nicht ganz in Ordnung ist. Gemäß Dokumentation AC_DeleteVariableData — IP-Symcon :: Automatisierungssoftware wissen wir, dass dort bei „Startzeit“ ein Zeitstempel erwartet wird.

Ruft man mal

print_r($tempdate);

auf, so stellt man fest, dass $tempdate ein array ist. Die Funktion erwartet einen Zeitstempel und Du lieferst ein Array. Kann nicht funktionieren. Nun wissen wir, was der Fehler ist.

In dem Feld „TimeStamp“ des arrays ist der Zeitstempel enthalten, den Du für den Befehl AC_DeleteVariableData brauchst.

Aber genau das willst du doch. Alle Einträge löschen und den Zähler von vorne beginnen lassen …

Richtig, es sollen alle Datensätze gelöscht werden, aber nicht die Variable im Archiv.
Denn das passiert wie bereits erwähnt bei Startzeit=0 und Endzeit=0.

mit dem Code funktioniert es:

AC_DeleteVariableData(40680, 39034, $tempdate['TimeStamp'], 0);

allerdings nur wenn auch Daten vorhanden sind.
Wurden noch keine Daten geloggt und möchte mit dem Script löschen erhalte ich Sinngemäß Fehlermeldungen.
Also muss ich nur noch einen Weg suchen, das Script abzubrechen wenn keine Daten geloggt wurden…

Und? Hast Du was gefunden?

Falls nicht: AC_GetLoggingStatus — IP-Symcon :: Automatisierungssoftware

Ok, das hatte ich übersehen. Ich würde dennoch den Weg gehen. Du kannst nach dem Löschen die Archivierung einfach neu einschalten:
https://www.symcon.de/service/dokumentation/modulreferenz/archive-control/ac-setloggingstatus/

Dort findest du auch ein Beispiel (Zweizeiler) :slight_smile:

Danke für den Tipp, somit brauche ich erst gar nicht nach dem Startpunkt zu suchen…
Was mich noch etwas verwundert, dass ich beim Ausführen des Scripts und setzen des Datums in der Variable eine Uhrzeit von 13.24Uhr erhalte, aber in der WebFront eine Uhrzeit von 01.24Uhr angezeigt bekomme…

Echt? Du wolltest nur alle Werte für diese Variable im Archiv löschen?

Tipp: Es ist für alle Helfenden einfacher, wenn man so viele Informationen wie möglich von Anfang an preisgibt.

mein letztes Problem: wie kann ich

date("d.m.y h:i")

in ein 24Stunden Format umbauen?
Aktuell wird die Zeitangabe in AM/PM ausgegeben…