eventMap mit Perl-Code/RegEx

Begonnen von mark24, 11 Juni 2021, 23:42:20

Vorheriges Thema - Nächstes Thema

mark24

Hallo,

ich versuche mit Hilfe eines eventMap einen übergebenen Wert zu prüfen, zu ändern und anschließend zu setzen. Allerdings scheitere ich am verändern des Wertes.

Was habe ich vor - Bei meiner Zipato Bulb 2 (Zwave) kann über "wcrgb" die Lichtfarbe gesteuert werden. Warm und Kalt-Weiß werden über zwei getrennte Werte definiert. Im FTUI möchte ich den Wechsel zwischen kalt und warm-Weiß über einen Slider abbilden und nutze dafür den Wertebereich -250 bis 250.

Mir ist es gelungen ein eventMap zu erstellen, welche den Wert prüft und je nach positiv oder negativ damit Warm oder Kaltweiß setzt.

eventMap   { usr=>{'c_temp(.*)'=>'".(($1 + 0) gt 0 ? "wcrgb$1 0 0 0 0" : "wcrgb 0$1 0 0 0")."' }}


Was nun natürlich nicht funktioniert ist, der Birne einen negativen Wert für kalt-Weiß (else block) zu übergeben. Das minus muss also weg - aber daran scheitere ich.

Mit Perl dürfte abs() genau das tun, aber ich bekomm es so nicht zum laufen. gleiches gilt für Ansätze mittels Regex


{ usr=>{'c_temp(.*)'=>'".(($1 + 0) gt 0 ? "wcrgb$1 0 0 0 0" : "wcrgb 0abs($1) 0 0 0")."' }}


Das ausgefallene und mehrzeilige Konstrukte funktionieren, habe ich hier (https://forum.fhem.de/index.php/topic,88904.msg814161.html#msg814161) schon gesehen.
Allerdings gelingt es mir nicht die dortige Lösung für meinen Fall zu adaptieren


{ usr=>{'c_temp(.*)'=>'".(my $ww=0, my $cw=0; ($1 + 0) gt 0 ? ($ww=$1) : ($cw=abs($1))); "wcrgb $ww %cw 0 0 0"."' }}


Mehrzeiliger Perl-Code in userReadings funktionieren bei mir jedoch problemlos.
Was Perl angeht, kratze ich sowieso schon nur an der Oberfläche. Was alles angepasst/maskiert werden muss um es fhem "unter zu jubeln" übersteigt meinen Horizont...
Hab z.B. keine Ahnung warum der Code am Anfang und Ende einen Punkt ( '".(...)."' ) braucht - ohne funktionierts aber nicht.

hat jemand eine Idee wie der Code aussehen müsste oder ist eventMap für mein Vorhaben der falsche Ansatz?

Danke!
Marcus


rudolfkoenig

https://perldoc.perl.org/perlop:
ZitatBinary "gt" returns true if the left argument is stringwise greater than the right argument.

Folgendes funktioniert bei mir, ich habe aber keine Ahnung, ob das so gewollt ist:

fhem> define SSR2_day dummy
fhem> attr SSR2_day eventMap   { usr=>{'c_temp (.*)'=>'".($1 > 0 ? "wcrgb $1 0 0 0 0" : "wcrgb 0 ".abs($1)." 0 0 0")."' }}
fhem> info timer
fhem> set SSR2_day c_temp 21
2021-06-12 11:02:45 dummy SSR2_day wcrgb 21 0 0 0 0
fhem> set SSR2_day c_temp -21
2021-06-12 11:02:47 dummy SSR2_day wcrgb 0 21 0 0 0


Generell wuerde ich erst den Input, und was man als output erwartet exakt(!) beschreiben, und den nicht funktionierenden Code erst danach hinzufuegen.
Und ein Beispiel, was nicht funktioniert, reicht.

mark24

deine Lösung ist genau was ich suchte, besten Dank!

warum sich "gt" in diesem Szenario genauso verhielt wie ">" hatte mich auch gewundert.