Veränderter (Echtzeit) Zustand während notify läuft

Begonnen von sherwood, 25 November 2017, 22:30:07

Vorheriges Thema - Nächstes Thema

sherwood

Hallo Zusammen,

habe ein Problem mit notify und Zuständen, welche sich während des Ausführens verändern.

Sprich "Kontakte S1" triggered "notify XY".
Während "notify XY" läuft verändert sich der Zustand von "Kontakt S2"
Ich würde aber gerne den veränderten Zustand von "Kontakt B" während "notify XY" läuft, nach einem kurzen delay, auswerten.


notify XY

(EingangstuerA_S1:open) {
  Log 1, "warte 15 Sekunden";
  sleep 15;
  my $HStest = Value("EingangstuerA_S2");
  Log 1, "EingangstuerA_S2: $HStest";
  if (Value("EingangstuerA_S2") eq "open") {
    fhem("set LichtA on;");
  } elsif (Value("EingangstuerA_S2") eq "closed") {
    fhem("set LichtB on;");
  }
}


fhem.log

2017.11.25 21:38:49 1: EingangstuerA_S2: open
2017.11.25 21:38:49 1: warte 15 Sekunden
2017.11.25 21:39:04 1: EingangstuerA_S2: open


event monitor

2017-11-25 21:38:32 CUL_HM EingangstuerA battery: ok
2017-11-25 21:38:32 CUL_HM EingangstuerA CMDs_done
2017-11-25 21:38:32 CUL_HM EingangstuerA_S1 contact: closed (to HMLAN1)
2017-11-25 21:38:32 CUL_HM EingangstuerA_S1 closed
2017-11-25 21:38:32 CUL_HM EingangstuerA_S1 trigger_cnt: 212
2017-11-25 21:38:34 CUL_HM EingangstuerA battery: ok
2017-11-25 21:38:34 CUL_HM EingangstuerA CMDs_done
2017-11-25 21:39:04 CUL_HM EingangstuerA_S1 contact: open (to HMLAN1)
2017-11-25 21:39:04 CUL_HM EingangstuerA_S1 open
2017-11-25 21:39:04 CUL_HM EingangstuerA_S1 trigger_cnt: 213
2017-11-25 21:39:07 CUL_HM EingangstuerA battery: ok
2017-11-25 21:39:07 CUL_HM EingangstuerA CMDs_done
2017-11-25 21:39:07 CUL_HM EingangstuerA_S2 contact: closed (to HMLAN1)
2017-11-25 21:39:07 CUL_HM EingangstuerA_S2 closed                             
2017-11-25 21:39:07 CUL_HM EingangstuerA_S2 trigger_cnt: 112
2017-11-25 21:39:20 CUL_HM EingangstuerA battery: ok
2017-11-25 21:39:20 CUL_HM EingangstuerA CMDs_done
2017-11-25 21:39:20 CUL_HM EingangstuerA_S2 contact: open (to HMLAN1)
2017-11-25 21:39:20 CUL_HM EingangstuerA_S2 open
2017-11-25 21:39:20 CUL_HM EingangstuerA_S2 trigger_cnt: 113
2017-11-25 21:39:40 CUL_HM EingangstuerB battery: ok
2017-11-25 21:39:40 CUL_HM EingangstuerB CMDs_done
2017-11-25 21:39:40 CUL_HM EingangstuerB_S2 contact: open (to HMLAN1)
2017-11-25 21:39:40 CUL_HM EingangstuerB_S2 open
2017-11-25 21:39:40 CUL_HM EingangstuerB_S2 trigger_cnt: 95
2017-11-25 21:39:41 CUL_HM EingangstuerB battery: ok
2017-11-25 21:39:41 CUL_HM EingangstuerB CMDs_done
2017-11-25 21:39:41 CUL_HM EingangstuerB_S2 contact: open (to wz_4Kanal_Switch_Zentrale)
2017-11-25 21:39:41 CUL_HM EingangstuerB_S2 open
2017-11-25 21:39:41 CUL_HM EingangstuerB_S2 trigger_cnt: 95



Arbeitet notify/fhem nur rein sequenziell ab, mache ich was falsch oder gibt es bessere Möglichkeiten das zu realisieren?
Komme nach ewigen eingrenzen und probieren nicht weiter.

Wuehler

Hi,

Das sleep blockiert fhem für 15 Sekunden (siehe https://fhem.de/commandref_DE.html#sleep).
Du kannst im notify ein at definieren, dass in 15 Sekunden etwas beginnt.
Da gerade mit dem Handy getippt den folgenden code wegen falscher Anführungszeichen usw. Nicht kopieren.
ungetestet ...
(EingangstuerA_S1:open) {
  defmod doorcheck at 00:00:15 {
    my $HStest = Value("EingangstuerA_S2");
    Log 1, "EingangstuerA_S2: $HStest";
    if (Value("EingangstuerA_S2") eq "open") {
      fhem("set LichtA on;");
    } elsif (Value("EingangstuerA_S2") eq "closed") {
      fhem("set LichtB on;");
    }
  }
}

DeeSPe

Ein fhem-sleep (nicht Perl sleep) wäre nicht blockierend.
InternalTimer wäre in Perl auch möglich.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Benni

Man könnte statt des notify auch einen watchdog nehmen, bei dem das 2. Event nie getriggert wird. Dazu regexp2 auf einen Ausdruck setzen, der niemals passen kann (bspw. $.+^).

Also in etwa so:

define watchdog wdWait15Seconds EingangstuerA_S1:open 00:00:15 $.+^ { ... }
(Ggf. auch das Attribut autoRestart setzen)

gb#

PS: Wo bleiben eigentlich die DOIF-Leute?  ;D


sherwood

Habe jetzt etwas rumprobiert.

fhem("sleep 15;");
Funktioniert nicht. Status aktualisiert sich nicht und es wird eine Warnung ausgegeben. WARNING: sleep without additional commands is deprecated and blocks FHEM

Devmod leider auch nicht.
(EingangstuerA_S1:open) defmod doorcheck at +00:00:15 { Log 1, "Done waiting"; }
Alles in {} wird nicht berücksichtigt, sprich nix ausgeführt. Scheint wohl nur mit fhem Befehlen zu funktionieren.
Leider, oder wende ich das falsch an? Doku. ist  etwas mau, was defmod angeht.

(EingangstuerA_S1:open) { fhem("defmod doorcheck at +00:00:15 set Licht on"); }
Funktioniert, bringt mir aber nix, da ich komplexere IF ELSIF anwenden will.

Watchdog oder DOIF würde ich ungern einsetzten, da ich mein bestehenden notify komplett umbauen müsste.
Ich guck mir jetzt noch InternalTimer an. Scheint aber auf den ersten Blick etwas komplex zu sein.

Benni

#5
Zitat von: sherwood am 26 November 2017, 10:06:14
Watchdog oder DOIF würde ich ungern einsetzten, da ich mein bestehenden notify komplett umbauen müsste.

Nö! Du kannst den cmd-Block von notify 1:1 (ohne das sleep natürlich!) in den cmd-Block von watchdog übernehmen.
Hast du dir den verlinkten Commandref-Eintrag dazu überhaupt angeschaut?)

Zitat von: sherwood am 26 November 2017, 10:06:14
da ich komplexere IF ELSIF anwenden will.

Ich gehe mal davon aus, du meinst if ... elsif also die Perl-Ausdrücke.
Komplexeren Code lagert man üblicherweise in die 99_myUtils.pm aus.


Zitat von: sherwood am 26 November 2017, 10:06:14
fhem("sleep 15;");
Funktioniert nicht. Status aktualisiert sich nicht und es wird eine Warnung ausgegeben. WARNING: sleep without additional commands is deprecated and blocks FHEM

Ja! Die Meldung sagt dir ja auch genau, warum!
Es sollte nach dem Sleep noch ein wieterer (FHEM-)Befehl kommen.

bspw: fhem("sleep 15;set lampe on");

damit würde das fhem-Kommando "set lampe on" um 15 sekunden verzögert, OHNE zu blockieren. Auch hier würde sich mal ein Blick in die Commandref zu sleep lohnen  ;)

gb#


sherwood

#6
Hab ihn mal überflogen. Guck mir das mal genauer an.


Das mit sleep ist mir jetzt auch klar. War lediglich die Antwort auf den Vorschlag es als fhem Befehl zu nutzen.

sherwood

Sieht gut aus mit Watchdog.
Danke für den Hinweis.

Wuehler

Moin,

defmod ist "nur" ein anderes Wort für define. Der Unterschied besteht darin, dass define nicht funktioniert, wenn es das angelegte device schon gibt. defmod würde es dann überschreiben.
Versuche mal folgendes (jetzt am Rechner war das Nachschlagen einfacher, habe einen wichtigen Teil vergessen  ;) ):
(EingangstuerA_S1:open) {
  fhem('
    defmod doorcheck at 00:00:15 {
      my $HStest = Value("EingangstuerA_S2");
      Log 1, "EingangstuerA_S2: $HStest";
      if (Value("EingangstuerA_S2") eq "open") {
       fhem("set LichtA on;");
      } elsif (Value("EingangstuerA_S2") eq "closed") {
        fhem("set LichtB on;");
      }
    }
  ');
}

Wichtig ist, dass du innerhalb des fhem('defmod...') immer nur doppelte Anführungszeichen nimmst.

sherwood

Danke. Probiere ich bei Gelegenheit mal aus.
Bin mit Watchdog zufrieden und es macht was es soll.