FHEM Forum

FHEM => Automatisierung => Thema gestartet von: sherwood am 25 November 2017, 22:30:07

Titel: Veränderter (Echtzeit) Zustand während notify läuft
Beitrag von: sherwood am 25 November 2017, 22:30:07
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.
Titel: Antw:Veränderter (Echtzeit) Zustand während notify läuft
Beitrag von: Wuehler am 25 November 2017, 22:53:47
Hi,

Das sleep blockiert fhem für 15 Sekunden (siehe https://fhem.de/commandref_DE.html#sleep (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;");
    }
  }
}
Titel: Antw:Veränderter (Echtzeit) Zustand während notify läuft
Beitrag von: DeeSPe am 26 November 2017, 05:29:41
Ein fhem-sleep (nicht Perl sleep) wäre nicht blockierend.
InternalTimer wäre in Perl auch möglich.

Gruß
Dan
Titel: Antw:Veränderter (Echtzeit) Zustand während notify läuft
Beitrag von: Benni am 26 November 2017, 08:00:08
Man könnte statt des notify auch einen watchdog (http://commandref.fhem.de/commandref_DE.html#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

Titel: Antw:Veränderter (Echtzeit) Zustand während notify läuft
Beitrag von: sherwood am 26 November 2017, 10:06:14
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.
Titel: Antw:Veränderter (Echtzeit) Zustand während notify läuft
Beitrag von: Benni am 26 November 2017, 10:22:29
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 (http://commandref.fhem.de/commandref_DE.html#watchdog) 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 (https://wiki.fhem.de/wiki/99_myUtils_anlegen) 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 (http://commandref.fhem.de/commandref_DE.html#sleep) lohnen  ;)

gb#

Titel: Antw:Veränderter (Echtzeit) Zustand während notify läuft
Beitrag von: sherwood am 26 November 2017, 10:55:56
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.
Titel: Antw:Veränderter (Echtzeit) Zustand während notify läuft
Beitrag von: sherwood am 26 November 2017, 11:44:16
Sieht gut aus mit Watchdog.
Danke für den Hinweis.
Titel: Antw:Veränderter (Echtzeit) Zustand während notify läuft
Beitrag von: Wuehler am 26 November 2017, 11:50:39
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.
Titel: Antw:Veränderter (Echtzeit) Zustand während notify läuft
Beitrag von: sherwood am 27 November 2017, 21:01:09
Danke. Probiere ich bei Gelegenheit mal aus.
Bin mit Watchdog zufrieden und es macht was es soll.