Pi - Automatische Reaggregation aller geloggten Variablen

Hallo,

habe mal am Pi (Odroid) das Skript „Automatische Reaggregation aller geloggten Variablen“ etwas umgebaut.
Es reicht mir, um einen Trend zu sehen.

<?
/*****
*
* Automatische Reaggregation aller geloggten Variablen
*
* Dieses Skript reaggregiert automatisch alle geloggten Variablen nacheinander
* automatisiert bei Ausführung. Nach Abschluss des Vorgangs wird der Skript-Timer
* gestoppt. Zur erneuten kompletten Reaggregation ist der Inhalt der automatisch
* unterhalb des Skripts angelegten Variable 'History' zu löschen.
*
*****/

$archiveHandlerID = IPS_GetInstanceIDByName("Archive", 0);

$historyID = CreateVariableByName($_IPS['SELF'], "History", 3, "");
// Neu rein, TS
$historyIDdef = CreateVariableByName($_IPS['SELF'], "History defekte ID", 3, "");
// Neu rein ENDE, TS
$finished = true;
$history = explode(',', GetValue($historyID));
// Neu rein, TS
$historydef = explode(',', GetValue($historyIDdef));
// Neu rein ENDE, TS
$variableIDs = IPS_GetVariableList();

foreach ($variableIDs as $variableID)
{
// Raus,TS! 
//       if(IPS_GetVariable($variableID)["VariableValue"]["ValueType"] != 3)
// Raus ENDE

	 if(IPS_GetVariable($variableID)["VariableType"] != 3)
    {
        if (AC_GetLoggingStatus($archiveHandlerID, $variableID) && !in_array($variableID,$history))
        {
            $finished = false;
// Neu rein, TS
                $history[] = $variableID;
                SetValue($historyID, implode(',', $history));
// Neu rein Ende, TS
            if (@AC_ReAggregateVariable($archiveHandlerID, $variableID))
            {
// Neu raus, TS
//                $history[] = $variableID;
//                SetValue($historyID, implode(',', $history));
//                print_r ($variableID);
// Neu raus ENDE, TS
            }
// Neu rein, TS
            else
				{
	                $historydef[] = $variableID;
						 SetValue($historyIDdef, implode(',', $historydef));
				}
// Neu rein Ende, TS
            break;
        }
    }
}

if ($finished)
{
    IPS_LogMessage('Reaggregation', 'Reaggregation completed!');
}

IPS_SetScriptTimer($_IPS['SELF'], $finished ? 0 : 5); //zum testen, da schneller auf Odroid....
// IPS_SetScriptTimer($_IPS['SELF'], $finished ? 0 : 60); // Orginal

function CreateVariableByName($id, $name, $type, $profile = "")
{
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']);
        if($profile !== "")
        {
            IPS_SetVariableCustomProfile($vid, $profile);
        }
    }
    return $vid;
}
?>

Starte ich um ca 0:10 Nachts, vorher der diedie „Variablen“ ($history und $historydef) per Timer gelöscht…

Hallo,

eine Frage zum löschen derVariablen. wie löscht du die?

Gruß

Oliver

Hallo,

ich habe deinen Thread mal nach Anleitungen / Nützliche PHP Skripte verschoben.

Grüße,
Kai

Hallo,

ich habe das Skript zur automatischen Aggregation eingeplant. und die Variablen werden wie beschrieben vorher immer gelöscht.

wenn ich nun Zeiträume wie Woche, Monat oder Jahr aufrufen will, kommt die Meldung:

„Rendering a week needs to start at 00:00:00“

hab ich da noch einen Fehler im Script?
Script wurde 1zu1 übernommen.

<?

/*****
*
* Automatische Reaggregation aller geloggten Variablen
*
* Dieses Skript reaggregiert automatisch alle geloggten Variablen nacheinander
* automatisiert bei Ausführung. Nach Abschluss des Vorgangs wird der Skript-Timer
* gestoppt. Zur erneuten kompletten Reaggregation ist der Inhalt der automatisch
* unterhalb des Skripts angelegten Variable 'History' zu löschen.
*
*****/

$archiveHandlerID = IPS_GetInstanceIDByName("Archive", 0);

$historyID = CreateVariableByName($_IPS['SELF'], "History", 3, "");
// Neu rein, TS
$historyIDdef = CreateVariableByName($_IPS['SELF'], "History defekte ID", 3, "");
// Neu rein ENDE, TS
$finished = true;
$history = explode(',', GetValue($historyID));
// Neu rein, TS
$historydef = explode(',', GetValue($historyIDdef));
// Neu rein ENDE, TS
$variableIDs = IPS_GetVariableList();

foreach ($variableIDs as $variableID)
{
// Raus,TS! 
//       if(IPS_GetVariable($variableID)["VariableValue"]["ValueType"] != 3)
// Raus ENDE

     if(IPS_GetVariable($variableID)["VariableType"] != 3)
    {
        if (AC_GetLoggingStatus($archiveHandlerID, $variableID) && !in_array($variableID,$history))
        {
            $finished = false;
// Neu rein, TS
                $history[] = $variableID;
                SetValue($historyID, implode(',', $history));
// Neu rein Ende, TS
            if (@AC_ReAggregateVariable($archiveHandlerID, $variableID))
            {
// Neu raus, TS
//                $history[] = $variableID;
//                SetValue($historyID, implode(',', $history));
//                print_r ($variableID);
// Neu raus ENDE, TS
            }
// Neu rein, TS
            else
                {
                    $historydef[] = $variableID;
                         SetValue($historyIDdef, implode(',', $historydef));
                }
// Neu rein Ende, TS
            break;
        }
    }
}

if ($finished)
{
    IPS_LogMessage('Reaggregation', 'Reaggregation completed!');
}

IPS_SetScriptTimer($_IPS['SELF'], $finished ? 0 : 5); //zum testen, da schneller auf Odroid....
// IPS_SetScriptTimer($_IPS['SELF'], $finished ? 0 : 60); // Orginal

function CreateVariableByName($id, $name, $type, $profile = "")
{
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']);
        if($profile !== "")
        {
            IPS_SetVariableCustomProfile($vid, $profile);
        }
    }
    return $vid;
}
?>

Ergänzung:
einelne Tage kann ich Tageweise im Webfront ohne Probleme zurückblättern

Gruß

Oliver

Hallo,

hat sich auch erledigt. Der Aufruf erfolgte aus einer Windows Oberfläche, auf dem Rechner scheint das Symcon nicht korrekt installiert zu sein.
Von den anderen Rechnern kommt der Fehler nicht

Gruß

Oliver

Sorry Oliver ,
habe das länger nicht mehr benutzt, da damals ein Fehler im System war, und inzwischen andere Hardware als Odruid werkelt.

Hallo,

ich bin bei der suche nach meinen zig Meldungen zur Aggregation („invalid data for aggregation“) nun auf das Skript hier gestoßen. Wenn ich es ausführe, kommt auch die Meldung für alle einzelnen Variablen und am Ende taucht das Reaggregation completed im Meldungsfenster auf.
Was mich nun interessieren würde:

  • Warum wird das Ereignis direkt nach einmaligem Ausführen wieder inaktiv gesetzt?
  • Wie oft ist es sinnvoll die Aggregation auszuführen?
  • Und allgemein vielleicht noch: Was passiert wenn ich es nicht ausführe. Ausser der Fehlermeldung „invalid data…“ sehe ich keine Auswirkungen im System.

Danke und Grüße
Marcel

Hallo,

nun grabe ich den etwas älteren Beitrag wieder aus damit die alten Hasen hier sehen das ich als Neuling nicht wegen jeder Frage einen neuen Thread eröffne sondern das Forum schon erstmal durchsuche.

Ich habe genau die gleichen Fragen wie mein Vorredner Marcel.

Es währe nett wenn dies einer der ausgefuchsten Profis beantworten könnte.

Nein, in der Doku habe ich nichts gefunden oder evtl übersehen.:wink:

Gruß
Thomas

So ein Mist, gerade habe ich gesehen das dies hier falsch plaziert ist. Es steht groß und fett KEINE FRAGE!

Das habe ich gerade erst gesehen den ich bin auf diesen Beitrag über die Suche gekommen.

Jetzt steht es nun mal da, ich kann es nicht ändern.:rolleyes:

Hi,

das könnte erklären warum ich auch keine Antwort erhalten habe, sorry dafür :o.

Ich bin mittlerweile soweit, dass die Fehlermeldungen weg sind. Ich habe vor einigen Wochen das loggen aller Variablen deaktiviert und die Datenbank gelöscht. Nach und nach habe ich jeden Tag wieder einzelne Variablen auf „logging“ gestellt, weil ich irgendwie vermutet habe, dass vielleicht eine bestimmte Variable den Fehler provoziert. Seit dem hatte ich keine Probleme mehr.

Hey Marcel,

Fehler habe ich keine aber eine Antwort auf die Fragen würde mich schon interessieren.

  • Warum wird das Ereignis direkt nach einmaligem Ausführen wieder inaktiv gesetzt?
  • Wie oft ist es sinnvoll die Aggregation auszuführen? bzw. reaggregieren

Wenn wir jetzt einen neuen Thread eröffnen werden wir gesteinigt. :smiley:

Mal abwarten vielleicht erbarmt sich ja doch noch jemand.

Das script von Thomas benutzt vermutllich niemand mehr, da beim Start von IPS schon automatisch die Daten reaggregiert werden. Dort mal ins log sehen.
Im ArchivControl sind alle Datensätze zu sehen. Dort kann jeder einzelne aggregiert oder bearbeitet werden. Sie können mit Datum/Uhrzeit und Wert eingesehen werden. Der einzige Wermutstropfen dabei ist, dass der Unix-Timestamp aus dem log in einen für uns lesbaren Datums/Uhrzeitwert umgerechnet werden muss.
Gibt es denn für diese ‚fehlerhaften‘ Werte Grafiken mit Auffälligkeiten?

Wenn sich die Probleme so nicht lösen lassen: neuer Thread, aber nicht bei Scripten.
Grüße, Gerhard

Hallo Gerhard,

danke für Deine Antwort. Ich habe keine Fehler. Ich wollte es nur verstehen.

Du meintest " da beim Start von IPS schon automatisch die Daten reaggregiert werden. " aber IPS läuft doch 24h ?

Ja. Aber zu Zeiten, die ich nicht kenne, läuft ja die automatische Agregation von Werten eines Tages zu einem Tageswert, die von Tagen zu einem Wochenwert, etc.

Ahh… ja, wieder was dazu gelernt;)

Hallo stern,

dass Skript ist uralt und war damals mal auf einer alten IPS Version nötig, da dort mal was nicht auf dem Odruid System lief.
Einfach nicht mehr nutzen !

Heute kannst du das über die Konsole direkt machen, falls mal was nicht passt.

Hallo,

ich habe das Skript vor einiger Zeit angepasst und es funktioniert perfekt :slight_smile: Mein Dank geht an tomgr und paresy der auch einen Teil veröffentlicht hatte. Ich muss, da ich alles vom Entwicklungssystem zum Produktivsystem übertrage, nach einem Neustart die Variablen neu reaggregieren. Die Automatik beim Start von IPS reicht da nicht.

KID_ARCHIV ist die Id vom Archiv.

$historyID = CreateVariableByName($_IPS['SELF'], "History", 3);

$finished = true;
$history = explode(',', GetValue($historyID));
$variableIDs = IPS_GetVariableList();
 
foreach ($variableIDs as $variableID)
{

	if(IPS_GetVariable($variableID)['VariableType'] != 3)
	{
		if (AC_GetLoggingStatus(KID_ARCHIV, $variableID) && !in_array($variableID,$history))
		{
			$finished = false;
			if (@AC_ReAggregateVariable(KID_ARCHIV, $variableID))
			{
				$history[] = $variableID;
				SetValue($historyID, implode(',', $history));
			}
			break;
		}
	}
}

if ($finished)
{
	IPS_LogMessage('Reaggregation', 'Reaggregation completed!');
	SetValueString($historyID, "");
}

IPS_SetScriptTimer($_IPS['SELF'], $finished ? 0 : 3);


function CreateVariableByName($id, $name, $type)
{
	$vid = @IPS_GetVariableIDByName($name, $id);
	if($vid === false)
	{
		$vid = IPS_CreateVariable($type);
		IPS_SetParent($vid, $id);
		IPS_SetName($vid, $name);
		IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']);
	}
	return $vid;
}

Vielleicht hilft das ja :slight_smile:

Gruß
Hans