[Bug] 98_SVG.pm: plotAsPng() liefert nur noch schwarz/weiß Plots

Begonnen von betateilchen, 25 Januar 2015, 19:41:55

Vorheriges Thema - Nächstes Thema

betateilchen

Ausgabe im Webfrontend:

(http://up.picr.de/20796417jb.jpg)

Ausgabe per plotAsPng():

(http://up.picr.de/20796418kw.jpg)

Scheinbar werden die neugeordneten Styles (noch) nicht berücksichtigt.

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

rudolfkoenig

Schaut so aus, als ob du keine aktuelle Version der svg_style.css verwenden wuerdest. Die mit .SVGplot.l0, etc.

betateilchen

Doch, die Datei ist vorhanden und aktuell, sie kam gestern per Update ins System.


-rw-r--r-- 1 fhem dialout 1807 Jan 20 03:16 darksvg_defs.svg
-rw-r--r-- 1 fhem dialout 2762 Jan 25 19:06 darksvg_style.css
-rw-r--r-- 1 fhem dialout 1824 Jan 20 03:16 ios6svg_defs.svg
-rw-r--r-- 1 fhem dialout 2951 Jan 25 19:06 ios6svg_style.css
-rw-r--r-- 1 fhem dialout 1824 Jan 20 03:16 ios7svg_defs.svg
-rw-r--r-- 1 fhem dialout 2766 Jan 25 19:06 ios7svg_style.css
-rw-r--r-- 1 fhem dialout 2502 Jan 20 03:16 svg_defs.svg
-rw-r--r-- 1 fhem dialout 2532 Jan 25 19:06 svg_style.css


(Müsste bei Deiner angenommenen Ursache nicht auch dem Plot im Frontend die Farben fehlen?)

Und ich bin nicht der einzige mit dem Problem.

http://forum.fhem.de/index.php/topic,22519.msg251399.html#msg251399

Es tritt allerdings nur bei Verwendung von plotAsPng() auf.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Ich hätte bezüglich der von ShowLog() (die auch von plotAsPng() genutzt wird) zurückgelieferten SVG-Objekte gleich noch ein Anliegen.

Im <svg> Tag fehlen Größenangaben (width= height=) was dazu führt, dass der zurückgelieferte svg-Inhalt von vielen Browsern auf mobilen Endgeräten nicht dargestellt werden kann, weil der Browser einfach orientierungslos ist und nicht weiss, was er wohin rendern soll.

Momentan behelfe ich mir damit, dass ich per regexp in den zurückgelieferten svg-Daten das svg-Tag umschreibe. Aber eine Dauerlösung sollte das nicht sein.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

#4
width & height: Welche Variante? Mit <embed> oder ohne oder gar im plotAsPng?

Mit plotAsPng muss jemand anderes debuggen: sie stammt nicht von mir, und ich habe auch keine Test-Konfiguration dafuer.

betateilchen

width & height: Ohne embed drumrum. Direkt im $svghdr:

Aus der 98_SVG:


  ######################
  # SVG Header
  my $svghdr = 'version="1.1" xmlns="http://www.w3.org/2000/svg" '.
               'xmlns:xlink="http://www.w3.org/1999/xlink" '.
               "id='SVGPLOT_$name' $filter";
  if(!$styleW) {
    SVG_pO '<?xml version="1.0" encoding="UTF-8"?>';
    SVG_pO '<!DOCTYPE svg>';
    SVG_pO "<svg $svghdr >";
  } else {
    SVG_pO "<svg $svghdr style='width:${styleW}px; height:${styleH}px;'>";
  }


Bei mir kommt $svghdr immer ohne Größeninformation. Solange ein embed drumrum ist, ist das manchem Browser egal. Aber ich will direkt mit dem Ergebnis von ShowLog() arbeiten, und da kommt reiner svg-Quelltext zurück, dem im Header die Größeninfo fehlt. Vermutlich würde es reichen, die Zeile

    SVG_pO "<svg $svghdr >";

mit den entsprechenden Attributen width= und height= zu versehen. Ich kann das gerne mal hier testen.

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

betateilchen

Zum Thema plotAsPng() bin ich grade ziemlich ratlos.


  • plotAsPng() ruft SVG_showLog() auf
  • ShowLog() ruft SVG_doShowLog() auf
  • doShowLog() ruft SVG_render() auf

Die Ausgabe von SVG_showLog enthält noch die korrekten Farbinformationen. Irgendwie müssen die SVG Daten aber seit neuestem in einem Format vorliegen (oder Daten enthalten), mit dem die libRSVG bei der Konvertierung nach png nicht mehr zurechtkommt. Das Ganze passiert erst seit ein paar Tagen, seitdem die gesamten Styles in fhem neu strukturiert wurden.
-----------------------
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 Januar 2015, 11:23:18
Vermutlich würde es reichen, die Zeile

    SVG_pO "<svg $svghdr >";

mit den entsprechenden Attributen width= und height= zu versehen. Ich kann das gerne mal hier testen.

Unter der Voraussetzung, dass die SVG plots standardmäßig 800pxx160px groß sind,
löst folgende Änderung das beschriebene Problem:


Index: 98_SVG.pm
===================================================================
--- 98_SVG.pm (revision 7727)
+++ 98_SVG.pm (working copy)
@@ -1264,7 +1264,7 @@
   if(!$styleW) {
     SVG_pO '<?xml version="1.0" encoding="UTF-8"?>';
     SVG_pO '<!DOCTYPE svg>';
-    SVG_pO "<svg $svghdr>";
+    SVG_pO "<svg $svghdr width=\"800px\" height=\"160px\" >";
   } else {
     SVG_pO "<svg $svghdr style='width:${styleW}px; height:${styleH}px;'>";
   }
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

ChrisD

Hallo,

Die Graustufenbilder kommen daher dass der Parser der librsvg mit den neuen Stylenamen nichts anfangen kann. So sucht er bei der Angabeclass="SVGplot l0"nach einem Style SVGplot (den es nicht gibt) und einem Style l0 (den es ebenfalls nicht gibt).

Ich habe vorerst in der Funktion plotAsPng in 98_svg.pm hinter
$svgdata =~ s/<\/svg>/<polyline opacity="0" points="0,0 $w,$h"\/><\/svg>/;
folgenden Code eingefügt:
$svgdata =~ s/\.SVGplot\./\./g;

Damit sind die Farben bei mir wieder da.

Grüße,

ChrisD

rudolfkoenig

Das heisst, dass librsvg nicht in der Lage ist, pro Element mehr als eine Klasse zu unterstuetzen.
Da bin ich gespannt, ob jemandem ein guter Workaround einfaellt. Das gerade erwaehnte ist nur ein PoC, und wuerde an anderen Stellen zu Problemen fuehren.

betateilchen

Zitat von: rudolfkoenig am 26 Januar 2015, 15:19:56
Da bin ich gespannt, ob jemandem ein guter Workaround einfaellt.

klar...

http://forum.fhem.de/index.php/topic,32828.0.html

(vorausgesetzt, Du baust die Größenangaben in den svg-Header ein)

Das Modul InfoPanel bindet fhem plots direkt per svg ein und braucht weder ein plotAsPng() noch eine libRSVG.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Ich wäre sehr dafür, die vorgeschlagene Änderung in die Funktion plotAsPng() einzubauen, da genau diese Änderung dazu führt, dass die Konvertierungsfunktion wieder korrekt arbeitet.

Negative Auswirkungen an anderen Stellen kann ich nicht sehen, da die Funktion plotAsPng() im gesamten fhem nirgends verwendet wird und die Anpassung somit nur exakt innerhalb der Konvertierungsfunktion wirksam bleibt.
-----------------------
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 habe die Aenderung eingebaut (natuerlich nicht mit festen Werten) und kurz getestet.
Allerdings nicht mit RSS/plotAsPng()

betateilchen

Hallo Rudi,

wir reden hier ja über zwei voneinander unabhängige Problemstellungen:


  • (Bisher) fehlende Größenangaben im svg-Header
  • Fehlende Farben nach der Konvertierung der svg Plots nach png durch lib::RSVG

Den Punkt 1) hast Du prima gelöst, die eingebauten Größenangaben funktionieren hier einwandfrei. Vielen Dank dafür!

Für Punkt 2) hast Du noch gar keine Änderung eingebaut, die man in plotAsPng() bzw. RSS testen könnte. Es wäre schön, wenn Du die von ChrisD vorgeschlagene Änderung in die Funktion plotAsPng() aufnehmen würdest. Die Änderung habe ich hier schon ausgiebig getestet und konnte keine dadurch verursachten Probleme erkennen.


Index: 98_SVG.pm
===================================================================
--- 98_SVG.pm (revision 7755)
+++ 98_SVG.pm (working copy)
@@ -2129,6 +2129,7 @@

   my ($w, $h) = split(",", AttrVal($plotName[0],"plotsize","800,160"));
   $svgdata =~ s/<\/svg>/<polyline opacity="0" points="0,0 $w,$h"\/><\/svg>/;
+  $svgdata =~ s/\.SVGplot\./\./g;

   eval {
     require Image::LibRSVG;
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig