Pause in Perl / FHEM

Begonnen von der_da, 16 März 2021, 08:26:47

Vorheriges Thema - Nächstes Thema

der_da

Ich habe folgenden Codeschnipsel in meiner 99_myUtils.pm:
sendXMPPAnswer()
{
  my $lastsender=ReadingsVal("XMPP","LastSenderJID","0");
  my $lastmsg=ReadingsVal("XMPP","LastMessage","0");
  my @cmd_list = split(/\s+/, trim($lastmsg));
  my $cmd = lc($cmd_list[0]);
  # erstes Element entfernen
  shift(@cmd_list);

# Kamera auslösen
  if($cmd eq "foto" || $cmd eq "fotos") {
$newmsg.= fhem("get ipcam image");
$newmsg.= "Fotoserie erstellt - Email mit Bildern ist unterwegs.";
# nun muss kurz gewartet werden, bis die Fotoserie erstellt wurde
fhem("define verzoegert15 at +00:00:15 set dummy on");
DebianMail('name@provider.de','Fotos','Hier die gewünschten Fotos:',"'/opt/fhem/snapshots/ipcam_snapshot_1.jpg' '/opt/fhem/snapshots/ipcam_snapshot_2.jpg' '/opt/fhem/snapshots/ipcam_snapshot_3.jpg'");
}

# Nachricht versenden
  if(defined($newmsg)) {
    fhem("set XMPP msg ". $lastsender . " ".$newmsg);
  } else {
    fhem("set XMPP msg ". $lastsender . " Unbekanter Befehl: ".$lastmsg . "\nMögliche Befehle: Hilfe, ...");
  }
}

Der sorgt dafür, dass FHEM Antwortnachrichten sendet. Im Normalfall Text per XMPP, aber in diesem speziellen Fall auch noch eine e-mail mit angehängten Fotos. Da die Kamera aber erst mal ein paar Fotos machen muss, bevor diese versendet werden können, soll eine kurze Pause gemacht werden, bevor die e-mail raus geht. Irgendwie scheitere ich an diesem Problem. Normalerweise nutze ich das verzögerte AT, was im Code zu sehen ist und den Dummy verzögert schaltet. An der Stelle des Dummys müsste eigentlich der Aufruf für den e-mail-Versand stehen. Der Versand in der nächsten Zeile geschieht sofort und enthält nicht die aktuellen sondern alte Fotos.
Wie stelle ich das richtig an?

Wernieman

Ich verstehe jetzt Dein Problem nicht. Lau Deinem gepostetet Code wird ein AT definiert und sofort Debian_Mail aufgerufen. Der Dummy sollte verzögert an geschaltet werden, aber das hat mit dem Debian_Mail nichts zu tuhen. Anstatt des "setv Dummy on" müsste das Debian_Mail stehen ...
- 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

der_da

Zitat von: Wernieman am 16 März 2021, 08:33:03
Ich verstehe jetzt Dein Problem nicht. Laut Deinem geposteten Code wird ein AT definiert und sofort Debian_Mail aufgerufen. Der Dummy sollte verzögert an geschaltet werden... Anstatt des "set Dummy on" müsste das Debian_Mail stehen ...
Ja, klar, aber:
fhem("define verzoegert15 at +00:00:15 DebianMail('name@provider.de','Fotos','Hier die gewünschten Fotos:',"'/opt/fhem/snapshots/ipcam_snapshot_1.jpg' '/opt/fhem/snapshots/ipcam_snapshot_2.jpg' '/opt/fhem/snapshots/ipcam_snapshot_3.jpg'")");
funktioniert nicht.

MadMax-FHEM

#3
Funktioniert nicht ist nicht hilfreich! ;)

DebianMail ist ja wohl ein Perl-Befehl, also müssen da im at auf jeden Fall mal geschweifte Klammern drum...

https://wiki.fhem.de/wiki/Klammerebenen

Ich hatte schon etwas "vorbereitet", bin aber nicht sicher, ob da nicht noch mehr "falsch" ist, z.B. sehen die Anführungszeichen auch "unstimmig" aus...
(Oder ich tue mich schwer einfache von doppelten zu unterscheiden / und ich hatte keine Lust da genau "nachzuzählen")

EDIT: ok, ich probier's doch mal ;)

fhem("define verzoegert15 at +00:00:15 {DebianMail('name@provider.de','Fotos','Hier die gewünschten Fotos:',\"'/opt/fhem/snapshots/ipcam_snapshot_1.jpg' '/opt/fhem/snapshots/ipcam_snapshot_2.jpg' '/opt/fhem/snapshots/ipcam_snapshot_3.jpg'\")}");

Achja: doppelte Anführungszeichen "innerhalb" von doppelten Anführungszeichen müssen "escaped" werden. Beim @ innerhalb von "einfachen Anführungszeichen" bin ich nicht sicher... Es fehlt aber auch die Fehlermeldung... ;)

EDIT: ich würde auch eher zu defmod greifen, also statt define...

Also mal mit geschweiften Klammern um den "Perl-Aufruf" (DebianMail) probieren und wenn es dann wieder/immer noch nicht geht: eine Fehlermeldung wäre hilfreich...

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)

der_da

fhem("define verzoegert15 at +00:00:15 {DebianMail('name@provider.de','Fotos','Hier die gewünschten Fotos:',\"'/opt/fhem/snapshots/ipcam_snapshot_1.jpg' '/opt/fhem/snapshots/ipcam_snapshot_2.jpg' '/opt/fhem/snapshots/ipcam_snapshot_3.jpg'\")}");
ergibt beim Speichern:
Global symbol "@provider" requires explicit package name at ./FHEM/99_myUtils.pm
Das Problem ist wohl das  das Perl innerhalb von Fhem innerhalb von Perl ist.

MadMax-FHEM

#5
NEIN!
EDIT: ich definiere einige at innerhalb von myUtils mittels fhem("defmod ...") und da dann auch wieder Perl-Aufrufe. Also das geht definitiv!!

Das Problem ist (wo ich unsicher war) wohl: das @

Seht doch auch da... ;)

Also mal \@ probieren...

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)

Otto123

#6
Das Problem ist weil aussenrum " " steht :)
fhem("define verzoegert15 at +00:00:15 {DebianMail('name\@provider.de','Fotos','Hier die gewünschten Fotos:',\"'/opt/fhem/snapshots/ipcam_snapshot_1.jpg' '/opt/fhem/snapshots/ipcam_snapshot_2.jpg' '/opt/fhem/snapshots/ipcam_snapshot_3.jpg'\")}");
Obwohl man an der Stelle normal kein escape braucht!

Tipp: Das ganze wird einfacher wenn man das Perl Konstrukt q() oder qq() verwendet! Oder man nimmt concatenation - das machte es auch manchmal lesbarer. Oder auch Teile in Variablen schreiben.

anstatt das "kompliziert" define kann man auch ein (FHEM) sleep 15 nehmen :)
Also in etwa so, man spart die escape Striche:
fhem q(sleep 15; {DebianMail('name@provider.de','Fotos','Hier die gewünschten Fotos:',"'/opt/fhem/snapshots/ipcam_snapshot_1.jpg' '/opt/fhem/snapshots/ipcam_snapshot_2.jpg' '/opt/fhem/snapshots/ipcam_snapshot_3.jpg'")})
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

MadMax-FHEM

Zitat von: Otto123 am 16 März 2021, 09:19:32
anstatt das "kompliziert" define kann man auch ein sleep 15 nehmen :)

Ja, das hatte ich auch schon im Kopf und weiß es gibt auch "Konstrukte" wo es auch mit Perl (statt fhem-Kommando) nicht blockiert...
...aber nicht mehr (so) sicher... ;)

EDIT: gleiches gilt für q() und qq() (hab mich damit noch nicht beschäftigt)...

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)

Otto123

ist einfach und nützlich, deswegen nochmal die Erklärung (Beispiel oben rein editiert)
q() wirkt wie ein zusätzliches 'einzel Hochkomma ' damit wird innerhalb von q()  keine Variable "versucht aufzulösen" alles bleibt wie es ist.
qq() wirkt wie ein zusätzliches "doppel Hochkomma " damit werden variablen innerhalb aufgelöst
- und die " und ' bleiben unberührt!

Also q(Baut einen String aus "diesem Text" und 'lässt ihn wie' er ist mit $Willi und @array) kannst Du so in der FHEM Kommandozeile testen:
{q(Baut einen String aus "diesem Text" und 'lässt ihn wie' er ist mit $Willi und @array)}
Anders hier
{qq(Baut einen String aus "diesem Text" und 'lässt ihn wie' er ist. Wir haben den $month. Monat im Jahr)}
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

der_da

Zitat von: Otto123 am 16 März 2021, 09:19:32
Das Problem ist weil aussenrum " " steht :)
anstatt das "kompliziert" define kann man auch ein (FHEM) sleep 15 nehmen :)
Also in etwa so, man spart die escape Striche:
fhem q(sleep 15; {DebianMail('name@provider.de','Fotos','Hier die gewünschten Fotos:',"'/opt/fhem/snapshots/ipcam_snapshot_1.jpg' '/opt/fhem/snapshots/ipcam_snapshot_2.jpg' '/opt/fhem/snapshots/ipcam_snapshot_3.jpg'")})
Danke Otto123 (und MadMax-FHEM).
Das klappt - muss nur noch verstehen, was dieses q() macht. Bin dann mal am lesen.