FHEM Forum

FHEM => Sonstiges => Thema gestartet von: der_da am 16 März 2021, 08:26:47

Titel: Pause in Perl / FHEM
Beitrag von: der_da am 16 März 2021, 08:26:47
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?
Titel: Antw:Pause in Perl / FHEM
Beitrag von: Wernieman am 16 März 2021, 08:33:03
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 ...
Titel: Antw:Pause in Perl / FHEM
Beitrag von: der_da am 16 März 2021, 08:39:37
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.
Titel: Antw:Pause in Perl / FHEM
Beitrag von: MadMax-FHEM am 16 März 2021, 08:59:55
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
Titel: Antw:Pause in Perl / FHEM
Beitrag von: der_da am 16 März 2021, 09:14:33
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.
Titel: Antw:Pause in Perl / FHEM
Beitrag von: MadMax-FHEM am 16 März 2021, 09:17:35
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
Titel: Antw:Pause in Perl / FHEM
Beitrag von: Otto123 am 16 März 2021, 09:19:32
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'")})
Titel: Antw:Pause in Perl / FHEM
Beitrag von: MadMax-FHEM am 16 März 2021, 09:24:54
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
Titel: Antw:Pause in Perl / FHEM
Beitrag von: Otto123 am 16 März 2021, 09:41:08
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)}
Titel: Antw:Pause in Perl / FHEM
Beitrag von: der_da am 16 März 2021, 09:41:56
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.