Hallo alle,
wahrscheinlich eine total Einfach-Frage, aber ich komme einfach nicht darauf..
Ich möchte gerne in einer 99_myUtils - Funktion einen Plot via plotAsPng als PNG umwandeln und anschließend als png-Datei lokal ablegen.
plotAsPng Funktioniert, aber wie bekomme ich das ,,Ergebis" in eine Datei geschrieben?
Bin für jede Hilfe dankbar.
Viele Grüße
Aktueller Lösungsansatz war ..
sub CreateRobiSvgPng(){
my $out_file_name ="httpsrv/robi_svg.png";
open (DATEI, ">".$out_file_name) or die $!;
my $zeile = plotAsPng("RoombaPlot");
print DATEI $zeile;
close (DATEI);
return $out_file_name;
}
Es wird auch eine Datei angelegt, aber sie ist anschließend leer..
Schreibrechte etc sind vorhanden.
sub test {
open(my $out, '>:raw', './log/test.png') or die "Unable to open: $!";
print $out plotAsPng('SVG_dbLog_2');
close($out);
}
- falsches Unterforum für die Frage
- zu wenig Doku (perl) gelesen :)
Super, danke funktioniert :-)
Hallo zusammen,
bin zwar ziemlich spät auf das Thema gekommen, aber vielleicht kann ich doch auf Hilfe hoffen.
Versuche mein
SVG_FileLog_PV_Ertrag_1 Plot in eine .png Datei zu speichern um diese auf einem NAS abzulegen
und sie jederzeit auf anderen Geräten öffnen zu können. Mit einem händischen screenshot ist das ja kein Problem - aber es soll automatisch funktionieren.
Habe das auf der FHEM Kommandozeile mit
plotAsPng(SVG_FileLog_PV_Ertrag_1)
versucht -kommt der Fehler :
Unknown command plotAsPng(SVG_FileLog_PV_Ertrag_1)
Bin zwar ziemlich unbedarft in Sachen Programmierung, aber es macht mir viel Spass und deshalb hoffe ich auf einen Tipp.
Beste Grüße von Peter aus Calw
@Peter aus Calw
Eine Lösung hat doch betateilchen gepostet. Die Sub muss "nur" an geeigneter Stelle eingebaut werden.
Ich habe es so gemacht (Sub in 99_myUtils.pm hinterlegen).
sub saveSVGToPNG(@){
my ($plotName) = @_;
open FILE, "> /opt/fhem/fhem_png_plots/$plotName.png";
binmode FILE;
print FILE plotAsPng($plotName);
close FILE;
}
Damit kannst du auf der Webconsole in FHEM mittels
{saveSVGToPNG("SVG_FileLog_PV_Ertrag_1")}
dein PNG abspeichern.
Zitat von: Peter aus Calw am 05 Oktober 2020, 23:47:00
Unknown command plotAsPng(SVG_FileLog_PV_Ertrag_1)
plotAsPng() ist kein Befehl, sondern eine perl Funktion und muss dementsprechend benutzt werden.
Hallo h002, Hallo Betateilchen,
erstmal herzlichen Dank für eure Antworten. Habe rnun versucht den Vorschlag von h002 umzusetzen.
Also das "sub" so versucht anzupassen (.
sub saveSVGToPNG(@){
my ($PLSVplot) = @_;
open FILE, "> /opt/fhem/fhempng/$PLSVplot.png";
binmode FILE;
print FILE plotAsPng($PLSVplot);
close FILE;
}
nach
{saveSVGToPNG("SVG_FileLog_PV_Ertrag_1")}
als Ergebnis wird das Plot angezeigt (zwar nach links verschoben), aber ich finde die "PLSVplot.png" File unter "/opt/fhem/fhempng/" nicht ?
Wo habe ich Mist gebaut ?
LG Peter
Existiert das Verzeichnis?
Wie sind die Rechte?
Was sagt das Logfile?
Hallo Frank,
hatte /opt/fhem/fhempgn statt fhempng geschrieben und anschliessend die Berechtigung auf "chown fhem:dialout" gesetzt und dann :
tata
es funktioniert :) :D :)
besten Dank für die Unterstützung die im FHEM-Forum immer klasse ist - auch für Grufties um die 75.
Ein super Dankeschön von Peter aus Calw
Zitat von: Peter aus Calw am 06 Oktober 2020, 18:08:00
Habe rnun versucht den Vorschlag von h002 umzusetzen.
Also das "sub" so versucht anzupassen
Das was Du da abgeschrieben hast, ist aber "alte" perl Syntax, mit der Du in absehbarer Zeit Probleme mit neueren perl Versionen bekommen könntest.
Solche Konstrukte (der Teil von open bis close) werden irgendwann von perl nicht mehr unterstützt.
Hallo Betateilchen danke für den Tipp,
wie könnte ich denn das dann entsprechend anpassen bzw. auf den nötigen Level bringen ?
Habe mich ja mächtig gefreut, daß es endlich funktioniert. Was mich noch etwas wundert(stört), daß beim öffnen der .png Datei im Background ein Karomuster hinterlegt ist - könnte man das irgendwo ändern ?
Freue mich auf Deinen Rat.
LG Peter
Zitat von: Peter aus Calw am 06 Oktober 2020, 20:33:37
wie könnte ich denn das dann entsprechend anpassen bzw. auf den nötigen Level bringen ?
ich habe doch weiter oben schon vor langer Zeit einen Lösungsvorschlag gepostet.
https://forum.fhem.de/index.php/topic,90083.msg825495.html#msg825495
Zitat von: betateilchen am 06 Oktober 2020, 19:04:38
ist aber "alte" perl Syntax, mit der Du in absehbarer Zeit Probleme mit neueren perl Versionen bekommen könntest.
Wo finde ich dazu Informationen? Danke dir!
Zitat von: h002 am 06 Oktober 2020, 21:16:45
Wo finde ich dazu Informationen?
www.perl.org
Hatte schon so ein Gefühl, diese Art von Antwort von dir zu erhalten. Als Laie versuche ich dazu zu lernen und lese gerne, um mein Wissen zu erweitern. Mich hätte es wirklich interessiert, wo genau ich zu diesem speziellen Fall etwas über die neue Syntax erfahre, ohne groß auf einer Webseite nach dem für mich wesentlichen Inhalt zu durchforsten. Dachte du kennst dich so gut aus und kannst gleich die entsprechende Position verlinken.
Für meine FHEM Automatisierung suche mir ich mir gerne funktionierende Beispiele, die bestimmt Lücken bzgl. Programmier-Etikette haben und bin auch immer bereit, diese zu verbessern.
Hallo Frank,
bin hier ganz bei Dir, manche liebe Leute hier setzen sehr viel voraus, bin 75 Lenze und habe mit Hilfe aus diesem Forum ohne Programmierkenntnisse ein kleines FHEM-Hausautomatiksystem mit PV, Stromzähler und Heizthermostatenam E-Heizung am laufen, und finde es toll, daß man mit diesen Möglichkeiten auch ohne große Kenntnisse und kleinem Geldbeutel die Umwelt entlasten kann.
Wenn betateilchen bereit ist die mögliche Anpassungen für diese Anwendung verständlich bekannt zu geben kann ich meiner Familie die täglichen Verbrauchswerte richtig schön optisch vermitteln.
Liebe Grüße von Peter
Hallo h002, Hallo betateilchen,
nach dem Hinweis von betateilchen habe ich diesen Vorschlag vom 8.8.2018 versucht:
sub test {
open(my $out, '>:raw', './log/test.png') or die "Unable to open: $!";
print $out plotAsPng('SVG_dbLog_2');
close($out);
}
und habe diesen für meine Anwendung so umgesetzt :
sub PVSVplot1 {
open(my $out, '>:raw', '/opt/fhem/fhempng/PVSVplot1.png') or die "Unable to open: $!";
print $out plotAsPng('SVG_FileLog_PV_Ertrag_1');
close($out);
}
und dann :
{PVSVplot1("PVSVplot1")}
in der FHEM Kommandozeile ausgeführt und erhalte mein gewünschtes Ergebnis wie mit Deinem Vorschlag..
Ob das nun die künftigen Syntax Vorausetzungen erfüllt - weiß ich nicht, vielleicht gibt betateilchen einen Tipp dazu ?
LG Peter
Hallo nochmal,
die Funktionen funktionieren einwandfrei, bekomme also die plotdaten in eine ".png" Datei. Habe dann ein "DOIF" eingerichtet um das sub periodisch zu starten:
{PVSVplot1("PVSVplot1")}
und erhalte dann in "DOIF" diesen Fehler, obwohl der Vorgang abläuft und die Datei *.png korrekt erzeugt wird :
error {PVSVplot1("PVSVplot1")}: 1 {PVSVplot2("PVSVplot2")}: 1
In der logfile erscheinen keine Fehler ???
wie kann das zustande kommen ?
LG Peter
Zitat von: Peter aus Calw am 10 Oktober 2020, 22:54:42
Hallo nochmal,
die Funktionen funktionieren einwandfrei, bekomme also die plotdaten in eine ".png" Datei. Habe dann ein "DOIF" eingerichtet um das sub periodisch zu starten:
{PVSVplot1("PVSVplot1")}
und erhalte dann in "DOIF" diesen Fehler, obwohl der Vorgang abläuft und die Datei *.png korrekt erzeugt wird :
error {PVSVplot1("PVSVplot1")}: 1 {PVSVplot2("PVSVplot2")}: 1
In der logfile erscheinen keine Fehler ???
wie kann das zustande kommen ?
LG Peter
Du musst am Ende deiner PVSVplot-Routine return (0); einbauen, damit DOIF den Aufruf als korrekt ansieht.
Würde ich nicht so angehen. In den SmartHome Hacks habe ich dokumentiert, wie das andersherum geht: Skriptgesteuert von außen eine SVG-Grafik in FHEM abrufen (einfacher http-Call) und mit Inkscape in ein PNG umwandeln. Auf diese Weise archiviere ich jede Nacht ein paar Plots aus FHEM:
!/bin/bash
device=$1
logdev=$2
plotfile=$3
# get the file
wget "http://192.168.0.xx:8083/fhem/SVG_showLog?dev=$device&logdev=$logdev&gplotfile=$plotfile&logfile=-" -O /tmp/backup.svg > /dev/null 2> /tmp/picture.log
#rewrite into png
inkscape -z -d 150 -e /tmp/backup.png -b ffffff00 /tmp/backup.svg > /dev/null 2> /tmp/picture.log
#rename properly
date=`date +"%Y-%m-%d"`
if [ -d "/home/fhemnas/fhempictures" ]; then
mv /tmp/backup.png "/home/fhemnas/fhempictures/$device-$date.png"
else
mv /tmp/backup.png "/home/fhem/fhemlogs/$device-$date.png"
fi
LG
pah
Hallo Damian,
wie bereits gesendet funktioniert die Ergänzung mit "return(0);" in der myutils Routine auf Anhieb. Danke nochmal.
Hallo Herr Prof.Dr. Henning,
Ihren Vorschlag werde ich auf jeden Fall auch versuchen umzusetzen um meine FHEM-Plots lesbar zu machen, habe aber von Programmierung keine Ahnung und werde sicher einige Fragen an Sie richten müssen.
LG aus dem Schwarzwald von Peter