Nabend
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?
Oder wie löst ihr das?
Gruß
Jens
jheinz
7. Februar 2009 um 07:15
2
Hallo Jens,
Tetrapack:
Nabend
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?
Oder wie löst ihr das?
Gruß
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
Verbesserungsvorschläge sind gern willkommen!
Jens