[dürfte gelöst sein] Graph nicht sichtbar im plotAsPng Output

Begonnen von andies, 25 Juli 2022, 21:20:00

Vorheriges Thema - Nächstes Thema

andies

PS Titel geändert, weil sich später herausstellte was los war.

Ich habe ein Problem beim Senden von SVGs via SignalBot. Inzwischen glaubt Cheffe (siehe https://forum.fhem.de/index.php?topic=116138.msg1229148#msg1229148, dort mehrere Listings etc) dass es sich dabei um ein DbLog-Problem handelt. Die Grafiken werden innerhalb von FHEM korrekt dargestellt, nicht jedoch beim Aufruf von plotAsPng. Leider bin ich da mit meinem Latein am Ende, vielleicht kann hier jemand weiterhelfen? Oder mir sagen, wo ich suchen soll?

PS Auch TelegramBot liefert kein Bild, völlig analog zu SignalBot. Wenn man plotAsPng verwendet...
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

DS_Starter

Ich kann kein Problem feststellen.
Versendet habe ich


set teleBot cmdSend { plotAsPng("SVG_LogDB_Server") }


Ergebnis Empfang im Desktop Telegram siehe Anhang.
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

andies

Danke - und Mist, gerade nochmal getestet:
set TelegramBot cmdSend { plotAsPng("WasserPlot") }
Das heißt, der Fehler liegt weder an DbLog noch an FHEM vermutlich. Wo kann ich denn dann weitersuchen?
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

DS_Starter

#3
plotAsPng ist eine Perl-Funktion aus 98_SVG.pm.
Die Funktion selbst basiert eigentlich hauptsächlich auf der Standard Perl Library Image::LibRSVG.
Vielleicht kannst du die bei dir updaten ?
Bei mir verwende ich dazu den Installer (http://fhem.de/commandref.html#Installer)
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

andies

Danke! Der Installer meldet alles up-to-Date, die Bibliothek selbst habe ich über Debian installiert
libimage-librsvg-perl ist schon die neueste Version (0.07-8+b5).
Wenn ich der einzige bin, der das Problem hat, suche ich nun die Nadel im Heuhaufen...
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Frank_Huber

Hast mal Verbose erhöht und das Log geprüft?

betateilchen

Hast Du in Deinem FHEM mehrere FHEMWEB devices definiert?

plotAsPng() verwendet das erste FHEMWEB device, das es in einer von devspecarray() gelieferten Tabelle findet und das nicht als TEMPORARY gekennzeichnet ist.
Das muss nicht zwingend das gleiche device sein, das Du auch verwendest, wenn Du den plot in FHEM selbst anschaust. Die Auswahl ist mehr oder weniger zufällig.

Vor nicht allzu langer Zeit habe ich mal einen halben Tag lang gesucht, um ein ähnliches Problem in der Darstellung von plots zu lösen.

Testweise kannst Du in der Funktion plotAsPng() in 98_SVG.pm die Zeile 2479 anpassen und dort den Namen des FHEM device eintragen, das Du für die Anzeige in FHEM selbst verwendest.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Mit DbLog hat das übrigens nichts zu tun, das Phänomen betrifft auch FileLog.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Wenn mir jemand was zum Nachstellen baut, dann schaue ich das naeher an.

betateilchen

Das ist mir zu kompliziert zu beschreiben, da baue ich lieber gleich einen patch für plotAsPng(), um eine bestimmte FHEMWEB Instanz beim Aufruf von plotAsPng() bestimmen zu können  8)

-----------------------
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: betateilchen am 26 Juli 2022, 10:15:18
da baue ich lieber gleich einen patch für plotAsPng(), um eine bestimmte FHEMWEB Instanz beim Aufruf von plotAsPng() bestimmen zu können

Es gibt ein neues Attribut "plotAsPngPort" mit dem in einem SVG device definiert wird, welche FHEMWEB Instanz (bestimmt durch ihren port!) vewendet werden soll, wenn dieser SVG-plot per plotAsPng() aufgerufen wird.

Warum port und nicht name? Weil die Wahrscheinlichkeit, dass sich in einer FHEMWEB-Instanz der Name ändert, höher ist als beim port.

Warum Attribut und nicht Aufrufparameter? Weil die Funktion jetzt schon mit mehreren Werten aufgerufen werden kann, von denen die meisten optional sind, aber deren Reihenfolge vorgegeben ist. Eigentlich hätte ich auf parseParams() umbauen müssen, das war aber aus Kompatibilitätsgründen zu bestehenden Installation nicht ohne weiteres möglich.


Index: 98_SVG.pm
===================================================================
--- 98_SVG.pm   (revision 26256)
+++ 98_SVG.pm   (working copy)
@@ -83,6 +83,7 @@
     plotsize
     plotReplace:textField-long
     plotAsPngFix:1,0
+    plotAsPngPort
     startDate
     title
   );
@@ -2471,9 +2472,18 @@
plotAsPng(@)
{
   my (@plotName) = @_;
-  my (@webs, $mimetype, $svgdata, $rsvg, $pngImg);
+  my ($mimetype, $svgdata, $rsvg, $pngImg);

-  @webs=devspec2array("TYPE=FHEMWEB");
+  my $svgName = $plotName[0];
+  return (Log 1, "$svgName not found for plotAsPng()") unless defined($defs{$svgName});
+
+  my $devspec = "TYPE=FHEMWEB";
+  my $port    = AttrVal($svgName,'plotAsPngPort',undef);
+  $devspec   .= ":FILTER=i:PORT=$port" if defined($port);
+
+  my @webs=devspec2array($devspec);
+  return (Log 1, "No FHEMWEB device using port $port found for plotAsPng($svgName)")
+         if (defined($port) and scalar(@webs) == 0);
   foreach(@webs) {
     if(!InternalVal($_,'TEMPORARY',undef)) {
       $FW_wname = InternalVal($_,'NAME','');
@@ -2482,7 +2492,6 @@
     }
   }

-  my $svgName = $plotName[0];
   $FW_RET                 = undef;
   $FW_webArgs{dev}        = $svgName;
   $FW_webArgs{logdev}     = InternalVal($svgName, "LOGDEVICE", "");
@@ -2505,7 +2514,7 @@
     $rsvg->loadImageFromString($svgdata);
     $pngImg = $rsvg->getImageBitmap();
   };
-  Log3 $FW_wname, 1,
+  Log3 $svgName, 1,
     "plotAsPng(): Cannot create plot as png image for \"" .
     join(" ", @plotName) . "\": $@"
     if($@ or !defined($pngImg) or ($pngImg eq ""));
@@ -2679,6 +2688,11 @@
         be reduced.
         </li><br>

+    <a id="SVG-attr-plotAsPngPort"></a>
+    <li>plotAsPngPort &lt;portNum&gt;<br>
+        Affects only the plotAsPng function: Use a specific FHEMWEB instance.
+        </li><br>
+
     <a id="SVG-attr-plotfunction"></a>
     <li>plotfunction<br>
       Space value separated list of values. The value will be used to replace
@@ -2965,6 +2979,11 @@
         gesetzt wird, werden die CSS Anweisungen vereinfacht.
         </li><br>

+    <a id="SVG-attr-plotAsPngPort"></a>
+    <li>plotAsPngPort &lt;portNum&gt;<br>
+        Betrifft nur die plotAsPng Funktion: Verwendet eine bestimmte FHEMWEB Instanz.
+        </li><br>
+
     <a id="SVG-attr-plotfunction"></a>
     <li>plotfunction<br>
       Eine Liste, deren Werte durch Leerzeichen voneinander getrennt sind.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Da ich Schwierigkeiten habe vorzustellen, warum eine andere FHEMWEB Instanz das hier beschriebene Problem loesen sollte:
@andies: kannst Du bitte diesen Patch ausprobieren, und berichten, ob es hilft?

andies

Zuerst einmal zu den Symptomen, das sieht gut aus
list TYPE=FHEMWEB
WEB
WEB_192.168.2.66_55588
WEB_192.168.2.66_55589
WEB_192.168.2.66_55590
WEB_192.168.2.66_55593
WEBphone
WEBtablet

Zum Patch: Ich habe das analog zu https://forum.fhem.de/index.php/topic,116138.msg1229155.html#msg1229155 getestet, klappt nicht - siehe Anhang. Oder muss ich den Port selbst herausfinden? Ich habe ja die neue Funktion nicht aufgerufen.
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

betateilchen

Zitat von: rudolfkoenig am 26 Juli 2022, 11:20:43
Da ich Schwierigkeiten habe vorzustellen, warum eine andere FHEMWEB Instanz das hier beschriebene Problem loesen sollte:

In meinem Problemfall damals war das Problem, dass ich mehrere FHEMWEB Instanzen hatte, die jeweils mit unterschiedlichen styles angelegt waren. Bei einigen styles hatte die Darstellung per plotAsPng() ziemlich merkwürdige Ergebnisse geliefert. Als ich dann im Code den Namen der "richtigen" FHEMWEB Instanz angegeben habe, wurden auch die png-Daten korrekt erzeugt.

Zitat von: andies am 26 Juli 2022, 11:36:52
Oder muss ich den Port selbst herausfinden?

Du musst den gleichen Port verwenden in der FHEMWEB Instanz, mit der die plots in FHEM richtig angezeigt werden.
Der Port steht in der URL Zeile Deines Browsers.
Diesen port musst Du dann als Attribut in dem betroffenen SVG-device angeben.

Zitat von: andies am 26 Juli 2022, 11:36:52
Ich habe ja die neue Funktion nicht aufgerufen.

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

andies

Zitat von: betateilchen am 26 Juli 2022, 13:22:59
Der Port steht in der URL Zeile Deines Browsers.
Diesen port musst Du dann als Attribut in dem betroffenen SVG-device angeben.

Das verstehe ich nicht.
Ich habe "plotAsPng" aufgerufen, nicht aber "plotAsPngPort":
{ WriteFile("www/images/plot.png", plotAsPng("WasserPlot")) }
Habe ich dann da was falsch gemacht bei meinem Test?
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann