FHEM Forum

FHEM => Sonstiges => Thema gestartet von: Master_Nick am 10 August 2018, 13:42:32

Titel: Userreading mit regex [gelöst]
Beitrag von: Master_Nick am 10 August 2018, 13:42:32
 ;) Moin!

Ich habe ehrlich gesagt noch kaum mit userreadings gearbeitet - möchte aber nun aus dem colorpicker den HEX Wert aufsplitten in 3 Werte (Rot, Grün und Blau), da mein Gerät entweder mittels Bitshifting die Werte nehmen würde oder als einzelne Werte für jede Farbe, nicht aber als HEX.

Mein Gedanke war nun (erstmal) für den ersten Wert also die ersten beiden HEX Positionen dies mittels regex zu isolieren, dafür reicht:
\Color \K[[:alnum:]]{2} Da mein Device state so aussieht (Device nutzt den RGB Colorpicker): Color 8D85FF

Als userreading habe ich nun folgendes versucht - es knallt aber nur :-D und so wirklich klar ob regex da überhaupt anwendbar ist bin ich mir auch nicht. Geschweige wie die Aufteilung der Ebenen ist. Ich denke den Teil mit Variable und Regex sollte/muss ich in Perl verarbeiten und dann wieder zu FHEM schwenken um das reading zu setzen. Evtl muss ich es auch auslagern und mit setreading arbeiten.

Mein aktueller - nicht funktionierender - Stand:


{
my $actstate=(ReadingsVal($name , 'state' ,''));
my $newstate1=hex(/s/\Color \K[[:alnum:]]{2}/($actstate));
Rot {hex(/s/\Color \K[[:alnum:]]{2}/(ReadingsVal($name , 'state', 0))};
}


Wirklich was gefunden in der Suche habe ich nur zur Nutzung von Variablen mit userreadings nicht aber zu regex :-D

Ich danke schon mal für jegliche Hilfe.
Titel: Antw:Userreading mit regex
Beitrag von: Otto123 am 10 August 2018, 14:47:53
Hi,

na mein Verständnis von userreadings ist so:
Name {hier drin ist einfach Perl, was zurück gegeben wird landet im Reading }

Also das Beispiel schreibt Dir einfach Willi in das Reading Spass attr Dummy userReadings Spass {return "Willi"}

Und userReadings werden z.B. aktualisiert, wenn ein Reading im Device aktualisiert wird. In Perl kannst Du alles machen.
Statt return kommt auch von selbst der Wert zurück, der zuletzt gesetzt wird. Das letzte Ergebnis sozusagen. Der Code kopiert einfach das Reading state:
{ReadingsVal($name , 'state', 0)}

Wenn der Code im userReadings zu lang wird, lagerst Du ihn aus in die 99_myUtils - der Rückgabewert des Funktionsaufrufes landet dann im Reading.

Gruß Otto
Titel: Antw:Userreading mit regex
Beitrag von: Master_Nick am 11 August 2018, 03:59:12
Sehr cool :-)
Deine Infos und etwas googlen halfen mir und es funktioniert:

Red {
my $R = '';
$R = ReadingsVal($name , 'state' ,'');
$R =~ /Color \K[[:alnum:]]{2}/;
$R = hex($&);
return $R;
}


jetzt würde ich gern das funktionierende auch für blau und grün haben.
Aber anscheinend geht nur eines pro userreading?

Ich hab es aktuell so, bedient wird nur rot:

userReadings Red {
my $R = '';
$R = ReadingsVal($name , 'state' ,'');
$R =~ /Color \K[[:alnum:]]{2}/;
$R = hex($&);
return $R;
}

Green {
my $G = '';
$G = ReadingsVal($name , 'state' ,'');
$G =~ /Color [[:alnum:]]{2}\K[[:alnum:]]{2}/;
$G = hex($&);
return $G;
}

Blue {
my $B = '';
$B = ReadingsVal($name , 'state' ,'');
$B =~ /Color [[:alnum:]]{2}[[:alnum:]]{2}\K[[:alnum:]]{2}/;
$B = hex($&);
return $B;
}
Titel: Antw:Userreading mit regex
Beitrag von: MadMax-FHEM am 11 August 2018, 06:43:01
ZitatuserReadings
Komma getrennte Liste von benutzerdefinierten Readings

Ausführlich siehe commandref: https://fhem.de/commandref_DE.html#userReadings

Kurz da nur Handy grad...

Gruß, Joachim
Titel: Antw:Userreading mit regex
Beitrag von: supernova1963 am 11 August 2018, 07:09:59

Jeweils ein Reading Red, Green, Blue

attr <Device> userReadings Red {
my $R = '';
$R = ReadingsVal($name , 'state' ,'');
$R =~ /Color \K[[:alnum:]]{2}/;
$R = hex($&);
return $R;
}
,
Green {
my $G = '';
$G = ReadingsVal($name , 'state' ,'');
$G =~ /Color [[:alnum:]]{2}\K[[:alnum:]]{2}/;
$G = hex($&);
return $G;
}
,
Blue {
my $B = '';
$B = ReadingsVal($name , 'state' ,'');
$B =~ /Color [[:alnum:]]{2}[[:alnum:]]{2}\K[[:alnum:]]{2}/;
$B = hex($&);
return $B;
}



Alles in einem reading z.B. rgghex:

attr <Device> userReadings rgghex {
my $R = '';
$R = ReadingsVal($name , 'state' ,'');
$R =~ /Color \K[[:alnum:]]{2}/;
$R = hex($&);

my $G = '';
$G = ReadingsVal($name , 'state' ,'');
$G =~ /Color [[:alnum:]]{2}\K[[:alnum:]]{2}/;
$G = hex($&);

my $B = '';
$B = ReadingsVal($name , 'state' ,'');
$B =~ /Color [[:alnum:]]{2}[[:alnum:]]{2}\K[[:alnum:]]{2}/;
$B = hex($&);

return $R.$G.$B;
}

Ungetestet, nur zum Verdeutlichen der Vorgehensweise.

Gernot
Titel: Antw:Userreading mit regex
Beitrag von: Master_Nick am 11 August 2018, 11:39:06
 8) Mega :-D da fehlte also bei mir nur ein , zwischen den Userreadings- vielen Dank funktioniert.


Hihi okay, dass der einleitende Satz des passenden Commandrefs da nun nochmal geholfen hätte.... naja nun weiß ichs :-D