Steuerung der Alarmauslösung (repeat,wait,etc.)

Begonnen von FunkOdyssey, 05 Februar 2016, 14:31:59

Vorheriges Thema - Nächstes Thema

FunkOdyssey

Hallo miteinander,

ich habe ein Problem mit einem meiner Alarm-DOIFs und würde mich freuen, wenn ich hierzu eine zweite Meinung erhalten könnte. Ich habe das DOIF hier mal recht schlank dargestellt. In Wirklichkeit ist das Ding komplexer.


(
[Alarm] eq "ausgeloest" ...
)

(
set BuzzerWarnung on-for-timer 2,
{Log 3, "Alarmsystem: Auslösung registriert. Countdown läuft."}
)

(
set Sirene on-for-timer 120,
{Log 3, "Alarmsystem: Auslösung der Sirene."}
)


Mit folgenden Attributen habe ich es ausprobiert:

Attributes:
   cmdpause   30
   do         always
   repeatsame 3
   repeatcmd 60
   wait       0,60:0:0


Ich habe dabei folgende Wünsche/Anforderungen/Probleme:

  • Beim der verzögerten Auslösung soll erst einmal 60sec gewartet werden. Es wird ein Warn-Buzzer ausgelöst.
  • Eine erneute Auslösung (Motion, Türkontakt, etc.) soll nicht wieder bei der Warnung (cmd1_1) anfangen
  • Die Sirene (cmd1_2) soll max. dreimal ausgelöst werden. Pause von 30sec.
  • repeatcmd darf nicht die Warnung/Buzzer (cmd1_1) repeaten, sondern die Sirene (cmd1_2)

Kann mir jemand helfen? Danke.

Ellert

Das könnte Deiner Vorstellung nahe kommen, allerdings kann die Sirene maximal 5x und minimal 2x ertönen.

di DOIF ([Alarm] eq "ausgelöst" and ([?di] eq "cmd_3" or [di] eq "initialized"))

   (set BuzzerWarnung on-for-timer 2) (set Sirene on-for-timer 120) (set Sirene on-for-timer 120) (set Sirene on-for-timer 120)

DOELSEIF ([Alarm] eq "ausgelöst" and ( [?di] eq "cmd_1" or [?di] eq "cmd_2"))

   (set Sirene on-for-timer 120)

DOELSEIF ([AlarmReset])

wait 60,140,140,140
repeatcmd 0:140
repeatsame 0:2

Ellert

Ich könnte noch folgendes anbieten:
di1 DOIF ([Alarm] eq "ausgelöst")
   ((IF ([di1:count] == 0)(set BuzzerWarnung on-for-timer 2, setreading di1 count 1)))
   ((IF ([di1:count] > 1 and [di1:count] < 4)(set Sirene on-for-timer 120, setreading di1 count {([di1:count] +1)})))
DOELSEIF ([AlarmReset]) (setreading di1 count 0)

repeatcmd 90
repeatsame 3
wait 0,60:0

FunkOdyssey

Hey, danke für deine Tipps.
Nur finde ich es merkwürdig, wenn man den State des DOIFs abfragen muss oder sich Hilfsvariablen bauen muss.
Alle diese Dinge sollten eigentlich mit "cmdpause, repeatsame, repeatcmd, wait" möglich sein.
Ich werde mir mal ein Hilfs-DOIF basteln und schrittweise debuggen. Wenn ich einen Ansatz finde, dann schreibe ich das hier rein.

FunkOdyssey

Schade, ich habe mal ein ganz einfaches DOIF gebastet, um die Auswirkungen der Attribute testen zu können. Leider läuft das DOIF auch dreimal in einer Schleife ab. "repeatcmd" fängt also wieder ganz vorne an.

@Damian:
Könnte man "repeatcmd" evtl. erweitern, indem man die Wiederholungen der einzelnen Sequenzen getrennt festlegen kann?  Also "repeatcmd 0,3"?

Internals:
   CFGFN
   DEF        (
[test_alarm] eq "ausgeloest"
)

(
{Log 3, "Test-Alarmsystem: Auslösung registriert. Countdown läuft."}
)

(
{Log 3, "Test-Alarmsystem: Auslösung der Sirene."}
)
DOELSE
   NAME       test_di_sirene
   NR         1557
   NTFY_ORDER 50-di_du_sirene
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-02-08 12:17:06   Device          test_alarm
     2016-02-08 12:19:06   cmd_event       test_alarm
     2016-02-08 12:19:06   cmd_nr          1
     2016-02-08 12:19:06   cmd_seqnr       2
     2016-02-08 12:17:06   e_test_alarm_STATE ausgeloest
     2016-02-08 12:19:06   state           cmd_1
     2016-02-08 12:19:36   wait_timer      no timer
   Condition:
     0          InternalDoIf('test_alarm','STATE','',AttrVal($hash->{NAME},'notexist',undef)) eq "ausgeloest"
   Devices:
     0           test_alarm
     all         test_alarm
   Do:
     0:
       0          {Log 3, "Test-Alarmsystem: Auslösung registriert. Countdown läuft."}
       1          {Log 3, "Test-Alarmsystem: Auslösung der Sirene."}
     1:
       0
   Helper:
     event      ausgeloest
     globalinit 1
     last_timer 0
     sleepdevice test_alarm
     sleepsubtimer -1
     sleeptimer -1
     timerdev   test_alarm
     timerevent ausgeloest
     triggerDev test_alarm
     timerevents:
       ausgeloest
     triggerEvents:
       ausgeloest
   Internals:
     0           test_alarm:STATE
     all         test_alarm:STATE
   Itimer:
   Readings:
   Regexp:
     0:
     All:
   State:
   Timerfunc:
   Trigger:
Attributes:
   do         always
   repeatcmd  30
   repeatsame 3
   wait       0,20



2016.02.08 12:17:06 3: Test-Alarmsystem: Auslösung registriert. Countdown läuft.
2016.02.08 12:17:26 3: Test-Alarmsystem: Auslösung der Sirene.
2016.02.08 12:17:56 3: Test-Alarmsystem: Auslösung registriert. Countdown läuft.
2016.02.08 12:18:16 3: Test-Alarmsystem: Auslösung der Sirene.
2016.02.08 12:18:46 3: Test-Alarmsystem: Auslösung registriert. Countdown läuft.
2016.02.08 12:19:06 3: Test-Alarmsystem: Auslösung der Sirene.

Damian

Zitat von: FunkOdyssey am 08 Februar 2016, 12:23:14
Schade, ich habe mal ein ganz einfaches DOIF gebastet, um die Auswirkungen der Attribute testen zu können. Leider läuft das DOIF auch dreimal in einer Schleife ab. "repeatcmd" fängt also wieder ganz vorne an.

@Damian:
Könnte man "repeatcmd" evtl. erweitern, indem man die Wiederholungen der einzelnen Sequenzen getrennt festlegen kann?  Also "repeatcmd 0,3"?


Kann man bestimmt. Ich habe aber erst mal andere Verpflichtungen.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey


Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

Danke, das hatte ich auch insgeheim angenommen. Das reicht mir auch schon. Ich kann warten. Kein Stress, Damian. :-)

Rampler

@Damian,
ich weiß, das ist schon ein paar Jahre her.
Ist die  repeatcmd Erweiterung nun endgültig vom Tisch ?
VG Klaus
3 HMUART (2 via ESP8266), 1 DUOFERN, 9 ESP8266, RPI2 (Bullseye), ZWAVE, HM-Classic, und hoch zufrieden ...
Danke an alle, die was dazu beigetragen haben !!

Damian

#10
Zitat von: Rampler am 27 August 2021, 12:10:13
@Damian,
ich weiß, das ist schon ein paar Jahre her.
Ist die  repeatcmd Erweiterung nun endgültig vom Tisch ?
VG Klaus

Eigentlich habe ich es ja schon indirekt beantwortet - im DOIF-FHEM-Modus geht es nicht, weil entweder würden folgende Befehle einer Sequenz nicht zum Zuge kommen (sequentielle Reihenfolge) oder man müsste mehrere Timer verwalten, die gleichzeitig laufen - im DOIF-FHEM-Modus gibt es nur einen (wait-) Timer.

Im DOIF-Perlmodus kannst du es realisieren. Dort kann man beliebig viele Wiederholungen gleichzeitig laufen lassen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF