FHEM Forum

FHEM => Frontends => Thema gestartet von: mark24 am 11 Juni 2021, 23:42:20

Titel: eventMap mit Perl-Code/RegEx
Beitrag von: mark24 am 11 Juni 2021, 23:42:20
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 (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

Titel: Antw:eventMap mit Perl-Code/RegEx
Beitrag von: rudolfkoenig am 12 Juni 2021, 11:18:50
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.
Titel: Antw:eventMap mit Perl-Code/RegEx
Beitrag von: mark24 am 13 Juni 2021, 06:07:50
deine Lösung ist genau was ich suchte, besten Dank!

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