Q&A IPS RS Project Exporter

Mal ne unbedarfte Frage: Wie steht der Exporter zur IPSLibrary? Ist der Exporter der kleine „Quick and dirty“ Bruder der Library?

Danke & Gruß, Axel

Hallo Axel,
was genau meinst du?
per se ist der Exporter ein Stand-Alone Tool und ist von der Aufgabe/Ausrichtung m.E. was völlig Anderes.

Hi Swissboy, wollte es grad nachvollziehen, geht aber nicht mehr, weil das auch schon eine Kopie einer Kopie war (die ich auch schon gelöscht hatte) :smiley: Sorry, das ist kein ideales und kein perfektes beispiel und etwas hektisch zusammengedengelt. Sollte halt nur der veranschaulichung dienen.

falls du das vollständige Monitoring haben willst - da lungert noch ne etwas erweiterte Version auf meiner HP rum.
Und besten Dank für’s Feedback :wink:

Aber beide haben doch das Ziel der Wiederverwendbarkeit von Code, oder? Will das nur für mich einordnen.

Hi Axel,
je stärker man abstrahiert, desto vergleichbarer,klar. Dennoch würde ich hier gewaltige Unterschiede sehen:
die Library ist u.A. eine Unterstützung für Programmierer und Anwender, die eigene Funktionen zur weiteren, betriebsmässigen Nutzung bereit stellt. Und das ist nur eine sehr oberflächliche Beschreibung.
Wenn Du den Mehrwert der Library nutzen willst, muss du deine Projekte in diese inetgrieren bzw. die Funktionen in dein Projekt einbinden. Das bietet - wenn man es konsequent macht - eine Reihe Vorteile. Aber man muss zunächst die rahmenbedingungen schaffen.

Der Erporter hat wirklich nur die Funktion, Strukturen und Scripte einfach von System A zu System B zu transportieren und den Aufwand für eine Wiederinbetriebnahme auf System B zu minimieren. z.B. das u.U. sehr aufwändige Erstellen und Neuverlinken von Links, Events, WFE-Items etc.
Und um sowas mit dem Exporter zu tun, braucht man auf der Systemseite nichts vorbereiten (im Idealfall, praktisch ist das nicht immer so einfach).

Hallo Raketenschnecke

Also an einem ausführlichen Script wäre ich sicher interessiert! :slight_smile: Sofern du eins hast und abgeben kannst. Ich muss zwar einwerfen, dass ich in der Anfangsphase mit Version IPS < 2.5 dieses Problem mit der DB-Aktualisierung bei mir effektiv auch feststellen konnte. Aktuell aber ist es bei mir nicht mehr aufgetaucht, zumindest nicht seit der Umstellung auf die JSON-Datei.

Es ist aber nie schlecht sowas im Auge zu behalten und lieber die Sache monitoren als später bereuen… :slight_smile: Wer täglich an IPS werkelt schmerzt ein allenfalls nötiger Rückschritt auf eine Vorversion der Settings-DB älter einem Tag.

Gruss

na dann schau dich mal hier um: IP-Symcon: Monitoring Kernkomponenten (Settings & logging.db) | Raketenschnecke.net

Ich habe heute mal einen ersten Test gemacht. Tolles Projekt Andreas, weiter so!

Hi @ll, habe eben die V0.5 online gestellt (Download wie immer via Projektthread)

Changelog:
2012-10- V0.5
Features

  • Überschreiben von existierenden WFC-Items kann ein-/abgeschaltet werden (default: off)
  • neuverlinken von Variablen-Actionscripts

Bugfixes
*Fehler beim Austausch von alten ID’s in Scripts behoben (alte ID’s wurden in bestimten Fällen ausgetauscht,
auch wenn diese gar nicht Bestandteil des Objektbaumes waren)

Wie nicht anders zu erwarten läuft der DB und Settings Monitor problemlos und gibt mir die Sicherheit das mein nächtlicher Backup keinen Schrott aufhebt, schönes Tool

Den Exporter will ich hauptsächlich dazu einsetzen mir Projekt Backups/Snapshots zu erstellen für den Fall das ich mich verrannt habe und wieder auf einen alten Stand zurück muss.

Das verteilen von SW an die Community dauert bei mir noch aber lieber spät als nie :slight_smile:

@Raketenschnecke : Herzlichen Dank das wir Deine Tools mit benutzen können

Servus

Hab grad mit der rev0.5 etwas rumgespielt, aber ehrlich gesagt mit weniger weniger Erfolg.
Ziel: Eine Kategorie und einen Webfrontkonfigurator duplizieren

Nun, in der Kategorie lagen nur Dummy Module und Links. Die hat er zwar alle brav angelegt, aber die Links nicht verlinkt. Ok, lt. Doku scheint das noch zu fehlen.

Den WF Konfigurator hab ich erst manuell angelegt und alle Defaultobjekte rausgelöscht.
Die ID dann im Importscript eingetragen. Hmm passiert ist nichts. Das WF ist immer noch leer.
Kann es daran liegen, das meine Root ID im UrsprungsWF nicht ‚itemxxxx‘ sondern ‚Menu‘ heist ?
‚Menu‘ ist natürlich im Exporter eingetragen, ID stimmt auch.

Tjo, ist nix großes, kann ich auch leicht händisch erstellen, wollte es dir nur rückmelden.
Brauchst irgendwelche Files ?

gruß
bb

Hi bb,

danke für die Rückmeldung,
wenn was nicht funktioniert, muss ich mich drum kümmern :wink:

Zu den Links: wenn das Links waren, die auf Objekte ausserhalb der zu kopierenden Kategorie (= Quellprojekt) lagen, dann werden die nicht verlinkt. Geht auch nicht, weil ich im Zielsystem nicht wissen kann, auf welche Objekte im Zielsystem verlinkt werden soll.
Wenn es Objekte innerhalb des zu kopierenden Projektes gewesen sind, habe ich ein Problem und muss das mal nachstellen

Den WF Konfigurator hab ich erst manuell angelegt und alle Defaultobjekte rausgelöscht.
Die ID dann im Importscript eingetragen. Hmm passiert ist nichts. Das WF ist immer noch leer.
Kann es daran liegen, das meine Root ID im UrsprungsWF nicht ‚itemxxxx‘ sondern ‚Menu‘ heist ?
‚Menu‘ ist natürlich im Exporter eingetragen, ID stimmt auch.

überhaupt nichts angelegt? was sagen denn die Install-Meldungen im Script-Meldefenster dazu? Wenn er nicht das richtige root-Item findet, landen die neuen Items auf Ebene 0 im WFC (und sind dann im WFE nicht zu sehen), aber sie sollen im WFC erzeugt werden
kannst du mir irgendwie das Exportfile zukommen lassen?

Ja, die Links zeigen nach außerhalb.
Ist eine klassische Kategorie die nur fürs WF erstellt wurde.

WFC ist komplett leer.
Hier das Script:

																														' Version 0.5, 03.10.2012';
/**********************************************************************************************************************
*  this Install-Script was automated generated by IPS RS Project-Exporter                                             *
*  © by Raketenschnecke 2012, mail: raketenschnecke@gmx.de                                                            *
*  // Projekt-HomePage: http://www.raketenschnecke.net/2012/09/25/ips-rs-project-exporter/                            *
**********************************************************************************************************************/

/**********************************************************************************************************************
	Project: Wohnzimmer (Quell-ID: 26373), generated on 06.10.2012, 20:16 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 (Konfigurationen sind nicht notwendig. Es werden alle *
*	notwendigen Strukturen (Kategorien, Variablen, Scripte etc) aus dem Quell-Projekt im Ziel-Projekt angelegt (derzeit*
*	ohne Links, Events)                                                                                                *
*	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.                             *
*                                                                                                                     *
**********************************************************************************************************************/

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

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

// Copy-Parameter (1: Objekte werden im Zielsystem installiert; 0: Objekte werden nicht installiert) +++++++++++++++++
	$Categorys                 = 1;
	$Variables                 = 1;
	$Instances                 = 1;
	$Scripts                 	= 1;
	$Events                 	= 1;
	$Links                 		= 1;
	$Media                     = 0;     // noch nicht implementiert
	$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 ############################################################################

// Script self-renaming
	if(IPS_GetName($_IPS['SELF']) != 'Wohnzimmer (Quell-ID: 26373) 2012_10_06-20_16') IPS_SetName($_IPS['SELF'], 'Wohnzimmer (Quell-ID: 26373) 2012_10_06-20_16');


// Inventorys laden
	$Inv 				= ObjectInventory();
	$VProfInv		= VarProfileInventory();

// Parameters-Array erzeugen
   $Parameters	= array('Cat'=>$Categorys, 'Inst'=>$Instances, 'Var'=>$Variables, 'Scr'=>$Scripts, 'Evnt'=>$Events,
								'Lnk'=>$Links, 'Med'=>$Media, 'VarProfile'=>$VarProfile, 'ScrOverwrite'=>$existsScriptsoverwrite);

// 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);

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

	// Installationsprotokoll schreiben
	CreateProtocolFile($InstProtocol);

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

// 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));
			// VariablenProfil
		}

		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;
			//print_r($VarProfile);

			// 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]);
			}
		}
		//print_r($VarProfile);
		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))
		   {
		      echo "Profil $Profilname wird gelöscht und neu angelegt
";
		      if(IPS_VariableProfileExists($Profilname)) IPS_DeleteVariableProfile($Profilname);
			}
			else
			{
		    	echo "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']);
				echo "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']);
					}
				}
	       	echo "Profil $Profilname neu 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]);
//print_r($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);
		}
	}
	//print_r($Objects);
	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);
		}
	}
	//print_r($Childs);
	return $Childs;
}

// Einzel-Objekt aus Inventory generieren
function createObject($ObjID)
{
   global $Inv;
	// 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));

   for($p=0;$p<count($DataSet);$p++)
   {
	   $Key  		= explode(',', $DataSet[$p])[0];
		$Value  		= explode(',', $DataSet[$p])[1];
		$Object[$Key]	= $Value;
	}
	// Anlage des realen Objektes im Ziel-Projekt
		//$Object['newObjectID']	= Objekteanlegen($Object, 1);

	// Childs ankleben
   for($i=0;$i<count($Inv);$i++)
   {
		$DataSet = explode(';', substr(preg_replace("/\r|
/s", "", $Inv[$i]),0, -1));
		//print_r($DataSet);
	   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'];
	}
	//print_r($Object);
	return $Object;
}

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

   switch ($Object['ObjectType'])
	{
		case 0: // Kategorien
		   if($Parameters['Cat'] == 1)
		   {
				$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, $Object['newParentID']);
				echo "Kategorie ".$Object['ObjectName'].", ID #$Cat_ID angelegt
";
				$Object['newObjectID']  = $Cat_ID;
			   return $Object;
			}
			else
			{
				echo "Kategorie ".$Object['ObjectName']." nicht angelegt (Option abgeschaltet)
";
			}
		break;

		case 1:  // Instanzen
			if($Parameters['Inst'] == 1)
		   {
				$Inst_ID		= IPS_CreateInstance($Object['ModuleID']);
			   IPS_SetName($Inst_ID, $Object['ObjectName']);
			   if(isset($Inst_ID, $Object['newParentID'])) IPS_SetParent($Inst_ID, $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);
			   echo "Instanz ".$Object['ObjectName'].", ID #$Inst_ID angelegt
";
			   $Object['newObjectID']  = $Inst_ID;
			   return $Object;
		   }
			else
			{
				echo "Instanz ".$Object['ObjectName']." nicht angelegt (Option abgeschaltet)
";
			}
		break;

		case 2:  // Variablen, nur anlegen, wenn sie nicht mit einer Instanz verküpft sind ($Object['ObjectIsReadOnly'] == 0)
			if(($Parameters['Var'] == 1) && ((int)$Object['ObjectIsReadOnly'] == 0))
		   {
		      $ah_ID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archive Handler
				$Var_ID           = IPS_CreateVariable((int)$Object['ValueType']);
			   IPS_SetName($Var_ID, $Object['ObjectName']);
			   if(isset($Var_ID, $Object['newParentID'])) IPS_SetParent($Var_ID, $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']);
			   echo "Variable ".$Object['ObjectName'].", ID #$Var_ID angelegt
";
			   $Object['newObjectID']  = $Var_ID;
			   return $Object;
			}
			else
			{
			   if($Parameters['Var'] == 0)
			   {
					echo "Variable ".$Object['ObjectName']." nicht angelegt (Option abgeschaltet)
";
				}
				elseif((int)$Object['ObjectIsReadOnly'] == 1)
				{
				   echo "Variable ".$Object['ObjectName']." nicht angelegt (wird automatisch durch IPS-Modul angelegt)
";
				}
			}
		break;

		case 3: // Scripte
			if($Parameters['Scr'] == 1)
		   {
			   $Scr_Name 			= $Object['ObjectName'];
			   $Scr_oldID 			= @IPS_GetScriptIDByFile($Object['ScriptFile']);
			   if(($Parameters['ScrOverwrite'] == 1)   && ($Scr_oldID != 0))     // Bei Scriptoverwrite = 1: bestehendes Script löschen
			   {
			      // Skript inklusive Datei löschen, File wird in "Deleted"-Ordner verschoben
			      IPS_DeleteScript($Scr_oldID, false);
			      echo "altes Script (ID $Scr_oldID, ".$Object['ObjectName'].") gelöscht (Option Script overwrite eingeschaltet)
";
			      $Scr_oldID 			= 0;
			   }
			   $ScrFunctionName	= preg_replace('/[^a-zA-Z]/', '',$Scr_Name).$Object['ObjectID'];
      		$Scr_Content      = $ScrFunctionName();
      		$Scr_Content      = stripslashes($ScrFunctionName());
      		$Scr_Content      = str_replace("@§@", "\\",$Scr_Content);
			   $Scr_ID 				= IPS_CreateScript(0);
				IPS_SetName($Scr_ID, $Scr_Name);
				if(isset($Scr_ID, $Object['newParentID'])) IPS_SetParent($Scr_ID, $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];
				//Scriptfile umbenenen, wenn keine IPS-ID vergeben
				if(($Scr_IPS_ID != $Object['ObjectID']) && ($Scr_oldID == 0))
				{
					rename($Scr_ID.".ips.php", $Object['ScriptFile']);
					IPS_SetScriptFile($Scr_ID, $Object['ScriptFile']);
					echo "Script $Scr_Name, ID #".$Object['ScriptFile']." angelegt
";
				}
				else
				{
					echo "Script $Scr_Name, ID #$Scr_ID angelegt
";
				}
				$Object['newObjectID']  = $Scr_ID;

			   return $Object;
			}
			else
			{
				echo "Script ".$Object['ObjectName']." nicht angelegt (Option abgeschaltet)
";
			}
		break;

		case 4: // Events
			if($Parameters['Evnt'] == 1)
		   {
			   $Evnt_Name 			= $Object['ObjectName'];
		      $Evnt_ID = IPS_CreateEvent((int)$Object['EventType']);
		      if(isset($Evnt_ID, $Object['newParentID'])) IPS_SetParent($Evnt_ID, $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)
				{
				   IPS_SetEventTrigger($Evnt_ID, (int)$Object['TriggerType'], 0);     //!!! (int)$Object['TriggerVariableID'] Auslöser ID derzeit nur ParentObject !!
				   if((int)$Object['TriggerType'] == 4)
					IPS_SetEventTriggerValue($Evnt_ID, $Object['TriggerValue']);                                // !!! Möglicherweise noch fehlerhaft !!!
					IPS_SetEventTriggerSubsequentExecution($Evnt_ID, (bool)$Object['TriggerSubsequentExecution']);
				}
				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']);
					//if((int)$Object['CyclicDateType'] == 1)
					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']);
				}
				IPS_SetEventActive($Evnt_ID, false);  // Ereignis nach Installation immer inaktiv
				// PHP-Code einschleusen, wenn vorhanden
				$FuncName   = 'Event'.$Object['ObjectID'];
				if(function_exists($FuncName))
				{
					$FuncContent 					= $FuncName();
					IPS_SetEventScript($Evnt_ID, $FuncContent);
				}
			   echo "Event-Objekt ".$Object['ObjectName'].", ID #".$Evnt_ID." angelegt!
";
			   $Object['newObjectID']  = $Evnt_ID;
				return $Object;
			}
		   else
			{
				echo "Event ".$Object['ObjectName']." nicht angelegt (Option abgeschaltet)
";
			}

		break;

		case 5: // Media-Objekte
			if($Parameters['Med'] == 1)
		   {
			   echo "!!! Media-Objekt ".$Object['ObjectName'].", Original-ID #".$Object['ObjectID']." NICHT angelegt!
";
			   return 0;
		   }
			else
			{
				echo "Media-Objekt ".$Object['ObjectName']." nicht angelegt (Option abgeschaltet)
";
			}
		break;

		case 6: // Links
			if($Parameters['Lnk'] == 1)
		   {
		      $Lnk_Name 			= $Object['ObjectName'];
		      $Lnk_ID = IPS_CreateLink();
		      if(isset($Lnk_ID, $Object['newParentID'])) IPS_SetParent($Lnk_ID, $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]*/);
			   echo "Link-Objekt ".$Object['ObjectName'].", Original-ID #".$Object['ObjectID']." angelegt!
";

			}
		   else
			{
				echo "Link ".$Object['ObjectName']." nicht angelegt (Option abgeschaltet)
";
			}
			$Object['newObjectID']  = $Lnk_ID;
			return $Object;

		break;
	}
	//print_r($Object);
//return $Object;
}

// nachträgliche Verlinkung aller neu installierten Objekte
function linknewObjects($ObjLinkTree)
{
   global $ObjInstallTree;
   global $newTgtID;
   global $newObjID;
   for($i=0;$i<count($ObjLinkTree);$i++)
   {
      $newObjID		= 0;
      $newTgtID		= 0;
      // Inventory nach 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
		{
         // aktuellen Scriptnamen finden
			$newTargetID = findNewTargetID($ObjInstallTree, $ObjLinkTree[$i]['VariableCustomAction']);
         IPS_SetVariableCustomAction($ObjLinkTree[$i]['newObjectID'], $newTargetID);
         echo "Variable ".$ObjLinkTree[$i]['ObjectName'].", ID ".$ObjLinkTree[$i]['newObjectID'].", neues Actionscript ID $newTargetID zugewiesen
";

	   }
      elseif($ObjLinkTree[$i]['ObjectType'] == 3)     // Scripts nach austauschbaren IDs durchsuchen
		{
         // aktuellen Scriptnamen finden
         $newObjID = 0;
			$Scr  = IPS_GetScript($ObjLinkTree[$i]['newObjectID'])['ScriptFile'];
			//echo "Script ".$ObjLinkTree[$i]['ObjectName'].", (Filename: $Scr) wird durchsucht
";
         changeObjectIDs_inScript($ObjInstallTree, $Scr);

	   }
      elseif($ObjLinkTree[$i]['ObjectType'] == 4)
		{
		   $newTgtID   =0;
			$newTargetID = findNewTargetID($ObjInstallTree, $ObjLinkTree[$i]['TriggerVariableID']);
			//echo "suche TriggerVariableID ".$ObjLinkTree[$i]['TriggerVariableID'].", newTargetID Event gefunden: ".$newTargetID."
";
			// neue Verlinkung setzen
			if($newTgtID !=0)
			{
				IPS_SetEventTrigger((int)$ObjLinkTree[$i]['newObjectID'], (int)$ObjLinkTree[$i]['TriggerType'], $newTgtID);
				echo "Link ".$ObjLinkTree[$i]['ObjectName'].", ID".$ObjLinkTree[$i]['newObjectID']." neu verlinkt
";
		   }
		   else
		   {
		      echo "Link ".$ObjLinkTree[$i]['ObjectName'].", ID".$ObjLinkTree[$i]['newObjectID']." NICHT verlinkt, kein Target innerhalb des Zielprojektes gefunden
";
		   }
	   }
      elseif($ObjLinkTree[$i]['ObjectType'] == 6)
		{
		   $newTgtID   =0;
			$newTargetID = findNewTargetID($ObjInstallTree, $ObjLinkTree[$i]['LinkChildID']);
			//echo "suche LinkChildID ".$ObjLinkTree[$i]['LinkChildID'].", newTargetID Link gefunden: ".$newTargetID."
";
			if($newTgtID !=0)
			{
				IPS_SetLinkTargetID((int)$ObjLinkTree[$i]['newObjectID'], $newTgtID);
				echo "Link ".$ObjLinkTree[$i]['ObjectName'].", ID".$ObjLinkTree[$i]['newObjectID']." neu verlinkt
";
			}
			else
			{
				echo "Link ".$ObjLinkTree[$i]['ObjectName'].", ID".$ObjLinkTree[$i]['newObjectID']." NICHT verlinkt, kein Target innerhalb des Zielprojektes gefunden
";
			}
	   }

	   // Objekt-Childs durchsuchen
	   if(isset($ObjLinkTree[$i]['ChildrenIDs']))
	   {
	      //echo "durchsuche Childs:
";
	      $newLnkTree = $ObjLinkTree[$i]['ChildrenIDs'];
         linknewObjects($newLnkTree);
         //unset($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;
   $ScrContent = file(IPS_GetKernelDir()."scripts\\".$Scr);
	$file 		= fopen(IPS_GetKernelDir()."scripts\\".$Scr, "w");
	$search 		= '/[1-5]\d\d\d\d/'; // 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[0]))
		{
		   $oldID   		= $matches[0];
			$newObjectID   = findNewObjectID($ObjLinkTree, $oldID);
			if(($matches[0] == $oldID) && ($newObjectID >0))
			{
			   $z = str_replace($oldID, $newObjectID, $z);
			   echo "Script ID$Scr, Inhalt verändert: Zeile $counter, alte ID($oldID) gegen neue ID($newObjectID) getauscht
";
			}
			else
			{
			   echo "Script ID$Scr, Inhalt NICHT verändert: Zeile $counter, alte 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;

	// 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
		for($i=0;$i<count($WFC_Raw);$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
			   $newTargetID   		= NULL;
			   unset						  ($matches);
            $search 					= '/[1-5]\d\d\d\d/'; // suche 5stellige Zahlen von 10.000 - 59.999
            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]);
				unset($newObjID);

			// Namen für neues WFC-Item ändern (Präfix "Cpy" hinzufügen)
				if(strpos($WFC_Values[2][1], 'roottp') == 0)
				$WFC_Values[2][1] = str_replace('"name":"', '"name":"Cpy', $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], 'Cpy'.$WFC_Values[3][1], $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], 'Cpy'.$WFC_Values[4][1], $WFC_Values[4][1]);

			// Ziel-Inventory nach vorhandenen Elementen durchsuchen
				$Item_exist = 0;
				foreach($WFC_Target_Inventory as $value)
				{
					if($value['ID'] == $WFC_Values[3][1])
					{
						if($WFC_existItemoverwrite == 0) // wenn Überschreib-Obtion abgeschaltet
						{
							$Item_exist = 1;
							break;
						}
						else
						{
						   WFC_DeleteItem($WFC_TargetID, $WFC_Values[3][1]); // vorhandenes Item löschen
						   echo "WFC-Item ".$WFC_Values[3][1]." gelöscht (Option eingeschaltet)
";
						}
					}
				}

			// Wenn Item im Ziel-WFC nicht vorhanden, dann installieren
				if($Item_exist == 0)
				{
				   echo "WFC-Item ".$WFC_Values[3][1]." installiert
";
					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]);
				}
				else
				{
				   echo "WFC-Item ".$WFC_Values[3][1]." nicht installiert, da bereits vorhanden
";
				}

			unset($WFC_Values);
			unset($WFC_DataSet);
		}
	}
	else
	{
	   echo "keine WFE-Installation möglich (kein Quell-Inventory oder kein Ziel-WFE gefunden)
";
	}
}

// Protokoll
	print_r(@$MessageProkoll);



############################### Installations-Protokoll ##################################################
// +++ erstellt Installations-Protokoll Objekt-Inventory für Exportscript ++++++++++++++
function createObjInventoryProtocol($ObjInstInv)
{
	// Object-Inventory Function-Kopf generieren
	$s = "<?
";
	$s .= "// ### InstallationsProtokoll vom ".date("d.m.Y, H:i:s", time())." #############################

";
	$s .= "
";
	$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 $ObjInstProtocol;'."
";
	$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']);

	// 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: IPS RS 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()
{
$raw = '
CopyParameters,;Cat,1;Inst,1;Var,1;Scr,1;Evnt,1;Lnk,1;Med,0;VarProfile,1;ScrOverwrite,0;
ObjectID,26373 /*[Webfront\Wohnzimmer]*/;HasChildren,1;ObjectIcon,;ObjectID,26373 /*[Webfront\Wohnzimmer]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Wohnzimmer;ObjectPosition,0;ObjectSummary,;ObjectType,0;ParentID,53483 /*[Webfront]*/;
ObjectID,14517 /*[Webfront\Wohnzimmer\Status]*/;HasChildren,1;ObjectIcon,;ObjectID,14517 /*[Webfront\Wohnzimmer\Status]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Status;ObjectPosition,0;ObjectSummary,;ObjectType,0;ParentID,26373 /*[Webfront\Wohnzimmer]*/;
ObjectID,34397 /*[Webfront\Wohnzimmer\Status\Türmelder]*/;HasChildren,1;ObjectIcon,;ObjectID,34397 /*[Webfront\Wohnzimmer\Status\Türmelder]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Türmelder;ObjectPosition,10;ObjectSummary,;ObjectType,1;ParentID,14517 /*[Webfront\Wohnzimmer\Status]*/;ConnectionID,0;InstanceID,34397 /*[Webfront\Wohnzimmer\Status\Türmelder]*/;InstanceStatus,102;LastChange,0;ModuleID,{485D0419-BE97-4548-AA9C-C083EB82E61E};ModuleName,Dummy Module;ModuleType,3;
ObjectID,20176 /*[Webfront\Wohnzimmer\Status\Türmelder\Werkzeugschuppen]*/;HasChildren,;ObjectIcon,;ObjectID,20176 /*[Webfront\Wohnzimmer\Status\Türmelder\Werkzeugschuppen]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Werkzeugschuppen;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,34397 /*[Webfront\Wohnzimmer\Status\Türmelder]*/;LinkChildID,55856 /*[Türkontakte\Werkzeugschuppen\Status]*/;LinkID,20176 /*[Webfront\Wohnzimmer\Status\Türmelder\Werkzeugschuppen]*/;TargetID,55856 /*[Türkontakte\Werkzeugschuppen\Status]*/;
ObjectID,20998 /*[Webfront\Wohnzimmer\Status\Türmelder\Gartentür]*/;HasChildren,;ObjectIcon,;ObjectID,20998 /*[Webfront\Wohnzimmer\Status\Türmelder\Gartentür]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Gartentür;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,34397 /*[Webfront\Wohnzimmer\Status\Türmelder]*/;LinkChildID,55642 /*[Türkontakte\Gartentür\Status]*/;LinkID,20998 /*[Webfront\Wohnzimmer\Status\Türmelder\Gartentür]*/;TargetID,55642 /*[Türkontakte\Gartentür\Status]*/;
ObjectID,30102 /*[Webfront\Wohnzimmer\Status\Türmelder\Garagentor]*/;HasChildren,;ObjectIcon,;ObjectID,30102 /*[Webfront\Wohnzimmer\Status\Türmelder\Garagentor]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Garagentor;ObjectPosition,90;ObjectSummary,;ObjectType,6;ParentID,34397 /*[Webfront\Wohnzimmer\Status\Türmelder]*/;LinkChildID,55775 /*[Türkontakte\Garagentor\Torposition]*/;LinkID,30102 /*[Webfront\Wohnzimmer\Status\Türmelder\Garagentor]*/;TargetID,55775 /*[Türkontakte\Garagentor\Torposition]*/;
ObjectID,30420 /*[Webfront\Wohnzimmer\Status\Türmelder\Küchentür]*/;HasChildren,;ObjectIcon,;ObjectID,30420 /*[Webfront\Wohnzimmer\Status\Türmelder\Küchentür]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Küchentür;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,34397 /*[Webfront\Wohnzimmer\Status\Türmelder]*/;LinkChildID,44447 /*[Türkontakte\Küchentür\Status]*/;LinkID,30420 /*[Webfront\Wohnzimmer\Status\Türmelder\Küchentür]*/;TargetID,44447 /*[Türkontakte\Küchentür\Status]*/;
ObjectID,33909 /*[Webfront\Wohnzimmer\Status\Türmelder\Garagentor Öffner]*/;HasChildren,;ObjectIcon,;ObjectID,33909 /*[Webfront\Wohnzimmer\Status\Türmelder\Garagentor Öffner]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Garagentor Öffner;ObjectPosition,99;ObjectSummary,;ObjectType,6;ParentID,34397 /*[Webfront\Wohnzimmer\Status\Türmelder]*/;LinkChildID,27505 /*[Räume\Keller\Garagentoröffner\Toröffner]*/;LinkID,33909 /*[Webfront\Wohnzimmer\Status\Türmelder\Garagentor Öffner]*/;TargetID,27505 /*[Räume\Keller\Garagentoröffner\Toröffner]*/;
ObjectID,22033 /*[Webfront\Wohnzimmer\Status\Bewegungsmelder\Garten]*/;HasChildren,;ObjectIcon,;ObjectID,22033 /*[Webfront\Wohnzimmer\Status\Bewegungsmelder\Garten]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Garten;ObjectPosition,20;ObjectSummary,;ObjectType,6;ParentID,54013 /*[Webfront\Wohnzimmer\Status\Bewegungsmelder]*/;LinkChildID,54596 /*[Bewegungsmelder\Bewegungssensor_Garten\Status_für_WF]*/;LinkID,22033 /*[Webfront\Wohnzimmer\Status\Bewegungsmelder\Garten]*/;TargetID,54596 /*[Bewegungsmelder\Bewegungssensor_Garten\Status_für_WF]*/;
ObjectID,47550 /*[Webfront\Wohnzimmer\Status\Bewegungsmelder\Parkplatz]*/;HasChildren,;ObjectIcon,;ObjectID,47550 /*[Webfront\Wohnzimmer\Status\Bewegungsmelder\Parkplatz]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Parkplatz;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,54013 /*[Webfront\Wohnzimmer\Status\Bewegungsmelder]*/;LinkChildID,30547 /*[Bewegungsmelder\Bewegungssensor_Parkplatz\Status_für_WF]*/;LinkID,47550 /*[Webfront\Wohnzimmer\Status\Bewegungsmelder\Parkplatz]*/;TargetID,30547 /*[Bewegungsmelder\Bewegungssensor_Parkplatz\Status_für_WF]*/;
ObjectID,50504 /*[Webfront\Wohnzimmer\Status\Bewegungsmelder\Terrasse]*/;HasChildren,;ObjectIcon,;ObjectID,50504 /*[Webfront\Wohnzimmer\Status\Bewegungsmelder\Terrasse]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Terrasse;ObjectPosition,10;ObjectSummary,;ObjectType,6;ParentID,54013 /*[Webfront\Wohnzimmer\Status\Bewegungsmelder]*/;LinkChildID,43614 /*[Bewegungsmelder\Bewegungssensor_Terrasse\Status_für_WF]*/;LinkID,50504 /*[Webfront\Wohnzimmer\Status\Bewegungsmelder\Terrasse]*/;TargetID,43614 /*[Bewegungsmelder\Bewegungssensor_Terrasse\Status_für_WF]*/;
ObjectID,15190 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten\Sonnen Auf/Untergang]*/;HasChildren,;ObjectIcon,;ObjectID,15190 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten\Sonnen Auf/Untergang]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Sonnen Auf/Untergang;ObjectPosition,30;ObjectSummary,;ObjectType,6;ParentID,39301 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten]*/;LinkChildID,16764 /*[gemeinsame Objekte\Astrotimer\write_Sonnenstunden\Sonnen Auf/Untergang]*/;LinkID,15190 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten\Sonnen Auf/Untergang]*/;TargetID,16764 /*[gemeinsame Objekte\Astrotimer\write_Sonnenstunden\Sonnen Auf/Untergang]*/;
ObjectID,32587 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten\Wind Geschwindigkeit]*/;HasChildren,;ObjectIcon,;ObjectID,32587 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten\Wind Geschwindigkeit]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Wind Geschwindigkeit;ObjectPosition,15;ObjectSummary,;ObjectType,6;ParentID,39301 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten]*/;LinkChildID,54435 /*[Garten\KS300 Wetterstation\Wind Geschwindigkeit]*/;LinkID,32587 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten\Wind Geschwindigkeit]*/;TargetID,54435 /*[Garten\KS300 Wetterstation\Wind Geschwindigkeit]*/;
ObjectID,43143 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten\Helligkeit]*/;HasChildren,;ObjectIcon,;ObjectID,43143 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten\Helligkeit]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Helligkeit;ObjectPosition,25;ObjectSummary,;ObjectType,6;ParentID,39301 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten]*/;LinkChildID,22388 /*[Garten\Helligkeit]*/;LinkID,43143 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten\Helligkeit]*/;TargetID,22388 /*[Garten\Helligkeit]*/;
ObjectID,47577 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten\Temperatur]*/;HasChildren,;ObjectIcon,;ObjectID,47577 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten\Temperatur]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Temperatur;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,39301 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten]*/;LinkChildID,32508 /*[Garten\KS300 Wetterstation\Temperatur\log]*/;LinkID,47577 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten\Temperatur]*/;TargetID,32508 /*[Garten\KS300 Wetterstation\Temperatur\log]*/;
ObjectID,47768 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten\Luftfeuchtigkeit]*/;HasChildren,;ObjectIcon,;ObjectID,47768 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten\Luftfeuchtigkeit]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Luftfeuchtigkeit;ObjectPosition,10;ObjectSummary,;ObjectType,6;ParentID,39301 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten]*/;LinkChildID,45615 /*[Garten\KS300 Wetterstation\Luftfeuchtigkeit]*/;LinkID,47768 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten\Luftfeuchtigkeit]*/;TargetID,45615 /*[Garten\KS300 Wetterstation\Luftfeuchtigkeit]*/;
ObjectID,14373 /*[Webfront\Wohnzimmer\Licht\Licht\Flur Inneseite]*/;HasChildren,;ObjectIcon,;ObjectID,14373 /*[Webfront\Wohnzimmer\Licht\Licht\Flur Inneseite]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Flur Inneseite;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,18478 /*[Webfront\Wohnzimmer\Licht\Licht]*/;LinkChildID,39158 /*[Licht\Flur Erdgeschoß\Status]*/;LinkID,14373 /*[Webfront\Wohnzimmer\Licht\Licht\Flur Inneseite]*/;TargetID,39158 /*[Licht\Flur Erdgeschoß\Status]*/;
ObjectID,26246 /*[Webfront\Wohnzimmer\Licht\Licht\Garage]*/;HasChildren,;ObjectIcon,;ObjectID,26246 /*[Webfront\Wohnzimmer\Licht\Licht\Garage]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Garage;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,18478 /*[Webfront\Wohnzimmer\Licht\Licht]*/;LinkChildID,48134 /*[Licht\ZK_Relaisgruppe\Licht Garage]*/;LinkID,26246 /*[Webfront\Wohnzimmer\Licht\Licht\Garage]*/;TargetID,48134 /*[Licht\ZK_Relaisgruppe\Licht Garage]*/;
ObjectID,33351 /*[Webfront\Wohnzimmer\Licht\Licht\Außenbeleuchtung]*/;HasChildren,;ObjectIcon,;ObjectID,33351 /*[Webfront\Wohnzimmer\Licht\Licht\Außenbeleuchtung]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Außenbeleuchtung;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,18478 /*[Webfront\Wohnzimmer\Licht\Licht]*/;LinkChildID,57684 /*[Licht\ZK_Relaisgruppe\Außenbeleuchtung]*/;LinkID,33351 /*[Webfront\Wohnzimmer\Licht\Licht\Außenbeleuchtung]*/;TargetID,57684 /*[Licht\ZK_Relaisgruppe\Außenbeleuchtung]*/;
ObjectID,44301 /*[Webfront\Wohnzimmer\Licht\Licht\Kellerstiege]*/;HasChildren,;ObjectIcon,;ObjectID,44301 /*[Webfront\Wohnzimmer\Licht\Licht\Kellerstiege]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Kellerstiege;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,18478 /*[Webfront\Wohnzimmer\Licht\Licht]*/;LinkChildID,29828 /*[Licht\ZK_Relaisgruppe\Licht Kellerstiege]*/;LinkID,44301 /*[Webfront\Wohnzimmer\Licht\Licht\Kellerstiege]*/;TargetID,29828 /*[Licht\ZK_Relaisgruppe\Licht Kellerstiege]*/;
ObjectID,59827 /*[Webfront\Wohnzimmer\Licht\Licht\Flur Türseite]*/;HasChildren,;ObjectIcon,;ObjectID,59827 /*[Webfront\Wohnzimmer\Licht\Licht\Flur Türseite]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Flur Türseite;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,18478 /*[Webfront\Wohnzimmer\Licht\Licht]*/;LinkChildID,37045 /*[Licht\ZK_Relaisgruppe\Licht Flur Türseite]*/;LinkID,59827 /*[Webfront\Wohnzimmer\Licht\Licht\Flur Türseite]*/;TargetID,37045 /*[Licht\ZK_Relaisgruppe\Licht Flur Türseite]*/;
ObjectID,47885 /*[Webfront\Wohnzimmer\Status\Program]*/;HasChildren,;ObjectIcon,;ObjectID,47885 /*[Webfront\Wohnzimmer\Status\Program]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Program;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,14517 /*[Webfront\Wohnzimmer\Status]*/;LinkChildID,19008 /*[Tabletts\Wohnzimmer\startApp]*/;LinkID,47885 /*[Webfront\Wohnzimmer\Status\Program]*/;TargetID,19008 /*[Tabletts\Wohnzimmer\startApp]*/;
ObjectID,54013 /*[Webfront\Wohnzimmer\Status\Bewegungsmelder]*/;HasChildren,1;ObjectIcon,;ObjectID,54013 /*[Webfront\Wohnzimmer\Status\Bewegungsmelder]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Bewegungsmelder;ObjectPosition,20;ObjectSummary,;ObjectType,1;ParentID,14517 /*[Webfront\Wohnzimmer\Status]*/;ConnectionID,0;InstanceID,54013 /*[Webfront\Wohnzimmer\Status\Bewegungsmelder]*/;InstanceStatus,102;LastChange,0;ModuleID,{485D0419-BE97-4548-AA9C-C083EB82E61E};ModuleName,Dummy Module;ModuleType,3;
ObjectID,39301 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten]*/;HasChildren,1;ObjectIcon,;ObjectID,39301 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Aktuelle Daten;ObjectPosition,0;ObjectSummary,;ObjectType,1;ParentID,25194 /*[Webfront\Wohnzimmer\Wetter]*/;ConnectionID,0;InstanceID,39301 /*[Webfront\Wohnzimmer\Wetter\Aktuelle Daten]*/;InstanceStatus,102;LastChange,0;ModuleID,{485D0419-BE97-4548-AA9C-C083EB82E61E};ModuleName,Dummy Module;ModuleType,3;
ObjectID,35676 /*[Webfront\Wohnzimmer\Events\Aktuelle Meldungen]*/;HasChildren,;ObjectIcon,;ObjectID,35676 /*[Webfront\Wohnzimmer\Events\Aktuelle Meldungen]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Aktuelle Meldungen;ObjectPosition,10;ObjectSummary,;ObjectType,6;ParentID,27458 /*[Webfront\Wohnzimmer\Events]*/;LinkChildID,19781 /*[Tabletts\Meldungsanzeige\Meldungen\Meldungen]*/;LinkID,35676 /*[Webfront\Wohnzimmer\Events\Aktuelle Meldungen]*/;TargetID,19781 /*[Tabletts\Meldungsanzeige\Meldungen\Meldungen]*/;
ObjectID,46176 /*[Webfront\Wohnzimmer\Events\Program]*/;HasChildren,;ObjectIcon,;ObjectID,46176 /*[Webfront\Wohnzimmer\Events\Program]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Program;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,27458 /*[Webfront\Wohnzimmer\Events]*/;LinkChildID,19008 /*[Tabletts\Wohnzimmer\startApp]*/;LinkID,46176 /*[Webfront\Wohnzimmer\Events\Program]*/;TargetID,19008 /*[Tabletts\Wohnzimmer\startApp]*/;
ObjectID,29370 /*[Webfront\Wohnzimmer\Satelitenbild/Vorhersage\Wolken]*/;HasChildren,;ObjectIcon,;ObjectID,29370 /*[Webfront\Wohnzimmer\Satelitenbild/Vorhersage\Wolken]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Wolken;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,47767 /*[Webfront\Wohnzimmer\Satelitenbild/Vorhersage]*/;LinkChildID,35619 /*[satelitenbild_scaled.jpg]*/;LinkID,29370 /*[Webfront\Wohnzimmer\Satelitenbild/Vorhersage\Wolken]*/;TargetID,35619 /*[satelitenbild_scaled.jpg]*/;
ObjectID,30614 /*[Webfront\Wohnzimmer\Satelitenbild/Vorhersage\Infrarot]*/;HasChildren,;ObjectIcon,;ObjectID,30614 /*[Webfront\Wohnzimmer\Satelitenbild/Vorhersage\Infrarot]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Infrarot;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,47767 /*[Webfront\Wohnzimmer\Satelitenbild/Vorhersage]*/;LinkChildID,11206 /*[satelitenbild2_scaled.jpg]*/;LinkID,30614 /*[Webfront\Wohnzimmer\Satelitenbild/Vorhersage\Infrarot]*/;TargetID,11206 /*[satelitenbild2_scaled.jpg]*/;
ObjectID,18478 /*[Webfront\Wohnzimmer\Licht\Licht]*/;HasChildren,1;ObjectIcon,;ObjectID,18478 /*[Webfront\Wohnzimmer\Licht\Licht]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Licht;ObjectPosition,0;ObjectSummary,;ObjectType,1;ParentID,50405 /*[Webfront\Wohnzimmer\Licht]*/;ConnectionID,0;InstanceID,18478 /*[Webfront\Wohnzimmer\Licht\Licht]*/;InstanceStatus,102;LastChange,0;ModuleID,{485D0419-BE97-4548-AA9C-C083EB82E61E};ModuleName,Dummy Module;ModuleType,3;
ObjectID,49385 /*[Webfront\Wohnzimmer\Konfiguration\Sprachausgabe]*/;HasChildren,;ObjectIcon,;ObjectID,49385 /*[Webfront\Wohnzimmer\Konfiguration\Sprachausgabe]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Sprachausgabe;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,55125 /*[Webfront\Wohnzimmer\Konfiguration]*/;LinkChildID,10620 /*[Tabletts\Wohnzimmer\Sprachausgabe]*/;LinkID,49385 /*[Webfront\Wohnzimmer\Konfiguration\Sprachausgabe]*/;TargetID,10620 /*[Tabletts\Wohnzimmer\Sprachausgabe]*/;
ObjectID,49422 /*[Webfront\Wohnzimmer\Konfiguration\Auto-Umschaltung]*/;HasChildren,;ObjectIcon,;ObjectID,49422 /*[Webfront\Wohnzimmer\Konfiguration\Auto-Umschaltung]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Auto-Umschaltung;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,55125 /*[Webfront\Wohnzimmer\Konfiguration]*/;LinkChildID,20100 /*[Tabletts\Wohnzimmer\Auto-Umschaltung]*/;LinkID,49422 /*[Webfront\Wohnzimmer\Konfiguration\Auto-Umschaltung]*/;TargetID,20100 /*[Tabletts\Wohnzimmer\Auto-Umschaltung]*/;
ObjectID,59516 /*[Webfront\Wohnzimmer\Konfiguration\Alarmton]*/;HasChildren,;ObjectIcon,;ObjectID,59516 /*[Webfront\Wohnzimmer\Konfiguration\Alarmton]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Alarmton;ObjectPosition,0;ObjectSummary,;ObjectType,6;ParentID,55125 /*[Webfront\Wohnzimmer\Konfiguration]*/;LinkChildID,44016 /*[Tabletts\Wohnzimmer\Alarmton]*/;LinkID,59516 /*[Webfront\Wohnzimmer\Konfiguration\Alarmton]*/;TargetID,44016 /*[Tabletts\Wohnzimmer\Alarmton]*/;
ObjectID,25194 /*[Webfront\Wohnzimmer\Wetter]*/;HasChildren,1;ObjectIcon,;ObjectID,25194 /*[Webfront\Wohnzimmer\Wetter]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Wetter;ObjectPosition,0;ObjectSummary,;ObjectType,0;ParentID,26373 /*[Webfront\Wohnzimmer]*/;
ObjectID,27458 /*[Webfront\Wohnzimmer\Events]*/;HasChildren,1;ObjectIcon,;ObjectID,27458 /*[Webfront\Wohnzimmer\Events]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Events;ObjectPosition,0;ObjectSummary,;ObjectType,0;ParentID,26373 /*[Webfront\Wohnzimmer]*/;
ObjectID,47767 /*[Webfront\Wohnzimmer\Satelitenbild/Vorhersage]*/;HasChildren,1;ObjectIcon,;ObjectID,47767 /*[Webfront\Wohnzimmer\Satelitenbild/Vorhersage]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Satelitenbild/Vorhersage;ObjectPosition,0;ObjectSummary,;ObjectType,0;ParentID,26373 /*[Webfront\Wohnzimmer]*/;
ObjectID,50405 /*[Webfront\Wohnzimmer\Licht]*/;HasChildren,1;ObjectIcon,;ObjectID,50405 /*[Webfront\Wohnzimmer\Licht]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Licht;ObjectPosition,0;ObjectSummary,;ObjectType,0;ParentID,26373 /*[Webfront\Wohnzimmer]*/;
ObjectID,55125 /*[Webfront\Wohnzimmer\Konfiguration]*/;HasChildren,1;ObjectIcon,;ObjectID,55125 /*[Webfront\Wohnzimmer\Konfiguration]*/;ObjectIdent,;ObjectInfo,;ObjectIsHidden,;ObjectIsReadOnly,;ObjectName,Konfiguration;ObjectPosition,0;ObjectSummary,;ObjectType,0;ParentID,26373 /*[Webfront\Wohnzimmer]*/;
';
echo "Inventory geladen
";
$Inv	= explode("
",substr(substr($raw, 1), 1, -1)); // ersten und letzten Zeilenumbruch entfernen
return $Inv;
}

// Variablen-Profile Inventory
function VarProfileInventory()
{
$raw = '
';
echo "VarProfile Inventory geladen
";
$VarProfiles	= explode("
",substr(substr($raw, 1), 1, -1)); // ersten und letzten Zeilenumbruch entfernen
return $VarProfiles;
}

// Function WFC Inventory
function loadWFCInventory()
{
$raw = '
';
echo "WFC Inventory geladen
";
$WFC_Inventory	= explode("
",substr(substr($raw, 1), 1, -1)); // ersten und letzten Zeilenumbruch entfernen
return $WFC_Inventory;
}

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

ID stimmen:



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

// Angaben für Quell-Projekt
	// max Scriptlaufzeit (hier kann die Laufzeitbegrenzung von PHP für dieses Script individuell hoch gesetzt werden
	$maxRunTime                = 30; // Default: 30 sec

	// hier die IDs des Quell-Projektes (Objektbaum) angeben
	$Root_ID              		= 26373 /*[Webfront\Wohnzimmer]*/ ;

	// hier die IDs des Quell-Projektes (WFC) angeben
	$WFC_ID     					= 54391 /*[Wohnzimmer]*/ ;    // gültige WFC-ID aus Zielsystem angeben (bei 0 -> keine WFE-Installation)
	$WFC_RootItem  				='Menu';     // Quell-Item aus WFC eintragen (Beispiel: 'item1794')

// Copy-Parameter (1: Objekte werden im Zielsystem installiert; 0: Objekte werden nicht installiert)
	'Note:  diese Einstellungen werden als Vorgabe 1:1 in das Exportscript übertragen und können dort vom Anwender
	ebenfalls angepasst werden                                                                                 ';
	$Categorys                 = 1;
	$Variables                 = 1;
	$Instances                 = 1;
	$Scripts                 	= 1;
	$Events                 	= 1;
	$Links                 		= 1;
	$Media                     = 0;     // noch nicht implementiert
	$VarProfile                = 1;     // true: überschreibt vorhandene Profile im Zielsystem, false: 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

// Script-Testlauf
	$Testlauf                  = 1;  // 0 = nur Exportfile schreiben, 1 = Export-File + Meldungsfenster, 2 = nur Meldungsfenster

hm, sehr merkwürdig: dein WFC-Inventory ist leer, d.h. es wurde nichts exportiert.

Ich hab eben mal ein Item mit Namen „Menu“ bei mir angelegt, das wird sauber exportiert.
Kannst du mal ein Screenshot deiner WFC-Struktur einstellen?

hab nochmal 1 und 1 zusammen gezählt: wen ich dein Posting richtig interpretiere, liegt der zu exportierende Objektbaum des WFC nicht unter dem Item „roottp“?

das ist kein Bug, sondern ein Feature :smiley: wenn auch undokumentiert: ich hab den copy-Job auf Elemente unterhalb von roottp eingeschränkt, um einen Startpunkt zu definieren. Ich bin bisher davon ausgegangen, dass jeder in seinem WFE ein „roottp“-Item als Root stehen hat und die eigenen Elemente da drunter hängt

Hi bb,

ich hab das Thema eben nochmal durch meinen Grübel-Kübel geschickt:

systembedingt muss ich ein Start-Item via Item-Name (= ID) definieren. Im Moment ist dass das Item „roottp“. Den einzigen Kompromiss, den ich sehe, hier etwas Flexibilität einzubauen, ist eine scriptinterne Variable oben im Konfigbereich, die als default „roottp“ enthält und vom Anwender mit dem Namen der lokal tats. vorhandenen Root-Items überschreiben kann.

Grundsätzlich machbar, aber wieder eine Konfigurationsmöglichkeit und damit Fehlerquelle mehr.
Sach mal bescheid, was Du davon hälst.

Das wird nicht funktionieren. Du kannst das Webfront ja gestalten wie du willst und ein roottp brauchst Du nicht.

Servus

Stimmt, das zu kopierende WF hat kein roottp

Ob es sich lohnt das zu berücksichtigen oder nicht- ??? werd ich morgen mal nachdenken. Mein Frau hat mich grad ins Schlafzimmer gerufen :D:D:D Pflichterfüllung ist jetzt erstmal wichtiger…

bb

hab grad nochmal was ausprobiert, was evtl. klappen könnte - ohne dass man den Parameter „roottp“ konfigurieren muss…muss noch ein bischen probieren, dann stell ich es online

kleine Ergänzung zur möglichen Lösung: es darf nicht mehr als ein Element im WFC-Root stehen (sind eh im WFE nicht zu sehen, es ist aber möglich, dort welche zu platzieren), siehe Bild. Tauchen dort „böse“ Elemente auf, funktioniert die Erkennungslogik nicht mehr.

Aus Eurer Sicht praktikabel?

RS.net Screenshot 001 2012-10-06.png