FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: X-Byte am 07 Oktober 2018, 01:07:32

Titel: Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag von: X-Byte am 07 Oktober 2018, 01:07:32
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
Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag 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.
Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag von: Damian am 07 Oktober 2018, 10:44:56
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 ;)
Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag von: CoolTux am 07 Oktober 2018, 10:47:43
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?
Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag von: Damian am 07 Oktober 2018, 10:51:16
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.
Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag von: CoolTux am 07 Oktober 2018, 10:55:13
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".
Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag von: Damian am 07 Oktober 2018, 11:07:48
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.
Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag von: CoolTux am 07 Oktober 2018, 11:21:20
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
Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag 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

Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag von: CoolTux am 07 Oktober 2018, 11:22:11
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.
Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag von: Frank_Huber am 07 Oktober 2018, 11:23:54
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

Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag von: Damian am 07 Oktober 2018, 12:31:04
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
Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag von: Damian am 07 Oktober 2018, 12:56:22
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")}}
Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag von: X-Byte am 09 Oktober 2018, 23:17:27
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.
Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag von: Damian am 09 Oktober 2018, 23:30:35
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.
Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag von: X-Byte am 10 Oktober 2018, 23:06:29
Sorry, die Unabhängigkeit der Blöcke im Perl Modus hatte ich beim vorherigen Lesen der Doku zwar wahrgenommen, aber beim Eintragen nicht mehr dran gedacht, dass sich damit DOELSEIF erübrigt.

Die betroffenen Bewegungsmelder sind dem selben Raumnamen zugeordnet.
Dein Tip mit dem set_State als debugging für Arme hat mich dann auf die wahrscheinliche Ursache des Problems gebracht.

Es ist denke ich der Raumname selbst, da er (als einziger der Räume mit Bewegungsmelderzuordnung) ein Leerzeichen enthält. Das mag FILTER wohl nicht. Nun habe ich mit doppelten und einfachen escapeten Anführungszeichen vor und nach Raumnamen probiert dem beizukommen, aber FILTER kann mit den Anführungszeichen wohl nichts anfangen.
Das einzige was funktioniert, ist wenn ich bei FILTER die Leerzeichen durch einen Punkt (.) ersetze. Nur habe ich noch nicht herausbekommen, wie ich das Inline, on the fly in dem AttrVal Returnwert direkt ersetzen kann.  Ein Perl Regex Substitue ( s/ /./g ) würde das ja elegant bewerkstelligen.
Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag von: Damian am 11 Oktober 2018, 08:21:28
Was spricht dagegen, Räume ohne Leerzeichen zu definieren?
Titel: Antw:Lichter über zugehörige Bewegungsmelder dynamisch mit einem (!) DOIF schalten
Beitrag von: X-Byte am 12 Oktober 2018, 00:32:21
Die allgemeine Lesbarkeit. Ich wollte mich demnächst an die Integration einer Oberfläche für Tablets machen und da sollte die Darstellung so wenig kryptisch und frauenfreundlich wie möglich aussehen. Es sei denn dafür gibt es einen komplett anderen, nicht Raumbezogenen Ansatz - so weit bin ich noch nicht vorgedrungen.
Wenn das mit den Leerzeichen aber nicht anders (einfach) zu lösen ist, werde ich sie wohl aus den Raumbezeichnungen entfernen müssen.
Danke nochmals für die Unterstützung.