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)
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 ?
Hier meine erste function mit JSON- und Klassenprogrammierung ohne dass ich eine Ahnung davon habe
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;
}
?>