Logging to database

Sieht aus, als stünde ich weiterhin auf dem Schlauch…
Die Suche nach der Modulkennung ist ja noch erfolgreich:

	foreach(IPS_GetModuleList() as $guid)
	{
	  $module = IPS_GetModule($guid);
	  echo $module['ModuleName']." = ".$guid."
";
	}

Archive Control = {43192F0B-135B-4CE7-A0A7-1475603F3060}

Aber die konkrete Instanzkennung finde ich einfach nicht:

	$acid=IPS_GetInstanceIDByName ("Archive Control", 0);

Warning: Objekt Archive Control wurde nicht gefunden in C:\Programme\IP-Symcon\scripts\52114.ips.php on line 10

	$acids=IPS_GetInstanceListByModuleID("43192F0B-135B-4CE7-A0A7-1475603F3060}"); // Archive Control
	print_r ($acids);

Array
(
)

Was mache ich falsch?

Da fehlt eine {.

So läuft es.


    $acids=IPS_GetInstanceListByModuleID("{43192F0B-135B-4CE7-A0A7-1475603F3060}"); // Archive Control
    print_r ($acids);

Du findest die Instanz auch unter Kern Instanzen :slight_smile:

paresy

Danke, die Klammer hatte ich in der Tat übersehen.

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

Das Modul heißt Control, die Instanz Handler ;).

Hi Horst,

danke für den speziellen Tip. Gibt es irgendwo eine Erklärung darüber, was genau eine Instanz, was ein Objekt, was ein Modul etc. ist, wie sie zusammenhängen und ob das ein IPS-spezifisches oder ein PHP-Konzept ist? Die Verwendung dieser Begriffe wie sie hier erfolgt kann ich (noch?) überhaupt nicht in Einklang mit der in der Objektorientierung üblichen zusammenbringen.

@Paresy: Ein Taschenmesser in den falschen Händen kann auch gefährlich sein. Willkür und Zensur finde ich aber noch gefährlicher. Ist die SQLlite-„Datenbank“ vielleicht nicht ausgegoren genug um dem Ansturm standzuhalten?

Korrektur: Den Begriff Zensur habe ich an dieser Stelle voreilig verwendet. Das tut mir leid. Es war mir nicht bewusst, daß es eine Historie gibt über die die Änderungen an den Beiträgen nachvollziehbar sind.

Alles, was im Baum eine ID hat ist ein IPS-Objekt. Objekte haben dann immer noch einen spezielleren Typ: Kategorie, Instanz, Variable, Skript, Ereignis, Mediendatei. Instanzen sind dann wiederum von einem Modultyp. Mit PHP hat das alles nichts zu tun.

Die Datenbank wird nicht zensiert. Du kannst den IPS-Dienst gerne beenden und sie Dir ansehen. SQLite wird von uns in unveränderter Version benutzt. Mehrere Threads mag SQLite nicht sonderlich gerne, daher sollte man unsere Funktionen AC_GetAggregatedValues und AC_GetLoggedValues zum Auslesen benutzen. Der einzige Parameter, der von Namen her nicht ersichtlich ist, ist AggregationType (0: Stunden, 1: Tage, 2: Wochen, 3: Monate, 4: Jahre) bei AC_GetAggregatedValues. Da das ganze noch Beta ist, steht auch noch nichts in der Dokumentation.

Hallo Horst,

vielen Dank für die Erklärung! Bin gespannt, ob ich damit bei den nächsten Versuchen besser klarkomme.

Mit Zensur bezog ich mich darauf, daß Paresy aus Beitrag #23 in diesem Thread ein Skript gelöscht hat, das das Logging global für alle Variablen einschaltet.

Grüßle,
moishe

Das sind ja schonmal geniale Funktionen!!! :loveips:

AC_GetAggregatedValues funktioniert super: :slight_smile:


Nur mit der Funktion AC_GetLoggedValues komme ich nicht so ganz klar.

Wenn ich z.B. eine Temperaturvariable abfrage kommt:

[Duration] => 642
[LastTime] => 1258171258
[TimeStamp] => 1258170937

Die eigentlichen Temperaturwerte bekomme ich da aber irgendwie nicht raus. Hab ich da einen Knoten im Kopf?

Also bei mir ist da immer noch ein Feld Value vorhanden. Wäre sonst ja auch recht sinnfrei…

Äh, ja, das denke ich mir auch…


//$d['ObjectID'] = Instanz

$raw=AC_GetLoggedValues($d['ObjectID'],47090 /*[Aussenbereich\HMS100 TF\Luftfeuchtigkeit]*/,0,time(),100);

print_r($raw);

Gibt:

    [0] => Array
        (
            [Duration] => 314
            [LastTime] => 1258738071
            [TimeStamp] => 1258737758
        )

    [1] => Array
        (
            [Duration] => 313
            [LastTime] => 1258737445
            [TimeStamp] => 1258737445
        )

...
...

:confused:

print_r(AC_GetLoggedValues(19294 /*[Archive Handler]*/ , 44285, 1250380418, 1250380418 + 3600, 3));

gibt bei mir

Array
(
    [0] => Array
        (
            [Duration] => 127
            [LastTime] => 1250384123
            [TimeStamp] => 1250384007
            [Value] => 
        )

    [1] => Array
        (
            [Duration] => 8
            [LastTime] => 1250383999
            [TimeStamp] => 1250383999
            [Value] => 
        )

    [2] => Array
        (
            [Duration] => 31
            [LastTime] => 1250383982
            [TimeStamp] => 1250383968
            [Value] => 
        )

)
Array
(
    [0] => Array
        (
            [Duration] => 1881
            [LastTime] => 1258803621
            [TimeStamp] => 1258801741
        )

    [1] => Array
        (
            [Duration] => 2703
            [LastTime] => 1258800932
            [TimeStamp] => 1258799038
        )

    [2] => Array
        (
            [Duration] => 1527
            [LastTime] => 1258798098
            [TimeStamp] => 1258797511
        )

)

hm :confused:

Bei mir läuft die Version 2.10

Guten Morgen!

Ich muß sysrun beipflichten: Bei mir kommen auch keine Werte (ebenfalls unter 2.10):

Korrektur: Skript und Ausgabe mussten an dieser Stelle korrigiert werden. Die Aussage bleibt jedoch gleich.

<?
	$archiveHandlerID = IPS_GetInstanceIDByName("Archive Handler", 0);
	$objectID = 53561 /*[UG\BD\HMS100 TF UG Bad\Luftfeuchtigkeit]*/;
	$starttime = 0; // 0 for epoch // time()-(n*60*60) for n hours ago
	$endtime = time(); // time() for "now"
	$aggregation = 1; // 0: Stunden, 1: Tage, 2: Wochen, 3: Monate, 4: Jahre
	$limit = 2; //

	print_r(AC_GetAggregatedValues($archiveHandlerID, $objectID, $aggregation, $starttime, $endtime, $limit));
	print_r(AC_GetLoggedValues($archiveHandlerID, $objectID, $starttime, $endtime, $limit));
?>
Array
(
    [0] => Array
        (
            [Avg] => 63.77
            [Duration] => 77940
            [LastTime] => 1258923698
            [Max] => 88.8
            [MaxTime] => 1258917750
            [Min] => 54.4
            [MinTime] => 1258876119
            [TimeStamp] => 1258844400
        )

    [1] => Array
        (
            [Avg] => 68.04
            [Duration] => 86400
            [LastTime] => 1258844399
            [Max] => 87.4
            [MaxTime] => 1258823219
            [Min] => 59.2
            [MinTime] => 1258793796
            [TimeStamp] => 1258758000
        )

)
Array
(
    [0] => Array
        (
            [Duration] => 1
            [LastTime] => 1258923698
            [TimeStamp] => 1258923698
        )

    [1] => Array
        (
            [Duration] => 313
            [LastTime] => 1258923385
            [TimeStamp] => 1258923385
        )

)

Korrektur: Die Behauptung an dieser Stelle, daß die Aggregationstypen etwas seltsam zu funktionieren scheinen, ziehe ich zurück. Das lag an meinem fehlerhaften Aufruf. (oben nun korrigiert.)

Wird es auch eine Aggregation nach Minuten geben? Wenn ich Stoßlüftungszeiten mit Zimmerauskühlung korrelieren will, komme ich um Minuten nicht drumherum. :=)
Ergänzung: Wenn die Abfrage der Einzelwerte geht, kann man natürlich selbst aggregieren. Es für die Minutenweise Aggregation nicht selbst coden zu müssen, wäre trotzdem eine feine Sache. Ich könnte mir auch „custom aggregation intervals“ vorstellen, die man vielleicht mit einer negativen Sekundenzahl angeben könnte, also z.B. -(142460*60) für zweiwochenweise Aggregation.

sysrun, wie hast Du denn die netten Bildchen erzeugt?

Grüßle,
moishe

Mit pChart

pChart | a PHP Charting library

Hab mir die Sache angesehen und der Wert wird erst ab der 2.2 in PHP angezeigt.

Also noch ein wenig Geduld :slight_smile:

Ah, fein! :loveips:

Kannst du uns dazu mal ein IPS/php Beispiel z.B. für deine Temperatur-Grafik bereitstellen?

Hallo Ralf,

ich hab mir damit auch mal gespielt. Ist eigentlich relativ einfach.

  1. Du brauchst nur die 3 .class Dateien in den Script Ordner kopieren.
  2. neues Script erstellen
  3. die class per include einbinden
  4. Graphen zeichnen
<?
 // Standard inclusions
include('pData.class');
include('pChart.class');

$IDAC = 11320; 				//ArchivControl
$IDAussentemp = 20798;		//Variable die die geloggten Werte enthält

//stündliche Werte :	0
//werte einlesen von: vor 24h ( time()-3600*24)
//					bis jetzt (time() )
//Limit:				99
$buffer = AC_GetAggregatedValues($IDAC,$IDAussentemp,0,time()-3600*24,time(),99);
krsort($buffer); // Array umdrehen da sonst der Graph von rechts nach links gezeichnet wird

 // Dataset definition   
$DataSet = new pData;
foreach ($buffer as $werte){
	$DataSet->AddPoint($werte["Min"],"MIN");
	$DataSet->AddPoint($werte["Max"],"MAX");
	$DataSet->AddPoint($werte["Avg"],"AVG");
	$DataSet->AddPoint(date("H",$werte["TimeStamp"]),"TIME");
}

$DataSet->AddAllSeries();
$DataSet->RemoveSerie("TIME");
$DataSet->SetAbsciseLabelSerie("TIME");  //Y-Achsen Einteilung
$DataSet->SetSerieName("MaxTemp","MAX");
$DataSet->SetSerieName("Durchschnitt","AVG");
$DataSet->SetSerieName("MinTemp","MIN");
$DataSet->SetYAxisName("Temperatur");
$DataSet->SetYAxisUnit("°C");

 // Initialise the graph   
$Graph = new pChart(700,240);
$Graph->setFontProperties("tahoma.ttf",8);
$Graph->setGraphArea(70,30,680,200);
$Graph->drawFilledRoundedRectangle(7,7,693,223,5,240,240,240);
$Graph->drawRoundedRectangle(5,5,695,225,5,230,230,230);
$Graph->drawGraphArea(255,255,255,TRUE);
$Graph->drawScale($DataSet->GetData(),$DataSet->GetDataDescription(),SCALE_NORMAL,150,150,150,TRUE,0,2);
$Graph->drawGraphArea(250,250,250);
$Graph->drawGrid(4,true,230,230,230,2);
  
 // Draw the 0 line   
$Graph->setFontProperties("tahoma.ttf",6);
$Graph->drawTreshold(0,143,55,72,TRUE,TRUE);
  
 // Draw the line graph
$Graph->drawCubicCurve($DataSet->GetData(),$DataSet->GetDataDescription());

 // Finish the graph   
$Graph->setFontProperties("tahoma.ttf",8);
$Graph->drawLegend(75,35,$DataSet->GetDataDescription(),250,250,250);
$Graph->setFontProperties("tahoma.ttf",10);
$Graph->drawTitle(60,22,"Aussentemperatur",50,50,50,585);
$Graph->setFontProperties("tahoma.ttf",8);
$Graph->Render(IPS_GetKernelDir()."media/Aussen.png");
?>

Stimmt :D, absolut top, minimale Anpassungen in deinem Beispiel und schon gibts ne’ Grafik.

SUPER :loveips:

Hihi, brauch ich ja meins nicht mehr Posten.

Sieht zu 99% genauso aus :wink: