Manchmal benötigt man individuelle Parameter für eine Instanz, um diese in Scripten weiter zu verarbeiten. Zwei Beispiele:
Ihr habt mehrere Rollladenaktoren und wollt diese per Script auf eine bestimmte Stellung fahren (z.B. halb oder dreiviertel). Bei den meisten mir bekannten Aktoren wird eine Rollladenstellung aber in % angegben. Nun ist aber - je nach Länge der Rollladen - 75 % rein visuell nicht dreiviertel. Hat man jetzt mehrere unterschiedlich lange Rollladen (z.B. Terrassentür und ein normales Fenster), dann sind bei dem einen Aktor z.B. eine dreiviertel Stellung gleich 60%, bei dem anderen vielleicht 85%. Man müsste jetzt also pro „Rollladentyp“ jeweils ein angepasstes Script verwenden, oder irgendwo eine Parametertabelle pflegen, aus der man dann in einem universellen Script darauf zugreifen kann.
Oder ihr habt Dummy-Instanzen von Netzwerk-Objekten (z.B. Computer, Switch, etc.), wo ihr den jeweiligen Netzwerknamen oder IP-Adressen hinterlegen wollt, um mit einem universellen Script darauf zuzugreifen (z.B. um zu reagieren, ob das Gerät per Ping erreichbar ist). Auch hier müsstet Ihr die IP-Adresse oder den FQDN fest im Script hinterlegen, damit müsstet Ihr wieder für jedes Gerät ein angepasstes Script vorhalten.
Bei diesen Szenarien wäre es super, wann man bei einer Instanz einfach weitere individuelle Parameter hinterlegen könnte. Es gibt aber hier keine „Custom-Attributes“
… deswegen habe ich einfach das „Beschreibungsfeld“ der Instanz auserkoren, welches ich sowieso nicht verwende und mir eine Funktion gebaut, die diese Parameter per Key-Value-Paare im Script bereitstellen kann.
Ihr müsst, um dies ebenfalls zu verwenden, das Beschreibungsfeld z.B. wie folgt füllen (Beispiel Netzwerkinformationen):
FQDN: computer1.domain.local
IPAddress: 192.168.0.55
MacAddress: 0123456789AB
Description: Computer Micha
Danach legt Ihr unterhalb dieser Instanz ein Script an und könnt mit folgenden Beispielen auf die Parameter zugreifen.
Beispiel:
$parameterArray = SYS_GetParentInstanceParameter($_IPS["SELF"]);
$ip = SYS_GetParentInstanceParameter($_IPS["SELF"])["IPAddress"];
Selbstverständlich könnt ihr auch eine Instanz-ID oder eine Objekt-ID, welche irgendwo unterhalb der Instanz liegt, angeben, falls das Script nicht direkt unterhalb dieser Instanz liegt.
Beispiel:
$fqdn = SYS_GetParentInstanceParameter(12345)["FQDN"];
Und hier die Funktion dazu. Diese verwendet allerdings die ebenfalls hier gepostete Funktion SYS_GetParentInstanceID, welche ihr dann ebenfalls im Include-File bereitstellen müsst.
Funktion:
function SYS_GetParentInstanceParameter($objectID)
//Ermittelt die Übergeordnete Instanz und liefert deren Parameter aus dem Beschreibungsfeld
//Übergabe: [INT]$objectID = ID des Objektes, aus welcher der ersten übergeordneten Instanz die Parameter ermittelt werden sollen
//Rückgabe: [ARRAY] = Parameter als key => value Paare, [STRING] = Inhalt des Beschreibungsfeldes, [BOOL] = {false=Keine Parameter enthalten oder keine übergeordnete Instanz gefunden}
{
//Fehlerbehandlung
if(!isset($objectID)) die("Error in Function ".__FUNCTION__." - Missing argument for \$objectID");
if(!is_int($objectID)) die("Error in Function ".__FUNCTION__." - Value for parameter \$objectID is not integer");
if($objectID < 10000 or $objectID > 59999) die("Error in Function ".__FUNCTION__." - The value for \$objectID must be between 10000 and 59999");
//Parent InstanceID ermitteln
$parentInstanceID = SYS_GetParentInstanceID($objectID);
//Keine übergeordnete Instanz gefunden
if(!$parentInstanceID) return false;
//Beschreibungsfeld lesen
$object = IPS_GetObject($parentInstanceID);
$description = $object["ObjectInfo"];
//Falls keine Beschreibung existiert, false zurückgeben
if(!$description) return false;
//Falls : gefunden wurde, handelt es sich (vermutlich) um Parameter
if(strpos($description,":"))
{
//Rückgabevariable ist ein Array
$return = array();
//Parameter vereinzeln
$parameterArray = explode("
",$description);
//Parameter durchzählen
foreach($parameterArray as $parameter)
{
//Key => Value ermitteln und in Array schreiben
$keyValue = explode(":",$parameter);
//Parameter zum Array hinzufügen
$return[trim($keyValue[0])] = trim($keyValue[1]);
}
}
//Es ist (vermutlich) ein einfacher String
else
{
//String als Rückgabeparameter setzen
$return = strval($description);
}
//Rückgabe
return $return;
}