"Zufälligen" hex Wert generieren

Begonnen von harle, 11 November 2021, 18:36:41

Vorheriges Thema - Nächstes Thema

harle

Hallo liebe alle,

vorab, ich habe leider nur rudimentäre Programmierkenntnisse (das wird man gleich lesen), benutze FHEM zwar schon lange, aber erst jetzt möchte ich Bedingungen implementieren und stoße am meine Grenzen mit perl.

ich habe eine Philips Hue Go an die ich einen hex Farbcode senden kann und diese entsprechend die Farbe wechselt.

Ich habe mir schon ein at erstellt, welches alle X Minuten einen zufälligen hex Wert generieren und senden soll.

Ich hatte im Forum etwas Code ergoogled und mir dann gedacht, hex hat 6 Stellen, schickst du halt mit

set Philips_Hue_Go_1 hex {(int(rand(999998))+1)}

immer maximal 999999 an die Lampe.

Das funktioniert zu meiner Überraschung auch, bis - so meine Vermutung - ein "invalid value" generiert wird und die Hue dann keine Änderungen mehr mit sich machen lässt, bis ich den ganzen Rpi neu starte.

Könnt ihr mir auf die Sprünge helfen, was der Fehlergrund ist?


Viele Grüße

bartman121

#1
also ich bin kein Profi, aber gehen müsste das ... Achtung, das ist direkt perl, dafür könnte es aber alle möglichen Farbcodes erzeugen.

{
my $hex = sprintf("%X", int(rand(256))).sprintf("%X", int(rand(256))).sprintf("%X", int(rand(256)));;
fhem("set Philips_Hue_Go_1 hex $hex");;
}

harle

#2
Besten Dank, das funktioniert.
Nur mal nachgehackt, kann man den Hexwert auch direkt übergeben oder sollte/muss man den umweg über die Variable $hex gehen?

/e: Ja, das funktioniert offenbar, ich habe es so gemacht und es scheint zu laufen:

set Philips_Hue_Go_1 hex {(sprintf("%X%X%X", int(rand(256)), int(rand(256)), int(rand(256))))}

bartman121

Sehr schön...

Ich würde sagen bei meinem Code knallt es auch irgendwann wieder.... Nämlich dann wenn int(256) eine Zahl kleiner 16 liefert.... Weil du dann nur ein Hex-zeichen bekommst....

Das musst du noch sinnvoll lösen...

Hab im Moment keine Idee dafür

OdfFhem


%02X


0 heißt mit Nullen auffüllen
2 ist die gewünschte Gesamtlänge

harle

Guten Morgen,

darf ich hier nochmal zum Verständnis nachfragen:

Wenn ich

+*00:05:00 set Philips_Hue_Go_1 hex {{{(sprintf("%02X%02X%02X", int(rand(256)), int(rand(256)), int(rand(256))))}}

übergeben möchte funktioniert es nicht (Lampe nur blau). Wo liegt der Fehler in meinem Syntax, um die Korrektur von OdfFhem einbauen zu können?


Vielen Dank!

bartman121

ich befürchte, dass rand(xxx) nur bei der Timer-Definition ausgeführt wird. Das liegt halt in der Art und weise wie FHEM arbeitet.

Ich würde empfehlen den Befehl in eine myUtils-Routine auszulagern und im Timer diese Routine aufzurufen.

Viel Erfolg

harle

Hallo zusammen,
ich habe nun

# Enter you functions below _this_ line.

my $hex = sprintf("%02X", int(rand(256))).sprintf("%02X", int(rand(256))).sprintf("%02X", int(rand(256)));;


1;


so in meine myUtils integiert.

Ob dies so korrekt ist und wie ich das in einen Aufruf zum Schalten der Lampenfarbe integriere ist mir noch nicht schlussendlich klar.

Ich hoffe, die Diskussion kann hier noch weitergehen und das Ergebnis kann zukünftig in ähnlichen Fällen weiterhelfen.

bartman121

so geht's  natürlich nicht ....

da fehlt ein bisschen was ...


sub generate_random_hexcolor() {
my $hex = sprintf("%02X", int(rand(256))).sprintf("%02X", int(rand(256))).sprintf("%02X", int(rand(256)));;
return $hex;
}


deine Timerdefinition müsste dann so aussehen ...


define at_huo_go_1_randomhex +*00:05:00 set Philips_Hue_Go_1 hex {generate_random_hexcolor()}


Ich hoffe das funktioniert so ...

Grundsätzlich wäre noch zu prüfen ob man das nicht besser mit https://metacpan.org/pod/Color::Rgb zu lösen wäre.

Vielleicht kommt ja noch ein Profi um die Ecke...

harle

Hi zurück,

vielen Dank für deine Hilfe.

Ich habe es jetzt zwei Stunden probiert, egal welcher Code in der myUtils steht, der Aufruf von

set Philips_Hue_Go_1 hex {generate_random_hexcolor()} setzt die Lampe auf blau.

Der direkte Aufruf

set Philips_Hue_Go_1 hex {(sprintf("%02X%02X%02X", int(rand(256)), int(rand(256)), int(rand(256))))}

funktioniert oder ist hier die Syntax falsch?





Wernieman

Was gibt denn ein "{generate_random_hexcolor()}" in der Eingabezeile von FHEM?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

harle


Wernieman

- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Der_Tom

an was für eine Bridge ist denn die GO angelernt ?

ich tue mich mit dem Befehl "hex" gerade etwas schwer, zumindest das hue-Modul bietet diesen nicht .

gruss Thomas


Unknown argument hex, choose one of off on toggle statusRequest pct bri rgb color ct hue sat xy dimUp dimDown ctUp ctDown hueUp hueDown satUp satDown alert effect rename scene blink off-for-timer intervals on-till-overnight on-till off-till-overnight off-till on-for-timer attrTemplate

Beta-User

set Philips_Hue_Go_1 hex {generate_random_hexcolor()}
dürfte auch "falsches set magic" sein. Würde mal folgendes versuchen:

set Philips_Hue_Go_1 hex {(generate_random_hexcolor())}

Ansonsten kann man zum einen den ganzen Code in Perl schreiben, dann sollte die Evaluierung "at runtime" erfolgen, und zum anderen kann man das sprintf doch auch gleich so schreiben, dass 6 Stellen rauskommen...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors