Event Control (EventHandler)

Dieses Modul (in den Kern Instanzen) erlaubt dem User auf bestimmte Ereignisse in IP-Symcon zu reagieren und ein Skript zu starten.

Das Konfigurationsfenster beinhaltet eine Box, in die man Instanz und Skript eintragen kann. „Wenn sich der Status einer Instanz aktualisiert, kann in einem angegebenen Skript auf diese Aktualisierung reagiert werden“.

Gibt es eine Methode diese Liste nicht händisch, sondern mit einem Installations-Skript zu editieren/zu erweitern oder Einträge zu löschen?

(Ich habe die Suchhilfe bemüht, aber nichts gefunden. „Der IPSInstaller bietet diverse Funktionen um Objekte (Kategorien, Variablen, Links, usw.) in IPS anzulegen“, bezüglich dieser Möglichkeit habe ich dort nichts gefunden)

Viele Grüsse
Harald

Wie immer wenn man Instanzen konfiguriert:
Mit IPS_SetProperty: IPS_SetProperty — IP-Symcon :: Automatisierungssoftware
Zuvor den Wert StatusEvents mit IPS_GetProperty auslesen, mit Json_decode in ein Array wandeln.
Das Array ergänzen und mit json_encode und IPS_SetProperty schreiben. IPS_GetProperty — IP-Symcon :: Automatisierungssoftware

Anschließend IPS_ApplyChanges.
Michael

Vielen Dank für die Bauanleitung!:loveips:

Bevor ich das Rad neu erfinde suche ich halt erst mal eine bereits fertige Lösung.
Es sollen ja viele Experten die IPS-Komponenten per Skript anlegen, vielleicht ist jemand bereit seine diesbezügliche Lösung mit der Community zu teilen ?

Was ich so treibe, hab ich meist in IP-Symcon - Wie kann ich… 2.0 veröffentlicht.

Viele Grüsse
Harald

Hier meine erste function mit JSON- und Klassenprogrammierung ohne dass ich eine Ahnung davon habe :smiley:
Ist getestet unter IP-Symcon 4.4, Windows x64, 10.01.18, 0f19800dcb96; dennoch Benutzung auf eigene Gefahr.
Verbesserungsvorschläge erwünscht.

<?

/*
 * @file          ipsBeitrag_EventHandler.ips.php
 * @author        Harald Hertlein
 * @version       16.06.18 13:25
 *
 
 *
 */



// Editiere Liste der Statusereignisse im Modul Event Control
// $Mode = '?': Abfrage ob das Paar Device/Script existiert, = '-': Paar wird entfernt, = '+': Paar wird hinzugefügt
// function liefert 'false' wenn was nicht zutrifft oder fehlschlägt, '0' wenn bei Abfrage Paar nicht vorhanden, sonst die ID des Devices
function EditEventHandler ($Mode = '?', $DeviceID, $ScriptID) {
    if (@IPS_GetObject ($ScriptID)['ObjectType'] != 3)   // Skript?
        return false;
    if (@IPS_GetObject ($DeviceID)['ObjectType'] != 1)   // Instanz?
        return false;
    $ModuleId = @IPS_GetInstanceListByModuleID ("{ED573B53-8991-4866-B28C-CBE44C59A2DA}")[0];   //  [ModuleName] => Event Control
    if ($ModuleId === false)
        die ("Modul 'Event Control' nicht gefunden!!");
    $EventListe = Json_decode (IPS_GetProperty ($ModuleId, 'StatusEvents'));
    $Found = 0;
    foreach ($EventListe as $Nr => $Event) {
        if (($Event -> DeviceID == $DeviceID) && ($Event -> ScriptID == $ScriptID)) {
            $Found = $Event -> DeviceID;
            break;
        }
    }
    switch ($Mode):
        case '?':
            return $Found;
            break;
        case '+':
            if ($Found)
                return false;
            @$EventNeu -> DeviceID = $DeviceID;
            $EventNeu -> ScriptID = $ScriptID;
            $EventListe[] = $EventNeu;
            break;
        case '-':
            if ($Found) {
                unset ($EventListe[$Nr]);
                $EventListe = array_values ($EventListe);
            } else {
                return false;
            }
            break;
        default:
    endswitch;

    IPS_SetProperty ($ModuleId, 'StatusEvents', Json_encode ($EventListe));
    IPS_ApplyChanges ($ModuleId);
    return $DeviceID;
}

?>

Viele Grüsse
Harald