SVG plot with bars - Darstellungsprobleme bei einzelnen Werten

Begonnen von SirAuron, 07 Februar 2016, 20:51:58

Vorheriges Thema - Nächstes Thema

SirAuron

Hallo,

da ich neu hier bin und mich mit den Rubriken noch nicht so gut auskenne schreibe ich diese Frage erst einmal hier in den Anfängerfragen, ich hoffe das is ok so.

Ich habe mittels FHEM einen Fibaro Z-Wave WallPlug eingebunden und möchte mittels Statistics Modul die Verbräuche jedes Tages in ein Log schreiben und diese dann Plotten.
Das Logging funktioniert schon einmal, es wird genau ein Eintrag pro Tag eingetragen. Was mir noch Probleme bereitet ist das plotten der Einträge. Was ich möchte ist ein Plot für jeden Monat in dem genau ein Balken / pro Eintrag im Log, sprich für jeden Tag gezeichnet wird. An sich funktioniert das, nur werden die Balken nicht dargestellt (weil die Breite zu klein ist), wenn nur ein Wert im Log verfügbar ist, oder wenn ich versuche mittels logProxy den aktuellen / noch nicht geloggten Wert direkt vom Reading des Devices ein zu blenden.

Hier das Ergebnis mit dem aktuellen Plot (4ter plot Eintrag) als bars (der aktuelle Wert fehlt!):
(http://fs5.directupload.net/images/160207/f6by699e.jpg)

Hier das Ergebnis mit dem aktuellen Plot als points (zum Beweis das das Script und damit der Wert passt):
(http://fs5.directupload.net/images/160207/6yv8uzyy.jpg)

Der erste Eintrag im Log dient dazu den Balken quasi eine korrekte Breite zu geben, eben über die Zeitstempel der Einträge im Log. Entfernt man den ersten Eintrag so wird kein Balken dargestellt. Des Weiteren ist der letzte Plot mit dem Titel aktuell als points dargestellt, eben weil dieser Balken auch nicht dargestellt wird!

Wie schaffe ich es nun das ein Balken auch bei einem Eintrag im Log oder eben beim aktuellen Wert korrekt dargestellt wird. Meiner Meinung nach müsste es eine Funktionalität geben in der die "Breite" der Balken auf einen fixen Wert festgelegt werden kann. Aber diesen scheint es nicht zu geben. Ich habe diesbezüglich schon einige Einträge in diesem Forum durchforstet allerdings keine Lösung für dieses Problem gefunden. Ich hoffe nun das Ihr mir damit weiter helfen könnt.

Ab hier könnt ihr die FHEM Konfiguration / das .gplot File und das verwendete Log-File einsehen:

fheminfo

Fhem info:
  Release  : 5.7 FeatureLevel: 5.7
  OS       : linux
  Arch     : arm-linux-gnueabihf-thread-multi-64int
  Perl     : v5.14.2
  uniqueID : 65de3ba299099007e1071fb98f626019
  upTime   : 1 day, 09:23:00

Defined modules:
  FHEMWEB    : 3
  FileLog    : 4
  SVG        : 2
  ZWDongle   : 1
  ZWave      : 1
  at         : 1
  autocreate : 1
  dummy      : 2
  eventTypes : 1
  logProxy   : 1
  notify     : 3
  statistics : 1
  telnet     : 1

Transmitting this information during an update: no
You can change this via the global attribute sendStatistics


Hier die Konfiguration bezüglich des SVG devices:

define SVG_FileLog_VerbrauchTag_PC SVG lp:SVG_FileLog_VerbrauchTag_PC:CURRENT
attr SVG_FileLog_VerbrauchTag_PC fixedrange month
attr SVG_FileLog_VerbrauchTag_PC nrAxis 1,0
attr SVG_FileLog_VerbrauchTag_PC room Wohnzimmer
attr SVG_FileLog_VerbrauchTag_PC title "Verbrauch - Avg: $data{avg1}kWh Max: $data{max1}kWh Acc: $data{sum1}kWh"


Hier meine .plot Konfiguration:
# Created by FHEM/98_SVG.pm, 2016-02-07 15:33:10
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<TL>'
set ytics
set y2tics
set grid ytics
set ylabel "kWh"
set y2label ""
set yrange [0:1]

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

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 6 with points


Hier ein Eintrag aus dem Log-File:

2016-02-05_23:59:55 VR.PC totalEnergyDayLast: 0.0
2016-02-06_23:59:55 VR.PC totalEnergyDayLast: 0.37


Grüße, Torsten

Prof. Dr. Peter Henning

Das steht bei mir schon länger auf der Agenda, hat auch nichts mit den Plotfiles zu tun. Sondern ist eine Änderung im SVG-Modul.

Ich bin aber derzeit noch in der Endredaktion eines Buches, habe in dieser Woche noch einen EU-Antrag zu schreiben und zwei Klausuren zu korrigieren. Dann gerne.

LG

pah

SirAuron

#2
Kein Problem, es ist nicht dringend. Würde mich natürlich sehr über so ein "Feature" freuen.

Bis dahin habe ich mir mit folgender Änderung im Modul 98_SVG.pm beholfen:


    ...
    } elsif( $lType eq "bars" ) {
       if(@{$dxp} == 1) {
          # my $y1 = $y+$h-($dyp->[0]-$min)*$hmul;
          # $ret .=  sprintf(" %d,%d %d,%d %d,%d %d,%d",
          #      $x,$y+$h, $x,$y1, $x+$w,$y1, $x+$w,$y+$h);
          my $bw = $barwidth*$tmul;
          my ($x1, $y1) = ( $x + $dxp->[0] - $bw,
                            $y + $h-($dyp->[0]-$min)*$hmul);
          my $curBw = $bw;
          if($x1 < $x) {
              $curBw -= $x - $x1;
              $x1 = $x;
          }
          my ($x2, $y2) = ($curBw, ($dyp->[0]-$min)*$hmul);
          SVG_pO "<rect $attributes $lStyle x=\"$x1\" y=\"$y1\" ".
                      "width=\"$x2\" height=\"$y2\"/>";
        Log3 $name, 0, "barwidth with only 1 point: $barwidth";
       } else {
          my $bw = $barwidth*$tmul;
          # bars are all of equal width (see far above !),
          # position rounded to integer multiples of bar width

       ...


Die barwidth wird ja schon entsprechend des derzeitigen angezeigten Intervalls gesetzt (also ein Tag bei < 30.1 Tagen :-) ), nicht dynamisch errechnet, wie ich bisher dachte. Merkwürdig finde ich gerade noch das der Balken quasi links vom eigentlichen Zeitpunkt auf der x-Achse liegt und nicht mittig, wie ich annehmen würde.

Nun sieht es so aus (grüner Balken ist der aktuelle Wert, der nun richtig geplotted wird):

(http://fs5.directupload.net/images/160208/a5zz67zt.jpg)

Grüße,

Torsten