SVG und Beispiel von neuen Plot Typen

Begonnen von roli, 25 Dezember 2025, 12:55:20

Vorheriges Thema - Nächstes Thema

roli

Hallo,
 ich versuche mich seit einiger Zeit mit Balkendiagrammen herumzuschlagen, finde dazu aber leider nur wenig Information im der FHEM commandref, Wiki  oder Forum.
Ich hätte gerne ein Balkendiagram, mit Balken für eine Zeiteinheit nebeneinander.
Also ich habe einen Filelog Eintrag  mit 3 Werten und möchte diese nebeneinander Plazieren.
Nun findet man offiziell  "bars".  Dies soll so was wie gnuplot "boxes" sein. 
Aber so wie es aussieht kann man dies NUR :  mit  "set style fill solid .. " weiter setzten,
"set boxwidth ..." zeigt bei mir keine Wirkung und in SVG kann man auch nichts setzten.
Also  mehrere bars , wohl  nur als überlagerte Darstellung.

Nun habe ich im SVG Module weitere Tyopen gefunden :  ibars, gbars, needles
Leider keine Beispiele und Docu was diese genau machen und wie ich sie beeinflussen kann !

SUPER. Es gibt CHATGPT !  Dies liefert mehr als das Forum usw  und sagt  :
  gbars -- gruppierte Balken ( Mehrere Balken nebeneinander ) 

Das wäres wohl.  Aber das wars auch schon.

Meine Tests zeigen: 

    bars, ibars, gbars    --  Immer Breite wie Zeiteinheit (grid)  und   boxwidth wird ignoriert!
    needles               --  1/5 ? Breite der Zeiteinheit   - auch fix
   

Da ich bei den bars die Breite nicht verändern kann, eignet sich nur "needles" im Zusammenhang
mit Logproxy offset, mehrere Einheiten nebeneinander darzustellen.

ANbei meine Beispiele - vielleicht hilft es jemand :  Du darfst diesen Dateianhang nicht ansehen.


                         


FHEM auf Debian (RASPI), 2 * CUL868/433 *  FS20 STR, 2 * HMS100 T, 2 * , 1* FS20 SU, 2 *  FS20 SM8, 2 ; 1-wire Temp,i2c Bus; ESP32 WROOM; ESP8266; Arduino
Sonnenbatterie Eco8;Elektro  Nachspeicher-Ofen Ladesteuerung,
Haus Lüftung,
Integration von HardwareAlarmanlag

betateilchen

Zitat von: roli am 25 Dezember 2025, 12:55:20Es gibt CHATGPT !  Dies liefert mehr als das Forum usw  und sagt 

Dann frag doch ChatGPT mal, in welchem Unterforum Dein Thread richtig aufgehoben wäre.
In "Forum Software" jedenfalls nicht.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

roli

Zitat von: betateilchen am 25 Dezember 2025, 13:16:57
Zitat von: roli am 25 Dezember 2025, 12:55:20Es gibt CHATGPT !  Dies liefert mehr als das Forum usw  und sagt 

Dann frag doch ChatGPT mal, in welchem Unterforum Dein Thread richtig aufgehoben wäre.
In "Forum Software" jedenfalls nicht.

 Da hast du absolut recht. Sorry - Habs geändert. 
JA aber man muss halt alles nutzen und dann abschätzen was stimmt und was nicht. Meine Erfahrung ist, dass Chatgpt mehr Ansatzpunkte für Lösungen liefert als wenn ich den ganzen Tag selbst in Google oder Forum suche,. Ist doch gut oder sehe ich dies falsch. HAt anscheinend mehr Quellen und kann diese effizienter durchsuchen als ich selbst.
FHEM auf Debian (RASPI), 2 * CUL868/433 *  FS20 STR, 2 * HMS100 T, 2 * , 1* FS20 SU, 2 *  FS20 SM8, 2 ; 1-wire Temp,i2c Bus; ESP32 WROOM; ESP8266; Arduino
Sonnenbatterie Eco8;Elektro  Nachspeicher-Ofen Ladesteuerung,
Haus Lüftung,
Integration von HardwareAlarmanlag

rudolfkoenig

Zitatich versuche mich seit einiger Zeit mit Balkendiagrammen herumzuschlagen, finde dazu aber leider nur wenig Information im der FHEM commandref, Wiki  oder Forum.
Die moeglichen Werte sieht man im Plot Editor, Auswahlmenue in der Spalte Plot-Type.

Es gibt Folgende:
  • lines: Die Werte werden mit gerade Linien verbunden
  • points: Punkte (eigentlich auf die Ecke gestellte kleine Rechtecke)
  • steps: Stufen. Der Wert gilt ab dem gemeldeten Zeitpunkt, so lange, bis ein neuer Wert gemeldet wird. Nach dem letzten gemeldeten Wert gilt dieser weiterhin.
  • fsteps: Stufen. Der Wert gilt bis zum gemeldeten Zeitpunkt. Nach dem letzten gemeldeten Wert sind keine aktuellen Daten vorhanden.
  • histeps: Stufen. Der Wert gilt für ein bestimmtes Zeitintervall, das sich um den Meldezeitpunkt erstreckt.
  • bars: Balken, von unten bis zum Wert. Die Balkenbreite entspicht der gezeichneten Zeiteinheit, und wird um den Zeitpunkt herum gemalt.
  • ibars: Balken, von unten bis zum Wert. Der Balken startet beim aktuellen Zeitpunkt, und erstreckt sich bis zum Naechsten  (interconnected bars).
  • needles: Wie bars, die Breite ist aber ein Pixel
  • horizontalLineFrom: Linie vom aktuellen bis zum naechsten Zeitpunkt (wie fsteps, aber ohne die waagerechte Verbindung).
  • horizontalLineTo: Linie vom vorherigen zum aktuellen Zeitpunkt (aehnlich steps)
  • cubic: die Werte bilden die Stuetzpunkte einer Bézier Kurve, SVG: C Tag
  • quadratic: die Werte bilden die Stuetzpunkte einer Bézier Kurve, SVG: Q Tag
  • quadraticSmooth: die Werte bilden die Stuetzpunkte einer Bézier Kurve, SVG: T Tag

roli

Herr König,
 erst mal vielen Dank für Ihre hervorragende Arbeit an den Modulen. Dies ist einfach super. Dinge sind sehr komplex und es kommen immer neue Wünsche, da ist es mit Doku die dann gleich für jeden verstanden wird schwierig. Aber man kann ja auch etwas testen, was ich gemacht habe.

Ich sammle bei mir die Daten des Stromzählers ( Tag,Nacht Strom und Einspeisung )  in 2 unterschiedlichen
Logfiles.  ! Logfile sammelt den aktuellen Stand alle 15 Minuten. Damit sehe ich einen guten Tagesverlauf.  Dann sammle ich am Ende jeden Tages noch die Tagesstatistik Werte  in einem Jahres Logfile.

Ich möchte hiermit sehen wie sich mein Tag/Nachtstrom verhält und dies auch im vergleich mit Vorjahren.
Weshalb ?  Ich habe Nachtspeicheröfen für die Heizung welche Nachtstrom verwenden.

Mit "Needles" habe ich es jetzt geschafft die Darstellung zu realisieren - und zwar mit logproxy und
offset. Osset wird benötigt, damit die Balken nebeneinander erscheinen. Und dies ging bei mir nur
mit needles.
Beispiel habe ich angehängt.
Ein Problem hatte ich jetzt noch mit "offset", da ich durchaus gerne 2 Vorhergehende Jahre anzeigen möchte.  Also offset='12m'   und offset='24m'.  Leider konnte ich nicht herausfinden, wie ich
offset so angeben könnte, dass er statt 12m  auch noch die Verschiebung  um z.b:  -3600*14  macht ?
Momentan verschiebe ich halt das aktuelle Jahr -- aber bei 3 Balken brauche ich halt mehr als nur die
Monatesangabe. Geht eventuell irgendwie - falls ja kannst du dies sicher sagen.

Meine Definitionen:

 setdefaultattr group     5 - Logdateien  Stromverbrauch

# braucht man um Graphen mehr flexibel zu gestalten 
define myProxy logProxy


# Verwende Kurzen devicenamen, da in Logfile geschreiben
define St_d   dummy
  attr St_d   room  hidden

# Tages daten, alle 15 Minuten   
define FLog_Strom_day FileLog /var/log/fhem/Strom/Stromz_day-%Y_%m.log   St_d
  attr FLog_Strom_day logtype text
 
# Pro Tag die Daten 
# Format der Daten in Filelog    YY-MM-DD    HT-Verbrauch  NT-Verbrauch   Einspeisung
define St  dummy
  attr St  room  hidden
 
define FLog_Strom FileLog /var/log/fhem/Strom/Stromz_sum-%Y.log    St
  attr FLog_Strom logtype text
 
# Plot Definitionen  -- verweis auf entsprechendes Gplot   rw_power bzw  rw_power_day
setdefaultattr group         4 - Stromverbrauch Diagram

define Diag_Strom_day   SVG   FLog_Strom_day:rw_power_day:CURRENT
 attr  Diag_Strom_day   label "Stromverbrauch je 15min" 
 #attr  Diag_Strom_day   fixedrange 2days
 
 
# alternativ mit LogProxy 
define Diag_HT   SVG    myProxy:rw_power_HT:CURRENT
 attr  Diag_HT   label "HT Monatsvergleich" 
 attr  Diag_HT   fixedrange month
 
define Diag_NT   SVG    myProxy:rw_power_NT:CURRENT
 attr  Diag_NT   label "NT Monatvergleich" 
 attr  Diag_NT   fixedrange month
 
 
 
setdefaultattr room hidden

# Log alle 15 min die akt Werte und am Ende des Tages  jeden Tag  den Wert
define    n_Strom_Line_d      at  +*00:15:00         { rw_writeStromDayLog() }
  attr    n_Strom_Line_d      alignTime 00:00:00
 
define    n_Strom_Line        at  *23:59:00          { rw_writeStromLog() }   
  attr    n_Strom_Line        alignTime 00:00:00     

setdefaultattr 


Gplot  für Monatsübersicht -Jahresvergleich :
############################
# Display the power reported by the Stromzähler   -- Monatsplot
# FileLog Inhalt :
#   define FileLog_Strom FileLog /var/log/fhem/Strom/Stromz_sum-%Y_%m.log  HT-Verbrauch  NT-Verbrauch   Einspeisung ..Zählerst..
#
#       2025-12-22_23:59:00 Strom_Line 1 27 0 5148 54434 43036   

set terminal png transparent size <SIZE> crop
set output '<OUT>.png'

set title '<L1>'
set timefmt "%Y-%m-%d_%H:%M:%S"

set xdata   time
set ylabel  "kWh"

set yrange  [0:60]
set y2range [0:60]
set grid    ytics 

#logProxy FileLog:FLog_Strom,offset=-3600*7:4:::
#logProxy FileLog:FLog_Strom,offset='12m':4:::
 

plot "<IN>" using 1:2  axes x1y1  title 'NT'                ls l2  lw 5  with needles ,\
     "<IN>" using 1:2  axes x1y1  title 'NT Vorjahr'        ls l3  lw 5  with needles 


So sieht dann aus:
Du darfst diesen Dateianhang nicht ansehen.


FHEM auf Debian (RASPI), 2 * CUL868/433 *&nbsp; FS20 STR, 2 * HMS100 T, 2 *&nbsp;, 1* FS20 SU, 2 *&nbsp; FS20 SM8, 2 ; 1-wire Temp,i2c Bus; ESP32 WROOM; ESP8266; Arduino
Sonnenbatterie Eco8;Elektro&nbsp; Nachspeicher-Ofen Ladesteuerung,
Haus Lüftung,
Integration von HardwareAlarmanlag

rudolfkoenig

ZitatMomentan verschiebe ich halt das aktuelle Jahr -- aber bei 3 Balken brauche ich halt mehr als nur die
Monatesangabe. Geht eventuell irgendwie - falls ja kannst du dies sicher sagen.

logProxy ist nicht meine Baustelle, und ich verwende es auch nicht.
Soweit ich die Quelle verstehe, akzeptiert offset entweder Sekunden oder Monate.
Der Text nach offset= wird mit (-?\d*)(m?) ausgewertet.
Damit werden die Hochkommas verworfen (und sind damit ueberfluessig), und aus -3600*7 bleibt auch nur -3600 uebrig.

Zum Vergleich von Jahreswerten verwende ich das Copy/Paste Feature im Label-Menue der SVG.
Es ist mir aber bewusst, dass es keinen vollwertigen Ersatz bei dieser Aufgabe bietet :)