[gelöst] Balken-Diagramm bei fehlendem "Null"-Wert

Begonnen von Gisbert, 11 Februar 2026, 19:50:50

Vorheriges Thema - Nächstes Thema

Gisbert

Hallo,

ich hab ein Filelog, das bspw. folgende Einträge enthält:
2026-02-11_19:08:39 storedCam cam_path: HaustuerDaraus möchte ich eine Art Balkendiagramm machen, wenn die Kamera etwas auf den Speicher geschrieben hat.

Das SVG plot sieht derzeit so aus:
# Created by FHEM/98_SVG.pm, 2026-02-11 19:35:03
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 'Auslösung Kamera'
set ytics
set y2tics
set grid
set ylabel "a.u."
set y2label ""
set yrange [0:5]

#FileLog_Kamera 3:storedCam.cam_path\x3a::$fld[3]eq"Haustuer"?3:-0.1
#FileLog_Kamera 3:storedCam.cam_path\x3a::$fld[3]eq"Westseite"?2:-0.1
#FileLog_Kamera 3:storedCam.cam_path\x3a::$fld[3]eq"Ostseite"?1:-0.1

plot "<IN>" using 1:2 axes x1y1 title 'Haustür' ls l0fill lw 1 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Westseite' ls l1fill lw 1 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Ostseite' ls l2fill lw 1 with steps

Das funktioniert leider nur halb, da ich keine "Null"-Werte im Filelog hab - eben nur Werte, wenn eine der Kameras etwas auf den Speicher geschrieben hat. Ich hab mir meinen Kopf schon ein bisschen zerbrochen, zwischendurch bin ich eingenickt (Scherz beiseite) - aber ich hab noch keine gute Idee, wie ich es ohne großen Aufwand hinbekommen könnte. Mit viel Aufwand wird es irgendwie lösbar sein, aber da hab ich auch noch keine zündende Idee, die es sich lohnt auszuprobieren.

Ich hab schon daran gedacht, die log-Einträge so zu gestalten, so dass ich auch einen Null-Wert speichern könnte, so dass ich ein Balkendiagramm daraus basteln könnte:
2026-02-11_19:08:39 storedCam cam_path: Haustuer 1
Bevor ich aber in der Richtung weitermache, frage ich lieber, ob jemand schon eine Lösung oder Lösungsanstz hat.
Viele Grüße Gisbert
Proxmox | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome | Panasonic Heishamon

Prof. Dr. Peter Henning

Eine allgemeine Lösung lässt sich nicht finden, weil ja die Anfangswerte je nach Anwendungsfall ganz unterschiedlich sein können. In der Regel mache ich das so, dass am Anfang jeden Jahres und jeden Monats "von Hand" ein Nullzeile eingetragen wird, beispielsweise die ersten vier Zeilen hier:
Zitat2026-01-01_00:00:00 E1.consumption EOM_report: Em1 0 Ey1 0 Em1+2 0 Ey1+2 0
2026-01-01_00:00:00 E2.consumption EOM_report: Em2 0 Ey2 0 Em1+2 0 Ey1+2 0
2026-01-01_00:00:00 E1.production EOM_report: Em1 0 Ey1 0 Em1+2 0 Ey1+2 0
2026-01-01_00:00:00 E2.production EOM_report: Em2 0 Ey2 0 Em1+2 0 Ey1+2 0
2026-01-31_23:59:56 E1.consumption EOM_report: Em1 0.093 Ey1 0.093 Em1+2 631.409 Ey1+2 631.409
2026-01-31_23:59:56 E2.consumption EOM_report: Em2 631.317 Ey2 631.317 Em1+2 631.409 Ey1+2 631.409
2026-01-31_23:59:56 E1.production EOM_report: Em1 148.383 Ey1 148.383 Em1+2 149.490 Ey1+2 149.490
2026-01-31_23:59:56 E2.production EOM_report: Em2 1.106 Ey2 1.106 Em1+2 149.490 Ey1+2 149.490
Das geht deshalb relativ einfach zu machen, weil das hier jeweils userReadings sind, die mehrere Datenwerte in einer Zeile zusammenfassen und von einem Perl-Programm erzeugt werden.

LG

pah

Gisbert

#2
Hallo an alle Interessierten,

ich hab eine Lösung gefunden, die mich ein notify sowie einen Tag gekostet haben (Zeit hab ich gottseidank reichlich) - aber es wäre vermutlich auch einfacher gegangen.

SVG kennt den Plot-Type Needles - damit werden, was der Name impliziert, senkrechte Striche zum jeweiligen Timestamp gemacht, ohne dass zwischendurch Null-Werte vorhanden sein müssen.

Mit dem notify, was ich ohne Kenntnis der Möglichkeit beim Plot-Type definiert hab, habe ich aber insgesamt noch eine bessere Lösung gefunden, da ich z.B. ein Triggern für 15 Sekunden und somit mehrfache Logeinträge unterbinden kann, aber dennoch bei einer späteren Auslösung der gleichen Kamera wieder ein Event (mit demselben Inhalt) bekomme.

Viele Grüße Gisbert

Der Vollständigkeit halber hier die Definition des notify:
defmod storedCam_notify notify storedCam:lastEventFile.* {\
my $campath = (split /\//,ReadingsVal($NAME,'lastEventFile',''))[3];; \
my $campath0;; \
if ($campath eq "Camera_1") {$campath = "Haustuer";;} \
elsif ($campath eq "Camera_2") {$campath = "Ostseite";;} \
elsif ($campath eq "Camera_3") {$campath = "Westseite";;};; \
$campath0 = $campath." 0";; \
$campath = $campath." 1";; \
fhem "sleep 0.1;; \
setreading storedCam campath_log $campath;; \
setreading storedCam campath_log $campath0"}
attr storedCam_notify comment Da in einem notify setreading zwar ausgeführt wird, aber kein Event erzeugt und demnach auch nicht geloggt wird, \
ist der work-around mit sleep 0.1 notwendig. \
Quellen:\
Forumsbeitrag: https://forum.fhem.de/index.php?topic=118775.0\
sowie: https://fhem.de/commandref_DE.html#setreading
attr storedCam_notify disabledAfterTrigger 15
Proxmox | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome | Panasonic Heishamon

rudolfkoenig

Ich mache die Visualisierung der Bewegungsmelder mit points.

Dabei wird jedem Bewegungsmelder ein anderes Wert zugewiesen (die Zahl in die Funktionsspalte schreiben), und der Wertebereich fest vorgegeben, damit die automatische Skalierung ausbleibt.