Hallo,
ich möchte gerne eine Grafik vom meinem Grafana Server herunterladen und per Telegram versenden.
Dieses Bild möchte ich gerne versenden:
http://192.168.178.15:3000/render/d-solo/XHwDB77Gk/test2?orgId=1&panelId=4 (http://192.168.178.15:3000/render/d-solo/XHwDB77Gk/test2?orgId=1&panelId=4)
Mit GetHttpFile bekomme ich das Bild allerdings nicht mal in der FHEM Kommandozeile anzeigt.
{GetHttpFile('192.168.178.15:3000', '/render/d-solo/XHwDB77Gk/test2?orgId=1&panelId=4')}
Oder versendet jemand anderes über eine andere Art Grafiken von einem Webserver?
Das Versenden sollte dann über set Telegram cmdSend {GetHttpFile ... )}
funktionieren.
Ist es denn wirklich eine Grafik?
Was passiert denn, wenn Du es im Browser runterlädst?
Zitat von: Wernieman am 13 April 2021, 08:39:25
Ist es denn wirklich eine Grafik?
Was passiert denn, wenn Du es im Browser runterlädst?
Mit Seite speichern unter wird sofort als Dateityp png ausgewählt. Das Bild lässt sich problemlos öffnen.
Tasten wir uns mal ran .. hast Du es mal mit wget auf der Console probiert?
Zitat von: Wernieman am 13 April 2021, 12:26:31
Tasten wir uns mal ran .. hast Du es mal mit wget auf der Console probiert?
Das Bild wird herunterladen
wget "http://192.168.178.15:3000/render/d-solo/XHwDB77Gk/test2?orgId=1&panelId=4"
--2021-04-13 12:42:10-- http://192.168.178.15:3000/render/d-solo/XHwDB77Gk/test2?orgId=1&panelId=4
Connecting to 192.168.178.15:3000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 34528 (34K) [image/png]
Saving to: 'test2?orgId=1&panelId=4'
test2?orgId=1&panelId=4 100%[=====================================================================================>] 33,72K --.-KB/s in 0,001s
2021-04-13 12:42:17 (30,1 MB/s) - 'test2?orgId=1&panelId=4' saved [34528/34528]
root@docker:/home/user/test-grafana# ls
'test2?orgId=1&panelId=4'
Die Datei wird heruntergeladen, jedoch ohne Endung. Setze ich ein .png hinten dran, kann das Bild geöffnet werden.
Dann dürfte das Dein Problem sein. Auch wenn es heutzutage nicht mehr nötig sein sollte, möchten viele Programme noch die richtige Endung.Bei wget kannst Du den Datinamen definieren, wie es bei GetHttpFile geht ... ???? ...
Hinweis:
Dir ist klar, das GetHttpFile für die Zeit des Downloads FHEM blockiert?
Mit wget in ein Script auslagern und auch von dort dann den Telegram-Aufruf:
z.B.:
/usr/bin/perl /opt/fhem/fhem.pl 7072 "set TeleBot sendImage Bildname.jpg"
Script dann in fhem mit "doppelten Anführungszeichen", damit fhem nicht blockiert...
"/pfad/script.sh"
Gruß, Joachim
Zitat von: MadMax-FHEM am 13 April 2021, 16:29:00
Mit wget in ein Script auslagern und auch von dort dann den Telegram-Aufruf:
z.B.:
/usr/bin/perl /opt/fhem/fhem.pl 7072 "set TeleBot sendImage Bildname.jpg"
Script dann in fhem mit "doppelten Anführungszeichen", damit fhem nicht blockiert...
"/pfad/script.sh"
Gruß, Joachim
Ihr meint aus FHEM heraus ein Skript aufrufen? In dem Skript dann mit wget die Datei herunterladen und in dem Skript mit
usr/bin/perl /opt/fhem/fhem.pl 7072 "set TeleBot sendImage Bildname.jpg"
die Datei versenden + das Bild anschließend wieder löschen?
Wäre halt meine Idee...
Bzw. würde ich das wohl so machen, wenn es mit wget geht...
Aber: es gibt viele Möglichkeiten...
Gruß, Joachim
Wobei Du mit telnet auch direkten senden kannst ..... (Wenn Du telnet-Zugang offen hast)
Mit dem Befehl rufe ich das Skript auf. Wie kann ich dort noch 2 Variabel an das Skript übergeben? URL und Name?
{system("sudo -u root /home/tim/skripte/telegram_send.sh &")}
NEIN!!!!
Nur NICHT mit system()!!
Das blockiert!
EDIT: ok, sorry mit dem '&' am Ende nicht ;) Aber das 'system' brauchst du gar nicht... :)
EDIT: und warum 'sudo'!!? Und was soll bitte sudo -u root ;) sudo -> root ;) Du musst das Script halt z.B. in /opt/fhem/ ablegen und nat. für den User fhem "zugreifbar" machen: sudo chown fhem: /opt/fhem/script.sh und nat. auch "ausführbar" machen: sudo chmod +x /opt/fhem/script.sh / Im Script ist doch nix was root braucht!? Wenn du als User fhem etwas mittels sudo aufrufst, dann muss entweder der User fhem hierzu auch einen Eintrag in der sudoers haben (bzw. "neuerdings" seine "eigene" sudoers in /etc/sudoers.d), weil sonst musst du ja ein Passwort eingeben. Schwierig, wenn es autom. laufen soll... ;) Aber wie geschrieben: mMn brauchst du KEIN sudo...
http://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html
Ich habe doch extra geschrieben: einfach in Anführungszeichen!
Parameter?
Naja wie bei anderen "Programmen"/Scripten auch ;) :
"/pfad/script.sh Param1 Param2"
Und im Script dann eben "abfragen": $1 bzw. $2
https://www.baeldung.com/linux/use-command-line-arguments-in-bash-script
https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash
Ist die url nicht immer gleich?
Den Namen der runtergeladenen Datei brauchst du doch nirgends?
Den legst du doch einfach im Script fest, weil den brauchst du doch nur im Script!?
EDIT: wenn es in Readings etc. steht, dann kannst du es auch im Script "abfragen" (genauso wie du den Telegram-Aufruf auch dort machen kannst). Setzt halt telnet voruas, also auf fhem Seite. Es gibt aber auch die Möglichkeit per http(s) aus dem Script abzufragen und bestimmt noch so einige weitere Möglichkeiten ;) Das ist jetzt hier mal nur meine (aktuelle) Methode.
url=$(/usr/bin/perl /opt/fhem/fhem.pl 7072 "{ReadingsVal('DeviceName','urlReading','n.a.')}")
Gruß, Joachim
Ich kann MadMax nur Zustimmen!
1. ein Script braucht nicht mehr rechte, als für die Aufgabe nötig. Also wieso root?
2. welche Info braucht das Script (Gib uns diese bitte)
3. Am besten mit FHEM-Bordmitteln arbeiten, also nicht perl, system o.Ä., sondern mit "", wie in der Doku (unhd hier beschrieben).
Ich habe das Skript jetzt in /opt/fhem abgelegt.
Da ich das Skript für mehrere Grafiken verwenden möchte, wäre es geschickt die URL und den Namen mit zu übergeben. Das funktioniert auch soweit mit dem Befehl:
"bash telegram_send.sh 'http://192.168.178.15:3000/render/d-solo/XHwDB77Gk/test2?orgId=1&panelId=4' grafana1"
Diesen Befehl möchte ich nun aus einer sub in der myutils aufrufen. Wie müsste der Befehl dort aussehen?
Das Skript sieht derzeit so aus:
#!/bin/bash
PfadOutput="/opt/fhem/www/images/grafana"
url=$1
name=$2."png"
if [ ! -e "$PfadOutput" ]
then
mkdir -p "$PfadOutput"
fi
wget $url -O $PfadOutput/$name
perl /opt/fhem/fhem.pl 7072 "set Telegram sendImage $PfadOutput/$name"
exit
Also ich würde beim Aufruf von "perl /opt/fhem" usw. den Pfad bei perl mitgeben!
Hatte ich in meinem Beispiel ja auch.
EDIT: ich würde immer Pfade angeben! Weil sonst ist es "Glückssache" wo "du" gerade "stehst", wenn der Aufruf erfolgt... ;)
Pfad halt anpassen ;)
which perl
(am besten als User fhem)
Aufruf in einer myUtils, ganz einfach:
fhem("\"/opt/fhem/scriptname Param1 Param2\"");
Die escapten Anführungszeichen sind ja der Aufruf "Script" für non-blocking aus fhem heraus und fhem("Befehl") halt der Wechsel von Perl nach fhem ;)
Ich weiß nicht wo du deine urls und den Namen her bekommst...
...daher kann ich dir auch nicht "sagen" wie du die dann übergibst, außer eben Param1 und Param2 oben zu schreiben ;)
Wenn es in Readings steckt, dann so:
my $url = ReadingsVal("DeviceName","urlReadingName","Ersatzwert");
my $progname = ReadingsVal("DeviceName","progReadingName","Ersatzwert");
fhem("\"/opt/fhem/scriptname $url $progname\"");
Gruß, Joachim
1. in den Script steht die Zeile "#!/bin/bash"
Damit brauchst Du NICHT das Script mit bash zu starten. also wirklich nur mit "telegram_send.sh 'http://192.168.178.15:3000/render/d-solo/XHwDB77Gk/test2?orgId=1&panelId=4' grafana1"
2. Genauso steht eigentlich in der fhem.pl in der ersten Zeile der Interpreter. Auch dort könnte man so vorgehen ...
3. Den Rest hat MadMax geschrieben
Wegen 1-2 zum durchlesen:
https://de.wikipedia.org/wiki/Shebang (https://de.wikipedia.org/wiki/Shebang)
Zitat von: Wernieman am 15 April 2021, 14:02:04
1. in den Script steht die Zeile "#!/bin/bash"
Damit brauchst Du NICHT das Script mit bash zu starten. also wirklich nur mit "telegram_send.sh 'http://192.168.178.15:3000/render/d-solo/XHwDB77Gk/test2?orgId=1&panelId=4' grafana1"
Funktioniert jedoch nicht ohne bash. So funktioniert es und schadet wohl auch nicht.
fhem("\"bash /opt/fhem/telegram_send.sh 'http://192.168.178.15:3000/render/d-solo/XHwDB77Gk/test2?orgId=1&panelId=4' NAME\"");
[/quote]
Die Namen und URL muss ich heraussuchen. Die URL ist aus Grafana. Dort gibt es ein Share Button und dort kommt dann die URL raus. Den Namen vergebe ich einfach. Falls ich aus mehreren Skripten oder notifys die Funktion aufrufe habe ich somit keine Probleme.
Falls andere das bash Skript brauchen:
#!/bin/bash
#Ablage des Skripts in /opt/fhem
#chown fhem: telegram_send.sh
PfadOutput="/opt/fhem/www/images/grafana"
url=$1
name=$2."png"
if [ ! -e "$PfadOutput" ]
then
echo "$PfadOutput wird erstellt"
mkdir -p "$PfadOutput"
else
echo "$PfadOutput bereits vorhanden"
fi
wget $url -O $PfadOutput/$name
/usr/bin/perl /opt/fhem/fhem.pl 7072 "set Telegram sendImage $PfadOutput/$name"
rm $PfadOutput/$name
exit