DOIF mit Regex erzeugt Timer / Bug?

Begonnen von CaptainHook, 08 Januar 2016, 08:13:24

Vorheriges Thema - Nächstes Thema

CaptainHook

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
Lenovo M53 ThinkCentre 10DC | Docker | SolarEdge SE10K + SE5000H + Energy Bank 10KWh | EspEasy | Tasmota | Hue | Alexa | uvm.

Ellert


CaptainHook

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
Lenovo M53 ThinkCentre 10DC | Docker | SolarEdge SE10K + SE5000H + Energy Bank 10KWh | EspEasy | Tasmota | Hue | Alexa | uvm.

Ellert

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.

CaptainHook

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
Lenovo M53 ThinkCentre 10DC | Docker | SolarEdge SE10K + SE5000H + Energy Bank 10KWh | EspEasy | Tasmota | Hue | Alexa | uvm.

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CaptainHook

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 ..

Lenovo M53 ThinkCentre 10DC | Docker | SolarEdge SE10K + SE5000H + Energy Bank 10KWh | EspEasy | Tasmota | Hue | Alexa | uvm.

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

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.