Mehrere Variablen unter Instanz als Auslöser für Skript

Hallo,
ich habe hier eine Instanz in welche immer wieder Variablen verlinkt werden.
Wenn sich nun ein Wert einer Variablen innerhalb dieser Instanz ändert so soll ein Script ausgeführt werden.
Kennt ihr dafür einen passenden Weg?
Ich könnte natürlich einen Ablaufplan nehmen und dort die Variablen nochmals als Auslöser definiert - aber das ist doppelt gemoppelt - und fehleranfällig.
Gibt’s vielleicht eine einfache - direkte Möglichkeit ?
Das Modul Variablenüberwachung passt vom Ansatz her nicht.
Danke

Auf eine Änderung eines Wertes von Variablen kannst du nur mit Ereignisse reagieren.
Sonst musst du etwas mehr ausholen was da genau passiert und was du erreichen willst.
Michael

In einer Modulinstanz würde das funktionieren.
Je nachdem ob es dir der aufwand Wert ist :wink:

Konkret:
Ich habe eine Instanz die heißt: „Alarmkontakte“ welche ich überwachen möchte.
Da kommen Links von Schaltkontakten rein.
Immer wenn sich da drinnen ein Wert eines Schaltkontakts ändert möchte ich per Mail benachrichtigt werden - also wenn z.b. eine Pumpe einen Alarm auslöst etc.

Vielleicht das Logik- Gatter?

Gruß
Stephan

Auch Konkret:

Da drinnen ändert sich kein Wert. Links haben keinen Wert. Nur die Variable kann den Wert ändern.

Warum ist das doppelt gemoppelt? Und warum Ablaufplan wenn du…

hier ein Script starten willst?

Ja, ABER ist nicht so gewünscht. Bevor es Listen gab, wurden Links als Workaround benutzt. Jetzt werden Variablen in Listen einer Instanz konfiguriert.

@habre
Lassen wir die Dummy Instanz und Links mal außen vor.
Eigentlich brauchst du doch nur ein Ereignis unterhalb der SMTP Instanz anlegen und konfigurieren. Anschließen das immer kopieren und die Auslösende Variable anpassen.
Natürlich musst du das genauso pflegen, wie auch die Links.

Edit:

:+1:

Wenn der Inhalt immer der Mail immer Identisch ist,
dann ist das Logikgatter natürlich eine Option um nur ein Event anlegen zu müssen.
Aber auch hier müssen dann die Variablen in der Logik Gatter Instanz konfiguriert und gepflegt werden.
Michael

Danke euch.
Ich sehe schon - viele Möglichkeiten.
Die Links unter einer Instanz hätte ich halt benutzt weil man gleichzeitig die Möglichkeit der Visualisierung hätte.

Viele Wege führen nach Rom :grinning:

Kannst auch ein Skript schreiben das alle Child Objekte der Instanz einliest, nachschaut ob die schon als Auslöser bei deinem Ereignis vorhanden sind und gegebenenfalls neu als Auslöser hinzufügt… das Skript zyklisch laufen lassen… fertig

Gruß
Stephan

ChatGPT: (nicht getestet!)


Code entfernt weil Schwachsinn ;-)

Aber der von dem Script leider nicht.
Hier wird ja nur immer ein Ereignis verändert.
Und nie ein neues erstellt.
ChatGPT ist wohl der Ansicht man kann mehrere Variablen als Auslöser einem Ereignis zuordnen.
Michael

so könnte es funktionieren:

<?php
// ID der Dummy-Instanz
$dummyInstanceID = 32137;  // Setze hier die ID deiner Dummy-Instanz ein
// ID des Skripts für welches die Ereignisse erstellt werden sollen
$scriptID = 31281;


// Funktion, um Ereignisse zu prüfen und ggf. zu erstellen oder zu löschen
function manageEvents($dummyInstanceID, $scriptID) {
    // Hole alle Links unter der Dummy-Instanz
    $childrenIDs = IPS_GetChildrenIDs($dummyInstanceID);
    $existingLinks = [];
    
    // Finde alle Links und erstelle eine Liste der verlinkten Variablen
    foreach ($childrenIDs as $childID) {
        if (IPS_GetObject($childID)['ObjectType'] == 6) { // 6 = Link
            $targetID = IPS_GetLink($childID)['TargetID'];
            $existingLinks[$targetID] = $childID;
            
            // Prüfe, ob ein Ereignis für diese Variable existiert
            $eventID = @IPS_GetEventIDByName("Auto Event for $targetID", $scriptID);
            
            if ($eventID === false) {
                // Ereignis existiert nicht, also erstellen wir ein neues
                $eventID = IPS_CreateEvent(0); // 0 = Ausgelöstes Ereignis
                IPS_SetParent($eventID, $scriptID); // Ereignis dem Skript zuordnen
                IPS_SetName($eventID, "Auto Event for $targetID");
                IPS_SetEventTrigger($eventID, 1, $targetID); // 1 = Bei Variablenänderung
                IPS_SetEventScript($eventID, "IPS_RunScript($scriptID);");
                IPS_SetEventActive($eventID, true); // Ereignis aktivieren
            }
        }
    }
    
    // Prüfe alle vorhandenen Ereignisse unter dem Skript und lösche diejenigen, die keinen Link mehr haben
    $eventIDs = IPS_GetChildrenIDs($scriptID);
    foreach ($eventIDs as $eventID) {
        if (IPS_EventExists($eventID)) {
            $event = IPS_GetEvent($eventID);
            if ($event['EventType'] == 0 && $event['TriggerVariableID'] != 0) {
                $triggerVariableID = $event['TriggerVariableID'];
                if (!array_key_exists($triggerVariableID, $existingLinks)) {
                    // Ereignis löschen, da der Link nicht mehr existiert
                  //  IPS_DeleteEvent($eventID); //Befehl nur auf eigene Gefahr und vorheriger Prüfung verwenden!!!
                }
            }
        }
    }
}

// Rufe die Funktion zur Verwaltung der Ereignisse auf
manageEvents($dummyInstanceID, $scriptID);

// Deine Hauptskript-Logik hier
// Diese Logik wird bei jeder Änderung der verlinkten Variablen ausgeführt
?>

Moin, ich hatte das selbe Problem und habe 2 (naja 3) Lösungsmöglichkeiten.

Die erste ist eher was für fortgeschrittene, ich lasse die Auswertung der Veränderungen von einer Workflow-Instanz machen… das führt zu weit, eigentlich eine geniale Sache, aber kann ich jetzt hier nicht so schnell erklären.

Die zweite Möglichkeit: Ich habe mir auch so ein Script gebaut (naja auch bauen lassen, weil ich faul war, ChatGPT hat es bei mir schon richtig gemacht), dass für jeden Link unter einer Instanz/Kategorie, what ever, einen Event anlegt, so wie ich ihn gerne hätte und alle Events rufen das selbe Script zur Ausführung auf. Wenn du das also das erprobte Script haben möchtest, sag bescheid.

Und die 3. Möglichkeit wird ist oben schon weiter angesprochen worden, man kann es in einem Modul realisieren. Das wollte ich, wenn ich mal langeweile habe, umsetzen. Es wäre die eleganteste Möglichkeit.

Insgesamt finde ich das Verlinken von Werten unter Kategorien ist eine sehr elegante und flexible Art Scripte zu steuern, ich tue es nicht nur für Abfragen von Veränderungen, sondern auch für das Ausführen. Mein Script „alle Lichter aus“ z.B. steuert alle Lichter die unter einer bestimmten Kategorie verlinkt sind an, gerne auch noch darunter in Sub-Sets (EG, OG etc. ) sortiert , so dass das Script auch auf den Ebenen funktioniert. Das wird (für mich) bei IPS noch zu wenig supported :smiley:

Das mit so einem Script für Licht, auch pro Geschoss, oder auch für das Senden von Benachrichtigungen, nutze ich auch.
Allerdings ganz ohne Links.
Weil die Events zeigen ja schon auf die Variable, also habe ich da schon die Verknüpfung und das Ziel (Geschoss oder Alarmtext bei Benachrichtigung) entnehme ich dem jeweiligen Namen vom Ereignis.
Michael

Beim Schalten mache ich es anders, und natürlich ohne Events. Ich gehe per Script alle Links unter einer Kategorie durch, „verfolge“ die Links bis zur echten Variable und schalte diese dann. Das ganze aber auch Rekursiv, wegen oben angeschriebener Strukturierung. Links verwende ich nur dafür, dass ich nicht die Original-Variablen verschieben muss. Ich hab eine Kategorie mit der echten Hardware und eine Kategorie mit diesen Logiken und Scripten, dort rein verlinke ich dann die gewünschten Elemente.

Schalten war damit nicht gemeint :grin:
Geht aber auch ohne Links, weil die Ereignis ja eh da sind um die Summenvariable pro Etage abzubilden.

Dito.
Nur das ich dort keine Links nutze.
Die sind ausschließlich in meiner Visu Kategorie.
Nicht das einem nachher die ObjektIDs ausgehen :sweat_smile:
Michael

das würde mich mal interessieren, wie es bei dir aussieht. vielleicht gibts ja auch andere neue Wege :smiley: man wird ja Betriebsblind