Variable mit SetScripttimer übergeben?

Wenn ich mit dem Scripttimer ein Script starten will, habe ich dann die Möglichkeit auch Variablen mit an das Script zu übergeben oder wie löst man so etwas?
Ich bin nämlich auf der Suche nach einer Möglichkeit die Varaiblen vom 1Wire T4C automatisch zurück zu setzen. Bisher gehts ja leider nur bei dauer aus oder an und noch nicht bei der Zeitfunktion.

Von welcher Stelle an welche Stelle möchtest Du denn Werte übergeben.

Guten Morgen!

Also eigentlich rufe ich doch mit dieser Zeile die Funktion auf, die in den T4C_Functions ausgeführt wird.


T4C(39233,1,10,"T4C_Kanal_1")  // ($ins, $chn, $min, $var="") //

Damit wird die zuständige Variable und die Zeit bzw. Dauer Ein/Aus übergeben. Setzen und Rücksetzen wird über die T4C_Functions bei Ein/Aus schon erledigt.

Jetzt möchte ich aber bei Zeit >0 und <=60, dass die Variable nach Ablauf der Zeit zurückgesetzt wird. Bisher wird das so gelöst, das ich ein extra Script (Timergesteuert und selbstlöschend) für jeden Kanal benötige, in dem die Zeit und die Variable schon eingetragen ist. Der Übersicht wegen würde ich gern die Scripte einsparen und das von einem „Universalscript“ erledigen lassen.

Also müßte idealerweise der Aufruf aus den T4C_Functions erfolgen, aus denen dann die Variablen an ein Timerscript übergeben werden.

Ich hoffe das ist überhaupt so möglich !?

Gruß
Jens

Klar ist es das…

Du legst dir einfach entsprechende IPS Variablen an. Fütterst sie mit deinen Werten, startest dein Script über den Timer und liest sie dort wieder aus.

Achtung bei mehreren Timern und unterschiedlichen Werten! Da brauchst du auch mehrere Variablen.

Toni

Danke für den Hinweis … das hatte ich mir schon fast gedacht :frowning:

Es gibt ja die Funktion mit create und delete Variable … außerdem variableexists … kann ich in Abhängigkeit davon, ob eine Variable schon existiert die zu erstellende Variable hoch zählen?

Also vereinfacht z.B.

if $Kanal1 vorhanden, dann create $Kanal2 , falls Kanal2 auch schon vorhanden, dann create $Kanal3 usw. .. so lange bis er eine Varaible findet die noch nicht existiert?? Die werden dann auch später automatisch durch ein Script wieder gelöscht .. 

Gruß
Jens

Klar…

und zwar genau so wie du es beschrieben hast. Aber bei so viel dynamik… wie willst du deinem Script denn sagen welche der dynamisch erzeugten Variablen es verwenden soll?

Toni

Ich war den Tag am probieren … aber irgendwie habe ich wohl noch einen Denkfehler :wink:

Ich glaub mir fehlt so eine Funktion wie IPS_CreateScript :slight_smile: … oder eben eine direkte Übergabemöglichkeit von Variablen an SetScriptTimer hmpf

Wenn ich das so sehe, dann muss ich wohl doch in den sauren Apfel beißen und für jeden Kanal ein eigenes Resetscript schreiben :frowning: … wollte mir eigentlich so etwas ersparen um die Übersicht zu behalten… denn bei 20 Kanälen ist das schon nicht wenig.

Vielleicht hilft dir ein Array. Für jeden Vorgang ein Element.
Ist nur angedacht, nicht gründlich überlegt.

Hallo Rainer,

ich bin dankbar für jeden Hinweis … allerdings habe ich mit arrays keine Erfahrung … wobei ich mit fast gar nix von PHP Erfahrung habe :wink:

Ich habe mir jetzt mal die letzte Nacht um die Ohren geschlagen und versucht meine ersten größeren Gehversuche mit PHP in Verbindung mit IPS zu machen.

Das hier ist dabei herausgekommen:

Meine erweitere T4C_functions

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : T4C_functions_neu.ips.php
Trigger  :
Interval :
*/
// $ins - Instance,
// $chn - Channel [1:4]
// $min - Minutes [0:60]
// $var - Variable auf True / False

// T4C(39233,1,10,"T4C_Kanal_1"); //   10 min ein
// T4C(39233,2,61,"T4C_Kanal_2"); //     Dauer ein  / 0 = Dauer aus
// T4C(39233,3,62,"T4C_Kanal_2"); //         alle aus
// T4C(39233,4,63,"T4C_Kanal_2"); //               Testmodus


include "T4C_aus.ips.php";          // zum Ruecksetzen der Variablen einbinden
include "T4C_Timer.ips.php";        // zum Ruecksetzen der Variablen einbinden

function T4C ($ins, $chn, $min, $var="") {

   TMEX_F29_SetStrobe($ins, True);
   $res = (($chn - 1) * 64 ) + $min;
   TMEX_F29_SetPort((integer)$ins, (integer)$res);
   if ( $var<>"")
   {
      if (($min>=0) AND ($min<=60))          // check ob Zeitfunktion
         {$Funktion = 66;}                   //
      else                                   //
         {$Funktion = $min;};                // oder ein, aus, zentral aus

      SetValueInteger("T4C_Instance", $ins);

      switch($Funktion)
      {
         case 0:
         SetValueBoolean($var,FALSE);         // variable ruecksetzen bei Aus
         break;
         
         case 62:
         Zentral_aus($ins);                   // alle 4 Variablen ruecksetzen bei Zentral aus
         break;
         
         case 61:
         SetValueBoolean($var,TRUE);          // Variable setzen bei Dauer ein
         break;
         
         case 66:
         SetValueBoolean($var,TRUE);          // Variable setzen bei Ein auf Zeit
         Timer($ins,$chn,$min);               // Funktion aufrufen
         break;                               // uebergeben von Instance, Kanal und Zeit
        }
         
   }

}

// T4C (24488,2,62,"T4C_Kanal_12");               // Aufruf zum Testen
?>

Dazu dann die 1. Funktion:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : T4C_aus.ips.php
Trigger  : 
Interval : 
*/

function Zentral_aus ($instance){

switch ($instance)
   {
      case 24488:
      SetValueBoolean("T4C_Kanal_11", FALSE);
      SetValueBoolean("T4C_Kanal_12", FALSE);
      SetValueBoolean("T4C_Kanal_13", FALSE);
      SetValueBoolean("T4C_Kanal_14", FALSE);
      break;
    }
}
?>

und die 2. :

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : T4C_Timer.ips.php
Trigger  : 
Interval : 
*/
function Timer ($Instance,$Kanal,$Zeit) {

switch ($Instance)
{
   case 24488:
      switch ($Kanal)
         {
            case 1:
               IPS_SetScriptTimer("Reset_Kanal11", $Zeit);
               break;
               
            case 2:
               IPS_SetScriptTimer("Reset_Kanal12", $Zeit);
               break;
               
            case 3:
               IPS_SetScriptTimer("Reset_Kanal13", $Zeit);
               break;
               
            case 4:
               IPS_SetScriptTimer("Reset_Kanal14", $Zeit);
               break;
          }
      break;
}
}
?>

und zu guter letzt ein Beispiel für das Resetscript Kanal1 T4C Nr.1

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Reset_Kanal11.ips.php
Trigger  : 
Interval : 
*/

SetValueBoolean("T4C_Kanal_11", FALSE);
IPS_SetScriptTimer($IPS_SELF, 0);


?>

Ich weiß nicht ob das alles optimal geschrieben ist und sicher ist der Code noch schlanker zu gestalten, aber dafür poste ich das ja hier und hoffe auf die ein oder andere Meinung/Hilfe.

Die beiden extra Funktionen habe ich übrigens aus Gründen der Übersichtlichkeit rein gebracht, da ich mit mehreren T4C`s plane, daher auch die Verwendung von SWITCH, obwohl nur eine Möglichkeit zur Auswahl steht.

Jens

Hi Jens, falls du noch PHP Skriptbeispiele benötigst…

<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File     : T4C_functions_neu.ips.php
Trigger  :
Interval :
*/
// $ins - Instance,
// $chn - Channel [1:4]
// $min - Minutes [0:60]
// $var - Variable auf True / False

// T4C(39233,1,10,"T4C_Kanal_1"); //   10 min ein
// T4C(39233,2,61,"T4C_Kanal_2"); //     Dauer ein  / 0 = Dauer aus
// T4C(39233,3,62,"T4C_Kanal_2"); //         alle aus
// T4C(39233,4,63,"T4C_Kanal_2"); //               Testmodus

function MakeTimerScript ($Variable,$Zeit) {
   $Dir = IPS_GetKernelDir().'scripts\\';
   $Name = 'Reset_'.$Variable;
   $ok=file_exists($Dir.$Name.'.ips.php');
   if (!$ok) {
      // Erzeugt Resetskript für das Löschen des Skripttimers
      // falls noch keines existiert. (=Name anhand der Variable)
      // Pfadbeispiel: C:\Programme\IP-SYMCON\scripts\Reset_T4C_Kanal11.ips.php
      $crlf=chr(13).chr(10);
      $Code = '<?'.$crlf.'SetValueBoolean("'.$Variable.'", FALSE);'.$crlf.'IPS_SetScriptTimer($IPS_SELF, 0);'.$crlf.chr(63).chr(62);
      $handle = fopen ($Dir.$Name.'.ips.php', 'w');$ok=fwrite ($handle, $Code);fclose ($handle);
      IPS_RegisterScript($Name,$Name.'.ips.php');
   }
   // Setzen des Skripttimers
   IPS_SetScriptTimer($Name,$Zeit);
}

function T4C ($ins, $chn, $min, $var="") {
   TMEX_F29_SetStrobe($ins, True);
   $res = (($chn - 1) * 64 ) + $min;
   TMEX_F29_SetPort((integer)$ins, (integer)$res);
   if ( $var<>"")
   {
      if (($min>=0) AND ($min<=60))          // check ob Zeitfunktion
         {$Funktion = 66;}                   //
      else                                   //
         {$Funktion = $min;};                // oder ein, aus, zentral aus

      SetValueInteger("T4C_Instance", $ins);

      switch($Funktion)
      {
         case 0:
         SetValueBoolean($var,FALSE);         // variable ruecksetzen bei Aus
         break;

         case 62:                             // alle 4 Variablen ruecksetzen bei Zentral aus
            if ($ins==24488) $Variable='T4C_Kanal1';
            if (isset($Variable)) {
               for($i=1;$i<=4;$i++) {SetValueBoolean($Variable.$i,false);}
            }
         break;

         case 61:
         SetValueBoolean($var,TRUE);          // Variable setzen bei Dauer ein
         break;

         case 66:                             // Variable setzen bei Ein auf Zeit
            if ($ins==24488) {                // Statusvariable anhand Instanz
               $Variable='T4C_Kanal1'.$chn;   // und Kanalzahl
            }
            if (isset($Variable)) {
               MakeTimerScript($Variable,$min);  // Funktion aufrufen
            }
         break;
      }
   }
}

// T4C (24488,2,62,"T4C_Kanal_12");               // Aufruf zum Testen
?>

Dazu noch ein paar Anmerkungen:

[ul]
[li]ist alles ALL IN ONE
[/li][li]Funktion: MakeTimerSkript, stellt den Skripttimer zum Löschen der Variable und erstellt zusätzlich gleich das ganze Skript falls es noch nicht existiert.
[/li][li]bei richtiger Übergabe der Parameter der T4C Funktion (=4. Parameter) könntest du, wenn richtig angewandt (event. ist das Skript dann noch zum Umschreiben) die Zeilen 57,58,60,68-71,73 sogar noch einsparen.
[/li][/ul]
Aber wie gesagt, das sind alles nur Anregungen.

Günter.

Hallo Günter,

vielen Dank für die Anregung.
Den ersten Teil verstehe ich zwar noch nicht so ganz (das mit der Maketimerscript function), aber ich versuch mir das heute Abend mal genauer anzusehen, auch wie ich das mit mehreren T4Cs dann löse, da dadurch später noch mehrere Instanzen hinzu kommen.

Auf den ersten Blick spare ich dadurch meine beiden zusätzlichen Funktionen ein und auch das Setzen der Variable

 SetValueInteger("T4C_Instance", $ins);

könnte ja weg bleiben, da ich die dann weiter abgefragt hätte.

edit
Also die Sache mit dem MakeTimerScript ist ungefähr das was ich gesucht habe … nur wußte ich nicht wie das zu realisieren ist. Was passiert in dieser Zeile?

$crlf=chr(13).chr(10); 

Da wird in die Variable ein Zeilenumbruch hineingelegt… Immer wenn diese Variable verwendet wird wird an der Stelle die Zeile umgebrochen.