SVG - min | max .. der Funktionen global verfügbar, from | to des Plots nicht?

Begonnen von SirAuron, 10 Februar 2016, 14:01:55

Vorheriges Thema - Nächstes Thema

SirAuron

Hallo,

ich habe mich gewundert warum die from | to Werte in SVG Plots nicht wie die min | max | ... der Funktionen verfügbar sind. Die from | to Werte können so nur im direkten Aufruf z.B. in der .gplot Datei genutzt werden, so wie in der logProxy current2Plot Beispielfunktion.


set title '<TL>'
...
#logProxy Func:current2Plot($from,$to,"VR.PC","totalEnergyDay",1)


Das heißt ich kann somit den aktuellen Wert von einem Reading eines Devices in das Plot einblenden, wobei from | to nur zur Validierung genutzt wird, ob der Zeitstempel des Readings auch im dargestellten Interval des Plots liegt. Was nun aber wenn ich den aktuellen Wert auch im Titel des Plots haben möchte. Ich könnte mir ja eine Funktion schreiben die analog current2Plot eine Titlezeile mit dem Current Wert vom Reading eines Devices zurück gibt, d.h. wenn er im dargestellten Interval des Plots liegt. Das geht aber nicht, da $from $to in diesem Kontext nicht verfübar sind!


attr SVG_FileLog_VerbrauchTag_PC title getTitleCurrent($from,$to,"Device","Reading")


Das geht noch weiter wenn ich die avg | max Werte so erweitern möchte, dass ich den aktuellen Wert vom Reading eines Devices mit einberechnen möchte, um diesen dann im Title an zu zeigen.

Gibt es dafür eine Lösung?

Grüße, Torsten

frank

vielleicht habe ich nicht alles richtig verstanden, aber aktuelle werte "blende" ich zb mit $data{currval1} ein, für kurve1.

attr SVG_FileLog_Technik_IO_1 label "load: min [$data{min1}] - avg [$data{avg1}] - max [$data{max1}] - last [$data{currval1}] ----- [".localtime()."]"


entsprechende zeitpunkte zb mit $data{mindate1}, $data{maxdate1}, $data{currdate1}.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

SirAuron

ich glaube die Bezeichnung aktueller Wert war etwas unglücklich gewählt. Es geht nicht um den aktuellen Wert eines Plots / einer Funktion, sondern um den noch nicht geplotteten "aktuellen" Wert den man vom Reading eines Devices bezieht. Zum Beispiel plotte ich die derzeitigen Verbräuche pro Tag und füge den Verbrauch des aktuellen (noch nicht im Log eingetragenen Tagesverbrauchs) vom Reading des Devices selbst ein. Und genau diesen Wert möchte ich auch im Titel ausgeben, wobei der Knackpunkt die Überprüfung des Zeitintervalls ist. Dafür habe ich mir eine Funktion im 99_myUtils.pm Modul hinterlegt, die genau das tun soll:


# Erstellt eine Titelzeile für den Verbrauch des PC.
# From, To, Device,Reading für den aktuellen Wert
sub
createTitleVerbrauchPC($$$$)
{
  my($from,$to,$device,$reading) = @_;

  my $ret = "";
  my $max = $data{max1};
  my $sum = $data{sum1};
  my $cnt = $data{cnt1};

  my $rt = ReadingsTimestamp( $device, $reading, undef );
  if ( $rt ) {
    my $sec = time_str2num($rt);
    my $fromsec = SVG_time_to_sec($from);
    my $tosec   = SVG_time_to_sec($to);
    if ( $sec >= $fromsec && $sec <= $tosec ) {
      # If the reading has a timestamp and the timestamp is inside the time interval
      my $val = ReadingsVal($device,$reading,undef);
      if($val > $max) {
        $max = $val;
      }
      $sum += $val;
      $cnt += 1;
    }
  }
 
  my $avg = $sum/$cnt;
   
  $ret .= sprintf("Avg: %.3fkWh Max: %.2fkWh Sum: %.2fkWh (%.2fEur)",
                  $avg, $max, $sum, $sum*0.2485 );
  return $ret;
}


Nur leider kann ich die Werte für from und to nicht übergeben, da diese nicht global verfübar sind. So zumindest meine Vermutung.

frank

ok, langsam wird es klarer.  :)

dein vorläufiger tageswert soll nur in die berechnung eingehen, wenn die plotansicht auch den heutigen tag beinhaltet. ansonnsten aus den gespeicherten logdaten.
wenn ich das richtig sehe, benötigst du $from/$to nur indirekt, um zu erkennen, dass der heutige tag in der plotansicht enthalten ist. wenn du also current2Plot bereits benutzt, müsstest du doch mit currdate<x> oder currval<x> für diese kurve ermitteln können, ob der aktuelle tag im plot enthalten ist. wenn diese werte kein undef liefern, sollte der aktuelle tag zu sehen sein. ich hoffe jetzt hast du mich verstanden.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

SirAuron

ich glaube ich habe dich verstanden und das wäre eine ziemlich clevere Idee. Sollte der Test in current2Plot fehl schlagen, so würde currdate oder currval für diesen plot ein undef liefern.

Für meine  .gplot


#logProxy FileLog:FileLog_VerbrauchTag_PC:4:totalEnergyDayLast:0:
#logProxy ConstX:TimeNow(),0,1
#logProxy ConstY:$data{avg1}
#logProxy Func:current2Plot($from,$to,"VR.PC","totalEnergyDay",1)

plot "<IN>" using 1:2 axes x1y1 title 'verbrauch' ls l0fill lw 0.5 with bars
plot "<IN>" using 1:2 axes x1y1 notitle ls l5 lw 1 with steps
plot "<IN>" using 1:2 axes x1y1 title 'avg' ls l3 lw 0.5 with lines
plot "<IN>" using 1:2 axes x1y1 title 'aktuell' ls l1fill lw 0.5 with bars


müsste doch dann $data{currval4} den aktuellen Wert (sprich den Wert aus dem Reading) enthalten oder undef wenn der Test in current2Plot fehlgeschlagen ist, ist das richtig?
Ich habe das mal getestet indem ich $data{currval4} in den Titel schreibe, leider bekomme ich hier 0 zurück. Möglicherweise stehe ich gerade auf dem Schlauch.

SirAuron

mit folgender Funktion


sub
testDate()
{
  my $ret = "Undef";
  if(defined $data{currdate4}) {
    $ret = $data{currdate4};
  }
  return $ret;
}


bekomme ich immer Undef zurück.

frank

Zitatmüsste doch dann $data{currval4} den aktuellen Wert (sprich den Wert aus dem Reading) enthalten oder undef wenn der Test in current2Plot fehlgeschlagen ist, ist das richtig?
genau das würde ich erwarten. habe ich bei einem fensterkontakt getestet, war allerdings kein logproxy und linientyp steps.
vielleicht kommt die 0, weil du bars hast? oder logproxy? vielleicht tuts auch ein vergleich auf 0?

im svg editor unter show preprocessed sieht man immer schön welche werte zu jeder kurve geplottet werden.

getestet habe ich folgendes im attr title:
"min: ".(($data{min1} eq "undef")?12:$data{min1})." date: ".$data{currdate1}
ich hatte auch versucht auf "defined" zu testen, was nicht geklappt hat.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

SirAuron

unter show preprocessed wird nix für die Func angezeigt:


2016-02-06_23:59:55 0.37
2016-02-07_23:59:55 0.81
2016-02-08_23:59:55 0.95
2016-02-09_23:59:55 0.29
#4:totalEnergyDayLast:0:
2016-02-10_19:15:49 0
2016-02-10_19:15:49 1
#ConstX:TimeNow(),0,1
2016-02-01_00:00:00 0.6
2016-03-01_00:00:01 0.6
#ConstY:$data{avg1}
2016-02-11_00:00:00 0.82
#plotCurrent: VR.PC:totalEnergyDay
#Func:current2Plot($from,$to,"VR.PC","totalEnergyDay",1)


angezeigt wird der Wert aber. Ich teste jetzt nochmal mit deinem Test im Title. Mal schauen was das ergibt.

SirAuron

habe das ganze mal mit:

"min: ".(($data{min4} eq "undef")?12:$data{min4})." date: ".$data{currdate4}

getestet, kein Unterschied, egal ob ich die Funktion current2Plot vorzeitig verlasse (sprich der Test ob der Timestamp im Interval liegt falsch zurück liefert) oder nicht, beides mal folgende Ausgabe im Title:

min: date:

Möglicherweise können die min | max | currdate ... nicht auf die logProxy::Func Plots angewendet werden? Das wäre sehr schade, fand die Idee wirklich großartig! Die andere Möglichkeit wäre aber immer noch das die from | to Werte genau wie die min | max | currdate Werte der Funktionen global verfügbar sind oder sehe ich das falsch? Was würde denn dagegen sprechen?

Grüße, Torsten

frank

"min: ".(($data{min4} eq "")?12:$data{min4})." date: ".$data{currdate4}
probier mal mit leerem string.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

SirAuron

Hallo,

leider funktioniert das genau so wenig, ich bekomme einfach keine Werte für den 4ten Plot zurück, sprich für die logProxy:Func. Dann werde ich selbst im Source-Code schauen warum die from | to Werte des Plots nicht global verfügbar gemacht werden. Will mir nicht in den Kopf warum das so ist.

Grüße,

Torsten