Ident

Hallo,

da ich mich jetzt doch mal daran machen will, nach Version 4 zu wechseln, habe ich mir mal die Migrationsanweisungen angeschaut. Wenn ich das richtig verstanden habe, funktioniert IPS_GetObjectIDByName in Zukunft nicht mehr, wenn Umlaute oder ähnliches im Namen vorhanden sind. Dafür soll man dann IPS_GetObjectIDByIdent verwenden, da hier diese Zeichen nicht erlaubt sind und daher keine Fehler diesbezüglich auftreten.
Ich kann natürlich jetzt hergehen, und einfach sämtliche Idents mit dem Namen zu füllen und z.B. ä durch ae ersetzen etc.
So weit so schlecht, aber wenn es nicht anders geht, muss das wohl so sein.
Da ich die V4.x noch nicht installiert habe, es aber in V3.x nicht geht, wollte ich mal fragen, ob diese IDENT dann wenigstens im Objektbaum angezeigt wird ?

Grüße Frank

Natürlich geht das auch schon in IPS3.
Angezeigt wird der Ident in den Eigenschaften vom Objekt.
Michael

im Objektbaum ? Im Kontextmenü zum Objekt habe ich nichts gefunden :confused:

Objekt markieren CTRL+Enter dann siehst Du die Ident wenn dort keine steht ist dem Objekt keine Ident zugewiesen worden bisher. Bei Modulen steht aber bei einer Variable immer eine Ident dabei.

Bei Instanzen. Module sind was anderes :wink:
Sprich, Statusvariablen haben immer ein Ident.
Es kann aber sein, wenn deine Version 3 zu alt ist, dass die Konsole die Anzeige noch nicht unterstützt.
Vorher auf jeden Fall auf die letzte 3.4 wechseln.
Michael

ich habe V3.40 / #3801

Bei den Eigenschaften einer Variable bekomme ich das angezeigt

IPS-Ident.jpg

Da steht leider keine ident …

Dann hat dieses Objekt keinen Ident.
So sieht es mit aus.


Michael

Wie oben geschrieben wenn da nichts steht dann ist auch keine Ident vorhanden dann musst Du erst eine Ident zuweisen.
IPS_SetIdent

wäre folgendes Script dann für die Migration sinnvoll oder gibt es bessere Ideen ?

<?

$Umlaute = array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß", "-");
$Ersatz = array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss", "_");

$all = IPS_GetObjectList();

for($i=0;$i<count($all);$i++)
   {
   IPS_SetIdent($all[$i], str_replace($Umlaute, $Ersatz, IPS_GetName($all[$i])););
   }

?>

Mit dem Skript zerschießt Du Dir mit Sicherheit IP-Symcon weil Du allen Objekten einfach eine Ident zuordnest anhand des Names. Das betrifft dann aber auch alle Objekte die bereits eine Ident haben und diese ist oft nicht identisch mit dem Variablennamen. Das ist ja auch der Vorteil einer Ident das die pro Ebene eindeutig ist. Ein Variablennamen kannst Du nennen wie Du willst, daher ist beim automatischen Abarbeiten mit einem Skript immer größte Vorsicht geboten. Wenn z.B. ein Variablenname doppelt vorkommt hättest Du damit eine doppelte Ident und das ist nicht zulässig. Damit werden dann alle Suchen nach der passenden Ident ins Leere laufen. Die Fehlermeldungen sind also vorprogrammiert.

Du kannst es vielleicht so probieren:


$Umlaute = array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß", "-"); 
$Ersatz = array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss", "_"); 

$all = IPS_GetObjectList(); 

for($i=0;$i<count($all);$i++) 
   { 
		$objectinfo = IPS_GetObject($all[$i]);
		$ident =  $objectinfo["ObjectIdent"];
		if($ident == "")
		{
			IPS_SetIdent($all[$i], str_replace($Umlaute, $Ersatz, IPS_GetName($all[$i]));); 
		}
   } 

Ich übernehme da aber keine Garantie. Das würde auch voraus setzten das keine Variablennamen doppelt in einer Ebene vorkommen oder Du musst dies in dem Skript noch als Prüfung einbauen.

haha - diese Ident ist ja wirklich geheimnisvoll - kann natürlich noch einschränken, dass nur leere Felder gefüllt werden … heißt das, dass IPS die Ident manchmal befüllt, ohne dass ich was davon weiß ? Denn ich habe mit der Ident bisher nichts gemacht (wie man sieht :D)

Wie Nall chan schon geschrieben hat hat jede Statusvariable einer Instanz eine Ident. Daher haben alle Variablen der IP-Symcon Instanzen und auch der Instanzen der PHP Module eine Ident. Diese nutzen diese auch um eine Variable eindeutig zu identifizieren. Wenn Du da also was daran rumschraubst ist das Chaos vorprogrammiert. Demnach haben also alle Objekte und Variablen die Du selber in IP-Symcon angelegt hast keine Ident da Du diese ja bisher nicht benutzt hast.

dann danke ich mal für die Aufklärung und die Ergänzung im Script - werde es mal ausprobieren; wenn’s klemmt, kann ich ja auf ein Backup zurückgreifen :smiley:

eine Frage hätte ich doch noch… für was benutzt IPS die Ident ?
Als absoluter Key gilt doch eigentlich die ID von jedem Objekt…

von 2660 Variablen habe ich ca. 250, bei denen die Ident gefüllt ist und vom Namen der Variablen abweicht und die meisten sind deswegen unterschiedlich, weil ich den Namen „eingedeutscht“ habe.

Die ObjektID gibt es nur einmal. Eine Ident ist auf einer IP-Symcon Ebene eindeutig. Die Ident wird von IP-Symcon z.B. benutzt um die ObjectID heraus zu bekommen. Bei einer Instanz sind die Variablen immer gleich auch die Ident der Variable. Je nach IP-Symcon Installation ist die ObjectID aber unterschiedlich. Die Ident wird nun genutzt um Anhand der Ident die ObjektID heraus zu bekommen und damit dann zu wissen wie die Variable angesprochen werden kann.

Also jedem Objekt einfach ein Ident zu geben ist ja wie mit Unkrautvernichter zu arbeiten. Einfach mal alles besprühen :smiley: Außerdem machst du bei allen Instanzen, die bereits einen Ident haben, diesen kaputt. Und nur weil du einmal das Skript laufen lässt, klappt das ja für die Zukunft nicht automatisch. Was machst du mit deinen Variablen? Ich würde dir empfehlen zu überlegen ob du die betroffenen Skript einfach auf IDs umstellst. Oder du schaust dir mal die PHP Module an und baust direkt PHP Module. Da wird das Konzept der Idents wirklich einfach und automatisch genutzt :slight_smile:

paresy

PS: Seit IP-Symcon 4.1 (nachdem du über das UtilsControl alle Umlaute auf UTF-8 normalisiert hast), sollte die FindByName Funktion einwandfrei laufen. Probier es doch mal in der VM :slight_smile: