Hi,
ich versuche meine Außenjalousie mit FHEM zu steuern und habe ein Problem mit DOIF in Verbindung mit Regex
Wenn ich mittels dem Regex-Audruck /.*Short.*|.*Long\W[1234]\D.*/ prüfen will ob eine Taste entweder "Short" oder "long" weniger als 5 (1-4) Sekunden gedrück wurde, erstellt mir das DOIF modul immer einen Timer (s.u.) Hier: Aus 1234 wird ein Timer um 00:20:34 ...
Klar kann ich die Regex auch so umbauen das Ich ohne [1234] auskomme, aber ggf. ist dieses "Problem" auch noch an anderen Stellen vorhanden?
Grüße,
Stephan
List:
Internals:
DEF (([HM_3AF410_Btn_06:state] =~ /.*Short.*|.*Long\W[1234]\D.*/) and [DOIF_Rolladen_All:state] eq "cmd_2") (set Rolladen.All stop) DOELSEIF ([HM_3AF410_Btn_06:state] =~ /.*Short.*|.*Long\W[1234]\D.*/) (set Rolladen.All zu) DOELSEIF (([HM_3AF410_Btn_05:state] =~ /.*Short.*|.*Long\W[1234]\D.*/) and [DOIF_Rolladen_All:state] eq "cmd_4") (set Rolladen.All stop) DOELSEIF ([HM_3AF410_Btn_05:state] =~ /.*Short.*|.*Long\W[1234]\D.*/) (set Rolladen.All auf)
NAME DOIF_Rolladen_All
NR 223
NTFY_ORDER 50-DOIF_Rolladen_All
STATE cmd_4
TYPE DOIF
Readings:
2016-01-08 00:20:34 Device DOIF_Rolladen_All
2016-01-08 00:20:34 cmd_event timer_4
2016-01-08 00:20:34 cmd_nr 4
2016-01-08 00:20:34 e_DOIF_Rolladen_All_state cmd_4
2016-01-07 20:42:13 e_HM_3AF410_Btn_05_state Short (to broadcast)
2016-01-07 20:42:18 e_HM_3AF410_Btn_06_state Short (to broadcast)
2016-01-08 00:20:34 state cmd_4
2016-01-08 00:20:34 timer_1_c1 09.01.2016 00:20:34
2016-01-08 00:20:34 timer_2_c2 09.01.2016 00:20:34
2016-01-08 00:20:34 timer_3_c3 09.01.2016 00:20:34
2016-01-08 00:20:34 timer_4_c4 09.01.2016 00:20:34
Condition:
0 (ReadingValDoIf('HM_3AF410_Btn_06','state','') =~ /.*Short.*|.*Long\WDOIF_time_once($hash,$hash->{timer}{0},$wday,"")\D.*/) and ReadingValDoIf('DOIF_Rolladen_All','state','') eq "cmd_2"
1 ReadingValDoIf('HM_3AF410_Btn_06','state','') =~ /.*Short.*|.*Long\WDOIF_time_once($hash,$hash->{timer}{1},$wday,"")\D.*/
2 (ReadingValDoIf('HM_3AF410_Btn_05','state','') =~ /.*Short.*|.*Long\WDOIF_time_once($hash,$hash->{timer}{2},$wday,"")\D.*/) and ReadingValDoIf('DOIF_Rolladen_All','state','') eq "cmd_4"
3 ReadingValDoIf('HM_3AF410_Btn_05','state','') =~ /.*Short.*|.*Long\WDOIF_time_once($hash,$hash->{timer}{3},$wday,"")\D.*/
Days:
Devices:
0 HM_3AF410_Btn_06 DOIF_Rolladen_All
1 HM_3AF410_Btn_06
2 HM_3AF410_Btn_05 DOIF_Rolladen_All
3 HM_3AF410_Btn_05
all HM_3AF410_Btn_06 DOIF_Rolladen_All HM_3AF410_Btn_05
Do:
0:
0 set Rolladen.All stop
1:
0 set Rolladen.All zu
2:
0 set Rolladen.All stop
3:
0 set Rolladen.All auf
4:
Helper:
globalinit 1
last_timer 4
sleeptimer -1
Internals:
Itimer:
Readings:
0 HM_3AF410_Btn_06:state DOIF_Rolladen_All:state
1 HM_3AF410_Btn_06:state
2 HM_3AF410_Btn_05:state DOIF_Rolladen_All:state
3 HM_3AF410_Btn_05:state
all HM_3AF410_Btn_06:state DOIF_Rolladen_All:state HM_3AF410_Btn_05:state
Realtime:
0 00:20:34
1 00:20:34
2 00:20:34
3 00:20:34
State:
Time:
0 1234
1 1234
2 1234
3 1234
Timecond:
0 0
1 1
2 2
3 3
Timer:
0 0
1 0
2 0
3 0
Timerfunc:
Timers:
0 0
1 1
2 2
3 3
Trigger:
Attributes:
do always
room 9.2.3_DOIF
Etwas Ähnliches wird hier beschrieben und gelöst http://forum.fhem.de/index.php/topic,43766.msg356638.html#msg356638
Hi,
danke für den Link, dort war das Problem, dass versucht wurde das Device per Regex abzufragen. Ich würde aber gerne das Reading entsprechend prüfen.
Meine Vermutung ist, dass duch die [] automatisch ein Timer angelegt wrd.
Wenn ich /.*Short.*|.*Long\W[1234]\D.*/
durch /.*Short.*|.*Long\W1\D.*|.*Long\W2]\D.*|.*Long\W3\D.*|.*Long\W4\D.*/
ersetzt funktioniert es auch (zumindest sollte es) aber leserlicher wird es dadurch nicht...
Grüße,
Stephan
Also, es geht hierja, bisher undokumentiert. Man kann nach etwas filtern mit Hilfe von regexp:
[?geofancy:lastDevice:[<regexp>]]
schon um das Reading "lastDevice".
Du prüfst auf "state". "state" muss nicht extra erwähnt werden [HM_3AF410_Btn_06] reicht meistens, bei [HM_3AF410_Btn_06:d] z.B. nicht, also dort muss es [HM_3AF410_Btn_06:state:d] geschrieben werden, weil ":d" sonst als Reading "d" interpretiert wird.
In Deinem Fall müsste es so[HM_3AF410_Btn_06:state:[.*Short.*|.*Long\W[1234]\D.*]]
klappen.
Funktiert Super!!! Vielen Vielen Dank!!!
Internals:
DEF ([HM_3AF410_Btn_06:state:[((.*Short.*)|(.*Long\W[1234]\D.*))]] =~ /.*/ and [DOIF_Rolladen_All:state] eq "cmd_2") (set Rolladen.All stop) DOELSEIF ([HM_3AF410_Btn_06:state:[((.*Short.*)|(.*Long\W[1234]\D.*))]] =~ /.*/) (set Rolladen.All zu) DOELSEIF (([HM_3AF410_Btn_05::[((.*Short.*)|(.*Long\W[1234]\D.*))]] =~ /.*/) and [DOIF_Rolladen_All:state] eq "cmd_4") (set Rolladen.All stop) DOELSEIF ([HM_3AF410_Btn_05:state:[((.*Short.*)|(.*Long\W[1234]\D.*))]] =~ /.*/) (set Rolladen.All auf)
NAME DOIF_Rolladen_All
NR 223
NTFY_ORDER 50-DOIF_Rolladen_All
STATE cmd_2
TYPE DOIF
Readings:
2016-01-08 19:09:20 Device DOIF_Rolladen_All
2016-01-08 19:09:20 cmd_event HM_3AF410_Btn_06
2016-01-08 19:09:20 cmd_nr 2
2016-01-08 19:09:20 e_DOIF_Rolladen_All_state cmd_2
2016-01-08 19:09:12 e_HM_3AF410_Btn_05_STATE Short (to broadcast)
2016-01-08 19:09:12 e_HM_3AF410_Btn_05_state Short (to broadcast)
2016-01-08 19:09:20 e_HM_3AF410_Btn_06_state Short (to broadcast)
2016-01-08 19:09:20 state cmd_2
Condition:
0 ReadingValDoIf('HM_3AF410_Btn_06','state','((.*Short.*)|(.*Long\W[1234]\D.*))') =~ /.*/ and ReadingValDoIf('DOIF_Rolladen_All','state','') eq "cmd_2"
1 ReadingValDoIf('HM_3AF410_Btn_06','state','((.*Short.*)|(.*Long\W[1234]\D.*))') =~ /.*/
2 (InternalDoIf('HM_3AF410_Btn_05','STATE','') =~ /.*/) and ReadingValDoIf('DOIF_Rolladen_All','state','') eq "cmd_4"
3 ReadingValDoIf('HM_3AF410_Btn_05','state','((.*Short.*)|(.*Long\W[1234]\D.*))') =~ /.*/
Devices:
0 HM_3AF410_Btn_06 DOIF_Rolladen_All
1 HM_3AF410_Btn_06
2 HM_3AF410_Btn_05 DOIF_Rolladen_All
3 HM_3AF410_Btn_05
all HM_3AF410_Btn_06 DOIF_Rolladen_All HM_3AF410_Btn_05
Do:
0:
0 set Rolladen.All stop
1:
0 set Rolladen.All zu
2:
0 set Rolladen.All stop
3:
0 set Rolladen.All auf
4:
Helper:
globalinit 1
last_timer 0
sleeptimer -1
Internals:
2 HM_3AF410_Btn_05:STATE
all HM_3AF410_Btn_05:STATE
Itimer:
Readings:
0 HM_3AF410_Btn_06:state DOIF_Rolladen_All:state
1 HM_3AF410_Btn_06:state
2 DOIF_Rolladen_All:state
3 HM_3AF410_Btn_05:state
all HM_3AF410_Btn_06:state DOIF_Rolladen_All:state HM_3AF410_Btn_05:state
State:
Timerfunc:
Trigger:
Attributes:
do always
room 9.2.3_DOIF
Zitat von: CaptainHook am 08 Januar 2016, 19:10:55
Funktiert Super!!! Vielen Vielen Dank!!!
Dann werde ich bald diese Funktionalität mal dokumentieren müssen. Da dieses Modul nicht nur von Anfängern immer mehr ausgereizt wird :)
Gruß
Damian
Das wäre sehr gut wenn das in die Doku hinkommen würde ;)
DOIF ist ein meiner Liebsten Module, weil man sich damit den "komplexesten Kram" ausdenken kann und er funktioniert!
Ein "Problem" habe ich mit der Lösung noch.. bzw. passt noch nicht 100%
Ich möchte das der Long-Befehl nur bei 4 Sekunden Ausgelöst wird,,,
Das klappt noch nicht richtig ,, derzeit wird es auch über 5 Sekunden ausgeführt.
([HM_3AF410_Btn_06:state:[((.*Short.*)|(.*Long\W[1234]\D.*))]] =~ /.*/)
Dabei sollte die Regex doch eigentlich passen ? Ich Versethe nicht ganz warum im in dem Regex-Teil von DOIF Klammern brauche?! () mir würde es genügen wenn die Regex matched ..
Zitat von: CaptainHook am 08 Januar 2016, 19:28:18
Das wäre sehr gut wenn das in die Doku hinkommen würde ;)
DOIF ist ein meiner Liebsten Module, weil man sich damit den "komplexesten Kram" ausdenken kann und er funktioniert!
Ein "Problem" habe ich mit der Lösung noch.. bzw. passt noch nicht 100%
Ich möchte das der Long-Befehl nur bei 4 Sekunden Ausgelöst wird,,,
Das klappt noch nicht richtig ,, derzeit wird es auch über 5 Sekunden ausgeführt.
([HM_3AF410_Btn_06:state:[((.*Short.*)|(.*Long\W[1234]\D.*))]] =~ /.*/)
Dabei sollte die Regex doch eigentlich passen ? Ich Versethe nicht ganz warum im in dem Regex-Teil von DOIF Klammern brauche?! () mir würde es genügen wenn die Regex matched ..
Das hat etwas mit Regex zu tun. Der Filter ist dazu gedacht "etwas"aus dem Reading/Status herausfiltern und das, was herausgefiltert werden soll, muss in runde Klammern. Der Wert von $1 wird dann verwendet. Ich habe mir schon vieles selbst ausgedacht, aber das gehört zur Regex.
Die Option d für Filtern nach Zahlen sieht z. B. intern so aus: (-?\d+(\.\d+)?)
Gruß
Damian
ZitatIch möchte das der Long-Befehl nur bei 4 Sekunden Ausgelöst wird,,,
Das klappt noch nicht richtig ,, derzeit wird es auch über 5 Sekunden ausgeführt.
Du machst Dir so viel Mühe mit der Regex und dann ist es Dir egal was dabei heraus kommt ;)
[HM_3AF410_Btn_06:state:[((.*Short.*)|(.*Long\W[1234]\D.*))]] =~ /.*/
ist immer "wahr", lass das
=~ /.*/
mal weg.