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
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
So gehts:
RepeatCnt {my ( $r ) = ReadingsVal("6fach1_1","state",0) =~ m/(\d+)/; return($r);}
mein Aktor heisst 6fach1_1
lg
mike
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
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
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