at ruft perl-Funktion immer wieder auf

Begonnen von habefan, 30 Oktober 2016, 20:54:57

Vorheriges Thema - Nächstes Thema

habefan

Hallo,

um mich an ein geöffnetes Fenster zu erinnern, habe ich ein notify und ein at definiert:
- Beim Öffnen des Fensters wird ruft das notify eine weitere perl-Routine auf. Diese parametriert das at so, dass es z.B. eine Minute später schalten soll. Das at sieht dann so aus:

2016-10-30T20:40:15 { f_SendInfo("Fenster xyz schließen","Das Fenster xyz ist seit 45 Minuten geöffnet."); }


Sobald der eingetragene Zeitpunkt erreicht ist, wird f_SendInfo() dauerhaft aufgerufen, bis ich das entsprechende at auf inactive setze.

Wo liegt mein Fehler?

Vielen Dank für Eure Hilfe,

stefan

budy

Moin,

ich würde so etwas eher mit einem watchdog behandeln. Der kann entweder einmalig, oder auch wiederholend ausgeführt werden, bis das Femster wieder zu ist.

Zeig' mal den Code für das notify und den Code, welcher das at konfiguriert... mit den wenigen Infos, die du bisher geliefert hast, ist keine Analyse möglich.

Gruß,
Stephan
Debian stretch, FHEM 5.9.
HM-CC-RT-DN, HM-ES-PMSw1-Pl, HM-LC-Dim1TPBU-FM, HMUARTLGW, HMLAN, HM-SEC-KEY, HM-SEC-RHS, HM-SEC-SC-2, HM-SEC-SCo, HM-SEC-SD-2, HM-OU-CFM-TW, div. HUEs, Wifilight, Ring Video Pro

Hollo

FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

habefan

Hallo erstmal,

und vielen Dank für Eure Tipps! Den watchdog kannte ich bis dato noch nicht und werde das bei Gelegenheit ausprobieren. Beim Versuch, den Code der einzelnen Elemente zu posten, ist mir etwas aufgefallen:

Zunächst habe ich im Web-Interface das at _at_SendInfo_BadFenster aufgemacht und beim Timespec wizard die Haken bei "Relative" und "Periodic" gelöscht, vgl. Screenshot. Anschließend habe ich dieses at einmalig ausgeführt:

define _at_test_UpdateSendInfo at *06:00 {
f_UpdateSendInfo("_at_SendInfo_BadFenster","0:01") }
attr _at_test_UpdateSendInfo group Email
attr _at_test_UpdateSendInfo room 99_myUtils,zz_Labor


Hinter f_UpdateSendInfo() verbirgt sich folgender perl-Code:

#####################################################################
# f_UpdateSendInfo($$)
#####################################################################
sub f_UpdateSendInfo($$) {
  # 2016-10-30
  # - at zum Absenden einer Nachricht aktualisieren
  # - Parameter: 1. Name des at
  #              2. Verzögerungszeit hh:mm
  my $device = shift;
  my $tmpvar = shift;
  my @offset = split(/:/,$tmpvar);

  { Log 3, "f_UpdateSendInfo(): was called" };
  # Prüfen, ob $device ein at ist
  $tmpvar = uc(ReadingsVal($device, "state", "0"));
  if (substr($tmpvar,0,5) eq "NEXT:" || substr($tmpvar,0,9) eq "INACTIVE") {
      my $addtime = 3600 * $offset[0] + 60 * $offset[1];
      my ($sek, $min, $std, $tag, $mon, $jhr, $wday, $yday, $summertime) = localtime(time + $addtime);
      my $timespec = sprintf("%02d:%02d:%02d", $std, $min, $sek);
      fhem("set $device modifyTimeSpec $timespec");
      fhem("set $device active");
  }
}


Eine Minute später wurde das erste at ("_at_SendInfo_BadFenster") immer wieder ausgeführt, bis ich es inactive gesetzt habe.

Dass "_at_SendInfo_BadFenster" gar nicht in der fhem.cfg auftaucht, fiel mir erst gestern abend auf. Draufhin habe ich den Haken bei "Periodic" gesetzt und das at "_at_test_UpdateSendInfo" erneut einmal ausgeführt. Nach einer Minute wurde "_at_SendInfo_BadFenster" genau ein Mal ausgeführt; außerdem taucht es jetzt in der fhem.cfg auf:

define _at_SendInfo_BadFenster at *23:45:02 { f_SendInfo ("Badezimmerfenster schließen","Das Fenster im Bad ist seit 45 Minuten geöffnet.");; }
attr _at_SendInfo_BadFenster group Email
attr _at_SendInfo_BadFenster room zz_Labor


Das verwirrt mich; muss das so?

Vielen Dank für Eure Hilfe,


stefan

P.S.: f_SendInfo() schickt eine entsprechende Email an alle Bewohner des Hauses, sofern eines ihrer Geräte per ping erreichbar ist ...



Hollo

Zitat von: habefan am 01 November 2016, 08:07:06
...
Dass "_at_SendInfo_BadFenster" gar nicht in der fhem.cfg auftaucht, fiel mir erst gestern abend auf. Draufhin habe ich den Haken bei "Periodic" gesetzt und das at "_at_test_UpdateSendInfo" erneut einmal ausgeführt. Nach einer Minute wurde "_at_SendInfo_BadFenster" genau ein Mal ausgeführt; außerdem taucht es jetzt in der fhem.cfg auf: ...

Das verwirrt mich; muss das so?

Ja.
Ein einmaliges at (ohne * bzw. periodic) wird nur 1x ausgeführt und dann gelöscht.
Ein wiederholendes at (mit * bzw. oeriodic) wird in der fhem.cfg gespeichert, da es ja öfter gebraucht wird.

siehe auch in der commandref zu at
ZitatHinweise:

    wenn kein * angegeben wird, wird der Befehl nur einmal ausgeführt und der entsprechende at Eintrag danach gelöscht. In diesem Fall wird der Befehl im Statefile gespeichert (da er nicht statisch ist) und steht nicht im Config-File (siehe auch save).
    wenn die aktuelle Zeit größer ist als die angegebene Zeit, dann wird der Befehl am folgenden Tag ausgeführt.
    Für noch komplexere Datums- und Zeitabläufe muss man den Aufruf entweder per cron starten oder Datum/Zeit mit perl weiter filtern. Siehe hierzu das letzte Beispiel und das Perl special.
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"