Variable nach Priorität setzen

Hallo zusammen,

ich würde gerne eine Variable schalten bzw. setzen, welche durch Störungs und Alarm-Ereignisse getriggert wird.

Mein Problem ist nun, das ich eigentlich priorisieren müsste. Eine Störung hat eine niedrige Priorität, ein Alarm eine höhere Priorität.

Als Beispiel:
Ziel Variable ist Integer. Normal ist Wert 0. Störung ist Wert 1 und Alarm ist Wert 2.

Tritt nun ein Alarm auf, dann soll die Variable auf den Wert 2 gesetzt werden. Das bekomme ich noch hin. Tritt nun eine Störung auf (bei anstehendem Alarm), dann soll der Wert nicht auf 1 gesetzt werden, da Störung eine geringere Priorität hat. Wird der Alarm allerdings zurückgesetzt und die Störung steht noch an, dann soll der Wert „1“ gesetzt werden. Tritt dann ein Alarm auf, dann soll wieder auf Wert „2“ gesetzt werden.

Oder gibt es für so einen Fall ein Modul? Ich vermute nämlich, das dieses über ein Skript nur sehr schwer zu lösen ist?

Das dürfte nicht so eine Hexerei sein…
Was liefert denn die Variable für Werte, die du überwachen willst?
Oder sind es mehrere Variablen?

Ggf. hilft dir hier Bitweise vorzugehen?
1,2,4,8,16,32? Kannst die einzelnen Werte addieren und in jedem Zustand feststellen, was gerade aktiv ist. Durch passende Sortierung der Werte wird die Zahl bei dringlichen Fehlern größer. Durch das Profil kannst du dann festlegen: Alles zw. 16 und 32 ist Störung, 32 ist Alarm. 48 ist Alarm+Störung, etc.

Die zu überwachenden Variablen sind Boolean… ja sind mehrere.

Musst ein bisschen mehr schreiben.
Wie viele bool?
Was bedeutet wenn bool1 auf true ist?
Was bedeutet wenn bool2 auf true ist?
usw…

naja das kommt drauf an, es ist ein wachsendes System und da kommen in Zukunft sicherlich noch Störungs und Alarmvariablen dazu…

bool1 kann eine Alarm oder Störungsvariable sein, bool 2 ebenso… Das kann man ja so gar nicht sagen.
Derteit aktueller Stand sind 3 Störungs und 4 Alarmvariablen, aber wie gesagt das kann sich auch noch ändern.

Am besten mache ich das mit 2 Global-Variaben.

1.Alarm global
2. Störung global

Wenn Alarm global true ist (also irgendein Alarm ansteht) dann hat diese Priorität und die Störung global wird als untergeordnet betrachtet.

Habs kurz nachgestellt, müsst so funktionieren.
Ereignis und Integer werden automatisch unterhalb des Scripts erstellt wenn du das Script das erste mal ausführst.
Die bool werden in Gruppen gefasst, die höchste Prio hat immer die Alarm Gruppe.

<?php

// IDs der Boolean-Variablen für die Gruppen
$disturbanceVars = [48177, 49675]; // Ersetze diese IDs durch die tatsächlichen IDs der Störungs-Variablen
$alarmVars = [20352, 44882]; // Ersetze diese IDs durch die tatsächlichen IDs der Alarm-Variablen

// Name und Ident der Ziel-Integer-Variable
$intVariableName = "Zielwert";
$intVariableIdent = "ZielwertStatus";
$parentID = $_IPS['SELF']; // Das Skript selbst als Elternobjekt

// Ziel-Integer-Variable prüfen und erstellen, falls nicht vorhanden
$intVariableId = @IPS_GetObjectIDByIdent($intVariableIdent, $parentID);
if ($intVariableId === false) {
    // Ziel-Integer-Variable erstellen
    $intVariableId = IPS_CreateVariable(1); // 1 bedeutet Integer
    IPS_SetName($intVariableId, $intVariableName);
    IPS_SetIdent($intVariableId, $intVariableIdent);
    IPS_SetParent($intVariableId, $parentID); // Unterhalb des Skripts erstellen
}

// Funktion zur Bestimmung des Ziel-Integer-Werts
function updateTargetValue($disturbanceVars, $alarmVars, $intVariableId) {
    // Überprüfen, ob eine Alarm-Variable auf true gesetzt ist
    foreach ($alarmVars as $alarmVarId) {
        if (GetValue($alarmVarId)) {
            SetValue($intVariableId, 2);
            return;
        }
    }

    // Überprüfen, ob eine Störungs-Variable auf true gesetzt ist
    foreach ($disturbanceVars as $disturbanceVarId) {
        if (GetValue($disturbanceVarId)) {
            SetValue($intVariableId, 1);
            return;
        }
    }

    // Wenn keine Variable auf true gesetzt ist, Wert auf 0 setzen
    SetValue($intVariableId, 0);
}

// Ziel-Integer-Wert aktualisieren
updateTargetValue($disturbanceVars, $alarmVars, $intVariableId);

// Ereignisse erstellen oder sicherstellen, dass sie das Skript korrekt zuweisen
function createOrUpdateEvent($eventName, $variableId, $scriptId) {
    $eventID = @IPS_GetEventIDByName($eventName, $scriptId);
    if ($eventID === false) {
        $eventID = IPS_CreateEvent(0); // 0 bedeutet Ausgelöstes Ereignis
        IPS_SetEventTrigger($eventID, 1, $variableId); // 1 bedeutet bei Änderung
        IPS_SetParent($eventID, $scriptId);
        IPS_SetName($eventID, $eventName);
        IPS_SetEventScript($eventID, "IPS_RunScript($scriptId);");
        IPS_SetEventActive($eventID, true);
    } else {
        IPS_SetEventScript($eventID, "IPS_RunScript($scriptId);");
    }
}

// Ereignisse für alle überwachten Variablen erstellen oder aktualisieren
foreach (array_merge($disturbanceVars, $alarmVars) as $varId) {
    createOrUpdateEvent("Ereignis für Variable $varId", $varId, $_IPS['SELF']);
}

?>