[gelöst] Telegram Grafik herunterladen und versenden

Begonnen von TWART016, 13 April 2021, 02:07:16

Vorheriges Thema - Nächstes Thema

TWART016

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

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.

Wernieman

Ist es denn wirklich eine Grafik?
Was passiert denn, wenn Du es im Browser runterlädst?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

TWART016

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.

Wernieman

Tasten wir uns mal ran .. hast Du es mal mit wget auf der Console probiert?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

TWART016

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.

Wernieman

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?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

MadMax-FHEM

#6
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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

TWART016

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?

MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Wernieman

Wobei Du mit telnet auch direkten senden kannst ..... (Wenn Du telnet-Zugang offen hast)
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

TWART016

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 &")}

MadMax-FHEM

#11
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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Wernieman

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).
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

TWART016

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

MadMax-FHEM

#14
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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)