Energieberichte

Hallo Forum,

ich habe schon seit längerer Zeit vor, die Daten meiner Strom- und PV-Zähler (später vielleicht auch Wasser und Wärmepume) in Form von standardisierten Berichten und E-Mails auszuwerten und im WebFront zur Verfügung zu stellen.

Ich habe nun schon einiges im Forum gesucht, aber nix gefunden. Entweder ich verwende die falschen Suchbegriffe, oder ich seh den Wald vor lauter Bäumen nicht.

Folgendes stelle ich mir für jeden Zähler vor:
• Tageswert (seit 0:00 Uhr)
• Tageswert (letzte 24 Stunden)
• Wochenwert (letzte 7 Tage)
• Monatswert (letzte 30,44 Tage oder 730,5 Stunden) (einfach ein 12-tel-Jahr)
• Jahreswert (seit 1.1.)
• Jahreswert (letzte 365,25 Tage) (damit Schaltjahre keine Ausreißer machen, ein rollierender Jahreswert)

Hat für so etwas schon jemand Skipte, so dass man nicht bei „Null“ anfangen muss?

Ein zweites Problem stellen meine geloggten Variablen dar. Im Moment logge ich jede Sekunde, was aber gar nicht nötig wäre und einen riesigen Datenberg erzeugt. Gibt es einen einfachen Weg, diese einlaufenden Daten z.B. auf Minuten- oder -Minutenwerte zu aggregieren, die dann geloggt werden? Und das ggf. auch mit dem Datenbestand zu machen, damit da mal etwas asgemistet werden kann. Je äler die Daten sind, umso größer könnte das Aggregationsinervall sein.

Bin für jede Hilfe und Unterstützung dankbar!

tango

//Bearbeitung: Mailbenachrichtigung eingestellt

1 „Gefällt mir“

Hallo Tango,

was Dir weiterhilft ist ein Blick in die Doku. Die Werte, die Du ermitteln willst sind alle im Archiv zu finden, wenn Du das Logging beim Anlegen der Variable aktiviert hast. :slight_smile:

Schaue mal unter: Archive Control — IP-Symcon :: Automatisierungssoftware

Siehe auch: Archiv Daten berechnen

Ist gerade erst vor 4 Tagen besprochen worden.

Ganze 5 Minuten Suche im Forum. :wink:

Den Abstand der ankommenden Daten bestimmt, glaube ich deine Hardware, die die Werte sendet. Den mit AC_AggregateValue z.B. ermittelten Wert (z.B. Verbrauch gestern) schreibst Du dann einfach in eine neue Variable und kannst dann den Wert abrufen. Dort kannst Du auch die Häufigkeit mittels eines Ereignisses (Durchführung des Scriptes) einstellen.

Viele Grüße,

Burkhard

Danke Burkhard, dass Du mir trotzdem geantwortet hast. Ich habe sehr wohl gesucht und diesen Faden auch gefunden. Auch die Funktionen zum Archivhandling habe ich mir angeschaut. Nun bin ich, wie viele andere auch, mit der gestaltenden Programmierung noch etwas hölzern unterwegs.

Deshalb habe ich halt mal versucht nach Vorlagen zu fragen, mit denen jemand etwas ähnliches schon gelöst hat, bevor ich das Rad neu erfinde. Vielleicht gibt es ja noch etwas Input?

Dank und Gruß

tango

Also hier mal zwei Beispiele:

monatliche Aggregation für Januar:

<?
$werte = AC_GetAggregatedValues(30200 /*[Archive]*/, 59017 /*[Hardware\SDM 630\Total kWh]*/, 3 /* monatliche Abbrebation*/
 */, mktime(0, 0, 0, 1, 1, 2018), mktime(23, 59, 1, 31, 2018), 0); 
foreach($werte as $wert) {
	echo date("d.m.Y H:i:s", $wert['TimeStamp']) . " -> " . $wert['Avg'] . PHP_EOL;
}
SetValue(40489 /*[Hardware\SDM 630\kWh Monat]*/, $wert['Avg']);
?>

Kontinuierliche Aggregation für den Vortag:

$werte = AC_GetAggregatedValues(30200 /*[Archive]*/, 59017 /*[Hardware\SDM 630\Total kWh]*/, 1 /* täglich */, strtotime("yesterday 23:59"), time(), -1); 
foreach($werte as $wert) {
	echo date("d.m.Y H:i:s", $wert['TimeStamp']) . " -> " . $wert['Avg'] . PHP_EOL;
}
SetValue(16764 /*[Hardware\SDM 630\kWh Vortag]*/, $wert['Avg']);
?>

Für dieses Script ein Ereignis erstellt, welches zyklisch das Script jeden Tag um 23:59:59 ausführt. Dabei wird der Vortages-Wert in die Variable kWh Vortag gespeichert und geloggt.

Vielleicht hilft das um etwas Durchblick zu kriegen. Ich möchte mich aber an dieser Stelle selber noch bei sewo und den Anderen aus dem Threat: Archiv Daten berechnen bedanken, ohne deren Tipps würde ich auch noch im Dunkeln stehen.

Viele Grüße,

Burkhard

Hi,

ich habe mir auch vor langer Zeit hier im Forum paar Sachen zusammengesucht und dann folgende Funktionen gebastelt.


function strom() {
	
////////////////////////////////////////////////////////////////////////////////
echo '-------------------------- LETZTE WERTE --------------------------------------'.PHP_EOL;
////////////////////////////////////////////////////////////////////////////////
// GESTERN
$data = AC_GetAggregatedValues(38732 /*[Archive]*/, 13285 /*[Steuerung\Verbrauchsmonitor\Strom\Stromzähler]*/, 1 /* Täglich */, strtotime("yesterday"), strtotime("today")-1, 0);  
echo 'Verbrauch Gestern: '.verbrauch($data).PHP_EOL;
// LEZTE WOCHE
$data = AC_GetAggregatedValues(38732 /*[Archive]*/, 13285 /*[Steuerung\Verbrauchsmonitor\Strom\Stromzähler]*/, 2 /* Wöchentlich */, strtotime("monday last week"), strtotime("monday this week")-1, 0);  
echo 'Verbrauch Letzte Woche: '.verbrauch($data).PHP_EOL;
// LETZTER MONAT
$data = AC_GetAggregatedValues(38732 /*[Archive]*/, 13285 /*[Steuerung\Verbrauchsmonitor\Strom\Stromzähler]*/, 3 /* Monatlich */, strtotime("first day of last month 00:00:00"), strtotime("last day of last month 23:59:59"), 0);  
echo 'Verbrauch Letzter Monat: '.verbrauch($data).PHP_EOL;
// LETZTES JAHR
$ly = date('Y', strtotime('-1 year'));
$data = AC_GetAggregatedValues(38732 /*[Archive]*/, 13285 /*[Steuerung\Verbrauchsmonitor\Strom\Stromzähler]*/, 4 /* Jährlich */, mktime(0, 0, 0, 1, 1, $ly), mktime(23, 59, 59, 12, 31, $ly), 0);  
echo 'Verbrauch Letztes Jahr: '.verbrauch($data).PHP_EOL;

////////////////////////////////////////////////////////////////////////////////
echo '------------------------- AKTUELL WERTE -------------------------------------'.PHP_EOL;
////////////////////////////////////////////////////////////////////////////////
// HEUTE
$data = AC_GetAggregatedValues(38732 /*[Archive]*/, 13285 /*[Steuerung\Verbrauchsmonitor\Strom\Stromzähler]*/, 1 /* Stündlich */, strtotime("today"), strtotime("now"), 0);
$wert_day = verbrauch($data);
echo 'Verbrauch Heute: '.$wert_day.PHP_EOL;
// WOCHE
$data = AC_GetAggregatedValues(38732 /*[Archive]*/, 13285 /*[Steuerung\Verbrauchsmonitor\Strom\Stromzähler]*/, 2 /* Wöchentlich */, strtotime("last monday"), strtotime("now"), 0);  
$wert_week = verbrauch($data);
echo 'Verbrauch Woche: '.$wert_week.PHP_EOL;
// MONAT
$data = AC_GetAggregatedValues(38732 /*[Archive]*/, 13285 /*[Steuerung\Verbrauchsmonitor\Strom\Stromzähler]*/, 3 /* Monatlich */, strtotime("first day of this month 00:00"), strtotime("now"), 0);
$wert_month = verbrauch($data);
echo 'Verbrauch Monat: '.$wert_month.PHP_EOL;
// JAHR
$data = AC_GetAggregatedValues(38732 /*[Archive]*/, 13285 /*[Steuerung\Verbrauchsmonitor\Strom\Stromzähler]*/, 4 /* Jährlich */, strtotime("first day of January"), strtotime("now"), 0);  
$wert_year = verbrauch($data);
echo 'Verbrauch Jahr: '.$wert_year.PHP_EOL;

////////////////////////////////////////////////////////////////////////////////
echo '------------------------- HOCHRECHNUNG ------------------------------------'.PHP_EOL;
////////////////////////////////////////////////////////////////////////////////
// TAG
$diff = strtotime('now') - strtotime('today');
$full = 60*60*24;
$wert = round($wert_day*$full/$diff, 2);
echo 'Hochrechnung Heute: '.$wert.PHP_EOL;
// WOCHE
$diff = strtotime('now') - strtotime('last monday');
$full = 60*60*24*7;
$wert = round($wert_week*$full/$diff, 2);
echo 'Hochrechnung Woche: '.$wert.PHP_EOL;
// MONAT
$diff = strtotime('now') - strtotime('first day of this month 00:00');
$full = 60*60*24*date('t');
$wert = round($wert_month*$full/$diff, 2);
echo 'Hochrechnung Monat: '.$wert.PHP_EOL;
// JAHR
$diff = strtotime('now') - strtotime('first day of January');
$full = 60*60*24*365;
$wert = round($wert_year*$full/$diff, 2);
echo 'Hochrechnung Monat: '.$wert.PHP_EOL;
}



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);
}	 

Aussehen tut das dann mit Timer, schreiben der Variablen usw. so aus:

Viel Erfolg
Pitti

Danke Euch beiden für die Inputs! Damit ist das Blatt nicht mehr weiß und man kann mal loslegen mit Experimentieren.
Soll ja hübsch regnen am Wochenende, da kann man da ja mal reinsteigen. Bin gespannt, was rauskommt!

Dank und Gruß
tango

HalloPitti,

das ist der Hammer, damit haste mir ja auch wieder was fürs Wochenende bereitet. Vielen Dank für Deinen Input.

Viele Grüße,

Burkhard

Danke, na wenn Euch das so gut gefällt dann gleich das komplette Script :smiley:


<? 
################################################################################
# Scriptbezeichnung: HM.Consumption.ips.php
# Version:	1.0
# Author:	Heiko Wilknitz
#
# Auswertung und Hochrechnung des Stromverbrauches
#
# ----------------------------- Konfigruration ---------------------------------
#
# Anzahl Nachkommastellen bei Ergebnissen
$roundTo=2;                //Anzahl Nachkommastellen bei Ergebnissen 
#
# ----------------------------------- ID´s -------------------------------------
#
$parentID = IPS_GetObject($_IPS['SELF']); 
$parentID = $parentID['ParentID']; 
# ID des ArchiveHandler ermitteln 
$instances = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}'); 
$archiveID = $instances[0]; 
#
################################################################################

// Verbrauchszähler
$valueID = IPS_GetObjectIDByIdent("Value", $parentID); 

// Variablen anlegen bzw. auslesen
$lastYearID		= CreateVariableByName($parentID, "Verbrauch letztes Jahr"); 
$lastMonthID    = CreateVariableByName($parentID, 'Verbrauch letzter Monat'); 
$lastWeekID     = CreateVariableByName($parentID, 'Verbrauch letzte Woche'); 
$lastDayID      = CreateVariableByName($parentID, 'Verbrauch letzter Tag'); 

$currYearID		= CreateVariableByName($parentID, "Verbrauch aktuelles Jahr"); 
$currMonthID    = CreateVariableByName($parentID, 'Verbrauch aktueller Monat'); 
$currWeekID     = CreateVariableByName($parentID, 'Verbrauch aktuelle Woche'); 
$currDayID      = CreateVariableByName($parentID, 'Verbrauch aktueller Tag'); 

$consYearID		= CreateVariableByName($parentID, "Hochrechnung Jahr"); 
$consMonthID    = CreateVariableByName($parentID, 'Hochrechnung Monat'); 
$consWeekID     = CreateVariableByName($parentID, 'Hochrechnung Woche'); 
$consDayID      = CreateVariableByName($parentID, 'Hochrechnung Tag'); 

// -------------------------- LETZTE WERTE -------------------------------------
// GESTERN
$data = AC_GetAggregatedValues($archiveID, $valueID, 1 /* Täglich */, strtotime("yesterday"), strtotime("today")-1, 0);  
SetValueFloat($lastDayID, CalcConsumption($data));
// LEZTE WOCHE
$data = AC_GetAggregatedValues($archiveID, $valueID, 2 /* Wöchentlich */, strtotime("monday last week"), strtotime("monday this week")-1, 0);  
SetValueFloat($lastWeekID, CalcConsumption($data));
// LETZTER MONAT
$data = AC_GetAggregatedValues($archiveID, $valueID, 3 /* Monatlich */, strtotime("first day of last month 00:00:00"), strtotime("last day of last month 23:59:59"), 0);  
SetValueFloat($lastMonthID, CalcConsumption($data));
// LETZTES JAHR
$ly = date('Y', strtotime('-1 year'));
$data = AC_GetAggregatedValues($archiveID, $valueID, 4 /* Jährlich */, mktime(0, 0, 0, 1, 1, $ly), mktime(23, 59, 59, 12, 31, $ly), 0);  
SetValueFloat($lastYearID, CalcConsumption($data));

// ------------------------- AKTUELL WERTE -------------------------------------
// HEUTE
$data = AC_GetAggregatedValues($archiveID, $valueID, 1 /* Stündlich */, strtotime("today"), strtotime("now"), 0);
$dataDay = CalcConsumption($data);
SetValueFloat($currDayID, $dataDay);
// WOCHE
$data = AC_GetAggregatedValues($archiveID, $valueID, 2 /* Wöchentlich */, strtotime('last monday', strtotime('tomorrow')), strtotime("now"), 0);  
$dataWeek = CalcConsumption($data);
SetValueFloat($currWeekID, $dataWeek);
// MONAT
$data = AC_GetAggregatedValues($archiveID, $valueID, 3 /* Monatlich */, strtotime("first day of this month 00:00"), strtotime("now"), 0);
$dataMonth = CalcConsumption($data);
SetValueFloat($currMonthID, $dataMonth);
// JAHR
$data = AC_GetAggregatedValues($archiveID, $valueID, 4 /* Jährlich */, strtotime("first day of January"), strtotime("now"), 0);  
$dataYear = CalcConsumption($data);
SetValueFloat($currYearID, $dataYear);

// ------------------------- HOCHRECHNUNG --------------------------------------
// TAG
$diff = strtotime('now') - strtotime('today');
$full = 60*60*24; // 24h
$data = round($dataDay*$full/$diff, 2);
SetValueFloat($consDayID, $data);
// WOCHE
$diff = strtotime('now') - strtotime('last monday', strtotime('tomorrow'));
$full = 60*60*24*7; // 7 Tage
$data = round($dataWeek*$full/$diff, 2);
SetValueFloat($consWeekID, $data);
// MONAT
$diff = strtotime('now') - strtotime('first day of this month 00:00');
$full = 60*60*24*date('t'); // 1 Monat
$data = round($dataMonth*$full/$diff, 2);
SetValueFloat($consMonthID, $data);
// JAHR
$diff = strtotime('now') - strtotime('first day of January');
$full = 60*60*24*365; // 1 Jahr
$data = round($dataYear*$full/$diff, 2);
SetValueFloat($consYearID, $data);


// Funktion zum addieren der Zählerwerte 
function CalcConsumption($values) 
{
global $roundTo;
	$consumption = 0;
	foreach($values as $value) {
	    //echo date("d.m.Y H:i:s", $wert['TimeStamp']) . " -> " . $wert['Avg'] . PHP_EOL; 
		$consumption += $value['Avg'];
	}
	return round($consumption, $roundTo);
}	 

// Variablen erstellen falls nicht vorhanden und ID entsprechend zuordnen 
function CreateVariableByName($id, $name) 
{ 
    $vid = @IPS_GetVariableIDByName($name, $id); 
    if($vid === false) { 
        $vid = IPS_CreateVariable(2); 
        IPS_SetParent($vid, $id); 
        IPS_SetName($vid, $name); 
	} 
    return $vid; 
}
 
// Eine Funktion um ein Script im Script-Verzeichnis zu erzeugen 
// erstellt von hirschbrat, angepasst wgreipl 
function CreateScriptByName($scriptName, $parentId) 
{ 
    $scriptID = @IPS_GetScriptIDByName($scriptName, $parentId); 
    if ($scriptID == 0){ 
        $scriptID = IPS_CreateScript(0); 
        IPS_SetName($scriptID, $scriptName); 
        IPS_SetParent($scriptID, $parentId); 
    } 
    return $scriptID; 
} 
?>

Wow!

Nachfrage eines hölzernen Programmierers:
Wie ermittelst Du den Namen Deines Stromzählers bzw. seiner Variablen? Zeile 25 mit „Value“?
Und der lange String in Zeile 19 „{43192F0B-135B-4CE7-A0A7-1475603F3060}“ ist die InstanzID Deiner gesamten Installation? Wo bekomme ich die für mich her?

Wenn ich nun verschiedene Zähler auslesen wollte würde ich für jeden Zähler ein eigenes Skript anlegen? Ich habe separate Zähler für Haus, Auto, Heizung…

Sorry für die blöden Fragen, aber ich mag die Sachen verstehen, die ich laufen lasse - soweit möglich zumindest.

THX!

IPS_GetModuleList — IP-Symcon :: Automatisierungssoftware

Gesendet von iPhone mit Tapatalk

Das ist meine Variable die den realen Verbrauch beinhaltet (im Bild = Stromzähler), welcher die Ident „Value“ hat und unterhalb des Scriptes hängt. Kommt über ein Homematic HM-ES-TX-WM rein.

Damit ermittele ich die Inctance Id des Archiv Controls, sollte bei Dir die gleiche sein. Schau dir mal die Doku von „IPS_GetModuleList“ an.

Viele Wege führen nach Rom :smiley: Es kommt drauf an was Du mit den Erkenntnissen machen möchtest.
Aus dem Bauch heraus würde ich nicht das Script duplizieren, sondern die Aufrufe im Script, also das für die 3 Zähler jeweils Durchlaufen und wegschreiben und zusätzlich die Daten am Ende zusammenaddieren um das große ganze zu sehen. Deine Entscheidung!

Ciao Pitti

Sorry, Frage erstmal gelöscht, habe nicht gesehen, dass auf der zweiten Seite noch Antworten sind. Muss das erstmal abarbeiten…

You made my day! Vielen Dank.

Habe in Zeile 25 einfach meine Variablennummer eingetragen - gleich hat es funktioniert. Ich habe das Skript jetzt noch für die drei Zähler angelegt und so habe ich eine Liste mit Werten. Ist noch nicht schön aufbereitet, aber die Zahlen sind gut!

Zwischen Verbrauchszähler (SDM630) und Erzeugung (Kostal Piko 10.1) muss ich noch eine Eigenverbrauchsberechnung schalten und die dann auch mitloggen lassen, dann sieht es schon zu 90% so aus, wie ich es mir wünsche.

Am Ende möchte ich am liebsten noch „rollierende“ Tages-, Monats- und Jahreswerte bekommen. So ein Jahres- oder Monatsanfang ist ja was willkürliches, im Prinzip fängt ja jeden Tag wieder ein neuer Monat und ein neues Jahr an, das man mit dem Monat oder Jahr davor vergelichen kann, da muss man nicht auf Sylvester warten.

Aber für den Augenblick ist das schon mal um Längen besser als seither.

Hallo pitti,

meinen herzlichsten Dank. Du hast innerhalb von Minuten die Lösung aller meiner Probleme geschickt. Ich habe seit Wochen probiert, genau diese Werte aus meinem SDM630 zu errechnen. Ich gebe zu, PHP ist nicht mein Freund, aber dank Dir bin ich etwas vertrauter, was die Funktion „function“ betrifft. Also nicht nur schneller ans Ergebnis, sondern auch noch etwas gelernt.

DANKE !!!

Viele Grüße,

Burkhard

Hallo pitti,

jetzt hab ich doch ein Problem, heute morgen um 8:00 Uhr hat mein System die Werte ein letztes mal aktualisiert, danach nicht mehr. Ich weiß nur nicht warum.

Wollte dann Dein Script durchlaufen lassen und sehen, ob ich irgendwo in meinem nen Fehler habe. Allerdings bricht Dein Script mit folgenden Fehlermeldungen ab:

Warning: Object with ident Value could not be found in /var/lib/symcon/scripts/18891.ips.php on line 25

Warning: Logging is not available for this variable in /var/lib/symcon/scripts/18891.ips.php on line 45

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

Warning: Logging is not available for this variable in /var/lib/symcon/scripts/18891.ips.php on line 48

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

Warning: Logging is not available for this variable in /var/lib/symcon/scripts/18891.ips.php on line 51

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

Warning: Logging is not available for this variable in /var/lib/symcon/scripts/18891.ips.php on line 55

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

Warning: Logging is not available for this variable in /var/lib/symcon/scripts/18891.ips.php on line 60
Abort Processing during exceed of maximal ErrorCount: Invalid argument supplied for foreach()
Error in Script /var/lib/symcon/scripts/18891.ips.php on Line 104

Hast Du vielleicht eine Ahnung woran das liegen kann? Habe das Script direkt unter der SDM630 Instanz gesetzt.

P.S.: Okay, er zeichnet jetzt Werte auf, war ein Fehler in der Hierarchie der IDs. JEtzt mal abwarten, ob er die Werte richtig triggert.

Viele Grüße,

Burkhard

P.S.: Ich sag ja, PHP und ich, dass ist eine reine Hassliebe. :o:(

Hallo Burkhard,

sorry, war dienstlich unterwegs und komme jetzt erst zum lesen!

Vielen herzlichen Dank erstmal für dein nettes Lob. Ich bin immer wieder beeindruckt wie hier im Forum miteinander umgegangen wird. Selbst wenn man mal eine „dumme“ Frage stellt wird nur dezent darauf hingewiesen, aber immer geholfen.

Ich freue mich jedenfalls immer riesig wenn mein dazutun anderen weiter bringt und die Sachen gemeinsam weiterentwickelt werden.

Zu Deinem Problem: wenn ich es richtig verstehe haste den Fehler selber gefunden. Das Script hat die Variable mit den Ident „Value“ unter sich nicht gefunden.

Schönen Sonntag
Heiko

Hallo Heiko,

das Stichwort „unter sich“ (in Bezug auf „Value“) war es. Ich hatte die Variablen nicht unter dem Skript angeordnet, sondern das Skript in einer eigenen Kategorie „Energieberechnung“. Mit dem Befehl zur Ermittlung der Variablen-ID konnte es bei mir also nicht nicht funktionieren, deshalb und einfachheitshalber habe ich dann in Zeile 25 hinter „=“ direkt meine Variablen-ID gesetzt und seither funktioniert es tatal gut.

Hättest Du vielleicht auch noch Anregungen für die „rollierende Berechnung“, also die letzten 24 Stunden, letzten 7 Tage, letzten 30,44 Tage oder 730,5 Stunden (1/12-Jahr) und letzten 365,25 Tage? Bin bin da schon wieder in einer Sackagasse im Excel könnte ich das ausdrücken, aber PHP:banghead:

Dank und schönen Sonntag.

Hi tango,

das sollte doch nach dem gleichen Schema laufen wie bei den anderen Aufrufen, d.h. der einzige Unterschied ist die richtige Zeitberechnung.


$now = strtotime("now");
$m24 = strtotime("-1 day");

echo date('l dS \o\f F Y h:i:s A', $now), "
";
echo date('l dS \o\f F Y h:i:s A', $m24);

Damit haste Du von JETZT minus 1 Tag, also die letzten 24 Stunden!
Habs nicht ausprobiert,aber ich hätte das jetzt mal getestet:


$data = AC_GetAggregatedValues($archiveID, $valueID, 1 /* Täglich */, strtotime("-1 day"), strtotime("now"), 0);  
SetValueFloat($lastDayID, CalcConsumption($data));

Und das dann in den entsprechenden Zeitsprüngen (-1 week) …

Ciao Pitti

Hallo pitti,

richtig, ich hatte 2 Fehler eingebaut. Zum Einen hatte ich meiner Variable mit IPS_SetIdent(59017, „Value“) keine Ident zugewiesen (war mir irgendiwe entfallen, da ich das sonst nicht nutze)und zum anderen war die Variable nicht unter dem Script einsortiert.

Jetzt läuft es perfekt. In diesem Sinne, super Unterstützung.

Viele Grüße,

Burkhard

Ein kleiner Schritt für die Menschheit - ein großer Schritt für einen PHP-Newbie:

Mein erster eigener Code zur Berechnung des Eigenverbrauchs, des Exports und Imports von Strom.

Heiko, ich habe Deinen Code als Gerüst genommen - vielen Dank dafür.

Im Moment berechne ich die jeweilige Leistung. Die Aggregation auf Arbeit kommt noch. Aber meine Freude ist schon mal groß :slight_smile: Das Program ist nicht wirklich anspruchsvoll, aber als Programmierübung war es für mich wichtig!

Die Variante mit der „rollierenden“ Berechnung von Wochen-, Monats- und Jahreswert funktioniert übrigens gut.

   <? 
################################################################################
# Scriptbezeichnung: PV.Eigenverbrauch.ips.php
# Version:	0.1
# Author:	Stefan Krüger, 
# 			nach Anregungen von Heiko "pitti"
#
#			ANZUPASSEN: Zeile 33 und 38 LogdatenID der PV-Anlage und des Hausverbrauchszählers			
#
# Berechnung von Eigenverbrauch, Export und Import von Strom in Installationen 
# mit PV-Anlage, Erzeugungszähler (z.B. über PV-Wechselrichter) und 
# Haus-Verbrauchszähler.  
# 
# Ausbaustufe: Simulation eines Batteriespeichers
#
# ----------------------------- Konfigruration ---------------------------------
#
# Anzahl Nachkommastellen bei Ergebnissen
$roundTo=2;                //Anzahl Nachkommastellen bei Ergebnissen 
#
# ----------------------------------- ID´s -------------------------------------
#
$parentID = IPS_GetObject($_IPS['SELF']); 
$parentID = $parentID['ParentID']; 
echo $parentID;
# ID des ArchiveHandler ermitteln 
$instances = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}'); 
$archiveID = $instances[0]; 
#
################################################################################

// Erzeugungszähler (15-Sekunden Messwert)
$P_pvID = 35644 /*[Außen\PV-Anlage\AC Leistung\AC-Leistung aktuell]*/; 
$P_pv = GetValueFloat ($P_pvID);
echo $P_pv, " Erzeugung 
";

// Verbrauchszähler (15-Sekunden Messwert)
$P_hvID = 39068 /*[Energie\SDM630 Hausverbrauch\SDM630-P-ges\SDM630-P-ges]*/;
$P_hv = GetValueFloat ($P_hvID);
echo $P_hv, " Verbrauch 
";

// Variablen anlegen bzw. auslesen für Export/Import/Eigenverbrauch als Leistung
$P_ExportID       = CreateVariableByName($parentID, "Leistung Export"); 
$P_ImportID       = CreateVariableByName($parentID, "Leistung Import"); 
$P_SelfCID        = CreateVariableByName($parentID, "Leistung Eigenverbrauch"); 

// -------------------------- BERECHNUNG Export/Import/Eigenverbrauch ----------
if ($P_pv >= $P_hv) {
	// momentan liegt Stromüberschuss an, der exportiert/verkauft wird
	$P_Export = round($P_pv - $P_hv, $roundTo);
	$P_SelfC  = round($P_hv, $roundTo);
	$P_Import = 0;
	echo $P_Export, " Export ", "
", $P_SelfC, " Eigenverbrauch";

	} else {
	// momentan liegt Strombezug aus dem Netz an, der angekauft wird
	$P_Import = round($P_hv - $P_pv, $roundTo);	
	$P_SelfC  = round($P_pv, $roundTo);
	$P_Export = 0;
	echo $P_Import, " Import ", "
", $P_SelfC, " Eigenverbrauch";
	}
SetValueFloat($P_ExportID , $P_Export);
SetValueFloat($P_ImportID , $P_Import);
SetValueFloat($P_SelfCID , $P_SelfC);	
  

// Variablen erstellen falls nicht vorhanden und ID entsprechend zuordnen 
function CreateVariableByName($id, $name) 
{ 
    $vid = @IPS_GetVariableIDByName($name, $id); 
    if($vid === false) { 
        $vid = IPS_CreateVariable(2); 
        IPS_SetParent($vid, $id); 
        IPS_SetName($vid, $name); 
    } 
    return $vid; 
}
 
 
?>