FHEM - Entwicklung > Wunschliste

Integralfunktion bei UserReadings

(1/6) > >>

simonberry:
Hallo zusammen,

ich habe mich gestern länger mal mit den userReadings beschäftigt, und mir ist aufgefallen, dass es zwar die Differentalfunktion (Ableitung) gibt aber nicht die Umkehrfunktion dazu, also die Integralfunktion.
Anwendungsbeispiel Differentialfunktion:
* Aus einem Energiezähler (kWh) die aktuelle Leistung berechnen (kW)
Anwendungsbeispiel Integralfunktion:
* Aus einer aktuellen Leistung (kW) die Energie berechnen.  (kWh)

Meine Vorstellung der Funktion:
Es wird die Zeitdifferenz zwischen den beiden letzten Messungen multipliziert mit dem Mittelwert der letzen beiden Messsungen  und zum alten "Reading" addiert.
Reading = Reading + difftime * (oldvalue + value) / 2

Da ich so Neugierig bin habe ich mal in den Sourcen nach "differential" gegreped und bin in fhem.pl fündig geworden. (Oh Gott das Herzstück  :o)
Mit den bereits vorhandenen Berechnungsmethoden war es mir ein leichtes mein Vorhaben umzusetzen.  ;)

Ich habe das mal bei mir mit ein paar Handgriffen in der fhem.pl eingebaut und es funktioniert ganz prima:  :D
in der Funktion CommandAttr hinter "differential" "integral" eingetragen

--- Code: ---        if(grep { /$modifier/ } qw(none difference differential integral offset monotonic)) {

--- Ende Code ---
in der Funktion readingsEndUpdate
einen weiteren elsif für integral ergänzt

--- Code: ---      } elsif($modifier eq "differential") {
        my $deltav= $value - $oldvalue if(defined($oldvalue));
        my $deltat= $hash->{".updateTime"} - $oldt if(defined($oldt));
        if(defined($deltav) && defined($deltat) && ($deltat>= 1.0)) {
          $result= $deltav/$deltat;
        }
      } elsif($modifier eq "integral") {
        if (defined($oldt) && defined($oldvalue))
        {
          my $deltat= $hash->{".updateTime"} - $oldt if(defined($oldt));
          my $avgval= ($value + $oldvalue) / 2;
          $result = ReadingsVal($name,$userReading,$value);
          if($deltat>= 1.0) {
            $result+= $avgval*$deltat;
          }
        }

--- Ende Code ---

So und nun steht das bei mir in der fhem.pl und beim nächsten Update is es wieder weg.
Besteht Interesse das Aufzunehmen? Wie kann das geschehen.

Viele Grüße

Simonberry

rudolfkoenig:
Ich habe zwar nicht wirklich Interesse, aber ich wuerde es aufnehmen, falls ich auch noch Patches fuer commandref_frame.html und commandref_frame_DE.html bekomme.

Das naechste mal bitte nicht in der Wunschliste sondern nach Sonstiges schreiben (fhem.pl Aenderungen gehoeren dahin, siehe MAINTAINER.txt) , Wunschliste lese ich eigentlich aus Prinzip nicht :)

simonberry:
Hallo Rudolf,

Danke das Du es aufnimmst
Anbei die beiden patches, ich hoffe das passt so, aber es ist ja nicht viel.

Viele Dank und Grüße

Simonberry

micomat:
Hallo Simonberry,

das klingt sehr interessant. Koenntest Du Deine Umsetzung mal kurz fuer doofe erklaeren? =)

Gruesse,
Markus

simonberry:
Hallo Markus

Am Besten versuche ich es an meinem persönlichem Projekt (leider noch nicht ganz abgeschlossen) erkläre.

Ich will meinen Wärmeverbrauch der bezogenen Fernwärme loggen. In meiner Heizung ist zwar ein Wärmemengenzähler vom Energieversorger (Sharky 775 von Diehl) aber der ist verblomt und die Infrarotschnittstelle sendet nix... :'(

Mit Google und Wiki und Restwissen vom Studium habe ich herausgefunden:
Um die aktuelle Leistung der Fernwärmeübergabe zu berechnen benötigt man 3 Werte:

* Temperatur Vorlauf
* Temperatur Rücklauf
* Volumenfluss vom WasserDie Aktuelle Leistung berechnet sich nach folgender Formel:
P = VolumenFluss * Spezifische Wärmekapazität Wasser * (TempVorlauf - TempRücklauf)

Die Bezogene Wärmemenge (das was ich bezahlen muss) ist dann das Integral bzw die Fläche unter dem Graphen.
Angenommen die Leistung ist 1 Stunde konstant:
E = P * 1h
Ändert sich die Leistung ist es die Summe von mehreren kleinen Zeitintervallen * Leistung
E = P1 * t1 + P2 * t2 + P3 *t3
Genau dieses tut meine Erweiterung nun.


Mittels 2 Temperatursensoren messe ich Vor  und Rücklauf, den Volumenfluss kann ich bis jetzt leider nur Raten, weshalb ich noch nicht ganz glücklich bin.
Der Volumenfluss wird durch die Heizung durch ein Stellglied eingestellt (mein Ansatz hier was ab zugreifen). Mein Wärmezähler misst den und zeigt den auch an, weshalb ich jetzt immer mit 135 Liter/h rechne.
Da das Stellglied aber nicht immer offen ist, muss ich außerdem noch raten, wann es offen ist. Das ist offensichtlich dann der Fall, wenn der Vorlauf plötzlich heiß wird (von ca. 28° auf 55°). Momentan frage ich einfach ab ob die Vorlauftemperatur größer als 45 ° ist.

Per notify ausgelöst durch die Vorlauftemperatur berechne ich nun die Leistung und speichere sie als reading einem dummy. Der Dummy berechnet dann per "userReading integral "die Wärmemenge.

Hier mein Code aus der fhem.cfg

--- Code: ---define Fernwaerme dummy
attr Fernwaerme alias Fernwaerme
attr Fernwaerme icon sani_earth_source_heat_pump
attr Fernwaerme stateFormat {sprintf("%.1f kWh %.1f kW\n", ReadingsVal("Fernwaerme","Energie",0), ReadingsVal("Fernwaerme","Leistung",0));;}
attr Fernwaerme userReadings Energie integral {ReadingsVal("Fernwaerme","Leistung",0)/3600}
define notiVor notify Vorlauf {\
  fhem("setreading Fernwaerme Vorlauf ". $EVENT);;\
  fhem("setreading Fernwaerme Ruecklauf ". Value("Ruecklauf"));;\
  my $tempdiff = $EVENT - Value("Ruecklauf");;\
  if ($tempdiff < 0) \
  {\
    $tempdiff = 0;;\
  }\
  fhem("setreading Fernwaerme TempDiff ". $tempdiff);;\
  if ($EVENT > 45)\
  {\
    my $Leistung = 0.135 * 4.182 / 3.6 * $tempdiff;;\
    fhem("setreading Fernwaerme Leistung $Leistung");;\
  }\
  else\
  {\
    fhem("setreading Fernwaerme Leistung 0");;\
  }\
}
define FileLog_Fernwaerme FileLog log/Fernwaerme-%Y-%m.log Fernwaerme
define SVG_FileLog_Fernwaerme_1 SVG FileLog_Fernwaerme:SVG_FileLog_Fernwaerme_1:CURRENT

--- Ende Code ---

(http://M:\fernwaerme.png)



Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln