IPS_GetObjectIDByName in Instanzen

Sucht die Funktion IPS_GetObjectIDByName nicht in den Instanzen die unter der angegeben Start-Such-ID liegen? Mir kommt es nämlich so vor, weil ich nur dann ein Ergebnis bekomme wenn ich die Instanz direkt als Start der Suche angebe, aber nicht wenn ich die Kategorie darüber verwende.

Hi!

IPS_GetObjectIDByName — IP-Symcon :: Automatisierungssoftware
IPS_HasChildren — IP-Symcon :: Automatisierungssoftware

Du gibst bei der ParentID eine ObjektID an und dann schaut diese Funktion in allen Objekten darunter (Childs) nach dem gesuchten Namen.
> Willst du davon wieder einen Child, dann musst du mit for-Schleifen arbeiten und fragen „if ChildID has eigene Childs, dann dort auch wieder nach dem Namen bei den Childs suchen“ usw…

Grüße,
Chris

Ja, ich habe selber gerade die Beschreibung nochmal gelesen, die wäre zur Verdeutlichung nochmal was für unseren Doku-Freak :slight_smile:
Man kann, muss es aber nicht, so lesen das nur in der direkten Ebene gelesen wird (wird vor allem dadurch klarer das dort steht das es die ID als ParentID tragen muss). Aber ich würde gerne AB der ID rekursiv lesen… gab es dafür nicht mal früher auch eine Funktion?

Möglich, dass da jemand mal was veröffentlicht hat…aber den for-Schleifen-Konstrukt hast du vmtl. schneller selbst geschrieben, als Stunden danach im Forum gesucht :slight_smile:

Grüße,
Chris

Ne, ich meinte im IPS direkt…ganz früher… ich weiß noch das man da häufig direkt ID = 0 angegeben hat wenn man den ganzen Baum durchsuchen wollte… vermutlich ist das irgendeinem Versionswechsel zum Opfer gefallen…

Das war niemals so. Immer nur eine Ebene.

paresy

man konnte NIE ein Object im ganzen Baum suchen? mmh, muss ich wohl von woanders kennen…

Früher (=Version 1.x) gab es mal IPS_GetVariableID (ich glaub so hieß die), welches irgendeine ID zum passenden Namen gesucht hast.

paresy

Falls es mal jemand braucht (oder vielleicht gehts es ja auch in die API über)

function  IPS_GetObjectIDByNameRek($ObjektName,$UebergeordneteID ) {
      $direkt = @IPS_GetObjectIDByName($ObjektName, $UebergeordneteID);
       if ($direkt === false) {
		       $childs = IPS_GetChildrenIDs($UebergeordneteID);
			   foreach ($childs as $ID ) {
				  $direkt = IPS_GetObjectIDByNameRek($ObjektName, $ID);
				  if ($direkt !== false) {
			   return $direkt;
		   }
			   }
		   } else { 
			   if ($direkt >= 0) {
			   return $direkt;
		   }
		   }
		  
	    
  
    return false;
  }
 // IPS_GetObjectIDByNameRek

Es müsste nicht der ganze Baum sein.

Aber wenigstens die Ebene zu Ende durchlaufen und nicht den ersten Treffer zurück geben. Das mag zwar schnell und häufig richtig sein. Ich habe aber gerade einen Anwendungsfall bei dem mich das stört.
Also eine Rückgabe als Array wäre nicht schlecht.