Moin liebe Community,
ich habe mir einen HomeMatic Handsender gekauft und diesen auch erfolgreich eingebunden.
Nun wollte ich die vier Button jeweils einem Raum zuweisen und diesen abhängig vom Zustand eines Gerätes "An" bzw. "Aus" schalten.
Dazu habe ich mir ein notify gebaut, welches auf alle vier Button triggern soll:
So schaut mein Define aus:
define n_handteil_Mel notify handteil_Mel_Btn_01:state:.*|handteil_Mel_Btn_02:state:.*|handteil_Mel_Btn_03:state:.*|handteil_Mel_Btn_04:state:.*
{ remoteControll($NAME) }
List vom Notify:
Internals:
CFGFN
DEF handteil_Mel_Btn_01:state:.*|handteil_Mel_Btn_02:state:.*|handteil_Mel_Btn_03:state:.*|handteil_Mel_Btn_04:state:.* { remoteControll($NAME) }
NAME n_handteil_Mel
NOTIFYDEV handteil_Mel_Btn_02,handteil_Mel_Btn_04,handteil_Mel_Btn_03,handteil_Mel_Btn_01
NR 9104
NTFY_ORDER 50-n_handteil_Mel
REGEXP handteil_Mel_Btn_01:state:.*|handteil_Mel_Btn_02:state:.*|handteil_Mel_Btn_03:state:.*|handteil_Mel_Btn_04:state:.*
STATE active
TYPE notify
Readings:
2018-02-02 11:22:55 state active
Attributes:
room Residents
Da ich die Fernbedienung gerade nicht zur Hand habe, habe ich via:
setreading handteil_Mel_Btn_02 state Short
ein Event ausgelöst und habe nun erwartet, dass der notify anspringt und irgendwas macht.
Leider bleibt der notify weiter auf "activ" stehen und bekommt keinen Zeitstempel, sprich er ist nicht angesprungen.
Hier ein List vom dem Btn_02, welchen ich per setreading verändert habe:
Internals:
DEF 5CA09302
NAME handteil_Mel_Btn_02
NOTIFYDEV global
NR 419
NTFY_ORDER 50-handteil_Mel_Btn_02
STATE Short
TYPE CUL_HM
chanNo 02
device handteil_Mel
Readings:
2018-01-31 21:58:56 R-sign off
2018-01-31 21:59:30 RegL_01. 04:10 08:00 09:00 00:00 2018-02-02 11:24:47 state Short
2018-02-02 11:24:47 state Short
2018-02-01 22:13:44 trigger Short_56
2018-02-01 22:13:44 trigger_cnt 56
Helper:
BNO 56
BNOCNT 1
Expert:
def 1
det 0
raw 1
tpl 0
Role:
chn 1
Attributes:
event-on-update-reading state
model HM-RC-4-3
peerIDs 00000000,
room CUL_HM,Residents
Ich hätte jetzt erwartet, dass mein notify anspringt und irgendwas macht.
Die Sub's in meiner 99_myUtils sind z.Z. irrelevant, da ich erstmal verstehen will, warum der RegEx / notify nicht greift.
Recht herzlichen Dank für Eure Hilfe.
Gruß
Mathze
ich würde immer auf einem separaten browsertab den eventmonitor einschalten, um die events genau zu sehen.
mit eingeschalteter fhem.log option kann man auch gleichzeitig fehler erkennen, falls verbose richtig eingestellt ist.
Im Eventmonitor sehe ich beim absetzen von:
setreading handteil_Mel_Btn_02 state Short1
dann folgende Meldung:
2018-02-02 12:09:25 CUL_HM handteil_Mel_Btn_02 Short1
Das bringt mich nun leider nicht weiter, weswegen mein notify nicht anspringt.
Gruß
Mathze
Man sieht dort, dass im Event kein state auftaucht. Sondern nur "handteil_Mel_Btn_02 Short1".
Entsprechend musst du dein Notify anpassen.
edit:
Allerdings finde ich es komisch, dass dies bei setreading state passiert.
Hier wird ja normal ein reading names state erzeugt und nicht der interne state des Geräts gesetzt (Dies würde man mit "setstate <device> bla" machen).
Und bei einem Event eines Readings hätte ich jetzt auch erwartet, dass dieses im Event mit auftaucht.
du könntest auch die regex vom notify anpassen:
define n_handteil_Mel notify handteil_Mel_Btn_.*
{ remoteControll($NAME) }
oder ist da state wichtig?
Hm.. sieht so aus als ob ich oben falsch liege und das Reading state normal doch dem entspricht was im reading state steht.
Dann würde die Besonderheit, dass bei state Änderung im Event das "state" verschluckt wird hier doch greifen und es macht Sinn,
dass du nur Device und Wert siehst.
Somit wie nils_ geschrieben hat dein notify anpassen.
Es gibt auch noch bei notify das Attribut addStateEvent.
Wenn ich das richtig interpretiere könnte es dazu führen, dass das state so drin bleiben darf wie du es bisher hast.
Zitat
addStateEvent
The event associated with the state Reading is special, as the "state: " string is stripped, i.e $EVENT is not "state: on" but just "on". In some circumstances it is desireable to get the event without "state: " stripped. In such a case the addStateEvent attribute should be set to 1 (default is 0, i.e. strip the "state: " string).
Note 1: you have to set this attribute for the event "receiver", i.e. notify, FileLog, etc.
Note 2: this attribute will only work for events generated by devices supporting the readingFnAttributes.
erhöhe verbose beim notify.
was passiert, wenn du die funktion mit dem namen ausführst?
Verbose auf 5 hat leider auch keinen weiteren Aufschluss im Log gegeben, alles blieb wie gewohnt.
Ich habe mein notify nun wie nils schrieb angepasst und sofort springt es an!
Erklärt leider immer noch nicht, wieso mein RegEx explizit auf "state" nicht wollte.
Ich nehme es jetzt erstmal so hin und werde meine Sub's nun testen.
Recht herzlichen Dank an Euch.
Gruß
Mathze
deine "regex" aus dem ersten post ist genau genommen keime echte regex. der erste doppelpunkt nach jedem namen existiert ja gar nicht im event.
dieser leitet eine sonderbehandlung der regex ein. siehe comandref, notify.
du hast/erwartest dann im prinzip 4x sonderbehandlung durch die pipe zeichen, was anscheinend nicht korrekt erkannt werden kann.
eventuell funktioniert es noch beim ersten device, also pro regex 1x sonderbehandlung.
wenn du diese doppelpunkte in einen punkt änderst, sollte es funktionieren, da echte regex auf das event.
edit:
deshalb nutze ich auch immer den "echten" regex mode.
Zitat von: frank am 02 Februar 2018, 13:40:17
edit:
deshalb nutze ich auch immer den "echten" regex mode.
Was meinst du mit "echten" regex mode?
Ich habe den "Regexp wizard" benutzt.
Ich wähle meinen Button und das jeweilige Reading aus, auf welches ich reagieren will.
Das bei einem:
setreading Btn_02 state XXX
anscheinend kein Event ausgelöst wird, ist mir leider immer noch nicht klar.
Nach meinem Verständnis (so habe ich es bisher immer verstanden gehabt) hätte ein
define n_Bla notify Btn_02:state:.* { ... }
Bei jeder Änderung des Readings "state" ausgelöst werden müssen.
Aus diesem Grund habe ich auch das Attribut "event-on-update-reading = state" bei den jeweiligen Btn_0X gesetzt, damit es bei jeder Betätigung des physischen Knopfes auf der HomeMatic Fernbedienung ein neues Event mit einem neuen Zeitstempel auslöst.
Mein Ziel war es lediglich auf das Reading "state" von Btn_01, Btn_02, Btn_03 & Btn_04 zu reagieren.
Falls ich hier doch irgendwas falsch verstanden haben sollte, muss ich mir nochmal genau das notify WIKI reinprügeln, ich ging bisher davon aus, dass ich es so richtig verstanden hatte.
Gruß
Mathze
Der Event-Monitor macht m.E. immer noch eine runde Klammer () um alles bei alternativen Trigger-Events, bin mir aber nicht ganz sicher.
Hier wäre aber insgesamt ein "[1-4]" einfacher, oder? Also:
define n_handteil_Mel notify handteil_Mel_Btn_0[1-4]:state:.* { remoteControll($NAME) }
Evtl. solltest du noch nach short und long (-release) abgrenzen.
Was die Sonderbehandlung von state angeht: Das ist eine immer wiederkehrende Diskussion, und ob ein setreading an der Stelle dann gleich reagiert wie ein "echtes" Event ist halt gerade die Frage...
Ist das wieder einer von den vielen "Ich habe eine Theorie, denke mir was aus, was praktisch sowieso nicht geht und frage mal ab" Threads?
Ich habe mal Tastendrücke im Event Monitor aufgenommen:
2018-02-02 16:15:24 CUL_HM HM_535F7A trigLast: HM_53F520_lock:short
2018-02-02 16:15:24 CUL_HM HM_535F7A trig_HM_53F520_lock: Short_22
2018-02-02 16:15:24 CUL_HM HM_53F520 battery: ok
2018-02-02 16:15:24 CUL_HM HM_53F520 HM_53F520_lock Short
2018-02-02 16:15:24 CUL_HM HM_53F520_lock Short 1_22 (to HM_535F7A)
2018-02-02 16:15:24 CUL_HM HM_53F520_lock trigger: Short_22
2018-02-02 16:15:24 CUL_HM HM_53F520_lock triggerTo_HM_535F7A: Short_22
2018-02-02 16:15:24 CUL_HM HM_53F520_lock trigger_cnt: 22
2018-02-02 16:15:24 CUL_HM HM_53F520 aesReqTo: HM_535F7A
2018-02-02 16:15:24 CUL_HM HM_53F520_lock triggerTo_HM_535F7A: Short_22_ack
2018-02-02 16:17:39 CUL_HM FB12 battery: ok
2018-02-02 16:17:39 CUL_HM FB12 FB12_Btn_01 Short
2018-02-02 16:17:39 CUL_HM FB12_Btn_01 Short 1_121 (to RolloKUR)
2018-02-02 16:17:39 CUL_HM FB12_Btn_01 trigger: Short_121
2018-02-02 16:17:39 CUL_HM FB12_Btn_01 triggerTo_RolloKUR: Short_121
2018-02-02 16:17:39 CUL_HM FB12_Btn_01 trigger_cnt: 121
2018-02-02 16:17:39 CUL_HM RolloKUR trigLast: FB12_Btn_01:short
2018-02-02 16:17:39 CUL_HM RolloKUR trig_FB12_Btn_01: Short_121
2018-02-02 16:17:39 CUL_HM FB12_Btn_01 triggerTo_RolloKUR: Short_121_ack
2018-02-02 16:17:39 CUL_HM RolloKUR deviceMsg: 99.5 (to FB12)
Da gibt es nix mit state.
Und ich habe mal den Befehl abgesetzt
setreading FB12 state Short
Da gibt es den Event - auch nix mit state
2018-02-02 16:20:08 CUL_HM FB12 Short
Jetzt frage ich mich verzweifelt warum diese Theorie verfolgt wird:
ZitatIch habe den "Regexp wizard" benutzt.
Ich wähle meinen Button und das jeweilige Reading aus, auf welches ich reagieren will.
Das hier wäre eine sinnvolle Vorgehensweise
https://wiki.fhem.de/wiki/Event_monitor#Vorgehensweise_beim_Anlegen_eines_Ger.C3.A4tes
Manchmal wird es mir irgendwie zuviel .... Diese "Aufgabenstellung an die Community" hat keinerlei praktischen Bezug. :o
Gruß Otto