[FTUI3] Icon name regex

Begonnen von ms_steini, 09 September 2022, 09:55:54

Vorheriges Thema - Nächstes Thema

ms_steini

schönen guten Tag zusammen,

ich verzweifle gerade an eigentlich ganz einfachem Regex für die Darstellung der Icons.

Ich habe einen Homematic Dimmer und möchte für die einzelnen Helligkeiten (pct) ein anderes Icon anzeigen lassen.
0 = light_light_dim_0
0.5 bis 9.5 = light_light_dim_09
10 bis 19.5 = light_light_dim_10
.
.
90 bis 99.5 = light_light_dim_90
100 =  light_light_dim_100

Es funktioniert auch alles bis auf pct = 100, hier wird das Icon "light_light_dim_09" angezeigt.

Ich habe jede einzelne Regex unter https://regex101.com/ getestet und da scheint alles richtig zu sein.
was ist denn an dem Regex falsch?

<ftui-icon
[name]="EG.Dimmer.Buero_Dim:pct | map('
0:light_light_dim_0,
`^[1-9]$|^[0-9]\.[0-9]$`:light_light_dim_09,
`^1[0-9]$|^1[0-9]\.[0-9]$`:light_light_dim_10,
`^2[0-9]$|^2[0-9]\.[0-9]$`:light_light_dim_20,
`^3[0-9]$|^3[0-9]\.[0-9]$`:light_light_dim_30,
`^4[0-9]$|^4[0-9]\.[0-9]$`:light_light_dim_40,
`^5[0-9]$|^5[0-9]\.[0-9]$`:light_light_dim_50,
`^6[0-9]$|^6[0-9]\.[0-9]$`:light_light_dim_60,
`^7[0-9]$|^7[0-9]\.[0-9]$`:light_light_dim_70,
`^8[0-9]$|^8[0-9]\.[0-9]$`:light_light_dim_80,
`^9[0-9]$|^9[0-9]\.[0-9]$`:light_light_dim_90,
100:light_light_dim_100')">
</ftui-icon>


Vielen Dank

yersinia

Lass mal ^ und $ weg, da diese durch FTUI3 schon gesetzt werden.
Darüber hinaus zieh doch die 100 mal nach vorne, als ersten map Wert.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

ms_steini

#2
es geht überhaupt nicht wenn ich ^ und $ weg lasse
dann wird bei jedem PCT Wert das Icon "light_light_dim_09" angezeigt außer bei PCT = 0

Wenn ich die Zeile "`^[1-9]$|^[0-9]\.[0-9]$`:light_light_dim_09," komplett weg lasse funktioniert es, nur dann fehlt mir der Bereich
von 0.5 bis 9.5

mr_petz

#3
Mach das ganze doch mit step() und ohne dem regex...
LG

Edit: https://forum.fhem.de/index.php/topic,123701.msg1182722.html#msg1182722

ms_steini

jep, funktioniert...

wundert mich allerdings, sollte aber doch auch mit regex funktionieren.
Mit step() ist aber auch viel einfacher.

Danke für den Hinweis.

OdfFhem

Zitat von: ms_steini am 09 September 2022, 13:06:10
wundert mich allerdings, sollte aber doch auch mit regex funktionieren.

Der reguläre Ausdruck ist zu allgemein, da man den Punkt (.) in diesem Umfeld nicht maskieren kann ... \ wird ignoriert bzw. entsorgt.

`^[1-9]$|^[0-9]\.[0-9]$`:light_light_dim_09,

100 passt also auf den resultierenden, regulären Ausdruckteil ^[0-9].[0-9]$

Gibt man den Punkt (.) im Rahmen der eckigen Klammern an, so handelt es sich tatsächlich um einen Punkt und nicht mehr um den Platzhalter für ein beliebiges Zeichen

`^[1-9]$|^[0-9][.][0-9]$`:light_light_dim_09,

Kein Treffer mehr im Falle von 100

ms_steini

@OdfFhem

vielen DANK für die Erklärung

mr_petz

#7
Hier deine Lösung mit map():

<ftui-icon
[name]="EG.Dimmer.Buero_Dim:pct | map('
`0|0.0`:light_light_dim_0,
`^[1-9]$|^0.[1-9]$|^[1-9][.][0-9]$`:light_light_dim_09,
`1[0-9]$|1[0-9].[0-9]`:light_light_dim_10,
`2[0-9]|2[0-9].[0-9]`:light_light_dim_20,
`3[0-9]|3[0-9].[0-9]`:light_light_dim_30,
`4[0-9]|4[0-9].[0-9]`:light_light_dim_40,
`5[0-9]|5[0-9].[0-9]`:light_light_dim_50,
`6[0-9]|6[0-9].[0-9]`:light_light_dim_60,
`7[0-9]|7[0-9].[0-9]`:light_light_dim_70,
`8[0-9]|8[0-9].[0-9]`:light_light_dim_80,
`9[0-9]|9[0-9].[0-9]`:light_light_dim_90,
`100|100.0`:light_light_dim_100')">
</ftui-icon>


Zumindest geht es so im label
LG mr_petz

Edit: Code geändert.

ms_steini

#8
das ist natürlich auch nicht schlecht.

Mein Problem war, das ich gedacht habe ich müsste den (.) Punkt mit \ escapen.
Unter https://regex101.com/ wurde es jedenfalls so ausgegeben.

aber in meinem Fall passt "step()" tatsächlich besser.

OdfFhem

@mr_petz
Wenn z.B. 1.0 nicht als Wert vorkommen kann, dann klappt Dein Trick mit der Nachkommastelle von 1 bis 9.
Wenn auch ein Wert > 100 und ohne Nachkommastellen vorkommen könnte, dann würden ganz viele Werte zwischen 101 und 999 matchen.


Zitat von: ms_steini am 09 September 2022, 23:03:30
Mein Problem war, das ich gedacht habe ich müsste den (.) Punkt mit \ escapen.
Unter https://regex101.com/ wurde es jedenfalls so ausgegeben.
https://regex101.com/ "arbeitet" im normalen Umfeld und bietet einem die Möglichkeit zum "Austoben".
Befindet man sich direkt unter JavaScript, sollte man (fast) alle "erarbeiteten" Testszenarien übertragen können.
Im Pipe-Umfeld von FTUI3 hat man allerdings ein paar Restriktionen bzgl. einzelner Zeichen, die die Möglichkeiten reduzieren ...

mr_petz

#10
@OdfFhem
Haste mal wieder Recht ;)
aber jetzt:

map('
`0|0.0`:light_light_dim_0,
`^[1-9]$|^0.[1-9]$|^[1-9][.][0-9]$`:light_light_dim_09,
`1[0-9]$|1[0-9].[0-9]`:light_light_dim_10,
`2[0-9]|2[0-9].[0-9]`:light_light_dim_20,
`3[0-9]|3[0-9].[0-9]`:light_light_dim_30,
`4[0-9]|4[0-9].[0-9]`:light_light_dim_40,
`5[0-9]|5[0-9].[0-9]`:light_light_dim_50,
`6[0-9]|6[0-9].[0-9]`:light_light_dim_60,
`7[0-9]|7[0-9].[0-9]`:light_light_dim_70,
`8[0-9]|8[0-9].[0-9]`:light_light_dim_80,
`9[0-9]|9[0-9].[0-9]`:light_light_dim_90,
`100|100.0`:light_light_dim_100')

Es funktioniert nur von 0 bis 100 mit und ohne einer Nachkommastelle.
Bei step() funktioniert es mit egal wievielen Nachkommastellen.
Bei entsprechendem step() würde es bei kleiner 0 und größer 100 auch nicht mehr gehen...
Ich wollte nur @ms_steini eine Lösung aufzeigen.
LG

Edit:
oder 0 bis 100 mit egal wieviel Nachkommastellen und alles regulär:

map('
`^0$|^0[.]0+$`:light_light_dim_0,
`^[1-9]$|^0[.][1-9].*$|^[1-9][.].*$`:light_light_dim_09,
`^1[0-9]$|^1[0-9][.].*$`:light_light_dim_10,
`^2[0-9]$|^2[0-9][.].*$`:light_light_dim_20,
`^3[0-9]$|^3[0-9][.].*$`:light_light_dim_30,
`^4[0-9]$|^4[0-9][.].*$`:light_light_dim_40,
`^5[0-9]$|^5[0-9][.].*$`:light_light_dim_50,
`^6[0-9]$|^6[0-9][.].*$`:light_light_dim_60,
`^7[0-9]$|^7[0-9][.].*$`:light_light_dim_70,
`^8[0-9]$|^8[0-9][.].*$`:light_light_dim_80,
`^9[0-9]$|^9[0-9][.].*$`:light_light_dim_90,
`^100$|^100[.]0+$`:light_light_dim_100')


aber mit step() ist es natürlich einfacher. Ich spiele nur gern... :D