Button-Long auf der HM-RC-8 auswerten
Hallo,
ich möchte eine Schleife solange laufen lassen, wie die Taste auf der Fernbedinung gedrückt ist.
Dafür habei ich zwei Notify eingerichtet, mit denen der Status eines Dummy gesetzt werden soll.
Notify 1 zum Start:
n_WohnZimmer_Shally_Sofa_2_long
Internals:
DEF WZ_Fernbedienung_Btn_02:Long.1.* {
my $event = $EVENT;
Log 2,("n_WohnZimmer_Shally_Sofa_2_long Event $event");
fhem("set WZ_Fernbedienung_Btn_02_Long true");
}
FUUID 608ef6a4-f33f-78f8-259c-dc2243a84ac9808c
NAME n_WohnZimmer_Shally_Sofa_2_long
NOTIFYDEV WZ_Fernbedienung_Btn_02
NR 716
NTFY_ORDER 50-n_WohnZimmer_Shally_Sofa_2_long
REGEXP WZ_Fernbedienung_Btn_02:Long.1.*
STATE 2021-10-20 20:38:20
TRIGGERTIME 1634755100.8416
TYPE notify
READINGS:
2021-10-19 14:36:17 state active
Attributes:
room 99_System
Und Notify zwei zum Ende:
n_WohnZimmer_Shally_Sofa_2_long_end
Internals:
DEF WZ_Fernbedienung_Btn_02:LongRelease.1.* {
my $event = $EVENT;
Log 2,("n_WohnZimmer_Shally_Sofa_2_long_end Event $event");
fhem("set WZ_Fernbedienung_Btn_02_Long false");
}
FUUID 616db22a-f33f-78f8-08af-267f25cddfab3395
NAME n_WohnZimmer_Shally_Sofa_2_long_end
NOTIFYDEV WZ_Fernbedienung_Btn_02
NR 735
NTFY_ORDER 50-n_WohnZimmer_Shally_Sofa_2_long_end
REGEXP WZ_Fernbedienung_Btn_02:LongRelease.1.*
STATE 2021-10-19 14:40:37
TRIGGERTIME 1634647237.48291
TYPE notify
READINGS:
2021-10-19 14:40:07 state active
Attributes:
room 99_System
Bei dem Notify eins sehe ich Logfile sofort eine Zeile und nach 8 Sekunden die nächsten Ausgaben
2021.10.20 20:32:35 2: n_WohnZimmer_Shally_Sofa_2_long Event Long 1_108 (to virtual_Wohnzimmer_Fernbedienung)
2021.10.20 20:32:43 2: n_WohnZimmer_Shally_Sofa_2_long Event Long 10_108 (to virtual_Wohnzimmer_Fernbedienung)
2021.10.20 20:32:44 2: n_WohnZimmer_Shally_Sofa_2_long Event Long 11_108 (to virtual_Wohnzimmer_Fernbedienung)
2021.10.20 20:32:44 2: n_WohnZimmer_Shally_Sofa_2_long Event Long 12_108 (to virtual_Wohnzimmer_Fernbedienung)
2021.10.20 20:32:45 2: n_WohnZimmer_Shally_Sofa_2_long Event Long 13_108 (to virtual_Wohnzimmer_Fernbedienung)
2021.10.20 20:32:45 2: n_WohnZimmer_Shally_Sofa_2_long Event Long 14_108 (to virtual_Wohnzimmer_Fernbedienung)
2021.10.20 20:32:45 2: n_WohnZimmer_Shally_Sofa_2_long Event Long 15_108 (to virtual_Wohnzimmer_Fernbedienung)
2021.10.20 20:32:46 2: n_WohnZimmer_Shally_Sofa_2_long Event Long 16_108 (to virtual_Wohnzimmer_Fernbedienung)
2021.10.20 20:32:46 2: n_WohnZimmer_Shally_Sofa_2_long Event Long 17_108 (to virtual_Wohnzimmer_Fernbedienung)
2021.10.20 20:32:47 2: n_WohnZimmer_Shally_Sofa_2_long Event Long 18_108 (to virtual_Wohnzimmer_Fernbedienung)
2021.10.20 20:38:20 2: n_WohnZimmer_Shally_Sofa_2_long Event Long 19_110 (to virtual_Wohnzimmer_Fernbedienung)
bei allen versuchen sehe ich, das der Zähler bis 19 hoch geht und dann stehen bleibt.
Von der zweiten Notify sehe ich keine Eintrag im Logfile.
Die Taste heißt in fhem WZ_Fernbedienung_Btn_02
Internals:
CFGFN /opt/fhem/FHEM/Wohnzimmer.cfg
DEF 2F6F2302
FUUID 5c4b3ff4-f33f-78f8-0bc4-ffb80bc8787053fe
NAME WZ_Fernbedienung_Btn_02
NR 257
NTFY_ORDER 48-WZ_Fernbedienung_Btn_02
STATE LongRelease 28_110 (to virtual_Wohnzimmer_Fernbedienung)
TYPE CUL_HM
chanNo 02
device WZ_Fernbedienung
disableNotifyFn 1
peerList virtual_Wohnzimmer_Fernbedienung_Btn2,virtual_Wohnzimmer_Fernbedienung_Btn3
CHANGED:
commState: CMDs_done
commState: CMDs_done
READINGS:
2021-10-18 18:51:48 R-sign off
2021-10-19 15:04:15 R-virtual_Wohnzimmer_Fernbedienung_Btn2-expectAES off
2021-10-19 15:04:15 R-virtual_Wohnzimmer_Fernbedienung_Btn2-peerNeedsBurst off
2021-10-19 15:04:16 R-virtual_Wohnzimmer_Fernbedienung_Btn3-expectAES off
2021-10-19 15:04:16 R-virtual_Wohnzimmer_Fernbedienung_Btn3-peerNeedsBurst off
2021-10-19 15:05:04 RegL_01. 00:00 04:10 08:00 09:00
2021-10-19 15:05:05 RegL_04.virtual_Wohnzimmer_Fernbedienung_Btn2 00:00 01:00
2021-10-19 15:05:06 RegL_04.virtual_Wohnzimmer_Fernbedienung_Btn3 00:00 01:00
2021-10-19 15:06:07 cfgState updating
2021-10-20 20:38:24 commState CMDs_done
2021-10-19 15:05:04 peerList virtual_Wohnzimmer_Fernbedienung_Btn2,virtual_Wohnzimmer_Fernbedienung_Btn3
2021-10-20 20:38:23 state LongRelease 28_110 (to virtual_Wohnzimmer_Fernbedienung)
2021-10-20 20:38:23 trigger Long_110
2021-10-19 15:02:08 triggerTo_Steckdose_02 Short_95
2021-10-19 14:12:32 triggerTo_Steckdose_03 Short_82
2021-10-20 20:38:23 triggerTo_virtual_Wohnzimmer_Fernbedienung Long_110
2021-10-20 20:38:23 trigger_cnt 110
helper:
BNO 110
BNOCNT 28
peerFriend peerAct,peerVirt
peerIDsRaw ,91234502,91234503,00000000
peerIDsState complete
peerOpt 4:remote
regLst 1,4p
cfgChk:
idPz02 p:virtual_Wohnzimmer_Fernbedienung_Btn3
idRc03 fail
cmds:
TmplKey virtual_Wohnzimmer_Fernbedienung_Btn2,virtual_Wohnzimmer_Fernbedienung_Btn3:no:1634588872.93111
TmplTs 1634588872.93111
cmdKey 1:0:0::WZ_Fernbedienung:00DA:02:virtual_Wohnzimmer_Fernbedienung_Btn2,virtual_Wohnzimmer_Fernbedienung_Btn3
cmdLst:
clear [(readings|trigger|register|oldRegs|rssi|msgEvents|{msgErrors}|attack|all)]
getConfig noArg
getRegRaw (List0|List1|List2|List3|List4|List5|List6|List7) [-peerChn-]
peerBulk -peer1,peer2,...- [({set}|unset)]
peerChan -btnNumber- -actChn- [({single}|dual|reverse)] [({set}|unset)] [(actor|remote|{both})]
peerSmart -peerOpt-
regBulk -list-.-peerChn- -addr1:data1- [-addr2:data2-]...
regSet [(prep|{exec})] -regName- -value- [-peerChn-]
sign [(on|{off})]
tplDel -tplDel-
tplSet_0 -tplChan-
tplSet_virtual_Wohnzimmer_Fernbedienung_Btn2 -tplPeer-
tplSet_virtual_Wohnzimmer_Fernbedienung_Btn3 -tplPeer-
trgEventL -peer- -condition-
trgEventS -peer- -condition-
trgPressL [(-peer-|{all})]
trgPressS [(-peer-|{all})]
lst:
condition slider,0,1,255
peer virtual_Wohnzimmer_Fernbedienung_Btn2,virtual_Wohnzimmer_Fernbedienung_Btn3
peerOpt remove_virtual_Wohnzimmer_Fernbedienung_Btn2,remove_virtual_Wohnzimmer_Fernbedienung_Btn3,AnkleideZimmer_Rolladen,Ankleidezimmer_Heizung_WindowRec,Ankleidezimmer_Heizung_remote,Bad_Heizung_WindowRec,Bad_Heizung_remote,Buero_Heizung_WindowRec,Buero_Heizung_remote,Buero_Rolladen,Buero_Schalter_Tuer_unten_Sw_01,Buero_Schalter_Tuer_unten_Sw_02,CUL_HM_HM_LC_Dim1T_Pl_3_2C60C9_Sw1_V_01,CUL_HM_HM_LC_Dim1T_Pl_3_2C60C9_Sw1_V_02,Dimmer_Steckdose_01_Sw,Dimmer_Steckdose_02_Sw,Dimmersteckdose_02_Sw1_V_01,Dimmersteckdose_02_Sw1_V_02,FluerEG_Ofen,FlurEG_Heizung_WindowRec,FlurEG_Heizung_remote,FlurOben_Wechsler_1,HM_616E86_Dim_V_01,HM_616E86_Dim_V_02,HZ.WZ_remote,KZ_HZ_WindowRec,KZ_HZ_remote,K_Heizung_WindowRec,K_Heizung_remote,KinderZimmer_Dimmer,KinderZimmer_Heizung_Fen_WindowRec,KinderZimmer_Heizung_Fen_remote,KinderZimmer_Rolladen_Balkon,KinderZimmer_Rolladen_Fenster,Kinderzimmer_Heizung_Mitte_WindowRec,Kinderzimmer_Heizung_Mitte_remote,Kueche_Rolladen,Kueche_Wandthermostat_WindowRec,Kueche_Wandthermostat_remote,MaedelsZimmer_Heizung_WindowRec,MaedelsZimmer_Heizung_remote,PM1_Sw,Rauchmelder_Team,SZ_Heizung_WindowRec,SZ_Heizung_remote,Schlafzimmer_Heizung_links_WindowRec,Schlafzimmer_Heizung_links_remote,Steckdose_01,Steckdose_02,Steckdose_03,Steckdose_04,Steckdose_05,Steckdose_06,Steckdose_07,Teichpumpe,WK_Maschmaschine_SW,WZ_Heizung_WindowRec,Wintergarten_Heizung_WindowRec,Wintergarten_Heizung_remote,Wintergarten_Rolladen_Tuer,virtualWeatherDoor,virtueller_Aktor_Btn1,virtueller_Aktor_Btn2,virtueller_Aktor_Btn3,virtueller_Aktor_Btn4,virtueller_Aktor_SZ_Btn1,virtueller_Aktor_SZ_Btn2,virtueller_Aktor_SZ_Btn3,virtueller_Aktor_SZ_Btn4,virtueller_Aktor_SZ_Btn5,virtueller_Aktor_SZ_Btn6,virtueller_Aktor_SZ_Btn7,virtueller_Aktor_SZ_Btn8
tplChan
tplDel
tplPeer
rtrvLst:
cmdList [({short}|long)]
deviceInfo [({short}|long)]
list [({normal}|full)]
param -param-
reg -addr- -list- [-peerChn-]
regList noArg
regTable noArg
regVal -addr- -list- [-peerChn-]
Was mache ich falsch, das der zweite Notify keine Wirkung zeigt?
Viele Grüße
Stefan
Eigentlich hast Du kein Problem mit Homematic, sondern mit Deinen notify :)
Zitat von: bommel-bs am 20 Oktober 2021, 21:11:46
bei allen versuchen sehe ich, das der Zähler bis 19 hoch geht und dann stehen bleibt.
Der Zähler bleibt nicht stehen, aber alles was danach kommt, wird von Deinem notify ignoriert, weil Du explizit auf alles, was mit 1 beginnt, einschränkst:
ZitatWZ_Fernbedienung_Btn_02:Long.1.*
Deshalb werden die events von 2-9 und von 20-99 ignoriert. Ab 100 würde es wieder funktionieren. Die regexp ist schlichtweg falsch gewählt.
Zitat von: bommel-bs am 20 Oktober 2021, 21:11:46
Was mache ich falsch, das der zweite Notify keine Wirkung zeigt?
Vermutlich auch eine falsche regexp:
ZitatWZ_Fernbedienung_Btn_02:LongRelease.1.*
Ich würde auf diesen event triggern:
2021-10-20 21:53:48 CUL_HM HM_39D35A HM_39D35A_Btn_04 LongRelease
Ganz ohne Nummer am Ende. Schau Dir einfach mal an, wie der Event bei Dir genau aussieht - es gibt davon immer zwei:
2021-10-20 21:53:48 CUL_HM HM_39D35A HM_39D35A_Btn_04 LongRelease
2021-10-20 21:53:48 CUL_HM HM_39D35A_Btn_04 LongRelease 2_50 (to hmvccu)
Will man auf den ersten triggern, sieht die regexp dafür einfach so aus:
defmod HM_39D35A_notify_1 notify HM_39D35A:HM_39D35A_Btn_04.LongRelease {}
Interessant wäre noch zu wissen, was der Fragesteller eigentlich beabsichtigt. Eventuell wäre es hilfreich, auf nur ein Long-Event zu reagieren (und alle weiteren zu ignorieren), etwa um etwas einzuschalten, und LongRelease um auszuschalten. Für so etwas bietet sich ein DOIF mit zwei Zweigen ja geradezu an. Den aktuellen Zustand des DOIF kann man dann auch gleich auswerten oder gewünschte Aktionen direkt ausführen lassen.
jm2c.
Hallo betateilchen,
Zitat von: betateilchen am 20 Oktober 2021, 22:01:14
Der Zähler bleibt nicht stehen, aber alles was danach kommt, wird von Deinem notify ignoriert, weil Du explizit auf alles, was mit 1 beginnt, einschränkst:
Deshalb werden die events von 2-9 und von 20-99 ignoriert. Ab 100 würde es wieder funktionieren. Die regexp ist schlichtweg falsch gewählt.
Vermutlich auch eine falsche regexp:
Danke für den Hinweis. Genau wegen der 1 wurden natürlich nur Zähler mit ein beginnend erwischt.
Jetzt machen die beiden Notify fast das was ich möchte. Wenn ich die Taste loslasse, kommt das Ereignis mit ca. 8 Sekunden Verzögerung. Mal sehen ab das ein Problem ist.
Zitat von: Pfriemler am 20 Oktober 2021, 22:21:30
Interessant wäre noch zu wissen, was der Fragesteller eigentlich beabsichtigt.
Ich habe eine Shally Vintage und möchte diese mit einer Taste auf der Fernbedienung steuern.
Bei einem kurzen Druck soll die Birne an bzw. aus gehen. Dafür habe ich dieses Notify n_WohnZimmer_Shally_Sofa_2_short:
Internals:
DEF WZ_Fernbedienung_Btn_02:Short.* set WohnzimmerSofaBirne toggle
FUUID 608ef3eb-f33f-78f8-6f8e-2901f5cbb0524e24
NAME n_WohnZimmer_Shally_Sofa_2_short
NOTIFYDEV WZ_Fernbedienung_Btn_02
NR 714
NTFY_ORDER 50-n_WohnZimmer_Shally_Sofa_2_short
REGEXP WZ_Fernbedienung_Btn_02:Short.*
STATE 2021-10-20 21:37:44
TRIGGERTIME 1634758664.13305
TYPE notify
READINGS:
2021-10-18 22:26:37 state active
Attributes:
room 99_System
Mit einen langen Druck soll die Birne hller bzw. dunkler werden.
Das mache ich jetzt über 3 notiy und einen Dummy für die Variablen.
Notify eins setzt den Dummy WZ_Fernbedienung_Btn_02_Long auf true.
Dadurch wird der Dimmernotify n_WohnZimmer_Shally_Sofa_dimmer gestartet. Der schaut nach, ob es heller oder dunkler werden soll und schauert in einer Schleife die Birne an. Solbald das dritte Notify die Variable WZ_Fernbedienung_Btn_02_Long auf false setzt hört die Dimmerschleife auf und merkt sich die letzte Richtung in einem Reading im Dummy WZ_Fernbedienung_Btn_02_Long.
Viele Grüße
Stefan
Anwendungsfall passt, hatte mir schon sowas gedacht.
Hier eine eben ausprobierte Lösung:
defmod WZ_Fernbedienung_Btn_02_Long DOIF ([FB4V:"^FB4V_Btn1.Long$"]) ( ) ## in der Klammer könnte eine auszuführende Aktion stehen wenn ein Long erkannt wird)\
DOELSEIF ([FB4V:"^FB4V_Btn1.LongRelease$"]) ( ) ## und hier eine wenn die Taste losgelassen wurde
attr WZ_Fernbedienung_Btn_02_Long cmdState true|false
Dieses DOIF mit dem Namen Deiner Variablen (statt des Dummys) wechselt so den Wert zwischen true (gedrückt) und false (losgelassen). Du müsstes "FB4V_Btn1" durch "WZ_Fernbedienung_Btn_02" und "FB4V" vor dem Doppelpunkt durch den Namen Deines Gerätes des Tasters ersetzen (ich nehme mal an "WZ_Fernbedienung") ersetzen, also bspw.
defmod WZ_Fernbedienung_Btn_02_Long DOIF ([WZ_Fernbedienung:"^WZ_Fernbedienung_Btn_02.Long$"]) ( ) ...
Mit diesem DOIF werte ich das Event testweise aus:
defmod WZ_Fernbedienung_Btn_02_Long_DOIF_1 DOIF ([WZ_Fernbedienung_Btn_02_Long:"^true$"]) (set dummy on)\
DOELSEIF ([WZ_Fernbedienung_Btn_02_Long:"^false$"]) (set dummy off)
edit: Natürlich sollte auch Dein notify zum Starten und Stoppen der Rampe damit sofort funktionieren, das müsstest Du nicht einmal umschreiben. Das DOIF erzeugt ebenso Events beim Wechsel des Status wie sie beim Ändern des Dummywertes entstehen.
Der Wechsel zwischen true und false erfolgt hier in Sekundenbruchteilen nach dem Drücken (systemisch natürlich erst nach ca 0,5 Sekunden) und dem Loslassen.
Hallo Pfriemler,
die Idee mit dem DOIF gefällt mir gut.
Folgendes DOIF habe ich definiert:
Internals:
DEF ([WZ_Fernbedienung:"^WZ_Fernbedienung_Btn_02.Long$"])
( ) ## in der Klammer könnte eine auszuführende Aktion stehen wenn ein Long erkannt wird)
DOELSEIF ([WZ_Fernbedienung:"^WZ_Fernbedienung_Btn_02.LongRelease$"])
( ) ## und hier eine wenn die Taste losgelassen wurde
FUUID 61719639-f33f-78f8-41ed-0350dc61e94f229a
MODEL FHEM
NAME di_WZ_Fernbedienung_Btn_02_Long
NOTIFYDEV global,WZ_Fernbedienung
NR 746
NTFY_ORDER 50-di_WZ_Fernbedienung_Btn_02_Long
STATE false
TYPE DOIF
VERSION 24905 2021-09-01 18:35:54
READINGS:
2021-10-21 19:16:53 Device WZ_Fernbedienung
2021-10-21 19:16:53 cmd 2
2021-10-21 19:16:53 cmd_event WZ_Fernbedienung
2021-10-21 19:16:53 cmd_nr 2
2021-10-21 19:16:53 e_WZ_Fernbedienung_events commState: CMDs_done,CMDs_done
2021-10-21 18:35:01 mode enabled
2021-10-21 19:16:53 state false
Regex:
accu:
collect:
cond:
WZ_Fernbedienung:
0:
&STATE ^WZ_Fernbedienung$
1:
&STATE ^WZ_Fernbedienung$
attr:
cmdState:
0:
true
1:
false
wait:
waitdel:
condition:
0 ::EventDoIf('WZ_Fernbedienung',$hash,'^WZ_Fernbedienung_Btn_02.Long$',1)
1 ::EventDoIf('WZ_Fernbedienung',$hash,'^WZ_Fernbedienung_Btn_02.LongRelease$',1)
do:
0:
0
1:
0
2:
helper:
DEVFILTER ^global$|^WZ_Fernbedienung$
NOTIFYDEV global|WZ_Fernbedienung
event commState: CMDs_done,CMDs_done
globalinit 1
last_timer 0
sleeptimer -1
timerdev WZ_Fernbedienung
timerevent WZ_Fernbedienung_Btn_02 LongRelease
triggerDev WZ_Fernbedienung
timerevents:
battery: ok
commState: CMDs_done
CMDs_done
WZ_Fernbedienung_Btn_02 LongRelease
timereventsState:
battery: ok
commState: CMDs_done
CMDs_done
state: WZ_Fernbedienung_Btn_02 LongRelease
triggerEvents:
commState: CMDs_done
CMDs_done
triggerEventsState:
commState: CMDs_done
state: CMDs_done
internals:
perlblock:
readings:
trigger:
all WZ_Fernbedienung
uiState:
Attributes:
cmdState true|false
room 99_System
Wie erwartet wechselt der state mit etwas Verzögerung zwieschen true und false.
Meine Schleife sieht wie folgt aus:
Internals:
DEF di_WZ_Fernbedienung_Btn_02_Long:true {
my($upDown, $long, $lastLong, $TasteAktiv, $running);
$TasteAktiv = $EVTPART0;
Log 2,("n_WohnZimmer_Shally_Sofa_dimmer - Event0 $EVTPART0");
# laeuft schon ein Dimmer?
$running = ReadingsVal("n_WohnZimmer_Shally_Sofa_dimmer", "running","-");
if ( $running eq "true" ) {
Log 2,("n_WohnZimmer_Shally_Sofa_dimmer - es gibt schon einen aktiven Dimmer");
}
else {
fhem("setreading n_WohnZimmer_Shally_Sofa_dimmer running true");
$upDown = ReadingsVal("n_WohnZimmer_Shally_Sofa_dimmer", "UP_DOWN","down");
while( $TasteAktiv eq "true") {
$TasteAktiv = ReadingsVal("di_WZ_Fernbedienung_Btn_02_Long", "state","-");
Log 2,("n_WohnZimmer_Shally_Sofa_dimmer - aktiv: $TasteAktiv");
sleep(5);
}
if ( $upDown eq "up" ) {
fhem("setreading n_WohnZimmer_Shally_Sofa_dimmer UP_DOWN down");
}
else {
fhem("setreading n_WohnZimmer_Shally_Sofa_dimmer UP_DOWN up");
}
fhem("setreading n_WohnZimmer_Shally_Sofa_dimmer running false");
# sleep(3);
}
}
FUUID 616dd52a-f33f-78f8-0b4f-87774e3e9ab2cbaa
NAME n_WohnZimmer_Shally_Sofa_dimmer
NOTIFYDEV di_WZ_Fernbedienung_Btn_02_Long
NR 736
NTFY_ORDER 50-n_WohnZimmer_Shally_Sofa_dimmer
REGEXP di_WZ_Fernbedienung_Btn_02_Long:true
STATE active
TRIGGERTIME 1634836606.462
TYPE notify
READINGS:
2021-10-21 19:16:51 UP_DOWN up
2021-10-21 19:16:51 running false
2021-10-21 19:18:36 state active
Attributes:
room 99_System
Leider habe ich eine Endlos-Schleife. Die Variable $TasteAktiv ist in der Schleife immer true auch wenn in der Webansicht von di_WZ_Fernbedienung_Btn_02_Long schon state false steht. Lese ich die Variable falsch?
Viele Grüße
Stefan
Oink, oink, sagte das Schwein als es ins Uhrwerk schaute. Ich sehe den Fehler nicht.
Der nächste bitte!