FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: LarsMie am 09 Januar 2016, 21:36:56

Titel: [fast gelöst] [perl] Erste Schitte mit random RGB Wert
Beitrag von: LarsMie am 09 Januar 2016, 21:36:56
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
Titel: Antw:[perl] Erste Schitte mit random RGB Wert -> Frage zur werteübergabe
Beitrag von: CoolTux am 09 Januar 2016, 21:44:50
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
Titel: Antw:[perl] Erste Schitte mit random RGB Wert -> Frage zur werteübergabe
Beitrag von: LarsMie am 09 Januar 2016, 21:50:32
 ;D

Warum komm ich da nicht drauf... Klar, ist zum debuggen natürlich besser! Ich teste das mal aus.
Titel: Antw:[perl] Erste Schitte mit random RGB Wert -> Frage zur werteübergabe
Beitrag von: LarsMie am 09 Januar 2016, 22:12:25
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??


Titel: Antw:[perl] Erste Schitte mit random RGB Wert -> Frage zur werteübergabe
Beitrag von: LarsMie am 09 Januar 2016, 22:56:08
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.  :)
Titel: Antw:[fast gelöst] [perl] Erste Schitte mit random RGB Wert
Beitrag von: LarsMie am 10 Januar 2016, 15:03:23
Hat keiner eine idee??
Titel: Antw:[fast gelöst] [perl] Erste Schitte mit random RGB Wert
Beitrag von: justme1968 am 10 Januar 2016, 15:26:56
schau dir cmdalias an.

gruss
  andre