Energiezähler auf Basis eines kW Wertes

Hallo,

bei dem Modul Energiezähler kann ich ja „nur“ Watt und Ampere angeben… Ich würde gerne eine Art Tageszähler machen, auf Basis einer Variable, die einen kW Wert liefert.

Habt ihr eine Idee, ohne den kW Wert in eine Behilfsvariable (umgerechnet in Watt) zu verwenden, die dann bei der Instanz Energiezähler als Variable dient?

Grüße

1 „Gefällt mir“

Ev das nehmen :[Modul] Energierechner

Kannst Du mal Deinen User-Case genauer beschreiben? Ich nutze dafür einfach die Standard-Funktionen des Archivs.

Du aktivierst die Archivierung auf der Variable, die die kW misst. Als Aggregationstyp wählst Du Zähler.

Nun kannst du mit AC_GetAggregatedValues die Daten auslesen und Dir die passenden Aggregationsstufen suchen (Tag, Stunde, …)

Mit strtotime kannst Du dir die timestamps für Start und Ende bequem relativ ermitteln.
Du bekommst Dann einen Array mit den Ergebnissen und kannst Dort im Key ‚Avg‘ für den jeweiligen Zeitraum den Verbrauch auslesen.

Mit diesem Script baue ich mir eine CSV-Datei mit dem PV-Ertrag pro Stunde für die letzten 31 Tage:

<?php

$tsStart = strtotime("00:00 31 days ago");
$tsEnd = strtotime("00:00 0 days ago");

$archiveId = 29691;
$variableId = 31250;

$results = AC_GetAggregatedValues($archiveId, $variableId, 0, $tsStart, $tsEnd, 0);

// heading
echo "Monat;Tag;Stunde;Ertrag\n";

foreach ($results as $result) {

    $time = $result['TimeStamp'];
    $power = round($result['Avg'], 1);

    $month = date("m", $time);
    $day = date("d", $time);
    $hour = date("H", $time);
    
    echo "$month;$day;$hour;$power\n";
}

Wenn Du also einfach nur den Verbrauch eines Tages messen willst dann wählst Du also Start-Zeitpunkt „00:00 0 days ago“ und als End-Zeitpunkt time() und als Aggregationsstufe 1 (Tag).

Du müsstest Dann ein Array mit einem Element zurückbekommen, in dem der Verbraucht seit Mitternacht erfasst ist. Das kannst du dann in eine Variable schreiben oder gleich direkt verwenden.

Viele Grüße

1 „Gefällt mir“

Danke - das geht schon mal in die Richtung. Mein Use case sieht so aus:

Ich will den Gesamtstromverbrauch ermitteln:

$tsStart = strtotime("00:00 0 days ago");
//$tsEnd = strtotime("00:00 0 days ago");
$tsEnd = time();

$archiveId = 18698;
$variableId = 28079;

$results = AC_GetAggregatedValues($archiveId, $variableId, 1, $tsStart, $tsEnd, 0);

// heading
echo "Monat;Tag;Stunde;Ertrag\n";

foreach ($results as $result) {

    $time = $result['TimeStamp'];
    $power = round($result['Avg'], 2);

    $month = date("m", $time);
    $day = date("d", $time);
    $hour = date("H", $time);
    
    echo "$month;$day;$hour;$power\n";
}

Ergebnis:

Monat;Tag;Stunde;Ertrag
03;14;00;28,61

Hier die erste Frage, da ich ja nur einen Tageswert ermittle, wie bekomme ich den in eine Variable ohne foreach?

Mit der Variable will ich dann weiterrechnen…

Auf gleichem Weg hole ich mir aus Variable 2 dann den Netzbezug (Strom) und schriebe diesen dann auch in eine Variable.

Die 3. Variable soll dann ebenfalls auf dme gleichen Weg, den PV Ertrag liefern.

Dann kann ich mittels Dreisatz mir den Autarkiegrad ermitteln… Dazu brauche ich aber diese 3 Variablen… Könntest du mir bei dem Foreach-Entfall noch behilflich sein… Danke Dir vielmals

NACHTRAG: in der Doku stehts ja - oh man …

//Alle heutigen Datensätze abfragen (Tägliche Aggregationsstufe)
//z.B. um den heutigen Verbrauch er ermitteln oder die heutige Durchschnittstemperatur
$werte = AC_GetAggregatedValues(18698, 28079, 1 /* Täglich */, strtotime("today 00:00"), time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv  

Eine Frage noch: wie bekomme ich den AVG Wert ausgegeben bzw. wie kann ich diesen explizit in eine Variable schreiben?

Array
(
[0] => Array
(
[Duration] => 70205
[TimeStamp] => 1647212400
[Avg] => 9,9865
[MinTime] => 1647237348
[Min] => 0,00025000000005093
[MaxTime] => 1647249335
[Max] => 0,32000000000016
)

)

$aktueller_Gesamtverbrauch = AC_GetAggregatedValues(18698, 28079, 1 /* Täglich */, strtotime("today 00:00"), time(), 0);
//print_r($aktueller_Gesamtverbrauch);

$aktueller_Netzbezug = AC_GetAggregatedValues(18698, 27059, 1 /* Täglich */, strtotime("today 00:00"), time(), 0);
//print_r($aktueller_Netzbezug);

$aktueller_PVErtrag = AC_GetAggregatedValues(18698, 13161, 1 /* Täglich */, strtotime("today 00:00"), time(), 0);
print_r($aktueller_PVErtrag);


//$Autarkiegrad = ($aktueller_PVErtrag * 100) / $aktueller_Gesamtverbrauch;

$Autarkiegrad = $aktueller_PVErtrag['AVG'] + $aktueller_Netzbezug['AVG'];
print_r($Autarkiegrad);

Wie Du anhand Deiner Ausgabe siehst bekommst Du von AC_GetAggregated Values einen Array mit allen aggregierten Werten zurück, der dann wiederum Arrays mit den einzelnen Werten enthält. In meinem Fall „packe“ ich den außenliegenden Array mit foreach() aus, Du kannst das Element aber auch direkt ansprechen.

In Deinem Fall sieht das also so aus:

$aktueller_Gesamtverbrauch = AC_GetAggregatedValues(18698, 28079, 1 /* Täglich */, strtotime("today 00:00"), time(), 0);
echo $aktueller_Gesamtverbrauch[0]['Avg']

Mit dem Index-Element 0 addressierst Du das erste Element im äußeren Array und mit [‚Avg‘] Dann den benannten Index im inneren Array.

Pass bitte auf, die Index-Namen sind case-sensitive. Du musst also ‚Avg‘ schreiben, mit ‚AVG‘ wirst Du nichts finden.

Allerdings ist mir gerade ein riesiger Fehler aufgefallen, den ich gemacht habe: Ich habe irgendwie kWh bzw Wh gelesen, da macht die Variante Zähler natürlich Sinn.

Aber in Deinem fall bringt es Dir ja gar nichts, da Du ja nur aktuelle Verbrauchswerte als Input hast. Du musst also mit dem Module „Energiezähler (Strom)“ deine Watt in kWh sammeln und dort dann mit Zähler aggregieren.

Für einen Watt-Wert macht nur Standard-Aggregation Sinn.

Ich habe in den Float Variablen zum Glück nur kWh Werte… Aber danke für den Hinweis. Muss ich in einem anderen Fall genau so machen…