Abfrage & Steuerung von Viessmann Heizungen

Moin Moin,

ich habe es mit eurer Anleitung nun ebenfalls geschaft die Wert aus der Heizung abzufragen, nun hab ich zwar noch das Problem das meine Raum Soll Temp bei 6500° liegt aber ich denke da könnt ihr mit helfen.

Die Anleitung aus Coyotes Post habe ich genutzt um die
ViessmannDeviceOutputHandlingKW
ViessmannDeviceTools.inc
ViessmannVariables.inc

von Thomas genutzt weil ich dachte die Umrechnung der Fehlerhaften werte ist damit automatisch gegeben.

Wie bekomme ich mit der Umrechnung hin , oder hab ich nur was übersehen ?

Moin Moin,

auf die Frage gibts wohl keine Antwort mehr , dann stell ich mal eine neue :slight_smile:

im V-Control 125 , kann man umschalten zwischen :

Abschaltbetrieb
Nur WW
WW - Heizen
Immer Tagesbetrieb
immer Absenkbetrieb

, wie geht das mit IPS ?

Hi,

schade, dass es hier nicht so richtig weiter geht… Ich komme mit meiner Heizung auch nicht so richtig zu Rande. Viele Werte bekomme ich einfach nicht ausgelesen. Zum Beispiel hätte ich vor einigen Wochen die Störung gerne vorher gewusst, bevor meine Frau unter der Dusche plötzlich kaltes Wasser hatte… Kein Druck in der Heizung = Notbetrieb :mad:

Bezgl. Deiner Frage: Betriebsarten und Partymodus schalte ich so:

<?
//$zugriff = GetValue (30593 /*[Objekt #30593 existiert nicht]*/ );
if($IPS_SENDER == "WebFront")

{
    include( "ViessmannDeviceTools.inc.php" );

    switch($IPS_VALUE)
    {

          case 0:
                //if ($zugriff == 0)
                {
                     ViessmannOpen();
							ViessmannSetData( "BetriebsartA1M1", chr(0x00) );
                     IPS_Sleep(200);
                     ViessmannClose();
                    	SetValue(38479 /*[Allgemein\Heizung\Heizung Ausgabe\Betriesartschalter\BetriebsString]*/ , "aus");
                		SetValue($IPS_VARIABLE, $IPS_VALUE);
                }

        break;

        		case 1:
                //if ($zugriff == 0)
                {
                      ViessmannOpen();
                     ViessmannSetData( "BetriebsartA1M1", chr(0x01) );
                     IPS_Sleep(200);
                     ViessmannClose();
                     SetValue(38479 /*[Allgemein\Heizung\Heizung Ausgabe\Betriesartschalter\BetriebsString]*/ , "WW");
                     SetValue($IPS_VARIABLE, $IPS_VALUE);
                 }
             break;

             case 2:
           		// if ($zugriff == 0)
                {
                      ViessmannOpen();
                     ViessmannSetData( "BetriebsartA1M1", chr(0x02) );
                     ViessmannClose();
                     SetValue(38479 /*[Allgemein\Heizung\Heizung Ausgabe\Betriesartschalter\BetriebsString]*/ , "Hz+WW");
                     SetValue($IPS_VARIABLE, $IPS_VALUE);
                 }
             break;
             
             case 3:
           	 		//if ($zugriff == 0)
                {
                      ViessmannOpen();
                     ViessmannSetData( "BetriebsartA1M1", chr(0x03) );
                     ViessmannClose();
                     SetValue(38479 /*[Allgemein\Heizung\Heizung Ausgabe\Betriesartschalter\BetriebsString]*/ , "reduziert");
                     SetValue($IPS_VARIABLE, $IPS_VALUE);
                 }
             break;
             
             case 4:
           	 		//if ($zugriff == 0)
                {
                      ViessmannOpen();
                     ViessmannSetData( "BetriebsartA1M1", chr(0x04) );
                     ViessmannClose();
                     SetValue(38479 /*[Allgemein\Heizung\Heizung Ausgabe\Betriesartschalter\BetriebsString]*/ , "normal");
                     SetValue($IPS_VARIABLE, $IPS_VALUE);
                 }
             break;

}}
?>

Du musst dieses Skript einem zu erstellenden Schalter zuweisen. Ich glaube, dazu musst Du eine Variable anlegen (Integer) ein neues Profil erstellen mit der Anzahl der Optionen, die du im Skript als Case definierst… Und als Aktion obiges Skript zuweisen…

Das kann ein PHP Profi bestimmt besser erklären. Bin nach über zwei Jahren IPS immer noch Anfänger :wink:

Sei vorsichtig mit den ViessmannSetData Schreibzugriffen auf die Heizung! Alles auf eigene Gefahr. Ich hab keine Ahnung, was passiert wenn man die falschen Datenpunkte erwischt!?!

Hoffe, etwas geholfen zu haben…

Moin Moin ,

leider echt tote Hose hier , ich bin leider 100km von der Heizung entfernt und lasse jetzt jemanden hinfahren der gucken soll ob die Signale vom IPS an der Anlage gezeigt werden.

im Webfront bekomme ich einen Fehler angezeigt , aber nur das Kreuz und keine Info dazu .Im Normalfall sollte das ja kein Hexenwerk sein mit dem Senden.

Wenn es fertig ist , würde ich meinen das ich mein Projekt mal mit dem Exporter von Raketenschnecke hier einstelle und so haben alle was davon .

Moin Moin,

Die Steuerung funktioniert .Im verlauf findet ihr den Export von meinem Projekt , das euch den Seriellen Port mit allen Variablen anlegt und das Heizungssteuerungs Script , das im zweiten Teil ist , installiert wird.

Export zum Anlegen des Seriellen Ports , dort muss dann einfach nur noch euer Com Port eingetragen werden


<?
/**********************************************************************************************************************
*  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: Viessmann Heizung Serial Port (Quell-ID: 53482), generated on 30.07.2014, 12:56 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 Viessmann Heizung Serial Port (Quell-ID: 53482) vom 30.07.2014 12:56 #####

// 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'], 'Viessmann Heizung Serial Port (Quell-ID: 53482) 2014_07_30-12_56'.', 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,53482 /*[Viessmann Heizung Serial Port]*/;HasChildren,1;ObjectIcon,;ObjectID,53482 /*[Viessmann Heizung Serial Port]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Viessmann Heizung Serial Port;ObjectPosition,0;ObjectSummary,COM5 (4800,8,2,Even);ObjectType,1;ParentID,0;isConfigTree,0;ConnectionID,0;InstanceID,53482 /*[Viessmann Heizung Serial Port]*/;InstanceStatus,104;LastChange,0;ModuleID,{6DC3D946-0D31-450F-A8C6-C42DB8D7D4F1};ModuleName,Serial Port;ModuleType,1;
ObjectID,56186 /*[Viessmann Heizung Serial Port\Viessmann Register Variable]*/;HasChildren,1;ObjectIcon,;ObjectID,56186 /*[Viessmann Heizung Serial Port\Viessmann Register Variable]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Viessmann Register Variable;ObjectPosition,0;ObjectSummary,;ObjectType,1;ParentID,53482 /*[Viessmann Heizung Serial Port]*/;isConfigTree,0;ConnectionID,53482 /*[Viessmann Heizung Serial Port]*/;InstanceID,56186 /*[Viessmann Heizung Serial Port\Viessmann Register Variable]*/;InstanceStatus,102;LastChange,0;ModuleID,{F3855B3C-7CD6-47CA-97AB-E66D346C037F};ModuleName,Register Variable;ModuleType,3;
ObjectID,35796 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\ErrorCount]*/;HasChildren,;ObjectIcon,;ObjectID,35796 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\ErrorCount]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,ErrorCount;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,56186 /*[Viessmann Heizung Serial Port\Viessmann Register Variable]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406716521;VariableCustomAction,0;VariableCustomProfile,;VariableID,35796 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\ErrorCount]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406716521;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,1;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,42628 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\Rückgabewert]*/;HasChildren,;ObjectIcon,;ObjectID,42628 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\Rückgabewert]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Rückgabewert;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,56186 /*[Viessmann Heizung Serial Port\Viessmann Register Variable]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406717721;VariableCustomAction,0;VariableCustomProfile,~String;VariableID,42628 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\Rückgabewert]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717721;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,3;ValueVariant,;LoggingStatus,1;AggregationType,0;GraphStatus,1;
ObjectID,49172 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\Verbindung ok]*/;HasChildren,;ObjectIcon,;ObjectID,49172 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\Verbindung ok]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Verbindung ok;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,56186 /*[Viessmann Heizung Serial Port\Viessmann Register Variable]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406717707;VariableCustomAction,0;VariableCustomProfile,;VariableID,49172 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\Verbindung ok]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717721;ValueBoolean,1;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,0;ValueVariant,;LoggingStatus,1;AggregationType,0;GraphStatus,1;
ObjectID,57385 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\Steuerungstyp]*/;HasChildren,;ObjectIcon,;ObjectID,57385 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\Steuerungstyp]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Steuerungstyp;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,56186 /*[Viessmann Heizung Serial Port\Viessmann Register Variable]*/;isConfigTree,0;VariableAction,0;VariableChanged,1404392941;VariableCustomAction,0;VariableCustomProfile,;VariableID,57385 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\Steuerungstyp]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1404392941;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,3;ValueVariant,;LoggingStatus,1;AggregationType,0;GraphStatus,1;
ObjectID,58616 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\Kommando]*/;HasChildren,;ObjectIcon,;ObjectID,58616 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\Kommando]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Kommando;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,56186 /*[Viessmann Heizung Serial Port\Viessmann Register Variable]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406717721;VariableCustomAction,0;VariableCustomProfile,;VariableID,58616 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\Kommando]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717721;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,3;ValueVariant,;LoggingStatus,1;AggregationType,0;GraphStatus,1;
';
$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,~String;Digits,0;Icon,;IsReadOnly,1;MaxValue,0;MinValue,0;Prefix,;ProfileType,3;StepSize,0;Suffix,;|
';
$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 ############################################################################################################

?>


Die Heizungssteuerung


<?
/**********************************************************************************************************************
*  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: Heizung (Quell-ID: 24978), generated on 30.07.2014, 12:55 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 Heizung (Quell-ID: 24978) vom 30.07.2014 12:55 #####

// 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'], 'Heizung (Quell-ID: 24978) 2014_07_30-12_55'.', 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,24978 /*[Funktionen\Heizung]*/;HasChildren,1;ObjectIcon,;ObjectID,24978 /*[Funktionen\Heizung]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Heizung;ObjectPosition,5;ObjectSummary,;ObjectType,0;ParentID,31230 /*[Funktionen]*/;isConfigTree,0;
ObjectID,20977 /*[Funktionen\Heizung\Vorlauftemperatur]*/;HasChildren,;ObjectIcon,;ObjectID,20977 /*[Funktionen\Heizung\Vorlauftemperatur]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Vorlauftemperatur;ObjectPosition,4;ObjectSummary,;ObjectType,6;ParentID,24978 /*[Funktionen\Heizung]*/;isConfigTree,0;LinkChildID,22474 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Vorlauftemperatur]*/;LinkID,20977 /*[Funktionen\Heizung\Vorlauftemperatur]*/;TargetID,22474 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Vorlauftemperatur]*/;TargetName,Vorlauftemperatur;
ObjectID,23090 /*[Funktionen\Heizung\Aktueller Modus]*/;HasChildren,;ObjectIcon,;ObjectID,23090 /*[Funktionen\Heizung\Aktueller Modus]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Aktueller Modus;ObjectPosition,2;ObjectSummary,;ObjectType,2;ParentID,24978 /*[Funktionen\Heizung]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406697437;VariableCustomAction,0;VariableCustomProfile,~HTMLBox;VariableID,23090 /*[Funktionen\Heizung\Aktueller Modus]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406697437;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,3;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,27399 /*[Funktionen\Heizung\Viessmann Steuerung]*/;HasChildren,1;ObjectIcon,;ObjectID,27399 /*[Funktionen\Heizung\Viessmann Steuerung]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,1;ObjectIsReadOnly,;ObjectName,Viessmann Steuerung;ObjectPosition,0;ObjectSummary,;ObjectType,0;ParentID,24978 /*[Funktionen\Heizung]*/;isConfigTree,0;
ObjectID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;HasChildren,1;ObjectIcon,;ObjectID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,1;ObjectIsReadOnly,;ObjectName,Ausgabe;ObjectPosition,0;ObjectSummary,;ObjectType,0;ParentID,27399 /*[Funktionen\Heizung\Viessmann Steuerung]*/;isConfigTree,0;
ObjectID,20154 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Raum Soll Temperatur]*/;HasChildren,;ObjectIcon,;ObjectID,20154 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Raum Soll Temperatur]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Raum Soll Temperatur;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406539384;VariableCustomAction,0;VariableCustomProfile,~Temperature;VariableID,20154 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Raum Soll Temperatur]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717405;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,2;ValueVariant,;LoggingStatus,1;AggregationType,0;GraphStatus,1;
ObjectID,22474 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Vorlauftemperatur]*/;HasChildren,;ObjectIcon,;ObjectID,22474 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Vorlauftemperatur]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Vorlauftemperatur;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406717417;VariableCustomAction,0;VariableCustomProfile,~Temperature;VariableID,22474 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Vorlauftemperatur]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717417;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,2;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,23092 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Uhrzeit]*/;HasChildren,;ObjectIcon,;ObjectID,23092 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Uhrzeit]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Uhrzeit;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,1404459072;VariableCustomAction,0;VariableCustomProfile,integer_dummy;VariableID,23092 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Uhrzeit]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717420;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,1;ValueVariant,;LoggingStatus,1;AggregationType,0;GraphStatus,1;
ObjectID,28759 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\AktuelleBetriebsartA1M]*/;HasChildren,;ObjectIcon,;ObjectID,28759 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\AktuelleBetriebsartA1M]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,AktuelleBetriebsartA1M;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406274472;VariableCustomAction,0;VariableCustomProfile,;VariableID,28759 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\AktuelleBetriebsartA1M]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717408;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,3;ValueVariant,;LoggingStatus,1;AggregationType,0;GraphStatus,1;
ObjectID,28911 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Kesseltemperatur]*/;HasChildren,;ObjectIcon,;ObjectID,28911 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Kesseltemperatur]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Kesseltemperatur;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406717105;VariableCustomAction,0;VariableCustomProfile,~Temperature;VariableID,28911 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Kesseltemperatur]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717105;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,2;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,30781 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Heizkreispumpe A1M1]*/;HasChildren,;ObjectIcon,;ObjectID,30781 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Heizkreispumpe A1M1]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Heizkreispumpe A1M1;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,0;VariableCustomAction,0;VariableCustomProfile,;VariableID,30781 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Heizkreispumpe A1M1]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1404459344;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,0;ValueVariant,;LoggingStatus,1;AggregationType,0;GraphStatus,1;
ObjectID,31685 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Brennerstufe]*/;HasChildren,;ObjectIcon,;ObjectID,31685 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Brennerstufe]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Brennerstufe;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406638213;VariableCustomAction,0;VariableCustomProfile,;VariableID,31685 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Brennerstufe]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717414;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,1;ValueVariant,;LoggingStatus,1;AggregationType,0;GraphStatus,1;
ObjectID,33016 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Sparbetrieb]*/;HasChildren,;ObjectIcon,;ObjectID,33016 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Sparbetrieb]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Sparbetrieb;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406539331;VariableCustomAction,0;VariableCustomProfile,~Switch;VariableID,33016 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Sparbetrieb]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717114;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,0;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,34221 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Partybetrieb]*/;HasChildren,;ObjectIcon,;ObjectID,34221 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Partybetrieb]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Partybetrieb;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406539310;VariableCustomAction,0;VariableCustomProfile,~Switch;VariableID,34221 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Partybetrieb]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717718;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,0;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,34515 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Kesselsolltemperatur]*/;HasChildren,;ObjectIcon,;ObjectID,34515 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Kesselsolltemperatur]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Kesselsolltemperatur;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406709914;VariableCustomAction,0;VariableCustomProfile,~Temperature;VariableID,34515 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Kesselsolltemperatur]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717117;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,2;ValueVariant,;LoggingStatus,1;AggregationType,0;GraphStatus,1;
ObjectID,36927 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Ruecklauftemperatur17A]*/;HasChildren,;ObjectIcon,;ObjectID,36927 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Ruecklauftemperatur17A]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Ruecklauftemperatur17A;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406717721;VariableCustomAction,0;VariableCustomProfile,~Temperature;VariableID,36927 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Ruecklauftemperatur17A]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717721;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,2;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,38089 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Zirkulationspumpe]*/;HasChildren,;ObjectIcon,;ObjectID,38089 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Zirkulationspumpe]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Zirkulationspumpe;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406698208;VariableCustomAction,0;VariableCustomProfile,~Switch;VariableID,38089 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Zirkulationspumpe]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717111;ValueBoolean,1;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,0;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,41873 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Brennerstörung]*/;HasChildren,;ObjectIcon,;ObjectID,41873 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Brennerstörung]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Brennerstörung;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406638510;VariableCustomAction,0;VariableCustomProfile,;VariableID,41873 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Brennerstörung]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717710;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,1;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,45011 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\AussentemperaturGedaempft]*/;HasChildren,;ObjectIcon,;ObjectID,45011 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\AussentemperaturGedaempft]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,AussentemperaturGedaempft;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406717704;VariableCustomAction,0;VariableCustomProfile,~Temperature;VariableID,45011 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\AussentemperaturGedaempft]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717704;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,2;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,55063 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\AnlagenIstLeistung]*/;HasChildren,;ObjectIcon,;ObjectID,55063 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\AnlagenIstLeistung]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,AnlagenIstLeistung;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406709305;VariableCustomAction,0;VariableCustomProfile,;VariableID,55063 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\AnlagenIstLeistung]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717402;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,1;ValueVariant,;LoggingStatus,1;AggregationType,0;GraphStatus,1;
ObjectID,55242 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Speicherladepumpe]*/;HasChildren,;ObjectIcon,;ObjectID,55242 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Speicherladepumpe]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Speicherladepumpe;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406709904;VariableCustomAction,0;VariableCustomProfile,;VariableID,55242 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Speicherladepumpe]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717108;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,0;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,55953 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Sammelstoerung]*/;HasChildren,;ObjectIcon,;ObjectID,55953 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Sammelstoerung]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Sammelstoerung;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,11051 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe]*/;isConfigTree,0;VariableAction,0;VariableChanged,0;VariableCustomAction,0;VariableCustomProfile,~Alert;VariableID,55953 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Sammelstoerung]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717707;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,0;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,26263 /*[Funktionen\Heizung\Viessmann Steuerung\ViessmannDeviceTools.inc.php]*/;HasChildren,;ObjectIcon,;ObjectID,26263 /*[Funktionen\Heizung\Viessmann Steuerung\ViessmannDeviceTools.inc.php]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,ViessmannDeviceTools.inc.php;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,27399 /*[Funktionen\Heizung\Viessmann Steuerung]*/;isConfigTree,0;IsBroken,;LastExecute,1404917612;ScriptFile,ViessmannDeviceTools.inc.php;ScriptID,26263 /*[Funktionen\Heizung\Viessmann Steuerung\ViessmannDeviceTools.inc.php]*/;ScriptType,0;
ObjectID,28921 /*[Funktionen\Heizung\Viessmann Steuerung\Viessmann Com Port an ]*/;HasChildren,;ObjectIcon,;ObjectID,28921 /*[Funktionen\Heizung\Viessmann Steuerung\Viessmann Com Port an ]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Viessmann Com Port an ;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,27399 /*[Funktionen\Heizung\Viessmann Steuerung]*/;isConfigTree,0;IsBroken,;LastExecute,0;ScriptFile,28921.ips.php;ScriptID,28921 /*[Funktionen\Heizung\Viessmann Steuerung\Viessmann Com Port an ]*/;ScriptType,0;
ObjectID,30059 /*[Funktionen\Heizung\Viessmann Steuerung\ViessmannVariables.inc.php]*/;HasChildren,;ObjectIcon,;ObjectID,30059 /*[Funktionen\Heizung\Viessmann Steuerung\ViessmannVariables.inc.php]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,ViessmannVariables.inc.php;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,27399 /*[Funktionen\Heizung\Viessmann Steuerung]*/;isConfigTree,0;IsBroken,;LastExecute,0;ScriptFile,ViessmannVariables.inc.php;ScriptID,30059 /*[Funktionen\Heizung\Viessmann Steuerung\ViessmannVariables.inc.php]*/;ScriptType,0;
ObjectID,31851 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen ]*/;HasChildren,1;ObjectIcon,;ObjectID,31851 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen ]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Abfragen ;ObjectPosition,0;ObjectSummary,;ObjectType,0;ParentID,27399 /*[Funktionen\Heizung\Viessmann Steuerung]*/;isConfigTree,0;
ObjectID,13694 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Senden an Viessmann]*/;HasChildren,;ObjectIcon,;ObjectID,13694 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Senden an Viessmann]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Senden an Viessmann;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,31851 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen ]*/;isConfigTree,0;IsBroken,;LastExecute,1406697447;ScriptFile,13694.ips.php;ScriptID,13694 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Senden an Viessmann]*/;ScriptType,0;
ObjectID,14385 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Modus setzen]*/;HasChildren,;ObjectIcon,;ObjectID,14385 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Modus setzen]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Modus setzen;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,31851 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen ]*/;isConfigTree,0;IsBroken,;LastExecute,1406637637;ScriptFile,14385.ips.php;ScriptID,14385 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Modus setzen]*/;ScriptType,0;
ObjectID,20684 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Empfang Test 2]*/;HasChildren,;ObjectIcon,;ObjectID,20684 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Empfang Test 2]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Empfang Test 2;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,31851 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen ]*/;isConfigTree,0;IsBroken,;LastExecute,1406279115;ScriptFile,20684.ips.php;ScriptID,20684 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Empfang Test 2]*/;ScriptType,0;
ObjectID,23210 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \setvalue test]*/;HasChildren,;ObjectIcon,;ObjectID,23210 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \setvalue test]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,setvalue test;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,31851 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen ]*/;isConfigTree,0;IsBroken,;LastExecute,1406615161;ScriptFile,23210.ips.php;ScriptID,23210 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \setvalue test]*/;ScriptType,0;
ObjectID,42841 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage der Anlage ]*/;HasChildren,;ObjectIcon,;ObjectID,42841 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage der Anlage ]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Abfrage der Anlage ;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,31851 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen ]*/;isConfigTree,0;IsBroken,;LastExecute,1406209570;ScriptFile,42841.ips.php;ScriptID,42841 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage der Anlage ]*/;ScriptType,0;
ObjectID,44685 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Heizungsmodus]*/;HasChildren,;ObjectIcon,;ObjectID,44685 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Heizungsmodus]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Heizungsmodus;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,31851 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen ]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406697437;VariableCustomAction,0;VariableCustomProfile,~String;VariableID,44685 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Heizungsmodus]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406697447;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,3;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,45941 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage intervall]*/;HasChildren,;ObjectIcon,;ObjectID,45941 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage intervall]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Abfrage intervall;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,31851 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen ]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406717700;VariableCustomAction,0;VariableCustomProfile,;VariableID,45941 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage intervall]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717700;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,1;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,54179 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Modus abfragen]*/;HasChildren,;ObjectIcon,;ObjectID,54179 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Modus abfragen]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Modus abfragen;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,31851 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen ]*/;isConfigTree,0;IsBroken,;LastExecute,1406638048;ScriptFile,54179.ips.php;ScriptID,54179 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Modus abfragen]*/;ScriptType,0;
ObjectID,59240 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage Viessmann per Com5]*/;HasChildren,1;ObjectIcon,;ObjectID,59240 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage Viessmann per Com5]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Abfrage Viessmann per Com5;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,31851 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen ]*/;isConfigTree,0;IsBroken,;LastExecute,1406717721;ScriptFile,59240.ips.php;ScriptID,59240 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage Viessmann per Com5]*/;ScriptType,0;
ObjectID,27506 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage Viessmann per Com5\]*/;HasChildren,;ObjectIcon,;ObjectID,27506 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage Viessmann per Com5\]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Unbenanntes Objekt (ID: 27506);ObjectPosition,0;ObjectSummary,;ObjectType,4;ParentID,59240 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage Viessmann per Com5]*/;isConfigTree,0;CyclicDateDay,0;CyclicDateDayValue,0;CyclicDateFrom,1406498400;CyclicDateTo,0;CyclicDateType,0;CyclicDateValue,0;CyclicTimeFrom,943916400;CyclicTimeTo,943916400;CyclicTimeType,2;CyclicTimeValue,5;EventActive,1;EventID,27506 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage Viessmann per Com5\]*/;EventLimit,0;EventType,1;LastRun,1406717700;NextRun,1406718000;TriggerSubsequentExecution,;TriggerType,0;TriggerValue,;TriggerVariableID,0;
ObjectID,40564 /*[Funktionen\Heizung\Viessmann Steuerung\ViessmannDeviceOutputHandlingKW.php]*/;HasChildren,;ObjectIcon,;ObjectID,40564 /*[Funktionen\Heizung\Viessmann Steuerung\ViessmannDeviceOutputHandlingKW.php]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,ViessmannDeviceOutputHandlingKW.php;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,27399 /*[Funktionen\Heizung\Viessmann Steuerung]*/;isConfigTree,0;IsBroken,;LastExecute,1406717721;ScriptFile,ViessmannDeviceOutputHandlingKW.php;ScriptID,40564 /*[Funktionen\Heizung\Viessmann Steuerung\ViessmannDeviceOutputHandlingKW.php]*/;ScriptType,0;
ObjectID,42690 /*[Funktionen\Heizung\Viessmann Steuerung\Viessmann_Send]*/;HasChildren,;ObjectIcon,;ObjectID,42690 /*[Funktionen\Heizung\Viessmann Steuerung\Viessmann_Send]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Viessmann_Send;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,27399 /*[Funktionen\Heizung\Viessmann Steuerung]*/;isConfigTree,0;IsBroken,;LastExecute,0;ScriptFile,42690.ips.php;ScriptID,42690 /*[Funktionen\Heizung\Viessmann Steuerung\Viessmann_Send]*/;ScriptType,0;
ObjectID,29979 /*[Funktionen\Heizung\Letze Meldung Heizstab Einschalten]*/;HasChildren,1;ObjectIcon,;ObjectID,29979 /*[Funktionen\Heizung\Letze Meldung Heizstab Einschalten]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,1;ObjectIsReadOnly,;ObjectName,Letze Meldung Heizstab Einschalten;ObjectPosition,0;ObjectSummary,;ObjectType,0;ParentID,24978 /*[Funktionen\Heizung]*/;isConfigTree,0;
ObjectID,42874 /*[Funktionen\Heizung\Letze Meldung Heizstab Einschalten\letzte Einschaltempfehlung]*/;HasChildren,;ObjectIcon,;ObjectID,42874 /*[Funktionen\Heizung\Letze Meldung Heizstab Einschalten\letzte Einschaltempfehlung]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,letzte Einschaltempfehlung;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,29979 /*[Funktionen\Heizung\Letze Meldung Heizstab Einschalten]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406640709;VariableCustomAction,0;VariableCustomProfile,~String;VariableID,42874 /*[Funktionen\Heizung\Letze Meldung Heizstab Einschalten\letzte Einschaltempfehlung]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406640732;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,3;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,58711 /*[Funktionen\Heizung\Letze Meldung Heizstab Einschalten\Letzte Einschaltempfehlung]*/;HasChildren,1;ObjectIcon,;ObjectID,58711 /*[Funktionen\Heizung\Letze Meldung Heizstab Einschalten\Letzte Einschaltempfehlung]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Letzte Einschaltempfehlung;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,29979 /*[Funktionen\Heizung\Letze Meldung Heizstab Einschalten]*/;isConfigTree,0;IsBroken,;LastExecute,1406717672;ScriptFile,58711.ips.php;ScriptID,58711 /*[Funktionen\Heizung\Letze Meldung Heizstab Einschalten\Letzte Einschaltempfehlung]*/;ScriptType,0;
ObjectID,57147 /*[Funktionen\Heizung\Letze Meldung Heizstab Einschalten\Letzte Einschaltempfehlung\]*/;HasChildren,;ObjectIcon,;ObjectID,57147 /*[Funktionen\Heizung\Letze Meldung Heizstab Einschalten\Letzte Einschaltempfehlung\]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Unbenanntes Objekt (ID: 57147);ObjectPosition,0;ObjectSummary,;ObjectType,4;ParentID,58711 /*[Funktionen\Heizung\Letze Meldung Heizstab Einschalten\Letzte Einschaltempfehlung]*/;isConfigTree,0;CyclicDateDay,0;CyclicDateDayValue,0;CyclicDateFrom,0;CyclicDateTo,0;CyclicDateType,0;CyclicDateValue,0;CyclicTimeFrom,943916400;CyclicTimeTo,943916400;CyclicTimeType,1;CyclicTimeValue,0;EventActive,1;EventID,57147 /*[Funktionen\Heizung\Letze Meldung Heizstab Einschalten\Letzte Einschaltempfehlung\]*/;EventLimit,0;EventType,0;LastRun,1406640775;NextRun,0;TriggerSubsequentExecution,1;TriggerType,1;TriggerValue,;TriggerVariableID,31405 /*[Funktionen\Heizung\Einschaltempfehlung]*/;TriggerVariableName,Einschaltempfehlung;
ObjectID,31405 /*[Funktionen\Heizung\Einschaltempfehlung]*/;HasChildren,;ObjectIcon,;ObjectID,31405 /*[Funktionen\Heizung\Einschaltempfehlung]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Einschaltempfehlung;ObjectPosition,1;ObjectSummary,;ObjectType,2;ParentID,24978 /*[Funktionen\Heizung]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406640775;VariableCustomAction,0;VariableCustomProfile,~Switch;VariableID,31405 /*[Funktionen\Heizung\Einschaltempfehlung]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406716200;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,0;ValueVariant,;LoggingStatus,1;AggregationType,0;GraphStatus,1;
ObjectID,34519 /*[Funktionen\Heizung\Modus Test]*/;HasChildren,;ObjectIcon,;ObjectID,34519 /*[Funktionen\Heizung\Modus Test]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Modus Test;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,24978 /*[Funktionen\Heizung]*/;isConfigTree,0;VariableAction,0;VariableChanged,0;VariableCustomAction,13694 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Senden an Viessmann]*/;VariableCustomProfile,;VariableID,34519 /*[Funktionen\Heizung\Modus Test]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,0;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,1;ValueVariant,;LoggingStatus,1;AggregationType,0;GraphStatus,1;
ObjectID,35625 /*[Funktionen\Heizung\Kessel Temperatur]*/;HasChildren,;ObjectIcon,;ObjectID,35625 /*[Funktionen\Heizung\Kessel Temperatur]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Kessel Temperatur;ObjectPosition,5;ObjectSummary,;ObjectType,6;ParentID,24978 /*[Funktionen\Heizung]*/;isConfigTree,0;LinkChildID,28911 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Kesseltemperatur]*/;LinkID,35625 /*[Funktionen\Heizung\Kessel Temperatur]*/;TargetID,28911 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Kesseltemperatur]*/;TargetName,Kesseltemperatur;
ObjectID,37401 /*[Funktionen\Heizung\Heizstab]*/;HasChildren,1;ObjectIcon,;ObjectID,37401 /*[Funktionen\Heizung\Heizstab]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Heizstab;ObjectPosition,1;ObjectSummary,;ObjectType,1;ParentID,24978 /*[Funktionen\Heizung]*/;isConfigTree,0;ConnectionID,54823 /*[HomeMatic Socket CCU]*/;InstanceID,37401 /*[Funktionen\Heizung\Heizstab]*/;InstanceStatus,102;LastChange,0;ModuleID,{EE4A81C6-5C90-4DB7-AD2F-F6BBD521412E};ModuleName,HomeMatic Device;ModuleType,3;
ObjectID,13174 /*[Funktionen\Heizung\Heizstab\WORKING]*/;HasChildren,;ObjectIcon,;ObjectID,13174 /*[Funktionen\Heizung\Heizstab\WORKING]*/;ObjectIdent,WORKING;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,1;ObjectName,WORKING;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,37401 /*[Funktionen\Heizung\Heizstab]*/;isConfigTree,0;VariableAction,0;VariableChanged,0;VariableCustomAction,0;VariableCustomProfile,;VariableID,13174 /*[Funktionen\Heizung\Heizstab\WORKING]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406567313;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,0;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,22752 /*[Funktionen\Heizung\Heizstab\INHIBIT]*/;HasChildren,;ObjectIcon,;ObjectID,22752 /*[Funktionen\Heizung\Heizstab\INHIBIT]*/;ObjectIdent,INHIBIT;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,1;ObjectName,INHIBIT;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,37401 /*[Funktionen\Heizung\Heizstab]*/;isConfigTree,0;VariableAction,0;VariableChanged,0;VariableCustomAction,0;VariableCustomProfile,;VariableID,22752 /*[Funktionen\Heizung\Heizstab\INHIBIT]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,0;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,0;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,23617 /*[Funktionen\Heizung\Heizstab\STATE]*/;HasChildren,;ObjectIcon,;ObjectID,23617 /*[Funktionen\Heizung\Heizstab\STATE]*/;ObjectIdent,STATE;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,1;ObjectName,STATE;ObjectPosition,0;ObjectSummary,;ObjectType,2;ParentID,37401 /*[Funktionen\Heizung\Heizstab]*/;isConfigTree,0;VariableAction,37401 /*[Funktionen\Heizung\Heizstab]*/;VariableChanged,1406567313;VariableCustomAction,0;VariableCustomProfile,~Switch;VariableID,23617 /*[Funktionen\Heizung\Heizstab\STATE]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,~Switch;VariableUpdated,1406567313;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,0;ValueVariant,;LoggingStatus,;AggregationType,0;GraphStatus,1;
ObjectID,49266 /*[Funktionen\Heizung\Heizstab\Heizstab PV Gesteuert Leistungsüberschuss  ]*/;HasChildren,1;ObjectIcon,;ObjectID,49266 /*[Funktionen\Heizung\Heizstab\Heizstab PV Gesteuert Leistungsüberschuss  ]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,1;ObjectIsReadOnly,;ObjectName,Heizstab PV Gesteuert Leistungsüberschuss  ;ObjectPosition,0;ObjectSummary,;ObjectType,3;ParentID,37401 /*[Funktionen\Heizung\Heizstab]*/;isConfigTree,0;IsBroken,;LastExecute,1406716200;ScriptFile,49266.ips.php;ScriptID,49266 /*[Funktionen\Heizung\Heizstab\Heizstab PV Gesteuert Leistungsüberschuss  ]*/;ScriptType,0;
ObjectID,59370 /*[Funktionen\Heizung\Heizstab\Heizstab PV Gesteuert Leistungsüberschuss  \]*/;HasChildren,;ObjectIcon,;ObjectID,59370 /*[Funktionen\Heizung\Heizstab\Heizstab PV Gesteuert Leistungsüberschuss  \]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Unbenanntes Objekt (ID: 59370);ObjectPosition,0;ObjectSummary,;ObjectType,4;ParentID,49266 /*[Funktionen\Heizung\Heizstab\Heizstab PV Gesteuert Leistungsüberschuss  ]*/;isConfigTree,0;CyclicDateDay,0;CyclicDateDayValue,0;CyclicDateFrom,1404424800;CyclicDateTo,0;CyclicDateType,2;CyclicDateValue,1;CyclicTimeFrom,943945200;CyclicTimeTo,943981200;CyclicTimeType,2;CyclicTimeValue,30;EventActive,1;EventID,59370 /*[Funktionen\Heizung\Heizstab\Heizstab PV Gesteuert Leistungsüberschuss  \]*/;EventLimit,0;EventType,1;LastRun,1406716200;NextRun,1406718000;TriggerSubsequentExecution,;TriggerType,0;TriggerValue,;TriggerVariableID,0;
ObjectID,42890 /*[Funktionen\Heizung\Heizungsmodus]*/;HasChildren,;ObjectIcon,;ObjectID,42890 /*[Funktionen\Heizung\Heizungsmodus]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Heizungsmodus;ObjectPosition,3;ObjectSummary,;ObjectType,2;ParentID,24978 /*[Funktionen\Heizung]*/;isConfigTree,0;VariableAction,0;VariableChanged,1406697437;VariableCustomAction,13694 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Senden an Viessmann]*/;VariableCustomProfile,Heizungsmodus;VariableID,42890 /*[Funktionen\Heizung\Heizungsmodus]*/;VariableIsBinary,;VariableIsLocked,;VariableProfile,;VariableUpdated,1406717701;ValueBoolean,;ValueFloat,0;ValueInteger,0;ValueString,;ValueType,2;ValueVariant,;LoggingStatus,1;AggregationType,0;GraphStatus,1;
ObjectID,47310 /*[Funktionen\Heizung\Zirkulationspumpe]*/;HasChildren,;ObjectIcon,;ObjectID,47310 /*[Funktionen\Heizung\Zirkulationspumpe]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Zirkulationspumpe;ObjectPosition,6;ObjectSummary,;ObjectType,6;ParentID,24978 /*[Funktionen\Heizung]*/;isConfigTree,0;LinkChildID,38089 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Zirkulationspumpe]*/;LinkID,47310 /*[Funktionen\Heizung\Zirkulationspumpe]*/;TargetID,38089 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Zirkulationspumpe]*/;TargetName,Zirkulationspumpe;
';
$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,~HTMLBox;Digits,0;Icon,;IsReadOnly,1;MaxValue,0;MinValue,0;Prefix,;ProfileType,3;StepSize,0;Suffix,;|
ProfileName,~Temperature;Digits,1;Icon,Temperature;IsReadOnly,1;MaxValue,70;MinValue,-30;Prefix,;ProfileType,2;StepSize,5;Suffix, °C;|
ProfileName,integer_dummy;Digits,0;Icon,;IsReadOnly,;MaxValue,0;MinValue,0;Prefix,;ProfileType,1;StepSize,1;Suffix,;|
ProfileName,~Switch;Digits,0;Icon,Power;IsReadOnly,1;MaxValue,1;MinValue,0;Prefix,;ProfileType,0;StepSize,0;Suffix,;|Color,-1;Icon,;Name,Aus;Value,0;§Color,65280 /*[Objekt #65280 existiert nicht]*/;Icon,;Name,An;Value,1;§
ProfileName,~Alert;Digits,0;Icon,Warning;IsReadOnly,1;MaxValue,1;MinValue,0;Prefix,;ProfileType,0;StepSize,0;Suffix,;|Color,-1;Icon,;Name,OK;Value,0;§Color,16711680;Icon,;Name,Alarm;Value,1;§
ProfileName,~String;Digits,0;Icon,;IsReadOnly,1;MaxValue,0;MinValue,0;Prefix,;ProfileType,3;StepSize,0;Suffix,;|
ProfileName,Heizungsmodus;Digits,0;Icon,;IsReadOnly,;MaxValue,0;MinValue,0;Prefix,;ProfileType,2;StepSize,0;Suffix,;|Color,-1;Icon,;Name,Abschalten 0;Value,0;§Color,-1;Icon,;Name,Nur Warm Wasser 1;Value,1;§Color,-1;Icon,;Name,Heizen und WW 2;Value,2;§Color,-1;Icon,;Name,immer Reduziert 3;Value,3;§Color,-1;Icon,;Name,immer Normal 4;Value,4;§
';
$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 "ViessmannDeviceTools.inc.php" ------------------------------------------------------------------------------------------------------
function ViessmannDeviceToolsincphp26263()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 30.07.2014 12:55 #####

  // Constant definition for processing ----------------------------------------
  define( "VIESSMANN_GERAETEKENNUNG",   chr(0x00).chr(0xF8) );

  include( "ViessmannVariables.inc.php");

  // Get XML
  $ViessmannDeviceID = GetValueString( VIESSMANN_VARIABLE_DEVICE );
  $DeviceXMLName = IPS_GetKernelDir()."scripts@§@@§@ViessmannDevice".$ViessmannDeviceID.".xml";
  try
  {
    $ViessmannDeviceXML = simplexml_load_file( $DeviceXMLName );
  }
  catch (Exception $e)
  {
    $ViessmannDeviceXML = "";
  }

  function ViessmannGetCommand( $Command )
  {
    $CommandData = array();

    global $ViessmannDeviceXML;
    if ( !isset( $ViessmannDeviceXML ) OR $ViessmannDeviceXML == "" )
      return false;

    $CommandData["deviceid"] = $ViessmannDeviceXML["id"];
    $CommandData["protocol"] = $ViessmannDeviceXML["protocol"];

    // Get Command details
    $ViessmannDeviceCommands = $ViessmannDeviceXML->commands[0];

    foreach($ViessmannDeviceXML->commands[0] as $a => $XMLCommand )
    {
      if ( $XMLCommand["name"] == $Command )
      {
        $CommandData["name"]        = $Command;
        $CommandData["action"]      = $XMLCommand["action"];
        $CommandData["address"]     = $XMLCommand->address[0];
        $CommandData["length"]      = $XMLCommand->length[0];
        $CommandData["description"] = $XMLCommand->description[0];
        $CommandData["format"]      = $XMLCommand->format[0];
        break; // for
      }
    }
    if ( isset( $CommandData["name"] ) )
      return $CommandData;
    else
      return false;
  }

  function ViessmannResultToHexDisplay( $Result )
  {
    $ResultConv = "";
    for( $x=0; $x < strlen($Result); $x++)
    {
      if ( ord($Result[$x]) < 16 ) $ResultConv .= "0";
      $ResultConv .= strtoupper(dechex(ord($Result[$x])));
    }
    return $ResultConv;
  }

  function ViessmannConvertData( $Command, $Data )
  {
	  global $ViessmannDeviceID;
	  $ViessmannCommand = ViessmannGetCommand( $Command, $ViessmannDeviceID );
	  if ( $ViessmannCommand === false ) return false;
	  $Format = $ViessmannCommand["format"];

	  switch( $Format )
	  {
 		  case "Boolean":
		    if ( ord( $Data[0] ) == 0 )
		       return false;
			   else
				   return true;
		      break;
		  case "Temperature10":
			  $lowByte = ord( $Data[0] );
			  $highByte = ord( $Data[1] );
			  return (( $highByte * 256 ) + $lowByte ) / 10;
			  break;
      case "Temperature10Minus":
        $lowByte = ord( $Data[0] );
        $highByte = ord( $Data[1] );
        if ($highByte == 255) {
          return ((65536-(( $highByte * 256 ) + $lowByte ))/10)*-1;
          } else {
          return (( $highByte * 256 ) + $lowByte ) / 10;
        }
        break;
		  case "Temperature100":
			  $lowByte = ord( $Data[0] );
			  $highByte = ord( $Data[1] );
			  return (( $highByte * 256 ) + $lowByte ) / 100;
			  break;
		  case "Count" or "Mode":
			  $Count = 0;
			  $HexString = ViessmannResultToHexDisplay( $Data );
        for ( $x=0; $x < strlen( $HexString ); $x=$x+2 )
			  {
				 $hex = substr( $HexString, $x,2 );
				 $dec = hexdec( $hex );
				 switch ( $x )
				 {
					case 0:
					  $Count = $Count + $dec;
					  break;
					case 2:
					  $Count = $Count + ( $dec * 256 );
					  break;
					case 4:
					  $Count = $Count + ( $dec * 65536 );
					  break;
					case 6:
					  $Count = $Count + ( $dec * 16777216 );
					  break;
					default:
					  break;
			    }
			  }
			  return $Count;
			  break;
			case "BooleanPercent":
			  return "BOOLEANPERCENT convertion not coded yet.";
			  break;
			case "Triple":
			  return "TRIPLE convertion not coded yet.";
			  break;
			case "Mode":
			  return hexdec(ord($Data[0]));
			  break;
		   case "ControlID":
		     $Result = "";
           for( $x=0; $x < strlen($Data); $x++)
           {
             if ( ord($Data[$x]) < 16 ) $Result .= "0";
             $Result .= strtoupper(dechex(ord($Data[$x])));
           }
           return $Result;
           break;
  		   default:
			  return "";
			  break;
		}
		return $ConvertedResult;
  }

  function ViessmannGetData( $Command )
  {
	 $Run = 3; // Maximum time a recheck is done, if Ping (0x05 is returnvalue)
	 // get Command Data
 	 $ViessmannCommand = ViessmannGetCommand( $Command );
	 if ( $ViessmannCommand === false ) return false;

	 // clear previous result
	 do
	 {
	   SetValueString( VIESSMANN_VARIABLE_RESULT, "" );
	   // create command string and send to COM Port
	   $CommandString = "R:".$ViessmannCommand["protocol"].":".$ViessmannCommand["address"].":".$ViessmannCommand["length"].": ";
		$StartTime = microtime(true);
		$RunTime = 0;
		SetValueString( VIESSMANN_VARIABLE_COMMAND, $CommandString );
	   // wait for execution
      $status = getvalue( VIESSMANN_VARIABLE_COMMAND );
      //IPS_LogMessage("ViessmannDT",$StartTime);
      while ($status != "" AND $RunTime < 10 )
		{
		  $status = getvalue( VIESSMANN_VARIABLE_COMMAND );
		  $RunTime = microtime(true) - $StartTime;
		}
      // get result
      $Result = GetValue( VIESSMANN_VARIABLE_RESULT );
      if ( $Result != chr(0x05) ) $Run = -1;
      $Run--;
	 } while ( $Run > 0 );
   //IPS_LogMessage("ViessmannDT", $StartTime."-".bin2hex($Result)."-".$CommandString."-".$Run."-".$RunTime."-".$status);
   if (strlen($Result)==0) {
     IPS_LogMessage("ViessmannDT", "Timeout:".$RunTime."(".$Run.")");
     SetValue(VIESSMANN_VARIABLE_ERRORCOUNT,GetValue(VIESSMANN_VARIABLE_ERRORCOUNT)+1);
     $Result = false;
	  ViessmannClose();
	  ViessmannOpen();
	}
	else if ( $Result[0] == chr(0x05) ) {
     IPS_LogMessage("ViessmannDT", bin2hex($Result)."-".$CommandString."-".$Run);
     if (strlen($Result)==2) {
       if ($Result[1] == chr(0x05)) {
         IPS_LogMessage("ViessmannDT", "skipped");
         SetValue(VIESSMANN_VARIABLE_ERRORCOUNT,GetValue(VIESSMANN_VARIABLE_ERRORCOUNT)+1);
         $Result = false;
      }
     }
   }
   if (strlen($Result)==4) {
     if (($Result[2] == chr(0x05))&&($Result[3] == chr(0x05))) {
       IPS_LogMessage("ViessmannDT", "skipped4-".bin2hex($Result));
       SetValue(VIESSMANN_VARIABLE_ERRORCOUNT,GetValue(VIESSMANN_VARIABLE_ERRORCOUNT)+1);
       $Result = false;
     }
   }
	 return $Result;
  }

  function ViessmannSetData( $Command, $Data )
  {
	 // get Command Data
 	 $ViessmannCommand = ViessmannGetCommand( $Command );
	 if ( $ViessmannCommand === false ) return false;
	 if ( $ViessmannCommand["action"] != "ReadWrite" ) return false;
	 // clear previous result
    SetValueString( VIESSMANN_VARIABLE_RESULT, "" );
    // create command string and send to COM Port
  	 $CommandString = "W:".$ViessmannCommand["protocol"].":".$ViessmannCommand["address"].":".$ViessmannCommand["length"].":".$Data;
    SetValueString( VIESSMANN_VARIABLE_COMMAND, $CommandString );
    // wait for execution
    $status = getvalue( VIESSMANN_VARIABLE_COMMAND );
    while ($status != "") $status = getvalue( VIESSMANN_VARIABLE_COMMAND );
    // get result
    $Result = GetValue( VIESSMANN_VARIABLE_RESULT );
    return $Result;
  }

  function ViessmannOpen()
  {
    // Open Com Port
    if ( COMPort_GetOpen( VIESSMANN_VARIABLE_COMPORT ) != true )
    {
	   COMPort_SetOpen( VIESSMANN_VARIABLE_COMPORT, true );
	   IPS_ApplyChanges( VIESSMANN_VARIABLE_COMPORT );
    }
  }

  function ViessmannClose()
  {
    // Close Com Port
    if ( COMPort_GetOpen( VIESSMANN_VARIABLE_COMPORT ) != false )
    {
	   COMPort_SetOpen( VIESSMANN_VARIABLE_COMPORT, false );
	   IPS_ApplyChanges( VIESSMANN_VARIABLE_COMPORT );
    }
  }

  function ViessmannSetVariableByCommand( $Command, $Var )
  {
    $Value = ViessmannGetData( $Command );
    if ( $Value === false )
	 {
	   SetValueBoolean( VIESSMANN_VARIABLE_CONNECTOK, false );
	 }
    else
    {
      SetValueBoolean( VIESSMANN_VARIABLE_CONNECTOK, true );
     if ($Var) SetValue( $Var, ViessmannConvertData( $Command, $Value ) );
     else return (ViessmannConvertData( $Command, $Value ));
	 }
  }

?>
';
}

// Script "Viessmann Com Port an " ------------------------------------------------------------------------------------------------------
function ViessmannComPortan28921()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 30.07.2014 12:55 #####

IPS_SetProperty(53482 /*[Viessmann Heizung Serial Port]*/, §\'Open§\', true);
IPS_ApplyChanges(53482 /*[Viessmann Heizung Serial Port]*/ );
// COMPort_SetDTR(53482 /*[Viessmann Heizung Serial Port]*/, true);
IPS_Sleep(5000);
IPS_SetProperty(53482 /*[Viessmann Heizung Serial Port]*/, §\'Open§\', false);
IPS_ApplyChanges(53482 /*[Viessmann Heizung Serial Port]*/ );
?>
';
}

// Script "ViessmannVariables.inc.php" ------------------------------------------------------------------------------------------------------
function ViessmannVariablesincphp30059()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 30.07.2014 12:55 #####


  // IPS Variables -------------------------------------------------------------
  define( "VIESSMANN_VARIABLE_DEVICE"      , 57385 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\Steuerungstyp]*/ );
  define( "VIESSMANN_VARIABLE_COMMAND"     , 58616 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\Kommando]*/ );
  define( "VIESSMANN_VARIABLE_RESULT"      , 42628 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\Rückgabewert]*/ );
  define( "VIESSMANN_VARIABLE_REGISTER"    , 56186 /*[Viessmann Heizung Serial Port\Viessmann Register Variable]*/ );
  define( "VIESSMANN_VARIABLE_COMPORT"     , 53482 /*[Viessmann Heizung Serial Port]*/ );
  define( "VIESSMANN_VARIABLE_CONNECTOK"   , 49172 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\Verbindung ok]*/ );
	define( "VIESSMANN_VARIABLE_ERRORCOUNT"   , 35796 /*[Viessmann Heizung Serial Port\Viessmann Register Variable\ErrorCount]*/);
?>
';
}

// Script "Senden an Viessmann" ------------------------------------------------------------------------------------------------------
function SendenanViessmann13694()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 30.07.2014 12:55 #####

if($IPS_SENDER == "WebFront")

{
    include( "ViessmannDeviceTools.inc.php" );

    switch($IPS_VALUE)
    {

          case 0:
                
                {
                     ViessmannOpen();
                     ViessmannSetData( "BetriebsartM2", chr(0x00) );
                     //IPS_Sleep(2000);
                     ViessmannClose();
                     SetValue(44685 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Heizungsmodus]*/, $IPS_VALUE);
                     SetValue($IPS_VARIABLE, $IPS_VALUE);
                }

        break;

                case 1:
                
                {
                     ViessmannOpen();
                     ViessmannSetData( "BetriebsartM2", chr(0x01) );
                     //IPS_Sleep(2000);
                     ViessmannClose();
                     SetValue(44685 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Heizungsmodus]*/, $IPS_VALUE);
                     SetValue($IPS_VARIABLE, $IPS_VALUE);
                 }
             break;

             case 2:
                  
                {
                     ViessmannOpen();
                     ViessmannSetData( "BetriebsartM2", chr(0x02) );
                     //IPS_Sleep(2000);
                     ViessmannClose();
                     SetValue(44685 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Heizungsmodus]*/ ,$IPS_VALUE);
                     SetValue($IPS_VARIABLE, $IPS_VALUE);
                 }
             break;

             case 3:
                        
                {
                     ViessmannOpen();
                     ViessmannSetData( "BetriebsartM2", chr(0x03) );
                     //IPS_Sleep(2000);
                     ViessmannClose();
                     SetValue(44685 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Heizungsmodus]*/ , $IPS_VALUE);
                     SetValue($IPS_VARIABLE, $IPS_VALUE);
                 }
             break;

             case 4:
                       
                {
                     ViessmannOpen();
                     ViessmannSetData( "BetriebsartM2", chr(0x04) );
                     //IPS_Sleep(2000);
                     ViessmannClose();
                     SetValue(44685 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Heizungsmodus]*/ , $IPS_VALUE);
                     SetValue($IPS_VARIABLE, $IPS_VALUE);
                     
                 }
             break;

}}
?>
';
}

// Script "Modus setzen" ------------------------------------------------------------------------------------------------------
function Modussetzen14385()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 30.07.2014 12:55 #####


include( "ViessmannDeviceTools.inc.php" );
ViessmannOpen();
ViessmannSetData( "BetriebsartM2", chr(0x04) );// 00 aus 01 ww 02 WWheizen 03 reduziert 04 normal
ViessmannClose();

?>
';
}

// Script "Empfang Test 2" ------------------------------------------------------------------------------------------------------
function EmpfangTest20684()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 30.07.2014 12:55 #####

// Variablen Includieren
include( "ViessmannDeviceTools.inc.php" );

// Verbindung zur Heizung öffnen
ViessmannOpen();

// Wert Abfragen
ViessmannSetVariableByCommand ( "BetriebsartM2",42890 /*[Funktionen\Heizung\Heizungsmodus]*/  );

// Verbindung schliessen
ViessmannClose();
?>
';
}

// Script "setvalue test" ------------------------------------------------------------------------------------------------------
function setvaluetest23210()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 30.07.2014 12:55 #####


SetValuefloat(42890 /*[Funktionen\Heizung\Heizungsmodus]*/ , 5);

?>
';
}

// Script "Abfrage der Anlage " ------------------------------------------------------------------------------------------------------
function AbfragederAnlage42841()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 30.07.2014 12:55 #####


  // Variablen Includieren
  include( "ViessmannDeviceTools.inc.php" );

  // Verbindung zur Heizung öffnen
  ViessmannOpen();

  // Wert Abfragen

ViessmannSetVariableByCommand( "BetriebsartM2", 18705 /*[Objekt #18705 existiert nicht]*/ );
//ViessmannSetVariableByCommand( "Speichertemperatur", 58240 /*[Objekt #58240 existiert nicht]*/ );



  // Verbindung schliessen
  ViessmannClose();

?>
';
}

// Script "Modus abfragen" ------------------------------------------------------------------------------------------------------
function Modusabfragen54179()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 30.07.2014 12:55 #####


include( "ViessmannDeviceTools.inc.php" );
ViessmannOpen();
ViessmannSetVariableByCommand( "BetriebsartM2",42890 /*[Funktionen\Heizung\Heizungsmodus]*/ );
ViessmannClose();

?>
';
}

// Script "Abfrage Viessmann per Com5" ------------------------------------------------------------------------------------------------------
function AbfrageViessmannperCom59240()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 30.07.2014 12:55 #####

include( "ViessmannDeviceTools.inc.php" );
$step = GetValue(45941 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage intervall]*/ );

if(($IPS_SENDER == "TimerEvent")and($step == 0)){
    SetValue(45941 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage intervall]*/ , 1);
//IPS_SetScriptTimer($IPS_SELF, 10);
        ViessmannOpen();
        ViessmannSetVariableByCommand( "BetriebsartM2",42890 /*[Funktionen\Heizung\Heizungsmodus]*/ );
        ViessmannSetVariableByCommand( "Aussentemperatur",45011 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\AussentemperaturGedaempft]*/ );
        ViessmannSetVariableByCommand( "Vorlauftemperatur",22474 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Vorlauftemperatur]*/ );
        ViessmannSetVariableByCommand( "Sammelstoerung",55953 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Sammelstoerung]*/);
        ViessmannSetVariableByCommand( "Brennerstoerung",41873 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Brennerstörung]*/ );
        ViessmannSetVariableByCommand( "PartybetriebA1M1",34221 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Partybetrieb]*/);
		  ViessmannSetVariableByCommand( "Ruecklauftemperatur17A",36927 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Ruecklauftemperatur17A]*/);
		
        ViessmannClose();
    return;
}
if(($IPS_SENDER == "TimerEvent")and($step == 1)){
    SetValue(45941 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage intervall]*/ , 2);
//IPS_SetScriptTimer($IPS_SELF, 10);
        ViessmannOpen();
        ViessmannSetVariableByCommand( "Kesseltemperatur",28911 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Kesseltemperatur]*/ );
        ViessmannSetVariableByCommand( "Speicherladepumpe",55242 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Speicherladepumpe]*/ );
        ViessmannSetVariableByCommand( "Zirkulationspumpe",38089 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Zirkulationspumpe]*/);
        ViessmannSetVariableByCommand( "AktuelleBetriebsartA1M",28759 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\AktuelleBetriebsartA1M]*/ );
        ViessmannSetVariableByCommand( "SparbetriebM2",33016 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Sparbetrieb]*/);
        ViessmannSetVariableByCommand( "Kesselsolltemperatur",34515 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Kesselsolltemperatur]*/);
        ViessmannClose();
    return;
}

if(($IPS_SENDER == "TimerEvent")and($step == 2)){
    SetValue(45941 /*[Funktionen\Heizung\Viessmann Steuerung\Abfragen \Abfrage intervall]*/ , 0);
// IPS_SetScriptTimer($IPS_SELF, 10);
        ViessmannOpen();
        ViessmannSetVariableByCommand( "AnlagenIstLeistung",55063 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\AnlagenIstLeistung]*/ );
        ViessmannSetVariableByCommand( "RaumSolltemperatur",20154 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Raum Soll Temperatur]*/);
        ViessmannSetVariableByCommand( "AktuelleBetriebsartA1M1",28759 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\AktuelleBetriebsartA1M]*/);
        ViessmannSetVariableByCommand( "BetriebsartM2",42890 /*[Funktionen\Heizung\Heizungsmodus]*/ );
        ViessmannSetVariableByCommand( "Brennerstufe",31685 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Brennerstufe]*/ );
        ViessmannSetVariableByCommand( "VorlauftemperaturM2",22474 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Vorlauftemperatur]*/ );
        ViessmannSetVariableByCommand( "Uhrzeit-m",23092 /*[Funktionen\Heizung\Viessmann Steuerung\Ausgabe\Uhrzeit]*/);
        
        ViessmannClose();
   return;
}
?>
';
}

// Script "ViessmannDeviceOutputHandlingKW.php" ------------------------------------------------------------------------------------------------------
function ViessmannDeviceOutputHandlingKWphp40564()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 30.07.2014 12:55 #####

  include( "ViessmannVariables.inc.php");
  // Constants
  define( "VIESSMANN_PING",             chr(0x05) );
  define( "VIESSMANN_KW_READ_PRAEFIX",  chr(0x01).chr(0xF7) );
  define( "VIESSMANN_KW_WRITE_PRAEFIX", chr(0x01).chr(0xF4) );

  // init variables
  $CurrentAction   = ""; $CurrentProtocol = ""; $CurrentCommand  = "";
  $CurrentLength   = ""; $CurrentSetValue = "";

  $ViessmannDeviceID = GetValueString( VIESSMANN_VARIABLE_DEVICE );

  // get current Command if available or determine Device ID automatically
  $Command = GetValueString( VIESSMANN_VARIABLE_COMMAND );
  if ( $ViessmannDeviceID == "" AND strlen( $Command ) == 0 )
  {
	 $Command = "R:KW:00F8:2: "; // retrieve Device ID
	 SetValueString( VIESSMANN_VARIABLE_COMMAND, $Command );
  }

  if ( $Command != "" )
  {
    $CommandArray = explode(":", $Command);
    $parts = count( $CommandArray );
    if ( $parts > 0 ) $CurrentAction   = $CommandArray[0];
    if ( $parts > 1 ) $CurrentProtocol = $CommandArray[1];
    if ( $parts > 2 ) $CurrentAddress  = $CommandArray[2];
    if ( $parts > 3 ) $CurrentLength   = $CommandArray[3];
    if ( $parts > 4 ) $CurrentSetValue = $CommandArray[4];
  }

  // Get remaining data in the com port via the buffer of the register variable
  $ComData = RegVar_GetBuffer( VIESSMANN_VARIABLE_REGISTER );
  // and merge it together with the passed data
  $ComData .= $IPS_VALUE;
//echo $CurrentAction."-";
//if ($ComData == VIESSMANN_PING ) echo "Ping"; else echo strlen( $ComData );
  // Process Com Data ----------------------------------------------------------
  if (   $ComData == VIESSMANN_PING AND
		 ( $CurrentAction == "R" OR $CurrentAction == "W" ) )
  {
    // No data expected (Command available), so execute command if available

    // Check, if expected Action and Command capabilities fit

    // Prepare Command Address + Length
    $Address =  chr(hexdec(substr($CurrentAddress,0,2)));
    $Address .= chr(hexdec(substr($CurrentAddress,2,2)));
    switch ( $CurrentAction )
    {
      case "R": // Read
        $CommandString = VIESSMANN_KW_READ_PRAEFIX.$Address.chr($CurrentLength);
        $Command[0] = "-"; // Mark Command as executed
        break;
      case "W": // Write
        $CommandString = VIESSMANN_KW_WRITE_PRAEFIX.$Address.chr($CurrentLength).$CurrentSetValue;
        $Command = ""; // Clear command
        break;
      default:
        $CommandString = "";
        break;
    }
    if ( $CommandString != "" )
    {
      SetValueString( VIESSMANN_VARIABLE_COMMAND, $Command );
	   // Clear current result
      SetValueString( VIESSMANN_VARIABLE_RESULT, "" );
		// Send command to Viessmann heating device via COM Port
		COMPort_SendText( VIESSMANN_VARIABLE_COMPORT, $CommandString );
    }
  }
  else
  {
	  if ( $CurrentAction == "-" and strlen( $ComData ) >= $CurrentLength )
	  {
		  // Com Data is equal or longer as needed
		  $Result = substr( $ComData, 0, $CurrentLength );
		  // Set Result in IPS Variable
        SetValueString( VIESSMANN_VARIABLE_RESULT, $Result );

        // if Device ID is initial and command was to retrieve device ID
        if ( $ViessmannDeviceID == "" AND $Command == "-:KW:00F8:2: " )
        {
			 // set device ID
			 $DeviceID = "";
          for( $x=0; $x < strlen($Result); $x++)
          {
            if ( ord($Result[$x]) < 10 ) $DeviceID .= "0";
            $DeviceID .= strtoupper(dechex(ord($Result[$x])));
          }
          SetValueString( VIESSMANN_VARIABLE_DEVICE, $DeviceID );
        }

        // clear command and remaining buffer of register variable
	  	  SetValueString( VIESSMANN_VARIABLE_COMMAND, "" );
        RegVar_SetBuffer( VIESSMANN_VARIABLE_REGISTER, "" );
	  }
	  else
	  {
        // as a result is expected and the current length of data is not
        // sufficient, write the data back to the buffer of the register var
        if ( $Command != "" AND $CurrentAction == "-" )
          RegVar_SetBuffer( VIESSMANN_VARIABLE_REGISTER, $ComData);
		  else
		    RegVar_SetBuffer( VIESSMANN_VARIABLE_REGISTER, "");
    }

  }
?>
';
}

// Script "Viessmann_Send" ------------------------------------------------------------------------------------------------------
function ViessmannSend42690()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 30.07.2014 12:55 #####

/*require IPS_GetKernelDir()."scripts@§@@§@ViessmannVariablen.ips.php";
include "globals.ips.php";
COMPort_SendText(Viessmann, IPS_Geraete_Kennung );
*/
// Variablen Includieren
include( "ViessmannDeviceTools.inc.php" );

  // Verbindung zur Heizung öffnen
//  ViessmannOpen();

  // Wert Abfragen
//ViessmannSetVariableByCommand( "Uhrzeit-m", 54552 /*[Objekt #54552 existiert nicht]*/ );
ViessmannSetVariableByCommand( "Kesseltemperatur", 40940 /*[Objekt #40940 existiert nicht]*/ );
$temp=ViessmannSetVariableByCommand( "Kesselsolltemperatur", 0 );
if ($temp<100) SetValue(18210 /*[Objekt #18210 existiert nicht]*/,$temp);
else {
  IPS_LogMessage("Viessmann_Send", "skipped Kesselsoll");
  SetValue(VIESSMANN_VARIABLE_ERRORCOUNT,GetValue(VIESSMANN_VARIABLE_ERRORCOUNT)+1);
}
//ViessmannSetVariableByCommand( "Aussentemperatur", 53852 /*[Objekt #53852 existiert nicht]*/ );
ViessmannSetVariableByCommand( "AbgastemperaturTiefpass", 42042 /*[Objekt #42042 existiert nicht]*/ );
//ViessmannSetVariableByCommand( "ZustandStufe1", 44201 /*[Objekt #44201 existiert nicht]*/ );
ViessmannSetVariableByCommand( "AnlagenIstLeistung", 23970 /*[Objekt #23970 existiert nicht]*/ );
//ViessmannSetVariableByCommand( "Brennerstoerung", 44754 /*[Objekt #44754 existiert nicht]*/ );
$temp=ViessmannSetVariableByCommand( "BetriebsstundenStufe1", 0 );
$temp2=GetValue(56842 /*[Objekt #56842 existiert nicht]*/);
if (($temp>=$temp2) &&($temp<$temp2+3600*24)) SetValue(56842 /*[Objekt #56842 existiert nicht]*/,$temp);
else {
  IPS_LogMessage("Viessmann_Send", "skipped StundenStufe1-".$temp."-".$temp2);
  SetValue(VIESSMANN_VARIABLE_ERRORCOUNT,GetValue(VIESSMANN_VARIABLE_ERRORCOUNT)+1);
}

ViessmannSetVariableByCommand( "BetriebsstundenStufe2", 12263 /*[Objekt #12263 existiert nicht]*/ );
ViessmannSetVariableByCommand( "Brennerstarts", 25035 /*[Objekt #25035 existiert nicht]*/ );

  // Verbindung schliessen
//  ViessmannClose();


?>
';
}

// Script "Letzte Einschaltempfehlung" ------------------------------------------------------------------------------------------------------
function LetzteEinschaltempfehlung58711()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 30.07.2014 12:55 #####

$id_status = 31405 /*[Funktionen\Heizung\Einschaltempfehlung]*/;
$wert= getvalueboolean(31405 /*[Funktionen\Heizung\Einschaltempfehlung]*/);

echo $wert;
?>
';
}

// Script "Heizstab PV Gesteuert Leistungsüberschuss  " ------------------------------------------------------------------------------------------------------
function HeizstabPVGesteuertLeistungsberschuss49266()
{
return
'<?
 ##### Project Exporter Comment: Script Version Stand 30.07.2014 12:55 #####

$PV=getvalue(11369 /*[Funktionen\PV Anlage\AC Aktuell]*/); // Besser beiPV - Verbrauch zu schalten
// $PV=0; // Besser beiPV - Verbrauch zu schalten
$Verbrauchaktuell = getvalue(21094 /*[Funktionen\Verbrauch aktuell\*\Gesamt]*/);
$Delta=$PV - $Verbrauchaktuell;
if ($Delta < -1 )
{
echo "kleiner Null wir kaufen  "; // Grundlast sind immer 1-2 Kw also hier lieber nicht schalten da Heizstab 2-4 KW hat
echo "@§@n";
echo $Delta;
setvalue(31405 /*[Funktionen\Heizung\Einschaltempfehlung]*/ ,false);
}
if ($Delta > 1  )
{
echo "mehr als 1 Watt und Positiv "; // Grundlast sind immer 1-2 Kw also hier lieber nicht schalten da Heizstab 2-4 KW hat
echo "@§@n";
echo $Delta;
setvalue(31405 /*[Funktionen\Heizung\Einschaltempfehlung]*/ ,false);
}
if ($Delta > 1001 && $Delta <= 2000)
{
echo "1000 Watt Über"; // an Wochenenden und Feiertagen also Betriebsfreie zeit zu überlegen
echo "@§@n";
echo $Delta;
}
if ($Delta > 2000  && $Delta < 4000 )
{
echo "mehr als 2000 Watt über"; // Ab hier Heizstab Nutzbar
echo "@§@n";
echo $Delta;
setvalue(31405 /*[Funktionen\Heizung\Einschaltempfehlung]*/ ,true);
}
?>
';
}

?>


Ich hoffe ich kenn einigen damit eine menge Arbeit abnehmen . Ganz großen Dank aber an Raketenschnecke für diesen Exporter , der das Exportieren erst möglich gemacht hat.

Hi Marcel,

ich werde erst im Laufe der kommenden Wochen eine Viessmann-Heizung in Betrieb nehmen.
Trotzdem an dieser Stelle schonmal vielen Dank für deinen Export! Ich denke, das könnte mir deutlich schneller aufs Pferd helfen :wink:

Gruß,
Michael

Moin Moin Jungs,

hat es einer geschafft den Partymodus zu setzen ? Ich sende das an die Anlage aber bei Abfrage kommt immer Partymodus ist aus :frowning:

Funktioniert bei mir. Anlagenkennung ist bei mir die 2094. Allerdings können Spar- und Party-Modus nicht gleichzeitig aktiv sein.

Hallo Kronos ,

die Anlagenkennung ist 52000 , das ist ein Integer Wert ich hoffe das passt so , denn die Gerätekennung habe ich nicht abgefragt.

Kannst du damit was anfangen ?

hat es einer geschafft den Partymodus zu setzen ? Ich sende das an die Anlage aber bei Abfrage kommt immer Partymodus ist aus

Nur mal um die Frage zu klären. Du sendest eine Befehlssequenz für den Partymodus an die Anlage. Schaltet Sie um oder nicht? Man könnte Deine Frage so intepretieren, dass nur das Zurücklesen des Status das Problem darstellt.

Hi Kronos ,

ich bin morgen auf der Baustelle und guck mir das mal vor Ort an , ich hatte versucht den Status zu setzen , kann aber dann nur per abfrage feststellen das er diesen nicht gesetzt hat , ich konnte auch mit dem Viessmann Tool 2.5 den Partymodus nicht setzen , daher muss ich mal gucken was passiert wenn ich vor ort den Status an der Anlage setze und dann abfrage . Dein Tip mit dem Sparmodus ist auf jeden Fall Gold wert denn das wird ja ein elementares Problem sein .

Das werde ich dir morgen berichten .

Vielen Dank für die schnelle Antwort

Es dauert (zumindest bei meiner Anlage) auch immer eine gewisse Zeit (5-60 Sekunden) bis er die Änderungen an der Anlage anzeigt. :rolleyes:

Mir war es während der Staun-und-Lern-Phase bis das Skript lief irgendwann zu blöd mit dem Laptop im Heizungskeller zu sitzen bzw. dauernd die Treppen zu rennen. Ich hatte da dann temporär eine Webcam hin gestellt und konnte ganz bequem von der Küchentheke aus prüfen was die Viessmann da so treibt.

Hi Kronos,

du willst wohl das mich meine Frau mich entmündigen lässt was :slight_smile:

Wenn Sie das schon wegen der Installation einer Webcam in Betracht zieht, hast Du ganz andere Probleme…:stuck_out_tongue:

Wir sehen uns dann in der Klapse.

Moin Moin Jungs,

ich war also gestern auf der Baustelle , ich kann mit der App am Apfel und an der Anlage den Partymodus einschalten mit der IPS Abfrage kommt allerdings ,auch nach 20 min. ,dieser Vorgang nicht an . auch mit dem Viessmann Tool sagt er mir das der Partymodus „Aus“ ist . Ich habe dazu keine Idee mehr.

Dann passt entweder die Befehlssequenz die Du an die Viessmann übermittelst nicht zu der Steuerung oder Dein Skript schickt nicht das was es senden sollte.

Nachdem aber das Tool auch nicht funktioniert tippe ich mal auf die Befehls-Sequenz. Bekommt Dein Skript denn den Party-Modus mit wenn Du es an der App/Heizung umstellst?

Moin Kronos ,

das ist es ja , der bekommt das garnicht mit auch dieses Viesmann Tool v-control1_2_5 , zeigt mir an das der Partymodus „Aus“ ist keine Ahnung was da abgeht. Aber ich denk mit dem Iphone kann man das auch mal schnell schalten. Das Viessmann App ist ja schon genial einfach für sowas. Nur eben schade das unser IPS das nicht macht.

Hallo zusammen,
ich muss meine Heizung irgendwie remote an den entfernt stehenden IPS-Server anbinden. Dazu steht an der Heizung bereits ein „vernetzter“ Raspberry. Macht es Sinn, anstelle von ser2net den vcontrold auf dem Raspberry laufen zu lassen? Dieser stellt ja bereits eine Socket-Schnittstelle zur Verfügung. Somit könnte ich die Skripte dann auf dem IPS deutlich vereinfachen, da die Device-abhängige Kodierung der Befehle bereits durch vcontrold gemacht wird.

Gruß
Peter

Genau so mache ich das seit längerer Zeit. Habe die IPS-Skripte trotz vieler Versuche nie zuverlässig zum Laufen gebracht. Dies insbesondere beim aktiven Schalten der Betriebszustände. Mit dem Raspberry und vcontrold lief es dann recht schnell recht rund :slight_smile:

Moin Moin,

Du schaltest dann am IPS , der dann den RASPI bedient ?