Hue Weihnachtsbeleuchtung

Guten Abend,

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).

Gruß oekomat

Hi,
läuft zwar nicht mit IPS aber die App Hue Disco auf einem Tablet wäre vielleicht netter da nicht so langweilig.

Ralf

Danke für den Tipp, aber will nicht extra deshalb das Tablet laufen lassen.

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.

Aber das kann doch nicht die Lösung sein, oder?

Gruß oekomat

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.

Ralf

Hab nix verstanden, was du erklärt hast. [emoji3061]

Such im Forum nach Schrittkette.
Findest du u.a.:
Ablaufsteuerung [Exercise]

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.

Ralf

Ich glaube ich verfolge mit dem Skript den falschen von dir empfohlenen Ansatz oder:

<?php

$lightid = 59593;
$step = GetValue(24017);

if(($IPS_SENDER <> "TimerEvent")and($step == 0)){
    SetValue(24017, 1);
    IPS_SetScriptTimer($IPS_SELF, 10);
$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);
    IPS_SetScriptTimer($IPS_SELF, 10);
$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);
    IPS_SetScriptTimer($IPS_SELF, 10);
$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, 4);
    IPS_SetScriptTimer($IPS_SELF, 10);
$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 == 4)){
    // Ablauf  fertig
    SetValue(24017, 0);
    IPS_SetScriptTimer($IPS_SELF, 0);
    SetValue(59593, "STATE", false);
}  

Hi,
nicht ganz. Dein Script dürfte meiner Meinung nach nur einmal durchlaufen. Ohne Gewähr eher so:


if($_IPS['SENDER'] == "TimerEvent"){
     $counter=GetValue("id des counters");
     if (($counter % 3)  == 0){
// Farbübergang 1 
     }
     if (($counter % 3)  == 1){
// Farbübergang 2 
     }
     if (($counter % 3)  == 2){
// Farbübergang 3
     }
     SetValue("id des counters", $counter++);
     if ($counter > 480) IPS_SetScriptTimer($_IPS['SELF'], 0); // ca. 2 Stunden
     return;
}
SetValue("id des counters", 0);
IPS_SetScriptTimer($_IPS['SELF'], 15);

Irgendwie ist da der Wurm drin:

<?php

$lightid = 59593;
$step = GetValue(24017);


if($_IPS['SENDER'] == "TimerEvent"){
     $counter=GetValue(24017);
     if (($counter % 3)  == 0){
// Farbübergang 1

$list = array ("BRIGHTNESS" => '254', "COLOR" => '16711680', "TRANSITIONTIME" => 100); // Transtionstime given as a multiple of 100ms  
HUE_SetValues($lightId, $list);

     }
     if (($counter % 3)  == 1){
// Farbübergang 2

$list = array ("BRIGHTNESS" => '254', "COLOR" => '16776960', "TRANSITIONTIME" => 100); // Transtionstime given as a multiple of 100ms  
HUE_SetValues($lightId, $list);

     }
     if (($counter % 3)  == 2){
// Farbübergang 3

$list = array ("BRIGHTNESS" => '254', "COLOR" => '65280', "TRANSITIONTIME" => 100); // Transtionstime given as a multiple of 100ms  
HUE_SetValues($lightId, $list);

     }
     SetValue(24017, $counter++);
     if ($counter > 10) IPS_SetScriptTimer($_IPS['SELF'], 0);
     
      // ca. 2 Stunden

Hue_SetValue(59593, "STATE", false);

     return;
}
SetValue(24017, 0);
IPS_SetScriptTimer($_IPS['SELF'], 10);

Der Timer läuft alle 10 sek und setzt immer „0“, wenn ich bei der Counter-Variable reinschaue.

Hauseingang 3 ist der aktuelle

Also ich habe es jetzt so gelöst:

<?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.:confused:

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);