Skript #0 exisitert nicht bei include

Ich habe ein Script angelegt, welches wiederverwendet werden soll. Dasselbe liegt im Ordner „C:\ProgramData\Symcon\scripts“ und hat den Namen „conbriotimer.ips.php“. Ich habe es zusätzlich registiert, es hat auch eine Objekt ID erhalten.

Wenn ich in einem Ereignis nun das Script per include einbinde und eine Funktion aufrufe, so komme ich nicht an Umgebungsobjekte heran.

Hier der Code im Ereignis:

<? include('C:\ProgramData\Symcon\scripts\conbriotimer.ips.php'); SwitchSeconds(37953, 15); ?>

Hier das Scriptfile:

<?PHP function SwitchSeconds($ObjektID, $Seconds) // Welche Variable, wie lange, true oder false (true standard) { if($_IPS['SENDER'] == "TimerEvent") { DS_CallScene($ObjektID, 0); IPS_SetScriptTimer($_IPS['SELF'], 0); } else { IPS_SetScriptTimer($_IPS['SELF'], $Seconds); } } ?>

Als Fehler erhalte ich eine Meldung
Warnung: Skript #0 exiitiert nicht in C:\ProgramData\Symcon\scripts\conbriotimer.ips.php on line 2.

Es kann also offenbar kein $_IPS[‚SENDER‘] Objekt ausgelesen werden. Somit kann ich zum Beispiel keine Timerverzögerungen nutzen.

Was mache ich hier denn falsch

Dann mach es andersrum. Schreibe ein Skript und lasse dies durch das Ereignis ausführen. Ist auch übersichtlicher.

Lege Dir eine __autoload.ips.php im Script Ordner an. Diese wird automatisch in allen Scripten includiert.
https://www.symcon.de/service/dokumentation/komponenten/dienst/php/

Attain

Jup, weil der Code im Ereignis ist kein Script im Objektbaum und hat somit keine ObjektID.
Die $_IPS Variable wird einmal von Symcon gesetzt wenn der Code (im Ereignis) gestartet wird.
Und wenn du dann include im Ereignis benutzt bleibt $_IPS[‚SELF‘] auf 0. Das include ändert ja nichts an den globalen Variablen.

Das Thema kannst du einfach lösen, so wie es @DerStandart schrieb:
Das Ereignis soll ein Script aus dem Objektbaum starten und keinen Code ausführen.
Dann ist in $_IPS[‚SELF‘] die ObjektID vom Script welches durch das Ereignis gestartet wurde.
@Attain Das geht zwar für die globale Funktion, aber löst nicht das Problem mit der fehlenden ObjektID.
Michael

1 „Gefällt mir“

Ich habe nun ein Script direkt im SymCon angelegt, da klappt es dann. Es kann nun bei Auslösen einer Bewegung eine Digitalstrom Szene aufrufen, nach einer bestimmten Zeit wird abgeschaltet. Aber nur wenn keine Bewegung mehr ist, sonst erneuert sich die Zeit und auch nur, wenn kein Dauerlicht eingeschaltet wurde. Ziemlich kompatk, schnell und schick.

Nun aber zum Problem: der autoloader funktioniert schon, ich kann auch include Dateien einfügen. aber in der Oberfläche des SymCon habe ich keinen Zugriff auf die bereitgestellte Funktion.

Was ist zu tun?

__autoload.php

<?PHP require_once("conbriotest.ips.php"); ?>

conbriotest.ips.php:

<?PHP function CONBRIO_SwitchSeconds($IntanceID, $Seconds, $InitialScene, $TargetScene) // Welche Variable, wie lange, true oder false (true standard) { if($_IPS['SENDER'] == "TimerEvent") { $Parent=IPS_GetParent($_IPS['SELF']); $Child=IPS_GetChildrenIDs($Parent)[0]; $ActiveScene=GetValue($Child); if($ActiveScene ==$InitialScene ) { DS_CallScene($IntanceID, $TargetScene); } IPS_SetScriptTimer($_IPS['SELF'], 0); } else { IPS_SetScriptTimer($_IPS['SELF'], $Seconds); } } ?>

Was meinst du damit?
Das der Script Editor die Funktion nicht kennt?
Das ist normal, erkennt er auch nicht wenn die Funktion in der gleichen Datei ist.
Oder wird die Funktion einfach nicht ausgeführt? Gibt es Fehlermeldung?
Und bitte den Code immer entsprechend mit dem Button </> hier einfügen. Dein Code im Beitrag ist echt nicht zu lesen.
Michael

Hallo Michael,

ja, ich war davon ausgegangen, dass der Script Editor die Funktion erkennen würde, das wäre ja eine enorme Erleichterung. Dank für den Hinweis mir dem Button </>.

Ich werde es testen…