EventbyName

Hallo,

ich habe versucht eine EventID rauszukriegen, bekomms aber nicht hin.
Ich habe eine Variable angelegt und darunter hängen mehrere objekte (unteranderem das Event 34516) mit dem Namen EV1. im Skript habe ich dann versucht diese Id zurückzubekommen, er findet sie aber nicht. Was mach ich falsch?

<?
    
    $ParentID = 54123 /*[Skripte\im Test\Button\6 Button\Ladegerät]*/;

    $EreignisID = @IPS_GetEventIDByName("EV1", $ParentID);
if ($EreignisID === false)
    echo "Ereignis nicht gefunden!";
else
    echo "Die Ereignis-ID lautet: ". $EreignisID;
    

?>

Gruß

Oliver

Du suchst in der falschen Ebene (falscher Parent).
11365 wäre der korrekte Parent.
Michael

sucht der nur eine Ebene darunter?
dachte dass er ab der abgegebenen ID alles nach unten durchsucht.

Nur direkt.
Alles andere würde ja nie funktionieren, wenn du 0 angibst, müsste ja der ganze Baum durchsucht werden.
https://www.symcon.de/service/dokumentation/befehlsreferenz/ereignisverwaltung/ips-geteventidbyname/
Michael

Gibt es denn einen Grund für diese Struktur? Kann man nicht eine Kategorie „1 SE Oliver“ erstellen und innerhalb dieser Kategorie einfach alle Variablen und Skripte unterbringen? Würde das Ganze evtl. etwas vereinfachen. Ist aber nur eine Vermutung.

Hallo,

ich habe mir ein Schaltskript/Actionsscript für einen Ladeadapter gebastelt, in dem ich 6 Geräte auswählen kann. Da wird dann bei 100% das laden beendet und das Ereignis auf inaktiv gesetzt. Das Actionsscript kann ich nur unter eines der Geräte hängen. Um da nicht die Ereignisse einzeln mit ID einzutragen dachte ich, ich könnte mit dem Namen der eindeutig ist, die richtige ID automatisch finden.
(kann man in einem Skript ein „Unterskript“ ausführen, dass die dort ermittelten Werte (Bsp eine ID in eine Var $ID) in das aufrufende Skript Übergeben werden?

Gruß

Oliver

Die mangelnde Rekursive-Funktion der By-Name-Funktionen ist der Grund warum ist mir dies Hilfsskript angelegt habe und es stattdessen verwende:


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 liefert dir von der Vater-ID (2. Parameter) ausgehend den ersten Treffer mit dem Namen, den du übergibst. Und ja, es funktioniert auch ab 0, wenn es denn sinnvoll für dich ist.

Hallo,

ich habe $ObjektName und $UebergeordneteID wie in meinem Beispiel gefüllt, aber bekomme nichts „simmvolles“ zurück. Wie muss ich das verwenden?

$UebergeordneteID = 54123; 
 $ObjektName = "EV1";
 

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  
    
    echo $ObjektName;
    echo $ID;
    
    
    
    ?>

Actionskripte können hängen, wo sie wollen. Oder ich hab das Problem nicht verstanden.

Das liegt daran, dass du die Function schon aufrufen musst… (die liegt bei mir sonst in einer Helfer-Datei, die ich mit Include einbinde, wenn du das häufiger brauchst würde ich es dir auch empfehlen, dann besteht das Script nur aus 2 Zeilen, dem Include und der 1. Zeile die ich unten jetzt korrigiert habe, damit es passt).

So hasst du in der Variablen die ID, die du suchst, ich hoffe es ist selbstsprechend.



$IDdesObjektes = IPS_GetObjectIDByNameRek( "EV1", 54123);
 

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  
    
    echo $ObjektName;
    echo $ID;
    
    
    
    ?>

Hallo Christoph,

ja, können sie natürlich. Aber ich „steuere“ mit Dem Actionsscript auch die Ereignisse „EV1“ - „EV6“ und möchte nicht 6 Actionsscipte . die Parents und Childs finde ich ja auch ohne Namen.

Gruß

Oliver

Ich bin offen und ehrlich: Ich verstehe den Grund für diese Struktur nicht. Mir würde nicht einfallen, unterhalb einer Variablen eine Kategorie zu erstellen, darunter wieder eine Variable, darunter wieder ein Skript und dann noch ein Ereignis.

Vielleicht bin ich seit mittlerweile über 10 Jahren IP-Symcon in meiner Vorgehensweise zu festgefahren oder betriebsblind, das möchte ich gar nicht ausschließen. Aber grundsätzlich habe ich maximal unter Skripten und Variablen noch Ereignisse. Der Rest wird schön mit Kategorien geordnet.

Was spricht dagegen, es so zu machen:

jagu.PNG

So hast Du, im Beispiel von „SE Oliver“ alles in einer Kategorie, mit Ausnahme des Events. Oder, wie im Beispiel von „SE Sabine“, alles in einer Kategorie. Du kannst somit alle Child-Objekte finden, wenn Du die ID der Kategorie weißt. Wäre das für Dich realisierbar?

Hallo Christoph,

die Variable Ladegerät kam erst jetzt ganz am Ende, weil ich dachte ich brauche sie um von da topdown nach Namen zu suchen. Die hab ich wieder gelöscht. Ansonsten ist es so entstanden, dass ich ein Ladegerät habe, aber verschiedene zu ladende Geräte und ich nicht immer die IDs raussuchen woltte, sondern da dann immer mit Parent und Child arbeite. die Variable „SE Oliver Laden beendet“ heisst z.B . auch nur so, weil ich diesen Namen dann als Nachrichtentext an Telegram schicke. So brauche ich immer nur die Variable mit Unterobjekten kopieren, Namen anpassen und die Prüfvariable im Event ändern.

Gruß

Oliver