[fast gelöst] [perl] Erste Schitte mit random RGB Wert

Begonnen von LarsMie, 09 Januar 2016, 21:36:56

Vorheriges Thema - Nächstes Thema

LarsMie

Früher oder später wollte ich mich mit dem Thema Perl auf jeden Fall auseinandersetzen. Da ich jezt eine Funktion brauche, um einen RGB-Wert zufällig zu generieren, habe ich mich mal dran gemacht.

sub randomRGB()
{
my $rgb;
my ($r, $g, $b) = (int(rand(256)), int(rand(256)), int(rand(256)));

$rgb = sprintf("%02x%02x%02x", $r, $g, $b);

return ($rgb)
}


Syntaktisch gab es vom Editor keine Fehlermeldungen, die Funktion sollte also den random-Wert zurückgeben.


Erste Frage:

Ist das alles so richtig?

Zweite Frage:

Wenn ich folgendes in die codezeile eingebe:

set  MQTT_TV_SOCKEL rgb {randomRGB}

wird mein RGB-Stripe auf weiß gestellt.


Das heißt eintweder ist was in meinem Perl-Code falsch, oder ich habe den Befehl falsch eingegeben. Ich muss gestehen, dass ich mit dem ausführen von Perl-Codes in der Kommandozeile noch keine Erfahrungen habe.

Wie wirds richtig gemacht? (Steht bestimmt in der Doku, bzw in dem Fhem-Script)

Danke für eure Tipps

CoolTux

Bau doch mal ein paar Logs ein oder wegen meiner auch printf ausgaben. Lasse Dir ausgeben wie Deine skalare befüllt wurden. Dann findest Du auch schnell den Fehler.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

LarsMie

 ;D

Warum komm ich da nicht drauf... Klar, ist zum debuggen natürlich besser! Ich teste das mal aus.

LarsMie

Also,

einen kleinen Fehler habe ich gefunden, und zwar beim return fehlte ein Semikolon.


Habe ie Funktion in der Befehlszeile ausgeführt und mittels printf die Werte mal ausgeben lassen in die logdatei:

Das steht im Fenster:

1347e0


und das im log:


R:19
G:71
B:224
RGB:1347e0


Scheint also richtig zu sein.

Liegt der Fehler also beim ausführen des Befehls!? Wird der Befehl nicht durch den return-Wert direkt ersetzt, muss ich also noch eine bestimmte Konvertierung durchführen?

Oder muss der Befehl an sich anders geschrieben werden?

So:

set  MQTT_TV_SOCKEL rgb {randomRGB}

oder so:

fhem (set MMQTT_TV_SOCKEL rgb {randomRGB()}

oder ganz anders??



LarsMie

So funktioniert es:

Zuerst die Funktion für die random RGB-Werte (gibt einen zufälligen RGB-Wert als string zurück):

sub randomRGB()
{
my $rgb;
my ($r, $g, $b) = (int(rand(256)), int(rand(256)), int(rand(256)));

$rgb = sprintf("%02x%02x%02x", $r, $g, $b);

printf "R:$r\nG:$g\nB:$b\nRGB:$rgb\n";

return ($rgb);
}


Ich habe mir dann eine extra Funktion geschrieben, in der ich nun das gewünschte device als Parameter übergebe:

sub setRandomRGB($)
{
my $device = shift;
my $rgb = randomRGB();

{fhem("set $device rgb $rgb")};

}


Nun kann ich das device wie folgt mit einem zufälligen Farbwert setzen:

{setRandomRGB("MQTT_TV_SOCKEL")}

Generalisiert:

{setRandomRGB("<device>")}

Wäre natürlich schicker, das ganze in "echtem" Fhem-Code in der Befehlszeile ausführen zu können, wie ich im Eingangspost geschrieben habe.

So kann ich das ganze aber zumindest in DOIF-Anweisungen nutzen.

Edit:

@Moderatoren: Falls das hier besser in den Bereich "Codeschnipsel" passt, dann bitte Verschieben.  :)

LarsMie


justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968