ArchiveHandler auslesen zu bestimmtes Datum

Hallo,

ich möchte aus geloggte Daten (ArchiveHandler) Werte auslesen.
zB. Einen vorhandenen Wert am 01.01.12 und einem am heutigen Tag um diese zu verrechnen.

Momentan mache ich das so. Das scheint aber ab IPS v2.6 nur noch mit 10000 Datensätze zu gehen. Und ich bekomme den Wert ab den 01.01.12 nicht mehr gelesen.

//---Aktuele Zeit---------------------------------------------------------------
$TAG       = date("d",time()); 
$MONAT     = date("m",time()); 
$JAHR      = date("y",time());


//---Verbrauch Jahr-------------------------------------------------------------
$Zeit_Start    = mktime(0,0,0,1,1,$JAHR);
$Zeit_Ende    = mktime(23,59,59,$MONAT,$TAG-1,$JAHR);

$Value         = AC_GetLoggedValues($ID_ArchiveHandler, $ID_Counter_STROM, $Zeit_Start, $Zeit_Ende, 0);
$Wert_Start = $Value[count($Value)-1]['Value'];
$Wert_Ende     = $Value[0]['Value'];
$Verb_Jahr    = $Wert_Ende - $Wert_Start;

SetValue($ID_Verb_Jahr, $Verb_Jahr);       // Verbrauch Jahr  

Gibt es eine bessere Lösung?

Gruß Uwe

Aus dem Script entnehme ich, dass du den Kumulierten Wert des Zählers für das letze Jahr und den diesen jahre bis heut (gestern?) haben willst?

das kann man viel eleganter und ressourcenschonender mit AC_GetAggregatedValue lösen:

$AH 					= IPS_GetInstanceIDByName("Archive Handler", 0);   // Archive-Handler-ID angeben
$varID 				= 12130  /*[Smart Metering\IPS EKM-868\EKM-868 I Hausverteilung\EKM-868 #01 Zentraleinspeisung\Energieverbrauch]*/; // Variablen-ID der Ns-Zähler-Variable

$ts 					= mktime(0,0,0,1,1, date("Y", time())-1) ; //Startzeit am 1. 1. des letzten jahres
$te 					= mktime(23,59,59, date("m", time()),  date("d", time())-1, date("Y", time())); //Endzeit gestern

$RawData    = AC_GetAggregatedValues($AH, $varID, 4, $ts, $te, 5);
print_r($RawData);

der Output für 2 Jahre (2012 oben, 2011 unten) sieht so aus:

Array
(
    [0] => Array
        (
            [Avg] => 4165.172
            [Duration] => 21849266
            [LastTime] => 1347298991
            [Max] => 5.971
            [MaxTime] => 1330937608
            [Min] => 0
            [MinTime] => 1325372472
            [TimeStamp] => 1325372400
        )

    [1] => Array
        (
            [Avg] => 4960.164
            [Duration] => 20370878
            [LastTime] => 1325372399
            [Max] => 56.144
            [MaxTime] => 1324300874
            [Min] => 0
            [MinTime] => 1304200824
            [TimeStamp] => 1293836400
        )

)

den Jahrewert greifst du demnach wie folgt ab:

$Power_2011    = $RawData[1]['Avg'];
$Power_2012    = $RawData[0]['Avg'];

:confused: Ups ich muß noch viel lernen.

  1. Ich möchte den Wert für 2011 vom 01.01.2011 bis zum (Heute (-1Jahr) also 10.09.2011.

und

  1. Ich möchte den Wert für 2012 vom 01.01.2012 bis zum (Heute) also 10.09.2012.

Um eine Differenz zu berechen. geht das mit dem Skript von oben. ?

Gruß Uwe

Beschreib doch einfach, welches Endergebnis du haben willst (und nicht den Weg dahin oder Zwischenschritte).
Anders formuliert; du möchtest den Jahresverbrauch für dieses Jahr haben? Antwort: JA
Und wenn es das nicht sein soll: mit den beiden gelieferten Werten kannst Du auch deine letzten beiden Fragen beantworten (musste halt nur zusammenrechnen)

Korrektur:
das liefert mein Beispiel nicht:

  1. Ich möchte den Wert für 2011 vom 01.01.2011 bis zum (Heute (-1Jahr) also 10.09.2011.

dafür ist eine Aggregation mehrer Zwischenschritte notwendig, lösung kommt gleich

Ich möchte heute (10.09.2012) sehen wie viel Strom ich mehr oder weniger verbraucht habe wie im letzen Jahr bis zum 10.09.2011.

Gruß Uwe

hier eine Abfrage des Verbauchswertes aktuelles Jahr bis heute (gestern) sowie Vergleichsperiode des letzten Jahres;

<?

 $AH                     = IPS_GetInstanceIDByName("Archive Handler", 0);
 $varID                 = 12130  /*[Smart Metering\IPS EKM-868\EKM-868 I Hausverteilung\EKM-868 #01 Zentraleinspeisung\Energieverbrauch]*/; // Variablen-ID der Zähler-Variable

// Datenberechnung +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     // Verbrauchswert aktuelles Jahr bis heute
    $ts                     = mktime(0,0,0,1,1, date("Y", time())) ; //Startzeit am 1. 1. des aktuellen Jahres
    $te                     = mktime(23,59,59, date("m", time()),  date("d", time())-1, date("Y", time())); //Endzeit gestern
    $Value_2012        = AC_GetAggregatedValues($AH, $varID, 4, $ts, $te, 5)[0]['Avg'];
    echo "$Value_2012
";


    //Verbrauchswert Vergleichsperiode vor einem Jahr
    $ts                     = mktime(00,00,00,1,1, date("Y", time())-1) ; //Startzeit am 1. 1. des letzten Jahres
    $te                     = mktime(23,59,59, date("m", time()),  date("d", time())-1, date("Y", time())-1); //Endzeit gestern 23:59 vor einem Jahr
    $RawData2011         = AC_GetAggregatedValues($AH, $varID, 1, $ts, $te, 400);

    $Value_2011 =0;
    for($i=0;$i<count($RawData2011);$i++)
    {
        $Value_2011 += $RawData2011[$i]['Avg'];
    }

    echo "$Value_2011
";
?>

Danke, muß jetzt mal schauen ob die Werte passen. Vorhher nach dem alten Skript hatte 975kWh dieses Jahr zuviel, jetzt mit deinem neuen Skript nur noch 328kWh zuviel.

Was sotierst du mit

   $Value_2011 =0;
    for($i=0;$i<count($RawData2011);$i++)
    {
        $Value_2011 += $RawData2011[$i]['Avg'];
    }

Gruß Uwe

ich frage alle Tagesverbrauchswerte des letzen Jahres ab. Anschließend werden diese Verbrauchswerte in der for-Schleife aggregiert und als $Value_2011 ausgegeben.

Noch einen Tipp zur Genauigkeit der Werte: das Script würde ich möglichst kurz nach Mitternacht starten, da die Eingrenzung des Abfragezeitraumes für das aktuelle Jahr nicht am Vortag endet, sondern immer bis zum Abfragezeitpunkt geht (das ist systembedingt so).

Es läuft immer um 00:00.

Wenn ich die geloggten Daten per Hand ausrechne komme ich auf 557.2kWh.
Ich fange aber erst mit Daten am 18.02.2011 an.

-> Edit. In den Daten für 2011 fehlen ca. 300kWh (ca.± 20 Tage) bei der Berechnung im Skript.

Gruß Uwe

woran machst du fest, das 300kWh fehlen?
(PS: ich hab diverse Zeiträume bei mir testweise abgefragt, es passte alles)

Wenn ich die geloggten Daten per Hand ausrechne komme ich für 2011 auf 2835kWh.

Mit dem Skript komme ich auf 2520kWh

<?

$AH 					= IPS_GetInstanceIDByName("Archive Handler", 0);   // Archive-Handler-ID angeben
$varID 				= 12130  /*[Smart Metering\IPS EKM-868\EKM-868 I Hausverteilung\EKM-868 #01 Zentraleinspeisung\Energieverbrauch]*/; // Variablen-ID der Ns-Zähler-Variable

// Datenberechnung +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	// Verbrauchswert aktuelles jahr bis heute
	$ts 					= mktime(0,0,0,1,1, date("Y", time())) ; //Startzeit am 1. 1. des aktuellen Jahres
	$te 					= mktime(23,59,59, date("m", time()),  date("d", time()), date("Y", time())); //Endzeit gestern
	$Value_2012    	= AC_GetAggregatedValues($AH, $varID, 4, $ts, $te, 5)[0]['Avg'];
	echo "$Value_2012
";


	//Verbrauchswert Vergleichsperiode vor einem Jahr
	$ts 					= mktime(0,0,0,1,1, date("Y", time())-1) ; //Startzeit am 1. 1. des letzten Jahres
	$te 					= mktime(23,59,59, date("m", time()), date("d", time()), date("Y", time())-1); //Endzeit gestern 23:59 vor einem Jahr
	$RawData2011     	= AC_GetAggregatedValues($AH, $varID, 1, $ts, $te, 400);

	$Value_2011 =0;
	for($i=0;$i<count($RawData2011);$i++)
	{
		$Value_2011 += $RawData2011[$i]['Avg'];
		//humanDate in RawData-Array einfügen
		$RawData2011[$i]['humanDate']   = date("d.m.Y, H:i",$RawData2011[$i]['TimeStamp']);
	}

	echo "$Value_2011
";
	print_r($RawData2011);
?>

die spannende frage ist ja: WIE rechnest du per Hand aus? irgenwie musst du ja Daten aus der DB saugen, wie genau?

ich hab das Script oben nochmal modifiziert, es zeigt jetzt die Einzelnen tagesdaten aus 2011 mit einem lesabaren Datumsformat an. Da kannste auch gern „per Hand“ nachrechnen

Noch eine Frage am Rande: über welche Technik bekommst du die Stromverbrauchsdaten ins IPS?

Schau mir das morgen mal an. Muß jetzt mal mein Bett aufsuchen.

Technik S0 Impuls Ausgang Zähler 500imp / KwH.
Einlesen in IPS mit EKM 868

Gruß Uwe.

Dann tippe ich mal, dass der EKM im verg. Jahr nicht ununterbrochen durchgelaufen ist und ein oder mehrmals resettet wurde (z.B. durch Stromentzug)?

Das könnte sein. Das wird sein !

Gruß Uwe

Sollte man 00:00 Uhr nicht besser meiden?

ich schon, bei mir ist 3 Sek vor - 10 Sek nach Mitternacht IPS-Script-Quarantäne :D:D

Hallo,

kann ich den Zeitraum in dem ich die Daten vergleichen will noch weiter eingrenzen? z.B.: 10.4.2012 bis 15.10.2012?
Wenn ich aus dem Script-Beispiel von Raketenschnecke folgendes

    $ts                     = mktime(0,0,0,1,1,date("Y", time())) ; //Startzeit am 1. 1. des aktuellen Jahres
    $te                     = mktime(23,59,59, date("m", time()),  date("d", time())-1, date("Y", time())); //Endzeit gestern
    $Value_2012        = AC_GetAggregatedValues($AH, $varID, 4, $ts, $te, 5)[0]['Avg'];

wie folgt ändere

    $ts                     = mktime(0,0,0,4,10,2012) ; //Startzeit am 1. 1. des aktuellen Jahres
    $te                     = mktime(23,59,59, 10,15,2012); //Endzeit gestern
    $Value_2012        = AC_GetAggregatedValues($AH, $varID, 4, $ts, $te, 5)[0]['Avg'];

dann kommt folgedes: "Notice: Undefined offset: 0 in …

###############
So komme langsam selbst vorran: Muß erstmal die Datenbankstruktur verstehen. Mit AC_GetloggedValue geht es!

Gruß
hardlog