Verbrauch über einen Zeitraum die x te

Hallo zusammen,
ich befasse mich auch gerade mal mit dem Thema „Verbrauch über einen Zeitraum“. Gibt hier ja schon einige Beiträge die in die Richtung gehen.
Hier wird ja immer mit AC_GetAggregatedValues oder AC_GetLoggedValues gearbeit.
Gibt es denn wirklich keine Möglichkeit zu sagen „Geb mir den Wert aus dem Archiv der Variable von Zeitpunkt x“? Warum umständlich ein Array aus Mittelwerten oder Rohdaten abfragen und dann addieren?

Wäre ne coole Funktion, gibts aber leider noch nicht . Oder ich kenne sie nicht .

Gesendet von iPhone mit Tapatalk

Guten Morgen,
Woher soll die Funktion wissen wann ein Wert vorhanden ist. Kennst Du die Zeit des Wertes auf die Sekunde genau?
Wenn Du einen Tag angibst oder eine Stunde oder eine bestimmte Minute dann sind das meistens mehrere Werte und da wiederum ist ein Array besser. Wenn es nur einer ist dann steht nur einer im Array. :smiley:

Ich kenne das halt von InfluxDB. Da funktioniert das auch. Hier gibt es auch eine Funktion DeltaSince().

Wenn ich den Verbrauch über einen Zeitraum will gibt es doch ein Modul bzw.

https://github.com/symcon/VerbrauchZeitspanne

oder habe ich da was falsch verstanden?:confused:

Das Modul hatte ich mir schonmal angesehen.
Ist es möglich das Modul direkt aus einem Skript heraus aufzurufen? Wenn ja, wie würde das aussehen?

Mit VIZ_Calculate(12345) würde die Berechnung angestoßen, du kannst allerdings so keine Werte verändern.
Es werden immer die Werte genutzt, die im Modul hinterlegt sind, oder du setzt vorher mit SetValue noch das Start- und Enddatum.
Über IPS_SetProperty (IPS_SetProperty — IP-Symcon :: Automatisierungssoftware) könntest du noch die Source Variable setzen.

Oder du schaust dir einfach den Code vom Modul an und schreibst die Funktion für dein Script um.

        public function Calculate()
        {
            $acID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0];
            $variableID = $this->ReadPropertyInteger('SourceVariable');
            $startDate = GetValue($this->GetIDForIdent('StartDate'));
            $endDate = GetValue($this->GetIDForIdent('EndDate'));
            $sum = 0;
            $values = AC_GetAggregatedValues($acID, $variableID, 1 /* Day */, $startDate, $endDate + (24 * 3600) - 1, 0);
            if ($values === false) {
                return;
            }
            foreach ($values as $value) {
                $sum += $value['Avg'];
            }
            SetValue($this->GetIDForIdent('Usage'), $sum);
        }

Grüße,
Kai

Warum willst Du das über ein Script aufrufen?

Mit dem Modul gibst Du den Zeitraum im Webfront ein und list den Wert ab fertig.

Ich verstehe nicht genau wie Du dir das vorstellst.:confused:

Ich möchte immer nachts um 12 eine Tagesstatistk machen und die Ergebnisse loggen. Stromverbrauch, wärmemenge der Heizung usw… Das ganze auch Wöchentlich und Monatlich
In openHAB in Verbindung mit InfluxDb konnte ich das sinngemäß so lösen „wert = deltaSince(now-1d)“ und die abfrage war fertig.

Servus
Ich verstehe deinen Ansatz, aber das Problem ist eben das die Datenbank ja nur geloggte Werte enthält (Mit auf die Sekunde genauen Zeitstempel) . Du ja nicht auf dei Sekunde genau weißt WANN die Daten geschrieben wurden kannst du auch nicht auf genau ein bestimmtes Daten abfragen. Du müßtest also trotzdem einen Zeitraum abfragen und dann den deinem Zielzeitpunkt am nächsten liegenden Wert raussuchen. Womit wir wieder bei einem Array wären.

Wenn es dir aber nur um die Tages/Wochen/Monatsauswertung geht, so sieh dir das an:
Energieberichte
Ich denke das kann alles dafür notwendige. Noch dazu kommt es als Script da kannst noch nach belieben selbst rumbasteln.

schöne Grüße
Bernhard

Ich sehe darin kein Problem. Sonst hätte jede Datenbank das gleich Problem, egal ob SQL, Influx oder sonstwas. Es wird ja immer in irgendeiner Form ein Zeitstempel + Wert eingetragen. Wenn ich meine InfluxDB frage, welcher Wert am 23.05.2018 um 12:30 in der Datenbank steht und da zufällig kein exakter Zeitstemper zu finden ist, dann ist die DB so intelligent und gibt mir den Wert von 12:28 wenn das der letzte war. Dieser ist ja immernoch aktuell solang kein neuer Wert dazugekommen ist.

Der Link zu dem Thread Energieberichte ist sehr gut, ich glaube da finde ich so viemlich alles was ich brauche. Denn hatte ich noch nicht gefunden. Danke! :slight_smile:

Muss gerade feststellen, dass ich einen Teil meiner Aussage revidieren muss. Mit SQL hat man das gleiche Problem. :smiley:

Gibt es hier eigentlich keinen Edit Button?

Doch, ab deinem nächsten Beitrag :wink:
Michael

Ihr könnt mit AC_GetLoggedValues sehr wohl den Wert zu einem Zeitpunkt abfragen, man muss dafür allerdings ein bisschen um die Ecke denken:


IPS_GetLoggedValues(12345 /* Archive Control */, 23456 /* Variable ID */, 0 /* Startzeit */, 1234567890 /* Endzeit = Gewünschter Zeitpunkt */, 1 /* Nur ein Wert */);

Diese Funktion gibt den aktuellsten Wert zurück, der zwischen dem gewünschten Zeitpunkt und dem Beginn des Loggings liegt. Da zwischen diesem Wert und dem gewünschten Zeitpunkt keine weiteren Werte mehr geloggt wurden, gilt dieser weiterhin beim gewünschten Zeitpunkt.

Hey das ist ja klasse! :slight_smile:
Eigentlich genau das was ich gesucht habe, danke!