NEWS
Problem beim Skript für Farbwechsel mit Hue
-
Hallo, ich habe versucht ein Skript zu bauen, sodass meine Hue-Lampe regelmäßig die Farbe wechselt. Das Skript sieht wie folgt aus
~~![](</s><URL url=)http://fs1.directupload.net/images/180324/xmc36zoz.jpg" />
Aus irgendein Grund wechselt das Licht nur zweimal, sobald die Hue angschaltet wird und das wars dann. Jemand eine Idee wo der Denkfehler ist?~~
-
Kannst du mal den Javascript-Code zeigen den dieses Blockly "produziert" hat?
Gruß
-
Der Skript sieht wie folgt aus:
![](</s><URL url=)http://fs1.directupload.net/images/180326/zjnmxgjg.jpg" /> -
Okay, hier ist dein Denkfehler:
setStateDelayed ist gültig ab SOFORT bei ausführen des Befehls bzw. die Zeit läuft sofort wenn der setStateDelayed Befehl abgesetzt wird.
In deinem geposteten Script läuft es ungefähr so:
Innerhalb von 1 Sekunde läuft die while schleife 50 mal durch.
Du setzt also innerhalb von einer Sekunde sehr sehr viele setStateDelayed(..,1000)..
Also um 00:00:00.000 das erste mal
dann um 00:00:00.020 das zweite mal
dann um 00:00:00.040 das dritte mal..
Und die 1000 ms Verzögerung bezieht sich immer auf die Zeit wann das setStateDelayed gesetzt wurde.
Ausgehend von dem oben genannten Beispiel feuerst du also unglaublich viele setStateDelayed Befehle in einer wahnsinns Geschwindigkeit ab..
Dann wird der Datenpunkt gesetzt um 00:00:01.000 der zweite getStateDelayed läuft ab um 00:00:01.020 der dritte um 00:00:01.040 (immer 1000 ms nach dem du den setStateDelayed ausgelöst hast).
Du hast also nicht 1 Sekunde Pause zwischen jedem setState.. Sondern nur so viel Pause wie das Script braucht um die while loop EIN mal zu durchlaufen - weil die Schleife dann sofort wieder von vorne läuft..
Ich hoffe das war einigermaßen verständlich ausgedrückt.. :lol:
Bei dieser Masse an Daten wird hue wahrscheinlich einfach "dicht" machen..
Ich würde hier mit einem schedule arbeiten..
Also so:
var sched = null; function mathRandomInt(a, b) { if (a > b) { var c = a; a = b; b = c; } return Math.floor(Math.random() * (b - a + 1) + a); } on({id: "hue.0.Phillips_hue.Innr_1.on", change: 'ne'}, function (obj) { if (obj.newState.val) { sched = schedule("*/1 * * * * *", function () { setState("hue.0.Phillips_hue.Innr_1.b", (mathRandomInt(0, 255))); setState("hue.0.Phillips_hue.Innr_1.g", (mathRandomInt(0, 255))); setState("hue.0.Phillips_hue.Innr_1.r", (mathRandomInt(0, 255))); }); } else { if (sched) clearSchedule(sched); } });
….
Wenn das nicht funktioniert ist 1 Sekunde eventuell auch noch zu viel für hue.. Dann kannst du auf "alle 5 Sekunden" erhöhen..
Also statt
sched = schedule("*/1 * * * * *", function () {
dann````
sched = schedule("*/5 * * * * *", function () {Gruß
-
hmm also dein Skript hab ich versucht, es regt sich da allerdings rein gar nix ^^
Ich hab mir in der Zeit mal ein zweites Skript mit Blockly gebastelt. Das funktioniert soweit. Allerdings ist die Problematik, dass das Objekt Philips_hue.Innr_r1.b (Der der die blaue Farbe der LED steuert) auch die Helligkeit ändert.
Durch einfügen vom Objekt Helligkeit_Wohnzimmer. Springt die Helligkeit zwar wieder auf den Ursprungswert zurück. Jedoch erhöht sich die Helligkeit einmal auf 100% und fällt dann runter, was ein unschönen "Blitz"-Effekt erzeugt.
Wer eine Idee wieso Philips_hue.Innr_r1.b die Änderung der Helligkeit (Philips_hue.Innr_r1.bri bzw. Philips_hue.Innr_r1.level) vornimmt?
~~![](</s><URL url=)http://fs1.directupload.net/images/180331/yaqgnxrd.jpg" />
![](</s><URL url=)http://fs1.directupload.net/images/180331/dqpncdvx.jpg" />~~