Hauptmenü

Bestimmtes DOIF benötigt...

Begonnen von misux, 28 Februar 2021, 01:29:52

Vorheriges Thema - Nächstes Thema

misux

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...

Ellert

#1
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!

misux

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!

Gisbert

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​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Damian

Zitat aus der Commandref zu DOIF:

Zitat$cmd
Perl-Variablen mit der Bedeutung [$SELF:cmd]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stelaku

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

Per

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).