Verbrauch zwischen heute und einem Datum in der Vergangenheit - wie?

Hallo zusammen,

ich möchte gerne den Verbrauch zwischen dem aktuellen Zeitpunkt und einem Zeitpunkt in der Vergangenheit ermitteln (Datum der Zählerablesung.) Die entsprechende Variable wird als „Zähler“ geloggt.

Das soll dann für den Hauptzähler und einzelne Verbrauchszähler passieren, so dass ich deren Prozentsatz vom Gesamtverbrauch ermitteln und mit einem Pie-Chart darstellen kann.

Wie kann man sowas umsetzen? Mit der Funktion AC_AggregatedValues bin ich da nicht weitergekommen.

Danke und viele Grüße
Florian

Hallo Florian,

bei AC_GetAggregatedValues lagst du schon ganz richtig. Hiermit könntest du die ganzen Tagesaggregation auslesen und alle Avg-Werte aufsummieren. Bei Zähler-Variablen enthält Avg nämlich den Anstieg des Zählers im Verlaufe des Tages. Wenn du das über alle Tage summierst, hast du also den Anstieg seit dem vorgegebenen Datum.

Wenn du sonst schon einen Ansatz hast, dann kannst du den gerne hier posten. Dann können wir uns den gemeinsam anschauen und eventuelle Probleme erkennen.

Mit welcher Aggregationsstufe müsste ich denn da arbeiten? Je nach dem wie groß der Zeitunterschied zwischen Ablesung und aktuellem Datum ist kommen ja entweder ganz wenig oder ganz viele Avg-Werte raus, die dann beim Aufruf des Graphen berechnet/summiert werden müssen.

Alternativ hatte ich daran gedacht, „irgendwie“ einen Wert zum Ablesedatum aus dem Archiv zu holen. Und zusätzlich noch den letzten Wert vor dem aktuellen Datum. Darüber könnte man dann „einfach“ die Differenz bilden.
Ginge das über AC_GetLoggedValues? Aber wie stelle ich es an, dass ich genau einen Wert zum Ablesedatum bekomme und nicht mehrere?

Viele Grüße
Florian

Schau mal hier:
Regemmenge letzte 24h, unabhänging vom Tageswechsel - Seite 2

Da geht es zwar um Regen, aber das Prinzip ist identisch.
Matthias

Danke! Schaue ich mir nochmal genau an.
Da geht es zwar immer um die letzten x Stunden/Tage wobei sich in meinem Fall das ja ändert, da ich den Verbrauch ab einem bestimmten Datum bis zum aktuellen Zeitpunkt ermitteln möchte. Aber vielleicht lässt sich was übertragen.

Viele Grüße
Florian

Ich habe das Script mal zusammengekürzt.

<? 
/* 
 ##########################################################
 # IP-Symcon Programm
 #
 # Beschreibung : Niederschlagsmengen ermitteln (aus Archivdaten)
 # Create date  : 2017-08-17
 # Last change  : 2017-08-17
 # Version      : 0.05
 # Datei        : _34747.ips.php 
 # Autor        : Matthias Herold 
 # Copyright    : 
 ##########################################################
*/ 

// Hardware 
$ID_OC3Rainfall = 26235 /*[0 Umwelt\0.20_Wetter\0.20_Wetterstation OC3\Regenmenge]*/; //ObjektID der OC3 Regenmenge mit Überlaufzähler 

// Variablen (Float mit einer Nachkommastelle) 
$ID_Rain1  = 10048 /*[99 meine Projekte\0 Klima+Wetter\UMW Niederschlag\Niederschlag letzte 1 Stunde]*/; 

//--config end-------------------- 

//  letzte Stunde 
OC3Rainfall(1, $ID_Rain1, $ID_OC3Rainfall); 

function OC3Rainfall($lasthours, $varid, $ID_OC3Rainfall) 
                            // $lasthours            Anzahl der Stunden, die ausgewertet werden sollen 
                            // $varid                 ObjektID, in die der Wert abgelegt werden soll 
                            // $ID_OC3Rainfall    ObjektID der OC3 Regenmenge mit Überlaufzähler 
    { 
    $ArchiveID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archiv Handler ID wird automatisch ausgelesen 
    $ZeitraumVON = time()- (3600 * $lasthours); // <-- Datum des letzten Ablesens
    $ZeitraumBIS = time(); // <-- heute, jetzt
    $LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0); 
    $isempty = empty($LogDatenAR); 
    if ($isempty) 
        { 
       SetValue($varid, 0); 
        } 
    else 
       { 
        $idrain = (count($LogDatenAR)-1); 
      $currentrainfall = $LogDatenAR[0]["Value"]; 
      $lastrainfall = $LogDatenAR[$idrain]["Value"]; 
      $totalrainfall =    $currentrainfall - $lastrainfall; 
      SetValue($varid, $totalrainfall); 
        } 
    } 

?>

Die entscheidende Zeile ist diese:



$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0);

Du musst nur $ZeitraumVON ermitteln…

Matthias

GetLoggedValues ist auch eine Möglichkeit, hat aber leider ein paar Nachteile.
Zum einen kann die Menge der ausgelesenen Werte deutlich höher sein, als bei GetAggregatedValues. Wird der Zähler eventuell mehrmals in der Minute aktualisiert, wird das sehr schnell eine sehr große Menge an Werten. Aber falls der Wert nicht so häufig, beispielsweise täglich oder auch halbtäglich, aktualisiert wird, wäre das kein Problem. Was „nicht so häufig“ bedeutet, hängt natürlich von der betrachteten Zeit ab.

Zum anderen kannst du beim Vergleich vom ersten und letzten geloggten Wert im Gegensatz zu GetAggregatedValues kein Zurücksetzen des Zählers betrachten. Bei GetAggregatedValues wird ein Zurücksetzen auf 0 nicht betrachtet, da nur positive Unterschiede aufsummiert werden. Wenn du natürlich sicherstellen kannst, dass der Zähler nicht zurückgesetzt wird, wäre das allerdings auch kein Problem.

Ich würde daher zu GetAggregatedValues tendieren. Selbst wenn du hier eine Zeit über drei Jahre betrachtest, sind das „nur“ ~1000 Werte, das sollte für deinen Rechner kein Problem darstellen.