Stromverbrauch nach Einschaltzeitraum aus Archiv laden und speichern

Hallo zusammen,

ich bin jetzt soweit und komme nicht mehr weiter.
Ich möchte gerne den Stromverbrauch meiner Haushaltgeräte z.B: Waschmaschine pro Waschvorgang aus dem Archiv laden und speichern.

Dazu habe ich folgendes Skript erstellt.

<?php

$archive = 24614;                                                                                                                                                   // ArchivID
$quelle = 34912;                                                               // Wirkarbeit von S0 Zähler
$aktuelle_Leistung = GetValueFloat(43560);      //aktuelle Leistung extrapoliert aus S0 Zähler
$Takt_Ende = GetValueBoolean (56370);                   //Taktende z.B. Waschvorgang
$Uhrzeit = time();


//Abfrage ob Maschine in Betrieb ist
if ($aktuelle_Leistung > 20)
{    
SetValueBoolean(50727,true);
($tStart = ($Uhrzeit));
}
if (($Takt_Ende == false) AND ($aktuelle_Leistung == 0))
{    
SetValueBoolean(50727,false);
($tStopp = ($Uhrzeit));
//$Verbrauch_pro_Gang = AC_GetAggregatedValues($archive, $quelle, 0 /* Stündlich */, strtotime("yesterday 00:00"), strtotime("today 00:00")-1, 0);
$Verbrauch_pro_Gang = AC_GetAggregatedValues($archive, $quelle, 0 /* Stündlich */, strtotime($tStart), strtotime($tStopp), 0);
SetValueFloat(17578, $Verbrauch_pro_Gang[0]['Avg']);
SetValueBoolean(56370,true);
}


//$Verbrauch_pro_Gang = AC_GetAggregatedValues($archive, $quelle, 0 /* Stündlich */, strtotime($tStart), strtotime($tStopp), 0);   
//SetValueFloat(17578, $Verbrauch_pro_Gang[0]['Avg']);
//$Start_Ende = IPS_GetVariable (50727);
//$Verbrauch_pro_Gang = AC_GetAggregatedValues($archive, $quelle, 0 /* Stündlich */, strtotime($tStart), ($Start_Ende['VariableChanged']), 0);
//$Verbrauch_pro_Gang = AC_GetAggregatedValues($archive, $quelle, 0 /* Stündlich */, strtotime($tStart), strtotime($tStopp), 0);
//SetValueFloat(17578, $Verbrauch_pro_Gang[0]['Avg']);
//var_dump ($Verbrauch_pro_Gang [0]  ['Avg']);
//var_dump ($Uhrzeit);
//var_dump ($Start_Ende['VariableChanged']);
//strtotime("$Start_Ende")
//var_dump ((string) ("yesterday 00:00"));
//var_dump ((string) ($Start_Ende['VariableChanged']));
//var_dump ($tStart);
//var_dump ($tStopp);



?>

Das Skript funktioniert soweit, bis auf das, dass in die Variable ($Verbrauch_pro_Gang) nicht die kW/h pro Waschgang geschrieben werden.

Wenn ich folgendes mache

<?php

$archive = 24614;                                                                                                                                                   // ArchivID
$quelle = 34912;                                                               // Wirkarbeit von S0 Zähler
$aktuelle_Leistung = GetValueFloat(43560);      //aktuelle Leistung extrapoliert aus S0 Zähler
$Takt_Ende = GetValueBoolean (56370);                   //Taktende z.B. Waschvorgang
$Uhrzeit = time();


//Abfrage ob Maschine in Betrieb ist
if ($aktuelle_Leistung > 20)
{    
SetValueBoolean(50727,true);
($tStart = ($Uhrzeit));
}
if (($Takt_Ende == false) AND ($aktuelle_Leistung == 0))
{    
SetValueBoolean(50727,false);
($tStopp = ($Uhrzeit));
$Verbrauch_pro_Gang = AC_GetAggregatedValues($archive, $quelle, 0 /* Stündlich */, strtotime("yesterday 00:00"), strtotime("today 00:00")-1, 0);
//$Verbrauch_pro_Gang = AC_GetAggregatedValues($archive, $quelle, 0 /* Stündlich */, strtotime($tStart), strtotime($tStopp), 0);
SetValueFloat(17578, $Verbrauch_pro_Gang[0]['Avg']);
SetValueBoolean(56370,true);
}


//$Verbrauch_pro_Gang = AC_GetAggregatedValues($archive, $quelle, 0 /* Stündlich */, strtotime($tStart), strtotime($tStopp), 0);   
//SetValueFloat(17578, $Verbrauch_pro_Gang[0]['Avg']);
//$Start_Ende = IPS_GetVariable (50727);
//$Verbrauch_pro_Gang = AC_GetAggregatedValues($archive, $quelle, 0 /* Stündlich */, strtotime($tStart), ($Start_Ende['VariableChanged']), 0);
//$Verbrauch_pro_Gang = AC_GetAggregatedValues($archive, $quelle, 0 /* Stündlich */, strtotime($tStart), strtotime($tStopp), 0);
//SetValueFloat(17578, $Verbrauch_pro_Gang[0]['Avg']);
//var_dump ($Verbrauch_pro_Gang [0]  ['Avg']);
//var_dump ($Uhrzeit);
//var_dump ($Start_Ende['VariableChanged']);
//strtotime("$Start_Ende")
//var_dump ((string) ("yesterday 00:00"));
//var_dump ((string) ($Start_Ende['VariableChanged']));
//var_dump ($tStart);
//var_dump ($tStopp);



?>


Also dem Beispiel aus der Doku folge, bekomme ich Werte in die Variable, die sind aber auch nicht die richtigen.
Ich denke das es nur an dem liegt

$Verbrauch_pro_Gang = AC_GetAggregatedValues($archive, $quelle, 0 /* Stündlich */, strtotime("yesterday 00:00"), strtotime("today 00:00")-1, 0);

Ich weiß nicht wie hier die richtige Syntax für meinen Anwendungsfall ist.
Könnte mir da jemand auf die Sprünge helfen?

Danke.

Hi,
vielleicht einfacher das Modul

nehmen?

Ralf

1 „Gefällt mir“

Ja ich hatte auch schon daran gedacht.
Aber ich hab mir zum Ziel genommen, dass ich mehr mit Skripten umsetze um zu lernen.
Das ist ja der große Vorteil von Ips.

Ich versuche es mal mit AC_GetLoggesValues und berechne dann den Unterschied, zwischen 2 Zeitfenstern.
Vielleicht funktioniert das.

Lernen ist immer gut. Vielleicht ein Tipp von jemand der noch nicht so lange dabei ist. Vielleicht mal den Quelltext von Modulen ansehen wie die es gelöst haben.

Mir sind an deinen scripten ein paar Sachen aufgefallen.

($aktuelle_Leistung == 0)

da würde ich eher ($aktuelle_Leistung < 1) wählen denn meine Steckdose der Waschmaschine liefert noch einen Wert von 0.3W wenn sie „aus“ ist.

Wann startest Du das Script? Im Prinzip musst Du die AggregatedValues in einer Schleife auslesen und wenn es da z.B. einen Wert >50W (oder so) ist den Zeitstempel von diesem Wert nehmen und da weiter auslesen bis ein Wert <XW ist dann ist Ende. Für Start/Ende solltest Du besser LoogedValues auslesen da Du dann >1W und <1W nehmen kannst und dazwischen müsstest Du dann die AggregatedValues ausummieren.

Ralf

Also ich habs jetzt hinbekommen.
Das Skript wir einmal vom Zähler (Leistung = >20 Watt ) getriggert und wenn die Maschine fertig ist dann vom Ablaufplan (Fertigmelder)

Ich habe es jetzt wie folgt umgesetzt auch wie du schon sagtest (ACloggedValues) verwendet.
Mein Zähler ist ein S0 Zähler den ich in einer SPS auswerte und per Modbus an IPS weitergebe, die Genauigkeit ist hier leider nur 0.01, 2 Watt gehen leider nicht. Ermisst es zwar aber die Float Variable von der SPS zu IPS hat keine so hohe Auflösung.

<?php

$archive = 24614;                                                                                                                                                   // ArchivID
$quelle = 34912;                                                               // Wirkarbeit von S0 Zähler
$aktuelle_Leistung = GetValueFloat(43560);      //aktuelle Leistung extrapoliert aus S0 Zähler
$Takt_Ende = GetValueBoolean (56370);                   //Taktende z.B. Waschvorgang
$Uhrzeit = time();


//Abfrage ob Maschine in Betrieb ist
if ($aktuelle_Leistung > 20)
{    
SetValueBoolean(50727,true);
//($tStart = ($Uhrzeit));
$Verbrauch_Start = AC_GetLoggedValues($archive, $quelle, 0, 0, 1)[0]['Value'];
SetValueFloat(38616,$Verbrauch_Start);
}
elseif (($Takt_Ende == false) AND ($aktuelle_Leistung == 0))
{    
SetValueBoolean(50727,false);
$Verbrauch_Stopp = AC_GetLoggedValues($archive, $quelle, 0, 0, 1)[0]['Value'];
SetValueFloat(58421,$Verbrauch_Stopp);
$Verbrauch_pro_Gang = GetValueFloat(58421) - GetValueFloat(38616);
SetValueFloat(17578, $Verbrauch_pro_Gang);
SetValueBoolean(56370,true);
}
?>

Ich hatte lange einen Denkfehler und ich verstehe es aber auch nicht ganz.
Es gibt bei IPS ja die Variablen im Objektbaum, welche global über Set und Get Value angesprochen werden und es gibt die internen Variablen, welche nur in einem Skript gültig sind.

Ich hatte in meiner If Anweisung im ersten zweig die Startzeit ermittelt

$tStart = time();

Und im anderen Zweig die Stoppzeit

$tStopp = time();
$tMaschinelaufzeit = ($tStopp - $tStart);

Das hat nicht funktioniert.
Wenn ich das Skript über den Editor mit Play manuell ausgeführt habe, kam kein Fehler aber eine
Notice: Variable tStart ist nicht deklariert oder so ähnlich.
Notice: Variable tStopp ist nicht deklariert oder so ähnlich

Der Editor hat die Variable quasi nicht gefunden.
Wenn ich das ausserhalb des If Zweiges mache funktioniert es.

Also habe ich mir für tStart und tStopp im Objektbaum Variablen angelgt und die verwendet.
Ich dachte immer das Variablen im Skript immer innerhalb des Skriptes gültig sind, ansonsten brauche ich (include).
Warum hat das nicht funktioniert, bzw. hat es innerhalb der IF- Anweisung nicht funktioniert.

Das wäre super wenn mir das jemand erklären könnte.?
Falls es unklar ist, hänge ich nochmal ein Beispiel an.

Danke.

Wenn Du die Variablen zu BEGINN Deines Scripts deklarierst (und z.B. mit 0 initialisierst), dann sind sie auch in den (if-) Zweigen darunter bekannt. Was NUR im if-Zweig steht, ist am Ender der Schleife wieder weg.

Grüße, Gerhard

1 „Gefällt mir“

Hi Gerhard,

ich kann dir da schon folgen.
Aber ich glaube ich muss für meinen Fall doch alles über Variablen im Objektbaum machen.
Ich habe jetzt noch eine Zeitauswertung hinzugefügt, um die Betriebszeit der Maschine zu ermitteln.
Das klappt leider nicht, weil $tStart beim zweiten Aufruf des Skriptes wieder auf 0 initialisiert, dann wird in die zweite IF Anweisung gesprungen (weil erfüllt), dann stimmt die Berechnung für $tDauer_letzter_Waschvorgang nicht mehr.

Evtl. könnte ich das ganze über 2 Skripte ohne IF Anweisung machen.

<?php
//Das Skript wird durch ein Ereignis wenn die aktuelle Leistung >20 Watt ist gestartet
//Das zweite mal wird das Skript durch ein Ereignis in Kombi mit einem Ablaufplan gestartet wenn die aktuelle Leistung für 45 min 0 Watt ist.
//Die Varibale "Takt_Ende" wird duch den Ablaufplan auf (false) gesetzt
$archive = 24614;                                                                                                                                                   // ArchivID
$quelle = 34912;                                                               // Wirkarbeit von S0 Zähler
$aktuelle_Leistung = GetValueFloat(43560);      //aktuelle Leistung extrapoliert aus S0 Zähler
$Takt_Ende = GetValueBoolean (56370);                   //Taktende z.B. Waschvorgang
$Uhrzeit = time();
$tStart = 0;
$tStopp = 0;
$tDauer_letzter_Vorgang = 0;
$Kosten_pro_Vorgang = 0;



//Abfrage ob Maschine in Betrieb ist
if ($aktuelle_Leistung > 20)
{
$tStart = $Uhrzeit;
SetValueBoolean(50727,true);
$Verbrauch_Start = AC_GetLoggedValues($archive, $quelle, 0, 0, 1)[0]['Value'];
SetValueFloat(38616,$Verbrauch_Start);
}
elseif (($Takt_Ende == false) AND ($aktuelle_Leistung == 0))
{ 
$tStopp = $Uhrzeit;  
SetValueBoolean(50727,false);
$Verbrauch_Stopp = AC_GetLoggedValues($archive, $quelle, 0, 0, 1)[0]['Value'];
SetValueFloat(58421,$Verbrauch_Stopp);
$Verbrauch_pro_Gang = GetValueFloat(58421) - GetValueFloat(38616);
SetValueFloat(17578, $Verbrauch_pro_Gang);
SetValueBoolean(56370,true);
$tDauer_letzter_Vorgang = (($tStopp - $tStart)/60)-45;
SetValueInteger (15864,$tDauer_letzter_Waschvorgang);
$Kosten_pro_Vorgang = $Verbrauch_pro_Gang * GetValueFloat (14316);
SetValueFloat (45557,$Kosten_pro_Vorgang);
}

?>

Also ich habs jetzt so gelöst.
Die Variablen die nur in den IF Zweigen gebraucht werden sind interne Variablen. Und Variablen die nach der Abarbeitung im nächsten Programmablauf wieder benötigt werden, sind externe (Objektbaum) Variablen.

So funktioniert es jetzt einwandfrei.
Falls es jemand (nicht PHP Könner) es brauchen kann, einfach kopieren und anpassen.

<?php
//Das Skript wird durch ein Ereignis wenn die aktuelle Leistung >20 Watt ist gestartet
//Das zweite mal wird das Skript durch ein Ereignis in Kombi mit einem Ablaufplan gestartet wenn die aktuelle Leistung für 45 min 0 Watt ist.
//Die Variable "Takt_Ende" wird duch den Ablaufplan auf (false) gesetzt


$archive = 24614;                                                                                                                                                   // ArchivID
$quelle = 34912;                                                               // Wirkarbeit von S0 Zähler
$aktuelle_Leistung = GetValueFloat(43560);      //aktuelle Leistung extrapoliert aus S0 Zähler
$Takt_Ende = GetValueBoolean (56370);                   //Taktende z.B. Waschvorgang
$Uhrzeit = time();

 //+++++++++++++++++++++++Ablauf+++++++++++++++++++++++++++++++++++++++++++++++++++++++//


//Abfrage ob Maschine in Betrieb ist
if ($aktuelle_Leistung > 20)
{
SetValueInteger (53719 , $Uhrzeit);         //Startzeit in Var schreiben

SetValueBoolean(50727,true);                                //Betrieb setzen

//aktuellen Stand kW/h in Var schreiben
$Verbrauch_Start = AC_GetLoggedValues($archive, $quelle, 0, 0, 1)[0]['Value'];
SetValueFloat(38616,$Verbrauch_Start);
}

//Abfrage wenn Maschine in Stopp geht
elseif (($Takt_Ende == false) AND ($aktuelle_Leistung == 0))
{ 
SetValueInteger (17846 , $Uhrzeit);         //Stoppzeit in Var schreiben
SetValueBoolean(50727,false);                               //Stopp  setzen

//aktuellen Stand kW/h in Var schreiben und Dufferenz zwischen kW7H Start berechnen und in Var schreiben
$Verbrauch_Stopp = AC_GetLoggedValues($archive, $quelle, 0, 0, 1)[0]['Value'];
SetValueFloat(58421,$Verbrauch_Stopp);
$Verbrauch_pro_Gang = GetValueFloat(58421) - GetValueFloat(38616);
SetValueFloat(17578, $Verbrauch_pro_Gang);

// Zeiten für Start und Stopp holen und Maschinenlaufzeit berechnen, dann in Var schreiben 
$tStart = GetValueInteger (53719);
$tStopp = GetValueInteger (17846);
$tDauer_letzter_Vorgang = (($tStopp - $tStart)/60)-45; //-45 min weil das die Ruhezeit aus dem Ablaufplan ist und dies keine effektive Maschinenlaufzeit ist 
SetValueInteger (15864,$tDauer_letzter_Vorgang);

//Energiekosten pro Vorgang berechnen und in Var schreiben 
$Kosten_pro_Vorgang = $Verbrauch_pro_Gang * GetValueFloat (14316);
SetValueFloat (45557,$Kosten_pro_Vorgang);

//Fertigmeldung auf True setzen (Achtung wird im Ablauf sofort wieder auf false gesetzt)
SetValueBoolean(56370,true);
}
?>