FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: twist64 am 25 Juni 2016, 14:03:34

Titel: Perl: verzögertes Starten?
Beitrag von: twist64 am 25 Juni 2016, 14:03:34
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...
Titel: Antw:Perl: verzögertes Starten?
Beitrag von: justme1968 am 25 Juni 2016, 14:33:24
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
Titel: Antw:Perl: verzögertes Starten?
Beitrag von: twist64 am 25 Juni 2016, 15:40:56
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...
Titel: Antw:Perl: verzögertes Starten?
Beitrag von: justme1968 am 25 Juni 2016, 16:01:55
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
Titel: Antw:Perl: verzögertes Starten?
Beitrag von: twist64 am 25 Juni 2016, 20:54:43
Ah, super. mit Escaping hat es nun funktioniert.
Danke!