Abgleich mehrerer Variablen für eine Aktion

Vermutlich ist das was ziemlich simples und ich stehe gerade einfach auf dem Schlauch.

Ich möchte einen Variable temporär abschalten (Bewegunsmelder deaktivieren).
Diese soll zum einen per Zeitplan, weiterhin über eine Variable im WF und auch noch über einen Taster aktiviert/deaktiviert werden können.
Der Taster kommt vom LCN also ein virtuelles Relais, was ich hier nutze. Nun muss ich natürlich sicherstellen, dass wenn ich im WF schalte, das virtuelle Relais ebenfalls auf dem true oder false Wert gesetzt wird, ebenso umgekehrt, wenn ich übers virtuelle Relais schalte.
Beim Zeitplan hab ich das Problem nicht, wenn der mit „true“ aufgerufen wird und es ist schon true, dann einfach ignorieren.

Wenn ich nun einfach alle 3 Ereignisse an ein Skript knüpfe und auf Aktualisierung Abfrage, dann wird das Skript unendlich oft aufgerufen. Wenn ich auf bestimmten Wert Abfrage, dann kann ich ja nicht den „is true“ oder „is false“ abfangen.

Also ich bin schonmal weiter gekommen, das alles abgeglichen wird, habe ich so gelöst. Wie kann ich denn nun am geschicktesten verhindern, dass das Skript für jede Aktualisierung (Aktuell ist noch das virt. Relais, die Variable und der Zeitplan als Ereignis angeknüpft) aufgerufen wird. Im aktuellen Fall wird das nämlich durch den Zeitplan 3x aufgerufen. Zwar ohne Änderungen aber das muss ja nicht sein.

<?php
$idrelay = 30762; //virt Relais zum Abschalten BWM Flur OG
$idBWMFlurOG = 57786;
### DEBUG
#IPS_LogMessage($_IPS['SELF'].":" .IPS_GetName ($_IPS['SELF']), "Sender: ". $_IPS['SENDER']);

//ID1: BWM Flur OG aktiviert
//ID2: BWM Flur OG deaktiviert


### Status setzen oder rücksetzen anhand der möglichen Aufrufe bilden
switch ($_IPS['SENDER'])
    {
    case 'TimerEvent':
    switch ($_IPS['ACTION'])
    { 
        case 1: //ID 1 an
            $var = true;
            break;
        case 2: //ID 2 aus
            $var = false;
            break;
    }
    break;
    case 'Variable':
        if ($_IPS['VALUE'] == 1)
          {$var = true;}
        else
        {$var = false;}
    break;
    default:
        IPS_LogMessage($_IPS['SELF'].":" .IPS_GetName ($_IPS['SELF']), "IPS_Sender nicht bekannt");
    }


#### Setzen der Werte
if ($var == true)
{
    SetValueBoolean ($idBWMFlurOG, true);
    LCN_SwitchRelay ($idrelay, true);
    IPS_LogMessage($_IPS['SELF'].":" .IPS_GetName ($_IPS['SELF']), "BWM Flur aktiviert");	
}
else
{
    SetValueBoolean ($idBWMFlurOG, false);
    LCN_SwitchRelay ($idrelay, false);
    IPS_LogMessage($_IPS['SELF'].":" .IPS_GetName ($_IPS['SELF']), "BWM Flur deaktiviert");	
}

?>

Hast du dir mal den Ablaufplan angesehen? Damit solltest du deinen Wunsch eigentlich auch ohne Skript umsetzen können.

Viele Grüße
Stephan

Tatsächlich noch nicht nein. ich muss zugeben, dass ich in den letzten ~15 Monaten nur das nötigste machen konnte und hab immer nur hier und da zwischendurch was neu programmiert oder „funktionsfähig“ geschrieben…
Schau ich mir aber mal an…

Aktuell habe ich das noch so hinzugefügt, dass ich die angefügten Ereignisse deaktiviere und am Ende nach dem setzen einfach wieder aktiviere. Das funktioniert allerdings auch nicht sauber, vermutlich wird „zu schnell“ gesetzt und aktiviert/deaktiviert. Verzögere ich mittendrin etwas mit sleep(1), so funktioniert es, dass bei jedem Ereignis nur 1x aufgerufen wird. Aber sauber is das Ganze auch nicht ^^

$EreignisID = @IPS_GetScriptEventList($_IPS['SELF']);
for ($i = 0; $i<count($EreignisID);$i++){
    IPS_SetEventActive($EreignisID[$i], false);
}