FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: FHEm2005 am 01 Juli 2016, 13:16:33

Titel: [erledigt] REGEX, Wo ist der Haken bzw. Fehler?
Beitrag von: FHEm2005 am 01 Juli 2016, 13:16:33
Ich habe einen Homematic HM-PB-2-WM55 der u.a. das Reading state bringt. Bei längerem drücken zeigt das Reading LongRelease n_136 (to virt_Akt01). Ich brauche die Anzahl von n zur Weiterverarbeitung. Deshalb wollte ich mit dem folgenden UserReading mitr die Anzahl der RepeatCounts merken.

attr Sw_Test_Btn_01 userReadings RepeatCnt {my $r = ReadingsVal($NAME,"state",0);$r =~ /(\d+/; return($r);}

Ich kann machen was ich will, im UserReading steht immer der komplette Status. Auf einer Testeite für REGEX wird das richtige Ergebnis (nur die Anzahl der Wiederholungen als Ziffer) angezeigt, aber hier nicht.  :( :(

Die Konfiguration als Listing:

Internals:
   DEF        3B6XXX01
   NAME       Sw_Test_Btn_01
   NR         1363
   STATE      LongRelease 5_136 (to virt_Akt01)
   TYPE       CUL_HM
   chanNo     01
   device     Sw_Test
   Readings:
     2016-06-17 18:59:53   R-virt_Akt01_Btn1-expectAES set_off
     2016-06-17 18:59:53   R-virt_Akt01_Btn1-peerNeedsBurst set_off
     2016-06-19 16:31:38   R-virt_Akt01_Btn3-expectAES set_off
     2016-06-19 16:31:38   R-virt_Akt01_Btn3-peerNeedsBurst set_off
     2016-07-01 13:01:37   RepeatCnt       LongRelease 5_136 (to virt_Akt01)
     2016-07-01 13:01:37   state           LongRelease 5_136 (to virt_Akt01)
     2016-07-01 13:01:37   trigDst_virt_Akt01 noConfig
     2016-07-01 13:01:37   trigger         Long_136
     2016-07-01 13:01:37   trigger_cnt     136
   Helper:
     BNO        136
     BNOCNT     5
     Expert:
       def        1
       det        1
       raw        1
       tpl        1
     Role:
       chn        1
     Tmpl:
Attributes:
   event-on-change-reading .*
   expert     251_anything
   model      HM-PB-2-WM55
   peerIDs
   room       Licht,Schalter
   userReadings RepeatCnt {my $r = ReadingsVal($NAME,"state",0);$r =~ /(\d+/; return($r);}


Erkennt Jemand den Fehler? Ich jedenfalls nicht.

Gruß Eberhard
Titel: Antw:REGEX, Wo ist der Haken bzw. Fehler?
Beitrag von: Icinger am 01 Juli 2016, 13:26:07
attr Sw_Test_Btn_01 userReadings RepeatCnt {my $r = ReadingsVal($NAME,"state",0);$r =~ /\d+/; return($r);}

Deine Regex kann nicht funktionieren, da ist ne Klammer falsch/zuviel drinnen.

lg, Stefan
Titel: Antw:REGEX, Wo ist der Haken bzw. Fehler?
Beitrag von: jmike am 01 Juli 2016, 13:26:27
So gehts:


RepeatCnt {my ( $r ) = ReadingsVal("6fach1_1","state",0) =~ m/(\d+)/; return($r);}


mein Aktor heisst 6fach1_1

lg
mike
Titel: Antw:REGEX, Wo ist der Haken bzw. Fehler?
Beitrag von: FHEm2005 am 01 Juli 2016, 14:27:56
Ich warja schon verteufelt nah dran, aber dicht daneben ist auch vorbei. Jetzt geht es - Vielen Dank. Die halbe Klammer war nicht der wirkliche Fehler, sondern die fehlenden Klammern um das $r. Lasse ich die weg, bleibt er bei "1" stehen und zählt nicht weiter. Warum das "m" für Multiline da steht entzieht sich meiner Kenntnis, habe ich aber übernommen. Ohne geht es auch.

Danke!
Gruß Eberhard
Titel: Antw:[erledigt] REGEX, Wo ist der Haken bzw. Fehler?
Beitrag von: jmike am 01 Juli 2016, 16:14:17
Hi Eberhard.

Ja, Du brauchst die ( ) um $r um den match von m/(<regex>)/ aufzufangen. Ansonsten bekommst du nur 1 - sowie true - zurück weil die Regex gematcht hat.

Du könntest auch z.b. zwei Werte auffangen mittels:

my ( $m1, $m2 ) = Readings() =~ m/(erster-Match)_(zweiter-Match)/;


Ob die Regex mit m// anfängt oder nicht ist tatsächlich egal, hat sich bei mir halt so eingeschliffen. m// für match, s/// für search-replace :)
Was du mit Multiline meinst verstehe ich nicht ganz. Das wäre ja dann m/<regex>/g

Aber es gibt sicherlich mehrere Wege nach Rom :)

mike
Titel: Antw:[erledigt] REGEX, Wo ist der Haken bzw. Fehler?
Beitrag von: FHEm2005 am 03 Juli 2016, 16:24:36
Hallo Mike,
vielen Dank für die Erläuterung der () um $r. Das habe ich nun verinnerlicht. Ich habe nicht genau hingesehen und deshalb m// und m/ "vereinheitlicht".
Klasse.

Gruß Eberhard