Aufwachlicht

Hallo zusammen,

ich habe hinter meinem Bett einen OSRAM Flex LED-Stripe. DIeser soll einen Sonnenaufgang simulieren.

Dafür habe ich mir zwei Skripte angelegt. Das erste ist der Timer, welcher alle x Sekunden eine Float Variable hochzählt.

<?

$zaehler=GetValue(32333 /*[WORK\Zähler\Zähler]*/);

switch ($zaehler) 
{
    case 0:
        /* Hier Aktionen für den ersten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Zähler\Zähler]*/,1);
    break;

    case 1:
        /* Hier Aktionen für den zweiten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Zähler\Zähler]*/,2);
    break;
    
    case 2:
        /* Hier Aktionen für den dritten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Zähler\Zähler]*/,3);
    break;

    case 3:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Zähler\Zähler]*/,4);
    break;

    case 4:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Zähler\Zähler]*/,5);
    break;
	
	case 5:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Zähler\Zähler]*/,6);
    break;
	
    case 6:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Zähler\Zähler]*/,7);
    break;
	
	case 7:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Zähler\Zähler]*/,8);
    break;
	    
	case 8:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Zähler\Zähler]*/,9);
    break;
	
    case 9:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Zähler\Zähler]*/,10);
    break;

    case 10:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],0);
        SetValue(32333 /*[WORK\Zähler\Zähler]*/,0);
    break;

}


?>

Das zweite Skript wird bei Aktualisierung ausgelöst wenn sich der Wert der Variable ändert.

<?

// OSRAM Flex Aufwachlicht von Rot -> Weiß


$osramflex = 19696 /*[Hardware\Osram Lightify\Backlight]*/;

$zaehler = GetValue(32333 /*[WORK\Zähler\Zähler]*/);


if($zaehler == 1)
	{
	OSR_SetValue($osramflex, 'STATE', true);
	OSR_SetValue($osramflex, 'COLOR', 15728640);
	OSR_SetValue($osramflex,'LEVEL', 10);
	}
	
elseif($zaehler == 2)
	{
	OSR_SetValue($osramflex, 'COLOR', 15732736);
	OSR_SetValue($osramflex,'LEVEL', 20);
	}
	
elseif($zaehler == 3)
	{
	OSR_SetValue($osramflex, 'COLOR', 15736832);
	OSR_SetValue($osramflex,'LEVEL', 30);
	}
	
elseif($zaehler == 4)
	{
	OSR_SetValue($osramflex, 'COLOR', 15740928);
	OSR_SetValue($osramflex,'LEVEL', 40);
	}

elseif($zaehler == 5)
	{
	OSR_SetValue($osramflex, 'COLOR', 15745024);
	OSR_SetValue($osramflex,'LEVEL', 50);
	}
	
elseif($zaehler == 6)
	{
	OSR_SetValue($osramflex, 'COLOR', 15749120);
	OSR_SetValue($osramflex,'LEVEL', 60);
	}
	
elseif($zaehler == 7)
	{
	OSR_SetValue($osramflex, 'COLOR', 15753216);
	OSR_SetValue($osramflex,'LEVEL', 70);
	}
	
elseif($zaehler == 8)
	{
	OSR_SetValue($osramflex, 'COLOR', 15761408);
	OSR_SetValue($osramflex,'LEVEL', 80);
	}
	
elseif($zaehler == 9)
	{
	OSR_SetValue($osramflex, 'COLOR', 15761472);
	OSR_SetValue($osramflex,'LEVEL', 90);
	}
	
elseif($zaehler == 10)
	{
	OSR_SetValue($osramflex, 'COLOR', 15761536);
	OSR_SetValue($osramflex,'LEVEL', 100);
	}
	
elseif($zaehler == 0)
	{
	OSR_SetValue($osramflex, 'STATE', false);
	}

?>

Das funktioniert soweit auch sehr gut.

Jetzt würde ich das erster Skript (Timer) gerne bei Bedarf anhalten bzw. beenden können.
Habe mir dazu eine Boolean Variable angelegt, welche das Timer Script bei „On“ startet und bei „Off“ beendet. Wie kann ich diese in das Timer Skript einbauen?

Habt ihr eine Idee wie ich das lösen kann?

Beste Grüße
Kai

Würde den Button bei Zähler 2 auf aktiv setzen.

Im Skriptam Anfang
If (aktiv == false) {goto Progammende;} Else {}

Normales skript

Programmende:

Ende
>php

Gesendet von meinem VTR-L09 mit Tapatalk

Hallo Tommy,

kannst du das vielleicht etwas genauer erklären.
Bin in PHP noch nicht so fit :confused:

Beste Grüße
Kai

Warum baust Du die Befehle für die Lampen nicht in das Timer Skript ein? Wozu zwei Skripte?

Danke, werde ich die Tage umsetzen. Ergebnis folgt…

Hallo zusammen,

ich habe das Skript wie folgt angepasst.

<?

// OSRAM Flex Aufwachlicht

$aufwachlicht = GetValue(49191 /*[WORK\Aufwachlicht\Aufwachlicht An / Aus]*/);
$zaehler = GetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/);

$osramflex = 19696 /*[Hardware\Osram Lightify\Backlight]*/;


if($aufwachlicht == false)
{
    goto end;
}

else    //if($status == true)
{
switch ($zaehler) 
    {
    case 0:
        /* Hier Aktionen für den ersten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,1);
        OSR_SetValue($osramflex, 'STATE', true);
        OSR_SetValue($osramflex, 'COLOR', 15728640);
        OSR_SetValue($osramflex,'LEVEL', 10);
    break;

    case 1:
        /* Hier Aktionen für den zweiten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,2);
        OSR_SetValue($osramflex, 'COLOR', 15732736);
        OSR_SetValue($osramflex,'LEVEL', 20);
    break;
    
    case 2:
        /* Hier Aktionen für den dritten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,3);
        OSR_SetValue($osramflex, 'COLOR', 15736832);
        OSR_SetValue($osramflex,'LEVEL', 30);
    break;

    case 3:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,4);
        OSR_SetValue($osramflex, 'COLOR', 15740928);
        OSR_SetValue($osramflex,'LEVEL', 40);
    break;

    case 4:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,5);
        OSR_SetValue($osramflex, 'COLOR', 15745024);
        OSR_SetValue($osramflex,'LEVEL', 50);
    break;
    
    case 5:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,6);
        OSR_SetValue($osramflex, 'COLOR', 15749120);
        OSR_SetValue($osramflex,'LEVEL', 60);
    break;
    
    case 6:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,7);
        OSR_SetValue($osramflex, 'COLOR', 15753216);
        OSR_SetValue($osramflex,'LEVEL', 70);
    break;
    
    case 7:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,8);
        OSR_SetValue($osramflex, 'COLOR', 15761408);
        OSR_SetValue($osramflex,'LEVEL', 80);
    break;
        
    case 8:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,9);
        OSR_SetValue($osramflex, 'COLOR', 15761472);
        OSR_SetValue($osramflex,'LEVEL', 90);
    break;
    
    case 9:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,10);
        OSR_SetValue($osramflex, 'COLOR', 15761536);
        OSR_SetValue($osramflex,'LEVEL', 100);
    break;

    case 10:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],0);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,0);
        OSR_SetValue($osramflex, 'STATE', false);
    break;
    
    }
}

end:
if($aufwachlicht == false)
    {
    OSR_SetValue($osramflex, 'STATE', false);
    SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,0);
    }

?>

Es läuft bei schalten der Variable Aufwachlicht On / Off auch durch.

Jetzt ist es aber so, dass sich die Osram Lampe beim schalten über einen Homematic Taster, nur kurz (ca.5 - 20 Sekunden) einschaltet und danach wieder ausgeht :confused:

Jemand eine Idee woran das liegt?

Beste Grüße
Kai

Mach bitte mal einen Screenshot von den Ereignissen, die unterm Skript liegen.

Über den besagten HM-Taster soll die Osram Flex LED weiterhin ganz normal schaltbar (An / Aus) bleiben.

Besten Dank
Kai

Wenn ich die Zusammenhänge richtig verstehe, dann passen die Ereignisse.

Beobachte mal das Meldungsfenster oder auch die Logdatei von IPS, wenn die Lampe nach paar Sekunden wieder ausgeht. Es sollte erkennbar sein, wer oder was das verursacht.

Ich habe gerade festgestellt, dass das Skript alle 60 Sekunden anläuft. Als wäre es in einer Dauerschleife.
Das wird der Grund sein, warum die Osram immer wieder ausgeht, wegen dem Programmende.

Was kann ich da machen?

Beste Grüße
Kai

Den ScriptTimer deaktivieren.

Wenn das Skript vollständig durchläuft, wird der ScriptTimer eigentlich mit


IPS_SetScriptTimer($_IPS['SELF'],0); 

im case 10 deaktiviert.

Wahrscheinlich ist das Skript irgendwann mal nicht vollständig durchgelaufen.

Könnte ich den Timer bei „end“ noch stoppen?

end: 
if($aufwachlicht == false) 
    { 
    OSR_SetValue($osramflex, 'STATE', false); 
    SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,0);
    IPS_SetScriptTimer($_IPS['SELF'],0);  
    } 

Könntest Du, ja

Den Sinn, warum Du oben im Bereich if($aufwachlicht == false) mit goto arbeitest, habe ich noch nicht verstanden.

Ich würde das Aufwachlicht gerne bei Bedarf stoppen können.
Habe den Tipp aus Post #2 übernommen.

Da das Aufwachlicht später mal 30 min laufen soll, würde ich es gerne vor ablauf der 30 min anhalten können, falls man doch nicht aufstehen will. Dies soll dann über einen Taster von Homematic passieren.

Würdest du das anders lösen?

Der Sinn von „goto end“ oben hat sich mir nicht erschlossen. Unten verwendest Du das gleiche if-statement noch mal.

Ich habe mal den Code auf #6 genommen, um zu zeigen, wie ich es lösen würde:

 <?

// OSRAM Flex Aufwachlicht

$aufwachlicht = GetValue(49191 /*[WORK\Aufwachlicht\Aufwachlicht An / Aus]*/);
$zaehler = GetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/);

$osramflex = 19696 /*[Hardware\Osram Lightify\Backlight]*/;


if($aufwachlicht == false)
{
    OSR_SetValue($osramflex, 'STATE', false);
    SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,0);
}

else    //if($status == true)
{
switch ($zaehler) 
    {
    case 0:
        /* Hier Aktionen für den ersten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,1);
        OSR_SetValue($osramflex, 'STATE', true);
        OSR_SetValue($osramflex, 'COLOR', 15728640);
        OSR_SetValue($osramflex,'LEVEL', 10);
    break;

    case 1:
        /* Hier Aktionen für den zweiten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,2);
        OSR_SetValue($osramflex, 'COLOR', 15732736);
        OSR_SetValue($osramflex,'LEVEL', 20);
    break;
    
    case 2:
        /* Hier Aktionen für den dritten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,3);
        OSR_SetValue($osramflex, 'COLOR', 15736832);
        OSR_SetValue($osramflex,'LEVEL', 30);
    break;

    case 3:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,4);
        OSR_SetValue($osramflex, 'COLOR', 15740928);
        OSR_SetValue($osramflex,'LEVEL', 40);
    break;

    case 4:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,5);
        OSR_SetValue($osramflex, 'COLOR', 15745024);
        OSR_SetValue($osramflex,'LEVEL', 50);
    break;
    
    case 5:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,6);
        OSR_SetValue($osramflex, 'COLOR', 15749120);
        OSR_SetValue($osramflex,'LEVEL', 60);
    break;
    
    case 6:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,7);
        OSR_SetValue($osramflex, 'COLOR', 15753216);
        OSR_SetValue($osramflex,'LEVEL', 70);
    break;
    
    case 7:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,8);
        OSR_SetValue($osramflex, 'COLOR', 15761408);
        OSR_SetValue($osramflex,'LEVEL', 80);
    break;
        
    case 8:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,9);
        OSR_SetValue($osramflex, 'COLOR', 15761472);
        OSR_SetValue($osramflex,'LEVEL', 90);
    break;
    
    case 9:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],60);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,10);
        OSR_SetValue($osramflex, 'COLOR', 15761536);
        OSR_SetValue($osramflex,'LEVEL', 100);
    break;

    case 10:
        /* Hier Aktionen für den letzten Aufruf */
        IPS_SetScriptTimer($_IPS['SELF'],0);
        SetValue(32333 /*[WORK\Aufwachlicht\Zähler]*/,0);
        OSR_SetValue($osramflex, 'STATE', false);
    break;
    
    }
}
?> 

Oder übersehe ich was?

Hallo Standart,

erstmal vielen Dank für dein Mühe!

Leider ist es jetzt so, dass sich das Script jetzt wieder in einer Dauerschleife befindet und alle 60 Sekunden auslöst.
Zudem geht die Lampe bei betätigen des HM-Tasters nach X-Sekunden wieder aus.

Den Sinn von goto end verstehe ich auch noch nicht, aber es funktioniert scheinbar. Werde es mal ein paar Tage testen.

@all: Wenn Interesse besteht kann ich die fertige Lösung auch gerne nochmal hier posten.

Beste Grüße
Kai

Läuft das Skript wirklich 10 Mal durch? Das Ereignis scheint aktiv zu bleiben, sodass das Skript immer wieder gestartet wird.

Guten Morgen,

das Script läuft nicht 10 mal, da ich es ja vorher beendet habe. Die Zähler Variable wird auf „0“ gesetzt, aber das Script findet kein Ende.

Wie beendest Du?
Dort, wo Du beendest, musst Du den ScriptTimer deaktivieren.

Ich setze über einen Taster, die Variable

$aufwachlicht = 49191

auf Aus.

Das Script dazu wird über ein Ereignis bei Aktualisierung ausgelöst.
Aktion: Variable ändern und dann dieses Script.

SetValue(49191 /*[WORK\Aufwachlicht\Aufwachlicht An / Aus]*/, false);

Verstehe ich dich Richtig, das ich in diesem Script noch den Timer beenden muss? :confused:

SetValue(49191 /*[WORK\Aufwachlicht\Aufwachlicht An / Aus]*/, false);
IPS_SetScriptTimer($_IPS['SELF'],0);