[erledigt] REGEX, Wo ist der Haken bzw. Fehler?

Begonnen von FHEm2005, 01 Juli 2016, 13:16:33

Vorheriges Thema - Nächstes Thema

FHEm2005

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
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM, BSB-LAN

Icinger

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
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

jmike

So gehts:


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


mein Aktor heisst 6fach1_1

lg
mike

FHEm2005

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
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM, BSB-LAN

jmike

#4
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

FHEm2005

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
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM, BSB-LAN