ich fände es sehr hilfreich wenn man Variablen kopieren könnte.
Also ich möchte eine fertige Variabe (Name, Profil, Logging usw. eingestellt) kopieren und wieder einfügen (mit einer neuen ObjektID).
Wäre sehr hilfreich wenn man viele Variablen vom selben Typ anlegen muss.
Ja das funktioniert schon so, aber anders wäre es noch komfortabler…
Ein Beispiel:
Ich lese von 4 Tankstellen den Dieselpreis aus und für jede brauche ich 9 Variablen.
Preis_aktuell, Min_Tag, Max_Tag, Min_Woche, Max_Woche, Min_Monat, Max_Monat, Min_Jahr und Max_Jahr
Das ganze hab ich für eine Tankstelle angelegt, jetzt wäre es einfach die 9 Variablen zu kopieren und unter den anderen 3 Tankstellen wieder eizufügen.
Ohne das man den Namen oder sonst was daran ändern müsste…
Hallo Erwoolf,
vielleicht hilft Dir das folgende Script weiter. Damit kannst Du Objekte unter einem vorgegebenen Knoten ($sourceRoot) unter einen anderen Knoten ($targetRoot) kopieren. Schon vorhandene Objekte unter dem TargetRoot werden ausgelassen.
Das Script ist noch nicht vollständig und etwas quick and dirty (Events klappen auch noch nicht), aber vielleicht kannst Du es ja auch an Deine Belange anpassen.
$sourceRoot=56541 /*[04 Installationen\WC\Raumheizung\RTR]*/;
$targetRoot=52078 /*[04 Installationen\Wohnzimmer\Raumheizung\RTR]*/;
CopyTree($sourceRoot,$targetRoot);
function CopyTree($sourceId,$targetId) {
$children=IPS_GetChildrenIDs ($sourceId);
$childrenTarget=IPS_GetChildrenIDs ($targetId);
foreach ($children as $id) {
$obj=IPS_GetObject($id);
$name=IPS_GetName($id);
$id2=@IPS_GetObjectIDByName($name,$targetId);
if ($id2==0) {
$type=$obj['ObjectType'];
$newId=0;
switch ($type) {
case 0:
$newId=IPS_CreateCategory ( );
Break;
case 2:
$var=IPS_GetVariable($id);
$newId=IPS_CreateVariable($var['VariableValue']['ValueType']);
Break;
case 3:
$var=IPS_GetScript($id);
$newId=IPS_CreateScript(0);
Break;
// case 4:
// $var=IPS_GetEvent($id);
// if ($var['EventType']==0) {
// $newId=IPS_CreateEvent(0);
// }
// Break;
case 6:
$var=IPS_GetLink($id);
$newId=IPS_CreateLink();
Break;
default:
$newId=0;
Break;
}
if ($newId) {
IPS_SetName($newId,$obj['ObjectName']);
IPS_SetParent($newId,$targetId);
IPS_SetPosition($newId,$obj['ObjectPosition']);
if ($type==2) {
IPS_SetVariableCustomProfile($newId,$var['VariableCustomProfile']);
}
if ($type==3) {
IPS_SetScriptContent($newId, IPS_GetScriptContent($id));
}
// if ($type==4) {
// IPS_SetEventActive($newId,false);
// }
if ($type==6) {
IPS_SetLinkTargetID($newId,$var['LinkChildID']);
}
CopyTree($id,$newId);
print_r ("Object created:".IPS_GetName($newId)." Type=".$type."
");
}
} else {
print_r("Object exists:".IPS_GetName($id2)."
");
if ($obj['ObjectType']<>1) {
CopyTree($id,$id2);
}
}
}
}
Macht kopieren von irgendetwas keinen Sinn. Mehrfachverwendung geht über Links, für mehrfach verendete Strukturen solte man Skripten schreiben, die dies erledigen. Die Doku dazu ist umfassend. Ich wende das in 3.1 nur noch an, nur noch selten, nur zum Test, lege ich Objekte noch direkt an.
Ich denke das sehen viele ganz anders, wenn man mal eine oder zwei Variablen benötige schreibt man sich doch kein Skript dafür.
Wenn man eine Instanz/Variable, oder was auch immer mit ähnlichen Parametern benötigt ist das Kopieren eines bestehenden Elementes mit den passenden Eigenschaften doch viel einfacher. Dann einfach die Parameter des neuen Elementes an zu passen ist doch viel einfacher als das ganze neu an zu legen.
Ich bin ganz Deiner Meinung. Es wäre schon schön wenn IPS wenigstens einen kleinen ersten Schritt geht und das Kopieren einer Variablen (natürlich mit deren Profil und Archivierungseinstellungen) ermöglicht, selbstredend neue ID. Wenn die USER dies dann „annehmen“ könnte man an anderen Kopierfiunktionen (Dummy-Module), Scripte, Ereignisse … weiterüberlegen…