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
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");;
}
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))))}
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
%02X
0 heißt mit Nullen auffüllen
2 ist die gewünschte Gesamtlänge
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!
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
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.
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...
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?
Was gibt denn ein "{generate_random_hexcolor()}" in der Eingabezeile von FHEM?
Da kommt ein Hex Code raus. :o ???
Jedes mal ein Zufällig neuer?
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
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...
Zitat von: Der_Tom am 13 November 2021, 16:55:39
an was für eine Bridge ist denn die GO angelernt ?
zigbee2mqtt via Conbee2, template light rgbwrgb
set Philips_Hue_Go_1 hex {(generate_random_hexcolor())}
Danke, das passt. War auch doof, das ich es selbst nicht gemerkt habe.