Frage zu IPS_GetChildrenIDs

Nabend :slight_smile:

Ich versuche zur Zeit meine Scripte auf V2 anzupassen bzw. neu zu erstellen.
Jetzt habe ich im Objektbaum meine Tempsensoren angelegt und unter jedem Sensor meine Variablen wie IST, SOLL usw.

Wenn ich jetzt über eine foreach Schleife alle Sensoren abfragen will und gleichzeitig die dazugehörigen Variablen einlesen möchte, dann hatte ich gedacht die Funktion GetChildrenIDs liest die Children in der Reihenfolge ein, wie sie im Objektbaum sind.
Leider werden die aber nach Größe der ID Nummer sortiert eingelesen. Damit ist meine Anordnung total sinnlos bzw. auch über eine foreach-Schleife nicht zu lösen.

Gibt es nicht so etwas wie IPS_GetChildrenIDsByName ? So das die Children nach Name sortiert ins Array eingelesen werden? :confused:

Oder wie löst ihr das?

Gruß
Jens

Hallo Jens,

ich denke was Du suchst ist

(IPS_GetObjectIDByName

siehe Hier

Ich benutze das z.B so:


$RadioIndex = GetValueInteger(24085 /*[Designer\radioIndex]*/);
//echo $RadioIndex;

 switch ($RadioIndex)
 {
  case "10":
		$IdSource = 11309 /*[fs20\fht\KücheFHT80b]*/;
		SetValueString(47162 /*[fs20\fht\Templat\RaumStr]*/,"Küche");
  break;


  case "20":
		$IdSource = 48609 /*[fs20\fht\WohnzimmerFHT80b]*/;
		SetValueString(47162 /*[fs20\fht\Templat\RaumStr]*/,"Wohnzimmer");
  break;

  case "40":
		$IdSource = 50363 /*[fs20\fht\FlurFHT80b]*/;
		SetValueString(47162 /*[fs20\fht\Templat\RaumStr]*/,"Bad");
   break;
   
   case "30":
		$IdSource = 36600 /*[fs20\fht\BadFHT80b]*/;
		SetValueString(47162 /*[fs20\fht\Templat\RaumStr]*/,"Flur");
   break;
 }





$IdTarget = 40206 /*[fs20\fht\Templat]*/;
$Str = array("Temperatur","Battery","Position","Target Mode","Target Mode (Pending)","Target Temperature","Target Temperature (Pending)","");

SetValue(IPS_GetObjectIDByName($Str[0],$IdTarget),GetValue(IPS_GetObjectIDByName($Str[0],$IdSource)));
SetValue(IPS_GetObjectIDByName($Str[1],$IdTarget),GetValue(IPS_GetObjectIDByName($Str[1],$IdSource)));
SetValue(IPS_GetObjectIDByName($Str[2],$IdTarget),GetValue(IPS_GetObjectIDByName($Str[2],$IdSource)));
SetValue(IPS_GetObjectIDByName($Str[3],$IdTarget),GetValue(IPS_GetObjectIDByName($Str[3],$IdSource)));
SetValue(IPS_GetObjectIDByName($Str[4],$IdTarget),GetValue(IPS_GetObjectIDByName($Str[4],$IdSource)));
SetValue(IPS_GetObjectIDByName($Str[5],$IdTarget),GetValue(IPS_GetObjectIDByName($Str[5],$IdSource)));
SetValue(IPS_GetObjectIDByName($Str[6],$IdTarget),GetValue(IPS_GetObjectIDByName($Str[6],$IdSource)));

SetValue(53531 /*[fs20\fht\Templat\SliderTemplate]*/,GetValue(IPS_GetObjectIDByName($Str[0],$IdSource)));

Jürgen

Hallo Jürgen, ist jetzt nicht das was ich gesucht habe … trotzdem Danke!

Ich habe das jetzt so gelöst:

$Liste = IPS_GetChildrenIDs(48294 /*[1Wire\Temperatursensoren\Regelbar]*/);
$AntriebID = 24864 /*[1Wire\Ventile]*/;

foreach($Liste as $Raum)
	{
	   $Name = IPS_GetName($Raum);
		$IST = GetValue(IPS_GetVariableIDByName("IST_".$Name, $Raum));
				//$IST = sprintf("%4.1f", $IST);
				//echo $Name.": ".$IST."°C"."
";
		$SOLL = GetValue(IPS_GetVariableIDByName("SOLL_".$Name, $Raum));
		$Manuell = GetValue(IPS_GetVariableIDByName("Manuell_".$Name, $Raum));
		$Pin = GetValue(IPS_GetVariableIDByName("Ventile_Pin", $Raum));
		$Antrieb = GetValue(IPS_GetVariableIDByName("Status Pin ".$Pin, $AntriebID));

        if((($IST <= ($SOLL - 0.5)) or ($Manuell)) AND (!$Antrieb))			// IST und SOLL vergleichen, wenn IST <= SOLL
			{TMEX_F29_SetPin($AntriebID, $Pin, FALSE);}								// Antrieb öffnen

		elseif (($IST > ($SOLL + 0.3)) AND ($Antrieb))							// IST/SOLL ?
			{TMEX_F29_SetPin($AntriebID, $Pin, TRUE);}									// Antrieb schließen

		IPS_sleep(400);
	}

Das ist zwar etwas länger als vorher, funktioniert aber :wink:

Verbesserungsvorschläge sind gern willkommen!

Jens