SVG: Darstellung gruppierter Balken

Begonnen von Hadl, 09 November 2024, 13:48:54

Vorheriges Thema - Nächstes Thema

Hadl

Hallo zusammen,
ich wollte eine schöne Darstellung der Statistikdaten (Stunden, Tage, Monate) meiner PV Anlage haben.
Die Daten werden vom Statistikmodul geschrieben und werden somit immer zum Stundenwechsel, Tageswechsel usw. geschrieben.

Mit den vorhandenen Möglichkeiten als "Bars" waren die Balken immer so breit wie eine Stunde/Tag, aber alle gleichzeitig angezeigten Werte haben sich überlagert. Das war schnell unübersichtlich.

Dieser Vorschlag mit den "Needles" und die Art und Weiße wie es mein PV Hersteller darstellt hat mich dann auf die Idee gebracht, dies als Gruppierte Balken darstellen zu wollen.
https://forum.fhem.de/index.php?topic=137386.0

Das ganze sollte ohne den komplexen Umweg über LogProxy möglich sein.

Also hab ich mich dran gemacht und im SVG Modul den Typ "gbars" für grouped bars implementiert.
Zusätzlich hab ich noch als Unterschied zu den Bars, diese immer bei 0 anfangen lassen, so das ich auch negative Werte mit negativen Bars darstellen kann.

gplot:
#logdb Fronius_Symo1:statEnergy_PVDayLast:::
#logdb Fronius_Symo1:statEnergy_LoadDayLast:::
#logdb Fronius_Symo1:statMeter_0_EnergyReal_WAC_Sum_ProducedDayLast:::$val=$val/1000
#logdb Fronius_Symo1:statMeter_0_EnergyReal_WAC_Sum_ConsumedDayLast:::$val=$val/1000
#logdb Fronius_Symo1:statEnergy_AkkuDayLast:::

plot "<IN>" using 1:2 axes x1y1 title 'PV Tag' ls l0 lw 1 with gbars,\
     "<IN>" using 1:2 axes x1y1 title 'Verbrauch Tag' ls l1 lw 1 with gbars,\
     "<IN>" using 1:2 axes x1y1 title 'Eingespeist Tag' ls l3 lw 1 with gbars,\
     "<IN>" using 1:2 axes x1y1 title 'Bezug Tag' ls l4 lw 1 with gbars,\
     "<IN>" using 1:2 axes x1y1 title 'Akku Tag' ls l5 lw 1 with gbars

$o .= SVG_sel("type_${idx}",
                "lines,points,steps,fsteps,histeps,bars,ibars,needles,gbars,".
...
  my $barGroup=0;
...
    } elsif( $lType eq "gbars" ) {
      my $bw = 1;
      my $xOffsetGroup = $barGroup;
      $barGroup+=3;
      foreach my $i (0..int(@{$dxp})-1) {
        if ($dyp->[$i] > 0) {
          my ($x1, $y1) = ( $x + $dxp->[$i] - $bw - $xOffsetGroup,
                             $y +$h-($dyp->[$i]-$min)*$hmul);
          my $curBw = $bw;
          if($x1 < $x) {
              $curBw -= $x - $x1;
              $x1 = $x;
          }
          my ($x2, $y2) = ($curBw, ($dyp->[$i])*$hmul);   
          SVG_pO "<rect $attributes $lStyle x=\"$x1\" y=\"$y1\" ".
                      "width=\"$x2\" height=\"$y2\"/>";
        } else {
          my ($x1, $y1) = ( $x + $dxp->[$i] - $bw - $xOffsetGroup,
                             $y +$h + $min*$hmul );
          my $curBw = $bw;
          if($x1 < $x) {
              $curBw -= $x - $x1;
              $x1 = $x;
          }
          my ($x2, $y2) = ($curBw, -($dyp->[$i])*$hmul);   
          SVG_pO "<rect $attributes $lStyle x=\"$x1\" y=\"$y1\" ".
                      "width=\"$x2\" height=\"$y2\"/>";
        }
      }

Kommentare und Vorschläge sind herzlich willkommen

Ich hoffe das hilft jemanden von euch weiter.

Hadl
Du darfst diesen Dateianhang nicht ansehen.
Du darfst diesen Dateianhang nicht ansehen. 


Hadl

Hallo Rudolf,
ja richtig das ist der Thread mit den "needles" der mich auf die Idee gebracht hat, jedoch mit Statistikdaten die immer zur gleichen Zeit erstellt werden.
Das ganze sollte jedoch ohne den Logproxy funktionieren, da das zu komplex in der Konfiguration ist.

Bison

Hallo Hadl,

ich habe mir deine SVG installiert und es macht einen ganz guten Eindruck für mich. Gerade für die einfache Darstellung für Daten aus dem Statistik Modul optimal. Ist die Anzahl begrenzt? Das Modul LogProxy bietet in der  Function Zeile mehr Möglichkeiten, ist aber eindeutig komplexer. Vielleicht kann man GBars ja in die SVG einpflegen (ich hätte nichts dagegen).

Gruß

Bison
Raspberry, Homematic, CUL, 50 Device, 260 Entities

Hadl

Hallo Bison,
vielen Dank. Ja mit LogProxy hatte ich auch angefangen, aber mit mehreren Daten wurde es dann schnell nichtmehr handhabbar.
Die Anzahl ist theoretisch nicht begrenzt, jedoch reicht irgendwann der Platz zwischen den Messpunkten nichtmehr um alle darzustellen und es kommt zu Überlagerungen.
Das kommt dann aber drauf an wieweit die Statistik/Mess-Werte auseinanderliegen und wie die Skalierung der Zeitachse ist.

Hadl