Mit HM-Taster Integer-Variable schalten

Hallo zusammen,
bisher konnte ich eine Lösung hier im Forum noch nicht finden.

Ich möchte gerne eine Integer Variable mittels HM-Taster schalten. Die Variable hat 4-Werte, Aus, 100% kalt, 100% warm, 40% kalt. Darüber soll eine OsramFlex LED-Stripe geschaltet werden.

Bei jedem Tatsendruck soll die Variable hochzählen und am Ende wieder auf Aus (0) gesetzt werden.

<?

$osramflextemp = GetValue(22096 /*[WORK\Osram Flex\OsramFlexTemp]*/);

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

if ($osramflextemp == 0)
	{
	OSR_SetValue($backlight, 'STATE', false); 
	OSR_SetValue($backlight, 'LEVEL', 0);
	}

elseif ($osramflextemp == 1)
	{
	OSR_SetValue($backlight, 'STATE', true); 
	OSR_SetValue($backlight, 'LEVEL', 100);
	OSR_SetValue($backlight, 'COLOR_TEMPERATURE', 6000);
	}
	
elseif ($osramflextemp == 2)
	{
	OSR_SetValue($backlight, 'STATE', true); 
	OSR_SetValue($backlight, 'LEVEL', 100);
	OSR_SetValue($backlight, 'COLOR_TEMPERATURE', 2000);
	}

elseif ($osramflextemp == 3)
	{
	OSR_SetValue($backlight, 'STATE', true); 
	OSR_SetValue($backlight, 'LEVEL', 40);
	OSR_SetValue($backlight, 'COLOR_TEMPERATURE', 2000);
	}

?>

Das zweite Skript zum durchschalten sieht so aus.

<?

$osramflextemp = GetValue(22096 /*[WORK\Osram Flex\OsramFlexTemp]*/);

$osramflextemp = 22096 /*[WORK\Osram Flex\OsramFlexTemp]*/;

if ($osramflextemp == 1)
	{
	SetValueInteger($osramflextemp, 2);
	}
	
elseif ($osramflextemp == 2)
	{
	SetValue($osramflextemp, 3);
	}
	
elseif ($osramflextemp == 3)
	{
	SetValue($osramflextemp, 1);
	}

?>

Beste Grüße
Kai

Wozu brauchst Du genau zwei Skripte? Ich geh mal davon aus das das Skript über eine Ereignis des Tasters bei Variablenaktualisierung ausgelöst wird.

Es reicht an sich:


$osramflex = GetValue(12345);
if($osramflex == 3)
{
$osramflex = 0;
}
else
{
$osramflex = $osramflex +1;
}


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

if ($osramflex == 0)
	{
	OSR_SetValue($backlight, 'STATE', false); 
	OSR_SetValue($backlight, 'LEVEL', 0);
	}

elseif ($osramflex == 1)
	{
	OSR_SetValue($backlight, 'STATE', true); 
	OSR_SetValue($backlight, 'LEVEL', 100);
	OSR_SetValue($backlight, 'COLOR_TEMPERATURE', 6000);
	}
	
elseif ($osramflex == 2)
	{
	OSR_SetValue($backlight, 'STATE', true); 
	OSR_SetValue($backlight, 'LEVEL', 100);
	OSR_SetValue($backlight, 'COLOR_TEMPERATURE', 2000);
	}

elseif ($osramflex == 3)
	{
	OSR_SetValue($backlight, 'STATE', true); 
	OSR_SetValue($backlight, 'LEVEL', 40);
	OSR_SetValue($backlight, 'COLOR_TEMPERATURE', 2000);
	}

?>

Hallo Fonzo,

vielen Dank für das Skript.
Leider lässt sich die Lampe damit nur einschalten und nicht wieder ausschalten.

Ich versuche mal mein vorhaben zu beschreiben. Es sollen drei Programme aus der CCU durch ein oder zwei Skriptw abgelöst werden. Ich möchte über einen Taster (kurz und lang) eine Osram schalten. In der CCU habe ich mir dazu eine Variable SV_OSRAM_Flex_Temp und drei Programme angelegt.

Die Variable SV_OSRAM_Flex_Temp hat 4 Zustände „Aus, 100 % kalt, 100 % warm, 40 % warm“.

Über einen Tastendruck „kurz“ und "Tag oder „Nacht“ soll das ganze jetzt geschaltet werden.

Unabhängig davon möchte ich bei einem Tastendruck „lang“ die Zustände der Variable SV_OSRAM_Flex_Temp „100 % kalt, 100 % warm, 40 % warm“ durchschalten können.

Folgendes habe ich bisher versucht:

Integer-Variable OsramFlexTemp und drei Skripte angelegt. Die Skripte sollten dann eigentlich bei Tastendruck „kurz oder lang“ bei Aktualisierung auslösen. Das tun sie aber nicht, weil die Variable OsramFlexTemp immer noch den Zustand „Aus“ hat. Also dachte ich mir ich muss irgendwie einen Zähler einbauen um diese Variable zu schalten.

Mit dem Tipp von Fonzo schaltet das Licht einmal auf 100 % kalt. Danach passiert nichts mehr.

<?

$osramflextemp = GetValue(22096 /*[WORK\Osram Flex Backlight\OsramFlexTemp]*/);

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

if ($osramflextemp == 0)
	{
	OSR_SetValue($backlight, 'STATE', false); 
	OSR_SetValue($backlight, 'LEVEL', 0);
	}

elseif ($osramflextemp == 1)
	{
	OSR_SetValue($backlight, 'STATE', true); 
	OSR_SetValue($backlight, 'LEVEL', 100);
	OSR_SetValue($backlight, 'COLOR_TEMPERATURE', 6000);
	}
	
elseif ($osramflextemp == 2)
	{
	OSR_SetValue($backlight, 'STATE', true); 
	OSR_SetValue($backlight, 'LEVEL', 100);
	OSR_SetValue($backlight, 'COLOR_TEMPERATURE', 2000);
	}

elseif ($osramflextemp == 3)
	{
	OSR_SetValue($backlight, 'STATE', true); 
	OSR_SetValue($backlight, 'LEVEL', 40);
	OSR_SetValue($backlight, 'COLOR_TEMPERATURE', 2000);
	}

?>
<?

// $tastershort = GetValue(22828 /*[Hardware\Homematic\EG\Schlafzimmer\Taster\Schlafzimmer Bewegungsmelder\Schlafzimmer Bewegungsmelder 1\PRESS_SHORT]*/);
$osramflextemp = GetValue(22096 /*[WORK\Osram Flex Backlight\OsramFlexTemp]*/);
$isday = GetValue(27716 /*[Location\Is Day]*/);

$osramflextemp = 22096 /*[WORK\Osram Flex Backlight\OsramFlexTemp]*/;

if (($osramflextemp == 1) or ($osramflextemp == 2) or ($osramflextemp == 3))
	{
	SetValue($osramflextemp, 0);
	}
	
elseif (($osramflextemp == 0) and ($isday == true))
	{
	SetValue($osramflextemp, 1);
	}

elseif (($osramflextemp == 0) and ($isday == false))
	{
	SetValue($osramflextemp, 3);
	}

?>
<?

$osramflextemp = GetValue(22096 /*[WORK\Osram Flex Backlight\OsramFlexTemp]*/);

$osramflextemp = 22096 /*[WORK\Osram Flex Backlight\OsramFlexTemp]*/;

if ($osramflextemp == 1)
	{
	SetValueInteger($osramflextemp, 2);
	}
	
elseif ($osramflextemp == 2)
	{
	SetValue($osramflextemp, 3);
	}
	
elseif ($osramflextemp == 3)
	{
	SetValue($osramflextemp, 1);
	}

?>

Beste Grüße
Kai

Soll die Steuerung denn über die CCU erfolgen und einfach direkt aus IP-Symcon mit Osram Lightify Modul ?

Soll die Steuerung denn über die CCU erfolgen und einfach direkt aus IP-Symcon mit Osram Lightify Modul ?

Direkt aus IP Symcon mit dem Osram Lighty Modul. Die Programme aus der CCU würden dann entfallen.

Du brauchst am besten insgesamt 6 Skripte, jeweils ein Skript nur mit den Befehlen was passieren soll mit dem passenden Namen.

Wie z.B. Backlight Ausschalten


$backlight = 19696 /*[Hardware\Osram Lightify\Backlight]*/; 
OSR_SetValue($backlight, 'STATE', false);  
OSR_SetValue($backlight, 'LEVEL', 0); 

analog die anderen Zustände.

Ein Aktion Skript damit Du auch aus dem Webfront schalten kannst


SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
if ($_IPS['VALUE'] == 0) 
    { 
    IPS_RunScript(29640); // Ausschalte Skript
    } 
elseif ($_IPS['VALUE'] == 1) 
    { 
    IPS_RunScript(37732); 
    }     
elseif ($_IPS['VALUE'] == 2) 
    { 
    IPS_RunScript(14313); 
    } 
elseif ($_IPS['VALUE'] == 3) 
    { 
    IPS_RunScript(58267); 
    } 

und ein Schaltungsskript, das auslöst wird sobald der Taster gedrückt wird


$osramflexid = 22096; // Variable mit Ausgewählten Szenario
$osramflex = GetValue($osramflexid); 
$osramflex_formatted = GetValueFormatted($osramflexid); 
IPS_LogMessage("Osramflex", "Momentaner Wert ist ".$osramflex_formatted." (".$osramflex.")");
if($osramflex == 3)
{
$osramflex = 0;
}
else
{
$osramflex = $osramflex +1;
}
if ($osramflex == 0)
    {
     IPS_RunScript(29640); // Auschalten Skript
     SetValue($osramflexid, 0); 
     IPS_LogMessage("Osramflex", "Ausschalten");
    }

elseif ($osramflex == 1)
    {
     IPS_RunScript(37732);
     SetValue($osramflexid, 1);
     IPS_LogMessage("Osramflex", "Kaltlicht");
    }
    
elseif ($osramflex == 2)
    {
     IPS_RunScript(14313);
     SetValue($osramflexid, 2);
     IPS_LogMessage("Osramflex", "Warmlicht");
    }

elseif ($osramflex == 3)
    {
     IPS_RunScript(58267);
     SetValue($osramflexid, 3);
     IPS_LogMessage("Osramflex", "Warmlicht 40 %"); 
    }


Und dann musst Du noch ein Ereignis auf das Schaltskript legen das bei Variablenaktualaisierung des Tasters ausgeführt wird.

Hallo Fonzo,

vielen Dank für die ausführliche Anleitung.

Leider bringt mich das auch nicht zum Ziel. Ich kann die Variable OsramFlexTemp übers Webfront schalten, über den Taster „kurz“ lässt sich das Licht jedoch wieder nur einschalten.

Merkwürdig finde ich, dass die Variable OsramFlexTemp weiterhin auf „Aus“ steht, obwohl das Licht angeht und den Status 100 % kalt hat.

Die Variable OsramFlexTemp wird nicht hochgezählt…

variable.png

Beste Grüße
Kai

Das ist nicht merkwürdig die Variable wurde nämlich durch das Schaltskript nicht beschrieben, sondern nur das Gerät geschaltet, ich habe das oben mal ergänzt. Was steht denn im Meldungen Fenster wenn Du das Skript oben übernimmst und auf den Taster mehrfach hintereinander drückst?

Danke Fonzo.

Jetzt kann ich über einen kurzen Tastendruck die einzelnen Zustände durchschalten.

log.png

Was mir noch jedoch nicht so gut gefällt ist, wenn die Variable auf „Aus“ steht und ich den Taster drücke, schaltet er zuerst alle drei Zustände durch. D.h. von 40 % warm bis 100 % kalt. Drücke ich nun erneut den Taster kommt 100 % warm, dann 40 % warm.

Müsste doch von dem Zustand „Aus“ direkt auf „100 % kalt“ schalten!?
Um die Variable durchzuschalten hatte ich eigentlcih an den Langen Tastendruck gedacht.
Der Kurze Tastendruck soll "Aus und dann in abhängigkeit von der Tageszeit die Variable auf 40 % warm (nachts) und 100 % kalt (tagsüber) setzen.

Dafür hatte ich die Variable „Is Day“ (Kern Instanzen -> Location) vorgesehen.
Habe schon versucht es in das Schaltungsskript mit einzubauen. Dann passiert jedoch nichts mehr…

Beste Grüße
Kai

So wie es zur Zeit ist schaltet er immer 0 -> 1 -> 2 -> 3 -> 0 -> 1 -> 2-> 3 usw. wenn Du das anders haben willst müsstest Du das abändern.

Dann musst Du einfach nur das Ereignis auf den langen Tastendruck legen.

Dann leg doch einfach ein weiteres Schaltskript an, dass für den kurzen Tastendruck gilt. Für die eine Richtung des Tasters nimmst Du ein Ereignis und verknüpfst dies mit dem Aus Skript, dann geht die Lampe aus. In die andere Richtung verknüpfst Du das Schaltskript so in der Art


<?
$LocationID = IPS_GetInstanceListByModuleID("{45E97A63-F870-408A-B259-2933F7EABF74}")[0];
$isday = GetValue(IPS_GetObjectIDByIdent("IsDay", $LocationID));
$osramflexid = 22096; // Variable mit Ausgewählten Szenario
if($isday) // Kaltlicht
{
	 IPS_RunScript(37732);
     SetValue($osramflexid, 1);
     IPS_LogMessage("Osramflex", "Kaltlicht"); 
}
else // Nachts 40 % Warm 
{
	IPS_RunScript(58267);
    SetValue($osramflexid, 3);
    IPS_LogMessage("Osramflex", "Warmlicht 40 %");
}
?>

Das sollte dann abhängig von Tag oder Nacht einen Zustand schalten.

Wahnsinn Fonzo!!!
Vielen Dank deine Hilfe :slight_smile: funktioiert wunderbar.

Beste Grüße und ein schönes Wochenende
Kai