;) 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.
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
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;
}
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
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
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