02_RSS und 98_SVG verheiraten

Begonnen von betateilchen, 15 Oktober 2013, 19:46:51

Vorheriges Thema - Nächstes Thema

betateilchen

wunschgemäß die Fortführung des Ideenaustausches hier im Forum...

Zitat von: betateilchenHallo Boris,

nachdem ja die Plots in fhem nun alle als SVG kommen, stehe ich immer wieder vor dem Problem, diese in RSS einbinden zu wollen. GD kann keine SVG lesen. Bisher muss ich deshalb immer erstmal mit wget das SVG aus fhem lesen und dann mit Apache-Batik konvertieren, um danach das konvertierte Bild in 02_RSS verwenden zu können.

Nun hab ich mal ein bisschen recherchiert und es scheint wohl nur mit perlmagick möglich zu sein, SVG zu lesen und zu importieren.

Was denkst Du über die Idee, das irgendwie in 02_RSS mit einzubauen? Mir ist schon klar, dass das wieder Probleme bei Fritzboxen geben kann. Aber viele andere Plattformen würden das durchaus unterstützen. Man könnte das Nutzen dieser zusätzlichen Library in 02_RSS ja optional machen, dann hätte das auf Fritzboxnutzer nicht zwingend negative Auswirkungen.

Viele Grüße
Udo

Zitat von: BorisAn sich eine witzige Idee. Ich würde eine generische Lösung befürworten, die den Graph on-demand direkt in das SG-Bild pinselt.

Können wir die Diskussion bitte in das Board Frontends verlegen? Dort erhalten wir Aufmerksamkeit von Rudi, der sich mit den Plots ja sehr intensiv auseinandergesetzt hat. Vielleicht hat er aus der Historie heraus eine Idee.

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

Dr. Boris Neubert

Hallo,

hat sich schon jemand mit der Frage beschäftigt, wie SVG-Plots in Perl in ein Bitmap-Format verwandelt werden können, oder wie die Plots aus FHEM heraus unmittelbar in eine Bitmap gezeichnet werden können?

Rudi, hast Du aus der Frühzeit der Plot-Erstellung (außer der gnuplot-Variante) noch eine Idee?

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

alles ungetestet:

http://search.cpan.org/~tomson/Image-LibRSVG-0.07/lib/Image/LibRSVG.pm
This module provides an Perl-Interface towards the gnome-lib librsvg-2
which is able to convert SVG(Scaleable Vector Graphics) into bitmapformats like (PNG,JPG,...).
To which formats you can convert the svg-files depends on your gdk-pixbuf configuration.
Still at least PNG and JPG should be available.


http://search.cpan.org/~cmertz/svg2zinc-perl_0.9/SVG2zinc.pm
#To convert a svgfile in png/jpeg file:
&SVG::SVG2zinc::parsefile('file.svg', 'Image',
                           -out => 'file.jpg');


Zitat von: BorisIch würde eine generische Lösung befürworten, die den Graph on-demand direkt ...

das wäre natürlich die charmanteste Lösung :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Hallo,

ich habe mir das jetzt länger durch den Kopf gehen lassen.

TKzinc zieht einen Rattenschwanz von Abhängigkeiten nach sich. Ich präferiere Image::Magick (wie von Dir vorgeschlagen) oder Image::LibRSVG.

FHEM bekommt eine neue Hilfsfunktion (siehe forum.fhem.de/index.php?topic=15718) verpaßt, die Plots über SVG in Bitmaps rendert und zurückliefert. Darin wird use Image::Magick; oder use Image::LibRSVG mit einem eval drumherum aufgerufen, damit Installationen, die das Modul und die Bibliothek nicht haben, auch bei einem Aufruf der Hilfsfunktion nicht sterben.

In RSS muß wohl gar nichts geändert werden, weil die Layoutanweisung
img 20 35 1 jpg data { dieObenGenannteFunktion(mitDenNötigenArgumenten) }
genügt.

Es geht übrigens nicht, aus RSS heraus auf eine von FHEM gerenderte Seite zuzugreifen, da dies aufgrund des Single-Thread-Modells von FHEM zum Deadlock führt.

Udo, hast Du schon Perl-Code für dieObenGenannteFunktion()?

Viele Grüße
Boris


Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

Hallo Boris,

ich bin grade dabei, ein bisschen mit Image::LibRSVG im RSS-Umfeld zu experimentieren und denke, am Wochenende kann ich was genaueres dazu sagen.

Mir schwebt in 02_RSS etwas vor wie:

img 20 35 1 fhem data { svgPlotDingensKirchen }

und die von Dir angesprochene Funktion zum Rendern dann auch in der 02_RSS.

-----------------------
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: Dr. Boris Neubert am 24 Oktober 2013, 14:41:04TKzinc zieht einen Rattenschwanz von Abhängigkeiten nach sich.
...
Ich präferiere Image::Magick (wie von Dir vorgeschlagen) oder Image::LibRSVG.

:D Schau mal...


# apt-get install libimage-librsvg-perl
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.       
Statusinformationen werden eingelesen.... Fertig
Die folgenden zusätzlichen Pakete werden installiert:
  fontconfig libcairo2 libcroco3 libdatrie1 libgdk-pixbuf2.0-0
  libgdk-pixbuf2.0-common libpango1.0-0 libpixman-1-0 librsvg2-2
  librsvg2-common libthai-data libthai0 libxcb-render0 libxcb-shm0 libxft2
  libxrender1
Vorgeschlagene Pakete:
  ttf-baekmuk ttf-arphic-gbsn00lp ttf-arphic-bsmi00lp ttf-arphic-gkai00mp
  ttf-arphic-bkai00mp librsvg2-bin
Die folgenden NEUEN Pakete werden installiert:
  fontconfig libcairo2 libcroco3 libdatrie1 libgdk-pixbuf2.0-0
  libgdk-pixbuf2.0-common libimage-librsvg-perl libpango1.0-0 libpixman-1-0
  librsvg2-2 librsvg2-common libthai-data libthai0 libxcb-render0 libxcb-shm0
  libxft2 libxrender1
0 aktualisiert, 17 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
Es müssen 3.603 kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 8.985 kB Plattenplatz zusätzlich benutzt.


für libimage-magick muss ich gar nix nachinstallieren :D


# apt-get install libimage-magick-perl
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.       
Statusinformationen werden eingelesen.... Fertig
Hinweis: »perlmagick« wird an Stelle von »libimage-magick-perl« gewählt.
perlmagick ist schon die neueste Version.
0 aktualisiert, 0 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.


Womit soll ich denn nun weitertesten?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

justme1968

wie wäre ein ansatz auf basis von http://search.cpan.org/~lds/GD-2.50/GD.pm und ein modul das entweder wie bisher ein svg bzw. die neue java script version erzeugt oder direkt in ein png rendern kann?

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

betateilchen

Hallo Andre,

Dir ist schon klar, dass GD bereits jetzt die Grundlage ist, um 02_RSS.pm mit Grafiken nutzen zu können?
Und die Krux dabei ist ja gerade, dass GD kein SVG kennt.
Deswegen wurde ja diese Diskussion hier im Forum gestartet, um das Modul quasi dahingehend zu erweitern, SVG mit einbinden zu können, und dafür die optimale Lösung zu suchen.

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

justme1968

nein. das hatte ich noch nicht gesehen.

und http://search.cpan.org/~twh/GD-SVG-0.33/SVG.pm oder http://search.cpan.org/~ronan/SVG-GD-0.20/lib/SVG/GD.pm ist auch keine grundlage? ja. ich hab gesehen das beides nicht besonders frisch ist...

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

betateilchen

die Vorgehensweise an sich ist ja inzwischen schon mehr oder weniger klar: eine Funktion bauen, die die Daten aus 98_SVG bereitstellt und die Daten direkt in 02_RSS abliefert. Die Frage ist einfach nur noch, mit welcher Library das am meisten Sinn macht. Funktionieren tut es mit beiden - ich hab das heute getestet.
-----------------------
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: Dr. Boris Neubert am 24 Oktober 2013, 14:41:04Udo, hast Du schon Perl-Code für dieObenGenannteFunktion()?

Hallo Boris,

das mit der Funktion habe ich jetzt getestet. Wenn ich die in die 99_myUtils einbaue, kann ich die Funktion auch aus dem Frontend heraus aufrufen. Aber in 02_RSS.pm funktioniert das nicht, weil die %FW{dingensKirchen} dann beim Aufruf der Funktion während der Layoutinterpretation nicht zur Verfügung stehen.

LibRSVG funktioniert übrigens besser als Magick - bei Magick scheint es irgendwelche distributionsabhängige Unterschiede zu geben, LibRSVG hat dagegen auf mehreren getesteten Plattformen identisch reagiert.

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

Dr. Boris Neubert

Hallo Udo,

Zitat von: betateilchen am 26 Oktober 2013, 15:11:12
das mit der Funktion habe ich jetzt getestet. Wenn ich die in die 99_myUtils einbaue, kann ich die Funktion auch aus dem Frontend heraus aufrufen. Aber in 02_RSS.pm funktioniert das nicht, weil die %FW{dingensKirchen} dann beim Aufruf der Funktion während der Layoutinterpretation nicht zur Verfügung stehen.

Nanu. Grundsätzlich nicht? Was passiert, wenn Du es wie mit Rudi besprochen in 98_SVG.pm tust und in 02_RSS.pm ein use 98_SVG; dazutust?

Zitat
LibRSVG funktioniert übrigens besser als Magick - bei Magick scheint es irgendwelche distributionsabhängige Unterschiede zu geben, LibRSVG hat dagegen auf mehreren getesteten Plattformen identisch reagiert.

Da bei mir FHEM aus dem Raspberry Pi läuft und dort beide Packages sauber durchinstalliert werden, plädiere ich aufgrund Deiner Erfahrungen für LibRSVG.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

#12
Funktioniert jetzt  8)

in meiner 99_myUtils steht:


use Image::LibRSVG;

sub svgPlot($) {
my ($plotName) = @_;

$FW_webArgs{dev} = $plotName;
$FW_webArgs{logdev}    = InternalVal($plotName, "LOGDEVICE", "");
$FW_webArgs{gplotfile} = InternalVal($plotName, "GPLOTFILE", "");
$FW_webArgs{logfile}   = InternalVal($plotName, "LOGFILE", "CURRENT");
$FW_wname = "WEB";
my ($mimetype, $svgdata) = SVG_showLog("unused");

my $rsvg = new Image::LibRSVG();
$rsvg->loadImageFromString($svgdata);
return $rsvg->getImageBitmap();
}


in meiner Layoutdatei steht:

# cat svgrss_layout
img 4 430 0.99 png data { svgPlot("wz_Heizkurve") }


"wz_Heizkurve" ist der Name der Plotdefinition in fhem, die benötigten Werte werden aus den Plot-Internals gelesen.

Generiert wird folgende Ausgabe als RSS:

(http://up.picr.de/16280208sx.jpg)

Eine Frage hab ich noch:

Wie bekomme ich am einfachsten den Namen der FHEMWEB Instanz für $FW_wname raus (ist bestimmt ganz simpel, nur fällt es mir nicht ein) ? Aktuell habe ich "WEB" noch hartcodiert in der Funktion.

Änderungen in der 02_RSS.pm sind nicht notwendig.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Es bleibt die Frage, wo man die Funktion letztendlich wirklich einbaut:

- 02_RSS.pm
- 98_SVG.pm
- 99_Utils.pm

Persönlich würde ich für die 02_RSS plädieren, denn ich denke, in diesem Kontext (Ausgabe als Bitmap-Datenstrom) wird sie wohl am häufigsten benutzt werden.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#14
Im Moment schraube ich noch an einer Möglichkeit, zoom und offset übergeben zu können.

$FW_webArgs{pos} = "pos=zoom=qday;off=0";

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