ich hab mich mal mit der Lichtsteuerung im Außenbereich beschäftigt. Mir schwebt ein Farbwechsel/Farbverlauf/Schleife vor, in der definierte Farben langsam ineinander übergeben.
Da ich die Color and Ambience Leuchte habe, muss das ja per Skript irgendwie gehen.
Hat jemand sowas realisiert und ist auf Probleme oder Fehler gestoßen? (z.B. hoher Datenverkehr oder ähnliches).
Ich habe das jetzt so, als Skript laufen, was genau mein Ergebnis wiedergibt:
$lightId = 59593 /*[Hardware\Phillips Hue\Hue Modul\Lampen\Wohnzimmer]*/ ; // Objekt ID der Hue Lampe
$list = array ("BRIGHTNESS" => '254', "COLOR" => '16711680', "TRANSITIONTIME" => 100); // Transtionstime given as a multiple of 100ms
HUE_SetValues($lightId, $list);
sleep(10);
$list = array ("BRIGHTNESS" => '254', "COLOR" => '16776960', "TRANSITIONTIME" => 100); // Transtionstime given as a multiple of 100ms
HUE_SetValues($lightId, $list);
sleep(10);
$list = array ("BRIGHTNESS" => '254', "COLOR" => '65280', "TRANSITIONTIME" => 100); // Transtionstime given as a multiple of 100ms
HUE_SetValues($lightId, $list);
Das müsste ich als Schleife laufen lassen. Der Skript würde ja kontinuierlich laufen. 3 Skripts wäre auch möglich, dann laufen alle im Abstand von 10 sek.
Hi,
ich glaube so lange Laufzeiten werden nicht zugelassen. Ich würde mir einen Zähler definieren und dann per switch ($counter++ % 3) entscheiden was genommen werden soll also Transition 1-3 und das ganze dann per Scripttimer regelmäßig aufrufen. Den Zähler musst Du immer aus einer Variablen holen und am Ende wieder abspeichern.
Wenn Counter einen bestimmten Wert überschreitet oder eine bestimmte Zeit erreicht ist den Scripttimer auf 0 setzen.
Anstatt halt auf jeden Wert einzeln zu prüfen, kann man auch andere abfragen wie $wert % 3 nutzen.
Das Prinzip ist aber das selbe, ein ScriptTimer welcher die einzelnen Steps ausführt; anstatt Sleep.
Michael
Jetzt bin ich ein wenig schlauer. Bedeutet aber, wenn ich das richtig verstehe, wenn ich am Ende auf 0 setzen lassen, läuft der Skripttimer nicht mehr. Wenn ein Durchlauf 1min hat und ich das 2 Stunden laufen lassen will, muss der counter auf 120?
Hi,
ja. Und bei 120 oder 180 oder … einfach ScripTimer auf 0 und es hört auf. Ich würde aber trotzdem den Scriptimer auf 15 Sekunden setzen und dann bei
($counter%3) == 0 den ersten Farbübergang bei
($counter%3) == 1 den zweiten Farbübergang bei
($counter%3) == 2 den dritten Farbübergang. So musst Du nicht mit sleep arbeiten.
Wenn Du den ScriptTimer auf 0 setzt schalte aber auch die Lampen aus sonst bleiben sie bunt. Du könntest zusätzlich noch ein Ereignis benutzen das es immer um 18:00 (oder so) startet.
<?php
$lightId = 14161;
$step = GetValue(24017);
if(($IPS_SENDER == "TimerEvent")and($step == 0)){
SetValue(24017, 1);
IPS_SetScriptTimer($IPS_SELF, 25);
$list = array ("BRIGHTNESS" => '254', "COLOR" => '16711680', "TRANSITIONTIME" => 100); // Transtionstime given as a multiple of 100ms
HUE_SetValues($lightId, $list);
return;
}
if(($IPS_SENDER == "TimerEvent")and($step == 1)){
SetValue(24017 /*[6 Szenarien\Beschatten\Step]*/, 2);
$list = array ("BRIGHTNESS" => '254', "COLOR" => '16776960', "TRANSITIONTIME" => 100); // Transtionstime given as a multiple of 100ms
HUE_SetValues($lightId, $list);
return;
}
if(($IPS_SENDER == "TimerEvent")and($step == 2)){
SetValue(24017, 3);
$list = array ("BRIGHTNESS" => '254', "COLOR" => '65280', "TRANSITIONTIME" => 100); // Transtionstime given as a multiple of 100ms
HUE_SetValues($lightId, $list);
return;
}
if(($IPS_SENDER == "TimerEvent")and($step == 3)){
SetValue(24017, 0);
$list = array ("BRIGHTNESS" => '254', "COLOR" => '16711680', "TRANSITIONTIME" => 100); // Transtionstime given as a multiple of 100ms
HUE_SetValues($lightId, $list);
return;
}
if(($IPS_SENDER == "TimerEvent")and($step > 50)){
SetValue(59593, "STATE", false);
}
Damit läuft der Skript endlos, weil nie 50 erreicht wird und die Schritte 49x zu kopieren will ich auch nicht…Wenn ich ihn begrenzen will, müsste ich eine Uhrzeit mit einbauen, damit irgendwann die Zeit eine Abschaltung bewirkt. Eine andere Möglichkeit wäre den Counter immer eins hochzuzählen wie z.B. „$step+1“. Da hab ich spontan aber keine Idee.
Du könntest deine ifs mit Modulo fertigmachen anstatt auf absolute Zahlen zu prüfen. Dann kannst du deinen Zähler jedes mal eins hochzählen und hast dennoch bis 50 deine Rotation. Grob skizziert:
$step = GetValue(24017);
// Löst bei 0, 3, 6, ... aus
if ((step % 3) == 0) {
// TODO: Füllen
}
// Löst bei 1, 4, 7, ... aus
else if ((step %3) == 1) {
// TODO: Füllen
}
// Löst bei 2, 5, 8, ... aus
else if ((step %3) == 2) {
// TODO: Füllen
}
if ($step > 50) {
// TODO: Füllen
}
SetValue(24017, $step + 1);