PhilIPS hue LED-Leuchten

Die ist leider noch ein Platzhalter und bislang ohne Funktion.
Wie gesagt, ich habe noch kein Installskript.

der Exporter von Raketenschnecke macht das ja ganz leicht , haste den mal getestet ?

Damit gehts 1A.

Bei mir liest er die Lampengruppen auch nicht ein, was muss ich da machen ?

Werde ich mit anschauen.
Was kommt denn bei Dir für ein Fehler?

also die Scene läßt sich abspeichern aber nicht aufrufen, da steht einfach nur Fehler :frowning:

Socket nicht verbunden ? Hab ich da was überlesen ,

Sieht Deine gespeicherte Szene so aus wie auf meinem Screenshot? Steht was in den Meldungen?

sieht gut aus

Schau mal bitte, ob „Szene aktivieren“ auch mit der richtigen Aktion verknüpft ist (hue_ActionCallScene) und dieses Skript auch existiert.

Ja das Script ist da , hast du den code für das anlegen der Gruppen gerade mal da , in deinem Post einige Seiten weiter vorne ist nur das ändern drin, anlegen ist nen leeres Feld im Post.

Hallo,

hier eine korrigierte Version der Scripts, in der bisherigen war noch ein Bug, deswegen lief es bei Euch nicht.

hueScripts0.3.zip (7.16 KB)

Hallo

bei Szene aktivieren , wird der Befehl ausgeführt … aber es kommt im Webfront Fehler ??

(Die Szene wird aber aktiviert)

:confused:

Hast Du die Version, die ich einen Post zuvor hochgeladen habe?

Moin ,

das Problem ist mir der neuen Version dann behoben. Lade dir die 0.3 runter .

Hallo aus Magdeburg ,

haste ne idee wie wir die Hue von der CCU2 aus steuern könnten ?

Ich denke da musst du dich an das Homematic Forum wenden.

Gesendet von meinem iPhone mit Tapatalk

Hi Michael,

wenn ich mir dieses Paket lade, dann muss ich aber trotzdem manuell diese Variablen erstellen, richtig?

Integer
hue_ActivateScene -> Bulb
Wert 0 -> Szene aktivieren -> Light Blue

hue_Hue -> Intensity
Min 0, Max 65535, Schritte 1000

hue_Temperatur -> Intensity
Min 153, Max 500, schritte 20

hue_Toggle -> Return
Wert 0 -> Szene speichern -> Lime

hue_Transition
Min 0, Max 10

Float
hue_XY
Schrittweite 0,001, Stellen 3

String
hue_colormode
hue_effect

Oder hat sich da mittlerweile nochmals was geändert?

Habe meine HUE Lampen seit gestern und würde die jetzt gerne einbinden und bin dabei auf deine Scripte gestoßen.

EDIT: Die 6 Scripte in dem Ordner importiere ich einfach in IPS? Wie geht es dann weiter? Welches muss ich ausführen?

Hallo,

nein, die Variablen und Profile musst Du noch selbst anlegen.
Ausführen musst Du die hue_query, diese solltest Du dann auch via Timer regelmäßig laufen lassen.
Config natürlich vorher anpassen!

Viele Grüße,
Michael

Und welche Profile geb ich den einzelnen Variablen? Kannst du das vielleicht mal dokumentieren? :slight_smile:

Es müssten ja insgesamt 8 Variablen sein, richtig?

Am besten wären Screenshots von den zu erstellenden Variablen inkl. Profilen.

ich mach mal mit dem Tool von Raketenschnecke nen Export, dann brauchst du nur noch ein Event anlegen das ständig den zustand deiner Lampen ermittelt…

aktueller Export,

nur noch an die hue_query nen event alle 10 sek, oder wie auch immer , das er den zustand erkennen kann .


<?
/**********************************************************************************************************************
*  this Install-Script was automated generated by RS IPS Project-Exporter                                             *
*  © by Raketenschnecke 2012-2014, mail: raketenschnecke@gmx.de                                                       *
*  // Projekt-HomePage: http://www.raketenschnecke.net/rs-projekte/rs-ips-project-exporter/                           *
**********************************************************************************************************************/

/**********************************************************************************************************************
	Project: Hue LED Steuerung (Quell-ID: 32746), generated on 23.04.2014, 11:39 Uhr
*                                                                                                                     *
*	Dieses Script beinhaltet ein automatisch in einem Script zusammengeführtes IPS-Projekt (Quell-Projekt)             *
*	Zur Installation des (Quell-) Projekts auf dem lokalen System (Zielsystem) bitte dieses Script an einer beliebigen *
*	Stelle im Objektbaum platzieren und einmalig manuell starten (Konfiguration siehe Block "Konfig" unten)            *
*  Es werden alle notwendigen Strukturen (Kategorien, Variablen, Scripte etc) aus dem Quell-Projekt im Ziel-System    *
*  angelegt.                                                                                                 			 *
*	Dies ist !!! KEINE !!! vollständige Projekt-Installation! D.h.: eine Konfiguration, Verlinkung von Objekten etc.   *
*	muss durch Scripts des eigentlichen Projekts oder manuell durch den Anwender erfolgen.                             *
*  Bei Fragen zum installierten Projekt bitte den Projektautor fragen!						                               *
*                                                                                                                     *
**********************************************************************************************************************/

###############################  Konfig ##############################################################################

// Ziel-WFC angeben
   $WFC_TargetID     			= 0; 	// bei falscher WFC-ID wird keine Installation von WFE-Komponenten vorgenommen
   $WFC_existItemoverwrite    = 1;  // 0=> bereits im Zielsystem bestehende WFC-Items werden NICHT überschrieben,
													// 1=> existierende Objekte werden überschrieben (default)

// Copy-Parameter (1: Objekte werden im Zielsystem installiert; 0: Objekte werden nicht installiert) +++++++++++++++++
	$VarProfile                = 1;	// 1: überschreibt vorhandene Profile im Zielsystem, 0: installiert nur neue Profile
	# !!! die folgende Option mit äußerster Vorsicht nutzen (Default-Wert 0)!!! #
	$existsScriptsoverwrite    = 0;	// 1: im Zielsystem existierende Scripte (=benamste Scriptfiles) werden überschrieben


############################### Main Area ############################################################################

   ##### Project Exporter Comment: Projekt-Export Hue LED Steuerung (Quell-ID: 32746) vom 23.04.2014 11:39 #####

// IPS Version detektieren
   $IPS_VERSION		= IPS_GetKernelVersion();

// Inventorys laden
	$MessageProkoll   = array();
	$Inv 					= ObjectInventory();
	$VProfInv			= VarProfileInventory();
	if(function_exists('loadFileExportInventory'))
	{
		$ExpFileInv		= loadFileExportInventory();
		if($ExpFileInv[0] != NULL)
		createExportFiles($ExpFileInv);
	}

// Parameters-Array erzeugen
   $Parameters	= array('VarProfile'=>$VarProfile, 'ScrOverwrite'=>$existsScriptsoverwrite, 'WFCItems'=>$WFC_existItemoverwrite,  'Update'=>0);

// letztes Logfile finden & Updatemodus setzen
	$lastLog_ID    = findlastLogfile();
	if($lastLog_ID > 0)
	{
		$Parameters['Update'] = 1;
		include $lastLog_ID.'.ips.php';

		// last Inventory laden
		$lastInv 	= ObjectInventoryProtocol();

		// Meldungsausgabe
		if(isset($lastInv[0]))
		{
			$MessageProkoll['Info'][] = "#1004 letztes Inventory aus Protokollfile geladen";
		}

		// Last Inventory initialisieren
		$InvData			= explode(';', substr(preg_replace("/\r|
/s", "", $lastInv[1]),0, -1));
	   $InvObjID  		= (int)explode(',', $InvData[0])[1];
	   $lastInvObj		= createlastInventoryObjects($InvObjID);

		// Meldungsausgabe
		if(IPS_ObjectExists((int)$lastInvObj[0]['newObjectID']))
		{
		   $MessageProkoll['Info'][] = "#1005 bestehendes Zielprojekt für Update gefunden: ".$lastInvObj[0]['ObjectName']." ID#".$lastInvObj[0]['newObjectID']."";
		}
		else
		{
		   $MessageProkoll['Failure'][] = "#1025 Fehler: kein bestehendes Zielprojekt gefunden";
		   exit("Scriptabbruch: kein bestehendes Zielprojekt gefunden! Nur Neu-Installation möglich,
bitte alle Child-Files unterhalb dieses Scripts löschen!");
		}
	}
	$MessageProkoll['InstallParameters']  = $Parameters;


// Funktionsaufrufe
	// Variablenprofile aus Profile-Inventory holen und Profil-Baum generieren
	$VarProfile	= createVarProfileInventory();

	// Variablenprofile anlegen (abhängig von Parameters)
	createVarProfile($VarProfile);

	// Projekt Root-Element aus Inventory generieren und anlegen
	$ObjectTree = createInventoryObjects();

	// Child-Objekte vom Root aus Inventory generieren und anlegen
	$ObjInstallTree = createObjectsTree($ObjectTree);

	// Funktion zum Verlinken aller neu instalierten Elemente
	linknewObjects($ObjInstallTree);

	// Funktion zum Installieren der WFC-Items
	installWFC_Items($WFC_TargetID);

	// Install-Script ins Config-Verzeichnis verschieben
	moveInstallScripttoConfig();

	// Installationsprotokoll erzeugen
	$InstProtocol		= createObjInventoryProtocol($ObjInstallTree);

	// Script self-renaming
			IPS_SetName($_IPS['SELF'], 'Hue LED Steuerung (Quell-ID: 32746) 2014_04_23-11_39'.', Ziel-ID: '.$ObjInstallTree[0]['newObjectID']);


	// Installationsprotokoll schreiben
	CreateProtocolFile($InstProtocol);

// ++++++++++++++ Script-Core +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


// prüft, ob Logfiles unterhalb des Export-Scripts hängen und gibt die ID des letzten Logfiles aus +++++++++++++++++
function findlastLogfile()
{
   $Childs	= IPS_GetChildrenIDs($_IPS['SELF']);
   $ScrTS   = 0;

   if(isset($Childs[0]))
   {
      $ScrTS   = 0;
      $ScrID   = 0;
      for($i=0;$i<count($Childs);$i++)
      {
         // 1. Zeile aus jedem Protokollfile auslesen und Installationsdatum ermitteln
         $script  	= IPS_GetKernelDir()."scripts\\".$Childs[$i].'.ips.php';
      	$fh			= fopen($script, "r");
      	$firstLine  = mb_strlen(fgets($fh));

			fseek($fh, $firstLine);
      	$zeile		= explode(' ', fgets($fh));

      	if(isset($zeile[4]))
      	{
      		$TS   	= strtotime($zeile[4].$zeile[5]);
			}
			else
		   {
	   		$MessageProkoll['Failure'][] = "#1024 Fehler: letztes Inventory aus Protokollfile NICHT geladen";
			   exit("Scriptabbruch: kein gültiges Protokollfile gefunden! Nur Installation möglich,
bitte alle Child-Files unterhalb dieses Scripts löschen!");
		   }

      	// Child mit größtem Timestamp ermitteln
      	if(($ScrTS < $TS))
      	{
      	   $ScrTS   = $TS;
      	   $ScrID   = $Childs[$i];
			}
         fclose($fh);
      }
   }

	// alte Logfiles löschen
   for($i=0;$i<count($Childs);$i++)
   {
      if($ScrID != $Childs[$i]) IPS_DeleteScript($Childs[$i], true);
   }
   return @$ScrID;
}


// Last Install Einzelobjekte-Array (aus Inv-Protokoll) bauen
function createlastInventoryObjects($ID)
{
	global $lastInv;

	for($a=1;$a<count($lastInv);$a++)
	{
		// Einzel-Objekt zusammenstellen
		$InvData 	= explode(';', substr(preg_replace("/\r|
/s", "", $lastInv[$a]),0, -1));
		unset($InvData[0]);  // ersten Datensatz entfernen
		$InvData    = array_slice($InvData, 0);
		for($i=0;$i<count($InvData);$i++)
		{
		   $KeyValue         = explode(',', $InvData[$i]);
			$lastInvPlain[$a][$KeyValue[0]]  = $KeyValue[1];
		}
	}
	$lastInvPlain  = array_slice($lastInvPlain, 0);

	return $lastInvPlain;
}

// Funktion installiert externe Scripte (sofern vorhanden)
function createExportFiles($Array)
{
   global 				$MessageProkoll;
	$PicList          = array('png', 'jpg', 'jpeg', 'gif');
	$Cnt  				= count($Array);
	for($i=0;$i<$Cnt;$i++)
	{

	   $File    			= explode('\\', $Array[$i]);
	   $FileName   		= trim(array_pop($File));
	   $FilePath   		= IPS_GetKernelDir().substr(str_replace($FileName, '', $Array[$i]), 0, -1);
	   $FileExtension    = str_replace(".", '', substr($FileName, -4));
	   $isPic            = in_array($FileExtension, $PicList);

		// Filecontent aus Funktion holen
		$FuncName   		= 'ExtFile_'.preg_replace('/[^a-zA-Z0-9]/', '', $Array[$i]);
		$ScrContent       = $FuncName();
		if($isPic)
		{
		   $ScrContent		= base64_decode($ScrContent);

		}
		else
		{
		   $ScrContent		= str_replace("@§@", "\\", $ScrContent);
			$ScrContent		= str_replace("\\'", "'", $ScrContent);
		}

		// Ordner anlegen, wenn nicht vorhanden
			if (!is_dir($FilePath))
			mkdir ($FilePath  , 0777, true);

		// schreiben der Content-Datei
			$file    		= $FilePath.'\\'.$FileName;

			$handle 			= fopen($file, "w");
			$result			= fwrite($handle, $ScrContent);
			if($result)
			{
			   $MessageProkoll['extFiles']['OK'][] 		= $file;
			}
			else
			{
			   $MessageProkoll['extFiles']['Failure'][]	= $file;
			}
			fclose($handle);
	}
}

// Array Variablenprofile-Inventory erstellen
function createVarProfileInventory()
{
   global $VProfInv;

   if(@$VProfInv[0] != NULL)
	{
	   for($i=0;$i<count($VProfInv);$i++)
	   {
	      $SubSet[] = explode('|', substr(preg_replace("/
/s", "", $VProfInv[$i]),0, -1));
		}

		for($p=0;$p<count($SubSet);$p++)
		{
		   $SubSet[$p][0] = substr($SubSet[$p][0], 0, -1);
		   $SubSet[$p][1] = substr(@$SubSet[$p][1], 0, -1);

		   $Profiles[$p]	= explode(';', $SubSet[$p][0]);
		   for($i=0;$i<count($Profiles[$p]);$i++)
		   {
	   		$Key  		= explode(',', $Profiles[$p][$i])[0];
				$Value  		= explode(',', $Profiles[$p][$i])[1];
				$ProfileObj[$Key] 	= $Value;
			}
			$VarProfile[$p]     = $ProfileObj;

			// Associations hinzufügen
			if(@$SubSet[$p][1] != NULL)
			{
				$AssRaw	= explode('§', $SubSet[$p][1]);
		   	for($i=0;$i<count($AssRaw);$i++)
			   {
					$AssBlock	= explode(';', $AssRaw[$i]);
					for($v=0;$v<4;$v++)
					{
					   if($AssBlock[$v] != NULL)
						{
						   $Key		= explode(',',($AssBlock[$v]))[0];
						   $Value	= explode(',',($AssBlock[$v]))[1];
						   $ValuePair[$Key]  = $Value;
						}
				   }
				   $newAssBlock[] = $ValuePair;
				   unset($ValuePair);
				}
	         $VarProfile[$p]['Associations'] = $newAssBlock;
	         unset($newAssBlock);
				unset($AssBlock[$p]);
			}
		}
		$MessageProkoll['Info'][] = "#1010 VarProfil-Array erstell";
		return $VarProfile;
	}
}

// Function Variablenprofil anlegen
function createVarProfile($VarProfile)
{
	global $Parameters;

	if(isset($VarProfile[0]))
	{
	// Profile-Array durchgehen
		for($i=0;$i<count($VarProfile);$i++)
		{
		   $Profilname = $VarProfile[$i]['ProfileName'];
		   $isSystemProfile  = strpos($Profilname, '~');
		   if(($Parameters['VarProfile'] == 1) && (IPS_VariableProfileExists($Profilname)) && ($isSystemProfile === false))
		   {
		      $MessageProkoll['Install']['OK'] = "#2011 Profil $Profilname wird gelöscht";
		      if(IPS_VariableProfileExists($Profilname)) IPS_DeleteVariableProfile($Profilname);
			}
			else
			{
			   $MessageProkoll['Install']['User'] = "#2010 bestehendes Variablen-Profil $Profilname wird nicht überschrieben (Systemprofil oder Option abgeschaltet)";
			}

			// Variablen-Profil anlegen (nur Neuanlage)
		   if((!IPS_VariableProfileExists($Profilname))&& ($isSystemProfile === false))
			{
			   IPS_CreateVariableProfile($Profilname, (int)$VarProfile[$i]['ProfileType']);
		      IPS_SetVariableProfileText($Profilname, $VarProfile[$i]['Prefix'], $VarProfile[$i]['Suffix']);
		      IPS_SetVariableProfileValues($Profilname, (float)$VarProfile[$i]['MinValue'], (float)$VarProfile[$i]['MaxValue'], (float)$VarProfile[$i]['StepSize']);
	         IPS_SetVariableProfileDigits($Profilname, (int)$VarProfile[$i]['Digits']);
				IPS_SetVariableProfileIcon($Profilname, $VarProfile[$i]['Icon']);
				$MessageProkoll['Install']['OK'] = "#2012 Profil $Profilname angelegt";

				// Associations setzen
				if(isset($VarProfile[$i]['Associations']))
				{
					$Ass = $VarProfile[$i]['Associations'];
					for($a=0;$a<count($Ass);$a++)
					{
					   // Falls Assoziation "Name und Icon" leer sind, wird Leerzeichen bei Name eingefügt (sonst Fehlermeldung
					   // bei Assoziations-Zuweisung
					   if(($Ass[$a]['Name'] == NULL) && ($Ass[$a]['Icon'] == NULL)) $Ass[$a]['Name'] = ' ';
						IPS_SetVariableProfileAssociation($Profilname, (float)$Ass[$a]['Value'], $Ass[$a]['Name'], $Ass[$a]['Icon'], (int)$Ass[$a]['Color']);
					}
					$MessageProkoll['Install']['OK'] = "#2013 Profilassociations für Profil $Profilname angelegt";
				}
			}
		}
		return;
	}
}

// Objekt-Tree generieren und Childs holen
function createInventoryObjects()
{
	global $Inv;
	global $IObjects;
   $DataSet 	= explode(';', substr(preg_replace("/\r|
/s", "", $Inv[1]),0, -1));
   $ObjID  		= (int)explode(',', $DataSet[0])[1];
   $Objects[0]	= createObject($ObjID);
   if(isset($Objects[0]['ChildrenIDs']) != NULL)
   $Objects[0]['ChildrenIDs']	= createChildObjects($Objects[0]['ChildrenIDs']);
	return $Objects;
}

// rekursive Objektanlage aller Objekte im Ziel-Projekt
function createObjectsTree($Objects)
{
//global $Objects;
	for($i=0;$i<count($Objects);$i++)
	{
		// Objekt anlegen
		$Objects[$i] = Objekteanlegen($Objects[$i]);

		// nach Childs durchsuchen
		if(isset($Objects[$i]['ChildrenIDs']))
		{
		   for($ch=0;$ch<count($Objects[$i]['ChildrenIDs']);$ch++)
		   {
		      $Objects[$i]['ChildrenIDs'][$ch]['newParentID']	= $Objects[$i]['newObjectID'];
		   }
		   // nächste Rekursion:
		   $newObjects = $Objects[$i]['ChildrenIDs'];
		   $Objects[$i]['ChildrenIDs']  = createObjectsTree($newObjects);
		}
	}
	return $Objects;
}

// Inventory rekursiv abarbeiten und Einzelobjekte zur Anlage übergeben
function createChildObjects($Childs)
{
	for($i=0;$i<count($Childs);$i++)
	{
		$Childs[$i]	= createObject($Childs[$i]);
		if(isset($Childs[$i]['ChildrenIDs']))
		{
		   $newChilds  = $Childs[$i]['ChildrenIDs'];
			$Childs[$i]['ChildrenIDs']  = createChildObjects($newChilds);
		}
	}
	return $Childs;
}


// Einzel-Objekt aus Inventory generieren
function createObject($ObjID)
{
   global $Inv;
   global $Parameters;
	global $lastInvObj;

	// Inventory nach Objekt-ID durchsuchen und Array-ID zurückgeben
   for($s=0;$s<count($Inv);$s++)
   {
      if(strstr($Inv[$s], 'ObjectID,'.$ObjID)) $Key = $s;
   }
  	$DataSet = explode(';', substr(preg_replace("/\r|
/s", "", $Inv[$Key]),0, -1));

	// Objekt Key-Value Zuordnung
   for($p=0;$p<count($DataSet);$p++)
   {
	   $Key  		= explode(',', $DataSet[$p])[0];
		$Value  		= explode(',', $DataSet[$p])[1];
		$Object[$Key]	= $Value;
	}

	// newObjectID aus lastInventory (Inst-Protokoll) ankleben, wenn Update = 1
	if($Parameters['Update'] == 1)
	{
	   for($l=0;$l<count($lastInvObj);$l++)
	   {
	      if($Object['ObjectID'] == $lastInvObj[$l]['ObjectID'])
	      $Object['newObjectID'] = @$lastInvObj[$l]['newObjectID'];
	   }
	}

	// Child-IDs ankleben
   for($i=0;$i<count($Inv);$i++)
   {
		$DataSet = explode(';', substr(preg_replace("/\r|
/s", "", $Inv[$i]),0, -1));
	   for($p=0;$p<count($DataSet);$p++)
	   {
		   $Key  		= explode(',', $DataSet[$p])[0];
			$Value  		= explode(',', $DataSet[$p])[1];
			$Subject[$Key] 	= $Value;
		}
		if(@$Subject['ParentID'] == $Object['ObjectID']) $Object['ChildrenIDs'][]  = $Subject['ObjectID'];
	}

	return $Object;
}

// +++ Function ZielProjekt-Objekte anlegen ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
function Objekteanlegen($Object)
{
	global $Parameters;
	global $MessageProkoll;
	global $IPS_VERSION;

   $MessageProkoll['Install']['OK'][] = "#3011 Objekt ".$Object['ObjectName'].", altID #".$Object['ObjectID']." zur Anlage übernommen";

	// ObjectInfo Zeilenumbruch zurückwandeln
	$Object['ObjectInfo'] = str_replace("§&§", "
", $Object['ObjectInfo']);
	$Object['ObjectInfo'] = str_replace("§&&§", ",", $Object['ObjectInfo']);
	$Object['ObjectInfo'] = str_replace("§&&&§", ";", $Object['ObjectInfo']);

   switch ($Object['ObjectType'])
	{
		case 0: // Kategorien
				if((@$Object['newObjectID'] > 0) && ($Object['isConfigTree'] == 0))
				{
            	$Cat_ID		= (int)$Object['newObjectID'];
            	// prüfen, ob Kategorie tats. noch existiert (wenn nicht: anlegen)
            	if(!IPS_ObjectExists($Cat_ID)) $Cat_ID = IPS_CreateCategory();
            	IPS_SetName($Cat_ID, $Object['ObjectName']);
					IPS_SetHidden($Cat_ID, (bool)$Object['ObjectIsHidden']);
					IPS_SetPosition($Cat_ID, (int)$Object['ObjectPosition']);
					IPS_SetInfo($Cat_ID, $Object['ObjectInfo']);
					IPS_SetIcon($Cat_ID, $Object['ObjectIcon']);
					if(isset($Cat_ID, $Object['newParentID'])) IPS_SetParent($Cat_ID, (int)$Object['newParentID']);
            	if($Cat_ID > 0)
					$MessageProkoll['Install']['OK'][] = "#3023 Kategorie-Objekt ".$Object['ObjectName'].", ID #".$Cat_ID." existiert (Update ein)";
					$MessageProkoll['Install']['OK'][] = "#3025 Kategorie-Objekt ".$Object['ObjectName'].", ID #".$Cat_ID." neu konfiguriert";
				}
				elseif((@$Object['isConfigTree'] == 0) || (@$Object['newObjectID'] == 0) || (!IPS_ObjectExists((int)$Object['newObjectID'])))
				{
					$Cat_ID		= IPS_CreateCategory();
					$Object['newObjectID']  = $Cat_ID;
					if($Cat_ID > 0)
					$MessageProkoll['Install']['OK'][] = "#3022 Kategorie-Objekt ".$Object['ObjectName'].", neuID #".$Cat_ID." angelegt";
					IPS_SetName($Cat_ID, $Object['ObjectName']);
					IPS_SetHidden($Cat_ID, (bool)$Object['ObjectIsHidden']);
					IPS_SetPosition($Cat_ID, (int)$Object['ObjectPosition']);
					IPS_SetInfo($Cat_ID, $Object['ObjectInfo']);
					IPS_SetIcon($Cat_ID, $Object['ObjectIcon']);
					if(isset($Cat_ID, $Object['newParentID'])) IPS_SetParent($Cat_ID, (int)$Object['newParentID']);
					$MessageProkoll['Install']['OK'][] = "#3025 Kategorie-Objekt ".$Object['ObjectName'].", ID #".$Cat_ID." neu konfiguriert";

					if($Cat_ID == 0)
					$MessageProkoll['Install']['Failure'][] = "#3021 Kategorie-Objekt ".$Object['ObjectName'].", , altID #".$Object['ObjectID']." Neuanlage fehlgeschlagen";
				}
				else
				{
				   $MessageProkoll['Install']['OK'][] = "#3024 Kategorie-Objekt ".$Object['ObjectName']." nicht neu konfiguriert (Objekt im Config-Bereich)";
				}
			return $Object;
		break;

		case 1:  // Instanzen
				if((@$Object['newObjectID'] > 0) && ($Object['isConfigTree'] == 0))
				{
            	$Inst_ID		= (int)$Object['newObjectID'];
            	// prüfen, ob Kategorie tats. noch existiert (wenn nicht: anlegen)
            	if(!IPS_ObjectExists($Inst_ID)) $Inst_ID = IPS_CreateInstance($Object['ModuleID']);
            	if($Inst_ID > 0)
					$MessageProkoll['Install']['OK'][] = "#3033 Kategorie-Objekt ".$Object['ObjectName'].", ID #".$Inst_ID." bereits vorhanden (Update ein)";
				}
				elseif(($Object['isConfigTree'] == 0) || (@$Object['newObjectID'] == 0) || (!IPS_ObjectExists((int)$Object['newObjectID'])))
				{
					$Inst_ID		= IPS_CreateInstance($Object['ModuleID']);
					if($Inst_ID > 0)
					$MessageProkoll['Install']['OK'][] = "#3032 Instanz-Objekt ".$Object['ObjectName'].", neuID #".$Inst_ID." angelegt";
					if($Inst_ID == 0)
					$MessageProkoll['Install']['Failure'][] = "#3031 Instanz-Objekt ".$Object['ObjectName'].", , altID #".$Object['ObjectID']." Neuanlage fehlgeschlagen";
				}
				else
				{
				   $MessageProkoll['Install']['OK'][] = "#3034 Instanz-Objekt ".$Object['ObjectName']." nicht neu konfiguriert (Objekt im Config-Bereich)";
				}

			   IPS_SetName($Inst_ID, $Object['ObjectName']);
			   if(isset($Inst_ID, $Object['newParentID'])) IPS_SetParent($Inst_ID, (int)$Object['newParentID']);
			   IPS_SetHidden($Inst_ID, (bool)$Object['ObjectIsHidden']);
			   IPS_SetPosition($Inst_ID, (int)$Object['ObjectPosition']);
				IPS_SetInfo($Inst_ID, $Object['ObjectInfo']);
				IPS_SetIcon($Inst_ID, $Object['ObjectIcon']);
			   IPS_ApplyChanges($Inst_ID);
			   $Object['newObjectID']  = $Inst_ID;

			   if($Inst_ID > 0)
				$MessageProkoll['Install']['OK'][] = "#3035 Instanz-Objekt ".$Object['ObjectName'].", neuID #".$Inst_ID." neu konfiguriert";

			return $Object;
		break;

		case 2:  // Variablen, nur anlegen, wenn sie nicht mit einer Instanz verküpft sind ($Object['ObjectIsReadOnly'] == 0)
			if((int)$Object['ObjectIsReadOnly'] == 0)
		   {
		      $ah_ID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archive Handler
				if((@$Object['newObjectID'] > 0) && ($Object['isConfigTree'] == 0))
				{
            	$Var_ID		= (int)$Object['newObjectID'];
            	// prüfen, ob Var tats. noch existiert (wenn nicht: anlegen)
            	if(!IPS_ObjectExists($Var_ID)) $Var_ID = IPS_CreateVariable((int)$Object['ValueType']);
            	if($Var_ID > 0)
					$MessageProkoll['Install']['OK'][] = "#3043 Variablen-Objekt ".$Object['ObjectName'].", ID #".$Var_ID." bereits vorhanden (Update ein)";
				}
				elseif((@$Object['isConfigTree'] == 0) || (@$Object['newObjectID'] == 0)|| (!IPS_ObjectExists((int)$Object['newObjectID'])))
				{
					$Var_ID           = IPS_CreateVariable((int)$Object['ValueType']);
					if($Var_ID > 0)
					$MessageProkoll['Install']['OK'][] = "#3042 Variablen-Objekt ".$Object['ObjectName'].", neuID #".$Var_ID." angelegt";
					if($Var_ID == 0)
					$MessageProkoll['Install']['Failure'][] = "#3041 Variablen-Objekt ".$Object['ObjectName'].", , altID #".$Object['ObjectID']." Neuanlage fehlgeschlagen";
				}
				else
				{
				   $MessageProkoll['Install']['OK'][] = "#3044 Variablen-Objekt ".$Object['ObjectName']." nicht neu konfiguriert (Objekt im Config-Bereich)";
				}
				//echo "Variablen-Konfiguration für Var ID $Var_ID startet:
";
			   IPS_SetName($Var_ID, $Object['ObjectName']);
			   if(isset($Var_ID, $Object['newParentID'])) IPS_SetParent($Var_ID, (int)$Object['newParentID']);
			   IPS_SetHidden($Var_ID, (bool)$Object['ObjectIsHidden']);
			   IPS_SetPosition($Var_ID, (int)$Object['ObjectPosition']);
				IPS_SetInfo($Var_ID, $Object['ObjectInfo']);
				IPS_SetIcon($Var_ID, $Object['ObjectIcon']);
				//if($Object['VariableCustomAction'] > 0)
				//IPS_SetVariableCustomAction($Var_ID, $Object['VariableCustomAction']);
				IPS_SetVariableCustomProfile($Var_ID, $Object['VariableCustomProfile']);
				AC_SetLoggingStatus($ah_ID, $Var_ID, (bool)$Object['LoggingStatus']);
				AC_SetAggregationType($ah_ID, $Var_ID, (int)$Object['AggregationType']);

				// Variablenwert schreiben (nur bei Neuinstallation)
				if($Parameters['Update'] = 0)
				{
					switch ((int)$Object['ValueType'])
					{
					   //  Variablenwert je nach Variablentyp schreiben (0= Boolean, 1= Integer, 2= Float; 3= String)
					   case 0:
					      SetValue($Var_ID, (bool)$Object['ValueBoolean']);
					   break;

					   case 1:
					      SetValue($Var_ID, (int)$Object['ValueInteger']);
					   break;

					   case 2:
					      SetValue($Var_ID, (float)$Object['ValueFloat']);
					   break;

						case 3:
					      SetValue($Var_ID, $Object['ValueString']);
					   break;
					}
				}

				// Ab IPS V 3.0:
				if(IPS_GetKernelVersion() > 2.9)
				{
					AC_SetGraphStatus($ah_ID, $Var_ID, (bool)$Object['GraphStatus']);
				}
            IPS_ApplyChanges($ah_ID);

			   $Object['newObjectID']  = $Var_ID;
			   if($Var_ID > 0)
					$MessageProkoll['Install']['OK'][] = "#3045 Variablen-Objekt ".$Object['ObjectName'].", neuID #".$Var_ID." neu konfiguriert";

			}
			else
			{
				$MessageProkoll['Install']['User'][] = "#3044 Variablen-Objekt ".$Object['ObjectName'].", altID #".$Object['ObjectID']." nicht angelegt (wird automatisch durch IPS-Modul angelegt)";
			}
			return $Object;
		break;

		case 3: // Scripte
		      // bei ScriptOverwrite = 0: Prüfen, ob manuell benanntes Scriptfile im System vorhanden (Scriptabbuch, wenn ja)
            if(($Parameters['Update'] == 0) && ($Parameters['ScrOverwrite'] == 0))
            {
					if(explode('.', $Object['ScriptFile'])[0] != $Object['ScriptID'])
					{
					$FileCheck  	= file_exists(IPS_GetKernelDir()."scripts\\".$Object['ScriptFile']);

	            if($FileCheck)	exit('#3058 Scriptabbruch: Script '.$Object['ScriptFile'].' bereits im Script-Ordner vorhanden,
	            												bereits installierte Zielprojekt-Objekte müssen manuell gelöscht werden');
					}
            }

			   $Scr_Name 			= $Object['ObjectName'];
			   $Scr_oldID 			= @IPS_GetScriptIDByFile($Object['ScriptFile']);
			   $ScrFunctionName	= preg_replace('/[^a-zA-Z]/', '',$Scr_Name).$Object['ObjectID'];
      		$Scr_Content      = $ScrFunctionName();
      		$Scr_Content      = stripslashes($ScrFunctionName());
      		$Scr_Content      = str_replace('§\'', "'", $Scr_Content);
      		$Scr_Content      = str_replace("@§@", "\\",$Scr_Content);

      		// Vorabcheck Script exist
      		if(isset($Object['newObjectID']) && (@$Object['newObjectID'] >0))
				{
					$ScrExist 	= true;
					$Scr_ID		= (int)$Object['newObjectID'];
					if(!IPS_ObjectExists((int)$Object['newObjectID']))
					{
						$ScrExist 	= false;
						$Scr_ID		= NULL;
			      }
				}
				else
				{
					$ScrExist = false;
				}

      		// Script-Neuanlage
			   if(($ScrExist == false))
			   {
				   $Scr_ID 				= IPS_CreateScript(0);
				   IPS_SetName($Scr_ID, $Scr_Name);

					if(isset($Scr_ID, $Object['newParentID'])) IPS_SetParent($Scr_ID, (int)$Object['newParentID']);
					$fh 											= fopen(IPS_GetKernelDir()."scripts\\".$Scr_ID.'.ips.php', 'w') or die ("can't open file");
					fwrite($fh, $Scr_Content);
					fclose($fh);
					IPS_SetScriptFile($Scr_ID, $Scr_ID.'.ips.php');
					IPS_SetHidden($Scr_ID, (bool)$Object['ObjectIsHidden']);
				   IPS_SetPosition($Scr_ID, (int)$Object['ObjectPosition']);
					IPS_SetInfo($Scr_ID, $Object['ObjectInfo']);
					IPS_SetIcon($Scr_ID, $Object['ObjectIcon']);
					$Scr_IPS_ID  = (int)explode('.',$Object['ScriptFile'])[0];
					$Object['newObjectID']  = $Scr_ID;

					//Scriptfile umbenenen, wenn anderer Name als IPS-ID vergeben
		         $ScrFilePrefix = explode('.', $Object['ScriptFile'])[0];
		         if($ScrFilePrefix != $Object['ObjectID'])
		         {
					   rename($Scr_ID.".ips.php", $Object['ScriptFile']);
						$result	= IPS_SetScriptFile($Scr_ID, $Object['ScriptFile']);
						if($result)
						$MessageProkoll['Install']['OK'][] = "#3053 Script-Objekt ".$Object['ObjectName'].", File in ".$Object['ScriptFile']." neu angelegt und umbenannt";
					}
					else
					{
		            if($Scr_ID > 0)
						$MessageProkoll['Install']['OK'][] = "#3052 Script-Objekt ".$Object['ObjectName'].", neuID #".$Scr_ID." neu angelegt";
					}
				}
				elseif(($ScrExist == true) && ($Object['isConfigTree'] != 1))
				{
				   // bei ScriptOverwrite = 0: Prüfen, ob Scriptfile im System vorhanden (Scriptabbuch, wenn ja)
	            if(($Parameters['Update'] == 1) && ($Parameters['ScrOverwrite'] == 0))
	            {
		            if(explode('.', $Object['ScriptFile'])[0] != $Object['ScriptID'])
						{
						$FileCheck  	= file_exists(IPS_GetKernelDir()."scripts\\".$Object['ScriptFile']);

		            if($FileCheck)	exit('#3059 Scriptabbruch: Script '.$Object['ScriptFile'].' bereits im Script-Ordner vorhanden,
		            												bereits installierte Zielprojekt-Objekte müssen manuell gelöscht werden');
						}
	            }

				   // Update (nur, wenn ConfigKategorie-Flag nicht gesetzt)
			      if($ScrExist)
			      {
			         // Filename mit ID oder individuell benannt
			         $ScrFilePrefix = explode('.', $Object['ScriptFile'])[0];
			         if($ScrFilePrefix == $Object['ObjectID'])
			         {
							$ScrFileName   = $Object['newObjectID'].'.ips.php';
							$ScrOverwrite  = 1;
						}
						else
						{
						   $ScrFileName   = $Object['ScriptFile'];
						   if($Parameters['ScrOverwrite'] == 1) {$ScrOverwrite  = 1;}else{$ScrOverwrite  = 0;}
						}
					}
					else
					{
					   $ScrFileName   = $Object['ScriptFile'];
					   $ScrOverwrite  = 1;
					}

					// Script-File löschen (wenn  vorhanden und ScriptOverwrite = 1) und neu schreiben
					$scrReturn = 0;
					if($ScrExist && $ScrOverwrite)
					{
				      unlink(IPS_GetKernelDir()."scripts\\".$ScrFileName);
						$fh 											= fopen(IPS_GetKernelDir()."scripts\\".$ScrFileName, 'w') or die ("can't open file");
						$MessageProkoll['Install']['OK'][]	= "#3055 Script-File ".$Object['ObjectName'].", ".$ScrFileName.", gelöscht";
						$scrReturn									= fwrite($fh, $Scr_Content);
						fclose($fh);
	               IPS_SetHidden($Scr_ID, (bool)$Object['ObjectIsHidden']);
					   IPS_SetPosition($Scr_ID, (int)$Object['ObjectPosition']);
						IPS_SetInfo($Scr_ID, $Object['ObjectInfo']);
						IPS_SetIcon($Scr_ID, $Object['ObjectIcon']);
					}

					// Meldungen für Inst-Protokoll
					if($scrReturn)
					{
						$MessageProkoll['Install']['OK'][] = "#3051 Script-File ".$Object['ObjectName'].", neu geschrieben";
					}
					elseif($ScrOverwrite == 0)
					{
					   $MessageProkoll['Install']['OK'][] = "#3054 Script-File ".$Object['ObjectName'].', nicht überschrieben (Option $existsScriptsoverwrite deaktiviert)';
					}
					else
					{
						$MessageProkoll['Install']['Failure'][] = "#3055 Script-File ".$Object['ObjectName'].", neu schreiben fehlgeschlagen";
					}
				}
			return $Object;
		break;

		case 4: // Events
			   $Evnt_Name 			= $Object['ObjectName'];

		      if((@$Object['newObjectID'] > 0) && ($Object['isConfigTree'] == 0))
				{
            	$Evnt_ID		= (int)$Object['newObjectID'];
            	// prüfen, ob Var tats. noch existiert (wenn nicht: anlegen)
            	if(!IPS_ObjectExists($Evnt_ID)) $Evnt_ID = IPS_CreateEvent((int)$Object['EventType']);
            	if($Evnt_ID > 0)
					$MessageProkoll['Install']['OK'][] = "#3063 Event-Objekt ".$Object['ObjectName'].", ID #".$Evnt_ID." bereits vorhanden (Update ein)";
				}
				elseif((@$Object['isConfigTree'] == 0) || (@$Object['newObjectID'] == 0)|| (!IPS_ObjectExists((int)$Object['newObjectID'])))
				{
					$Evnt_ID = IPS_CreateEvent((int)$Object['EventType']);
					if($Evnt_ID > 0)
					$MessageProkoll['Install']['OK'][] = "#3062 Event-Objekt ".$Object['ObjectName'].", neuID #".$Evnt_ID." angelegt";
					if($Evnt_ID == 0)
					$MessageProkoll['Install']['Failure'][] = "#3061 Event-Objekt ".$Object['ObjectName'].", , altID #".$Object['ObjectID']." Neuanlage fehlgeschlagen";
				}
				else
				{
				   $MessageProkoll['Install']['OK'][] = "#3064 Event-Objekt ".$Object['ObjectName']." nicht neu konfiguriert (Objekt im Config-Bereich)";
				}
		      if(isset($Evnt_ID, $Object['newParentID'])) IPS_SetParent($Evnt_ID, (int)$Object['newParentID']);
		      IPS_SetName($Evnt_ID, $Evnt_Name);
		      IPS_SetPosition($Evnt_ID, (int)$Object['ObjectPosition']);
		      IPS_SetHidden($Evnt_ID, (bool)$Object['ObjectIsHidden']);
			   IPS_SetPosition($Evnt_ID, (int)$Object['ObjectPosition']);
				IPS_SetInfo($Evnt_ID, $Object['ObjectInfo']);
				IPS_SetIcon($Evnt_ID, $Object['ObjectIcon']);
				IPS_SetEventLimit($Evnt_ID, (int)$Object['EventLimit']);

				// getriggertes Element
				if((int)$Object['EventType'] == 0)
				{
					//!!! (int)$Oject['TriggerVariableID'] Auslöser ID derzeit nur ParentObject, da newTarget noch nicht bekannt.
					// Konfiguration von IPS_SetEventTrigger wird erst mit Neuverlinkung abgeschlossen !!
				   @IPS_SetEventTrigger($Evnt_ID, (int)$Object['TriggerType'], 0);
				   if((int)$Object['TriggerType'] == 4)
					IPS_SetEventTriggerValue($Evnt_ID, $Object['TriggerValue']);
					IPS_SetEventTriggerSubsequentExecution($Evnt_ID, (bool)$Object['TriggerSubsequentExecution']);
					IPS_SetEventActive($Evnt_ID, true);  // Ereignis nach Installation immer aktiv
					$MessageProkoll['Install']['OK'][] = "#3065 Event-Objekt ".$Object['ObjectName'].", neuID #".$Evnt_ID." neu konfiguriert und aktiviert";
				}
				else
				{
					// zyklisches Element
					IPS_SetEventCyclic($Evnt_ID, (int)$Object['CyclicDateType'], (int)$Object['CyclicDateValue'], (int)$Object['CyclicDateDay'], (int)$Object['CyclicDateDayValue'], (int)$Object['CyclicTimeType'], (int)$Object['CyclicTimeValue']);

					// Prüfung IPS-Version (ab 3.1 wurden die SetEventCyclic-Befehle geändert)
					if($IPS_VERSION < 3.1)
					{
					   // Wenn Zielsystem-Version < 3.1 ist
						IPS_SetEventCyclicDateBounds($Evnt_ID, (float)$Object['CyclicDateFrom'], (float)$Object['CyclicDateTo']);
						//if((int)$Object['CyclicTimeType'] == 1)
						IPS_SetEventCyclicTimeBounds($Evnt_ID, (float)$Object['CyclicTimeFrom'], (float)$Object['CyclicTimeTo']);
					}
					else
					{
					   // Wenn Zielsystem >= 3.1 ist
					   if($Object['CyclicDateFrom'] > 0)
					   {
					   	IPS_SetEventCyclicDateFrom($Evnt_ID, (int)date("d", $Object['CyclicDateFrom']), (int)date("m", $Object['CyclicDateFrom']), (int)date("Y", $Object['CyclicDateFrom']));
					 	}
					 	else
					 	{
					 	   IPS_SetEventCyclicDateFrom($Evnt_ID, 0, 0, 0);
					 	}

					 	if($Object['CyclicDateTo'] > 0)
					 	{
							IPS_SetEventCyclicDateTo($Evnt_ID, (int)date("d", $Object['CyclicDateTo']), (int)date("m", $Object['CyclicDateTo']), (int)date("Y", $Object['CyclicDateTo']));
						}
						else
						{
						   IPS_SetEventCyclicDateTo($Evnt_ID, 0, 0, 0);
						}
						IPS_SetEventCyclicTimeFrom($Evnt_ID, (int)date("H", $Object['CyclicTimeFrom']), (int)date("i", $Object['CyclicTimeFrom']), (int)date("s", $Object['CyclicTimeFrom']));
						IPS_SetEventCyclicTimeTo($Evnt_ID, (int)date("H", $Object['CyclicTimeTo']), (int)date("i", $Object['CyclicTimeTo']), (int)date("s", $Object['CyclicTimeTo']));
					}

					IPS_SetEventActive($Evnt_ID, false);  // Ereignis nach Installation immer inaktiv
					$MessageProkoll['Install']['User'][] = "#3066 Event-Objekt ".$Object['ObjectName'].", neuID #".$Evnt_ID." neu konfiguriert, NICHT aktiviert";
				}

				// PHP-Code einschleusen, wenn vorhanden
				$FuncName   = 'Event'.$Object['ObjectID'];
				if(function_exists($FuncName))
				{
					$FuncContent 					= $FuncName();
					IPS_SetEventScript($Evnt_ID, $FuncContent);
					$MessageProkoll['Install']['OK'][] = "#3067 Event-Objekt ".$Object['ObjectName'].", neuID #".$Evnt_ID." PHP-Code eingebaut";
				}
			   $Object['newObjectID']  = $Evnt_ID;
         return $Object;
		break;

		case 5: // Media-Objekte
			   $MessageProkoll['Install']['Failure'][] = "#3061 Media-Objekt ".$Object['ObjectName'].", altID #".$Object['ObjectID']." nicht angelegt (Option nicht implementiert)";
			   return 0;

			//return $Object;
		break;

		case 6: // Links

		      $Lnk_Name 			= $Object['ObjectName'];
		      if((@$Object['newObjectID'] > 0) && ($Object['isConfigTree'] == 0))
				{
            	$Lnk_ID		= (int)$Object['newObjectID'];
               // prüfen, ob Lnk tats. noch existiert (wenn nicht: anlegen)
            	if(!IPS_ObjectExists($Lnk_ID)) $Lnk_ID = IPS_CreateLink();
            	if($Lnk_ID > 0)
					$MessageProkoll['Install']['OK'][] = "#3063 Link-Objekt ".$Object['ObjectName'].", ID #".$Lnk_ID." bereits vorhanden (Update ein)";
				}
				elseif((@$Object['isConfigTree'] == 0) || (@$Object['newObjectID'] == 0)|| (!IPS_ObjectExists((int)$Object['newObjectID'])))
				{
					$Lnk_ID = IPS_CreateLink();
					if($Lnk_ID > 0)
					$MessageProkoll['Install']['OK'][] = "#3072 Link-Objekt ".$Object['ObjectName'].", neuID #".$Lnk_ID." angelegt";
					if($Lnk_ID == 0)
					$MessageProkoll['Install']['Failure'][] = "#3071 Link-Objekt ".$Object['ObjectName'].", , altID #".$Object['ObjectID']." Neuanlage fehlgeschlagen";
				}
				else
				{
				   $MessageProkoll['Install']['OK'][] = "#3074 Link-Objekt ".$Object['ObjectName']." nicht neu konfiguriert (Objekt im Config-Bereich)";
				}
		      if(isset($Object['newParentID'])) IPS_SetParent($Lnk_ID, (int)$Object['newParentID']);
		      IPS_SetName($Lnk_ID, $Lnk_Name);
		      IPS_SetPosition($Lnk_ID, (int)$Object['ObjectPosition']);
		      IPS_SetHidden($Lnk_ID, (bool)$Object['ObjectIsHidden']);
			   IPS_SetPosition($Lnk_ID, (int)$Object['ObjectPosition']);
				IPS_SetInfo($Lnk_ID, $Object['ObjectInfo']);
				IPS_SetIcon($Lnk_ID, $Object['ObjectIcon']);

		      //IPS_SetLinkChildID($LinkID, 12345 /*[Objekt #12345 existiert nicht]*/);
		      //IPS_SetLinkTargetID($LinkID, 12345 /*[Objekt #12345 existiert nicht]*/);

			   $MessageProkoll['Install']['OK'][] = "#3071 Link-Objekt ".$Object['ObjectName'].", neuID #".$Lnk_ID." neu konfiguriert";
            $Object['newObjectID']  = $Lnk_ID;
			return $Object;

		break;
	}
}

// nachträgliche Verlinkung aller neu installierten Objekte
function linknewObjects($ObjLinkTree)
{
   global $ObjInstallTree;
   global $newTgtID;
   global $newObjID;
   global $MessageProkoll;

   for($i=0;$i<count($ObjLinkTree);$i++)
   {
      $newObjID		= 0;
      $newTgtID		= 0;
      // Inventory nach Variablen-, Script-, Event- und Link-Objekten durchsuchen und neue Target-ID finden
      // 2= Variable, 3= Script, 4= Event, 6 = Link
      if(($ObjLinkTree[$i]['ObjectType'] == 2) && ($ObjLinkTree[$i]['VariableCustomAction'] >0))    // Scripts nach austauschbaren IDs durchsuchen
		{
         // neue Target-ID (Action-Script) für Variable finden
			$newTargetID = findNewTargetID($ObjInstallTree, $ObjLinkTree[$i]['VariableCustomAction']);
         IPS_SetVariableCustomAction((int)$ObjLinkTree[$i]['newObjectID'], (int)$newTargetID);
         if($newTargetID >0)
			$MessageProkoll['Link']['OK'][] = "#4011 Variablen-Objekt ".$ObjLinkTree[$i]['ObjectName'].", ID #".$ObjLinkTree[$i]['newObjectID'].", neues Actionscript ID $newTargetID zugewiesen";
         if($newTargetID == 0)
			$MessageProkoll['Link']['Failure'][] = "#4010 Variablen-Objekt ".$ObjLinkTree[$i]['ObjectName'].", ID #".$ObjLinkTree[$i]['newObjectID'].", kein neues Actionscript zugewiesen (keine ID gefunden)";

	   }
      elseif($ObjLinkTree[$i]['ObjectType'] == 3)     // Scripts nach austauschbaren IDs durchsuchen
		{
         // aktuellen Scriptnamen finden
         $newObjID = 0;
			$Scr  = IPS_GetScript((int)$ObjLinkTree[$i]['newObjectID'])['ScriptFile'];
         changeObjectIDs_inScript($ObjInstallTree, $Scr);
			$MessageProkoll['Link']['OK'][] = "#4021 Script-Objekt ".$ObjLinkTree[$i]['ObjectName'].", ID #".$ObjLinkTree[$i]['newObjectID'].", durchsuche Script nach ID's";
	   }
      elseif(($ObjLinkTree[$i]['ObjectType'] == 4) && ($ObjLinkTree[$i]['EventType'] == 0))    // Neuverlinkung nur für nichtzyklische Events
		{
		   $newTgtID   =0;
			$newTargetID = findNewTargetID($ObjInstallTree, $ObjLinkTree[$i]['TriggerVariableID']);

			// neue Verlinkung setzen
			if($newTgtID !=0)
			{
				IPS_SetEventTrigger((int)$ObjLinkTree[$i]['newObjectID'], (int)$ObjLinkTree[$i]['TriggerType'], $newTgtID);
				$MessageProkoll['Link']['OK'][] = "#4031 Event-Objekt ".$ObjLinkTree[$i]['ObjectName'].", ID #".$ObjLinkTree[$i]['newObjectID'].", neu verlinkt - Ziel-ID #$newTgtID";
		   }
		   else
		   {
		   	$MessageProkoll['Link']['User'][] = "#4030 Event-Objekt ".$ObjLinkTree[$i]['ObjectName'].", neue ID #".$ObjLinkTree[$i]['newObjectID'].", NICHT verlinkt, keine gültige TargetID oder kein Target innerhalb des Zielprojektes gefunden";
		   }
	   }
      elseif($ObjLinkTree[$i]['ObjectType'] == 6)
		{
		   $newTgtID   =0;
			$newTgtID = findNewTargetID($ObjInstallTree, $ObjLinkTree[$i]['LinkChildID']);
			if($newTgtID !=0)
			{
				IPS_SetLinkTargetID((int)$ObjLinkTree[$i]['newObjectID'], (int)$newTgtID);
				$MessageProkoll['Link']['OK'][] = "#4041 Link-Objekt ".$ObjLinkTree[$i]['ObjectName'].", ID #".$ObjLinkTree[$i]['newObjectID'].", neu verlinkt (Ziel-ID $newTgtID)";
			}
			else
			{
				$MessageProkoll['Link']['User'][] = "#4040 Link-Objekt ".$ObjLinkTree[$i]['ObjectName'].", ID #".$ObjLinkTree[$i]['newObjectID'].", NICHT verlinkt, kein Target innerhalb des Zielprojektes gefunden";
			}
	   }

	   // Objekt-Childs durchsuchen
	   if(isset($ObjLinkTree[$i]['ChildrenIDs']))
	   {
	      $newLnkTree = $ObjLinkTree[$i]['ChildrenIDs'];
         linknewObjects($newLnkTree);
	   }
   }
   unset($ObjLinkTree);
}

// sucht neue Target-ID für verlinkte Objekte
function findNewTargetID($ObjLinkTree, $oldTargetID)
{
   global $newTgtID;
   for($i=0;$i<count($ObjLinkTree);$i++)
   {
      if($ObjLinkTree[$i]['ObjectID'] == $oldTargetID)
      {
      	$newTgtID   = $ObjLinkTree[$i]['newObjectID'];
			$i = 9999;  // Abbruch, wenn ID gefunden
      }
		// in Childs suchen (rekursiv)
      if((isset($ObjLinkTree[$i]['ChildrenIDs'])) && ($newTgtID == 0))
      {
			$newObjInstTree   = $ObjLinkTree[$i]['ChildrenIDs'];
         findNewTargetID($newObjInstTree, $oldTargetID);
         unset($newObjInstTree);
      }
   }
   return $newTgtID;
}

// Austausch der Objekt-IDs im Script
function changeObjectIDs_inScript($ObjLinkTree, $Scr)
{
   global $newObjID;
   global $MessageProkoll;

   $ScrContent = file(IPS_GetKernelDir()."scripts\\".$Scr);
	$file 		= fopen(IPS_GetKernelDir()."scripts\\".$Scr, "w");
	$search 		= '/[^0-9\/\{-]([1-5][0-9]{4})[^0-9]/'; // suche 5stellige Zahlen von 10.000 - 59.999
	$counter    = 0;

	foreach ($ScrContent as $z)
	{
	   $newObjID = NULL;
	   $newObjectID = NULL;
		preg_match($search, $z, $matches);
		if(isset($matches[1]))
		{
		   $oldID   		= $matches[1];
			$newObjectID   = findNewObjectID($ObjLinkTree, $oldID);
			if(($matches[1] == $oldID) && ($newObjectID >0))
			{
			   $z = str_replace($oldID, $newObjectID, $z);
			   $MessageProkoll['Script']['OK'][] = "#5011 Script ID#$Scr: Inhalt verändert: Zeile ".($counter + 1).", alte Target-ID #$oldID gegen neue ID #$newObjectID getauscht";
			}
			else
			{
			   $MessageProkoll['Script']['User'][] = "#5010 Script ID#$Scr: Inhalt NICHT verändert: Zeile ".($counter + 1).", alte Target-ID #$oldID nicht innerhalb des Projektes";
			}
		}
		fwrite($file, $z);
		$counter ++;
	}
	unset($ScrContent);
	unset($ObjLinkTree);
	fclose($file);
	return;
}

// sucht neue Object-ID für Script-Variablen
function findNewObjectID($ObjTree, $oldObjID)
{
   global $newObjID;
   for($i=0;$i<count($ObjTree);$i++)
   {
      if($ObjTree[$i]['ObjectID'] == $oldObjID)
      {
      	$newObjID   = $ObjTree[$i]['newObjectID'];
			$i = 9999;  // Abbruch, wenn ID gefunden
      }

	   // in Childs suchen (rekursiv)
	   if(isset($ObjTree[$i]['ChildrenIDs']))
	   {
			$newObjTree   = $ObjTree[$i]['ChildrenIDs'];
	      findNewObjectID($newObjTree, $oldObjID);
	      unset($newObjTree);
	   }
   }
   unset($ObjTree);
   return $newObjID;
}


############################## WFE-Items installieren ####################################################

function installWFC_Items($WFC_TargetID)
{
	global $ObjInstallTree;
	global $newObjID;
	global $WFC_existItemoverwrite;
	global $MessageProkoll;
	$MessageProkoll['WFC']['OK'][] = "#6001 lade WFC-Objektbaum";

	// Objektbaum Ziel-ID (Root-ID des Projekts)
	$ZielID                 = $ObjInstallTree[0]['newObjectID'];

	// Inventory des Ziel-WFC laden
	if(@WFC_GetItems($WFC_TargetID))
	$WFC_Target_Inventory   = WFC_GetItems($WFC_TargetID);

	// Inventory des Quell-Projektes laden
	$WFC_Raw		= loadWFCInventory();

	if(isset($WFC_Target_Inventory[0]) && ($WFC_Raw[0] != NULL))
	{
		// Quell-Inventory durchgehen und Items installieren
		$MessageProkoll['WFC']['OK'][] = "#6002 durchsuche QuellWFC-Objektbaum";
		$Cnt  		= count($WFC_Raw);

		for($i=0;$i<$Cnt;$i++)
		{
			// Inventory-String letzte 2 Zeichen abschneiden
				$str  = substr($WFC_Raw[$i], 0, -2);

			// Item-Zeilen in Key|Value-Sätze zerlegen (1.Stufe)
				$WFC_DataSet = explode(';', $str);

			// Key|Value-Sätze in Key und Value zerlegen (2. Stufe)
				for($e=0;$e<count($WFC_DataSet);$e++)
				{
				   $WFC_Values[$e]     = explode('|', $WFC_DataSet[$e]);
				}

			// Suche für alte TargetIDs neue Target-ID und tausche diese aus (nur Objekte mir Target-ID im Objektbaum)
			   $newTargetID   		= NULL;
			   unset						  ($matches);
            $search 					= '/[1-5]\d\d\d\d/'; // suche 5stellige Zahlen von 10.000 - 59.999
            if($WFC_Values[1][1] == 'Category' || $WFC_Values[1][1] == 'InfoWidget' || $WFC_Values[1][1] == 'Graph' || $WFC_Values[1][1] == 'ContentChanger')
				{
	            preg_match($search, $WFC_Values[2][1], $matches);
					if(isset($matches[0])) $oldTargetID   = $matches[0];
					if(isset($matches[0])) $newTargetID	  = findNewObjectID($ObjInstallTree, $matches[0]);
					if($newTargetID != NULL)
					{
						$WFC_Values[2][1] 	= str_replace($oldTargetID, $newTargetID, $WFC_Values[2][1]);
						$MessageProkoll['WFC']['OK'][] = "#6011 WFC altTargetID #$oldTargetID gegen newTargetID #$newTargetID getauscht";
					}
					else
					{
					   $MessageProkoll['WFC']['User'][] = "#6012 WFC Item ".$WFC_Values[1][1].", ".$WFC_Values[3][1]." keine neue TargetID gefunden";
					}
				}
				unset($newObjID);

			// Namen für neues WFC-Item ändern (Präfix "Cpy" hinzufügen)
				if(strpos($WFC_Values[2][1], 'roottp') == 0)
				{
				   $StartPos         = strpos($WFC_Values[2][1], '"name":')+8;
				   $EndPos           = strpos($WFC_Values[2][1], '","', $StartPos);
				   $OldItemName      = substr($WFC_Values[2][1], $StartPos, $EndPos - $StartPos);
				   $NewItemName      = substr($WFC_Values[2][1], $StartPos, $EndPos - $StartPos).'_ScrID'.$ZielID;
					$WFC_Values[2][1] = str_replace($OldItemName, $NewItemName, $WFC_Values[2][1]);
				}

			// Namen für ID (Item) ändern
				if($WFC_Values[3][1] != 'roottp')
				$WFC_Values[3][1] = str_replace($WFC_Values[3][1], $WFC_Values[3][1].'_ScrID'.$ZielID, $WFC_Values[3][1]);

			// Namen für ParentID (Item) ändern
				if($WFC_Values[4][1] != 'roottp')
				$WFC_Values[4][1] = str_replace($WFC_Values[4][1], $WFC_Values[4][1].'_ScrID'.$ZielID, $WFC_Values[4][1]);

			// Root-Item aus Quell-Projekt definieren (wird bei Updates nicht gelöscht)
				if($i == 0) $WFC_RootItem  = $WFC_Values[3][1];

			// Ziel-Inventory nach vorhandenen Elementen durchsuchen
				$Item_exist = 0;
				foreach($WFC_Target_Inventory as $value)
				{
				   // wenn WFE-Objekt gefunden (aktuelle Syntax 'ItemName_ScrID12345' bzw. alte Syntax 'CpyItemName')
					if(($value['ID'] == $WFC_Values[3][1]) || ($value['ID'] == 'Cpy'.substr($WFC_Values[3][1], 0, -11)))
					{
					   // wenn Überschreib-Option abgeschaltet und WFE Objekt nicht alter Syntax ('CpyItemName') entspricht
						if(($WFC_existItemoverwrite == 0) && ($value['ID'] != 'Cpy'.substr($WFC_Values[3][1], 0, -11)))
						{
							$Item_exist = 1;
							$MessageProkoll['WFC']['User'][] = "#6020 WFC-Item ".$WFC_Values[3][1]." nicht gelöscht (Option abgeschaltet)";
							break;
						}
						elseif(($WFC_Values[3][1] != $WFC_RootItem) && ($value['ID'] != 'Cpy'.substr($WFC_Values[3][1], 0, -11)))
						{
						   WFC_DeleteItem($WFC_TargetID, $WFC_Values[3][1]); // vorhandenes Item (neue Syntax) löschen
						   $MessageProkoll['WFC']['OK'][] = "#6021 WFC-Item ".$WFC_Values[3][1]." gelöscht (Option eingeschaltet)";
						}
						elseif($value['ID'] == 'Cpy'.substr($WFC_Values[3][1], 0, -11))
						{
						   WFC_DeleteItem($WFC_TargetID, 'Cpy'.substr($WFC_Values[3][1], 0, -11)); // vorhandenes Item (alte Syntax) löschen
						   $MessageProkoll['WFC']['OK'][] = "#6022 WFC-Item ".$WFC_Values[3][1]." veraltetes WFE-Objekt ('CpyItemname') gelöscht";
						}

						if($WFC_Values[3][1] == $WFC_RootItem)
						{
						   // wenn Root-Item veraltete Syntax hat
						   $Item_exist = 1;
						}
					}
				}

			// Wenn Item im Ziel-WFC nicht vorhanden, dann installieren
				if($Item_exist == 0)
				{
					if($WFC_Values[3][1] != 'roottp')
					WFC_AddItem($WFC_TargetID, $WFC_Values[3][1], $WFC_Values[1][1], $WFC_Values[2][1], $WFC_Values[4][1]);
					WFC_UpdatePosition($WFC_TargetID, $WFC_Values[3][1], (int)$WFC_Values[5][1]);
					WFC_UpdateVisibility($WFC_TargetID, $WFC_Values[3][1], (bool)$WFC_Values[6][1]);
					$MessageProkoll['WFC']['OK'][] = "#6031 WFC-Item ".$WFC_Values[3][1]." installiert";
				}
				else
				{
				   $MessageProkoll['WFC']['OK'][] = "#6030 WFC-Item ".$WFC_Values[3][1]." nicht installiert, da bereits vorhanden";
				}

			unset($WFC_Values);
			unset($WFC_DataSet);
		}
		IPS_ApplyChanges($WFC_TargetID);
	}
	else
	{
	   $MessageProkoll['WFC']['User'][] = "#6000 WFCObjektbaum: keine Installation möglich (kein Quell-Inventory oder kein Ziel-WFE gefunden)";
	}
}


// Install-Script ins Projekt-Config Verzeichnis verschieben
function moveInstallScripttoConfig()
{
	global $ObjInstallTree;
	global $MessageProkoll;

	$RootID     = (int)$ObjInstallTree[0]['newObjectID'];
	$search     = 'Config';
	$SrchResult = searchConfigDir($ObjInstallTree);
	if($SrchResult > 0)
	{
		IPS_SetParent($_IPS['SELF'], $SrchResult);
		$MessageProkoll['Info'][] = "#1011 Install-Script: Install-Script und -Protokoll in Config-Ordner verschoben";
	}
	else
	{
		$MessageProkoll['Info'][] = "#1010 Install-Script: Install-Script und -Protokoll NICHT verschoben (kein Config-Ordner im Zielprojekt gefunden)";
	}
	return;
}

// Funktion zum rekursiven Durchsuchen des Obj-Inventorys nach Config-Dir
function searchConfigDir($Array)
{
	global $SrchResult;
	$search	= 'Config';
   $Cnt     = count($Array);
   for($i=0;$i<$Cnt;$i++)
   {
      if($Array[$i]['ObjectName'] == $search)
      {
      	$SrchResult	= (int)$Array[$i]['newObjectID'];
		}

		if((isset($Array[0]['ChildrenIDs'])) && (!isset($SrchResult)))
		{
	      $newArray = $Array[0]['ChildrenIDs'];
	      searchConfigDir($newArray);
		}
   }
	unset($Array);
	unset($newArray);
	return $SrchResult;
}

// Protokoll ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
function InstallProtocoll()
{
global $MessageProkoll;

// +++ Installations-Parameter +++++++++++++++++++++++++
	$ps   ='// +++ Installationsprotokoll vom '.date("d.m.Y, H:i:s", time()).' ++++++++++++++++++++++++++++++++++++++++++++'."

";
	$ps   .="/** +++++++++++++++++ Installationsparameter +++++++++++++++++++++++++++++++++++++++++++++++++++++++
";
	$ps   .="	Update: 									".$MessageProkoll['InstallParameters']['Update']."
";
	$ps   .="	Variablenprofile installieren: 	".$MessageProkoll['InstallParameters']['VarProfile']."
";
	$ps   .="	benamste Scripte überschreiben:	".$MessageProkoll['InstallParameters']['ScrOverwrite']."
";
	$ps   .="	WFC-Items überschreiben:			".$MessageProkoll['InstallParameters']['WFCItems']."
";
	$ps   .="+++++++++++++++++++++ Installationsparameter Ende ++++++++++++++++++++++++++++++++++++++++++++++++++

";

// +++ Infos ++++++++++++++++++++++++++++++++++++++
	$ps   .="+++++++++++++++++++++ Installations-Infos ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
";
	for($i=0;$i<count(@$MessageProkoll['Info']);$i++)
	{
		$ps   .="   ".@$MessageProkoll['Info'][$i]."
";
	}
	$ps   .="+++++++++++++++++++++ Installations-Infos Ende +++++++++++++++++++++++++++++++++++++++++++++++++++++

";

// +++ Installation ++++++++++++++++++++++++++++++++++++++
	$ps   .="++++++++++++++++++++ Objekt-Installation +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
";
	$ps   .="		--- OK-Meldungen --------------------------------------------------------------------------
";
	for($i=0;$i<count(@$MessageProkoll['Install']['OK']);$i++)
	{
		$ps   .="   	".@$MessageProkoll['Install']['OK'][$i]."
";
	}
	$ps   .="		--- OK-Meldungen Ende ---------------------------------------------------------------------

";

	$ps   .="		--- Kontrolle durch User erforderlich -----------------------------------------------------
";
	for($i=0;$i<count(@$MessageProkoll['Install']['User']);$i++)
	{
		$ps   .="   	".@$MessageProkoll['Install']['User'][$i]."
";
	}
	$ps   .="		--- Kontrolle durch User erforderlich Ende-------------------------------------------------

";

	$ps   .="		--- Fehlermeldungen -----------------------------------------------------------------------
";
	for($i=0;$i<count(@$MessageProkoll['Install']['Failure']);$i++)
	{
		$ps   .="   	".@$MessageProkoll['Install']['Failure'][$i]."
";
	}
	$ps   .="		--- Fehlermeldungen Ende-------------------------------------------------------------------

";

// +++ WFC-Objekte installieren und verlinken ++++++++++++++++++++++++++++++++++++++
	$ps   .="	+++++++++++++++++ WFC-Objekte installieren und verlinken ++++++++++++++++++++++++++++++++++++++++
";
	$ps   .="		--- OK-Meldungen --------------------------------------------------------------------------
";
	for($i=0;$i<count(@$MessageProkoll['WFC']['OK']);$i++)
	{
		$ps   .="   	".@$MessageProkoll['WFC']['OK'][$i]."
";
	}
	$ps   .="		--- OK-Meldungen Ende ---------------------------------------------------------------------

";

	$ps   .="		--- Kontrolle durch User erforderlich -----------------------------------------------------
";
	for($i=0;$i<count(@$MessageProkoll['WFC']['User']);$i++)
	{
		$ps   .="   	".@$MessageProkoll['WFC']['User'][$i]."
";
	}
	$ps   .="		--- Kontrolle durch User erforderlich Ende-------------------------------------------------

";

	$ps   .="		--- Fehlermeldungen -----------------------------------------------------------------------
";
	for($i=0;$i<count(@$MessageProkoll['WFC']['Failure']);$i++)
	{
		$ps   .="   	".@$MessageProkoll['WFC']['Failure'][$i]."
";
	}
	$ps   .="		--- Fehlermeldungen Ende-------------------------------------------------------------------

";

// +++ Scripte nachbearbeiten ++++++++++++++++++++++++++++++++++++++
	$ps   .="	+++++++++++++++++ ID Austausch in Scripts ++++++++++++++++++++++++++++++++++++++++++++++++++++++
";
	$ps   .="		--- OK-Meldungen --------------------------------------------------------------------------
";
	for($i=0;$i<count(@$MessageProkoll['Script']['OK']);$i++)
	{
		$ps   .="   	".@$MessageProkoll['Script']['OK'][$i]."
";
	}
	$ps   .="		--- OK-Meldungen Ende ---------------------------------------------------------------------

";

	$ps   .="		--- Kontrolle durch User erforderlich -----------------------------------------------------
";
	for($i=0;$i<count(@$MessageProkoll['Script']['User']);$i++)
	{
		$ps   .="   	".@$MessageProkoll['Script']['User'][$i]."
";
	}
	$ps   .="		--- Kontrolle durch User erforderlich Ende-------------------------------------------------

";

	$ps   .="		--- Fehlermeldungen -----------------------------------------------------------------------
";
	for($i=0;$i<count(@$MessageProkoll['Script']['Failure']);$i++)
	{
		$ps   .="   	".@$MessageProkoll['Script']['Failure'][$i]."
";
	}
	$ps   .="		--- Fehlermeldungen Ende-------------------------------------------------------------------

";

// +++ Objekte neu verlinken ++++++++++++++++++++++++++++++++++++++
	$ps   .="	+++++++++++++++++ Objekte neu verlinken ++++++++++++++++++++++++++++++++++++++++++++++++++++++
";
	$ps   .="		--- OK-Meldungen --------------------------------------------------------------------------
";
	for($i=0;$i<count(@$MessageProkoll['Link']['OK']);$i++)
	{
		$ps   .="   	".@$MessageProkoll['Link']['OK'][$i]."
";
	}
	$ps   .="		--- OK-Meldungen Ende ---------------------------------------------------------------------

";

	$ps   .="		--- Kontrolle durch User erforderlich -----------------------------------------------------
";
	for($i=0;$i<count(@$MessageProkoll['Link']['User']);$i++)
	{
		$ps   .="   	".@$MessageProkoll['Link']['User'][$i]."
";
	}
	$ps   .="		--- Kontrolle durch User erforderlich Ende-------------------------------------------------

";

	$ps   .="		--- Fehlermeldungen -----------------------------------------------------------------------
";
	for($i=0;$i<count(@$MessageProkoll['Link']['Failure']);$i++)
	{
		$ps   .="   	".@$MessageProkoll['Link']['Failure'][$i]."
";
	}
	$ps   .="		--- Fehlermeldungen Ende-------------------------------------------------------------------

";

	// +++ externe Files installiert ++++++++++++++++++++++++++++++++++++++
	$ps   .="	+++++++++++++++++ Installation externe Files +++++++++++++++++++++++++++++++++++++++++++++++++
";
	$ps   .="		--- OK-Meldungen --------------------------------------------------------------------------
";
	for($i=0;$i<count(@$MessageProkoll['extFiles']['OK']);$i++)
	{
		$ps   .="   	".@$MessageProkoll['extFiles']['OK'][$i]."
";
	}
	$ps   .="		--- OK-Meldungen Ende ---------------------------------------------------------------------

";

	$ps   .="		--- Fehlermeldungen -----------------------------------------------------------------------
";
	for($i=0;$i<count(@$MessageProkoll['extFiles']['Failure']);$i++)
	{
		$ps   .="   	".@$MessageProkoll['extFiles']['Failure'][$i]."
";
	}
	$ps   .="		--- Fehlermeldungen Ende-------------------------------------------------------------------

";

	$ps   .="**/
";

echo $ps;
return $ps;
}


############################### Installations-Protokoll ##################################################
// +++ erstellt Installations-Protokoll Objekt-Inventory für Exportscript ++++++++++++++
function createObjInventoryProtocol($ObjInstInv)
{
	// Object-Inventory Function-Kopf generieren
	$s = "<?
";
	$s .= InstallProtocoll();
	$s .= "// ### InstallationsProtokoll Ende #################################################


";
	$s .= '// Function Object Inventory Install-Protocol'."
";
	$s .= 'function ObjectInventoryProtocol()'."
";
	$s .= '{'."
";
	$s .= '$raw = \''."
";

	// Array Copy-Parameters
	$s .= createCopyParametersString();

	// Daten der Einzelobjekte aus Objekt-Inventory an Export-String anfügen
	$ObjStringArray = ChildGenerator($ObjInstInv);
	//print_r($ObjInstInv);
	$s .= createInventoryString($ObjStringArray);

	// Function Footer
	$s .= "';
";
	$s .= '$Inv	= explode("
",substr(substr($raw, 1), 1, -1)); // ersten und letzten Zeilenumbruch entfernen'."
";
	$s .= 'return $Inv;'."
";
	$s .= "}

";
	$s .= "?>";
	return $s;
}

// generiert rekursiv Protkoll-String für ggf. vorhandene Child-Arrays unter einem Objekt im Objekt-Inventory
function ChildGenerator($Array)
{
	for($i=0;$i<count($Array);$i++)
   {
      $obj[] = createObjectRow($Array[$i]);
		if((isset($Array[$i]['ChildrenIDs'])))
      {
         $newArray = $Array[$i]['ChildrenIDs'];
		   $obj[]	= ChildGenerator($newArray);
		}
   }
   return $obj;
}

// Function Objekt Install Protocol: Datenstring für 1 Objekt generieren
function createObjectRow($Obj)
{
   // Objektstammdaten aus IPS_GetObject
   unset($Obj['ChildrenIDs']);

   // Steuerzeichen CR LF aus Object-Info filtern und ersetzen
	$Obj['ObjectInfo'] = str_replace("
", "§&§", $Obj['ObjectInfo']);

	// Stringstart definieren, 1. Entrag muss ObjectID sein!
   $s   = 'ObjectID,'.$Obj['ObjectID'].';';

   // Inventory Export: Stringteil Objekt-Stammdaten vervollständigen
	for($i=0;$i<count($Obj);$i++)
	{
	   $key		= key($Obj);
	    $s .= key($Obj).','.$Obj[key($Obj)].';';
	    next ($Obj);
	}
	$s .= "
";

	return $s;
}

// +++ Export: geht Objekt-Inventory rekrusiv durch und fügt Objektdaten der Einzelobjekte an Protokoll-String an
function createInventoryString($Array)
{
   $str = '';
	for($i=0;$i<count($Array);$i++)
	{
	   if(is_array($Array[$i]))
		{

		   $newArray = $Array[$i];
		   $str  .= createInventoryString($newArray);

		}
		else
		{
	   	$str .= $Array[$i];
	   }
	}
	unset($Array);

	return $str;
}

// Copy-Parameters String für Install-Protocol generieren
function createCopyParametersString()
{
	global $Parameters;
	//$Array   = $_IPS['InstParameters'];
	$s = 'CopyParameters,;';
	for($i=0;$i<count($Parameters);$i++)
	{
	   $s .=key($Parameters).','.current($Parameters).';';
	   next($Parameters);
	}
	$s .= "
";

	return $s;
}

// Protokoll-File schreiben
function CreateProtocolFile($InstProtocol)
{
	$ScrName    = IPS_GetName($_IPS['SELF'])." InstallProtocol";
	echo "Protokollname: ".$ScrName;
	$Script_ID = IPS_CreateScript(0);
	IPS_SetName($Script_ID, $ScrName);
	IPS_SetParent($Script_ID, $_IPS['SELF']);
	IPS_SetInfo($Script_ID, "This script was created by: RS IPS Exporter ID #".$_IPS['SELF']);
	$fh = fopen(IPS_GetKernelDir()."scripts\\".$Script_ID.".ips.php", 'w') or die("cant open file");
	fwrite($fh, $InstProtocol);
	fclose($fh);
	IPS_SetScriptFile($Script_ID, $Script_ID.'.ips.php');
	echo "Installationsprotokoll-Script \"$ScrName\" ID #$Script_ID angelegt
";
	return $Script_ID;
}

################# Inventory-Daten ###############################################################################

// Function Object Inventory
function ObjectInventory()
{
global $MessageProkoll;
$raw = '
CopyParameters,;VarProfile,1;ScrOverwrite,0;
ObjectID,32746 /*[Geräte\Hue LED Steuerung]*/;HasChildren,1;ObjectIcon,;ObjectID,32746 /*[Geräte\Hue LED Steuerung]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Hue LED Steuerung;ObjectPosition,0;ObjectSummary,;ObjectType,0;ParentID,56760 /*[Geräte]*/;isConfigTree,0;
ObjectID,18545 /*[Geräte\Hue LED Steuerung\hue_Action]*/;HasChildren,;ObjectIcon,;ObjectID,18545 /*[Geräte\Hue LED Steuerung\hue_Action]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,hue_Action;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,32746 /*[Geräte\Hue LED Steuerung]*/;isConfigTree,0;IsBroken,;LastExecute,1397931187;ScriptFile,hue_Action.ips.php;ScriptID,18545 /*[Geräte\Hue LED Steuerung\hue_Action]*/;ScriptType,0;
ObjectID,20466 /*[Geräte\Hue LED Steuerung\Gruppen Bildung]*/;HasChildren,;ObjectIcon,;ObjectID,20466 /*[Geräte\Hue LED Steuerung\Gruppen Bildung]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Gruppen Bildung;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,32746 /*[Geräte\Hue LED Steuerung]*/;isConfigTree,0;IsBroken,;LastExecute,1396945504;ScriptFile,20466.ips.php;ScriptID,20466 /*[Geräte\Hue LED Steuerung\Gruppen Bildung]*/;ScriptType,0;
ObjectID,24632 /*[Geräte\Hue LED Steuerung\hue_ActionCallScene]*/;HasChildren,;ObjectIcon,;ObjectID,24632 /*[Geräte\Hue LED Steuerung\hue_ActionCallScene]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,hue_ActionCallScene;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,32746 /*[Geräte\Hue LED Steuerung]*/;isConfigTree,0;IsBroken,;LastExecute,1396963348;ScriptFile,hue_ActionCallScene.ips.php;ScriptID,24632 /*[Geräte\Hue LED Steuerung\hue_ActionCallScene]*/;ScriptType,0;
ObjectID,25371 /*[Geräte\Hue LED Steuerung\Lampen]*/;HasChildren,;ObjectIcon,;ObjectID,25371 /*[Geräte\Hue LED Steuerung\Lampen]*/;ObjectIdent,Lampen;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Lampen;ObjectPosition,0;ObjectSummary,;ObjectType,0;ParentID,32746 /*[Geräte\Hue LED Steuerung]*/;isConfigTree,0;
ObjectID,29728 /*[Geräte\Hue LED Steuerung\hue_ActionGroup]*/;HasChildren,;ObjectIcon,;ObjectID,29728 /*[Geräte\Hue LED Steuerung\hue_ActionGroup]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,hue_ActionGroup;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,32746 /*[Geräte\Hue LED Steuerung]*/;isConfigTree,0;IsBroken,;LastExecute,1398098115;ScriptFile,hue_ActionGroup.ips.php;ScriptID,29728 /*[Geräte\Hue LED Steuerung\hue_ActionGroup]*/;ScriptType,0;
ObjectID,35546 /*[Geräte\Hue LED Steuerung\ips installer]*/;HasChildren,;ObjectIcon,;ObjectID,35546 /*[Geräte\Hue LED Steuerung\ips installer]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,ips installer;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,32746 /*[Geräte\Hue LED Steuerung]*/;isConfigTree,0;IsBroken,;LastExecute,1395914574;ScriptFile,35546.ips.php;ScriptID,35546 /*[Geräte\Hue LED Steuerung\ips installer]*/;ScriptType,0;
ObjectID,35750 /*[Geräte\Hue LED Steuerung\Lampengruppen]*/;HasChildren,;ObjectIcon,;ObjectID,35750 /*[Geräte\Hue LED Steuerung\Lampengruppen]*/;ObjectIdent,Lampengruppen;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Lampengruppen;ObjectPosition,0;ObjectSummary,;ObjectType,0;ParentID,32746 /*[Geräte\Hue LED Steuerung]*/;isConfigTree,0;
ObjectID,36420 /*[Geräte\Hue LED Steuerung\Szenen]*/;HasChildren,1;ObjectIcon,;ObjectID,36420 /*[Geräte\Hue LED Steuerung\Szenen]*/;ObjectIdent,Szenen;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Szenen;ObjectPosition,0;ObjectSummary,;ObjectType,0;ParentID,32746 /*[Geräte\Hue LED Steuerung]*/;isConfigTree,0;
ObjectID,37662 /*[Geräte\Hue LED Steuerung\Szenen\Aktuellen Lichtstatus speichern]*/;HasChildren,;ObjectIcon,;ObjectID,37662 /*[Geräte\Hue LED Steuerung\Szenen\Aktuellen Lichtstatus speichern]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Aktuellen Lichtstatus speichern;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,36420 /*[Geräte\Hue LED Steuerung\Szenen]*/;isConfigTree,0;VariableAction,0;VariableChanged,0;VariableCustomAction,45489 /*[Geräte\Hue LED Steuerung\hue_ActionScene]*/;VariableCustomProfile,hue_Toggle;VariableID,37662 /*[Geräte\Hue LED Steuerung\Szenen\Aktuellen Lichtstatus speichern]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,0;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,1;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,42584 /*[Geräte\Hue LED Steuerung\hue_include]*/;HasChildren,;ObjectIcon,;ObjectID,42584 /*[Geräte\Hue LED Steuerung\hue_include]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,hue_include;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,32746 /*[Geräte\Hue LED Steuerung]*/;isConfigTree,0;IsBroken,;LastExecute,1396956305;ScriptFile,hue_include.ips.php;ScriptID,42584 /*[Geräte\Hue LED Steuerung\hue_include]*/;ScriptType,0;
ObjectID,45489 /*[Geräte\Hue LED Steuerung\hue_ActionScene]*/;HasChildren,;ObjectIcon,;ObjectID,45489 /*[Geräte\Hue LED Steuerung\hue_ActionScene]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,hue_ActionScene;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,32746 /*[Geräte\Hue LED Steuerung]*/;isConfigTree,0;IsBroken,;LastExecute,1396960543;ScriptFile,hue_ActionScene.ips.php;ScriptID,45489 /*[Geräte\Hue LED Steuerung\hue_ActionScene]*/;ScriptType,0;
ObjectID,49829 /*[Geräte\Hue LED Steuerung\hue_query]*/;HasChildren,;ObjectIcon,;ObjectID,49829 /*[Geräte\Hue LED Steuerung\hue_query]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,hue_query;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,32746 /*[Geräte\Hue LED Steuerung]*/;isConfigTree,0;IsBroken,1;LastExecute,1398245805;ScriptFile,hue_query.ips.php;ScriptID,49829 /*[Geräte\Hue LED Steuerung\hue_query]*/;ScriptType,0;
ObjectID,51763 /*[Geräte\Hue LED Steuerung\Hue Key]*/;HasChildren,;ObjectIcon,;ObjectID,51763 /*[Geräte\Hue LED Steuerung\Hue Key]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Hue Key;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,32746 /*[Geräte\Hue LED Steuerung]*/;isConfigTree,0;IsBroken,;LastExecute,1396889727;ScriptFile,51763.ips.php;ScriptID,51763 /*[Geräte\Hue LED Steuerung\Hue Key]*/;ScriptType,0;
';
$echo = "#1001 Quell-ObjektInventory geladen";
$MessageProkoll['Info'][]  = $echo;
$Inv	= explode("
",substr(substr($raw, 1), 1, -1)); // ersten und letzten Zeilenumbruch entfernen
return $Inv;
}

// Variablen-Profile Inventory
function VarProfileInventory()
{
global $MessageProkoll;
$raw = '
ProfileName,hue_Toggle;Digits,0;Icon,Return;IsReadOnly,;MaxValue,0;MinValue,0;Prefix,;ProfileType,1;StepSize,0;Suffix,;|Color,13434828;Icon,Return;Name,Szene speichern;Value,0;§
';
$echo = "#1002 VariablenProfile-ObjektInventory geladen";
$MessageProkoll['Info'][]  = $echo;
$VarProfiles	= explode("
",substr(substr($raw, 2), 0, -1)); // ersten und letzten Zeilenumbruch entfernen
return $VarProfiles;
}

// Function WFC Inventory
function loadWFCInventory()
{
global $MessageProkoll;
$raw = '
';
$echo = "#1003 WFC-ObjektInventory geladen";
$MessageProkoll['Info'][]  = $echo;
$WFC_Inventory	= explode("
",substr(substr($raw, 2), 0, -1)); // ersten und letzten Zeilenumbruch entfernen
return $WFC_Inventory;
}

// #### Script-Exports ############################################################################################################

// Script "hue_Action" ------------------------------------------------------------------------------------------------------
function hueAction18545()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 23.04.2014 11:39 #####


INCLUDE ("hue_include.ips.php");

Switch ($_IPS[§\'SENDER§\'])
	{
	Default:
	Case "RunScript":
	Case "Execute":
	Case "TimerEvent":
		break;

	Case "Variable":
	Case "WebFront": 	   // Zum schalten im Webfront

		$id_info = IPS_GetObject(IPS_GetParent($_IPS[§\'VARIABLE§\']));
		$modelID = GetValueString(IPS_GetVariableIDByName("ModelID",IPS_GetParent($_IPS[§\'VARIABLE§\'])));
		//echo $modelID;
		$lampID = $id_info[§\'ObjectIdent§\'];
	   // $lampID = IPS_GetObjectIDByIdent($_IPS[§\'VARIABLE§\'], IPS_GetParent($_IPS[§\'VARIABLE§\']));   // IPS_GetName(IPS_GetParent($_IPS[§\'VARIABLE§\']));

      $action = IPS_GetName($_IPS[§\'VARIABLE§\']);
		Switch ($action){

		   case "Farbe":
            // Werte aus HEXCOLOR übernehmen und aufteilen
			   $ValueDEC = $_IPS[§\'VALUE§\'];
			   $ValueHEX = dechex($_IPS[§\'VALUE§\']);
			   $ValueHEX = substr("000000", 0, 6 - strlen($ValueHEX)).$ValueHEX;
			   $rotHex   = substr($ValueHEX, 0, 2);
			   $rotDec   = round(hexdec($rotHex));
			   $gruenHex = substr($ValueHEX, 2, 2);
			   $gruenDec = round(hexdec($gruenHex));
			   $blauHex  = substr($ValueHEX, 4, 2);
			   $blauDec  = round(hexdec($blauHex));

			   $color = array($rotDec,$gruenDec,$blauDec);
			   $values = calculateXY($color, $modelID);
			   $x = $values->x;
			   $y = $values->y;

			   $cmd = §\'"xy":[§\'.$x.§\',§\'.$y.§\']§\';
			   hue_SendLampCommand($lampID,$cmd );
				SetValue($_IPS[§\'VARIABLE§\'], $_IPS[§\'VALUE§\']);
				break;

		   case "Helligkeit":
				hue_SendLampCommand($lampID, §\'"bri":§\'.$_IPS[§\'VALUE§\']);
				SetValue($_IPS[§\'VARIABLE§\'], $_IPS[§\'VALUE§\']);
		      break;
		   case "Temperatur":
				hue_SendLampCommand($lampID, §\'"ct":§\'.$_IPS[§\'VALUE§\']);
				SetValue($_IPS[§\'VARIABLE§\'], $_IPS[§\'VALUE§\']);
		      break;
		   case "Sättigung":
				hue_SendLampCommand($lampID, §\'"sat":§\'.$_IPS[§\'VALUE§\']);
				SetValue($_IPS[§\'VARIABLE§\'], $_IPS[§\'VALUE§\']);
		      break;
		   case "Hue":
				hue_SendLampCommand($lampID, §\'"hue":§\'.$_IPS[§\'VALUE§\']);
				SetValue($_IPS[§\'VARIABLE§\'], $_IPS[§\'VALUE§\']);
		      break;
			case "Status":
				if ($_IPS[§\'VALUE§\'] == True){
				   $action =§\'"on":true§\';
				} else {
				   $action =§\'"on":false§\';
				}
				hue_SendLampCommand($lampID, $action);
				SetValue($_IPS[§\'VARIABLE§\'], $_IPS[§\'VALUE§\']);
			Default:
			   break;
		};

	   break;
	}
?>
';
}

// Script "Gruppen Bildung" ------------------------------------------------------------------------------------------------------
function GruppenBildung20466()
{
return
' <?
 ##### Project Exporter Comment: Script Version Stand 23.04.2014 11:39 #####


$bridge_ip = "192.168.178.220";
$key = "hierdeinenkeyrein";

$add_group = §\'1§\'; // <----- HIER DIE NUMMER DER GRUPPE EINTRAGEN WO DIE HUE§\'S EINGEFÜGT WERDEN SOLLEN


            $json_url = §\'http://§\'.$bridge_ip.§\'/api/§\'.$key.§\'/groups/§\'.$add_group.§\'§\';


            $json_string = §\'{"lights": ["4","5","6"]}§\';



            $ch = curl_init( $json_url );
            // Configuring curl options
            $options = array(
                            CURLOPT_RETURNTRANSFER => true,
                            CURLOPT_CUSTOMREQUEST => §\'PUT§\', // -X
                            CURLOPT_HTTPHEADER => array(§\'Content-type: application/json§\') ,
                            CURLOPT_POSTFIELDS => $json_string
                            );


            // Setting curl options
            curl_setopt_array( $ch, $options );

            // Getting results
            $result =  curl_exec($ch);


        print $result."@§@n";

?>
';
}

// Script "hue_ActionCallScene" ------------------------------------------------------------------------------------------------------
function hueActionCallScene24632()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 23.04.2014 11:39 #####

if(file_exists(IPS_GetKernelDir()."@§@@§@scripts@§@@§@IPSInstaller.ips.php"))
	require_once(IPS_GetKernelDir()."@§@@§@scripts@§@@§@IPSInstaller.ips.php");
INCLUDE ("hue_include.ips.php");

Switch ($_IPS[§\'SENDER§\'])
	{
	Default:
	Case "RunScript":
	Case "Execute":
	Case "TimerEvent":
		break;

	Case "Variable":
	Case "WebFront": 	   // Zum schalten im Webfront

		$childs = IPS_GetChildrenIDs(IPS_GetParent($_IPS[§\'VARIABLE§\']));
		foreach($childs as $child)
		{
			$var = GetValue($child);
		   if(is_string($var))
		   {
		      $data = explode("#",$var);
		      if(count($data == 2)) hue_SendLampCommand($data[0], $data[1]);
		   }
		}

	}


?>
';
}

// Script "hue_ActionGroup" ------------------------------------------------------------------------------------------------------
function hueActionGroup29728()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 23.04.2014 11:39 #####


INCLUDE ("hue_include.ips.php");

Switch ($_IPS[§\'SENDER§\'])
	{
	Default:
	Case "RunScript":
	Case "Execute":
	Case "TimerEvent":
		break;

	Case "Variable":
	Case "WebFront": 	   // Zum schalten im Webfront

		$id_info = IPS_GetObject(IPS_GetParent($_IPS[§\'VARIABLE§\']));
		$groupID = $id_info[§\'ObjectIdent§\'];
	   // $lampID = IPS_GetObjectIDByIdent($_IPS[§\'VARIABLE§\'], IPS_GetParent($_IPS[§\'VARIABLE§\']));   // IPS_GetName(IPS_GetParent($_IPS[§\'VARIABLE§\']));

      $action = IPS_GetName($_IPS[§\'VARIABLE§\']);
		Switch ($action){

		   case "Farbe":

            // Werte aus HEXCOLOR übernehmen und aufteilen
			   $ValueDEC = $_IPS[§\'VALUE§\'];
			   $ValueHEX = dechex($_IPS[§\'VALUE§\']);
			   $ValueHEX = substr("000000", 0, 6 - strlen($ValueHEX)).$ValueHEX;
			   $rotHex   = substr($ValueHEX, 0, 2);
			   $rotDec   = round(hexdec($rotHex));
			   $gruenHex = substr($ValueHEX, 2, 2);
			   $gruenDec = round(hexdec($gruenHex));
			   $blauHex  = substr($ValueHEX, 4, 2);
			   $blauDec  = round(hexdec($blauHex));

			   $color = array($rotDec,$gruenDec,$blauDec);
			   $values = calculateXY($color, "LCT001");
			   $x = $values->x;
			   $y = $values->y;


			   $cmd = §\'"xy":[§\'.$x.§\',§\'.$y.§\']§\';
			   hue_SendGroupCommand($groupID,$cmd );
				SetValue($_IPS[§\'VARIABLE§\'], $_IPS[§\'VALUE§\']);


		      break;
		   case "Helligkeit":
				hue_SendGroupCommand($groupID, §\'"bri":§\'.$_IPS[§\'VALUE§\']);
				SetValue($_IPS[§\'VARIABLE§\'], $_IPS[§\'VALUE§\']);
		      break;
		   case "Temperatur":
				hue_SendGroupCommand($groupID, §\'"ct":§\'.$_IPS[§\'VALUE§\']);
				SetValue($_IPS[§\'VARIABLE§\'], $_IPS[§\'VALUE§\']);
		      break;
		   case "Sättigung":
				hue_SendGroupCommand($groupID, §\'"sat":§\'.$_IPS[§\'VALUE§\']);
				SetValue($_IPS[§\'VARIABLE§\'], $_IPS[§\'VALUE§\']);
		      break;
		   case "Hue":
				hue_SendGroupCommand($groupID, §\'"hue":§\'.$_IPS[§\'VALUE§\']);
				SetValue($_IPS[§\'VARIABLE§\'], $_IPS[§\'VALUE§\']);
		      break;
			case "Status":
				if ($_IPS[§\'VALUE§\'] == True){
				   $action =§\'"on":true§\';
				} else {
				   $action =§\'"on":false§\';
				}
				hue_SendGroupCommand($groupID, $action);
				SetValue($_IPS[§\'VARIABLE§\'], $_IPS[§\'VALUE§\']);
			Default:
			   break;
		};

	   break;
	}
?>
';
}

// Script "ips installer" ------------------------------------------------------------------------------------------------------
function ipsinstaller35546()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 23.04.2014 11:39 #####

	/**@§@defgroup ipsinstaller IPSInstaller
	 * @{
	 *
	 * Der IPSInstaller bietet diverse Funktionen um Objekte (Kategorien, Variablen, Links, usw.) in IPS anzulegen.
	 * Die Funktionen überprüfen ob das Objekt bereits existiert, wenn nein wird es neu angelegt ansonsten werden die
	 * Object Parameter angepasst.
	 *
	 * Dadurch ist es möglich Installations Skripts zu schreiben, die man einerseits verwenden kann Entwicklungen vom
	 * Test-System auf das Echt-System zu bringen oder andererseits Entwicklungen auch anderen Usern zur Verfügung zu
	 * stellen.
	 *
	 * @file          IPSInstaller.ips.php
	 * @author        Andreas Brauneis
	 *
	 */

	/** Anlegen einer Kategorie.
	 *
	 * Die Funktion legt eine Kategory, als übergeordnete ID dient dabei $ParentId. Sollte
	 * dort bereits eine Kategorie mit dem angegebenen Namen existieren, werden die Parameter
	 * (Position und Icon) der existierenden Kategorie auf den neuen Wert gesetzt.
	 *
	 * @param string $Name Name der Kategorie
	 * @param integer $ParentId ID des übergeordneten Objekts im logischen Objektbaum
	 * @param integer $Position Positionswert des Objekts
	 * @param string $Icon Dateiname des Icons ohne Pfad/Erweiterung
	 * @return integer ID der Kategorie
	 *
	 */
	function CreateCategory ($Name, $ParentId, $Position, $Icon=null) {
		$CategoryId = @IPS_GetObjectIDByIdent(Get_IdentByName($Name), $ParentId);
		if ($CategoryId === false) $CategoryId = @IPS_GetCategoryIDByName($Name, $ParentId);
		if ($CategoryId === false) {
			$CategoryId = IPS_CreateCategory();
			IPS_SetName($CategoryId, $Name);
			IPS_SetIdent($CategoryId, Get_IdentByName($Name));
			IPS_SetParent($CategoryId, $ParentId);
			if ($Position!==false) {
				IPS_SetPosition($CategoryId, $Position);
			}
			if ($Icon!==false) {
				IPS_SetIcon($CategoryId, $Icon);
			}
			////echo §\'Created Category §\'.$Name.§\'=§\'.$CategoryId."@§@n";
		}
		UpdateObjectData($CategoryId, $Position, $Icon);
		return $CategoryId;
	}

	/** Löschen einer Kategory inklusve Inhalt
	 *
	 * Die Funktion löscht eine Kategory, vor dem Löschen werden noch alle beinhaltenden Objekte
	 * aus der Kategory gelöscht.
	 *
	 * @param integer $CategoryId ID der Kategory
	 *
	 */
	function DeleteCategory($CategoryId) {
		EmptyCategory($CategoryId);
		//echo "Delete Category ID=$CategoryId@§@n";
		IPS_DeleteCategory($CategoryId);
	}

	/** Löschen des Inhalts einer Kategorie inklusve Inhalt
	 *
	 * Die Funktion löscht den gesamtem Inhalt einer Kategorie
	 *
	 * @param integer $CategoryId ID der Kategory
	 *
	 */
	function EmptyCategory($CategoryId) {
		if ($CategoryId==0) {
			//echo "Root Category could NOT ne deleted!!!@§@n";
			exit;
		}

		$ChildrenIds = IPS_GetChildrenIDs($CategoryId);
		foreach ($ChildrenIds as $ObjectId) {
			$Object     = IPS_GetObject($ObjectId);
			$ObjectType = $Object[§\'ObjectType§\'];
			switch ($ObjectType) {
				case 0: // Category
					DeleteCategory($ObjectId);
					break;
				case 1: // Instance
					EmptyCategory($ObjectId);
					IPS_DeleteInstance($ObjectId);
					break;
				case 2: // Variable
					IPS_DeleteVariable($ObjectId);
					break;
				case 3: // Script
					IPS_DeleteScript($ObjectId);
					break;
				case 4: // Event
					IPS_DeleteEvent($ObjectId);
					break;
				case 5: // Media
					IPS_DeleteMedia($ObjectId);
					break;
				case 6: // Link
					IPS_DeleteLink($ObjectId);
					break;
				default:
					//echo "Found unknown ObjectType $ObjectType@§@n";
					exit;
			}
		}
		//echo "Empty Category ID=$CategoryId@§@n";
	}

	/** Anlegen eines Kategorie Pfades.
	 *
	 * Eine Liste von Kategorien, die durch einen §\'.§\' voneinander separiert sind, können als String übergeben
	 * werden.
	 *
	 * @param string $Path Kategorie Pfad (zB. §\'Program.IPSInstaller§\')
	 * @param integer $LastPosition Positionswert der obersten Kategorie (im Falle von §\'Programm.IPSInstaller§\' kann man den
	 *                              Positionswert von IPSInstaller angeben).
	 * @param string $LastIcon Icon der obersten Kategorie (Dateiname des Icons ohne Pfad/Erweiterung)
	 * @return integer ID der Kategorie
	 *
	 */
	function CreateCategoryPath($Path, $LastPosition=0, $LastIcon="") {
		$CategoryList = explode(§\'.§\',$Path);
		$ParentId = 0;
		foreach ($CategoryList as $Idx=>$Category) {
			if ($Idx == count($CategoryList)-1) {
				$ParentId = CreateCategory ($Category, $ParentId, $LastPosition, $LastIcon);
			} else {
				$ParentId = CreateCategory ($Category, $ParentId, false, false);
			}
		}
		return $ParentId;
	}

	/** ObjektId aus Pfad ermittlen
	 *
	 * Der Befehl ermittelt aus einer Pfadangabe (zB. "Program.IPSInstaller") die ID der Kategorie
	 *
	 * @param string $Path Pfadangabe
	 *
	 */
	function get_ObjectIDByPath($Path, $ReturnFalse=false) {
		$CategoryList = explode(§\'.§\',$Path);
		$ObjId    = 0;
		$ParentId = 0;
		foreach ($CategoryList as $Idx=>$Category) {
			$ObjId = @IPS_GetObjectIDByIdent(Get_IdentByName($Category), $ParentId);
			if ($ObjId===false) {
				$ObjId=@IPS_GetObjectIDByName($Category, $ParentId);
			}
			if ($ObjId===false) {
				if ($ReturnFalse) {
					return false;
				} else {
					die("§\'$Category§\' could NOT be found !!!");
				}
			}
			$ParentId = $ObjId;
		}
		return $ObjId;
	}

	/** Ident aus Namen generieren
	 *
	 * Die Funktion wandelt einen Namen auf einen gültigen  IPS Ident um.
	 *
	 * @param string $Name Name
	 *
	 */
	function Get_IdentByName($name) {
		$ident = str_replace(§\' §\', §\'§\', $name);
		$ident = str_replace(array(§\'ö§\',§\'ä§\',§\'ü§\',§\'Ö§\',§\'ħ\',§\'ܧ\'), array(§\'oe§\', §\'ae§\',§\'ue§\',§\'Oe§\', §\'Ae§\',§\'Ue§\' ), $ident);
		$ident = str_replace(array(§\'"§\',§\'@§@§\'§\',§\'%§\',§\'&§\',§\'(§\',§\')§\',§\'=§\',§\'#§\',§\'<§\',§\'>§\',§\'|§\',§\'@§@@§@§\'), §\'§\', $ident);
		$ident = str_replace(array(§\',§\',§\'.§\',§\':§\',§\';§\',§\'!§\',§\'?§\'), §\'§\', $ident);
		$ident = str_replace(array(§\'+§\',§\'-§\',§\'/§\',§\'*§\'), §\'§\', $ident);
		return $ident;
	}



	/** Anlegen einer Instanz.
	 *
	 * Die Funktion legt eine unkonfigurierte Instanz an, als übergeordnete ID dient dabei $ParentId. Sollte
	 * dort bereits eine Kategorie mit dem angegebenen Namen existieren, werden die Parameter
	 * (Position und Icon) der existierenden Kategorie auf den neuen Wert gesetzt.
	 *
	 * @param string $Name Name der Instance
	 * @param integer $ParentId ID des übergeordneten Objekts im logischen Objektbaum
	 * @param string $ModulId ModulID des zu erstellenden Objekts. Die ModulID ist eine 32Bit GUID im Format
	 *                        {00000000-0000-0000-0000-000000000000}.
	 * @param integer $Position Positionswert des Objekts
	 * @return integer ID der Instanz
	 *
	 */
	function CreateInstance ($Name, $ParentId, $ModulId, $Position=0) {
		$InstanceId = @IPS_GetObjectIDByIdent(Get_IdentByName($Name), $ParentId);
		if ($InstanceId === false) $InstanceId = @IPS_GetInstanceIDByName($Name, $ParentId);
		if ($InstanceId === false) {
			$InstanceId	= IPS_CreateInstance($ModulId);
			IPS_SetName($InstanceId, $Name);
			IPS_SetIdent($InstanceId, Get_IdentByName($Name));
			IPS_SetParent($InstanceId, $ParentId);
			IPS_SetPosition($InstanceId, $Position);
			//echo "Created Instance $Name=$InstanceId, ModuleID=$ModulId@§@n";
		}
		UpdateObjectData($InstanceId, $Position);
		return $InstanceId;
	}

	/** Anlegen einer "MediaPlayer" Instanz.
	 *
	 * Die Funktion legt eine "MediaPlayer" Instanz an und liefert die ID des generierten Objekts als Return Wert zurück
	 * Es wird die erste Soundkarte verwendet, die im System gefunden wird.
	 *
	 * @param string $Name Name der MediaPlayer Instance
	 * @param integer $ParentId ID des übergeordneten Objekts im logischen Objektbaum
	 * @param integer $Position Positionswert des Objekts
	 * @return integer ID der Instanz
	 *
	 */
	function CreateMediaPlayer($Name, $ParentId, $Position=0) {
		$MediaPlayerInstanceId = CreateInstance($Name, $ParentId, "{2999EBBB-5D36-407E-A52B-E9142A45F19C}",$Position);
		$SoundCards = WAC_GetDevices($MediaPlayerInstanceId);
		foreach ($SoundCards as $Idx=>$SoundCard) {
			if ($SoundCard <> "No sound") {
				//echo "Set Soundcard $SoundCard@§@n";
			   WAC_SetDeviceID($MediaPlayerInstanceId, $Idx);
			}
		}
		WAC_SetUpdateInterval($MediaPlayerInstanceId, 1);
		IPS_ApplyChanges($MediaPlayerInstanceId);

		return $MediaPlayerInstanceId;
	}

	/** Anlegen einer "Media" Instanz.
	 *
	 * Die Funktion legt eine "Media" Instanz an und liefert die ID des generierten Objekts als Return Wert zurück
	 *
	 * @param string $Name Name der Media Instance
	 * @param integer $ParentId ID des übergeordneten Objekts im logischen Objektbaum
	 * @param string $FileName Dateiname der Mediendatei.
	 * @param boolean $FileExists TRUE, wenn Existenz geprüft werden soll, sonst FALSE
	 * @param boolean $MediaType MedienType (0=Designer Formular, 1=Image Obejct, 2=Sound Objekt)
	 * @param string $Icon Dateiname des Icons ohne Pfad/Erweiterung
	 * @param integer $Position Positionswert des Objekts
	 * @return integer ID der Instanz
	 *
	 */
	function CreateMedia ($Name, $ParentId, $FileName, $FileExists=false, $MediaType=1/*1=Image*/, $Icon="", $Position=0) {
		$MediaId = @IPS_GetObjectIDByIdent(Get_IdentByName($Name), $ParentId);
		if ($MediaId === false) $MediaId = @IPS_GetMediaIDByName($Name, $ParentId);
		if ($MediaId === false) {
			$MediaId	= IPS_CreateMedia($MediaType);
			IPS_SetName($MediaId, $Name);
			IPS_SetIdent($MediaId, Get_IdentByName($Name));
			IPS_SetParent($MediaId, $ParentId);
			IPS_SetPosition($MediaId, $Position);
			//echo "Created Media $Name=$MediaId, File=$FileName@§@n";
		}
		IPS_SetMediaFile($MediaId, $FileName, $FileExists);
		UpdateObjectData($MediaId, $Position, $Icon);
		return $MediaId;
	}

	/** Anlegen einer Instanz.
	 *
	 * Die Funktion legt eine "Dummy" Instanz an und liefert die ID des generierten Objects als Return Wert zurück
	 *
	 * @param string $Name Name der Dummy Instance
	 * @param integer $ParentId ID des übergeordneten Objekts im logischen Objektbaum
	 * @param integer $Position Positionswert des Objekts
	 * @return integer ID der Instanz
	 *
	 */
	function CreateDummyInstance ($Name, $ParentId, $Position=0) {
	   return CreateInstance ($Name, $ParentId, "{485D0419-BE97-4548-AA9C-C083EB82E61E}", $Position);
	}

	/** Anlegen einer IO Instanze mit seriellem Port
	 *
	 * Die Funktion legt eine Serielle IO Instanze an. Wenn unter der ParentId bereits eine Instanze mit selbem
	 * Namen existiert, werden alle Parameter auf den aktuellen Wert gesetzt.
	 *
	 * @param string $Name Name der IO Instanze
	 * @param string $ComPort Name des Com Ports
	 * @param integer $Baud Baud Rate des seriellen Ports
	 * @param integer $StopBits Einstellung Stop Bits des seriellen Ports
	 * @param integer $DataBits Parity Data Bits des seriellen Ports
	 * @param string $Parity Parity Einstellung des seriellen Ports
	 * @param integer $Position Positions Wert des Objekts
	 * @param boolean $IgnoreError Ignoriren von Fehlern bei der Generierung der Instanz, andernfalls wird das Script abgebrochen
	 * @return integer ID der seriellen Port Instanze
	 *
	 */
	function CreateSerialPort($Name, $ComPort, $Baud=9600, $StopBits=1, $DataBits=8, $Parity=§\'None§\', $Position=0, $IgnoreError=true) {
		$InstanceId = CreateInstance($Name, 0, "{6DC3D946-0D31-450F-A8C6-C42DB8D7D4F1}",$Position);
		COMPort_SetBaudRate($InstanceId, $Baud);
		COMPort_SetStopBits($InstanceId, $StopBits);
		COMPort_SetDataBits($InstanceId, $DataBits);
		COMPort_SetParity($InstanceId, $Parity);
		COMPort_SetPort($InstanceId, $ComPort);
		COMPort_SetOpen($InstanceId, true);

		if (!IPS_ApplyChanges($InstanceId) and !$IgnoreError) {
			//echo "Error applying Changes to ComPort Instance --> Abort Script@§@n";
			Exit;
		};
		return $InstanceId;
	}

	/** Anlegen einer IO Instanze mit seriellem Port
	 *
	 * Die Funktion legt eine Serielle IO Instanze an. Es werden alle IO Instanze gelesen, sollte keine
	 * mit dem selben ComPort Namen gefunden werden, wird eine neue Instanze angelegt.
	 *
	 * @param string $Name Name der IO Instanze
	 * @param string $ComPort Name des Com Ports
	 * @param integer $Baud Baud Rate des seriellen Ports
	 * @param integer $StopBits Einstellung Stop Bits des seriellen Ports
	 * @param integer $DataBits Parity Data Bits des seriellen Ports
	 * @param string $Parity Parity Einstellung des seriellen Ports
	 * @param integer $Position Positions Wert des Objekts
	 * @param boolean $IgnoreError Ignoriren von Fehlern bei der Generierung der Instanz, andernfalls wird das Script abgebrochen
	 * @return integer ID der seriellen Port Instanze
	 *
	 */

	function CreateSerialPortByComPort($Name, $ComPort, $Baud=9600, $StopBits=1, $DataBits=8, $Parity=§\'None§\', $Position=0,$IgnoreError) {
		$InstanceList = IPS_GetInstanceListByModuleID ("{6DC3D946-0D31-450F-A8C6-C42DB8D7D4F1}");
		$InstanceId   = false;
		foreach ($InstanceList as $id) {
			$Port = COMPort_GetPort($id);
			//echo "Found Port >>$Port<<@§@n";
			if ($Port==$ComPort or $Port=="") {
				$InstanceId = $id;
			}
		}
		if ($InstanceId !== false) {
			IPS_SetName($InstanceId, $Name);
		}

		return CreateSerialPort($Name, $ComPort, $Baud, $StopBits, $DataBits, $Parity, $Position);
	}

	/** Anlegen einer Register-Variable
	 *
	 * Die Funktion legt eine Register Variable, als übergeordnete ID dient dabei $ParentId. Sollte
	 * dort bereits eine Register Variable mit dem spezifizierten Namen existieren, werden alle Parameter
	 * auf den aktuellen Wert gesetzt.
	 *
	 * @param string $Name Name der Register Variable
	 * @param integer $ParentId ID des übergeordneten Objekts im logischen Objektbaum
	 * @param integer $ScriptId ID des Scriptes
	 * @param integer $PortId ID der zu verbindenden Instanz
	 * @param integer $Position Positionswert des Objekts
	 * @return integer ID der Register Variable
	 *
	 */
	function CreateRegisterVariable($Name, $ParentId, $ScriptId, $PortId, $Position=0) {
		$InstanceId = CreateInstance($Name, $ParentId, "{F3855B3C-7CD6-47CA-97AB-E66D346C037F}",$Position);
		RegVar_SetRXObjectID($InstanceId, $ScriptId);
		IPS_ConnectInstance($InstanceId, $PortId);
		IPS_ApplyChanges($InstanceId);

		return $InstanceId;
	}

	/** Anlegen eines Scriptes.
	 *
	 * Der Befehl legt ein neues Script an und bindet den Dateinamen $File an das erzeugte Skript.
	 *
	 * @param string $Name Name des Scripts im logischen Objektbaum
	 * @param string $File Dateiname des PHP Skripts (relativ zum "/scripts" Ordner)
	 * @param integer $ParentId ID des übergeordneten Objekts im logischen Objektbaum
	 * @param integer $Position Positionswert des Objekts
	 * @return integer ID des Scriptes
	 *
	 */
	function CreateScript ($Name, $File, $ParentId, $Position=0) {
		$ScriptId = @IPS_GetObjectIDByIdent(Get_IdentByName($Name), $ParentId);
		if ($ScriptId === false) $ScriptId = @IPS_GetScriptIDByName($Name, $ParentId);
		if ($ScriptId === false) {
			$ScriptId = IPS_CreateScript(0);
			IPS_SetName($ScriptId, $Name);
			IPS_SetIdent($ScriptId, Get_IdentByName($Name));
 			IPS_SetScriptFile($ScriptId, $File);
			IPS_SetParent($ScriptId, $ParentId);
			IPS_SetPosition($ScriptId, $Position);
			//echo §\'Created Script §\'.$Name.§\'=§\'.$ScriptId."@§@n";
		}
		UpdateObjectData($ScriptId, $Position);
		return $ScriptId;
	}

	/** Anlegen einer Variable.
	 *
	 * Der Befehl legt eine neue IPS-Variable vom Typ $Type an.
	 * Die Funktion liefert eine ID, mit deren Hilfe die erzeugte Variable eindeutig identifiziert werden kann.
	 *
	 * @param string $Name Name der Variable im logischen Objektbaum
	 * @param integer $Type VariablenType 0=Boolean, 1=Integer, 2=Float, 3=String
	 * @param integer $ParentId ID des übergeordneten Objekts im logischen Objektbaum
	 * @param integer $Position Positionswert des Objekts
	 * @param string $Profile Name des Profils. Verfügbare Profile können über IPS_GetVariableProfileList abgefragt werden. Wenn ein Leerstring übergeben wird, dann wird das benutzerdefinierte Profil deaktiviert.
	 * @param integer $Action ID eines Skriptes das als Aktions aufgeführt werden soll
	 * @param string $ValueDefault Wert den die Variable nach dem Anlegen haben soll
	 * @param string $Icon Dateiname des Icons ohne Pfad/Erweiterung
	 * @return integer ID der Variable
	 *
	 */
	function CreateVariable ($Name, $Type, $ParentId, $Position=0, $Profile="", $Action=null, $ValueDefault=§\'§\', $Icon=§\'§\') {
		$VariableId = @IPS_GetObjectIDByIdent(Get_IdentByName($Name), $ParentId);
		if ($VariableId === false) $VariableId = @IPS_GetVariableIDByName($Name, $ParentId);
		if ($VariableId === false) {
 			$VariableId = IPS_CreateVariable($Type);
			IPS_SetName($VariableId, $Name);
			IPS_SetIdent($VariableId, Get_IdentByName($Name));
			IPS_SetParent($VariableId, $ParentId);
			IPS_SetPosition($VariableId, $Position);
  			IPS_SetVariableCustomProfile($VariableId, $Profile);

			////echo "CA: ".$Name." - ".$VariableId." - ".$Action."@§@n";
			IPS_SetVariableCustomAction($VariableId, $Action);
			IPS_SetIcon($VariableId, $Icon);
			SetValue($VariableId, $ValueDefault);
			//echo §\'Created VariableId §\'.$Name.§\'=§\'.$VariableId."@§@n";
		}
		$VariableData = IPS_GetVariable ($VariableId);
		if ($VariableData[§\'VariableCustomProfile§\'] <> $Profile) {
			//echo "Set VariableProfile=§\'$Profile§\' for Variable=§\'$Name§\' @§@n";
			IPS_SetVariableCustomProfile($VariableId, $Profile);
		}
		if ($VariableData[§\'VariableCustomAction§\'] <> $Action) {
			//echo "Set VariableCustomAction=§\'$Action§\' for Variable=§\'$Name§\' @§@n";
			IPS_SetVariableCustomAction($VariableId, $Action);
		}
		UpdateObjectData($VariableId, $Position, $Icon);
		return $VariableId;
	}

	/** Anlegen eines Links
	 *
	 * Die Funktion legt einen Link an, als übergeordnete ID dient dabei $ParentId. Sollte
	 * dort bereits ein Link mit dem angegebenen Namen existieren, werden die Parameter
	 * (Position und Icon) des existierenden Links auf den neuen Wert gesetzt.
	 *
	 * @param string $Name Name des Links im logischen Objektbaum
	 * @param integer $Link ID des zu verknüpfenden Objekts
	 * @param integer $ParentId ID des übergeordneten Objekts im logischen Objektbaum
	 * @param integer $Position Positionswert des Objekts
	 * @param string $ident Identifikator für das Objekt
	 * @return integer ID der Variable
	 *
	 */
	function CreateLink ($Name, $Link, $ParentId, $Position, $ident="") {
		$LinkId = false;
		if ($ident<>"") {
			$LinkId = IPS_GetObjectIDByIdent($ident, $ParentId);
		}
		if ($LinkId === false) $LinkId = @IPS_GetLinkIDByName($Name, $ParentId);
		if ($LinkId === false) {
 			$LinkId = IPS_CreateLink();
			IPS_SetName($LinkId, $Name);
			IPS_SetIdent($LinkId, Get_IdentByName($Name));
			IPS_SetLinkChildID($LinkId, $Link);
			IPS_SetParent($LinkId, $ParentId);
			IPS_SetPosition($LinkId, $Position);
			//echo §\'Created Link §\'.$Name.§\'=§\'.$LinkId."@§@n";
		}
		UpdateObjectData($LinkId, $Position);
		IPS_SetLinkChildID($LinkId, $Link);
		return $LinkId;
	}

	/** Anlegen eines Links
	 *
	 * Die Funktion sucht in der spezifizierten Parent Kategorie alle vorhandenen Links und überprüft ob einer der
	 * Links bereits auf das zu verknüpfende Objekt verweist. Wenn kein Link gefunden wurde wird ein neuer angelegt,
	 * anderenfalls wird Position und Name existierenden Links auf den neuen Wert gesetzt.
	 *
	 * @param string $Name Name des Links im logischen Objektbaum
	 * @param integer $LinkChildId ID des zu verknüpfenden Objekts
	 * @param integer $ParentId ID des übergeordneten Objekts im logischen Objektbaum
	 * @param integer $Position Positionswert des Objekts
	 * @param string $ident Identifikator für das Objekt
	 * @return integer ID der Variable
	 *
	 */
	function CreateLinkByDestination ($Name, $LinkChildId, $ParentId, $Position, $ident="") {
		$LinkId    = false;
		$ObjectIds = IPS_GetChildrenIDs ($ParentId);
		foreach ($ObjectIds as $ObjectId) {
			$Object = IPS_GetObject ($ObjectId);
			if ($Object[§\'ObjectType§\']==6 /*Link*/) {
				$Link = IPS_GetLink($ObjectId);
				if ($Link[§\'LinkChildID§\']==$LinkChildId) {
					$LinkId = $ObjectId;
					break;
			   }
			}
		}

	   if ($LinkId === false) {
 			$LinkId = IPS_CreateLink();
			IPS_SetParent($LinkId, $ParentId);
			IPS_SetPosition($LinkId, $Position);
		}
		IPS_SetLinkChildID($LinkId, $LinkChildId);
		if ($ident<>"") {
			IPS_SetIdent($LinkId, $ident);
		}
		IPS_SetName($LinkId, $Name);
		UpdateObjectData($LinkId, $Position);
		return $LinkId;
	}

   // ------------------------------------------------------------------------------------------------
	function UpdateObjectData($ObjectId, $Position, $Icon="") {
		$ObjectData = IPS_GetObject ($ObjectId);
		$ObjectPath = IPS_GetLocation($ObjectId);
		if ($ObjectData[§\'ObjectPosition§\'] <> $Position and $Position!==false) {
			//echo "Set ObjectPosition=§\'$Position§\' for Object=§\'$ObjectPath§\' @§@n";
			IPS_SetPosition($ObjectId, $Position);
		}
		if ($ObjectData[§\'ObjectIcon§\'] <> $Icon and $Icon!==false) {
			//echo "Set ObjectIcon=§\'$Icon§\' for Object=§\'$ObjectPath§\' @§@n";
			IPS_SetIcon($ObjectId, $Icon);
		}

	}

	/** Definieren einer ID Konstante
	 *
	 * Mit der Funktion ist es möglich, eine Konstane in einem PHP Script File auf einen beliebigen Wert zu setzen.
	 *
	 * @param string $Name Name dee Konstante
	 * @param integer $ID Wert der Konstante
	 * @param string $FileName FileName des PHP Scriptes in dem die Konstate gesetzt werden soll
	 *
	 */
	function SetVariableConstant ($Name, $ID, $FileName) {

		$FileNameFull = IPS_GetKernelDir().§\'scripts@§@@§@§\'.$FileName;
		$FileContent = file_get_contents($FileNameFull, true);

		$pos = strpos($FileContent, $Name);
		if ($pos === false) {
			//echo "Error - ".$Name." could NOT be found in FileContent!@§@n";
		}
		$pos = $pos + strlen($Name);
		while (substr($FileContent, $pos, 1) < "0" or substr($FileContent, $pos, 1) > "9") {
			$pos = $pos+1;
		}
		$FileContentNew = substr($FileContent, 0, $pos).$ID.substr($FileContent, $pos+5);

		file_put_contents($FileNameFull, $FileContentNew);
	}

	/** Definieren "Tages" Timers
	 *
	 * Anlegen eines Timers, der einmal pro Tag zu einer bestimmten Uhrzeit ausgeführt wird
	 *
	 * @param string $Name Name des Timers
	 * @param integer $ParentId ID des übergeordneten Objekts im logischen Objektbaum
	 * @param integer $Hour Stunde zu der der Timer aktiviert werden soll
	 * @param integer $Minute Minute zu der der Timer aktiviert werden soll
	 * @return integer ID des Timers
	 *
	 */
	function CreateTimer_OnceADay ($Name, $ParentId, $Hour, $Minute=0) {
		$TimerId = @IPS_GetObjectIDByIdent(Get_IdentByName($Name), $ParentId);
		if ($TimerId === false) $TimerId = @IPS_GetEventIDByName($Name, $ParentId);
		if ($TimerId === false) {
 			$TimerId = IPS_CreateEvent(1 /*Cyclic Event*/);
			IPS_SetName($TimerId, $Name);
			IPS_SetIdent($TimerId, Get_IdentByName($Name));
			IPS_SetParent($TimerId, $ParentId);
			if (!IPS_SetEventCyclic($TimerId, 2 /**Daily*/, 1,0,0,0,0)) {
				//echo "IPS_SetEventCyclic failed !!!@§@n";
				exit;
			}
			if (!IPS_SetEventCyclicTimeBounds($TimerId, mktime($Hour, $Minute, 0), 0)) {
				//echo "IPS_SetEventCyclicTimeBounds failed !!!@§@n";
				exit;
			}
			IPS_SetEventActive($TimerId, true);
			//echo §\'Created Timer §\'.$Name.§\'=§\'.$TimerId."@§@n";
		}
		return $TimerId;
	}

	/** Definieren "Sekunden" Timers
	 *
	 * Anlegen eines Timers, der alle $Seconds Sekunden ausgeführt wird
	 *
	 * @param string $Name Name des Timers
	 * @param integer $ParentId ID des übergeordneten Objekts im logischen Objektbaum
	 * @param integer $Seconds Intervall in Sekunden
	 * @param boolean $Active Timer aktiv setzen
	 * @return integer ID des Timers
	 *
	 */
	function CreateTimer_CyclicBySeconds ($Name, $ParentId, $Seconds, $Active=true) {
		$TimerId = @IPS_GetObjectIDByIdent(Get_IdentByName($Name), $ParentId);
		if ($TimerId === false) $TimerId = @IPS_GetEventIDByName($Name, $ParentId);
		if ($TimerId === false) {
 			$TimerId = IPS_CreateEvent(1 /*Cyclic Event*/);
			IPS_SetName($TimerId, $Name);
			IPS_SetIdent($TimerId, Get_IdentByName($Name));
			IPS_SetParent($TimerId, $ParentId);
			if (!IPS_SetEventCyclic($TimerId, 2 /*Daily*/, 1 /*Int*/,0 /*Days*/,0/*DayInt*/,1/*TimeType Sec*/,$Seconds/*Sec*/)) {
				//echo "IPS_SetEventCyclic failed !!!@§@n";
				exit;
			}
			IPS_SetEventActive($TimerId, $Active);
			//echo §\'Created Timer §\'.$Name.§\'=§\'.$TimerId."@§@n";
		}
		return $TimerId;
	}

	/** Definieren "Minuten" Timers
	 *
	 * Anlegen eines Timers, der alle $Minutes Minuten ausgeführt wird
	 *
	 * @param string $Name Name des Timers
	 * @param integer $ParentId ID des übergeordneten Objekts im logischen Objektbaum
	 * @param integer $Minutes Intervall in Minuten
	 * @param boolean $Active Timer aktiv setzen
	 * @return integer ID des Timers
	 *
	 */
	function CreateTimer_CyclicByMinutes ($Name, $ParentId, $Minutes, $Active=true) {
		$TimerId = @IPS_GetObjectIDByIdent(Get_IdentByName($Name), $ParentId);
		if ($TimerId === false) $TimerId = @IPS_GetEventIDByName($Name, $ParentId);
		if ($TimerId === false) {
 			$TimerId = IPS_CreateEvent(1 /*Cyclic Event*/);
			IPS_SetName($TimerId, $Name);
			IPS_SetIdent($TimerId, Get_IdentByName($Name));
			IPS_SetParent($TimerId, $ParentId);
			if (!IPS_SetEventCyclic($TimerId, 2 /*Daily*/, 1 /*Unused*/,0 /*Unused*/,0/*Unused*/,2/*TimeType Minutes*/,$Minutes/*Minutes*/)) {
				//echo "IPS_SetEventCyclic failed !!!@§@n";
				exit;
			}
			IPS_SetEventActive($TimerId, $Active);
			//echo §\'Created Timer §\'.$Name.§\'=§\'.$TimerId."@§@n";
		}
		return $TimerId;
	}

	/** Anlegen eines Events
	 *
	 * Der Befehl erzeugt ein Event, das bei Änderungen der Variable $VariableId das Script
	 * mit der ID $ScriptId aufruft.
	 *
	 * @param string $Name Name des Events
	 * @param integer $VariableId ID der Variable auf der das Event definiert ist
	 * @param integer $ScriptId ID des Scripts das ausgeführt werden soll
	 * @param integer $TriggerType Type des Triggers 0=Bei Variablenaktualisierung, 1=Bei Variablenänderung, 2=Bei Grenzüberschreitung, 3=Bei Grenzunterschreitung
	 * @return integer ID des Events
	 *
	 */
	function CreateEvent ($Name, $VariableId, $ScriptId, $TriggerType=1/*ByChange*/) {
		$EventId = @IPS_GetObjectIDByIdent(Get_IdentByName($Name), $ScriptId);
		if ($EventId === false) $EventId = @IPS_GetEventIDByName ($Name,$ScriptId);
		if ($EventId === false) {
			$EventId = IPS_CreateEvent(0);
			IPS_SetName($EventId, $Name);
			IPS_SetIdent($EventId, Get_IdentByName($Name));
			IPS_SetEventTrigger($EventId, $TriggerType, $VariableId);
			IPS_SetParent($EventId, $ScriptId);
			IPS_SetEventActive($EventId, true);
			//echo "Created Event $Name=$EventId, trigger ScriptId=$ScriptId by Variable=$VariableId@§@n";
  		}
		return $EventId;
	}

	/** Anlegen eines Profils mit Associations
	 *
	 * der Befehl legt ein Profile an und erzeugt für die übergebenen Werte Assoziationen
	 *
	 * @param string $Name Name des Profiles
	 * @param string $Associations[] Array mit Wert und Namens Zuordnungen
	 * @param string $Icon Dateiname des Icons ohne Pfad/Erweiterung
	 * @param integer $Color[] Array mit Farbwerten im HTML Farbcode (z.b. 0x0000FF für Blau). Sonderfall: -1 für Transparent
	 * @param boolean $DeleteProfile Profile löschen und neu generieren
	 *
	 */
	function CreateProfile_Associations ($Name, $Associations, $Icon="", $Color=-1, $DeleteProfile=true) {
		if ($DeleteProfile) {
			@IPS_DeleteVariableProfile($Name);
		}
		@IPS_CreateVariableProfile($Name, 1);
		IPS_SetVariableProfileText($Name, "", "");
		IPS_SetVariableProfileValues($Name, 0, 0, 0);
		IPS_SetVariableProfileDigits($Name, 0);
		IPS_SetVariableProfileIcon($Name, $Icon);
		foreach($Associations as $Idx => $IdxName) {
			if ($IdxName == "") {
			  // Ignore
			} elseif (is_array($Color)) {
				IPS_SetVariableProfileAssociation($Name, $Idx, $IdxName, "", $Color[$Idx]);
		   } else {
				IPS_SetVariableProfileAssociation($Name, $Idx, $IdxName, "", $Color);
			}
		}
	}

	/** Anlegen eines Profils für boolsche Varaiblen
	 *
	 * Der Befehl legt ein Switch Profil an. Es können für den Zustand Ein bzw. Aus jeweils ein eigener
	 * Text, eine eigene Farbe und ein eigenes Icon gesetzt werden. Angabe von Icons und Farbe ist optional
	 *
	 * @param string $Name Name des Profiles
	 * @param string $DisplayFalse Text der für FALSE verwendet werden soll
	 * @param string $DisplayTrue Text der für TRUE verwendet werden soll
	 * @param string $Icon Dateiname des Icons ohne Pfad/Erweiterung
	 * @param integer $ColorOff Farbwert der für FALSE verwendet werden soll im HTML Farbcode (z.b. 0x0000FF für Blau). Sonderfall: -1 für Transparent
	 * @param integer $ColorOn Farbwert der für TRUE verwendet werden soll im HTML Farbcode (z.b. 0x0000FF für Blau). Sonderfall: -1 für Transparent
	 * @param string $IconOff Dateiname des Icons das für FALSE verwendet werden soll
	 * @param string $IconOn Dateiname des Icons das für TRUE verwendet werden soll
	 *
	 */
	function CreateProfile_Switch ($Name, $DisplayFalse, $DisplayTrue, $Icon="", $ColorOff=-1, $ColorOn=0x00ff00, $IconOff="", $IconOn="") {
		@IPS_CreateVariableProfile($Name, 1);
		IPS_SetVariableProfileText($Name, "", "");
		IPS_SetVariableProfileValues($Name, 0, 1, 1);
		IPS_SetVariableProfileDigits($Name, 0);
		IPS_SetVariableProfileIcon($Name, $Icon);
		IPS_SetVariableProfileAssociation($Name, 0, $DisplayFalse, $IconOff, $ColorOff);
		IPS_SetVariableProfileAssociation($Name, 1, $DisplayTrue,  $IconOn,  $ColorOn);
	}

	/** Anlegen eines Integer Profils
	 *
	 * Der Befehl legt ein Integer Profil an. Es kann ein Minimalwert, ein Maximalwert und eine Schrittweite
	 * angegeben werden.
	 *
	 * @param string $Name Name des Profiles
	 * @param integer $Start Der für die Visualisierung genutzte Minimalwert. Diese Soft-Limitation beeinflusst nicht den Variablenwert.
	 * @param integer $Step Die für die Visualisierung genutzte Schrittweite zur Erstellung der Sollwert-Veränderngsleiste. Eine Schrittweite von 0 aktiviert die Assoziationsliste.
	 * @param integer $Stop Der für die Visualisierung genutzte Maximalwert. Diese Soft-Limitation beeinflusst nicht den Variablenwert.
	 * @param string $Prefix Prefix für den Wert
	 * @param string $Suffix Suffix für den Wert
	 * @param string $Icon Dateiname des Icons
	 *
	 */
	function CreateProfile_Count ($Name, $Start=0, $Step=0, $Stop=0, $Prefix="", $Suffix="", $Icon="") {
		@IPS_CreateVariableProfile($Name, 1);
		IPS_SetVariableProfileText($Name, $Prefix, $Suffix);
		IPS_SetVariableProfileValues($Name, $Start, $Stop, $Step);
		IPS_SetVariableProfileDigits($Name, 0);
		IPS_SetVariableProfileIcon($Name, $Icon);
	}

	/** Existenz eines WebFront Konfigurator Items überprüfen
	 *
	 * Der Befehl überprüft ob ein bestimmtes Item im WebFront Konfigurator existiert
	 *
	 * @param integer $WFCId ID des WebFront Konfigurators
	 * @param string $ItemId Element Name im Konfigurator Objekt Baum
	 * @return boolean TRUE wenn das Item existiert anderenfalls FALSE
	 *
	 */
	function exists_WFCItem($WFCId, $ItemId) {
	   $ItemList = WFC_GetItems($WFCId);
	   foreach ($ItemList as $Item) {
	      if ($Item[§\'ID§\']==$ItemId) {
				return true;
	      }
	   }
	   return false;
	}

	//$ItemList = WFC_GetItems(57215 /*[Objekt #57215 existiert nicht]*/);
	//print_r($ItemList);

	/** Internal Function
	 */
	function PrepareWFCItemData (&$ItemId, &$ParentId, &$Title) {
		$ItemId   = str_replace(§\' §\',§\'_§\',$ItemId);
		$ParentId = str_replace(§\' §\',§\'_§\',$ParentId);
		//$ItemId   = str_replace(§\'_§\',§\'§\',$ItemId);
		//$ParentId = str_replace(§\'_§\',§\'§\',$ParentId);
		$Title    = utf8_encode($Title);
		$ItemId   = utf8_encode($ItemId);
		$ParentId = utf8_encode($ParentId);
	}

	function CreateWFCItem ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon, $ClassName, $Configuration) {
	   if (!exists_WFCItem($WFCId, $ItemId)) {
		   //echo "Add WFCItem=§\'$ItemId§\', Class=$ClassName, Config=$Configuration@§@n";
			WFC_AddItem($WFCId, $ItemId, $ClassName, $Configuration, $ParentId);
		}
		WFC_UpdateConfiguration($WFCId, $ItemId, $Configuration);
		WFC_UpdateParentID($WFCId, $ItemId, $ParentId);
		WFC_UpdatePosition($WFCId,$ItemId, $Position);
		IPS_ApplyChanges($WFCId);
	}

	/** Anlegen eines TabPanes im WebFront Konfigurator
	 *
	 * Der Befehl legt im WebFront Konfigurator ein TabPane mit dem Element Namen $ItemId an
	 *
	 * @param integer $WFCId ID des WebFront Konfigurators
	 * @param string $ItemId Element Name im Konfigurator Objekt Baum
	 * @param string $ParentId Übergeordneter Element Name im Konfigurator Objekt Baum
	 * @param string $Position Positionswert im Objekt Baum
	 * @param string $Title Title
	 * @param string $Icon Dateiname des Icons ohne Pfad/Erweiterung
	 *
	 */
	function CreateWFCItemTabPane ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon) {
		PrepareWFCItemData ($ItemId, $ParentId, $Title);
		$Configuration = "{@§@"title@§@":@§@"$Title@§@",@§@"name@§@":@§@"$ItemId@§@",@§@"icon@§@":@§@"$Icon@§@"}";
		CreateWFCItem ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon, §\'TabPane§\', $Configuration);
	}

	/** Anlegen eines SplitPanes im WebFront Konfigurator
	 *
	 * Der Befehl legt im WebFront Konfigurator ein SplitPane mit dem Element Namen $ItemId an
	 *
	 * @param integer $WFCId ID des WebFront Konfigurators
	 * @param string $ItemId Element Name im Konfigurator Objekt Baum
	 * @param string $ParentId Übergeordneter Element Name im Konfigurator Objekt Baum
	 * @param string $Position Positionswert im Objekt Baum
	 * @param string $Title Title
	 * @param string $Icon Dateiname des Icons ohne Pfad/Erweiterung
	 * @param string $Alignment Aufteilung der Container (0=horizontal, 1=vertical)
	 * @param integer $Ratio Größe der Container
	 * @param integer $RatioTarget Zuordnung der Größenangabe (0=erster Container, 1=zweiter Container)
	 * @param integer $RatioType Einheit der Größenangabe (0=Percentage, 1=Pixel)
	 * @param boolean $ShowBorder Zeige Begrenzungs Linie
	 *
	 */
	function CreateWFCItemSplitPane ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon="", $Alignment=0 /*0=horizontal, 1=vertical*/, $Ratio=50, $RatioTarget=0 /*0 or 1*/, $RatioType /*0=Percentage, 1=Pixel*/, $ShowBorder=§\'true§\' /*§\'true§\' or §\'false§\'*/) {
		PrepareWFCItemData ($ItemId, $ParentId, $Title);
		$Configuration = "{@§@"title@§@":@§@"$Title@§@",@§@"name@§@":@§@"$ItemId@§@",@§@"icon@§@":@§@"$Icon@§@",@§@"alignmentType@§@":$Alignment,@§@"ratio@§@":$Ratio,@§@"ratioTarget@§@":$RatioTarget,@§@"ratioType@§@":$RatioType,@§@"showBorder@§@":$ShowBorder}";
		CreateWFCItem ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon, §\'SplitPane§\', $Configuration);
	}

	/** Anlegen einer Kategorie im WebFront Konfigurator
	 *
	 * Der Befehl legt im WebFront Konfigurator eine Kategorie mit dem Element Namen $ItemId an
	 *
	 * @param integer $WFCId ID des WebFront Konfigurators
	 * @param string $ItemId Element Name im Konfigurator Objekt Baum
	 * @param string $ParentId Übergeordneter Element Name im Konfigurator Objekt Baum
	 * @param string $Position Positionswert im Objekt Baum
	 * @param string $Title Title
	 * @param string $Icon Dateiname des Icons ohne Pfad/Erweiterung
	 * @param integer $BaseId Kategorie ID im logischen Objektbaum
	 * @param boolean $BarBottomVisible Sichtbarkeit der Navigations Leiste
	 * @param boolean $BarColums
	 * @param boolean $BarSteps
	 * @param boolean $PercentageSlider
	 *
	 */
	function CreateWFCItemCategory ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon="", $BaseId /*ID of Category*/, $BarBottomVisible=§\'true§\' /*§\'true§\' or §\'false§\'*/, $BarColums=9, $BarSteps=5, $PercentageSlider=§\'true§\' /*§\'true§\' or §\'false§\'*/ ) {
		PrepareWFCItemData ($ItemId, $ParentId, $Title);
		$Configuration = "{@§@"title@§@":@§@"$Title@§@",@§@"name@§@":@§@"$ItemId@§@",@§@"icon@§@":@§@"$Icon@§@",@§@"baseID@§@":$BaseId,@§@"enumBarColumns@§@":$BarColums,@§@"selectorBarSteps@§@":$BarSteps,@§@"isBarBottomVisible@§@":$BarBottomVisible,@§@"enablePercentageSlider@§@":$PercentageSlider}";
		CreateWFCItem ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon, §\'Category§\', $Configuration);
	}

	/** Anlegen einer ExternalPage im WebFront Konfigurator
	 *
	 * Der Befehl legt im WebFront Konfigurator eine ExternalPage mit dem Element Namen $ItemId an
	 *
	 * @param integer $WFCId ID des WebFront Konfigurators
	 * @param string $ItemId Element Name im Konfigurator Objekt Baum
	 * @param string $ParentId Übergeordneter Element Name im Konfigurator Objekt Baum
	 * @param string $Position Positionswert im Objekt Baum
	 * @param string $Title Title
	 * @param string $Icon Dateiname des Icons ohne Pfad/Erweiterung
	 * @param string $PageUri URL der externen Seite
	 * @param boolean $BarBottomVisible Sichtbarkeit der Navigations Leiste
	 *
	 */
	function CreateWFCItemExternalPage ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon="", $PageUri, $BarBottomVisible=§\'true§\' /*§\'true§\' or §\'false§\'*/) {
		PrepareWFCItemData ($ItemId, $ParentId, $Title);
		$Configuration = "{@§@"title@§@":@§@"$Title@§@",@§@"name@§@":@§@"$ItemId@§@",@§@"icon@§@":@§@"$Icon@§@",@§@"pageUri@§@":@§@"$PageUri@§@",@§@"isBarBottomVisible@§@":$BarBottomVisible}";
		CreateWFCItem ($WFCId, $ItemId, $ParentId, $Position, $Title, $Icon, §\'ExternalPage§\', $Configuration);
	}

	/** Löschen eines kompletten Objektbaumes aus dem WebFront Konfigurator
	 *
	 * Der Befehl löscht im WebFront Konfigurator einen Teilbaum durch Angabe des Root Element Namens $ItemId
	 *
	 * @param integer $WFCId ID des WebFront Konfigurators
	 * @param string $ItemId Root Element Name im Konfigurator Objekt Baum
	 *
	 */
	function DeleteWFCItems($WFCId, $ItemId) {
		$ItemList = WFC_GetItems($WFCId);
		foreach ($ItemList as $Item) {
			if (strpos($Item[§\'ID§\'], $ItemId)===0) {
				////echo "Found WFC Item=§\'".$Item[§\'ID§\']."§\', Parent=§\'".$Item[§\'ParentID§\']."§\'@§@n";
				WFC_DeleteItem($WFCId, $Item[§\'ID§\']);
			}
		}
	}

	/** Löschen ein Element aus dem WebFront Konfigurator
	 *
	 * Der Befehl löscht im WebFront Konfigurator ein Element durch Angabe des Element Namens $ItemId
	 *
	 * @param integer $WFCId ID des WebFront Konfigurators
	 * @param string $ItemId Element Name im Konfigurator Objekt Baum
	 *
	 */
	function DeleteWFCItem($WFCId, $ItemId) {
		//echo "Delete WFC Item=§\'$ItemId§\'@§@n";
		WFC_DeleteItem($WFCId, $ItemId);
	}

	/** @}*/
?>
';
}

// Script "hue_include" ------------------------------------------------------------------------------------------------------
function hueinclude42584()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 23.04.2014 11:39 #####

/*
	Dieses Array enthält alle notwendigen
	Konfigurationsoptionen, Werte entsprechnd
	anpassen
*/
$config = array(
	               §\'hue_bridge_ip§\' => §\'192.168.178.220§\',
	               §\'hue_key§\' => §\'a749c289856847240649ec1799d73011§\'
	               );
/*
	Konfiguration Ende
*/
function hue_SendLampCommand($lampID, $cmd)
{
 	global $config;
	$json_url = §\'http://§\'.$config["hue_bridge_ip"].§\'/api/§\'.$config["hue_key"].§\'/lights/§\'.$lampID.§\'/state§\';
	$json_string = §\'{§\'.$cmd.§\'}§\';
	$ch = curl_init( $json_url );
	$options = array(
	               CURLOPT_RETURNTRANSFER => true,
	               CURLOPT_CUSTOMREQUEST => §\'PUT§\', // -X
	               CURLOPT_HTTPHEADER => array(§\'Content-type: application/json§\') ,
	               CURLOPT_POSTFIELDS => $json_string
	               );
	curl_setopt_array( $ch, $options );
	$result =  curl_exec($ch);
};

function hue_SendGroupCommand($groupID, $cmd)
{
	global $config;
	$json_url = §\'http://§\'.$config["hue_bridge_ip"].§\'/api/§\'.$config["hue_key"].§\'/groups/§\'.$groupID.§\'/action§\';
	$json_string = §\'{§\'.$cmd.§\'}§\';
	$ch = curl_init( $json_url );
	$options = array(
	               CURLOPT_RETURNTRANSFER => true,
	               CURLOPT_CUSTOMREQUEST => §\'PUT§\', // -X
	               CURLOPT_HTTPHEADER => array(§\'Content-type: application/json§\') ,
	               CURLOPT_POSTFIELDS => $json_string
	               );
	curl_setopt_array( $ch, $options );
	$result =  curl_exec($ch);
};


function getColorPointsForModel($model)
{
	$colorPoints = array();
	$hueBulbs = array("LCT001","LCT002","LCT003");
	$livingColors = array("LLC005","LLC006","LLC007","LLC011","LLC012","LLC013","LST001");

	if(in_array($model, $hueBulbs))
	{
		array_push($colorPoints, new cgpoint(0.674,0.322));
		array_push($colorPoints, new cgpoint(0.408,0.517));
		array_push($colorPoints, new cgpoint(0.168,0.041));
	}
	else if(in_array($model, $livingColors))
	{
		array_push($colorPoints, new cgpoint(0.703,0.296));
		array_push($colorPoints, new cgpoint(0.214,0.709));
		array_push($colorPoints, new cgpoint(0.139,0.081));
	}
	else
	{
		array_push($colorPoints, new cgpoint(1.0,0.0));
		array_push($colorPoints, new cgpoint(0.0,1.0));
		array_push($colorPoints, new cgpoint(0.0,0.0));
	}

	return $colorPoints;
};

function getDistanceBetweenTwoPoints($one, $two)
{
	$dx = $one->x - $two->x;
	$dy = $one->y - $two->y;
	$dist = sqrt($dx * $dx + $dy * $dy);
	return $dist;
}

function getClosestPointToPoints($A, $B, $P)
{
	$AP = new cgpoint($P->x - $A->x, $P->y - $A->y);
	$AB = new cgpoint($B->x - $A->x, $B->y - $A->y);
	$ab2 = $AB->x * $AB->x + $AB->y * $AB->y;
	$ap_ab = $AP->x * $AB->x + $AP->y * $AB->y;

	$t = $ap_ab / $ab2;
	if($t < 0.0)
	{
		$t = 0.0;
	}
	else if($t > 1.0)
	{
		$t = 1.0;
	}
	$newPoint = new cgpoint($A->x + $AB->x * $t, $A->y + $AB->y * $t);
	return $newPoint;
}

function getCrossProduct($p1, $p2)
{
	return ($p1->x * $p2->y - $p1->y * $p2->x);
}

function checkPointInLampsReach($p, $colorPoints)
{
	//print_r($colorPoints);
	$red = $colorPoints[0];
	$green = $colorPoints[1];
	$blue = $colorPoints[2];
	$grx =$green->x - $red->x;
	$gry =$green->y - $red->y;
	$brx =$blue->x - $red->x;
	$bry =$blue->y -$red->y;
	$prx =$p->x - $red->x;
	$pry =$p->y - $red->y;
	$v1 = new cgpoint($grx, $gry);
	$v2 = new cgpoint($brx, $bry);
	$q = new cgpoint($prx, $pry);

	$s = (getCrossProduct($q, $v2) / getCrossProduct($v1, $v2));
	$t = (getCrossProduct($v1, $q) / getCrossProduct($v1, $v2));
	//echo "S:".$s."/T:".$t;
	if(($s > 0.0) && ($t >= 0.0) && ($s + $t <= 1.0))
	{
		return true;
	}
	return false;
}

function calculateXY($color, $model)
{
	$red = round($color[0] / 255,2);
	$green = round($color[1] / 255,2);
	$blue = round($color[2] / 255,2);

	$r = ($red > 0.04045) ? pow(($red + 0.055) / (1.0 + 0.055), 2.4) : ($red / 12.92);
	$g = ($green > 0.04045) ? pow(($green + 0.055) / (1.0 + 0.055), 2.4) : ($green / 12.92);
	$b = ($blue > 0.04045) ? pow(($blue + 0.055) / (1.0 + 0.055), 2.4) : ($blue / 12.92);

	$X = $r * 0.649926 + $g * 0.103455 + $b * 0.197109;
	$Y = $r * 0.234327 + $g * 0.743075 + $b * 0.022598;
	$Z = $r * 0.0000000 + $g * 0.053077 + $b * 1.035763;
	if($X==0 && $Y ==0 && $Z ==0) $Z = 0.1;
	$cx  = $X / ($X + $Y + $Z);
	$cy  = $Y / ($X + $Y + $Z);
	if(is_nan($cx)) $cx = 0.0;
	if(is_nan($cy)) $cy = 0.0;

	$xyPoint = new cgpoint($cx, $cy);
	$colorPoints = getColorPointsForModel($model);
	$inReachOfLamps = checkPointInLampsReach($xyPoint, $colorPoints);

	if(!$inReachOfLamps)
	{
		$pAB = getClosestPointToPoints($colorPoints[0], $colorPoints[1], $xyPoint);
		$pAC = getClosestPointToPoints($colorPoints[2], $colorPoints[0], $xyPoint);
		$pBC = getClosestPointToPoints($colorPoints[1], $colorPoints[2], $xyPoint);

		$dAB = getDistanceBetweenTwoPoints($xyPoint, $pAB);
		$dAC = getDistanceBetweenTwoPoints($xyPoint, $pAC);
		$dBC = getDistanceBetweenTwoPoints($xyPoint, $pBC);

		$lowest = $dAB;
		$closestPoint = $pAB;

		if($dAC < $lowest)
		{
			$lowest = $dAC;
			$closestPoint = $pAC;
		}
		if($dBC < $lowest)
		{
			$lowest = $dBC;
			$closestPoint = $pBC;
		}

		$cx = $closestPoint->x;
		$cy = $closestPoint->y;
	}
	return new cgpoint($cx, $cy);
}

function colorfromXYsimple($xy, $bri, $model)
{
   $colorPoints = getColorPointsForModel($model);
	$inReachOfLamps = checkPointInLampsReach($xy, $colorPoints);

	if(!$inReachOfLamps)
	{
		$pAB = getClosestPointToPoints($colorPoints[0], $colorPoints[1], $xy);
		$pAC = getClosestPointToPoints($colorPoints[2], $colorPoints[0], $xy);
		$pBC = getClosestPointToPoints($colorPoints[1], $colorPoints[2], $xy);

		$dAB = getDistanceBetweenTwoPoints($xy, $pAB);
		$dAC = getDistanceBetweenTwoPoints($xy, $pAC);
		$dBC = getDistanceBetweenTwoPoints($xy, $pBC);

		$lowest = $dAB;
		$closestPoint = $pAB;

		if($dAC < $lowest)
		{
			$lowest = $dAC;
			$closestPoint = $pAC;
		}
		if($dBC < $lowest)
		{
			$lowest = $dBC;
			$closestPoint = $pBC;
		}

		$xy->x = $closestPoint->x;
		$xy->y = $closestPoint->y;
	}
	$x = $xy->x;
	$y = $xy->y;
	$z = 1.0 - $x - $y;
	$Y = $bri/255;
	$X = ($Y / $y) * $x;
	$Z = ($Y / $y) * $z;
	//echo "xyB: ".$x."/".$y."/".$Y."...";
	/*$r = $X * 1.612 - $Y * 0.203 - $Z * 0.302;
	$g = -$X * 0.509 + $Y * 1.412 + $Z * 0.066;
	$b = $X * 0.026 - $Y * 0.072 + $Z * 0.962;*/

	$r = 0.7982 * $X + 0.3389 * $Y - 0.1371 * $Z;
	$g = -0.5918 * $X + 1.5512 * $Y + 0.0406 * $Z;
	$b = 0.0008 * $X + 0.0239 * $Y + 0.9753 * $Z;

	$r = $r <= 0.0031308 ? 12.92 * $r : (1.0 + 0.055) * pow($r, (1.0 / 2.4)) - 0.055;
	$g = $g <= 0.0031308 ? 12.92 * $g : (1.0 + 0.055) * pow($g, (1.0 / 2.4)) - 0.055;
	$b = $b <= 0.0031308 ? 12.92 * $b : (1.0 + 0.055) * pow($b, (1.0 / 2.4)) - 0.055;


	if($r >1 || $g > 1 || $b >1)
	{
		$max = max($r,$g,$b);
		$r = $r / $max;
		$g = $g / $max;
		$b = $b / $max;
	}
	//echo "RGB: ".$r."/".$g."/".$b."@§@n";

	$color = array();
	array_push($color, round(cap($r) * 255));
	array_push($color, round(cap($g) * 255));
	array_push($color, round(cap($b) * 255));
	return $color;
}

function colorFromXY($xy, $model)
{
	$colorPoints = getColorPointsForModel($model);
	$inReachOfLamps = checkPointInLampsReach($xy, $colorPoints);

	if(!$inReachOfLamps)
	{
		$pAB = getClosestPointToPoints($colorPoints[0], $colorPoints[1], $xy);
		$pAC = getClosestPointToPoints($colorPoints[2], $colorPoints[0], $xy);
		$pBC = getClosestPointToPoints($colorPoints[1], $colorPoints[2], $xy);

		$dAB = getDistanceBetweenTwoPoints($xy, $pAB);
		$dAC = getDistanceBetweenTwoPoints($xy, $pAC);
		$dBC = getDistanceBetweenTwoPoints($xy, $pBC);

		$lowest = $dAB;
		$closestPoint = $pAB;

		if($dAC < $lowest)
		{
			$lowest = $dAC;
			$closestPoint = $pAC;
		}
		if($dBC < $lowest)
		{
			$lowest = $dBC;
			$closestPoint = $pBC;
		}

		$xy->x = $closestPoint->x;
		$xy->y = $closestPoint->y;
	}

	$x = $xy->x;
	$y = $xy->y;
	$z = 1.0 - $x - $y;

	$Y = 1.0;
	$X = ($Y / $y) * $x;
	$Z = ($Y / $y) * $z;

	/*$r = $X * 1.612 - $Y * 0.203 - $Z * 0.302;
	$g = -$X * 0.509 + $Y * 1.412 + $Z * 0.066;
	$b = $X * 0.026 - $Y * 0.072 + $Z * 0.962;
	*/
	$r = $X * 3.2406 - $Y * 1.5372 - $Z * 0.4986;
	$g = -$X * 0.989 + $Y * 1.8758 + $Z * 0.0415;
	$b = $X * 0.0557 - $Y * 0.2040 + $Z * 1.0570;


	if($r > $b && $r > $g && $r > 1.0)
	{
		$g = $g / $r;
		$b = $b / $r;
		$r = 1.0;
	}
	else if($g > $b && $g > $r && $g > 1.0)
	{
		$r = $r / $g;
		$b = $b / $g;
		$g = 1.0;
	}
	else if($b > $r && $b > $g && $b > 1.0)
	{
		$r = $r / $b;
		$g = $g / $b;
		$b = 1.0;
	}

	$r = $r <= 0.0031308 ? 12.92 * $r : (1.0 + 0.055) * pow($r, (1.0 / 2.4)) - 0.055;
	$g = $g <= 0.0031308 ? 12.92 * $g : (1.0 + 0.055) * pow($g, (1.0 / 2.4)) - 0.055;
	$b = $b <= 0.0031308 ? 12.92 * $b : (1.0 + 0.055) * pow($b, (1.0 / 2.4)) - 0.055;

	if($r > $b && $r > $g)
	{
		if($r > 1.0)
		{
			$g = $g / $r;
			$b = $b / $r;
			$r = 1.0;
		}
	}
	else if($g > $b && $g > $r)
	{
		if($g > 1.0)
		{
			$r = $r / $g;
			$b = $b / $g;
			$g = 1.0;
		}
	}
	else if($b > $r && $b > $g)
	{
		if($b > 1.0)
		{
			$r = $r / $b;
			$g = $g / $b;
			$b = 1.0;
		}
	}
	$color = array();
	array_push($color, round($r * 255));
	array_push($color, round($g * 255));
	array_push($color, round($b * 255));

	return $color;
}

function cap($v)
{
	return max(0,min(1,$v));
}


class cgpoint
{
	public $x;
	public $y;
	function __construct($_x, $_y) {
      $this->x = $_x;
	   $this->y = $_y;
	   //echo "CG x:".$_x.", y:".$_y;
   }
};

?>
';
}

// Script "hue_ActionScene" ------------------------------------------------------------------------------------------------------
function hueActionScene45489()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 23.04.2014 11:39 #####

if(file_exists(IPS_GetKernelDir()."@§@@§@scripts@§@@§@IPSInstaller.ips.php"))
	require_once(IPS_GetKernelDir()."@§@@§@scripts@§@@§@IPSInstaller.ips.php");
INCLUDE ("hue_include.ips.php");

Switch ($_IPS[§\'SENDER§\'])
	{
	Default:
	Case "RunScript":
	Case "Execute":
	Case "TimerEvent":
		break;

	Case "Variable":
	Case "WebFront": 	   // Zum schalten im Webfront
		$d = date("d.m.Y").", ".date("H:i:s");
		$action_script = IPS_GetObjectIDByName("hue_ActionCallScene", IPS_GetParent($_IPS[§\'SELF§\']));
		$item = @CreateInstance("Szene ".$d, IPS_GetParent($_IPS[§\'VARIABLE§\']), "{485D0419-BE97-4548-AA9C-C083EB82E61E}", $Position=1);
      @IPS_SetIdent ($item, $d);
      $json_url = §\'http://§\'.$config["hue_bridge_ip"].§\'/api/§\'.$config["hue_key"];
		$ch = curl_init( $json_url );
		$options = array(
               CURLOPT_RETURNTRANSFER => true,
               CURLOPT_CUSTOMREQUEST => §\'GET§\', // -X
               CURLOPT_HTTPHEADER => array(§\'Content-type: application/json§\') ,
               );
		curl_setopt_array( $ch, $options );
		$json_result =  curl_exec($ch);
		$result = json_decode($json_result);
      $id = 0;
		foreach ($result->lights as $light) {
			$id=$id+1;
			$onstate = "false";
			if($light->state->on == true) $onstate = "true";
			hue_saveLightState($id, $item, $light->name, $onstate, $light->state->bri, $light->state->xy[0], $light->state->xy[1]);
      }
      CreateVariable("Szene aktivieren", 1, $item, 0, "hue_ActivateScene", $action_script,1);
	}

	function hue_saveLightState($id, $parentID, $name, $on, $bri, $x, $y){
		//if($on == 0) $settings = $id.§\'#"on":§\'.$on;
		 $settings = $id.§\'#"on":§\'.$on.§\',"bri":§\'.$bri.§\',"xy":[§\'.$x.§\',§\'.$y.§\']§\';
		$item = @IPS_SetHidden(CreateVariable("Settings ".$name, 3, $parentID, 0, "~String", "",$settings), True);

	return $item;
}
?>
';
}

// Script "hue_query" ------------------------------------------------------------------------------------------------------
function huequery49829()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 23.04.2014 11:39 #####


include("hue_include.ips.php");
include("IPSInstaller.ips.php");

$json_url = §\'http://§\'.$config[§\'hue_bridge_ip§\'].§\'/api/§\'.$config[§\'hue_key§\'];
$ch = curl_init( $json_url );
$options = array(
               CURLOPT_RETURNTRANSFER => true,
               CURLOPT_CUSTOMREQUEST => §\'GET§\', // -X
               CURLOPT_HTTPHEADER => array(§\'Content-type: application/json§\') ,
               );
curl_setopt_array( $ch, $options );

// Getting results
$json_result =  curl_exec($ch);
$result = json_decode($json_result);

$idCatLights = CreateCategory("Lampen",IPS_GetParent($_IPS[§\'SELF§\']),0);
$idCatGroups = CreateCategory("Lampengruppen",IPS_GetParent($_IPS[§\'SELF§\']),0);
$idCatScenes = CreateCategory("Szenen",IPS_GetParent($_IPS[§\'SELF§\']),0);

$id = 0;
foreach ($result->lights as $light) {
	$id=$id+1;
   $myLight = hue_createLight($id, $idCatLights, utf8_decode ($light->name));

	SetValue(IPS_GetVariableIDByName ("Status", $myLight),$light->state->on);
	SetValue(IPS_GetVariableIDByName ("Erreichbar", $myLight),$light->state->reachable);
	SetValue(IPS_GetVariableIDByName ("Hue", $myLight),$light->state->hue);
	SetValue(IPS_GetVariableIDByName ("ModelID", $myLight),$light->modelid);
	SetValue(IPS_GetVariableIDByName ("X", $myLight),$light->state->xy[0]);
	SetValue(IPS_GetVariableIDByName ("Y", $myLight),$light->state->xy[1]);
	//$colors = colorFromXY(new cgpoint($light->state->xy[0],$light->state->xy[1]), $light->modelid);
	$colors = colorFromXYsimple(new cgpoint($light->state->xy[0],$light->state->xy[1]), $light->state->bri, $light->modelid);
	$colhex = dechex($colors[0]).dechex($colors[1]).dechex($colors[2]);
	SetValue(IPS_GetVariableIDByName ("Farbe", $myLight),hexdec($colhex));
	if(isset($light->state->ct))
	{
		SetValue(IPS_GetVariableIDByName ("Temperatur", $myLight),$light->state->ct);
 	}
 	SetValue(IPS_GetVariableIDByName ("Helligkeit", $myLight),$light->state->bri);
	SetValue(IPS_GetVariableIDByName ("Sättigung", $myLight),$light->state->sat);
}
$id = 0;
foreach ($result->groups as $group) {
	$id=$id+1;
	//print_r($group);

   $myGroup = hue_createGroup($id, $idCatGroups, utf8_decode ($group->name));
	SetValue(IPS_GetVariableIDByName ("Status", $myGroup),$group->action->on);
	SetValue(IPS_GetVariableIDByName ("Hue", $myGroup),$group->action->hue);
	if(isset($group->action->ct)) SetValue(IPS_GetVariableIDByName ("Temperatur", $myGroup),$group->action->ct);
	SetValue(IPS_GetVariableIDByName ("Helligkeit", $myGroup),$group->action->bri);
	SetValue(IPS_GetVariableIDByName ("Sättigung", $myGroup),$group->action->sat);
	//echo $group->action->xy[0]."xx";
	SetValue(IPS_GetVariableIDByName ("X", $myGroup),$group->action->xy[0]);
	SetValue(IPS_GetVariableIDByName ("Y", $myGroup),$group->action->xy[1]);
	SetValue(IPS_GetVariableIDByName ("Effekt", $myGroup),$group->action->effect);
	SetValue(IPS_GetVariableIDByName ("Modus", $myGroup),$group->action->colormode);
	//SetValue(IPS_GetVariableIDByName ("Übergangszeit", $myGroup),$group->action->transitiontime);



}

function hue_createLight($id, $parentID, $name){
	$action_script = IPS_GetObjectIDByName("hue_Action", IPS_GetParent($parentID));
	$item = @CreateInstance($name, $parentID, "{485D0419-BE97-4548-AA9C-C083EB82E61E}", $Position=0);
	$id_info = IPS_GetObject($item);
	@IPS_SetIdent ($item, $id);
	// CreateVariable ($Name, $Type, $Parent, $Position, $Profile, $Action=0, $ValueDefault=§\'§\', $Icon="")
	@CreateVariable("Erreichbar", 0, $item, 0, "~Switch", "", false);
	@CreateVariable("Status", 0, $item, 0, "~Switch", $action_script, false);
	@CreateVariable("Farbe", 1, $item, 1, "~HexColor", $action_script, false);
	@CreateVariable("Helligkeit", 1, $item, 2, "~Intensity.255", $action_script,254);
	@IPS_SetHidden(CreateVariable("Hue", 1, $item, 0, "hue_Hue", $action_script,254), True);
	@IPS_SetHidden(CreateVariable("ID", 1, $item, 0, "", null,$id), True);
	@IPS_SetHidden(CreateVariable("ModelID",3, $item, 0, "", null,""), True);
	@IPS_SetHidden(CreateVariable("X", 2, $item, 0, "hue_xy", $action_script,0.1), True);
	@IPS_SetHidden(CreateVariable("Y", 2, $item, 0, "hue_xy", $action_script,0.1), True);

	@IPS_SetHidden(CreateVariable("Temperatur", 1, $item, 0, "hue_Temperatur", $action_script,500), True);
	@CreateVariable("Sättigung", 1, $item, 5, "~Intensity.255", $action_script,254);
	return $item;
}

function hue_createGroup($id, $parentID, $name){
	$action_script = IPS_GetObjectIDByName("hue_ActionGroup", IPS_GetParent($parentID));
	$item = @CreateInstance($name, $parentID, "{485D0419-BE97-4548-AA9C-C083EB82E61E}", $Position=0);
	$id_info = IPS_GetObject($item);
	@IPS_SetIdent ($item, $id);
	@CreateVariable("Status", 0, $item, 0, "~Switch", $action_script, false);
	@CreateVariable("Farbe", 1, $item, 1, "~HexColor", $action_script, false);
	@CreateVariable("Helligkeit", 1, $item, 2, "~Intensity.255", $action_script,254);
	@IPS_SetHidden(CreateVariable("Hue", 1, $item, 3, "hue_Hue", $action_script,254), True);
	@IPS_SetHidden(CreateVariable("ID", 1, $item, 0, "", null,$id), True);
	@IPS_SetHidden(CreateVariable("Temperatur", 1, $item, 4, "hue_Temperatur", $action_script,500), True);
	@CreateVariable("Sättigung", 1, $item, 5, "~Intensity.255", $action_script,254);
	@IPS_SetHidden(CreateVariable("X", 2, $item, 0, "hue_xy", $action_script,0.1), True);
	@IPS_SetHidden(CreateVariable("Y", 2, $item, 0, "hue_xy", $action_script,0.1), True);
	@IPS_SetHidden(CreateVariable("Effekt", 3, $item, 0, "hue_effect", $action_script,"none"), True);
	@IPS_SetHidden(CreateVariable("Modus", 3, $item, 0, "hue_colormode", $action_script,"xy"), True);
	@IPS_SetHidden(CreateVariable("Übergangszeit", 1, $item, 0, "hue_transition", $action_script,4), True);
	return $item;
}

?>
';
}

// Script "Hue Key" ------------------------------------------------------------------------------------------------------
function HueKey51763()
{
return
' <?
 ##### Project Exporter Comment: Script Version Stand 23.04.2014 11:39 #####


/*

    PhilIPS hue LED User und Device Registierung
    Ersteller: peterchrisben
    Datum: 08.02.2013
    Version: 0.1

*/


$bridge_ip = §\'192.168.178.220§\'; // Hier die IP der Bridge eintragen
$username = §\'vfbfigo§\'; // Hier einen Benutzername eintragen...
$devicename = §\'PhilIPShue§\'; // ... oder IPS API etc.



function setUsername($username)
    {
        // Hash username if not already in hash format
        if (!preg_match(§\'/[a-f0-9]{32}/i§\', $username)) {
            $username = md5($username);
        }

        return $username;
    }


            $json_url = §\'http://§\'.$bridge_ip.§\'/api§\';
//            $json_string = §\'{"transitiontime":10,"xy":[§\'.(rand(1,900)/1000).§\',§\'.(rand(1,900)/1000).§\'],"bri":§\'.rand(1,255).§\',"ct":§\'.rand(1,400).§\'}§\';
//            $json_string = §\'{"on":false}§\';
         //$json_string = §\'{"on":true, "bri": 150}§\';

            $json_string = §\'{"username": "§\'.setUsername($username).§\'", "devicetype": "IPS API"}§\';




            $ch = curl_init( $json_url );
            // Configuring curl options
            $options = array(
                            CURLOPT_RETURNTRANSFER => true,
                            CURLOPT_CUSTOMREQUEST => §\'POST§\', // -X
                            CURLOPT_HTTPHEADER => array(§\'Content-type: application/json§\') ,
                            CURLOPT_POSTFIELDS => $json_string
                            );

            sleep(10);

            // Setting curl options
            curl_setopt_array( $ch, $options );

            // Getting results
            $result =  curl_exec($ch);


        print $result."@§@n";




?>
';
}

?>


Gut, dass man auf einem iPhone schnell scrollen kann. :wink:

Warum hängst nicht einfach eine Textdatei ran statt 100 Seiten Code zu posten?

Sent from my iPhone using Tapatalk