Adaptives Licht Light

Hi,
letztes Jahr hatten Philips (Hue) und Apple (HomeKit) die Erweiterung um adaptives Licht angekündigt. Was diese kleinen Firmen können sollte doch auch mit IPS machbar sein:-)

Kurz adaptives Licht soll Helligkeit und Farbtemperatur der Tageszeit anpassen. So verstehe ich es jedenfalls bisher. Wenn nicht bitte eine einfache Erklärung für mich.

Folgendes Script ändert nur die Farbtemperatur (bisher) aller Lampen/Leuchten die eine Temperatur unterstützen zwischen 9 und 10Uhr von 350 (warm) auf 160 (kalt) und von 18 und 19Uhr von 160 auf 350. Es ist bisher nur mit Zigbee2MQTT lauffähig.

<?php
$StartID = @IPS_GetVariableIDByName("Start", $_IPS['SELF']);
if ($StartID == false){
    $StartID = IPS_CreateVariable(2);
    IPS_SetParent($StartID, $_IPS['SELF']);             //Variable zuordnen
    IPS_SetName($StartID, "Start");
}
$StepID = @IPS_GetVariableIDByName("Step", $_IPS['SELF']);
if ($StepID == false){
    $StepID = IPS_CreateVariable(2);
    IPS_SetParent($StepID, $_IPS['SELF']);             //Variable zuordnen
    IPS_SetName($StepID, "Step");
}
$CountID = @IPS_GetVariableIDByName("Count", $_IPS['SELF']);
if ($CountID == false){
    $CountID = IPS_CreateVariable(1);
    IPS_SetParent($CountID, $_IPS['SELF']);             //Variable zuordnen
    IPS_SetName($CountID, "Count");
}

if($_IPS['SENDER'] == "TimerEvent"){
    if (IPS_GetName($_IPS['EVENT']) == 'ScriptTimer'){
        $Start = GetValue($StartID);
        $Step = GetValue($StepID);
        $Count = GetValue($CountID);
        if ((($Start + $Step) >= 50) && (($Start + $Step) <= 500)){
            SetValue($StartID, $Start + $Step);
        }

        $UpdateList = array();
        $InstanzIDsList = IPS_GetInstanceListByModuleID('{E5BB36C6-A70B-EB23-3716-9151A09AC8A2}');  // Zigbee2MQTT

        foreach ($InstanzIDsList as $InstanzID) {
            $VarID = @IPS_GetObjectIDByIdent('Z2M_State', $InstanzID);
            if ($VarID > 0) {
                if (GetValue($VarID)){
                    $VarID = @IPS_GetObjectIDByIdent('Z2M_ColorTemp', $InstanzID);
                    if ($VarID > 0) {
                        $Text = 'ID:'.$VarID.' Temp:'.$Start;
                        IPS_LogMessage("Adaptives Licht", $Text); 
                        RequestAction($VarID, $Start);
                    }
                }
                else{
                    $VarID = @IPS_GetObjectIDByIdent('Z2M_ColorTemp', $InstanzID);
                    if ($VarID > 0) {
                        SetValue($VarID, $Start);
                    }
                }
            }
        }
        SetValue($CountID, --$Count);
        if ($Count <= 0) IPS_SetScriptTimer($_IPS['SELF'], 0);
        return;
    }
}

if (@IPS_GetEventIDByName("AdaptivesLicht Morgens", $_IPS['SELF']) == false){
    $eid = IPS_CreateEvent(1);                      //Zyklisches Ereignis
    IPS_SetEventCyclic($eid, 0, 0, 0, 0, 0, 0);    //Jeden Tag
    IPS_SetEventCyclicTimeFrom($eid, 9, 0, 0);      // Zeit setzen
    IPS_SetParent($eid, $_IPS['SELF']);             //Ereignis zuordnen
    IPS_SetEventActive($eid, true);                 //Ereignis aktivieren    
    IPS_SetName($eid, "AdaptivesLicht Morgens");
}
if (@IPS_GetEventIDByName("AdaptivesLicht Abends", $_IPS['SELF']) == false){
    $eid = IPS_CreateEvent(1);                      //Zyklisches Ereignis
    IPS_SetEventCyclic($eid, 0, 0, 0, 0, 0, 0);    //Jeden Tag
    IPS_SetEventCyclicTimeFrom($eid, 18, 0, 0);      // Zeit setzen
    IPS_SetParent($eid, $_IPS['SELF']);             //Ereignis zuordnen
    IPS_SetEventActive($eid, true);                 //Ereignis aktivieren    
    IPS_SetName($eid, "AdaptivesLicht Abends");
}


if (date("G") == 9){
    SetValue($StartID, 360);
    SetValue($StepID, -200 / 60);
    SetValue($CountID, 60);
    IPS_SetScriptTimer($_IPS['SELF'], 60);
}
else if (date("G") == 18){
    SetValue($StartID, 160);
    SetValue($StepID, 200 / 60);
    SetValue($CountID, 60);
    IPS_SetScriptTimer($_IPS['SELF'], 60);
}
?>

Wenn Lampen eingeschaltet werden sollte zusätzlich die Variable ‚Start‘ als Farbtemperatur benutzt werden damit sie den aktuelle Stand hat.

Ralf

Hi,
ich mag es immer noch morgens mit warmen Licht geweckt zu werden. Mir ist jetzt in der dunklen Jahreszeit aufgefallen das mein LightStrip im Wohnzimmer sich nicht auf Warmweiß umstellt wenn ich Abends da sitze. Nicht alle RGB-Lampen haben auch eine Farbtemperatur. Ich habe also mein Script erweitert. Ich habe mit einer Hue ambiente RGB eine LUT erstellt die Mired in RGB „umrechnet“. Diese LUT benutze ich jetzt bei allen RGB-Lampen auch wenn eine Farbtemperatur vorhanden ist. Die Farbtemperatur benutze ich nur noch bei White ambiente da die keine RGB Werte haben.

Hier das neue Script:

<?php
$rgb = array (16055039, 16055039, 16055039, 16055039, 16120575, 16186367, 16251903, 16317695, 16317951, 16383487, 16449279, 16514815, 16580607, 16580607, 16646143, 16646142, 16646141, 16711677, 16711676, 16711675, 16711675, 16711674, 16777210, 16777209, 16777208, 16777208, 16777207, 16777206, 16777205, 16777204, 16776947, 16776947, 16776946, 16776689, 16776688, 16776687, 16776686, 16776429, 16776429, 16776428, 16776427, 16776170, 16776169, 16776169, 16776168, 16775911, 16775910, 16775909, 16775908, 16775651, 16775651, 16775650, 16775649, 16775392, 16775391, 16775390, 16775134, 16775133, 16775132, 16775131, 16775131, 16774874, 16774873, 16774872, 16774616, 16774615, 16774614, 16774613, 16774356, 16774356, 16774355, 16774354, 16774097, 16774097, 16774096, 16774095, 16773838, 16773837, 16773837, 16773836, 16773579, 16773578, 16773578, 16773577, 16773320, 16773320, 16773319, 16773062, 16773061, 16773061, 16773060, 16772803, 16772802, 16772802, 16772801, 16772544, 16772544, 16772543, 16772542, 16772285, 16772285, 16772284, 16772283, 16772027, 16772026, 16772025, 16772024, 16771768, 16771767, 16771767, 16771510, 16771509, 16771508, 16771508, 16771251, 16771250, 16771249, 16771249, 16771249, 16770992, 16770991, 16770991, 16770734, 16770733, 16770733, 16770732, 16770475, 16770475, 16770474, 16770473, 16770217, 16770216, 16770215, 16770215, 16769958, 16769957, 16769957, 16769956, 16769700, 16769699, 16769698, 16769697, 16769441, 16769440, 16769440, 16769439, 16769182, 16769182, 16769181, 16769181, 16768924, 16768924, 16768923, 16768922, 16768665, 16768665, 16768664, 16768408, 16768407, 16768407, 16768406, 16768405, 16768149, 16768148, 16768148, 16768147, 16767891, 16767890, 16767889, 16767889, 16767632, 16767632, 16767631, 16767631, 16767374, 16767373, 16767373, 16767372, 16767116, 16767116, 16767115, 16767114, 16766858, 16766857, 16766857, 16766856, 16766599, 16766599, 16766598, 16766598, 16766598, 16766341, 16766340, 16766340, 16766083, 16766082, 16766082, 16766082, 16766081, 16765825, 16765824, 16765823, 16765823, 16765567, 16765566, 16765565, 16765309, 16765309, 16765308, 16765307, 16765307, 16765307, 16765050, 16765050, 16765049, 16765049, 16764792, 16764792, 16764791, 16764791, 16764534, 16764533, 16764533, 16764533, 16764276, 16764275, 16764275, 16764275, 16764018, 16764017, 16764017, 16764017, 16763760, 16763760, 16763759, 16763759, 16763759, 16763502, 16763501, 16763501, 16763501, 16763244, 16763244, 16763243, 16763243, 16763243, 16762986, 16762985, 16762985, 16762728, 16762728, 16762728, 16762727, 16762727, 16762470, 16762470, 16762470, 16762469, 16762469, 16762212, 16762211, 16762211, 16761955, 16761955, 16761954, 16761954, 16761953, 16761696, 16761696, 16761696, 16761696, 16761695, 16761695, 16761438, 16761437, 16761437, 16761181, 16761181, 16761180, 16761180, 16761179, 16761179, 16760922, 16760922, 16760922, 16760665, 16760665, 16760664, 16760664, 16760407, 16760407, 16760407, 16760407, 16760406, 16760406, 16760149, 16760149, 16760148, 16760148, 16759892, 16759892, 16759891, 16759891, 16759634, 16759634, 16759633, 16759633, 16759376, 16759376, 16759376, 16759376, 16759375, 16759375, 16759375, 16759118, 16759118, 16759117, 16759117, 16758860, 16758860, 16758860, 16758860, 16758603, 16758603, 16758603, 16758602, 16758602, 16758345, 16758345, 16758344, 16758344, 16758088, 16758088, 16758088, 16758087, 16758087, 16757830, 16757830, 16757829, 16757829, 16757829, 16757572, 16757572, 16757571, 16757571, 16757571, 16757315, 16757315, 16757314, 16757314, 16757314);

$Status = 'Start';  // Wenn Script direkt aufgerufen wird von Kalt auf Warm regeln.

// Ruft man dieses Script mit  IPS_RunScriptEx(ID vom Script, Array("STATUS" => "Start")); auf so wird von Kalt auf Warm geregelt.
// Mit  IPS_RunScriptEx(ID vom Script, Array("STATUS" => "Stopp")); wird von Warm auf Kalt geregelt.


if (isset($_IPS['STATUS'])) $Status = $_IPS['STATUS'];

$StartID = @IPS_GetVariableIDByName("Start", $_IPS['SELF']);
if ($StartID == false){
    $StartID = IPS_CreateVariable(2);
    IPS_SetParent($StartID, $_IPS['SELF']);             //Variable zuordnen
    IPS_SetName($StartID, "Start");
}
$StepID = @IPS_GetVariableIDByName("Step", $_IPS['SELF']);
if ($StepID == false){
    $StepID = IPS_CreateVariable(2);
    IPS_SetParent($StepID, $_IPS['SELF']);             //Variable zuordnen
    IPS_SetName($StepID, "Step");
}
$CountID = @IPS_GetVariableIDByName("Count", $_IPS['SELF']);
if ($CountID == false){
    $CountID = IPS_CreateVariable(1);
    IPS_SetParent($CountID, $_IPS['SELF']);             //Variable zuordnen
    IPS_SetName($CountID, "Count");
}

if($_IPS['SENDER'] == "TimerEvent"){
    if (IPS_GetName($_IPS['EVENT']) == 'ScriptTimer'){
        $Start = GetValue($StartID);
        $Step = GetValue($StepID);
        $Count = GetValue($CountID);
        if ((($Start + $Step) >= 150) && (($Start + $Step) <= 500)){
            SetValue($StartID, $Start + $Step);
        }

        $UpdateList = array();
        $InstanzIDsList = IPS_GetInstanceListByModuleID('{E5BB36C6-A70B-EB23-3716-9151A09AC8A2}');  // Zigbee2MQTT

        foreach ($InstanzIDsList as $InstanzID) {
            $VarID = @IPS_GetObjectIDByIdent('Z2M_State', $InstanzID);
            if ($VarID > 0) {
                $state = GetValue($VarID);
                $ColorID = @IPS_GetObjectIDByIdent('Z2M_Color', $InstanzID);
                $ColorTempID = @IPS_GetObjectIDByIdent('Z2M_ColorTemp', $InstanzID);
                if ($ColorID > 0) {
                    if ($Start < 150) $Color = $rgb[0];
                    else if ($Start > 500) $Color = $rgb[350];
                    else $Color = $rgb[intval($Start) - 150];
                    if ($state){
                        RequestAction($ColorID, (int)$Color);
                        SetValue($ColorID, (int)$Color);
                    }
                    else{
                        if ($ColorTempID > 0) SetValue($ColorTempID, (int)$Start);
                        SetValue($ColorID, (int)$Color);
                    }
                }
                else{
                    if ($ColorTempID > 0) {
                        if ($state){
                            RequestAction($ColorTempID, (int)$Start);
                        }
                        else{
                            SetValue($ColorTempID, (int)$Start);
                        }
                    }
                }

                if (($ColorID > 0) || ($ColorTempID > 0)){
                    $Text = 'ID:' . $ColorID . ' ColorTemp:' . $Start . ' Color:' . dechex(intval($Color)) . ' = '. intval($Color);
// Hier kann man mitloggen lassen welche Lampen was bekommen.
                    //IPS_LogMessage("Farbe", $Text); 
                }
            }
        }
        SetValue($CountID, --$Count);
        if ($Count <= 0) IPS_SetScriptTimer($_IPS['SELF'], 0);
        return;
    }
}

if ($Status == 'Start'){
    SetValue($StartID, 153);
    SetValue($StepID, 250 / 60);
    SetValue($CountID, 60);
    IPS_SetScriptTimer($_IPS['SELF'], 60);
}
if ($Status == 'Stopp'){
    SetValue($StartID, 400);
    SetValue($StepID, -250 / 60);
    SetValue($CountID, 60);
    IPS_SetScriptTimer($_IPS['SELF'], 60);
}
?>

Kleines Abfallprodukt ist ein Script mit dem Alexa auch RGB-Lampen ohne Farbtemperatur in der Temperatur regeln kann.

<?php
$rgb = "Hier die Tabelle aus obigem Script einfügen"

// Gerät das Ferbtemperatur bekommen soll.
$DeviceID = 52514;
// ID von Farbe
$ColorVarID = IPS_GetObjectIDByName("Color", $_IPS['SELF']);
// ID von Farbtemperatur die Alexa liefert
$ColorTempVarID = IPS_GetObjectIDByName("ColorTemp", $_IPS['SELF']);
// Kelvin von Alexa in Mired für LUT umrechnen
$ColorTemp = 1000000 / GetValue($ColorTempVarID);
$Mired = $ColorTemp;
// LUT enthält nur Werte für Mired = 150..500
if ($Mired < 150) $Mired = 150;
if ($Mired > 500) $Mired = 500;
// Farbe aus LUT holen
$Color = $rgb[$Mired - 150];

// IDs für Farbe und Temperatur der Geräteinstanz ermitteln
$ColorID = @IPS_GetObjectIDByIdent("Z2M_Color", $DeviceID);
$ColorTempID = @IPS_GetObjectIDByIdent("Z2M_ColorTemp", $DeviceID);
// Wenn es Farbe gibt die immer nehmen
if ($ColorID > 0){
    RequestAction($ColorID, $Color);
}
// Bei White ambiente die Temperatur nehmen
else if ($ColorTempID > 0){
    RequestAction($ColorTempID, $ColorTemp);
}
?>

Ralf

Sehr geil. Schaue ich mir bei Gelegenheit an. Was scripte angeht die automatisch über vorhandene Geräte geht das ist noch magic für mich und total spannend.
Gruß Dennis

Ich habe mir mit Hilfe von GPT4 auch ein Adaptive Lighning Script erstellt, welches aktuell mit dem alten Hue Modul von Traxanos funktioniert, aber leicht adaptiert werden kann. Wenn ich den Umzug zum neuen Hue Modul V2 vollzogen habe, erstelle ich sicher ein neues Adaptive Lightning Script.

1 „Gefällt mir“

Hi,
und findest Du es nicht auch angenehmer Morgens und Abends wärmeres Licht zu haben? Mein Script habe ich mit ND erstellt :grin:

Ralf

Na klar, ich nutze das schon ewig und gefällt mir super gut, nur hab ich vor 2 Jahren dafür extra Home Assistant installiert um das zu realisieren :stuck_out_tongue: Jetzt fehlt nicht mehr viel und ich kann von HA komplett alles abziehen.

ND? Nachdenken?! :smiley:

Gruß
Dennis