Gibt es ein fertiges Modul mit dem ich einem Taster zwei oder mehr Funktionen zuweisen kann?
ZB. Start und nochmalige Betätigung Stop.
Hi,
meinst Du so?
https://forum.fhem.de/index.php/topic,36393.msg286851.html#msg286851
Gruß Arnd
Raspi2 mit FHEM, CUL, Signalduino, MySensors, HomeBridge, Presence, Bravia, ...
Es gibt sequence, um einer Reihe von kurz hintereinander gedrueckten Tasten unterschiedliche Events zuzuweisen.
Wenn man je nach Status unterschiedliche Events generieren will, dann muss man auf notify zugreifen, oder man versucht es mit eventMap oder readingsChange.
So richtig fehlt mir momentan der Durchblick, aber das im Commandref kann so auch nicht stimmen.
Ein sequence kann verwendet werden, um ein neues Event zu generieren, wenn eine bestimmte Folge von anderen Events in einem festgelegten Zeitraum eingetroffen ist.
Z.Bsp. um eine Lampe dann einzuschalten, falls Btn1:on, dann Btn2:off und zum Schluss Btn3:on innerhalb einer Sekunde gedrückt wurde, definiert man folgendes:
define lampseq sequence Btn1:on 0.5 Btn2:off 0.5 Btn1:on
define lampon notify lampseq:trigger set lamp on
Soll der Schluss Btn3:on Btn1 heisen oder stimmt das define define lampseq sequence Btn1:on 0.5 Btn2:off 0.5 Btn1:on nicht.
Als Test werden zwei oder drei Dummys (Btn) benötigt?
Danke fuer den Hinweis, die deutsche Uebersetzung war kaputt, bitte Btn3 durch Btn1 ersetzen.
BtnX ist nicht als dummy sondern als "echtes" Geraet gedacht. Dummy geht natuerlich auch, ich stelle mir nur das schnelle druecken etwas unpraktisch vor.
Das heist aber, dass zb. für einen Rollladen für eine Richtung trotzdem zwei Taster notwendig sind für diesen sequence Modus.
Du kannst auch mit eine Taste morsen: sequence mit btn1 0.5 btn1, und entweder auf dem trigger Event von sequence reagieren, oder auf partial_1 (dafuer muss triggerPartial aktiviert sein).
Eigentlich dachte ich mehr an einen Taster der bei jeder Betätigung den Zustand zwischen AUS und EIN wechselt.
Hi,
Ja aus und ein gleich toggle in meinem verlinkten Beitrag oben!
Gruß Arnd
Raspi2 mit FHEM, CUL, Signalduino, MySensors, HomeBridge, Presence, Bravia, ...
Hi, eine Frage,
kann das notify auch das auslösende Gerät schalten? Ich bekomme es nicht hin...
Ziel ist es ein Doppelklick bei meinen Rolllädenschaltern ist ein stop.
Sequenze funktioniert:
Internals:
CFGFN
DEF Rollladen_.*:(0|1) 0.5 :(0|1)
FUUID 5dfde9bb-f33f-0804-a49f-0ca4982dad3f1e8e
IDX 0
MAX 3
NAME Rolladen_Stop
NR 11254
NTFY_ORDER 50-Rolladen_Stop
RE Rollladen_.*:(0|1)
STATE active
TS 0
TYPE sequence
READINGS:
2019-12-21 11:45:09 state active
Attributes:
reportEvents 1
room FENSTER_TÜREN
verbose 5
Im notify wollte ich jetzt:
Rolladen_Stop:trigger set $NAME 2
setzen. Es kennt aber $NAME nicht.
Ich dachte über den Paramter in Sequenze reportEvents 1 bekomme ich das auslösende Event. Aber dann funktioniert das notify über haupt nicht mehr.
Jemand eine Idee, wo mein Problem liegt?
VG
René
ZitatEs kennt aber $NAME nicht.
$NAME sollte Rolladen_Stop sein, vmtl. nicht das was du willst.
Sieht man gut mit "attr global verbose 5".
Hi Rudolf, ja I'm log hab ich das auch schon mitbekommen.
gibt's denn überhaupt eine Möglichkeit an die Infos vom auslösenden Devices zu kommen? Welches bei der Sequenz gedrückt wurde? Ich möchte ja nicht 14 notify anlegen.
VG René
Zitatgibt's denn überhaupt eine Möglichkeit an die Infos vom auslösenden Devices zu kommen?
Bisher nicht.
Ich habe aber gerade das Modul ergaenzt, damit $data{sequence_source} beim Ausloesen von trigger den Namen des Geraetes enthaelt, das das aktuelle Event ausloest. Damit muss aber dein notify leider auf perl umgestellt werden:
define stopNotify notify Rolladen_Stop:trigger { fhem "set $data{sequence_source} 2" }
Moin Moin Rudolf,
sehr sehr coole Sache, habs getestet und für gut befunden. Funktioniert tadellos.
Wieso schreibst du leider auf perl? Weil perl mehr Ressourcen frist?
Ansonsten hätte ich es heute ausprobiert, ein Reading "stpp_counter" einzuführen, welche ich beim ersten schalten auf 1 gesetzt hätte. Dann den Befehl ausgeführt hätte und dann ein sleep 2sek, dann den stop_counter wieder auf 0. Beim zweiten schalten innerhalb der zwei Sekunden wäre der Zähler noch auf 1 und damit wäre der Befehl dann per If Schleife auf stop Gesetz.
Deine Verbesserungen ist jetzt deutlich einfacher.
VG und danke René
ZitatWieso schreibst du leider auf perl? Weil perl mehr Ressourcen frist?
Nein, sondern weil es etwas weniger elegant ist (vulgo laenger), und Anfaenger zu Fehler verleitet.
Hi Rudolf,
Zitat von: rudolfkoenig am 21 Dezember 2019, 19:55:40
Ich habe aber gerade das Modul ergaenzt, damit $data{sequence_source} beim Ausloesen von trigger den Namen des Geraetes enthaelt, das das aktuelle Event ausloest.
Ojeh, mein erster Post im FHEM Forum... ich hoffe ich mache alles richtig 8)
Die Ergänzumg mit $data{sequence_source} ist für mich suuper hilfreich!! Leider funktioniert sie (noch) nicht bei triggerPartial... Und genau da bräuchte ich sie leider ebenfalls. Spricht irgendwas dagegen das auch für triggerPartial einzubauen. Ich habe gerade mal die 91_sequence.pm angepasst... aber vielleicht nicht gerade auf die intelligenteste Weise
*** 91_sequence.pm.0 2020-08-21 14:14:59.975503687 +0200
--- 91_sequence.pm 2020-09-20 08:15:09.000000000 +0200
***************
**** 94,99 ****
--- 94,100 ----
my @d = split("[ \t]+", $hash->{DEF});
$hash->{EVENTS} = "" if(!$hash->{EVENTS});
$hash->{EVENTS} .= " $n:$s";
+ $data{sequence_source} = $dev->{NAME};
if($idx > $hash->{MAX}) { # Last element reached
***************
*** 103,111 ****
Log3 $ln, 5, "sequence $ln $tt";
setReadingsVal($hash, "state", "active", TimeNow());
- $data{sequence_source} = $dev->{NAME};
DoTrigger($ln, $tt);
- delete($data{sequence_source});
$idx = 0;
$hash->{TS} = 0;
--- 104,110 ----
Liebe Grüße und DANKE schon mal im Voraus, Hayo
Ich habe die Funktionalitaet etwas modifiziert eingebaut, bitte testen.
Modifiziert deswegen, weil ich nicht will, dass im $data was uebrig bleibt.
Und wenn ich schon dabei war, addStateEvent implementiert.
Die Aufgabe wuerde ich eher mit dem reportEvent Attribut loesen, aus Architektursicht schaut das weniger nach Pfusch aus :)
Zitat von: rudolfkoenig am 21 September 2020, 12:23:42
Ich habe die Funktionalitaet etwas modifiziert eingebaut, bitte testen.
Ich hab's ausgiebig getestet und für gut befunden. Danke für Deine suuper schnelle Antwort :) :) :)
Zitat von: rudolfkoenig am 21 September 2020, 12:23:42
Die Aufgabe wuerde ich eher mit dem reportEvent Attribut loesen, aus Architektursicht schaut das weniger nach Pfusch aus :)
Und auch damit hast Du völlig Recht. Da ich sowohl auf der Device- als auch auf der Event-Seite mit Wildcards arbeite...
defmod seq1 sequence [dek]g_s[0-9][0-9]:[AB][0I] 0.5 :[AB][0I]
...kann ich mit reportEvent so auch erkennen ob das Event wirklich ein "Doppelklick" von dem gleichen Taster war :)
Gruss und Danke, Hayo
OK, jetzt ist es an mir etwas an diese tolle Community zurückzugeben... :)
Das von Rudolf eingebaute Value($device) kann man relativ einfach verwenden, um so "Sonderfunktionen" für alle Schalter zu setzen, ohne die Konfiguration mit redudanten triggerPartial notify Definitionen zu "fluten".
Hintergrund (bei mir): Eltako Enocean mit 20+ Schaltern, bei denen ich die folgende Funktionen implementieren wollte:
Aus -> 1x Klick: fest definierter (Start-) Dimmwert (jede Lampe anders - evtl. auch abhängig von der Tageszeit)
-> 2x Klick: volle Helligkeit
-> 3x Klick: volle Helligkeit aller Leuchten im Raum
Ansonsten sollte das "normale" Dimmen per Taster nicht beeinflusst werden
Zuerst einmal die sequence (mit Wildcards für das Device):
define n_klick sequence [dek]g_s[0-9][0-9]:buttons:.pressed 0.5 :buttons:.released 0.5 :buttons:.released 0.5 :buttons:.released
Jetzt einen notify pro Anzahl der Tasterdrücke definiert:
define 1_klick notify n_klick:partial_2 {my ($device,$cmd)= (split(/\|/,AttrVal($data{sequence_source},"userattr","")))[0,1];; if (Value($device) eq "off" ) {fhem("$cmd")}}
define 2_klick notify n_klick:partial_3 {my ($device,$cmd)= (split(/\|/,AttrVal($data{sequence_source},"userattr","")))[0,2];; fhem("$cmd")}
define 3_klick notify n_klick:trigger {my ($device,$cmd)= (split(/\|/,AttrVal($data{sequence_source},"userattr","")))[0,3];; fhem("$cmd")}
und jetzt braucht man nur noch 1x per Schalter festlegen was denn denn geschehen soll:
#Logik: attr <schalter> userattr <aktor>|<1-Klick Aktion>|<2-Klick Aktion>|<3-Klick Aktion>
attr eg_s01 userattr eg_d02|set eg_d01,eg_d02 dim 35|set eg_d01,eg_d02 on|set eg_d01,eg_d02,eg_d03 on
attr eg_s02 userattr eg_d03|set eg_d03 dim 40|set eg_d03 on|set eg_d01,eg_d02,eg_d03 on
[...]
P.S.: ich hab mich für das etwas ungewöhnliche "|" als Trennzeichen entschieden, um so auch Perl Code hinterlegen zu können
Gruss, Hayo
Hallo rudolf
... ich fand bisher kein Gehör für meine kleine Erweiterung: Wunschliste (https://forum.fhem.de/index.php?topic=121953.0#msg1279080), welche eine Strikte Reihenfolge der Sequenz erfordert und somit ein NumPad für eine Alarmanlage erst ermöglichen würde.