…ausgeführt wird das erste Script
hier die Fehlermeldung im Detail
Notice: Undefined variable: counter_old_ID in D:\Program Files\IP-Symcon\scripts\56748.ips.php on line 10
Warning: '' is not a valid integer value in D:\Program Files\IP-Symcon\scripts\56748.ips.php on line 10
Du solltest deine Aufrufe mal in einer Funktion kapseln.
Script
<?
includeScript(56748 /*[sonstiges\Auswertung Stromzähler]*/);
UpdateTralala(20225);
//Copy&Paste aus dem "Wie kann ich...?" Thema der Dokumentation
function includeScript($scriptID)
{ $s = IPS_GetScript($scriptID);
include($s['ScriptFile']);
}
?>
Script
function UpdateTralala($counter_old_ID)
{
$counter_neu = GetValueInteger(54776 /*[Zaehlerschrank_01_Building_03\DS2438\UV1]*/); // aktueller Zaehlerstand (Zähler 1) einlesen
$counter_alt = GetValueInteger($counter_old_ID); //alten Zählerwert auslesen
$delta = $counter_neu - $counter_alt; //alter Wert von neuen Wert abziehen
SetValueInteger($counter_old_ID , $counter_neu ); //aktueller Zählerwert ablegen
SetValueInteger(54960 /*[Zaehlerschrank_01_Building_03\DS2438\UV1\UV1_diff]*/, $delta ); //Ausgabe Differenz zwischen alt und aktuell
...........
}
mir is gerade eingfallen, die variable $counter_old_ID gibts ja in der Funktion ‚includeScript‘ dann gar nicht oder?
also müsst ma sie per Parameter übergeben, oder eben mit global $counter_old_ID;
ahja, tonic hats eh auch gerade per Parameter gemacht g
Was immer wieder übersehen wird ist, dass includes in einer Funktion Einschränkungen unterliegen:
Funktionen aus den includierten Dateien stehen im globalen Scope zur Verfügung ABER:
Die in einer Funktion includierten Variablen & Arrays aus den include Dateien stehen NUR IN DER FUNKTION zur Verfügung, weil sie als dort geschrieben angesehen werden - im Prinzip logisch aber in der Praxis eben auch Schade, weil das die Benutzung der in der Doku unter „wie kann ich …“ für viele Anwendungen unbrauchbar macht.
Daher werden auch viele Leute mit dem in der Doku angegebenen Beispiel Probleme haben - bis sie das „schnallen“.
Richtig, ich bin damit eben leider auch auf die Nase gefallen.
Ich habe in einem Script mehrere Variablen, die ich gerne in einem anderen Script zur Verfügung haben möchte. Habe mittels „includeScript“ das Script in das 2. Script eingebunden und möchte nun ALLE Variablen des 1. Scriptes im 2. haben. Wie schaffe ich das?
Warning: include(1) [function.include]: failed to open stream: No such file or directory in D:\Programme\IP-Symcon\scripts\29591.ips.php on line 6
Warning: include() [function.include]: Failed opening '1' for inclusion (include_path='.;C:\php5\pear') in D:\Programme\IP-Symcon\scripts\29591.ips.php on line 6
29591 ist die ID des Scripts, in der die Kommandos stehen…
Das Problem, dass Variablen nicht im globales Scope zur Verfügung stehen, die in einer Include definiert wurde, welche in einer Funktion eingebunden wird, hat nix mit include / require / inlcude_once / require_once zu tun.
Es hat schlicht damit zu tun, dass der include Vorgang in der Funktion und deren lokalem Scope ausgeführt wird, und die includierten Variablen nur im lokalen Scope der Funktion und damit NICHT im globalen Scope der die Funktion aufrufenden Routine zur Verfügung steht.
Abhilfe schafft nur, das Include im „Hauptscript“ direkt als Codezeile zu schreiben und damit auf den „Komfort“ der in der Doku aufgeführten Funktion (zugriff auf Script, Scriptfile und include) zu verzichten.
Deshalb habe ich auch angeregt, eine Funktion "IPS_GetScriptFile($id) einzubauen, damit die nötige (richtige) Hilfskonstruktion entfallen kann: