FHEM Forum

FHEM => Automatisierung => Thema gestartet von: andies am 25 Juli 2022, 21:20:00

Titel: [dürfte gelöst sein] Graph nicht sichtbar im plotAsPng Output
Beitrag von: andies am 25 Juli 2022, 21:20:00
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 (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...
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: DS_Starter am 25 Juli 2022, 22:12:55
Ich kann kein Problem feststellen.
Versendet habe ich


set teleBot cmdSend { plotAsPng("SVG_LogDB_Server") }


Ergebnis Empfang im Desktop Telegram siehe Anhang.
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: andies am 25 Juli 2022, 22:26:13
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?
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: DS_Starter am 25 Juli 2022, 22:51:14
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)
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: andies am 26 Juli 2022, 08:01:04
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...
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: Frank_Huber am 26 Juli 2022, 08:46:43
Hast mal Verbose erhöht und das Log geprüft?
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: betateilchen am 26 Juli 2022, 09:01:01
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.
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: betateilchen am 26 Juli 2022, 09:02:52
Mit DbLog hat das übrigens nichts zu tun, das Phänomen betrifft auch FileLog.
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: rudolfkoenig am 26 Juli 2022, 10:01:12
Wenn mir jemand was zum Nachstellen baut, dann schaue ich das naeher an.
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: betateilchen am 26 Juli 2022, 10:15:18
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)

Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: betateilchen am 26 Juli 2022, 11:12:55
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.
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag 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:
@andies: kannst Du bitte diesen Patch ausprobieren, und berichten, ob es hilft?
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: andies am 26 Juli 2022, 11:36:52
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 (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.
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: betateilchen am 26 Juli 2022, 13:22:59
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.
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: andies am 26 Juli 2022, 13:25:12
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?
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: betateilchen am 26 Juli 2022, 13:26:50
Zitat von: andies am 26 Juli 2022, 13:25:12
Ich habe "plotAsPng" aufgerufen, nicht aber "plotAsPngPort":

plotAsPngPort ist keine Funktion, sondern ein Attribut.
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: andies am 26 Juli 2022, 13:55:14
Muss ich das irgendwie setzen? Denn der Patch hat bei mir das Problem nicht gelöst. Kann ich sonst etwas tun?
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: betateilchen am 26 Juli 2022, 13:57:23
Liest (und verstehst) Du eigentlich, was man hier schreibt?
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: andies am 26 Juli 2022, 14:11:14
Ich lese vollständig und verstehe nur zum Teil. Ich habe nie beruflich programmiert und daher verstehe ich zB nicht, was in der 98_SVG.pm passiert. Und wieso das die Ursache meines Problems sein könnte. Aber da ich anscheinend der einzige bin, der das Problem hat (siehe den Link oben), muss ich das ja reproduzieren bzw. den Patch einspielen und schauen, ob er was löst.

In meinem Unternehmen würde man sagen ,,der arbeitet nach Anweisung".
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: rudolfkoenig am 26 Juli 2022, 14:32:03
Nach dem Patch einspielen ist auch das Setzen des o.g. Attributes erforderlich.
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: rudolfkoenig am 26 Juli 2022, 14:40:43
ZitatBei einigen styles hatte die Darstellung per plotAsPng() ziemlich merkwürdige Ergebnisse geliefert.
Das verstehe ich, und habe deswegen den Patch eingecheckt.
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: betateilchen am 26 Juli 2022, 14:46:40
Zitat von: rudolfkoenig am 26 Juli 2022, 14:40:43
Das verstehe ich, und habe deswegen den Patch eingecheckt.

Danke!
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: andies am 26 Juli 2022, 14:47:59
Zitat von: betateilchen am 26 Juli 2022, 13:22:59
Diesen port musst Du dann als Attribut in dem betroffenen SVG-device angeben.
Das hatte ich übersehen, Asche auf mein Haupt. Ich habe jetzt
Internals:
   DEF        DbLog:SVG_DbLog_Wasserzaehler_1:CURRENT
   FUUID      5f64e557-f33f-1115-4639-875d9eb9fbaf5acd
   FVERSION   98_SVG.pm:0.258760/2022-03-23
   GPLOTFILE  SVG_DbLog_Wasserzaehler_1
   LOGDEVICE  DbLog
   LOGFILE    CURRENT
   NAME       WasserPlot
   NR         387
   STATE      initialized
   TYPE       SVG
Attributes:
   plotAsPngFix 0
   plotAsPngPort 8083

aber immer noch dasselbe Ergebnis nach
{ WriteFile("www/images/plot.png", plotAsPng("WasserPlot")) }
siehe Anhang.
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: betateilchen am 26 Juli 2022, 14:55:55
Was passiert denn, wenn Du plotAsPngFix auf 1 setzt?
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: andies am 26 Juli 2022, 15:23:47
Zitat von: betateilchen am 26 Juli 2022, 14:55:55
Was passiert denn, wenn Du plotAsPngFix auf 1 setzt?
Klappt, danke!! Problem beseitigt.
Titel: Antw:DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: andies am 26 Juli 2022, 22:30:17
Ich habe gesehen, dass Ihr da einen Fix eingecheckt habt. Wenn ich Update, muss ich dann etwas ändern? Kann ich im Wiki oder anderswo da mit Beschreibungen helfen, was man eventuell bei diesem Fehler tun muss? Oder ist der ,,verschwunden"?
Titel: Antw:[dürfte gelöst sein] DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: betateilchen am 26 Juli 2022, 23:09:07
Alles gut.
Titel: Antw:[dürfte gelöst sein] DbLog und svg funktioniert nicht bei plotAsPng
Beitrag von: rudolfkoenig am 27 Juli 2022, 08:44:47
Zusammenfassung:

Das im ersten Beitrag beschriebene Problem (Graph nicht sichtbar im plotAsPng Output)  kann behoben werden, wenn man das Attribut plotAsPngFix 1 setzt. Das ist noetig fuer neue Versionen der LibRSVG Bibliothek. Unklar ist, wieso das nicht getestet wurde, obwohl die Diskussion in dem verlinkten Thema startete, wo sich alles um dieses Attribut dreht. Entgegen des Betreffs (und meiner urspruenglichen Vermutung) hat die Ursache nichts mit DbLog zu tun.

Das hier eingecheckte Patch ist noetig, wenn man mehrere FHEMWEB-Instanzen mit unterschiedlichen Styles hat, und man von plotAsPng konsistente Ergebnisse erwartet. Womoeglich loest es auch weitere Probleme, die mir noch nicht klar sind. Um dieses Problem zu loesen muss man das plotAsPngPort SVG Attribut auf die Portnummer(!) der FHEMWEB Instanz setzen, dessen Style verwendet werden soll.
Titel: Antw:[dürfte gelöst sein] Graph nicht sichtbar im plotAsPng Output
Beitrag von: andies am 27 Juli 2022, 09:01:47
(Titel geändert)

Hier ein beispielhaftes List eines SVG devices, wenn der übliche Port 8083 verwendet wird.
Internals:
   DEF        DbLog:SVG_DbLog_Wasserzaehler_1:CURRENT
   FVERSION   98_SVG.pm:0.258760/2022-03-23
   GPLOTFILE  SVG_DbLog_Wasserzaehler_1
   LOGDEVICE  DbLog
   LOGFILE    CURRENT
   NAME       WasserPlot
   NR         387
   STATE      initialized
   TYPE       SVG
Attributes:
   plotAsPngFix 1  <=====
   plotAsPngPort 8083 <=======

Ich habe meine gepachte 98_SVG.pm angehangen. Nach dem überschreiben einmal
reload 98_SVG.pm
Erst danach Es sind die Attribute vorhanden.
Titel: Antw:[dürfte gelöst sein] Graph nicht sichtbar im plotAsPng Output
Beitrag von: betateilchen am 28 Juli 2022, 11:10:06
Zitat von: andies am 27 Juli 2022, 09:01:47
Ich habe meine gepachte 98_SVG.pm angehangen. Nach dem überschreiben einmal

Kannst Du den Anhang bitte entfernen?
Die Änderung ist seit vorgestern in der offiziellen Modulversion enthalten.