FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: misux am 28 Februar 2021, 01:29:52

Titel: Bestimmtes DOIF benötigt...
Beitrag von: misux am 28 Februar 2021, 01:29:52
HI. Sorry mir fällt irgendwie kein vernünftiger Titel dafür ein...

Ich habe 2 Türen: Tür1 und Tür2

Ist es möglich ein DOIF zu erstellen das ein SET Befehl ausführt wenn:

Tür1 auf UND zu geht und dann im ANSCHLUSS Tür2 auf UND zu geht...?

Also es muss exakt das passieren und auch in dieser Reihenfolge, dann müsste ich ein set Befehl bekommen...
Der Befehl müsste also gesendet werden wenn die zweite Tür zu gegangen ist und alle vorherigen zustände auch passiert sind in dieser Reihenfolge..
::)Jungeeee, hoffentlich versteht das einer... ;D

Wie müsste so ein DOIF aussehen? Irgendwie komme ich da nicht weiter...
Titel: Antw:Bestimmtes DOIF benötigt...
Beitrag von: Ellert am 28 Februar 2021, 05:53:24
Im einfachsten Fall

([T1] eq 'auf' and ($cmd == 4 or $cmd == 0))
DOELSEIF ([T1] eq 'zu' and $cmd == 1)
DOELSEIF ([T2] eq 'auf' and $cmd == 2)
DOELSEIF ([T2] eq 'zu' and $cmd ==  3 ) (set ...)

Ungetestet!
Titel: Antw:Bestimmtes DOIF benötigt...
Beitrag von: misux am 28 Februar 2021, 08:41:18
Krasser Code! Vielen Dank! werde es mal testen...
Hättest du Lust mir den zu erklären? Weil verstehe den nicht so richtig... :-X eigentlich gar nicht...Was bedeutet cmd==1 usw?

Dakneschön!
Titel: Antw:Bestimmtes DOIF benötigt...
Beitrag von: Gisbert am 28 Februar 2021, 09:27:44
Hallo misux,
hallo Ellert,

$cmd == 1
würde mich auch interessieren.

Ich nutze innerhalb eines DOIFs folgende Abfrage:
[$SELF:cmd_nr] =~ ("1|2")
oder auch mit < oder > Zeichen, mit den == stehe ich gelegentlich auf Kriegsfuß.
Die Erklärung hier ist, wenn cmd_nr auf 1 oder 2 steht, wird diese Bedingung wahr.

Viele​ Grüße​ Gisbert​
Titel: Antw:Bestimmtes DOIF benötigt...
Beitrag von: Damian am 28 Februar 2021, 09:29:14
Zitat aus der Commandref zu DOIF:

Zitat$cmd
Perl-Variablen mit der Bedeutung [$SELF:cmd]
Titel: Antw:Bestimmtes DOIF benötigt...
Beitrag von: Stelaku am 28 Februar 2021, 15:19:57
Hallo misux

Das Beispiel von Ellert funktioniert nach einem Abfolge Prinzip.

Bedingung 1 wird nur möglich wenn Bedingung 0 oder 4
Bedingung 2 nur wenn 1 schon ist und so weiter
wobei das in diesem Fall das Reading cmd_nr vom DOIF ist



([T1] eq 'auf' and ($cmd == 4 or $cmd == 0))       ## erster Befehlszweig wird nur ausgeführt wenn Bedingung T1 auf ist und das DOIF cmd_nr 4 oder 0 hat
DOELSEIF ([T1] eq 'zu' and $cmd == 1)              ##  zweiter Zweig wird erst ausgeführt wenn Bedingung T1 zu ist und das DOIF cmd_nr 1 hat                     
DOELSEIF ([T2] eq 'auf' and $cmd == 2)             ## dritter Zweig wird erst ausgeführt wenn Bedingung T2 auf ist und das DOIF cmd_nr 2 hat
DOELSEIF ([T2] eq 'zu' and $cmd ==  3 ) (set ...)  ## vierte Zweig wird erst ausgeführt wenn Bedingung T2zu ist  und das DOIF cmd_nr 3 hat

Kleiner schönheitsfehler in diesem DOIF ist aber das Du Deine erste Tür bei dieser Programmierung immer wiedr auf und zu machen kannst.
Und dann die zweite öffnest wird der Befehl gesetzt. Es ist noch eine Abfrage die fehlt um Deine Sequenze wieder zurückzusetzten wenn die
Türen in einer anderen Reihenfolge geöffnet oder geschlossen werden.
Ich hab mal Ellert sein DOIF etwas abgeändert so funktioniert es in meiner Testumgebung


([T1] eq 'auf' and ($cmd == 4 or $cmd == 0 or $cmd == 2 or $cmd == 3))
DOELSEIF ([T1] eq 'zu' and $cmd == 1)
DOELSEIF ([T2] eq 'auf' and $cmd == 2)
DOELSEIF ([T2] eq 'zu' and $cmd ==  3 ) (set aktion on)


Es gibt aber auch die Möglichkeit das ganze mit dem Modul sequenze zu machen
würde dann z.b. so aussehen.


defmod Aktion sequence T1:auf 4 T1:zu 4 T2:auf 4 T2:zu


hier wird wenn T1 auf ist und inerhalb von 4 sekunden T1 wieder zu ist und dann inerhalb von 4 sekunden T2 auf geht und wieder nach 4 sekunden zu ist ein event gesetzt auf das man dann über ein
DOIF oder notify reagieren kann.
Für ein DOIF sähe das z.b. so aus


([Aktion:"^trigger$"]) (set irgentwas)


Viele Grüsse

Stephan
Titel: Antw:Bestimmtes DOIF benötigt...
Beitrag von: Per am 23 März 2021, 16:56:56
Zitat von: Stelaku am 28 Februar 2021, 15:19:57

([T1] eq 'auf' and ($cmd == 4 or $cmd == 0 or $cmd == 2 or $cmd == 3))

Oder

([T1] eq 'auf')

weil DOIF ohne do always eh $cmd == 1 ignoriert ;) (selbst wenn nicht, wäre das auch kein Problem).