Hallo allerseits,
ich habe eine Netzwerk-Webcam, welche Bilder auf einen FTP-Server legt.
Diese Bilder möchte ich mit einem zeitgetriggerten DOIF per Telegram versenden.
Wichtig dabei ist, das es immer das "letzte" (d.h. aktuellste) Bild ist.
Ich habe mir dafür zwei Möglichkeiten per Einzeiler zusammengebastelt:
ls -1rt `find \/opt\/fhem\/FHEM\/notify_test -type f` |tail -1
mit komplettem Pfad
und/oder
ls \/opt\/fhem\/FHEM\/notify_test\/ -rt1 | tail -1
im lokalen Verzeuchnis.
Das funktioniert soweit (unter anderem in der Shell).
Wenn ich diese Befehle aber nun in einem DOIF bzw. dem Set TelegramBot sendPhoto einfüge, wird die Datei aber nicht gefunden.
(Meldung im error Readings des DOIFs:
set TelegramBot sendPhoto /opt/fhem/FHEM/notify_test/example.jpg
: FAILED file :/opt/fhem/FHEM/notify_test/example.jpg
: not found or empty
Wenn ich nun den set Befehl aus der Fehlermeldung ("set TelegramBot sendPhoto /opt/fhem/FHEM/notify_test/example.jpg") versende, klappt es ohne Probleme.
Ich bräuchte ein "Wink" in die richtige Richtung, was ich falsch mache bzw. besser machen kann.
Danke,
Zorin
bitte mal ein list des DOIFs
Klar, gerne, hier ist es.
Hinweis: Ich teste das DOIF mit set di_Telegram_pic cmd_1
Internals:
DEF ([11:30|8]) (set TelegramBot sendPhoto {(qx(ls -1rt `find \/opt\/fhem\/FHEM\/notify_test -type f` |tail -1))})
FUUID 5dfb7a42-f33f-07c0-cd5b-aadb77aa4192f3df
MODEL FHEM
NAME di_Telegram_pic
NOTIFYDEV global
NR 1248
NTFY_ORDER 50-di_Telegram_pic
STATE cmd_1
TYPE DOIF
VERSION 20811 2019-12-22 17:45:08
Helper:
DBLOG:
cmd:
logdb:
TIME 1579124139.63241
VALUE 1
cmd_event:
logdb:
TIME 1579124139.63241
VALUE set_cmd_1
cmd_nr:
logdb:
TIME 1579124139.63241
VALUE 1
error:
logdb:
TIME 1579123320.65825
VALUE set TelegramBot sendPhoto {qx/ls -la/}: FAILED file :{qx/ls: not found or empty
mode:
logdb:
TIME 1579123603.86311
VALUE enabled
state:
logdb:
TIME 1579124139.63241
VALUE cmd_1
READINGS:
2020-01-15 22:35:39 cmd 1
2020-01-15 22:35:39 cmd_event set_cmd_1
2020-01-15 22:35:39 cmd_nr 1
2020-01-15 22:35:39 error set TelegramBot sendPhoto /opt/fhem/FHEM/notify_test/example.jpg
: FAILED file :/opt/fhem/FHEM/notify_test/example.jpg
: not found or empty
2020-01-15 22:26:43 mode enabled
2020-01-15 22:35:39 state cmd_1
2020-01-15 22:26:43 timer_01_c01 16.01.2020 11:30:00|8
Regex:
accu:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::DOIF_time_once($hash,0,$wday,"8")
days:
0 8
do:
0:
0 set TelegramBot sendPhoto {(qx(ls -1rt `find \/opt\/fhem\/FHEM\/notify_test -type f` |tail -1))}
1:
helper:
DEVFILTER ^global$
NOTIFYDEV global
globalinit 1
last_timer 1
sleeptimer -1
DOIF_eventa:
cmd_nr: 1
cmd: 1
cmd_event: set_cmd_1
error: set TelegramBot sendPhoto /opt/fhem/FHEM/notify_test/example.jpg
: FAILED file :/opt/fhem/FHEM/notify_test/example.jpg
: not found or empty
cmd_1
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: set_cmd_1
error: set TelegramBot sendPhoto /opt/fhem/FHEM/notify_test/example.jpg
: FAILED file :/opt/fhem/FHEM/notify_test/example.jpg
: not found or empty
state: cmd_1
intervalfunc:
localtime:
0 1579170600
realtime:
0 11:30:00
time:
0 11:30:00
timeCond:
0 0
timer:
0 0
timers:
0 0
triggertime:
1579170600:
localtime 1579170600
hash:
uiState:
uiTable:
Attributes:
comment ([11:30|8]) (set TelegramBot sendPhoto /opt/fhem/FHEM/notify_test/{(qx/ls \/opt\/fhem\/FHEM\/notify_test\/ -rt1 | tail -1/)})
([11:30|8]) (set TelegramBot sendPhoto {(qx/ls -1rt `find \/opt\/fhem\/FHEM\/notify_test -type f` |tail -1/)})
room TEST
Ich nehme an, die Klammerung passt nicht probier mal sowas:
{
fhem(,,set ...".qx(..)}
Kurz, weil mobil
Hi,
funktioniert der Befehl in der FHEM Kommandozeile?
set TelegramBot sendPhoto {(qx(ls -1rt `find \/opt\/fhem\/FHEM\/notify_test -type f` |tail -1))}
Wenn ja, dann mach einfach ein at :)
Genaugenommen ist dein Konstrukt ein verschachteltes qx: qx() entspricht dem `` ;)
Die runde Klammer in der Geschweiften {()} ist bei set magic Pflicht - normal braucht die Perl nicht. Also dein Konstrukt ist aus meiner Sicht für set magic richtig. Der "DOIF Interpreter" hat damit eventuell ein Problem und will das anders haben.
Gruß Otto
Hi Otto123:
Leider klappt es mit der Eingabe in der Kommandozeile von SFM nicht.
Er gibt mir die selbe Meldung wie das DOIF zurück:
FAILED file :/opt/fhem/FHEM/notify_test/example.jpg
: not found or empty
Auf der Unix-Shell bekomme ich nach Eingabe von
ls -1rt `find \/opt\/fhem\/FHEM\/notify_test -type f` |tail -1
die korrekt Datei inkl. Verzeichnis:
/opt/fhem/FHEM/notify_test/example.jpg
zurück.
Ich habe die Lösung gefunden:
([11:30|8]) {my $img = qx(ls -1rt `find \/opt\/fhem\/FHEM\/notify_test -type f` |tail -1); $img =~ s/\s//mg; fhem("set TelegramBot sendPhoto $img")}
Der Trick ist, das mein Ausdruck (so oder so) ein Zeilenende enthält und daher <Pfad><Dateiname>Zeilenende natürlich nicht <Pfad><Dateiname> entspricht.
Auf die Lösung kam ich durch folgenden Post:
https://forum.fhem.de/index.php?topic=65875.0
Hatte Ihn schon länger angeschaut, aber den Wald vor Bäumen nicht sehen.
Danke trotzdem an Otto123 und KernSani für die schnelle Hilfe.
Aber das warst Du doch schon mal viel schlanker ;) Wenn Du einmal in der Pipeline bist, bleib doch einfach drin und mach weiter: ;)
set TelegramBot sendPhoto {(qx(ls -1rt `find \/opt\/fhem\/FHEM\/notify_test -type f` |tail -1|tr "\s"))}
Gruß Otto
Stimmt, viel besser und eleganter.
Danke !