Skript zum Auslesen von Variablen mit demselben Namen

Guten Abend,
ich arbeite gerade an einem Skript zum auslesen aller Variablen aus dem Objektbaum, die einen bestimmten Namen haben. Hierzu habe ich ein Skiprt eines Kollegen hier aus dem Forum verwendet das ich gerade anpasse. (Ursprünglich war das Originalskript zum finden aller vorhandenen Z-Wave Instancen im Obejektbaum.)

Aber ich bin auf ein Problem gestoßen, bei dem ich nicht weiterkomme.

Hier das Skript:




$allRooms = GetAllRooms();

function GetAllRooms()
{
	$allObjects = IPS_GetObjectList();
	$allRooms = array();
	foreach($allObjects as $key => $value)
	{
	   // take only variables and not instances
	   if(IPS_VariableExists($value))
	   {
			$currentObject = IPS_GetObject($value);
			$currentObjectName = $currentObject["ObjectName"];
			echo $currentObjectName ;
			// first string
			$objectIsFirstString = stristr($currentObjectName,"Heizmodus");
			
			// second string
			$objectIsSecondString = stristr($currentObjectName,"Wohlfühlwärme");
			
			// third string
			$objectIsThridString = stristr($currentObjectName,"Dummy123");
 
			if($objectIsFirstString || $objectIsSecondString || $objectIsThridString) 
			{
			   $allRooms[$currentObjectName] = $value;
			}
		}
	}
	return $allRooms;
}


foreach ($allRooms as $aktor) {
     echo "$aktor
";
	 
}

?>

Problem ist, das er nur zwei Variablen findet, jeweils eine mit „Heizmodus“ und eine mit „Wohlfühlwärme“, obwohl ich von jeder mindesten 10 im Objektbaum habe, die diesen Namen tragen.

Das Problem habe ich schon eingegrenzt, echo gibt mir folgendes aus:

Auslösende_IDTestauslösungUrlaubsmodusHeizmodusHeizmodusHeizmodusHeizmodusHeizmodusHeizmodusHeizmodusBüro / Süd WestBad / MetallArbeitszimmerTageszähler / SonjaTageszähler / Bad / MetallTageszähler / FlorianTageszähler / Flur KGTageszäh..........

Die Ausgabe habe ich gekürzt, aber man kann schon sehen, wo das Problem liegt, die Strings hängen zusammen in der Ausgabe „HeizmodusHeizmodusHeizmodusHeizmodus…“ so dass er alle Variablen mit Heizmodus als einen erkennt bzw. nur einen aufzählt.

Ich habe mich schon nach anderen String-Funktionen umgesehen die mir helfen könnten, aber bin nicht so richtig schlau geworden. Hat vielleicht jemand von euch einen Tipp für mich bzw. eine passende Funktion?


               $allRooms[$currentObjectName] = $value; 

Du überschreibst ja auch alle „alten“. Besser wäre das


               $allRooms[] = $value; 

paresy

Hi paresy,
vielen Dank für die schnelle Hilfe, du hattest recht.
Ich habe es geändert, es funktioniert jetzt.

Unabhängi vom Thread:
Komisch ist allerdings, das das ganze funktioniert, wenn ich quasi das gleiche Skript nutze um bestimmte Instanzen zu finden, hier müsste das ganze doch auch überschrieben werden.

Hier mal das Skript:


<?


$allLights = GetAllZWaveAktors();

function GetAllZWaveAktors()
{
	$allObjects = IPS_GetObjectList();
	$allLights = array();
	foreach($allObjects as $key => $value)
	{
	   // take only instances and not variables
	   if(IPS_InstanceExists($value))
	   {
			$currentObject = IPS_GetObject($value);
			$currentObjectName = $currentObject["ObjectName"];
 			
			// first string
			$objectIsFirstString = stristr($currentObjectName,"IR-Heizung");
			
			// second string
			$objectIsSecondString = stristr($currentObjectName,"Dummy123");
			
			// third string
			$objectIsThridString = stristr($currentObjectName,"Dummy123");
 
			if($objectIsFirstString || $objectIsSecondString || $objectIsThridString) 
			{
			   $allLights[$currentObjectName] = $value;
			}
		}
	}
	return $allLights;
}

foreach ($allLights as $aktor) {
     echo "$aktor
";
	  
}
?>

Mit dem Skript solltest du auch nur ein Element pro Namen finden können, da du die überschreibst. So wie ich dein Skript verstehe, müsstest du zu jedem gesuchten Namen bis zu einer Instanz finden. Wenn allerdings mehrere Instanzen mit dem gleichen Namen existieren, sollten trotzdem nur eine davon gefunden werden. Die Lösung dazu wäre analog zum vorherigen Skript.

Guten Morgen Dr. Niels,
da gebe ich dir absolut recht.

Nur komisch ist das mir bei dem Skript zum auslesen der Aktoren, wirklich eine Liste alle Aktoren angezeigt wird, obwohl, wie du sagst, die Variable jedes mal überschreiben müsste.

Im Enddefekt sind die Scripte ja genau gleich, nur das das erste die Änderungen von paresy enthält.

Du bekommst mit dem Skript also alle Aktoren zurück, die „IR-Heizung“ heißen? Das ist ja merkwürdig…

Genau, die bekomme ich alle zurück. Echt komisch daher habe ich mich so gewundert.
Aber ist nicht weiter schlimm, ich passe diese Funktion mit der Rückgabe auch auf die Richtige Schreibweise an.
Dem „Fehler“ müssen wir nicht weiter auf den Grund gehen. :slight_smile: