Berechnung in SVG plot

Begonnen von mrhaefele@gmx.de, 13 April 2015, 00:14:29

Vorheriges Thema - Nächstes Thema

mrhaefele@gmx.de

Hallo,

ich messe die Energie meiner Verbraucher mit einer Homematic Steckdose HM-ES-PMSw1-Pl. Ich habe einen SVG Plot, der die verbrauchte Energie in KWh akkumuliert anzeigt. Zusätzlich zeigt der Plot die Energie mit der Funktion delta-h und delta-d an. Also 3 Kurven in einem Plot. Solange die akkumulierte Energie bei (nahe) Null los läuft, sieht alles soweit gut aus. Mittlerweile ist die Energie bei >100KWh angekommen wodurch die delta-h und delta-d (~2kWh) Werte nicht mehr im Plot erkennbar sind

Ich möchte nun nicht die aktuelle akkumulierte Energie plotten, sondern möchte vom aktuellen Wert den Minimalwert abziehen (bezogen auf den im Plot angezeigten Ausschnitt).Also, die Kurve soll bei Null anfangen durch Subtraktion des Minimalwertes des aktuell angezeigten Zeitraumes.

Mein Logfile sieht so aus:
##2015-03-25_22:01:21 og.az.steckdose1_Pwr all: E: 11.78 P: 300.64


Naiv habe ich folgendes versucht:

#FileLog 5:.*all\x3a::$fld[4]=$fld[4]-$data{min1}


Funktioniert leider nicht. Gibt es eine Möglichkeit, dies hinzubekommen? Wie kann ich den Minimalwert abziehen?

Gruß Udo

rudolfkoenig

- $data{min1} wird erst zum Schluss zugewiesen, intern laeuft es unter $min[0]. Sie ist bei der ersten Spalte 999999.
- die Index-Nummer beziehen sich waehrend der Berechnung auf die Linien im aktuellen FileLog, $data{X} wird umsortiert fuer das Plot, wenn man mehrere FileLogs verwendet.
- evtl. kann man sowas in logProxy besser, oder man lagert es in eine eigene Funktion aus.
- ich wuerde die beiden Linien unterschiedlichen Achsen (links/rechts) zuordnen.

mrhaefele@gmx.de

Hallo,
Die Energie ist die erste Linie im dargestellten Graphen. Ich hab es somit versucht mit $fld[4]=fld[4]-$min[0]
Leider ohne Erfolg
Ich muss gestehen, dass ich nicht verstanden habe, was Du gemeint hast mit "Sie ist bei der ersten Spalte 999999".

Mich würde auch interessieren, wie ich die Berechnung in eine eigene Funktion auslagern kann. Kannst Du mir hier ein anschauliches Beispiel zeigen. Habe im Forum nichts in diese Richtung gefunden.

Vielen Dank aber schon mal vorab für deine Hilfe.

Gruß Udo




Gesendet von iPhone mit Tapatalk

rudolfkoenig

ZitatMich würde auch interessieren, wie ich die Berechnung in eine eigene Funktion auslagern kann.
Z.Bsp. indem man MyFunc in 99_myUtils.pm definiert, und in der "Function" Spalte des PlotEditors MyFunc(@fld) oder MyFunc($fld[4]) reinschreibt.

mrhaefele@gmx.de

Entschuldige bitte. Ich bekomme es nicht hin. Mein perl reicht nicht aus (bzw es ist zu lange her, dass ich programmiert habe...). Ich hab 2 Stunden rumprobiert ...

Ich würde gerne aus anderen Beispielen lernen, aber es scheint mir, dass bisher noch niemand mit min oder max-Werten "rumgerechnet" hat, bei dem ich abkucken kann.

Einen konstanten Wert abziehen bekomme ich hin - kein Problem. Aber wie kann ich das Filelog quasi "pre-prozessieren", um den min Wert überhaupt zu wissen und erst im nächsten Durchgang diesen ermittelten Minwert abziehen. Geht das überhaupt??
Wenn ich es richtig verstanden habe, kenne ich zu diesem Zeitpunkt den min-Wert noch gar nicht, wenn ich die MyFunc aufrufe. Wie kriege ich es denn dann hin....

mrhaefele@gmx.de

Wer lesen kann ist klar im Vorteil. Du hast mir die Lösung ja im ersten Artikel geschrieben. Sorry für meine lange Leitung. So funktioniert es:

Erst Mal ein logProxy device definieren
define lp logProxy

Dann das gplot file editieren gemäß logProxy Wiki:
#logProxy FileLog:FileLog_og.az.steckdose1_Pwr,postFn='myPostFn':5:.*all\x3a::

Dann schliesslich noch die Funktion definieren, die das Post-Processing macht (in 99_myUtils.pm)
sub   
myPostFn($$)
{     
  my($devspec,$array) = @_;
     
  foreach my $point ( @{$array} ) {
    $point->[1] -= $data{min1};
  }   

  return $array;
}