FHEM Forum

FHEM - Hausautomations-Systeme => Unterstützende Dienste => Thema gestartet von: TWART016 am 13 April 2021, 02:07:16

Titel: [gelöst] Telegram Grafik herunterladen und versenden
Beitrag von: TWART016 am 13 April 2021, 02:07:16
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.
Titel: Antw:Telegram Grafik herunterladen und versenden
Beitrag 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?
Titel: Antw:Telegram Grafik herunterladen und versenden
Beitrag von: TWART016 am 13 April 2021, 12:01:46
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.
Titel: Antw:Telegram Grafik herunterladen und versenden
Beitrag von: Wernieman am 13 April 2021, 12:26:31
Tasten wir uns mal ran .. hast Du es mal mit wget auf der Console probiert?
Titel: Antw:Telegram Grafik herunterladen und versenden
Beitrag von: TWART016 am 13 April 2021, 12:45:46
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.
Titel: Antw:Telegram Grafik herunterladen und versenden
Beitrag von: Wernieman am 13 April 2021, 16:05:04
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?
Titel: Antw:Telegram Grafik herunterladen und versenden
Beitrag 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
Titel: Antw:Telegram Grafik herunterladen und versenden
Beitrag von: TWART016 am 13 April 2021, 18:38:12
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?
Titel: Antw:Telegram Grafik herunterladen und versenden
Beitrag von: MadMax-FHEM am 13 April 2021, 18:49:11
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
Titel: Antw:Telegram Grafik herunterladen und versenden
Beitrag von: Wernieman am 13 April 2021, 20:00:06
Wobei Du mit telnet auch direkten senden kannst ..... (Wenn Du telnet-Zugang offen hast)
Titel: Antw:Telegram Grafik herunterladen und versenden
Beitrag von: TWART016 am 14 April 2021, 02:40:29
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 &")}
Titel: Antw:Telegram Grafik herunterladen und versenden
Beitrag von: MadMax-FHEM am 14 April 2021, 07:45:41
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
Titel: Antw:Telegram Grafik herunterladen und versenden
Beitrag von: Wernieman am 14 April 2021, 08:28:02
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).
Titel: Antw:Telegram Grafik herunterladen und versenden
Beitrag von: TWART016 am 15 April 2021, 02:25:53
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
Titel: Antw:Telegram Grafik herunterladen und versenden
Beitrag von: MadMax-FHEM am 15 April 2021, 07:03:22
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
Titel: Antw:Telegram Grafik herunterladen und versenden
Beitrag 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"

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)
Titel: Antw:Telegram Grafik herunterladen und versenden
Beitrag von: TWART016 am 24 April 2021, 02:10:19
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