Hallo,
ich beziehe mich auf dieses Thema: http://forum.fhem.de/index.php?topic=15414 (http://forum.fhem.de/index.php?topic=15414). Dabei geht es darum, einen SVG-Plot aus FHEM in eine Bitmap zu verwandeln, die dann mit SG z.B. in ein Bild im RSS-Modul zur Anzeige in einem Bilderrahmen o.ä. integriert werden kann.
Wie benutze ich die Methoden aus 98_SVG.pm, um den Code im SVG-Format für einen Plot zu generieren? SVG_render() ist ja recht generisch.
Viele Grüße
Boris
Es gibt keine "nette" Schnittstelle fuer Perl, nur fuer HTTP mit
http://fhemhost:port/fhem/SVG_showLog?dev=<SVGNAME>&logdev=<FileLogName>&gplotfile=<GplotFileName>&logfile=CURRENT&pos=<ZoomAndOffset>
Wenn man das in Perl haben will, dann setzt man erst
$FW_webArgs{dev} = SVGNAME
$FW_webArgs{logdev} = FileLogName
$FW_webArgs{gplotfile} = GplotFileName
$FW_webArgs{logfile} = "CURRENT"
$FW_wname = FHEMWEBNAME
und ruft
($mimetype, $svgdata) = SVG_showLog("unused");
auf.
Zitat von: rudolfkoenig am 24 Oktober 2013, 11:52:23Es gibt keine "nette" Schnittstelle fuer Perl, nur fuer HTTP mit
so mache ich das bisher
Zitat von: rudolfkoenig am 24 Oktober 2013, 11:52:23Wenn man das in Perl haben will, dann setzt man erst
...
und ruft
($mimetype, $svgdata) = SVG_showLog("unused");
auf.
Und was kommt dann als Ergebnis-mimetype raus? (ich kann das grade nicht testen)
Rudi, hast Du in 98_SVG.pm noch Platz für eine Funktion
sub SVG_renderToPng() {
# SVG erzeugen gemäß der übergebenen Argumente wie weiter oben im Thread beschrieben
my $svg= ...;
eval {
use Image::Magick;
# SVG nach PNG wandeln
my $png= ...;
return $png;
} || Log ....;
}
Oder einen anderen Platz?
Grüße
Boris
Ja, sowas kann gerne nach 98_SVG.pm.
Bitte beachten: meine naechste grosse Baustelle (so denn ich ausreichend Zeit dafuer finden sollte) wird das Transferieren der SVG/FileLog Logik nach Browser/Javascript sein, und spaetestens da ist Schluss mit ImageMagick.
Aber bis dahin vergeht bestimmt ein halbes Jahr, wenn nicht mehr.
Zitat von: rudolfkoenig am 24 Oktober 2013, 15:06:39
Bitte beachten: meine naechste grosse Baustelle (so denn ich ausreichend Zeit dafuer finden sollte) wird das Transferieren der SVG/FileLog Logik nach Browser/Javascript sein, und spaetestens da ist Schluss mit ImageMagick.
Aber bis dahin vergeht bestimmt ein halbes Jahr, wenn nicht mehr.
Ich erinnere mich. Das ist, damit sich die Plots im Browser ohne Geflicker aktualisieren.
Dann ist aber die Idee, die Plots in andere Formate zu überführen, z.B. zur Anzeige in RSS, eine Sackgasse. Ich vermute, daß Du dann 98_SVG.pm nicht mehr weiterentwickeln wirst.
Und aus dem Browser bekommt man nämlich die Plots in FHEM nicht mehr heraus.
Grüße
Boris
Zitat von: Dr. Boris Neubert am 24 Oktober 2013, 15:15:30
Und aus dem Browser bekommt man nämlich die Plots in FHEM nicht mehr heraus.
Was (mit Linux) noch gehen würde: Der Umweg über einer virtuellen X-Server, z. B. mit Xvfb https://en.wikipedia.org/wiki/Xvfb (https://en.wikipedia.org/wiki/Xvfb)
Der X-Server ist virtuell. Darin wird ein Webbrowser gestartet, der den Plot anzeigt. Davon wird ein Screeshot gemacht.
Der Ablauf wäre in etwa so:
URL="http://fhemhost:port/fhem/SVG_showLog?dev=<SVGNAME>&logdev=<FileLogName>&gplotfile=<GplotFileName>&logfile=CURRENT&pos=<ZoomAndOffset> "
Xvfb :1 &
irgendein-webbrowser "$URL" -display :1 &
sleep 1
xwd -display :1 -root -out screenshot.xwd
convert screenshot.xwd screenshot.png
Hey Arne, coole Idee. Allen Fritzbox-Usern stehen jetzt schon die Haare zu Berge 8)
Meiner Meinung nach müsste es auf jeden Fall eine dauerhafte Lösung in fhem geben, die Plots auch ausserhalb von fhem verwenden zu können. Ich nutze die Plots jetzt schon im Verhältnis 10:90 (10% innerhalb fhem, 90% ausserhalb).
Eine komplette Verlagerung in den Browser halte ich persönlich für einen Irrweg.
Ein Bitmap-Bild kann man auch ohne virtuellen X-Server im Browser mit Javascript generieren: SVG -> Canvas, Canvas -> PNG/JPG.
Meiner Ansicht nach sollte der RSS Reader SVG lernen :)
Hallo,
ich sehe es doch richtig, daß ich aus FHEM heraus keine Webseite und keinen Plot aufrufen kann, der von FHEM serviert wird, weil FHEM single threaded ist, und der Versuch zum Deadlock führt? Korrekt?
Grüße
Boris
Das ist vermutlich korrekt, es sei denn man verwendet BlockingCall.
Zitat von: rudolfkoenig am 24 Oktober 2013, 19:25:44
Ein Bitmap-Bild kann man auch ohne virtuellen X-Server im Browser mit Javascript generieren: SVG -> Canvas, Canvas -> PNG/JPG.
Wenn du "ganz normal" einen Browser verwendest, dann hast du ja einen echten X-Server laufen und brauchst keinen virtuellen X-Server.
Die obige Idee war für eine automatisierte Erzeugung einer Bitmap-Bild gedacht.
So könnte man über cron stündlich ein Bild eines Plots erzeugen.
Korrekt. Und mit meiner Idee kann man u.U. das stuendliche Erzeugen komplett umgehen.
Zitat von: rudolfkoenig am 24 Oktober 2013, 11:52:23
Wenn man das in Perl haben will, dann setzt man erst
Aufgabe gelöst (http://forum.fhem.de/index.php/topic,15414.msg102458.html#msg102458)
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) ?
Und wie übergebe ich zoom und off an {pos}?
Von wo? Ueber HTTP ist es nicht notwendig, und sonst kannst Du irgendeinen der FHEMWEB Definitionen nehmen.
Wie pos & co heissen soll sieht man am besten in der HTML-Quelle oder wenn man das FHEMWEB Attribut redirectCmds auf 0 setzt (&pos=zoom=0;off=-1)
Zitat von: rudolfkoenig am 27 Oktober 2013, 07:53:59
Von wo? Ueber HTTP ist es nicht notwendig, und sonst kannst Du irgendeinen der FHEMWEB Definitionen nehmen.
Du hattest doch weiter oben bei der Übergabe der Aufrufparameter geschrieben:
Zitat$FW_wname = FHEMWEBNAME
und meine Frage ist einfach, wie finde ich FHEMWEBNAME raus?
Zitat von: rudolfkoenig am 27 Oktober 2013, 07:53:59Wie pos & co heissen soll
war überhaupt nicht die Frage, sondern die Frage war EINDEUTIG (und keineswegs unspezifisch!) wie man diese Werte an Deinen Funktionsaufruf übergibt.
Die aktuelle technische Diskussion zu dem Thema findet übrigens im zuerst im Frontend-Bereich eröffneten Thread statt. Vielleicht könnte man diesen Thread schließen, um sich nicht weiter zu verzetteln.
Ich habe es damit gemacht:
$FW_wname=""
my @webdev=devspec2array("TYPE=FHEMWEB");
foreach(@webdev) {
if (!InternalVal($_,"TEMPORARY",undef)) {
$FW_wname=InternalVal($_,"NAME","");
last;
}
}
mit anschließender Abfrage ob $FW_wname einen Wert enthält. Wenn du eine bestimmte Instanz verwenden möchtest kannst du zusätzlich das Kommentarfeld benutzen.
Grüße,
ChrisD
Zum Auswaehlen einer FHEMWEB Instanz ist die Loesung von ChrisD eine gute Alternative. Sonst kann man es in einem Parameter, Definition oder sonstwo speichern.
Die Werte uebergibt man, indem man sie in der globalen Variable $FW_webArgs setzt, so wie ich es geschrieben habe.
Ist nicht die feine Art, allerdings war es auch nie beabsichtigt das Generieren von SVG als Dienst fuer andere ausser FHEMWEB anzubieten. Bin schon froh, dass es nicht mehr Teil von FHEMWEB oder weblink ist.
Rudi, kannst Du nicht bitte irgendwann mal anfangen zu lesen, was eigentlich gefragt wurde *grummel* Du gibst mir immer wieder Antworten, die mir nicht weiterhelfen, weil sie nichts mit meiner (meistens sehr konkret) gestellten Frage zu tun haben.
@Chris: so ähnlich hab ich das mit der Web-Instanz ja inzwischen auch gelöst - siehe den Thread in Frontends.