Tagesverbrauch einer Float Variable errechen?

Das Profil ‚electric‘ ist kein Standardprofil, daher musst du es dir einfach mal anschauen und dann entscheiden. Beim Standardprofil ~Electricity wird als Einheit kWh verwendet, also müsstest du dafür durch 1000 rechnen.

Ist vielleicht nochmal ganz gut, wenn man sich den Zusammenhang, die Formel und die Einheiten zusammensucht:
Der Einfachheit halber habe ich die Einheiten gleich so gewählt, wie sie in unseren Zusammenhängen angezeigt oder ausgegeben werden, also nicht an der Physik, sondern an der Praxis orientiert.

Wärmearbeit „W“ = [kWh]
Wärmeleistung „P“ = [kW]
Massenstrom „m(Punkt)“ oder „m.“ = [kg/h]; da Wasser i.d.R. ein spezifisches Gewicht von 1kg/Liter hat, kann man vereinfacht auch Liter/h einsetzen
Zeiteinheit: Sekunden [s] = 1/3600 [h]
Temperaturdifferenz „dT“ = Temperatur Vorlauf [K]- Temperatur Rücklauf [K]; da sich die Umrechnung von Kelvin in °C über den Summand 273 in beiden Temperaturen ergibt und daher herausfällt, kann man auch die Temperaturen in [°C] einsetzen.
Zeitintervall „dZ“ = Messinterval in Sekunden [s]
Wärmekapazität des Wassers „cp“ = 4,19 [(kW s) / (kg K)]
(Eigentlich ist die Einheit kJ / (kg K), ein Joule [J] ist aber eine Watt-Sekunde [W s])

Die Formel für die Wärmearbeit eines Massenstromes über ein Zeitintervall ist danach also folgende Formel:

W [kWh] = m. [kg/h] x cp [(kW s) / (kg K)] x dT [K] x dZ [s]

Da wir beim Massenstrom „m.“ die Einheit in kg/„Stunde“ haben, müssen wir noch den Faktor „1 [h]/3600 [s]“ einbringen.
Bei der Wärmekapazität „cp“ haben wir die Einheit [kW „Sekunden“ / kg K], müssen also abermals mit Faktor „1 [h]/3600 [s]“ multiplizieren.

Wenn wir also ein Ergebnis in kWh bekommen wollen, dann müssen wir den Massenstrom [kg/h] mit Temperaturdifferenz und Zeitdifferenz [s] mit einem Faktor von 4,19/(3600 x 3600) multiplizieren, also 3,233 x 10^-7 oder 0,0000003233:

W [kWh] = m. [kg/h] x 4,19/(3600 x 3600) x dT [K] x dZ [s]

Die Einheit für cp habe ich zur besseren Übersichtlichkeit weggelassen.

Wer gerne die Leistung betrachten wollte, läßt den Zeitbezug weg:
P [kW] = m. [kg/h] x 4,19/(3600 x 3600) x dT [K]
Also Massentrom mal Wärmekapazität mal Temperaturdifferenz.

Bei den Temperaturen muss man sich eben immer den Betrachtungsstandpunkt verdeutlichen. Wenn die Vorlauftemperatur höher ist, als die Rücklauftemperatur hat man das Setting „Heizung -> Heizkörper“, das Ergebnis gibt die Wärme-Leistung oder die -Arbeit an, die man von der Heizung in die Räume bringt. Bei einem negativen Ergebnis wäre es z.B. die Kühl-Leistung oder Kühl-Arbeit. Dto. bei der Betrachtung von Wärmepumpen auf der Kaltseite.

Man möge mir die mangelhafte Notation verzeihen, mehr habe ich mit diesem Texteditor nicht hingekriegt. Und die Klugscheißerei auch, ich muss mir das selber immer mal wieder herleiten, damit die Einheiten stimmen.

Puhh, alle Achtung das verwirr mich jetzt ein wenig-aber es leuchtet mir etwas ein :slight_smile:

Hier hab ich die Version 10 des Scriptes das ich schon wieder etwas Umgebaut habe:
Ich weis nicht warum das bei mir mit dem Aufaddieren der Werte nicht Funktioniert?
Teilweise hab ich 2 kWh dann wieder 0,75 kWh. Es müsste ja immer mehr werden ( addieren ).


<?
 
 $Durchfluss = GetValueFloat(17461 /*[Hardware IPS\EKM-868 Volumenstrom Heizung\Durchfluss]*/);
 $Heizenergie = GetValueFloat(41161 /*[Wärme - Kälteenergie Verbrauch Akuell\Wärme/Kälte Test\Wärme\Heizenergie]*/);
 $Kühlenergie = GetValueFloat(56052 /*[Wärme - Kälteenergie Verbrauch Akuell\Wärme/Kälte Test\Kälte\Kühlenergie]*/);
 
 // Script verlassen, wenn kein Durchfluss
 if ($Durchfluss == 0) {
 
 SetValueFloat(33361, 0);
 Return;
 }

 $Vorlauf = GetValueFloat(20059 /*[Hardware IPS\JKM-868 (ThermoJET)\VL Fubo + Boilerladung]*/);
 $Ruecklauf = GetValueFloat(59719 /*[Hardware IPS\JKM-868 (ThermoJET)\RL Fussbodenheizung]*/);

 $Durchfluss = GetValueFloat(17461 /*[Hardware IPS\EKM-868 Volumenstrom Heizung\Durchfluss]*/); //Durchfluss grösser als 1
 $c = 4182; // Wasser

 if ($Durchfluss > 1)
{
   $Menge = $Durchfluss;
       // Berechnung der Wärmeleistung
   $delta_T = $Vorlauf - $Ruecklauf;                
   $waerme = ($c * $Menge * $delta_T) / 3600; // Wh
   

}  


if ($waerme <0) { 
        SetValueFloat(21250 /*[Wärme - Kälteenergie Verbrauch Akuell\Kälteenergie]*/, ($waerme/1000)); 
		SetValueFloat(41091 /*[Wärme - Kälteenergie Verbrauch Akuell\Wärmeenergie]*/,0);
		
		$Kühlenergie = ($Kühlenergie + ($waerme / 60)); //Wh
        SetValueFloat (56052 /*[Wärme - Kälteenergie Verbrauch Akuell\Wärme/Kälte Test\Kälte\Kühlenergie]*/, ($Kühlenergie/1000));
		
    } else { 
       SetValueFloat(41091 /*[Wärme - Kälteenergie Verbrauch Akuell\Wärmeenergie]*/, ($waerme/1000));
	   SetValueFloat(21250 /*[Wärme - Kälteenergie Verbrauch Akuell\Kälteenergie]*/,0);
	   
	       
       $Heizenergie = ($Heizenergie + ($waerme / 60)); //Wh
       SetValueFloat (41161 /*[Wärme - Kälteenergie Verbrauch Akuell\Wärme/Kälte Test\Wärme\Heizenergie]*/, ($Heizenergie/1000));
	   
	   
    } 



?>


$Heizenergie = ($Heizenergie + ($waerme / 60)); //Wh 
SetValueFloat (41161 /*[Wärme - Kälteenergie Verbrauch Akuell\Wärme/Kälte Test\Wärme\Heizenergie]*/, ($Heizenergie/1000)); //Kwh 

Schau dir das mal genauer an und überlege was er beim nächsten mal aufrufen ändert. :smiley:

besonders das hier:
($Heizenergie/1000)); //Kwh habe ich mal dahintergeschrieben :smiley:

Swen´

P.s. Kleiner Tipp

$Heizenergie = ($Heizenergie + ($waerme / 60 / 1000)); //Kwh 
SetValueFloat (41161 /*[Wärme - Kälteenergie Verbrauch Akuell\Wärme/Kälte Test\Wärme\Heizenergie]*/, $Heizenergie); 

Jetzt bin ich leider noch nicht der ganz große Programierer, aber einige Dinge fallen mir auf:

[ol]
[li]Du liest den Durchfluss zweimal ein. Dadurch wird er nicht genauer [$Durchfluss = GetValueFloat(17461)]
[/li]
[li]Du fragst ab, ob der Durchfluss genau gleich „0“ ist, wenn ja, wird die externe Variable 33361 auf „0“ gesetzt, diese Variable wird aber im Script nicht weiter erwähnt. Das Script wird verlassen. Spart natürlich Durchlaufzeit, wenn eh nix durchläuft…
[/li]
[li] Welche Einheit hat denn der Durchfluss „17461“? Liter/h?
[/li]
[li] Es fehlt für mich der Zeitbezug der Messung! Für welches Inkrement lag der Durchfluss auf dem Messwert „17461“? Wenn Du den Messwert alle 30 Sekunden einholst, dann gehst Du der Einfachheit halber davon aus, dass er in dieser Zeit auch kontinuierlich angelegen hat und nicht z.B. nach 15 Sekunden auf „0“ gegangen war. Kann man vielleicht so machen, der Fehler könnte sich in langen Zeitreihen ausgleichen. Alterativ könnte man auch ein Ereignis auf eine Änderung dieses Wertes legen und dann die Zeitspanne seit der letzten Änderung mitberechnen. Wenn Dein Inkrement aber beständig 30 Sekunden ist, dann müsstest Du es wie oben beschrieben ebenfalls in die Formel einbringen.
[/li]
[li] Dannvergleichst Du ob der Messwert „größer 1“ ist. Was ist denn, wenn er ungleich „0“ und kleiner als „1“ ist? Ich kenne natürlich Deinen Messwert-Range nicht, aber es ist eine Lücke.
[/li]
[li] Warum bringst Du die Variable $Menge ein, die denselben Wert bekommt, wie $Durchfluss?
[/li]
[li] Da Du bei der „Wärmeberechnung“ keinen Zeitbezug hast, berechnest Du eine Leistung. (Arbeit=Leistung*Zeit!)
[/li][/ol]

@ Tango:
@ Acer90 Danke für den Tipp :slight_smile:
Ich werde versuchen deine Punkte zu Beschreiben, was ich mir dabei gedacht habe :slight_smile:
Leider sind meine PHP Kenntnisse sehr schlecht was das schreiben eines Scriptes betrifft insbesondere dann noch mit
Mathematische Formel :slight_smile:

1.Du liest den Durchfluss zweimal ein. Dadurch wird er nicht genauer [$Durchfluss = GetValueFloat(17461)]

Also wenn kein Durchfluss vorhanden ist, dann soll eine „0“ in die Variable der Wärmeleistung eingetragen werden. Ist ein Durchfluss vorhanden, sprich gröseser als „1“ soll mit der Wärmeleistung ( Berechnung ) begonnen werden.

2.Du fragst ab, ob der Durchfluss genau gleich „0“ ist, wenn ja, wird die externe Variable 33361 auf „0“ gesetzt, diese Variable wird aber im Script nicht weiter erwähnt. Das Script wird verlassen. Spart natürlich Durchlaufzeit, wenn eh nix durchläuft…

Da weis ich jetzt nicht so genau wie du das meinst? Aber es ist so wenn kein Durchfluss vorhanden ist, eine „0“ setzen

  1. Welche Einheit hat denn der Durchfluss „17461“? Liter/h?

Der Durchfluss hat Liter / h

  1. Es fehlt für mich der Zeitbezug der Messung! Für welches Inkrement lag der Durchfluss auf dem Messwert „17461“? Wenn Du den Messwert alle 30 Sekunden einholst, dann gehst Du der Einfachheit halber davon aus, dass er in dieser Zeit auch kontinuierlich angelegen hat und nicht z.B. nach 15 Sekunden auf „0“ gegangen war. Kann man vielleicht so machen, der Fehler könnte sich in langen Zeitreihen ausgleichen. Alterativ könnte man auch ein Ereignis auf eine Änderung dieses Wertes legen und dann die Zeitspanne seit der letzten Änderung mitberechnen. Wenn Dein Inkrement aber beständig 30 Sekunden ist, dann müsstest Du es wie oben beschrieben ebenfalls in die Formel einbringen.

Ich starte die Messung alle 60 Sekunden ( Durchfluss und Script )

  1. Dannvergleichst Du ob der Messwert „größer 1“ ist. Was ist denn, wenn er ungleich „0“ und kleiner als „1“ ist? Ich kenne natürlich Deinen Messwert-Range nicht, aber es ist eine Lücke.

Wenn bei der Wärmeleistung einen Negativen Wert errechnet ( Abtauung der Wärmepumpe, Kühlen im Sommer ) wird dieser Wert in eine Andere Variable gespeichert als wenn der Wert Positiv ist ( Heizen im Winter, Warmwasserbereitung)

  1. Warum bringst Du die Variable $Menge ein, die denselben Wert bekommt, wie $Durchfluss?

$Menge ist, soll die Wärmeleistung sein, aber du hast recht das passt nicht wirklich :-/

  1. Da Du bei der „Wärmeberechnung“ keinen Zeitbezug hast, berechnest Du eine Leistung. (Arbeit=Leistung*Zeit!)
    Soll das bedeuten das, der errechnete Wert nicht kWh ist? Sondern Watt?