Bitte nicht Teeren & Federn, falls das schon längst geht: Google & Wiki habe ich bemüht.
Ich wüsste gerne bei einem Event, welches Gerät dieses ausgelöst hatBeispiel:Eine Lampe wird eingeschaltet oder auf einen Dimmwert gesetzt. Ein notify ist auf diese Änderung subscribed. Für die Behandlung im Notify wäre es jetzt hilfreich zu wissen, wer den Stellwert der Lampe geändert hat, indem z.B. eine Variable $INITIATOR auf das ursprünglich auslösende Gerät verweist.
Anwendungsbeispiel:
Die Lampe wird von Alexa, der FHEM-Zeile, einem Dimmswitch, zwei Bewegungsmeldern und einer at-Direktive getriggert (man kann es auch einfacher fassen, aber warum?).
"Total logisch" sind nun folgende Hierarchie-Ebenen:
- at ist ein Default der niedrigsten Priorität, wenn z.B. bei Dämmerung ein schwaches Grundleuchten eingeschaltet werden soll
- Der Bewegungsmelder darf die Lampe einschalten, sollte sie aber nicht ausschalten, wenn sie vorher durch ein Kommando (Dimmswitch / Alexa) eingeschaltet wurde
- Möglicherweise überlappen sich Bewegungen bei beiden Bewegungsmeldern. "Ausschalten" sollte die Lampe nur der Bewegungsmelder, bei dem die Bewegung zuletzt stoppt.
- Den Befehlen von Switch und Alexa ist unmittelbar Folge zu leisten
Im Kern stelle ich mir vor, dass ein Dummy eine Liste der Geräte enthält, die sich z.Zt. für in der Verantwortung halten, "das Licht auszumachen". Erlischt die Bewegungsmeldung am 1. Melder, wird geprüft, ob Melder 1 der einzige in der Liste ist. Wenn ja, macht er das Licht aus. Wenn nein, löscht er sich in der Liste, denn "der Letzte macht das Licht aus". Ist er nicht in der Liste, macht er gar nichts. Ein Willenbekundungsgerät wie Schalter oder Alexa hingegen löschen die Liste, sodass die Abschaltung durch Bewegungsmelder dadurch entfällt.
Nun könnte ich für jeden Eingabekanal ein Dummy vorschalten, dass neben der Operation auf der Lampe selbst die "Wer macht das Licht aus?"-Liste manipuliert. Alexa hat also ihren Dummy für die Lampe, der Switch einen anderen, u.s.w. Einfacher wäre es, auf die Lampe ein Notify zu hängen und je nach Initiator die Logik abzubilden.
Denke ich hier verquer?
Hallo,
ja da gibts schon was (ich meine ich hätt das auch schon mal eingesetzt), schaust du mal z.B.
https://wiki.fhem.de/wiki/Notify (https://wiki.fhem.de/wiki/Notify)
nach $EVENT und $EVTPART...
Grüße
Christian
$NAME ist denke ich besser ;)
EDIT: wenn ich allerdings dein Vorhaben so lese wird dir das nicht wirklich helfen.
Weil: wenn du ein notify auf Änderung der Lampe (reagierender Aktor) machst, dann ist der "Initiator" des notify IMMER diese Lampe...
Du müsstest evtl. beim Absetzenden "Device" des Schaltbefehls ein Reading in der Lampe entsprechend setzen.
Also bei jedem set Lampe irgendwas
auch immer ein setreading Lampe Initiator IchWarEs
hinterher schicken ;)
EDIT: der ausführende Aktor weiß ja nicht woher der Befehl kam... (und es ist ihm letzendlich auch egal ;) )
Gruß, Joachim
Zitat von: MadMax-FHEM am 24 Juni 2020, 19:35:53
Weil: wenn du ein notify auf Änderung der Lampe (reagierender Aktor) machst, dann ist der "Initiator" des notify IMMER diese Lampe...
Du müsstest evtl. beim Absetzenden "Device" des Schaltbefehls ein Reading in der Lampe entsprechend setzen.
Also bei jedem set Lampe irgendwas
auch immer ein setreading Lampe Initiator IchWarEs
hinterher schicken ;)
EDIT: der ausführende Aktor weiß ja nicht woher der Befehl kam... (und es ist ihm letzendlich auch egal ;) )
Gruß, Joachim
Erinnert mich an etwas... ;) https://forum.fhem.de/index.php/topic,74117.msg658179.html#msg658179
Zitat von: amenomade am 25 Juni 2020, 00:55:41
Erinnert mich an etwas... ;) https://forum.fhem.de/index.php/topic,74117.msg658179.html#msg658179 (https://forum.fhem.de/index.php/topic,74117.msg658179.html#msg658179)
Danke, dass $SELF auch im notify-Kontext funktioniert, war mir neu, ist interessant.
Zum Rest:
Eine Art statemachine zu bauen, ist eigentlich die ursprüngliche "Kernidee" hinter DOIF, wenn ich das richtig verstanden habe. Also ein DOIF je Zieldevice, dessen Zustand sich dann eben nach dem DOIF richtet, das alle Schaltmöglichkeiten beinhaltet. Mag jeder selbst beurteilen, ob das ein guter Weg ist.
Ich nutze das jedenfalls nicht und löse solche Problemstellungen tendenziell eher dadurch, dass zentrale myUtils-routinen aus notify heraus angesprochen werden, die sich dann anhand des Auslösers die notwendigen Daten selbst zusammensuchen (teils aus setreading-Infos bzw. userAttr-Inhalten entnommen, teils mit getKeyValue).
Eine neuere, mAn. sehr interessante Möglichkeit hat justme1968 jüngst mit "combine" aufgezeigt. Siehe https://forum.fhem.de/index.php/topic,110165.msg1041882.html#msg1041882. Scheint weniger mächtig, dafür aber "durchsichtiger" zu sein als DOIF.