Einfache Berechnung für COP WP

Hallo zusammen,

möchte gerne meine COP des Vortages meiner WP automtisch berechnen lassen.
Die Zählerwerte werden als Zähler geloggt.
Auf diese möchte ich per script zugreifen.

hier mein Script:

<?
//ID34842 Stromzähler WP in KWH
//ID15258 Gesamtzähler WP in KWH
//ID41298 Archice Control
//ID37914 Tages COP
//$werte = AC_GetLoggedValues(12345, 55554, strtotime("today 00:00"), time(), 0);55554 ist die ID der Variable, 12345 vom Archiv Control

$COP = 37914 /*[Energie\Strom\Energiezaehler (Strom) BEZUG\aktuelle Leistung]*/; //ID Negative Werte
$Strom1 = AC_GetLoggedValues(41298, 34842, strtotime("today 00:00"), time(), 0); 
$Strom2 = AC_GetLoggedValues(41298, 34842, strtotime("yesterday 00:00"), time(), 0);

$Therm1 = AC_GetLoggedValues(41298, 15258, strtotime("today 00:00"), time(), 0);
$Therm2 = AC_GetLoggedValues(41298, 15258, strtotime("yesterday 00:00"), time(), 0);

SetValue($COP, ($Strom1)-($Strom2)/($Therm1)-($Therm2));


?>

das Teilen und Subtrahieren der werte klappt nicht.

Bekomme folgende Fehler:

Fatal error: Uncaught Error: Unsupported operand types in /var/lib/symcon/scripts/25748.ips.php:15
Stack trace:
#0 {main}
thrown in /var/lib/symcon/scripts/25748.ips.php on line 15

kann mir jemand mit der korrekten syntax helfen?

dankesehr

Das liegt daran das das keine einzelnen Werte sind die du da ausliest, sondern die Antwort ist jeweils ein Array. Du musst Dir also erst den einzelnen Wert auslesen den Du eigentlich haben willst und mit dem Du rechnen willst…

Und wie kann ich Array in eine Variable bekommen.
Ich dachte ich lese einen Wert aus.

Die Werte des Arrays kannst Du in der Doku nachlesen => AC_GetLoggedValues

Anhand deines Beispiels:


$Therm2 = AC_GetLoggedValues(41298, 15258, strtotime("yesterday 00:00"), time(), 0);

echo $Therm2['Duration'];
echo $Therm2['TimeStamp'];
echo $Therm2['Value'];

Für die Auswertung von Energiewerten gibt es hier schon ein Script => Energieberichte

Gruß Heiko

Ansonsten kannst Du auch AC_GetAggregatedValues nutzten um den Durchschnittswert des Zeitraums zu holen.

Beispiel:


$Strom1 = AC_GetAggregatedValues(41298, 34842, 1 /* Täglich */, strtotime("today 00:00"), time(), 0);
var_dump($Strom1);

$average = $werte[0]['Avg'];
var_dump($average);

erstmal danke für die Antworten.
Aber irgendwie hab ich noch einen Denkfehler:

<?
//ID34842 Stromzähler WP in KWH
//ID15258 Gesamtzähler WP in KWH
//ID41298 Archice Control
//ID37914 Tages COP
//$werte = AC_GetLoggedValues(12345, 55554, strtotime("today 00:00"), time(), 0);55554 ist die ID der Variable, 12345 vom Archiv Control

$COP = 37914 /*[Anlagen\Wärmepumpe\Tages COP]*/; //ID Negative Werte

$Strom1 = AC_GetAggregatedValues(41298, 34842, 1 /* Täglich */, strtotime("today 00:00"), time(), 0);
var_dump($Strom1);
$Strom2 = AC_GetAggregatedValues(41298, 34842, 1 /* Täglich */, strtotime("yesterday 00:00"), time(), 0);
var_dump($Strom2);
$Therm1 = AC_GetAggregatedValues(41298, 15258, 1 /* Täglich */, strtotime("today 00:00"), time(), 0);
var_dump($Therm1);
$Therm2 = AC_GetAggregatedValues(41298, 15258, 1 /* Täglich */, strtotime("yesterday 00:00"), time(), 0);
var_dump($Therm2);


SetValue($COP, ($Strom1)-($Strom2));


?>

array(1) {
[0]=>
array(7) {
[„TimeStamp“]=>
int(1574031600)
[„Avg“]=>
float(10,789999999995)
[„MinTime“]=>
int(1574031937)
[„Min“]=>
float(0,0049999999999955)
[„MaxTime“]=>
int(1574071228)
[„Max“]=>
float(0,030000000000001)
[„Duration“]=>
int(46664)
}
}
array(2) {
[0]=>
array(7) {
[„TimeStamp“]=>
int(1574031600)
[„Avg“]=>
float(10,789999999995)
[„MinTime“]=>
int(1574031937)
[„Min“]=>
float(0,0049999999999955)
[„MaxTime“]=>
int(1574071228)
[„Max“]=>
float(0,030000000000001)
[„Duration“]=>
int(46664)
}
[1]=>
array(7) {
[„TimeStamp“]=>
int(1573945200)
[„Avg“]=>
float(21,514999999988)
[„MinTime“]=>
int(1573945219)
[„Min“]=>
float(0,0049999999999955)
[„MaxTime“]=>
int(1573982200)
[„Max“]=>
float(0,034999999999997)
[„Duration“]=>
int(86400)
}
}
array(1) {
[0]=>
array(7) {
[„TimeStamp“]=>
int(1574031600)
[„Avg“]=>
float(50)
[„MinTime“]=>
int(1574033051)
[„Min“]=>
float(1)
[„MaxTime“]=>
int(1574033051)
[„Max“]=>
float(1)
[„Duration“]=>
int(46664)
}
}
array(2) {
[0]=>
array(7) {
[„TimeStamp“]=>
int(1574031600)
[„Avg“]=>
float(50)
[„MinTime“]=>
int(1574033051)
[„Min“]=>
float(1)
[„MaxTime“]=>
int(1574033051)
[„Max“]=>
float(1)
[„Duration“]=>
int(46664)
}
[1]=>
array(7) {
[„TimeStamp“]=>
int(1573945200)
[„Avg“]=>
float(93)
[„MinTime“]=>
int(1573946227)
[„Min“]=>
float(1)
[„MaxTime“]=>
int(1573946227)
[„Max“]=>
float(1)
[„Duration“]=>
int(86400)
}
}

Fatal error: Uncaught Error: Unsupported operand types in /var/lib/symcon/scripts/25748.ips.php:23
Stack trace:
#0 {main}
thrown in /var/lib/symcon/scripts/25748.ips.php on line 23

Die Werte scheinen ja aus dem Archiv zu kommen, aber die Berechnung klappt nicht.

Hi,

was möchtest Du denn für einen Wert eigentlich berechnen? Welche Logik?

In Zeile 23 machst Du

($Strom1)-($Strom2)

aber $Strom1 und $Strom2 sind Arrays :eek:

Im Vardump sieht man ja schön welche Werte man mit $Strom1[’<index>’] nehmen kann!

Gruß Heiko

ich möchte die Zählerwerte des Tages ( Strom und Wärme ) aus dem Archiv nehmen, die Werte des Vortages ebenfalls aus dem Archiv und von den Tageswerten abziehen. Somit habe ich ja den jeweiligen Tagesverbrauch.
Damit möchte ich den Leistungswert ( COP ) des Tages der Wp berechnen. Also den Wert des Thermischen zählers durch den Stromzählerwert.

lg

Rob

Hier mal schnell wie es im schon drauf verwiesenen Energiebericht gemacht wird:


<?
//ID34842 Stromzähler WP in KWH
//ID15258 Gesamtzähler WP in KWH
//ID41298 Archice Control
//ID37914 Tages COP
//$werte = AC_GetLoggedValues(12345, 55554, strtotime("today 00:00"), time(), 0);55554 ist die ID der Variable, 12345 vom Archiv Control

$COP = 37914 /*[Anlagen\Wärmepumpe\Tages COP]*/; //ID Negative Werte

$Strom1 = AC_GetAggregatedValues(41298, 34842, 1 /* Täglich */, strtotime("today 00:00"), time(), 0);
var_dump($Strom1);
$Strom2 = AC_GetAggregatedValues(41298, 34842, 1 /* Täglich */, strtotime("yesterday 00:00"), time(), 0);
var_dump($Strom2);
$Therm1 = AC_GetAggregatedValues(41298, 15258, 1 /* Täglich */, strtotime("today 00:00"), time(), 0);
var_dump($Therm1);
$Therm2 = AC_GetAggregatedValues(41298, 15258, 1 /* Täglich */, strtotime("yesterday 00:00"), time(), 0);
var_dump($Therm2);


SetValue($COP, verbrauch($Strom1)-verbrauch($Strom2));

function verbrauch($werte) 
{
    //var_dump($werte);
    $verbrauch = 0;
    foreach($werte as $wert) {
        //echo date("d.m.Y H:i:s", $wert['TimeStamp']) . " -> " . $wert['Avg'] . PHP_EOL; 
        $verbrauch += $wert['Avg'];
    }
    return round($verbrauch, 2);
} 
?>

Hi , Danke für die Hilfe.

er berechnet jetzt etwas, allerdings falsch.
Wenn ich mir manuel die Log werte anschaue hat die WP gestern 100Kwh gemacht, und dazu 21Kwh Strom benötigt.
100/21 = COP 4,76

Es kommt aber als ergebnis 45,26 raus.

<?
//ID34842 Stromzähler WP in KWH
//ID15258 Gesamtzähler WP in KWH
//ID41298 Archice Control
//ID37914 Tages COP
//$werte = AC_GetLoggedValues(12345, 55554, strtotime("today 00:00"), time(), 0);55554 ist die ID der Variable, 12345 vom Archiv Control

$COP = 37914 /*[Anlagen\Wärmepumpe\Tages COP]*/; //ID Negative Werte

$Strom1 = AC_GetAggregatedValues(41298, 34842, 1 /* Täglich */, strtotime("today 00:00"), time(), 0);
var_dump($Strom1);
$Strom2 = AC_GetAggregatedValues(41298, 34842, 1 /* Täglich */, strtotime("yesterday 00:00"), time(), 0);
var_dump($Strom2);
$Therm1 = AC_GetAggregatedValues(41298, 15258, 1 /* Täglich */, strtotime("today 00:00"), time(), 0);
var_dump($Therm1);
$Therm2 = AC_GetAggregatedValues(41298, 15258, 1 /* Täglich */, strtotime("yesterday 00:00"), time(), 0);
var_dump($Therm2);


SetValue($COP, verbrauch($Therm1)-verbrauch($therm2) / verbrauch($Strom1)-verbrauch($Strom2));

function verbrauch($werte) 
{
    //var_dump($werte);
    $verbrauch = 0;
    foreach($werte as $wert) {
        //echo date("d.m.Y H:i:s", $wert['TimeStamp']) . " -> " . $wert['Avg'] . PHP_EOL; 
        $verbrauch += $wert['Avg'];
    }
    return round($verbrauch, 2);
} 
?>

Dump
array(1) {
[0]=>
array(7) {
[„TimeStamp“]=>
int(1574118000)
[„Avg“]=>
float(18,43499999999)
[„MinTime“]=>
int(1574118024)
[„Min“]=>
float(0,0049999999999955)
[„MaxTime“]=>
int(1574155244)
[„Max“]=>
float(0,030000000000001)
[„Duration“]=>
int(72023)
}
}
array(2) {
[0]=>
array(7) {
[„TimeStamp“]=>
int(1574118000)
[„Avg“]=>
float(18,43499999999)
[„MinTime“]=>
int(1574118024)
[„Min“]=>
float(0,0049999999999955)
[„MaxTime“]=>
int(1574155244)
[„Max“]=>
float(0,030000000000001)
[„Duration“]=>
int(72023)
}
[1]=>
array(7) {
[„TimeStamp“]=>
int(1574031600)
[„Avg“]=>
float(21,309999999989)
[„MinTime“]=>
int(1574031937)
[„Min“]=>
float(0,0049999999999955)
[„MaxTime“]=>
int(1574071228)
[„Max“]=>
float(0,030000000000001)
[„Duration“]=>
int(86400)
}
}
array(1) {
[0]=>
array(7) {
[„TimeStamp“]=>
int(1574118000)
[„Avg“]=>
float(85)
[„MinTime“]=>
int(1574119229)
[„Min“]=>
float(1)
[„MaxTime“]=>
int(1574119229)
[„Max“]=>
float(1)
[„Duration“]=>
int(72023)
}
}
array(2) {
[0]=>
array(7) {
[„TimeStamp“]=>
int(1574118000)
[„Avg“]=>
float(85)
[„MinTime“]=>
int(1574119229)
[„Min“]=>
float(1)
[„MaxTime“]=>
int(1574119229)
[„Max“]=>
float(1)
[„Duration“]=>
int(72023)
}
[1]=>
array(7) {
[„TimeStamp“]=>
int(1574031600)
[„Avg“]=>
float(100)
[„MinTime“]=>
int(1574033051)
[„Min“]=>
float(1)
[„MaxTime“]=>
int(1574033051)
[„Max“]=>
float(1)
[„Duration“]=>
int(86400)
}
}

Notice: Undefined variable: therm2 in /var/lib/symcon/scripts/25748.ips.php on line 20

Warning: Invalid argument supplied for foreach() in /var/lib/symcon/scripts/25748.ips.php on line 26

Ich verstehe einfach zu wenig von PHP :mad:

Hallo Rob24,

auch mit wenig Verständnis von PHP kannst Du doch die Fehlermeldung lesen: die Variale therm2 ist unbekannt - sie muss Therm2 heißen. Ergebnisse können nicht richtig sein, so lange Fehlermeldungen existieren.

Grüße, Gerhard

Ja , hab das völlig übersehen. Danke.

<?
//ID34842 Stromzähler WP in KWH
//ID15258 Gesamtzähler WP in KWH
//ID41298 Archice Control
//ID37914 Tages COP
//$werte = AC_GetLoggedValues(12345, 55554, strtotime("today 00:00"), time(), 0);55554 ist die ID der Variable, 12345 vom Archiv Control

$COP = 37914 /*[Anlagen\Wärmepumpe\Tages COP]*/; //ID Negative Werte

$Strom1 = AC_GetAggregatedValues(41298 /*[Archive]*/, 34842 /*[Energie\Strom\Wärmepumpe Energiezaehler (Impuls)\WP Verbrauch]*/, 1 /* Täglich */, strtotime("today 00:00"), time(), 0);
var_dump($Strom1);
$Strom2 = AC_GetAggregatedValues(41298 /*[Archive]*/, 34842 /*[Energie\Strom\Wärmepumpe Energiezaehler (Impuls)\WP Verbrauch]*/, 1 /* Täglich */, strtotime("yesterday 00:00"), time(), 0);
var_dump($Strom2);
$Therm1 = AC_GetAggregatedValues(41298 /*[Archive]*/, 15258 /*[Anlagen\Wärmepumpe\WP Gesamt Energie\Wert]*/, 1 /* Täglich */, strtotime("today 00:00"), time(), 0);
var_dump($Therm1);
$Therm2 = AC_GetAggregatedValues(41298 /*[Archive]*/, 15258 /*[Anlagen\Wärmepumpe\WP Gesamt Energie\Wert]*/, 1 /* Täglich */, strtotime("yesterday 00:00"), time(), 0);
var_dump($Therm2);


SetValue($COP, verbrauch($Therm1)-verbrauch($Therm2) / verbrauch($Strom1)-verbrauch($Strom2));

function verbrauch($werte) 
{
    //var_dump($werte);
    $verbrauch = 0;
    foreach($werte as $wert) {
        //echo date("d.m.Y H:i:s", $wert['TimeStamp']) . " -> " . $wert['Avg'] . PHP_EOL; 
        $verbrauch += $wert['Avg'];
    }
    return round($verbrauch, 2);
} 
?>

Das script läuft jetzt ohne fehler, allerdings ist das ergbnis falsch:(
es sollen ja der Zählerstand Strom von Heute und gestern aus dem Archiv geholt werden und subtrahiert werden.
Das gleiche für den Zählerstand der Wärme. Dann soll das Ergebnis der Wärme durch das Ergebnis Strom geteilt werden.
Wenn ich die Werte manuell in den Archiveinstllungen anzeigen lasse, müsste ca 4,6 als ergenis kommen.
Das script gibt 28,06 raus.

Beispiel:
WP Energie am 19.11 um 0:00 Uhr = 86316Kwh
WP Energie am 20.11 um 0:00 Uhr = 86416Kwh

Stromzähler am 19.11 um 0:00 Uhr = 179,33Kwh
Stromzähler am 20.11 um 0:00 Uhr = 200,83Kwh

COP = (86416-86316) / (200,83-179,33) = 4,65

Hat jemand eine Idee??

Du solltest auf jeden Fall Klammern setzen:

SetValue($COP, (verbrauch($Therm1)-verbrauch($Therm2)) / (verbrauch($Strom1)-verbrauch($Strom2)));

Burkhard

:smiley: läuft.

Danke für eure hilfe