[problem] SVG verwendet %data Elemente aus beliebigem SVG plot

Begonnen von betateilchen, 17 März 2022, 16:43:45

Vorheriges Thema - Nächstes Thema

betateilchen

In meinen SVG devices verwende ich gerne und häufig die Datenelemente aus %data, zum Beispiel um damit mittels plotReplace Werte in der Ausgabe zu ersetzen und darzustellen.


plot "<IN>" using 1:2 axes x1y1 title '%eML%' ls l0 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title '%kML%' ls l1 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title '%eLI%' ls l8 lw 1 with lines

attr SVG_Bullion plotReplace eML={$data{currval1}}\
eLI={$data{currval3}}\
kML={$data{currval2}}


Mit steigender Zahl von SVG devices steigt dabei die Wahrscheinlichkeit, dass falsche Werte aus %data verwendet werden.
Zum Beispiel dann, wenn FHEM parallel mehrere SVG erzeugt und damit die Zuordnung dieser Datenelemente nicht mehr eindeutig auf ein bestimmtes SVG device bezogen ist.
Dann überschreiben sich die einzelnen devices gegenseitig die Datenelemente und es läßt sich nicht vorhersagen, woher die dann verwendeten Daten kommen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Ich meine das ist nicht der Fall: die SVGs werden samt FileLog_get / etc entweder in einem Prozess sequentiell abgearbeitet oder parallel in jeweils unterschiedlichen Prozessen.

Ich gehe davon aus, dass hier ein SVG die Daten aus mehreren FileLogs zieht.
Jeder FileLog_get Aufruf erzeugt ein currval1, etc, diese werden aber in SVG_getData gesichert, und neu numeriert, siehe https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/98_SVG.pm#L1247

betateilchen

Zitat von: rudolfkoenig am 17 März 2022, 17:02:47
Ich meine das ist nicht der Fall

Du meinst, ich habe mir das ausgedacht?

Der im ersten Screenshot dargestellte Wert 16460 ist falsch, es müsste da eigentlich 600,18 angezeigt werden, was auch zu der y2-Achse passen würde.
Den Wert 16460 finde ich zur gleichen Zeit in einem völlig anderen SVG plot.

Wenn ich den SVG plot dann per refresh noch ein- oder zweimal direkt hintereinander neu aufrufe, stimmt der Wert plötzlich - siehe zweiter Screenshot
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: rudolfkoenig am 17 März 2022, 17:02:47
Ich gehe davon aus, dass hier ein SVG die Daten aus mehreren FileLogs zieht.

Die Daten stammen alle aus einem (1) DbLog.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

ZitatDu meinst, ich habe mir das ausgedacht?
Nein, ich meinte das, was ich geschrieben habe, dass mehrere FileLogs benutzt wurden.

Wie sind plotEmbed und plotfork fuer den zugehoerigen FHEMWEB gesetzt?
Ist das ein Mehrprozessor-Rechner? OS?
Hintergrund: bei Mehrprozessor-Linux-Rechner ist die Voreinstellung fuer plotEmbed 2, sonst 0.
Taucht das Problem auch bei explizit gesetzten plotfork 0 und plotEmbed 0 auf?

betateilchen

Zitat von: rudolfkoenig am 17 März 2022, 18:30:56
Wie sind plotEmbed und plotfork fuer den zugehoerigen FHEMWEB gesetzt?
Ist das ein Mehrprozessor-Rechner? OS?

plotEmbed ist per Attribut auf 0 gesetzt, plotfork ist nicht explizit gesetzt.
Das Ganze läuft auf einem RaspberryPi 4 mit aktuellem Debian Bullseye.

Zitat von: rudolfkoenig am 17 März 2022, 18:30:56
Taucht das Problem auch bei explizit gesetzten plotfork 0 und plotEmbed 0 auf?

plotfork 0 müsste ich erst noch testen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

justme1968

ich weiss nicht ob es hier mit rein spielt, beim implementieren von firstvalX und firstdateX letzte woche ist mir aufgefallen das es einen unterschied macht ob man die ursprüngliche form (generisch DbLog/FileLog/logProxy)  oder die 'neumodische' (direkt den device namen) am anfang einer column_spec zeile angibt. bei ersterem waren die %data elemente alle korrekt global vorhanden, bei letzterem schienen sie nur lkokal zu sein und sich gegenseitig zu überschreiben. ich bin aber noch nicht dazu gekommen mir das genauer anzuschauen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

betateilchen

Zitat von: betateilchen am 17 März 2022, 18:38:48
plotfork 0 müsste ich erst noch testen.

Getestet. Das Problem tritt auch bei plotfork = 0 auf.

Beim Testen ist mir ein weiteres Phänomen mit plotReplace aufgefallen:

plot "<IN>" using 1:2 axes x1y1 title 'bla <eML>' ls l0 lw 1 with lines

funktioniert im Gegensatz zu 'bla %eML%' nicht und führt ggf. dazu, dass überhaupt kein title ausgegeben wird.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: justme1968 am 17 März 2022, 18:46:36
das es einen unterschied macht ob man die ursprüngliche form (generisch DbLog/FileLog/logProxy)  oder die 'neumodische' (direkt den device namen) am anfang einer column_spec zeile angibt.

Meine Einträge in den gplot files sehen so aus

#logProxy DbLog:logMetallDb:deviceName:readingName:::

(alternativ auch ohne logProxy, dann mit #DbLog ...)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

justme1968

dann wären das die generischen namen und es sollte nichts mit dem problem zu tun haben das ich beobachtet habe.

ausser dein logProxy und DbLog device heisst jeweils genau so wie die device typen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

betateilchen

Zitat von: justme1968 am 17 März 2022, 19:09:30
ausser dein logProxy und DbLog device heisst jeweils genau so wie die device typen.

Der logProxy heißt logProxy und das DbLog heißt logMetallDb.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

justme1968

versuch mal das logProxy device umzubenennen und schau ob es einen unterschied macht. ich glaube der device name hat vorrang vor dem generischen namen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

ZitatplotEmbed ist per Attribut auf 0 gesetzt, plotfork ist nicht explizit gesetzt.
Damit wird alles seriell berechnet.

Laut plotReplace Doku sollte man fuer sowas eher <> statt %% verwenden:
ZitatThe evaluation of <key> takes place after the input file is processed, so e.g. $data{min1} can be used in the title. %key% will be repaced before the input file is processed, this expression can be used to replace parameters for the input processing.

Erklaert fuer mich allerdings nicht, warum das manchmal funktioniert, insb. mit plotEmbed 0.
Kannst Du bitte die angehaengte Version ausprobieren, und die Log-Zeilen mit SVG zeigen?

betateilchen

Zitat von: rudolfkoenig am 17 März 2022, 20:50:00
Kannst Du bitte die angehaengte Version ausprobieren, und die Log-Zeilen mit SVG zeigen?

klar...

1.) Erster Aufruf nach Neustart von FHEM mit der Testversion. Ergebnis: es werden überhaupt keine Werte in den title angezeigt.

2022.03.17 21:16:29 1: SVG
2022.03.17 21:16:29 1: SVG readgplotfile: SVG_Bullion %%
2022.03.17 21:16:29 1: PERL WARNING: Use of uninitialized value in substitution iterator at ./FHEM/98_SVG.pm line 818.
2022.03.17 21:16:30 1: SVG getdata SVG_Bullion logProxy currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>595.98,currval5=>600
2022.03.17 21:16:30 1: SVG substcfg: SVG_Bullion <> currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>595.98,currval5=>600


2.) Zweiter Aufruf des gleichen SVG plots. Ergebnis: die Werte werden korrekt ersetzt und angezeigt.

2022.03.17 21:19:02 1: SVG
2022.03.17 21:19:02 1: SVG readgplotfile: SVG_Bullion %% currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>595.98,currval5=>600
2022.03.17 21:19:02 1: SVG getdata SVG_Bullion logProxy currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>595.98,currval5=>600
2022.03.17 21:19:02 1: SVG substcfg: SVG_Bullion <> currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>595.98,currval5=>600


3.) Aufruf einer anderen FHEM Seite, die drei andere SVG plots enthält

2022.03.17 21:20:15 1: SVG
2022.03.17 21:20:15 1: SVG readgplotfile: SVG_Edelmetalle_all %% currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>595.98,currval5=>600
2022.03.17 21:20:15 1: SVG getdata SVG_Edelmetalle_all logMetallDb currval1=>1746,currval2=>921,currval3=>22.77,currval4=>16383,currval5=>600
2022.03.17 21:20:15 1: SVG substcfg: SVG_Edelmetalle_all <> currval1=>1746,currval2=>921,currval3=>22.77,currval4=>16383,currval5=>600
2022.03.17 21:20:15 1: SVG
2022.03.17 21:20:15 1: SVG readgplotfile: SVG_Metall_DB_day %% currval1=>1746,currval2=>921,currval3=>22.77,currval4=>16383,currval5=>600
2022.03.17 21:20:16 1: SVG getdata SVG_Metall_DB_day logProxy currval1=>16383,currval2=>16407,currval3=>22.77,currval4=>16383,currval5=>600
2022.03.17 21:20:16 1: SVG substcfg: SVG_Metall_DB_day <> currval1=>16383,currval2=>16407,currval3=>22.77,currval4=>16383,currval5=>600
2022.03.17 21:20:16 1: SVG
2022.03.17 21:20:16 1: SVG readgplotfile: SVG_Metall_DB_week %% currval1=>16383,currval2=>16407,currval3=>22.77,currval4=>16383,currval5=>600
2022.03.17 21:20:16 1: SVG getdata SVG_Metall_DB_week logProxy currval1=>16383,currval2=>15801,currval3=>22.77,currval4=>16383,currval5=>600
2022.03.17 21:20:16 1: SVG substcfg: SVG_Metall_DB_week <> currval1=>16383,currval2=>15801,currval3=>22.77,currval4=>16383,currval5=>600


4. Erneuter Aufruf des ursprünglichen SVG plots. Ergebnis: es werden die "falschen" Werte (aus readgplotfile) ersetzt und angezeigt

2022.03.17 21:20:22 1: SVG
2022.03.17 21:20:22 1: SVG readgplotfile: SVG_Bullion %% currval1=>16383,currval2=>15801,currval3=>22.77,currval4=>16383,currval5=>600
2022.03.17 21:20:22 1: SVG getdata SVG_Bullion logProxy currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>595.98,currval5=>600
2022.03.17 21:20:22 1: SVG substcfg: SVG_Bullion <> currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>595.98,currval5=>600


5. Refresh der Seite mit dem SVG plot. Ergebnis: Die Werte werden nun wieder korrekt ersetzt und angezeigt.

2022.03.17 21:27:03 1: SVG
2022.03.17 21:27:03 1: SVG readgplotfile: SVG_Bullion %% currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600
2022.03.17 21:27:03 1: SVG getdata SVG_Bullion logProxy currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600
2022.03.17 21:27:03 1: SVG substcfg: SVG_Bullion <> currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600


Zitat von: rudolfkoenig am 17 März 2022, 20:50:00
Laut plotReplace Doku sollte man fuer sowas eher <> statt %% verwenden:

Dann verschwinden 2 der drei title in dem SVG vollständig, und der eine verbleibende zeigt keinen Wert an.

%% durch <> ersetzt, dann Seitenaufruf + 2 * refresh:

2022.03.17 21:29:56 1: SVG
2022.03.17 21:29:56 1: SVG readgplotfile: SVG_Bullion %% currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600
2022.03.17 21:29:56 1: SVG getdata SVG_Bullion logProxy currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600
2022.03.17 21:29:56 1: SVG substcfg: SVG_Bullion <> currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600
2022.03.17 21:30:14 1: SVG
2022.03.17 21:30:14 1: SVG readgplotfile: SVG_Bullion %% currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600
2022.03.17 21:30:14 1: SVG getdata SVG_Bullion logProxy currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600
2022.03.17 21:30:14 1: SVG substcfg: SVG_Bullion <> currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600
2022.03.17 21:30:22 1: SVG
2022.03.17 21:30:22 1: SVG readgplotfile: SVG_Bullion %% currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600
2022.03.17 21:30:23 1: SVG getdata SVG_Bullion logProxy currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600
2022.03.17 21:30:23 1: SVG substcfg: SVG_Bullion <> currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600


Inzwischen habe ich noch ein SVG mit viel mehr gezeichneten Linien aufgerufen:


2022.03.17 21:31:02 1: SVG
2022.03.17 21:31:02 1: SVG readgplotfile: SVG_te_Info %% currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600
2022.03.17 21:31:02 1: SVG getdata SVG_te_Info fhemDbLog currval1=>4.9,currval2=>87.4000000000001,currval3=>82,currval4=>0,currval5=>0,currval6=>0,currval7=>25,currval8=>0
2022.03.17 21:31:02 1: SVG substcfg: SVG_te_Info <> currval1=>4.9,currval2=>87.4000000000001,currval3=>82,currval4=>0,currval5=>0,currval6=>0,currval7=>25,currval8=>0


Das führt nun dazu, dass auch in SVG devices mit weniger Datenzeilen plötzlich Elemente vorhanden sind, die es im aktuellen SVG device nicht gibt.
currval6-8 gibt es in dem SVG gar nicht, hier stehen aber noch Werte vom vorherigen device (SVG_te_Info) drin. Und diese Werte verschwinden auch beim refresh nicht.

2022.03.17 21:32:17 1: SVG readgplotfile: SVG_Bullion %% currval1=>16383,currval2=>15801,currval3=>22.77,currval4=>16383,currval5=>0,currval6=>0,currval7=>25,currval8=>0
2022.03.17 21:32:17 1: SVG getdata SVG_Bullion logProxy currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600,currval6=>0,currval7=>25,currval8=>0
2022.03.17 21:32:17 1: SVG substcfg: SVG_Bullion <> currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600,currval6=>0,currval7=>25,currval8=>0
2022.03.17 21:33:13 1: SVG
2022.03.17 21:33:13 1: SVG readgplotfile: SVG_Bullion %% currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600,currval6=>0,currval7=>25,currval8=>0
2022.03.17 21:33:14 1: SVG getdata SVG_Bullion logProxy currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600,currval6=>0,currval7=>25,currval8=>0
2022.03.17 21:33:14 1: SVG substcfg: SVG_Bullion <> currval1=>1812.76,currval2=>1812.75,currval3=>1800,currval4=>596.49,currval5=>600,currval6=>0,currval7=>25,currval8=>0
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!