Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten

Begonnen von X-Byte, 07 Oktober 2018, 01:07:32

Vorheriges Thema - Nächstes Thema

X-Byte

Ich habe einige Räume mit Bewegungsmeldern ausgestattet und in den Räumen eine oder auch mehrere Lichtquellen, welche ich bei dem motion Event der Bewegungsmelder einschalten möchte. Mit individuellen DOIFs für jeden Bewegungsmelder, bei dem jeweils im set-Teil eine Liste definierter Lichter angeschaltet wird habe ich mir anfänglich gebastelt und das funktioniert auch, ist aber nicht wirklich schick und noch weniger dynamisch, wenn mehr Bewegungsmelder, Lichter oder Räume hinzukommen.
So bin ich auf der Suche nach einem eleganten Weg, das ganze schlank und dynamisch umzusetzen - mir fehlt allerdings noch der richtige Ansatz/Weg dazu. Meine Suchen danach haben mich leider nicht weitergebracht oder ich suche falsch.

Von der Idee her stelle ich mir das so vor:
Alle Bewegungsmelder gehören der group "Bewegungsmelder" an
Alle Lichter gehören der group "Licht" an
Alle Geräte sind ihrem jeweiligen physikalischen Räumen per room zugeordnet.
Bei einem Event eines Bewegungsmelders soll das DOIF (?) alle Geräte der Gruppe Licht, welche dem gleichen Raum wie der auslösende Bewegungsmelder angehören, angeschaltet werden.

Für einen Hinweis wie ich das lösen könnte, wäre ich sehr dankbar

CoolTux

Für dynamische Steuerung bedarf es immer Eindeutigkeiten und Gemeinsamkeiten.
Eine wäre der Raum. Wenn ein Bewegungsmelder sich meldet musst Du rausfinden in welchen Raum der Melder ist und dann alle Lichter im selben Raum finden. Dazu müssen die Lichter aber auch erkennbar sein. Entweder am eindeutigen Namen oder anderen Kriterien.
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

Damian

Zitat von: CoolTux am 07 Oktober 2018, 07:50:52
Für dynamische Steuerung bedarf es immer Eindeutigkeiten und Gemeinsamkeiten.
Eine wäre der Raum. Wenn ein Bewegungsmelder sich meldet musst Du rausfinden in welchen Raum der Melder ist und dann alle Lichter im selben Raum finden. Dazu müssen die Lichter aber auch erkennbar sein. Entweder am eindeutigen Namen oder anderen Kriterien.

Die Eindeutigkeit ist in seiner Ausführung gegeben, daher reicht dazu ein Einzeiler:

   
DOIF {[":motion"];fhem_set"group=".AttrVal("$DEVICE","group","")." on"}

siehe: https://fhem.de/commandref_DE.html#DOIF_Perl_Modus

Den Trigger hier [":motion"] musst du ggf. an deinen Bewegungsmelder anpassen und wenn du den Ausdruck verstanden hast, kannst du dir die Definition für das Ausschalten überlegen ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CoolTux

Zitat von: Damian am 07 Oktober 2018, 10:44:56
Die Eindeutigkeit ist in seiner Ausführung gegeben, daher reicht dazu ein Einzeiler:

   
DOIF {[":motion"];fhem_set"group=".AttrVal("$DEVICE","group","")." on"}

siehe: https://fhem.de/commandref_DE.html#DOIF_Perl_Modus

Den Trigger hier [":motion"] musst du ggf. an deinen Bewegungsmelder anpassen und wenn du den Ausdruck verstanden hast, kannst du dir die Definition für das Ausschalten überlegen ;)

Du liest die Gruppe vom Bewegungsmelder aus? Ist das richtig? Aber wieso sollte der Bewegungsmelder in der selben Gruppe sein wie die Lampen?
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

Damian

Zitat von: CoolTux am 07 Oktober 2018, 10:47:43
Du liest die Gruppe vom Bewegungsmelder aus? Ist das richtig? Aber wieso sollte der Bewegungsmelder in der selben Gruppe sein wie die Lampen?

Ja, du hast recht, das wäre die Zuordnung über die gleiche Gruppe.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CoolTux

Zitat von: Damian am 07 Oktober 2018, 10:51:16
Ja, du hast recht, das wäre die Zuordnung über die gleiche Gruppe.

Sorry aber in meinen Augen wäre das unlogisch. Wie gesagt "in meinen".
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

Damian

Zitat von: CoolTux am 07 Oktober 2018, 10:55:13
Sorry aber in meinen Augen wäre das unlogisch. Wie gesagt "in meinen".

Es würde auch ohne weitere Zuordnung einfach funktionieren wenn man set room=... and group=... angeben könnte, so viel ich weiß, kann man bei set höchstens nur eins von beiden angeben.

Es ist mit einer zusätzliche Definition verbunden, dennoch kann man logisch Lampen des Raums Wohnzimmer (Gruppe Licht) in eine zusätzliche Gruppe Wohnzimmer mit dem Bewegungsmelder packen. Das eine schließt das andere nicht aus. Eine Gruppe soll eine logische Zusammengehörigkeit symbolisieren und das ist nicht nur auf die Geräteart beschränkt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CoolTux

Du kannst bei set auch mit mehreren FILTER arbeiten.

set group=Licht:FILTER=room=Wohnzimmer:FILTER=state!=on on


Es ist natürlich kein Problem mehrere Gruppen einem Device zu geben. Problem dabei ist nur das es dann in den jeweiligen Raum 2 mal gelistet wird, daher mache ich persönlich sowas eher ungern.

Grüße
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

Frank_Huber

Könnte man den set Befehl nicht einfach auf den Raum loslassen? Die Bewegungsmelder können ja denke ich damit nichts anfangen und würden ihn ignorieren.

Gesendet von meinem Doogee S60 mit Tapatalk


CoolTux

Zitat von: Frank_Huber am 07 Oktober 2018, 11:21:24
Könnte man den set Befehl nicht einfach auf den Raum loslassen? Die Bewegungsmelder können ja denke ich damit nichts anfangen und würden ihn ignorieren.

Gesendet von meinem Doogee S60 mit Tapatalk



Du würdest eine Fehlermeldung im Log erhalten.
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

Frank_Huber

Zitat von: CoolTux am 07 Oktober 2018, 11:22:11
Du würdest eine Fehlermeldung im Log erhalten.
Ich hab die meisten Geräte auf verbose 0, setze das nur im Fehlerfall mal hoch.

Aber klar, ist unsauber der room Weg, da ist dein set mit den filtern schicker. [emoji6]

Gesendet von meinem Doogee S60 mit Tapatalk


Damian

Etwas kryptisch, aber so funktioniert es:

DOIF {if ([":motion"]) {fhem_set([?@""::$room =~ AttrVal("$DEVICE","room","") and $group =~"Licht"]." on")}}

dabei darf Bewegungsmelder nur in einem Raum definiert sein.

siehe: https://fhem.de/commandref_DE.html#DOIF_aggregation
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

und weil es so viel Spaß macht hier noch eine Variante mit set:

DOIF {if ([":motion"]) {fhem_set("group=Licht:FILTER=room=".AttrVal("$DEVICE","room","")." off")}}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

X-Byte

Erst mal vielen Dank dass ihr euch, und besonders Du Damian, meinem Problem so schnell und intensiv angenommen habt. Ich kam erst heute Abend dazu mit euren Resultaten zu experimentieren.
Ich habe erst mal mit dem letzten doif von Damian angefangen.

Aktuell sieht mein doif folgendermaßen aus (Das "off" aus deinem Beispiel sollte "on" sein, oder?)

DOIF {if (["bewegungsmelder:motion. on"]) {fhem_set("group=Licht:FILTER=room=".AttrVal("$DEVICE","room","")." on")}}
DOELSEIF {if (["bewegungsmelder:motion. off"]) {fhem_set("group=Licht:FILTER=room=".AttrVal("$DEVICE","room","")." off")}}


Funktioniert auch, hat aber ein sonderbares Verhalten, das ich noch nicht ganz durchsteige: Es funktioniert in allen Räumen, in dem es einen Bewegungsmelder und eine zugehörige Lichtquelle gibt.
Ich habe allerdings einen größeren Raum, in dem es zwei Bewegungsmelder und zwei Lichtquellen gibt. Es ist dabei durchaus gewünscht, das bei Event "motion: on" eines der Melder beide Lichtquellen angehen. Zumindest von der room/group Zuordnung der Devices (Bewegungsmelder: room="Keller Hauptraum", beide Lichtquellen room="Keller Hauptraum" und group="Licht") wäre das auch gegeben.

Es passiert aber rein gar nichts.

Ich habe mir ein LogFile für das betroffene doif angelegt, um dem Fehlverhalten auf den Grund zu gehen. Allerdings ist das trotz mehrfachem Auslösen verschiedener Bewegungsmelder und auch Schaltvorgängen gähnend leer. Habe wohl bei der Definition was falsch gemacht, muss ich mir noch mal ansehen.

Damian

DOELSEIF gibt es im Perl-Modus nicht. Beide Blöcke sind unabhängig von einander.

DOIF {if (["bewegungsmelder:motion. on"]) {fhem_set("group=Licht:FILTER=room=".AttrVal("$DEVICE","room","")." on")}}
{if (["bewegungsmelder:motion. off"]) {fhem_set("group=Licht:FILTER=room=".AttrVal("$DEVICE","room","")." off")}}


Die Fehlfunktion kommt aber nicht daher. Wichtig ist, dass deine Bewegunsmelder, jeweils nur einen Raumnamen haben, sonst liefert  AttrVal("$DEVICE","room","") eine Kommagetrennte Liste von Räumen, die vermutlich FILTER room nicht verträgt.

Edit: Statt fhem_set kannst du zum Testen set_State angeben, dann siehst du im Status des DOIF, wie der Befehl zusammengebaut wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF