Perl: verzögertes Starten?

Begonnen von twist64, 25 Juni 2016, 14:03:34

Vorheriges Thema - Nächstes Thema

twist64

Hallo,

ich bin gerade dabei die Logik von den Notifyern in Perls-Skripte auszulagern.
Wie kann ich denn in Perl eine Perl-Funktion verzögert aufrufen?

Sleep möchte ich nicht verwenden, weil FHEM weiterhin aktiv sein soll und auf Events reagieren muss.
Ich habe das mit einem fhem-Aufruf und at in einer Perl-Funktion versucht, kriege das aber nicht richtig hin.
Sowas in der Art:

sub activateAlarm ($$) {
  my ($message, $delay) = @_;

  fhem("define t1 at $delay { setAktiv($message) }");
}


Sieht gut aus, funktioniert aber nicht ($delay = +00:00:20).
Geht das auch ohne Umweg über fhem, rein in Perl - ohne aktives Warten?

--
Ciao Stephan...

justme1968

FHEM sleep wartet nicht blockieren wenn man es richtig anwendet.

temporäre at sind eine andere möglichkeit.

was genau geht bei dir nicht? welche meldungen hast du im log?

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

twist64

Ok, hier jetzt mal genauer:

So sieht mein Perl-Code aus:

sub activateAlarmAt ($$) {
  my ($message, $delay) = @_;

  fhem("define t2 at $delay { activateAlarm ($message) }");
}


sub activateAlarm ($) {
  my ($message) = @_;

  `/usr/local/bin/fhem2mail MAIL ALARM "$message"`;
}


So rufe ich das auf:

{activateAlarmAt "Hallo Stephan s gibt einen Alarm", "+00:00:20"  }

Passieren tut nichts. Das steht im Log:

2016.06.25 15:33:51 1: PERL WARNING: Subroutine activateAlarm redefined at ./FHEM/99_myUtils.pm line 34.
2016.06.25 15:34:17 0: data is {"deviceName": "t2","changes":"Next:15:34:37","type":"notify","source":"gcmsend_fhem","vibrate":"false","playSound":"false"}
2016.06.25 15:34:37 3: t2: Substitution pattern not terminated at (eval 15409) line 1.
2016.06.25 15:34:37 0: data is {"deviceName": "global","changes":"state:DELETED t2","type":"notify","source":"gcmsend_fhem","vibrate":"false","playSound":"false"}


Was mache ich falsch?
Wie kann ich sleep verwenden, ohne FHEM zu blockieren?

--
Ciao Stephan...

justme1968

wenn du auf der fhem ebene bist z.b. einfach so:sleep 20; {activateAlarm "Hallo Stephan es gibt einen Alarm" }

wichtig ist das es das fhem sleep ist und das nach dem sleep noch ein weiteres kommando kommt.

auch der umweg über die perl ebene ist je nicht nötig du kannst direkt von fhem aus das shell kommando aufrufen:sleep 20; "/usr/local/bin/fhem2mail MAIL ALARM 'Hallo Stephan es gibt einen Alarm'"


dein aufruf  fhem("define t2 at $delay { activateAlarm ($message) }");funktioniert vermutlich deshalb nicht weil beim wechseln zwischen fhem und perl ebene die anführungszeichen für $message verloren gehen. so sollte es besser sein:  fhem("define t2 at $delay { activateAlarm (\"$message\") }");


gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

twist64

Ah, super. mit Escaping hat es nun funktioniert.
Danke!