HM Systemvariablen auslesen und in IPS anlegen

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 :wink:

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;
		}
	}
}
?>

Hallo,

Supper es geht, :slight_smile:

um jetzt den Startus der Variabel in der CCU zu ändern, muß ich das Script jedes mal starten ?

Dieses Script ist für die Richtung CCU => IPS

also IPS holt sich mit dem Script nur die Variablen + Werte von der CCU und speicherts in IPS-Variablen.

Hast du auch ein Script für anders herrum IPS => CCU ?

das wär ja im anderen thread… mal sehen ob ich mir da noch was anderes einfallen lassen könnte g

Nach dem Update auf 2.5 geht das Script nicht mehr.

Fehlermeldung :

Warning: Wrong parameter type for setvalueboolean() in C:\IP-Symcon\scripts\25993.ips.php on line 57

Was soll ich da nun ändern ??

Holli

Tipp:

seit ips 2.5 sind keine strings als variablennamen mehr zugelassen.

Ich weiß … Aber ist das nicht eigentlich ein Rückschritt in IPS ??
Wie bekomme ich das skript denn wieder zum laufen …

Holli

ID einsetzen.

SetValueBoolean($new_var_id, $var_value);
:smiley:

Hallo zusammen

ich befasse mich erst seit kurzem mit IPS.

Jetzt habe ich das hier gezeigte Skript ausprobiert, bei mir kommt immer die Fehlermeldung:

Warning: Variable #11447 existiert nicht in C:\IP-Symcon\scripts\59045.ips.php on line 77

die XML-API wurde auf der CCU installiert.

Wenn ich die Abfrage über den Browser mache funktioniert es.

Besten Dank!

Hallo loetman!

Ich habe jetzt mal mein Script im ersten Beitrag aktualisiert und an IPS 2.5 angepasst.

Zeile 77 ist ja IPS_DeleteVariable($val);
… hast du in IPS schon die Systemvariablen der CCU mit dem Script angelegt bekommen?

IPS_DeleteVariable($val) wird eigentlich nur ausgeführt, wenn du die Variablen schon in IPS hast und danach in der CCU die Systemvariable löscht.

Habe jetzt versucht dies mal nachzustellen, aber ich komme einfach nicht dahinter g.

Gruß,
Christian.

Hallo Christian

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!

Gruss Loetman

Hallo,

  • hast du wie in der kurzen Anleitung oben alles gemacht?
  • hast nochmal das aktualisierte Script von mir oben neu reinkopiert?
  • Systemvariablen existieren aber in der CCU?

Installation:
1.) Kategorie erstellen
2.) das Script unterhalb der Kategorie hinzufügen - die Variable $ccu_ip anpassen
3.) ausführen lassen

kommt immer noch die Fehlermeldung

Warning: Variable #11447 existiert nicht in C:\IP-Symcon\scripts\59045.ips.php on line 77

Wenns immer die selbe ID ist, kann es sein, das dies die ID des Scripts selbst ist?
Dies sollte aber eigentlich mit der Zeile:


$vars_new[] = $_IPS['SELF'];   // um zu verhidern, dass das script später gelöscht wird

vermieden werden…

wir werden den Fehler schon einkreisen und finden denke ich g

Gruß,
Christian.

Ups! Hatte das Skript nicht in eine Kategorie getan!

Nun läuft es wunderbar!

Danke Christian

:slight_smile:

Hi,

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?

Vielen Dank für Eure Hilfe.

Darklord

Hallo darklord!

Ja, ich denke es liegt an 2.4… da es dort ja die $_IPS Variablen noch nicht gibt…

du könntest versuchen, die $_IPS[‚SELF‘] in $IPS_SELF umzuändern…

sonst hat sich ja in dem Script eigentlich nichts geändert.

Gruß,
Christian.

Hallo Christian,

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.

Gruß

Darklord

Welche Variablen ließt das Programm denn alle aus? Bei mir wird nur eine neue mit Alarmzone 1 und Anwesenheit erstellt.
Ist das OK??
Gruß Udo

Hi Udo,

eigentlich sollte das Script ALLE Variablen, die auf der CCU angelegt sind, auslesen und in IPS erstellen.

Gruß

Darklord