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

Hallo zusammen,

ich bin relativ neu im Thema Symcon.
Ich nutze es zur kompletten Zählerablesung in einem Mietshaus und zur Visualisierung der Verbräuche und Technikdaten für die einzelnen Mieter.

Bei der Suche nach einer Möglichkeit, den COP zu berechnen, bin ich auf dieses Script gestoßen - danke dafür. PHP kann ich leider nicht, verstehe das Script aber.

Eine Frage zur Berechnung selbst:
Warum wird hier mit AC_GetAggregatedValues (und in der Klammer irgendwo der Parameter 0) der Tagesdurchschnitt der für die weiteren Berechnungen benötigten Zählerstände genommen?

Korrekt für die COP-Berechnung wäre doch, den Ist-Wert der Zählerstände zur gewählten Uhrzeit (heute 0.00 Uhr und gestern 0.00 Uhr) zu nehmen und nicht den Tagesdurchschnitt.

Ich habs jetzt nicht nachgerechnet, weil mir noch Werte fehlen (läuft alles erst seit ein paar Tagen), kann daher nicht beurteilen, ob das Unterschiede macht.

Ich hätte vom Gefühl her wie weiter oben vorgeschlagen mit AC_GetLoggedValues gearbeitet oder bei AC_GetAggregatedValues jetzt mal nicht den Tagesschnitt, sondern den Stundenschnitt gewählt.

Vielleicht kann mir hier einer der Beteiligten noch Hilfestellung geben - Danke!

Grüße
Thomas

Hallo Thomas,

Ja im Grunde hast du recht. Die COP ist ja ein fester Wert der vom Hersteller angegeben wird.
Ich betrachte immer den letzten Tag und setze Wärmemenge und Steombezug ins Verhältnis.
Im Grunde berechne ich damit eine Tagesarbeitszahl.

Ist zur Kontrolle der Wärmepumpe sehr nützlich.

Ich möchte zeitnah noch abbilden , ob der Strombezug aus dem Netz oder von der PV Anlage kam.

Lg

Rob

Das kannst du im Prinzip machen wie du willst.
Wenn du den Mittelwert über einen beliebigen zeitraum nimmst so bekommst du eben den Mittelwert des COP.
Wenn du es samplefine machst (also zu jedem eingegangen Messwert des WMZ den jeweiligen Messwert des Stromzählers gegenüberstellst) dann bekommst du den Verlauf des COP. Zur Kontrolle und Optimierung ist das übrigens sehr hilfreich. Du siehst auch sehr schön wie der COP unmittelbar von der Differenz zwischen Außenluft und Vorlauf Temperatur abhängt.
Ein simples Tagesmittel verschweigt dir viel vom Verbesserungspotential.
Leider wird der COP von den Herstellern ziemlich schöngerechnet. Ist ungefähr so wie der Normverbrauch bei den Autos. Da sind wohl die gleichen Marketingtypen am Werk

gruß
bb

Ich benutze das Modul „Energierechner“ für meine Tages, Wochen, Monats, Jahres COP’s.
Verbrauchsvariable von dem WP Strom sowie Wärmemengenzähler in das Modul, Zeiträume auswählen und dann kann man super mit den Werten rechnen.

Vielen Dank für Eure Rückmeldungen.
Persönlich gefällt mir eine feinere Auflösung auch viel besser, weil ich da wie geschrieben wurde auch deutlicher sehen kann, wo es denn evtl. hakt und wo ich noch optimieren kann.

Wobei ich das Glück habe und einen innovativen, kleinen Heizungsbaubetrieb beauftragt habe, der echt tief in der Materie drin steckt und sich sehr gut mit der verbauten Wärmepumpe auskennt.

Gruß
Thomas

Ja, da siehst dann bspw. sowas:


Ist doch viel besser als nur ein Mittelwert.