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.
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
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
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.
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.
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
Alles klar.
Danke, das hatte ich auch insgeheim angenommen. Das reicht mir auch schon. Ich kann warten. Kein Stress, Damian. :-)
@Damian,
ich weiß, das ist schon ein paar Jahre her.
Ist die repeatcmd Erweiterung nun endgültig vom Tisch ?
VG Klaus
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.