DOIF mit teilweiser Verzögerung

Begonnen von z0lt1, 23 Juli 2018, 00:54:11

Vorheriges Thema - Nächstes Thema

z0lt1

Hallo Zusammen,

nachdem ich immer mehr begeistert bin was mit dem DOIF Modul alles funktioniert und wie mächtig das Modul ist komme ich gerade trotzdem nicht weiter.

Was möchte ich realisiere? --> Eine Alarmanlage. Scharf geschalten wird das ganze über einen Button "Schalter.Alarmanlage", und wenn alle Kontakte geschlossen sind, dann wird die Alarmanlage scharf. Wenn ich das Haus nun verlasse, dann drücke ich noch im Haus, auf den Knopf "Schalter.Alarmanlage" und verlasse dann das Haus, d.h. ich möchte eine Ansage erhalten dass die Anlage scharf geschalten wurde, diese soll aber tatsächlich erst nach 60 Sekunden wirklich scharf sein.

Wie kann ich das realisieren? Ich denke mal da fehlt irgendwo ein "wait", ich steh nur gerade absolut auf dem Schlauch ...

Hier die List des DOIFs:
Internals:
   CFGFN     
   DEF        ([Schalter.Alarmanlage] eq "on" and [haus_TuerKontakt.Alle] eq "open" and $cmd=~"0|1|5") (
set MyTTS volume 5,
#set MyTTS tts "Fehler, Alarmanlage kann nicht aktiviert werden da nicht alle Türen geschlossen sind"
)

DOELSEIF ([Schalter.Alarmanlage] eq "on" and [haus_TuerKontakt.Alle] eq "closed" and $cmd=~"0|1|5")
(set MyTTS volume 5,
set MyTTS tts "Alarmanlage ist scharf geschaltet"
)

DOELSEIF ([Schalter.Alarmanlage] eq "on" and [haus_TuerKontakt.Alle] eq "closed" and $cmd=="2") (
set MyTTS volume 5,
#set MyTTS tts "Alarmanlage ist bereits aktiv"
)

DOELSEIF ([Schalter.Alarmanlage] eq "on" and [haus_TuerKontakt.Alle] eq "open" and $cmd=~"2|3") (
set MyTTS volume 5,
#set MyTTS tts "Alarm ausgelöst",
set ku_Steckdose.LEDFenster on
)

DOELSEIF ([Schalter.Alarmanlage] eq "off") (
set MyTTS volume 5,
#set MyTTS tts "Alarmanlage wurde deaktiviert"
)
   NAME       di_Alarmanlage
   NR         2158
   NTFY_ORDER 50-DOIF_Alarmmeldung
   STATE      Alarmanlage aus
   TYPE       DOIF
   READINGS:
     2018-07-23 00:44:48   Device          Schalter.Alarmanlage
     2018-07-23 00:44:48   cmd             5
     2018-07-23 00:44:48   cmd_event       Schalter.Alarmanlage
     2018-07-23 00:44:48   cmd_nr          5
     2018-07-23 00:44:48   e_Schalter.Alarmanlage_STATE off
     2018-07-23 00:44:46   e_haus_TuerKontakt.Alle_STATE closed
     2018-07-23 00:44:21   mode            enabled
     2018-07-23 00:44:48   state           Alarmanlage aus
     2018-07-23 00:44:48   wait_timer      no timer
   Regex:
   condition:
     0          InternalDoIf($hash,'Schalter.Alarmanlage','STATE') eq "on" and InternalDoIf($hash,'haus_TuerKontakt.Alle','STATE') eq "open" and $cmd=~"0|1|5"
     1          InternalDoIf($hash,'Schalter.Alarmanlage','STATE') eq "on" and InternalDoIf($hash,'haus_TuerKontakt.Alle','STATE') eq "closed" and $cmd=~"0|1|5"
     2          InternalDoIf($hash,'Schalter.Alarmanlage','STATE') eq "on" and InternalDoIf($hash,'haus_TuerKontakt.Alle','STATE') eq "closed" and $cmd=="2"
     3          InternalDoIf($hash,'Schalter.Alarmanlage','STATE') eq "on" and InternalDoIf($hash,'haus_TuerKontakt.Alle','STATE') eq "open" and $cmd=~"2|3"
     4          InternalDoIf($hash,'Schalter.Alarmanlage','STATE') eq "off"
   devices:
     0           Schalter.Alarmanlage haus_TuerKontakt.Alle
     1           Schalter.Alarmanlage haus_TuerKontakt.Alle
     2           Schalter.Alarmanlage haus_TuerKontakt.Alle
     3           Schalter.Alarmanlage haus_TuerKontakt.Alle
     4           Schalter.Alarmanlage
     all         Schalter.Alarmanlage haus_TuerKontakt.Alle
   do:
     0:
       0           set MyTTS volume 5, #set MyTTS tts "Fehler, Alarmanlage kann nicht aktiviert werden da nicht alle Türen geschlossen sind"
     1:
       0          set MyTTS volume 5, set MyTTS tts "Alarmanlage ist scharf geschaltet"
     2:
       0           set MyTTS volume 5, #set MyTTS tts "Alarmanlage ist bereits aktiv"
     3:
       0           set MyTTS volume 5, #set MyTTS tts "Alarm ausgelöst", set ku_Steckdose.LEDFenster on
     4:
       0           set MyTTS volume 5, #set MyTTS tts "Alarmanlage wurde deaktiviert"
     5:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      off
     globalinit 1
     last_timer 0
     sleepdevice haus_TuerKontakt.Alle
     sleepsubtimer 0
     sleeptimer -1
     timerdev   Schalter.Alarmanlage
     timerevent off
     triggerDev Schalter.Alarmanlage
     timerevents:
       off
     timereventsState:
       state: off
     triggerEvents:
       off
     triggerEventsState:
       state: off
   internals:
     0           Schalter.Alarmanlage:STATE haus_TuerKontakt.Alle:STATE
     1           Schalter.Alarmanlage:STATE haus_TuerKontakt.Alle:STATE
     2           Schalter.Alarmanlage:STATE haus_TuerKontakt.Alle:STATE
     3           Schalter.Alarmanlage:STATE haus_TuerKontakt.Alle:STATE
     4           Schalter.Alarmanlage:STATE
     all         Schalter.Alarmanlage:STATE haus_TuerKontakt.Alle:STATE
   itimer:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   cmdState   Fehler bei Aktivierung|Alarmanlage scharf|Alarmanlage scharf|Alarmanlage wurde ausgelöst|Alarmanlage aus
   do         always
   repeatcmd  0:0:0:5:0
   room       00_Kontrollzentrum

CoolTux

So ein Zufall, das Attribut heißt wait
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

z0lt1

Ach ne, so weit war ich auch schon  :P Aber bei welcher cmd muss ich das einfügen, denn ich will ja die Ansage dass die Alarmanlage scharf ist sofort beim Knopfdruck haben, die Anlage soll aber erst nach 60 Sekunden scharf sein so dass ich Zeit habe um aus dem Haus zu gehen.

CoolTux


DOELSEIF ([Schalter.Alarmanlage] eq "on" and [haus_TuerKontakt.Alle] eq "closed" and $cmd=~"0|1|5")
(set MyTTS volume 5,set MyTTS tts "Alarmanlage ist scharf geschaltet")
(set Alarm on)


attr di_Alarmanlage wait 0:0,30


Siehe http://commandref.fhem.de/commandref_DE.html#DOIF_wait
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

z0lt1

Okay, dann würde ich das nach deinem Vorschlag mal vereinfacht auf drei CMDs so umbauen:
([Schalter.Alarmanlage] eq "on")
(set MyTTS volume 5,set MyTTS tts "Alarmanlage wird in 30 Sekunden scharf geschaltet")
(set MyTTS tts "ALARMANLAGE IST SCHARF"))

DOELSEIF ([Schalter.Alarmanlage] eq "on" and [haus_TuerKontakt.Alle] eq "open")
(set MyTTS volume 100,
set MyTTS tts "Alarm ausgelöst")

DOELSEIF ([Schalter.Alarmanlage] eq "off")
(set MyTTS volume 5,
set MyTTS tts "Alarmanlage wurde deaktiviert")

attr di_Alarmanlage wait 0,30:0:0
attr repeatcmd  0:5:0


Aber wird dann nicht beim Öffnen eines Kontaktes trotzdem schon der CMD_2 (in welchem der Alarm ausgelöst wird) ausgelöst, oder wird erst gewartet bis CMD_1 (also die 30 Sekunden) abegearbeitet sind, bevor wieder auf ein evtl. zutreffendes Event reagiert wird?

CoolTux

die letzten nullen könne weg ansonsten sollte es so gehen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

z0lt1

Okay, ich habe jedoch auch das hier in der CommandRef gefunden:
...Eine bereits ausgelöste Verzögerung wird zurückgesetzt, wenn während der Wartezeit ein Kommando eines anderen DO-Falls, ausgelöst durch ein neues Ereignis, ausgeführt werden soll.

Ich probiere es heute Abend mal aus und werde dann berichten. Danke schon mal für die Unterstützung!

RaspiLED

Hi,

warum nutzt Du nicht ein at +0:01 mit dem Kommando?

Gruß Arnd


Gesendet von iPhone mit Tapatalk
Raspberry Pi mit FHEM, CUL, Signalduino, MySensors, HomeBridge, Presence, WifiLight2, Bravia, ...

Frank_Huber

Ich denke da ist nen Denkfehler drin.
Der Schalter.... Sollte nur zum schärfen genommen werden.
Ich würde einen zweiten dummy "Status_EMA" anlegen und diesen in cmd2 usw abfragen.
Cmd1 muss den dann nach den 60sek setzen.

Gesendet von meinem Doogee S60 mit Tapatalk


rabehd

ZitatAber wird dann nicht beim Öffnen eines Kontaktes trotzdem schon der CMD_2 (in welchem der Alarm ausgelöst wird) ausgelöst, oder wird erst gewartet bis CMD_1 (also die 30 Sekunden) abegearbeitet sind, bevor wieder auf ein evtl. zutreffendes Event reagiert wird?

Ich fage nicht nur die auslösenden Kontakte ab, sondern auch ob die Alarmanlage auch scharf ist.
Auch funktionierende Lösungen kann man hinterfragen.

z0lt1

#10
Zitat von: RaspiLED am 23 Juli 2018, 12:25:20
Hi,

warum nutzt Du nicht ein at +0:01 mit dem Kommando?

Gruß Arnd


Gesendet von iPhone mit Tapatalk
Meinst du das anstatt der wait-Funktion?

Zitat von: Frank_Huber am 23 Juli 2018, 12:36:08
Ich denke da ist nen Denkfehler drin.
Der Schalter.... Sollte nur zum schärfen genommen werden.
Ich würde einen zweiten dummy "Status_EMA" anlegen und diesen in cmd2 usw abfragen.
Cmd1 muss den dann nach den 60sek setzen.

Gesendet von meinem Doogee S60 mit Tapatalk


Ich hätte das gerne ohne dummy gelöst, DOIF gibt das ja eigentlich her, indem man den eigenen Status, also das aktuelle Kommando abfragen kann z.B. cmd=~"0|3")

Zitat von: rabehd am 23 Juli 2018, 12:45:49
Ich fage nicht nur die auslösenden Kontakte ab, sondern auch ob die Alarmanlage auch scharf ist.
Wieder ein Punkt der für die Erstellung eines Dummys spricht.

Ich kann meinen Code oben erst heute Abend ausprobieren, aber ich denke inzwischen dass er nicht funktionieren wird, da CMD_1 immer zutrifft, wenn CMD_2 auch aktiv ware. Somit würde aber CMD_2 nie in Kraft treten weil das DOIF bei CMD_1 schon stopppt.

Ich denke ich muss trotzdem den CMD_1 ergänzen mit

([Schalter.Alarmanlage] eq "on" and $cmd=~"0|3")
(set MyTTS volume 5,set MyTTS tts "Alarmanlage wird in 30 Sekunden scharf geschaltet")
(set MyTTS tts "ALARMANLAGE IST SCHARF")
...
attr di_Alarmanlage wait 0,30:0:0
...


Bleibt trotzdem die Frage ob CMD_2 dann, falls die Bedinungung innerhalb der ersten 30 Sekunden schon zutrifft auslöst, oder ich die 30 Sekunden Zeit um die Tür zu schließen...

Frank_Huber

#11
Zitat von: z0lt1 am 23 Juli 2018, 13:14:40
Ich hätte das gerne ohne dummy gelöst, DOIF gibt das ja eigentlich her, indem man den eigenen Status, also das aktuelle Kommando abfragen kann z.B. cmd=~"0|3")
Du müsstest aber abfragen ob cmd 1.2 erreicht ist. cmd1 alleine reicht ja nicht. cmd2 darf erst anschlagen können wenn der zweite befehl von cmd1 raus ist.
und sobald cmd 2 erreicht ist wäre das wieder unwahr. anstelle eines weiteren dummy kannst auch ein DOIF-reading setzen.

z0lt1

So, wollte kurz Rückmeldung geben, dass es jetzt so funktioniert wie es soll. Der Hinweis mit cmd_1.2 hat mich zum Ziel gebracht. Vielen Dank nochmal an alle für die Mithilfe, das ist das beste Forum hier!

([Schalter.Alarmanlage] eq "on" and [haus_TuerKontakt.Alle] eq "open" and $cmd=~"0|4")
(set MyTTS volume 5,
set MyTTS tts "Achtung, es sind nicht alle Türen geschlossen, Alarmanlage wird in 60 Sekunden scharf geschaltet")
(set MyTTS tts "Alarmanlage ist nun scharf geschalten")

DOELSEIF ([Schalter.Alarmanlage] eq "on" and [haus_TuerKontakt.Alle] eq "closed" and $cmd=~"0|4")
(set MyTTS volume 5,
set MyTTS tts "Alarmanlage wird in 60 Sekunden scharf geschaltet")
(set MyTTS tts "Alarmanlage ist nun scharf geschalten")

DOELSEIF ([Schalter.Alarmanlage] eq "on" and [haus_TuerKontakt.Alle] eq "open" and $cmd=~"1.2|2.2")
(set MyTTS volume 5,
set MyTTS tts "Alarm wurde ausgelöst")

DOELSEIF ([Schalter.Alarmanlage] eq "off")
(set MyTTS volume 5,
set MyTTS tts "Alarmanlage wurde deaktiviert")