IPS_RunScript - Ermittlen von welchem Skript aus der Befehl ausgeführt wurde?

HI,

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.

Kann ich in dem Run_Script aus einer Variable auslesen, von welchem Skript aus das Ziel-Skript gestartet/ausgeführt wurde? Laut Doku ja nicht - ich suche aber einen Workaround :wink: Evtl. kennt ihr ja einen.

Ich glaub, ich muss noch ein wenig ausholen…

Ich habe eine Boolean Variable (Status Alarmanlage). Ich lese die Alarmanlage alle 15 Sekunden aus. Wenn ich nun die Anlage über Webfrontend starte, habe ich ein entsprechendes Ereignis hinterlegt, was ein Skript startet. (Nachfolgende Ereignisse ausführen = deaktiviert).

Bedeutet - ich habe zwei Skripte, welche die Boolean Variable ändern können. Wenn es ganz dumm kommt, geht der Wert auf TRUE dann FALSE und wieder TRUE. Was nun passiert ist folgendes. Zweimal TRUE bedeutet auch zwei PROWL Meldungen, da das Skript zweimal ausgeführt wird.

Vielleicht denke ich auch wie immer viel zu kompliziert…

Grüße

Vermutlich denkst du zu kompliziert, aber das ist egal :smiley:
Ohne das noch mehr ins Detail gehst und zig Rückfragen dazu wie, weshalb und warum beantworten zu müssen, ist es manchmal besser seinen eigenen Weg weiter zu verfolgen.
Wichtig ist nur das du dich in deine Logik wieder reinfindest.
Zur eigentlichen Frage:
Im per IPS_RunScript aufgerufenen Script hat du als Sender dann Execute stehen.
Systemvariablen — IP-Symcon :: Automatisierungssoftware
Und wenn du IPS_RunScriptEx nutzt, kannst du auch selber Variablen über geben vom Quell zum Zielscript.
IPS_RunScriptEx — IP-Symcon :: Automatisierungssoftware
Michael

Sieht IPS leider nicht vor.

Ich behelfe mir mit folgender Methode:

Beim Aufruf übergebe ich die ID-Nr. des aufrufenden Scripts (ggf. mit anderen Parametern im Array):

IPS_RunScriptEx(xxxxx, Array ( 'TRIG' => $_IPS['SELF'] ));

im aufgerufenen Script (IDNr. xxxxx) steht mir dann die IDNr des aufrufenden Scriptes zur Vfg.:

$TrgSc = $_IPS['TRIG'];                // ObjID des aufrufenden Skriptes

Hoffe, das wars was Du wolltest.

Viele Grüsse
Harald

Danke euch beiden :slight_smile:

Damit kann ich in meiner Logikwelt gut mit leben. Grüße

Mir ist in dem Zusammenhang heute Nacht noch etwas eingefallen - kann ich eine Variable für eine bestimmte Zeit „sperren“. Damit meine ich, dass der Wert nicht geändert werden kann - quasi ein Read-Only Flag setzen?

IPS_GetObject habe ich dazu gefunden …

ObjectIsReadOnly

Nur wie könnte ich per Befehl ein Objekt auf Readonly setzen?

Moin Frad!

Ist mir nicht bekannt, dass es diese Funktion gibt.

Ich bau mir sowas immer selbst… Wenn ich z.B. eine Stehlampe über den Taster anschalte, dann wird eine Variable „gesperrt“ auf TRUE geschaltet. Und im Bewegungsmelder-Skript wird diese Variable abgefragt. Also wenn gesperrt, dann kein schalten durch den Bewegungsmelder. Erst wenn der Taster wieder betätigt wird, dann kann auch der Bewegungsmelder wieder schalten.
…so sperre ich auch zu bestimmten Zeiten die Bewegungsmelder-Schaltvorgänge komplett, wenn z.B. nur zu bestimmten Zeiten etwas passieren soll.
…meine Bewegungsmelder sind 1 Minute auf aktiv, wenn keine Bewegung dann schalten sie auf inaktiv und das Skript wird erneut aufgerufen, 15 Sekunden gewartet, wenn in der Zeit keine Bewegung ist, dann Licht aus.

Beispiel - Stehlampen Skript (getriggert durch Taster oder geschaltet vom WebFront/Mobile-App):

<?
$stehlampe4_status = GetValue(48463 /*[Hardware\HomeMatic\Zwischenstecker\L09 (Stehlampe 4 - Gästezimmer)\Schalter\STATE]*/);
$stehlampe4_WFstatus = 38652 /*[Skripte & Variablen\Beleuchtung\Gästezimmer - Stehlampe 4\Status]*/;
$stehlampe4_id = 37453 /*[Hardware\HomeMatic\Zwischenstecker\L09 (Stehlampe 4 - Gästezimmer)\Schalter]*/;
$b05deaktiviert = 26483 /*[Skripte & Variablen\Bewegungsmelder\Gästezimmer\Bewegungsmelder deaktiviert]*/;


if (GetValue($stehlampe4_WFstatus) == false) {
	SetValue($b05deaktiviert, true);
	SetValue($stehlampe4_WFstatus, true);
   HM_WriteValueBoolean($stehlampe4_id, "STATE", true);
}
else {
   SetValue($b05deaktiviert, false);
   SetValue($stehlampe4_WFstatus, false);
   HM_WriteValueBoolean($stehlampe4_id, "STATE", false);
}


?>

Beispiel - Bewegungsmelder Skript (getriggert durch Motion vom Bewegungsmelder):

<?
$nacht = GetValue(50635 /*[Skripte & Variablen\Astro-Funktion\Nacht]*/); 
$stehlampe4_WFstatus = 38652 /*[Skripte & Variablen\Beleuchtung\Gästezimmer - Stehlampe 4\Status]*/;
$stehlampe4_status = GetValue(48463 /*[Hardware\HomeMatic\Zwischenstecker\L09 (Stehlampe 4 - Gästezimmer)\Schalter\STATE]*/);
$stehlampe4_id = 37453 /*[Hardware\HomeMatic\Zwischenstecker\L09 (Stehlampe 4 - Gästezimmer)\Schalter]*/;
$b05bewegung = GetValue(30757 /*[Hardware\HomeMatic\Bewegungsmelder\B05 (Gästezimmer)\Sensor\MOTION]*/);
$b05deaktiviert = GetValue(26483 /*[Skripte & Variablen\Bewegungsmelder\Gästezimmer\Bewegungsmelder deaktiviert]*/);


if ($nacht == false) {
	// TAGSÜBER KEINE SCHALTUNG
}
else {
   if ($b05deaktiviert == false) {
		if ($b05bewegung == true) {
      	if ($stehlampe4_status == false)  {
      	   SetValue($stehlampe4_WFstatus, true);
	      	HM_WriteValueBoolean($stehlampe4_id, "STATE", true);
	   	}
   	}
   	else {
      	IPS_SetScriptTimer($IPS_SELF, 15);
		}
	}
}


$timestamp = time();
$datum = date("d.m.Y - H:i", $timestamp);
$datum = $datum. " Uhr";
SetValueString(27657 /*[Skripte & Variablen\Bewegungsmelder\Letzte Bewegung]*/, $datum);


if($IPS_SENDER == "TimerEvent") {
   if ($b05deaktiviert == false) {
		if ($b05bewegung == true) {
	   	IPS_SetScriptTimer($IPS_SELF, 0);
		}
		else  {
	   	if ($stehlampe4_status == true)  {
	   	   SetValue($stehlampe4_WFstatus, false);
      		HM_WriteValueBoolean($stehlampe4_id, "STATE", false);
	  		}
		}
		IPS_SetScriptTimer($IPS_SELF, 0);
	}
}

?>

Grüße,
Chris

Danke dir - ist auf jeden Fall eine Variante. Ich werden mal einen Funktionswunsch hierfür erfassen :wink: