Hilfe bei Klammerung von qx in SET (für einen Foto-Versand per Telegram)

Begonnen von Zorin, 15 Januar 2020, 22:39:01

Vorheriges Thema - Nächstes Thema

Zorin

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

KernSani

RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Zorin

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

KernSani

Ich nehme an, die Klammerung passt nicht probier mal sowas:
{
fhem(,,set ...".qx(..)}



Kurz, weil mobil
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Zorin

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.


Zorin

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.

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Zorin