Bewegungsmelder - Einschalthelligkeit - Raum Verlassen Aus

Hallo

Ich habe folgendes Szenario
In jedem Raum ist ein Bewegungsmelder vorhanden. Dieser soll im Tagesverlauf verschiedene Aufgaben haben.
Nachts

  • Im Flur Licht dezent ein und ausschalten (Einschalthelligkeit für MDT Dimmer)
  • Im Schlafzimmer nur Licht ausschalten

Tagsüber

  • je nach Umgebungshelligkeit Licht ein und ausschalten
  • Bei nicht aktivität über ca. halbe Stunde alle Lichter ausschalten, da keiner mehr im Raum ist

es sollen Tags andere Lichter als Nachts geschalten werden.
Das ganze wird irgendwie ganz schön komplizert.

Den Anfang hab ich schon mal gemacht. bin aber drauf und dran da nochmal ganz neu anzusetzen.

Hier noch der Code:

<?php
$IDOwn          = $_IPS['SELF'];
$IDMain         = IPS_GetParent ($IDOwn);



$IDOutputHard   = IPS_GetVariableIDByName ("output_hardware", $IDMain);
$IDOutputSoft   = IPS_GetVariableIDByName ("output_software (auf aktualisieren abfragen)", $IDMain);

$IDSetVorgabe   = IPS_GetVariableIDByName ("settings_vorgabe", $IDMain);
$IDSetNachlauf  = IPS_GetVariableIDByName ("settings_nachlaufzeit (sec)", $IDMain);
$IDSetBright    = IPS_GetVariableIDByName ("settings_brightness", $IDMain);
$IDStatusBright = IPS_GetEvent(IPS_GetEventIDByName ("INFO_Bright", $_IPS['SELF']))['TriggerVariableID'];


// Hardware Status berechnen
$StatusHardware = 0;

foreach (IPS_GetChildrenIDs($_IPS['SELF']) as $ID) {
    // Namen rausfiltern
    if(IPS_GetName ($ID) == "BEW_Input" and GetValue (IPS_GetEvent($ID)['TriggerVariableID']) == true){$StatusHardware = $StatusHardware + 1;}else{};
}

if ($StatusHardware > 0){$StatusHardware = true;}else{$StatusHardware = false;}

if ($_IPS['SENDER'] == "Variable") {
    IPS_SetScriptTimer ($IDOwn, 0);
    }

if ($_IPS['SENDER'] == "TimerEvent") {
    IPS_SetScriptTimer ($IDOwn, 0); 
    //    setvalue ($IDOutputSoft, $StatusSoftware);
    setvalue ($IDOutputSoft, false);
    goto Programmende;
    }



// Software Status berechnen
switch (getvalue ($IDMain)){
    case 0:         // Immer AUS
    $StatusSoftware     = false;
    break;

    case 1:         // Immer EIN
    $StatusSoftware     = true;
    break;

    case 2:         // Automatik je nach Vorgabe 
    switch (getvalue ($IDSetVorgabe)){
        case 0:     // Deaktiviert Nix machen
        $StatusSoftware = getvalue ($IDOutputSoft);
        break;

        case 1:     // Aus und Ein Immer
        $StatusSoftware = $StatusHardware;
        
        // Ausschalttimer starten
        if ($StatusSoftware == false){IPS_SetScriptTimer ($IDOwn, 0); IPS_SetScriptTimer ($IDOwn, getvalue ($IDSetNachlauf)); goto Programmende;}
        break;

        case 2:     // Aus und Ein Helligkeitsabhänig
        if ($StatusHardware == true) {
            // einschalten
            if (getvalue ($IDStatusBright) < getvalue ($IDSetBright)){
                // dunkel
                $StatusSoftware = true;
                }else{
                $StatusSoftware = getvalue ($IDOutputSoft);
            }
        }else{
            // ausschalten
            $StatusSoftware = false;

        }
        
         // Ausschalttimer starten
        if ($StatusSoftware == false){IPS_SetScriptTimer ($IDOwn, 0); IPS_SetScriptTimer ($IDOwn, getvalue ($IDSetNachlauf)); goto Programmende;}

        break;

        case 3:     // Nur Ausschalten
        if ($StatusHardware == false){
            $StatusSoftware = false;
             // Ausschalttimer starten
            if ($StatusSoftware == false){IPS_SetScriptTimer ($IDOwn, 0); IPS_SetScriptTimer ($IDOwn, getvalue ($IDSetNachlauf)); goto Programmende;}
            
            setvalue ($IDOutputSoft, $StatusSoftware);
            }else{
            $StatusSoftware = getvalue ($IDOutputSoft);}
        


        break;
    }
}


// Ausgabe der Statuswerte nur bei Änderung
if (getvalue ($IDOutputSoft) ==  $StatusSoftware){} else {setvalue ($IDOutputSoft, $StatusSoftware);}

Programmende:
if (getvalue ($IDOutputHard) ==  $StatusHardware){} else {setvalue ($IDOutputHard, $StatusHardware);}

Vielleicht hat da schonmal jemand sowas in der Art gemacht und kann helfen? PHP bin ich im grunde fit. Möchte das ganze allerdings variabel für jeden Raum gestalten über Links zu den Lichtern oder ähnliches.
Für Tips und Infos bin ich überaus dankbar.

Ich kenne zwar Deine Präsenzmelder nicht, aber je nach Anzahl der Kanäle gestaltet sich das vermutlich auf der KNX-Ebene einfacher. Evtl einen Teil in IPS.

In Deinem Beispiel, nimm einen Lichtkanal des PM´s für Tag und einen für Nacht.
Verriegele Beide Kanäle dann gegenseitig. Je nach Wunsch kannst Du dann beide Kanäle entsprechend parametrieren. Z.B Tagsüber Umgebungslichtabhängig und/oder ob Du Lichter nur ein oder Ausschalten willst,
Das Ausschalten übernimmt die Nachlaufzeit der einzelnen Kanäle.
Wenn Du nur Ausschalten willst (Umgebungslichtunabhängig, nach Ablauf der Nachlaufzeit) kannst Du auch den Alarmkanal nehmen (Wenns den gibt) und ein „Aus“ auf eine entsprechende GA

Ich bin immer dafür möglichst zuerst die nativen KNX Funktionen zu verwenden (wenns Sinn macht) und dann erst die Logik/Viso engine