Systemvariable $_IPS['TRIG']

Ein Klassiker unter den Anfragen in puncto Systemvariablen:

z.B. in https://www.symcon.de/forum/threads/26615-IPS_RunScript-Ermittlen-von-welchem-Skript-aus-der-Befehl-ausgef%C3%BChrt-wurde
„ich rufe mittels IPS_RunScript ein anderes Skript auf. Nun würde ich gerne ähnlich wie bei $_IPS[‚VARIABLE‘] wissen, von welchem Skript der Befehl „IPS_RunScript“ ausgeführt wurde.“

Wie beschrieben verwende ich z.Z. folgende Hilfsmaßnahme:

  1. Beim Aufruf übergebe ich die ID-Nr. des aufrufenden Scripts (ggf. mit anderen Parametern im Array):
IPS_RunScriptEx(xxxxx, Array ( 'TRIG' => $_IPS['SELF'], 'Parameter'=>$SonstigeWerte));
  1. Im aufgerufenen Script (IDNr. xxxxx) steht mir dann die IDNr des aufrufenden Scriptes zur Vfg.:
$TrgSc = $_IPS['TRIG'];                // ObjID des aufrufenden Skriptes

Ich wünsche mir, dass diese Information als Systemvariable von IPS zur Verfügung gestellt wird.

also z.B.:

If ($_IPS['SENDER'] == 'RunScript') {    // Bedeutung: Wenn das Skript durch eine der IPS_RunScript Funktionen ausgeführt wurde 
   $ID_des_aufrufenden_Skriptes = $_IPS['TRIG'];                
}

Bei
$_IPS[‚SENDER‘] == ‚Variable‘ und
$_IPS[‚SENDER‘] == ‚TimerEvent‘

werden ja auch IDs von auslösenden Objekten übergeben.

Viele Grüsse
Harald

Das ist leider nicht möglich, da RunScript nicht auf PHP beschränkt ist. Du kannst diese Funktion auf einem eigenen native Modul starten, aus der JSON-RPC API… Somit wäre das von dir gewünschte Feature inkonsistent und dein Workround die bessere Variante.

paresy

Das verstehe ich jetzt nicht:

IPS_RunScript (startet ein anderes IP-Symcon Skript)
IPS_RunScriptEx (startet ein anderes IP-Symcon Skript und übergibt Variablen)
IPS_RunScriptWait (startet ein anderes IP-Symcon Skript und wartet auf das Resultat)
IPS_RunScriptWaitEx (startet ein anderes IP-Symcon Skript und übergibt Variablen)

sind doch alles IPS-Funktionen und stellen im aufgerufenen Skript mindestens die Systemvariablen

$_IPS[‚SELF‘] (SkriptID des aktuellen Skriptes)
$_IPS[‚THREAD‘] (ThreadID des aktuellen Skriptes)
$_IPS[‚SENDER‘] (Auslöser des Skriptes)

zur Verfügung („Systemvariablen sind Variablen, die in jedem Skript verfügbar sind und vom Benutzer genutzt werden können um effizientere Skripte zu erstellen, die generisch Aufgaben lösen können. Je nach Absender durch den das Skript gestartet wurde, werden mehr oder weniger Systemvariablen angeboten“).

Warum soll es da nicht möglich sein, im Falle $_IPS[‚SENDER‘] == ‚RunScript‘ zusätzlich auch die ID des aufrufenden Skriptes mitzugeben?

Du kannst diese Funktion auf einem eigenen native Modul starten, aus der JSON-RPC API… Somit wäre das von dir gewünschte Feature inkonsistent …

Und das verstehe ich überhaupt nicht :confused:

… und dein Workround die bessere Variante.

Aha !!

Viele Grüsse
Harald

Weil IPS_RunScript z.B. über die JSON-RPC API gestartet werden kann und es somit kein „aufrufendes“ Skript gibt :wink:

paresy

Dann könnte natürlich im $_IPS[‚TRIG‘] statt einer Zahl schlicht „JSON_RPC“ plus IP des callers - lol - stehen.

@T30:
Kapselung macht immer Sinn.

Die Variante, dass Du diese Info selbst im Array übergibst ist m.E. deshalb „eh besser“, weil Du so systemunabhängigere Scripte schreibst, die Du z.B. auch mit einem HTTP-GET initiieren kannst (oder ein Ticketing-System hast) aber die „Rest-Steuerlogik“ gleich läßt.

Ich lese z.B. grundsätzlich auch $_IPS (und weiteres) via Autoprepend in Properties interner Objekte ein um bei Zugriffen auf solche Infos weitgehend „Server-Neutral“ zu bleiben und ggf. später einmal (z.B. wenn eine neuere Version von IPS vielleicht „rückwärts-inkompatibel“ sein wird -alles schon gesehen - oder ich dieselben Scripte in einem nicht-IPS-System nutzen will) nur an einer Stelle etwas ändern muss, um andere Quellen in diese Datenfelder zu übernehmen.