Problem bei DOIF mit verschiedenen Bedingungen

Begonnen von hermann1514, 21 November 2016, 10:50:31

Vorheriges Thema - Nächstes Thema

hermann1514

Hallo,

ich möchte gerne folgendes Szenario abbilden:

Die Lampe in der Küche soll angehen und auch anbleiben, wenn das Radio an ist (STATE:ON).
Wenn das Radio nicht an ist, soll das Licht nur angehen, wenn der Bewegungsmelder (Homematic) Bewegung erkennt.
Das Licht soll dann ausgehen, wenn der Bewegungsmelder seit 5 Minuten keine Bewegung erkannt hat.

Ich hatte das mal mit einem Watchdog versucht - klappte aber nicht wirklich zufriedenstellend.

Das sollte doch auch mit einem DOIF möglich sein? - ODer?

Hier mal mein aktuelles DOIF:

([SB_Kueche] eq "on") (set eg.ku.fs.lampe_fenster on) DOELSEIF
([HM_BWGM_KUECHE:state] eq "motion") (set eg.ku.fs.lampe_fenster on) DOELSE
(set eg.ku.fs.lampe_fenster off)


Danke.
Gruß
Hermann


kumue

Zitat von: hermann1514 am 21 November 2016, 10:50:31
Das sollte doch auch mit einem DOIF möglich sein? - ODer?

Ja. Hast Du es denn schon ausprobiert ?
Syntax selbst sie ok aus.

Per

Zitat von: kumue am 21 November 2016, 12:55:31Syntax selbst sie ok aus.
Wobei sich die beiden ersten Fälle zusammenfassen ließen.

Ansonsten sind die HM-Bewegungsmelder ausreichend oft Thema bei DOIF gewesen, um zu sehen, wie mit deren Events umgegangen werden muss.

hermann1514

Danke,

im Moment ist es so dass das Licht angeht wenn das Radio an ist.
Soweit so gut. Wenn jedoch jetzt eine Bedingung "Bewegung erkannt" wird und nach 4 Minuten keine weitere Bewegung, dann schaltet sich das Licht ab obwohl das Radio angeschaltet ist.

Das sollte doch nicht sein - oder?

Gruß
Hermann

Beta-User

Warum eigentlich kein simples notify auf den Bewegungsmelder?
Dann ein IF: Ist das Radio an -> Licht einschalten, ELSE per defmod ein at mit +4 Minuten zum ausmachen.
Wird dazwischen weiter getriggert, verschiebt sich das at wieder usw.. Man müßte nur das at wieder löschen für den Fall, dass in den 4 Minuten jemand das Radio anmacht. Aber auch das könnte man abfangen, wenn man das notify auch mit einer 2. Bedingung (Radio geht an) triggert und evtl. mehr Abragezweige in den Ausführungsteil einbaut.

Oder ist das zu einfach gedacht?

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

hermann1514

Es gibt sicherlich mehrere Wege. Aber ich möchte gerne DOIF nutzen, da ich dies als ein mächtiges Tools sehe. Um dann später mal alles einheitlich zu haben würde ich wenn es geht alles über DOIF's steuern.

Beta-User

Absolut richtig: DOIF ist sehr mächtig.
Es hat nur den Nachteil, dass die Zahl der Optionen und vor allem der Kombinationsmöglichkeiten der Optionen sehr groß ist.

Daher wollte ich nur darauf hinweisen, dass es auch andere Möglichkeiten gibt, Dein Problem zu lösen. Aber da Du das offenslichtlich weißt, bitte ich um Verzeihung für den freundlich gemeinten Hinweis.

Gruß,
Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

l2r

hi,

ich würde es so machen:

([SB_Kueche] eq "on" or [HM_BWGM_KUECHE:state] eq "motion") (set eg.ku.fs.lampe_fenster on)
DOELSE (set eg.ku.fs.lampe_fenster off)


dein Problem sind die Trigger.
SB_Kueche triggert das "on" einmal. Dann schaltet sich das Licht ein. Triggert dann der Bewegungsmelder gehts bei deinem DOIF in den DOELSEIF-Fall. nach 4 Minuten triggert der Bewegungsmelder, dass er keine Bewegung erkannt hat. Der DOELSEIF-Fall ist also nicht mehr wahr. Da SB_Kueche aber nicht nochmal. Somit wird in den DOELSE-Fall gegangen.

Fragst du alles in einer Bedingung ab, so wird die gesamte Bedingung gecheckt, wenn eines der Devices triggert.

Alternativ kannst du das Attribut checkall setzen. Ich glaub das ist aber noch nicht offiziell.

Gruß Michael
Wissen ist Macht.
Ich weiß nix.
Macht nix.

Beta-User

Zitat von: hermann1514 am 21 November 2016, 10:50:31
([SB_Kueche] eq "on") (set eg.ku.fs.lampe_fenster on) DOELSEIF
([HM_BWGM_KUECHE:state] eq "motion") (set eg.ku.fs.lampe_fenster on) DOELSE
(set eg.ku.fs.lampe_fenster off)

Es sollte am Ende nicht DOELSE heißen, sondern da gehört noch eine doppelte Abfrage hin: Radio ist aus ohne Trigger "[?...]" und Bewegungsmelder auch "off", ggf. noch in Verbindung mit einem Wait-Attribut, je nachdem wie lange der Bewegungsmelder braucht, um ein off zu senden. DOELSE dann wieder ohne Ausführungscode ans Ende.

Zitat von: l2r am 21 November 2016, 14:57:41
([SB_Kueche] eq "on" or [HM_BWGM_KUECHE:state] eq "motion") (set eg.ku.fs.lampe_fenster on)
DOELSE (set eg.ku.fs.lampe_fenster off)

So geht das Licht aber auch an, wenn man das Radio anmacht, oder ;). Wird wohl eher nicht gewünscht sein....
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

l2r

Wissen ist Macht.
Ich weiß nix.
Macht nix.

Beta-User

Zitat von: l2r am 21 November 2016, 15:15:39
ähm doch?? ist doch die erste Bedingung?
Ganz am Anfang schrieb der TE: "wenn das Radio an ist (STATE:ON)." Dein Vorschlag fragt aber doch ab, ob das Radio in den Zustand "on" wechselt und triggert damit genauso wie der Bewegungsmelder. Triggern sollte aber doch nur letzterer, oder habe ich das falsch verstanden?

Na ja, DOIF ist wirklich einfach ;D, wenn man weiß, was man eigentlich machen will und in welcher Reihenfolge welche Bedingungen zuschlagen sollen bzw. abgefragt werden.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

l2r

ja ok, kann man so interpretieren. Ich hab mich da vllt. ein bisschen zu nah an dem Code gehalten, weil er da ja abfragt ob das Radio in den State on wechselt und er mit diesem Teil keine Probleme hatte...

[?SB_Kueche] eq "on" or [HM_BWGM_KUECHE:state] eq "motion") (set eg.ku.fs.lampe_fenster on)
DOELSE (set eg.ku.fs.lampe_fenster off)

So wäre es dann nicht triggernd...;)

Andererseits weiß ich nicht wie er das Radio anschaltet, falls manuell, dann sollte zwangsläufig auch ne Bewegung erkannt worden sein ;-)
Wissen ist Macht.
Ich weiß nix.
Macht nix.

Beta-User

Stimmt irgendwie auch, die Eingangsbedingung mit dem Radio war ja erst drin.

Also munteres Weiterraten, es müßte also insgesamt so aussehen:
([HM_BWGM_KUECHE:state] eq "motion") (set eg.ku.fs.lampe_fenster on) DOELSEIF ([HM_BWGM_KUECHE:state] ne "motion" and
[?SB_Kueche] ne "on") (set eg.ku.fs.lampe_fenster off) DOELSE


Evtl. kann man den SB_Kueche auch triggernd nach "off" abfragen, dann geht das Licht (vielleicht besser nach einem wait) aus, wenn man das Radio ausmacht. Aber fragt mich nicht nach den waits, do always etc.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

l2r

DOELSE kannst du auch weglassen und wenn du schon nach ne "on" fragst, dann würde ich das auch triggernd machen...

mit wait wäre es dann

attr XXX wait 0:120 für 2 min wait.

DO always wird nicht benötigt.
Wissen ist Macht.
Ich weiß nix.
Macht nix.

Beta-User

Zitat von: l2r am 21 November 2016, 16:12:05
DOELSE kannst du auch weglassen

Irgendwie habe ich mir das angewöhnt, DOIF grundsätzlich immer in einen definierten Zustand (hier: cmd_3) zu schicken, wenn irgendwann zwischenzeitlich keiner der definierten Zustände eintreten kann. Das macht es m.E. leichter, wenn man später irgendwelche Änderungen macht, von denen man eigentlich annimmt, dass sie problemlos wären, die aber halt doch das Triggerverhalten ändern. Und: schaden tut es selten, fehlt es, ist man versucht, evtl. ein "do always" zu setzen.

Und übrigens: Es ist nicht mein DOIF, ich brauche nichts wegzulassen ;). Ich werde eher zukünftig mal die paar DOIF, die ich definiert habe, in andere Syntax umwandeln. Das verstehe ich so langsam aber sicher besser, jedenfalls dann, wenn ich mir Gedanken gemacht habe, was ich eigentlich in welcher Abhängigkeit schalten will...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors