Habe hier ein kleines Script für die Funktion gebastelt:
Voraussetzung: die XML-API wurde auf der CCU installiert.
Installation:
1.) Kategorie erstellen
2.) das Script unterhalb der Kategorie hinzufügen - die Variable $ccu_ip anpassen
3.) ausführen lassen
ich hab mir momentan ein Ereignis erstellt, was jede Minute den Status abfragt.
Wenn in der CCU eine Systemvariable erstellt oder gelöscht wird, wird sie auch in IPS beim nächsten Script-Aufruf automatisch erstellt oder eben gelöscht.
Hoffe es hilft dem ein oder anderen
Hier nun das Script:
<?
// Variablen vorgeben
$ccu_ip = '192.168.0.13'; // IP der Homematic-CCU
$par_id = IPS_GetParent($_IPS['SELF']);
$vars_new[] = $_IPS['SELF']; // um zu verhidern, dass das script später gelöscht wird
$vars_old = IPS_GetChildrenIDs($par_id);
$xml = simplexml_load_file('http://'.$ccu_ip.'/config/xmlapi/sysvarlist.cgi');
$xml = new simpleXMLElement($xml->asXML());
$i=0;
while($i < count($xml->systemVariable)) {
$var_name = $xml->systemVariable[$i]['name'];
$var_value = $xml->systemVariable[$i]['value'];
$var_ise_id = $xml->systemVariable[$i]['ise_id'];
if(empty($var_value)) $var_value == " ";
$var_type = $xml->systemVariable[$i]['type'];
$var_id = @GetIDByCCUID($var_ise_id);
$vars_new[] = $var_id;
if($var_id == false) {
switch($var_type) {
case 2: //Boolean-Variable erstellen
if($var_value == 'true') {
$var_value = TRUE;
} else {
$var_value = FALSE;
}
$new_var_id = IPS_CreateVariable(0);
SetValueBoolean($new_var_id, $var_value);
break;
case 4: //Integer-Variable erstellen
case 16:
$new_var_id = IPS_CreateVariable(1);
SetValueInteger($new_var_id, (int)$var_value);
break;
case 20: //String-Variable erstellen
$new_var_id = IPS_CreateVariable(3);
SetValueString($new_var_id, (string)$var_value);
break;
}
IPS_SetName($new_var_id, "$var_name");
IPS_SetInfo($new_var_id, "$var_ise_id");
IPS_SetParent($new_var_id, $par_id);
} else {
switch($xml->systemVariable[$i]['type']) {
case 2: //Boolean-Variable veraendern
if($var_value == 'true') {
$var_value = TRUE;
} else {
$var_value = FALSE;
}
SetValueBoolean($var_id, $var_value);
break;
case 4: //Integer-Variable veraendern
case 16:
SetValueInteger($var_id, (int)$var_value);
break;
case 20: //String-Variable veraendern
SetValueString($var_id, (string)$var_value);
break;
}
if(IPS_GetName($var_id) != $var_name) {
IPS_SetName($var_id, "$var_name");
}
}
$i++;
}
$var_dif = array_diff($vars_old, $vars_new);
//Variablen löschen, die in der CCU auch gelöscht wurden
if(is_array($var_dif)) {
foreach($var_dif as $val) {
IPS_DeleteVariable($val);
}
}
function GetIDByCCUID($ccuid) {
global $vars_old;
foreach ($vars_old as $ips_id) {
$info = IPS_GetObject($ips_id);
if($ccuid == $info['ObjectInfo']) {
return $ips_id;
}
}
}
?>
Danke für Deine Antwort, ich habe die Systemvariablen nicht in ips bekommen, habe ich irgend was vergessen? ich bin ein blutiger IPS Anfänger und kenne mich mit php noch nicht wirklich aus!
ich habe das alte Script nun gegen das Neue getauscht.
Es funktioniert so weit auch ganz gut.
Allerdings werden alle Variablen in den Stamm von IPS angelegt und nicht in meine angelegte Kategorie.
Verschieben bringt nichts, da bei erneuter Ausführung des Scriptes neue Variablen in das Hauptverzeichnis angelegt werden.
Liegt das daran, dass ich noch IPS 2.4 verwende?
danke für Deine Antwort.
Ich verwende jetzt wieder das alte Script.
Das Script hatte ich bei einer Aufräumaktion in IPS gelöscht.
Weil ich dachte, dass ich derzeit keine Verwendung dafür habe.
Dies hat sich natürlich schnell als Irrtum rausgestellt.
Deshalb verwendete ich bei der Wiederherstellung das neue Script.