Shutter Control und Timer und V2.2

Hallo Leute,

Ich bastle die letzte Tage mit meinen Shutter Control rum. Leider gibt es ein Problem und das scheinen mehrere hier zu haben läuft aber aufgrund unterschiedlicher Hardware auseinander.

@meine Verkablung:
Also ich habe mehre 1-Wire DS2408 an den ausgängen Koppelrelais mit je 1xWechsler. Die Verkablung ist so gelöst das je ein Relais für hoch gibt und eins für runter. Nun habe ich im IPS je ein Device für hoch und eins für runter angelegt. So das ich die beiden Device im Shutter Control Modul auswählen kann. Alles klar soweit ?

@meine Script:

<?
//Variables provided by ShutterControl Module
IPS_LogMessage("InstanceID", $SC_INSTANCE); /* InstanceID */
IPS_LogMessage("InstanceID2", $SC_INSTANCE2); /* InstanceID2 */
IPS_LogMessage("Direction", $SC_DIRECTION); /* {0..2} Stop, Up, Down */
IPS_LogMessage("Duration", $SC_DURATION); /* ms */

switch($IPS_SENDER)
{

	case "ShutterControl": //Script wurde vom Shuttermodul aufgerufen
	define("SC_DIRECTION_STOP", 0);
	define("SC_DIRECTION_UP", 1);
	define("SC_DIRECTION_DOWN", 2);

	$instance = IPS_GetInstance($SC_INSTANCE);
      switch($SC_DIRECTION)
      	{
         case SC_DIRECTION_STOP:
         TMEX_F29_SetStrobe($SC_INSTANCE, true);
         TMEX_F29_SetPort($SC_INSTANCE, 255);
         TMEX_F29_SetStrobe($SC_INSTANCE2, true);
         TMEX_F29_SetPort($SC_INSTANCE2, 255);
         break;
              
         case SC_DIRECTION_UP:
         TMEX_F29_SetStrobe($SC_INSTANCE, true);
         TMEX_F29_SetPort($SC_INSTANCE, 0);
         if($SC_DURATION > 999)
         	{
            TimerDelay($SC_INSTANCE, $SC_DURATION, "AUF");
            }
         if($SC_DURATION > 0 and $SC_DURATION <= 999)
         	{
            IPS_Sleep($SC_DURATION);
            TMEX_F29_SetStrobe($SC_INSTANCE, true);
            TMEX_F29_SetPort($SC_INSTANCE, 255);
            }
         break;
              
         case SC_DIRECTION_DOWN:
         TMEX_F29_SetStrobe($SC_INSTANCE2, true);
         TMEX_F29_SetPort($SC_INSTANCE2, 0);
         if($SC_DURATION > 999)
          	{
            TimerDelay($SC_INSTANCE2, $SC_DURATION, "AB");
            }
			if($SC_DURATION > 0 and $SC_DURATION <= 999)
 	         {
            IPS_Sleep($SC_DURATION);
            TMEX_F29_SetStrobe($SC_INSTANCE2, true);
            TMEX_F29_SetPort($SC_INSTANCE2, 255);
            }
         break;

	default:
   die("No Handler for Module ".$instance['ModuleInfo']['ModuleName']." found");
}
break;

case "TimerEvent": //Script wurde von einem Ereignis aufgerufen

IPS_SetEventActive($IPS_EVENT, false);    //Ereignis deaktivieren
$timer=IPS_GetName($IPS_EVENT);
$SCT_INSTANCE = intval(substr($timer,-5,5));
$bus = substr($timer,0,-5);

    switch ($bus)
    {
    case "AUF":
    TMEX_F29_SetStrobe($SC_INSTANCE, true);
    TMEX_F29_SetPort($SC_INSTANCE, 255);
    break;

    case "AB":
    TMEX_F29_SetStrobe($SC_INSTANCE2, true);
    TMEX_F29_SetPort($SC_INSTANCE2, 255);
    break;
    }

break;
}

function TimerDelay($id, $time, $bus)
{
    global $IPS_SELF;
    $sekunden=intval(substr($time, 0,-3));
    $msekunden=substr($time, -3, 3);
    $timerid = IPS_GetObjectIDByName($id, $IPS_SELF);
    if ($timerid ==0)
    {
    $newtimer = IPS_CreateEvent(1);
    IPS_SetEventScript($newtimer, $IPS_SELF); //Aktuelles Skript aufrufen
    IPS_SetName($newtimer, $id);
    IPS_Sleep(intval($msekunden));
    IPS_SetEventCyclic($newtimer, 0, 0, 0, 0, 1, $sekunden);
    IPS_SetEventCyclicDateBounds($newtimer, 0, 0);
    IPS_SetEventCyclicTimeBounds($newtimer, time(), 0);
    IPS_SetEventActive($newtimer, true);    //Ereignis aktivieren
    }
   else
    {
    IPS_Sleep(intval($msekunden));
    IPS_SetEventCyclic($timerid, 0, 0, 0, 0, 1, $sekunden);
    IPS_SetEventCyclicDateBounds($timerid, 0, 0);
    IPS_SetEventCyclicTimeBounds($timerid, time(), 0);
    IPS_SetEventActive($timerid, true);    //Ereignis aktivieren
    }
}

function CreateVariableByName($id, $name, $type)
{
   global $IPS_SELF;
   $vid = @IPS_GetVariableIDByName($name, $id);
   if($vid===false)
	{
   $vid = IPS_CreateVariable($type);
   IPS_SetParent($vid, $id);
   IPS_SetName($vid, $name);
   IPS_SetInfo($vid, "This Variable was created by Script #$IPS_SELF");
   }
   return $vid;
}

?>

@Anmerkung
Die Zeilen


TMEX_F29_SetStrobe($SC_INSTANCE, true);
TMEX_F29_SetPort($SC_INSTANCE, 255);

bedeuten immer ein Schaltvorgeng und können durch X-beliebige andere Hardware Schaltvorgänge ausgetauscht werden.

@mein Probelm:
Löse ich einen Schaltvorgang z.b. über das Webfront aus so geht eigentlich alles sauber bis zu dem Punkt wo der gestarte Timer das Script erneut aufrufen soll. Dann bekomme ich immer den Log Eintrag : „Kann Ereignis #12345 für Objekt #0 nicht starten“ (12345 ist nur ein Beispiel :stuck_out_tongue: )

@mein Ziel:
das das jeweilige Relais wieder zurückgesetzt wird.

Danke schon mal für die Hilfe im voraus.
Grüße Mirko

Hallo,

auf die Schnelle würde ich sagne dass im Timerbereich einfach das „t“ fehlt;)
Es wird eine SCT_INSTANCE definiert, also muss man auch auf eine SCT_INSTANCE zugreifen.

case "TimerEvent": //Script wurde von einem Ereignis aufgerufen 

IPS_SetEventActive($IPS_EVENT, false);    //Ereignis deaktivieren 
$timer=IPS_GetName($IPS_EVENT); 
$SCT_INSTANCE = intval(substr($timer,-5,5)); 
$bus = substr($timer,0,-5); 

    switch ($bus) 
    { 
    case "AUF": 
    TMEX_F29_SetStrobe($SCT_INSTANCE, true); 
    TMEX_F29_SetPort($SCT_INSTANCE, 255); 
    break; 

    case "AB": 
    TMEX_F29_SetStrobe($SCT_INSTANCE2, true); 
    TMEX_F29_SetPort($SCT_INSTANCE2, 255); 
    break; 
    } 

break; 

Gruß Philipp

Danke fuer deinen Tip aber das wars leider nicht. Ich habe es auch gleich getestet aber leider bleibt es beim alten problem: „Kann Ereignis #12345 fuer Objekt #0 nicht starten“

Gibt es weitere Ideen ??? :confused::confused:

Ich habe schon alle moeglichen Varianten ausprobiert auch mit nur einer „SC_INSTANCE“ immer wieder das selbe resultat. Ich denke ja das Iregend etwas an der Erstellung der Variable nicht IO ist.

Gruesse

Ich hatte das gleiche Problem.

Im Script muss folgendes geändert werden:

// IPS_SetEventScript($newtimer, $IPS_SELF); //Aktuelles Skript aufrufen
IPS_SetParent($newtimer, $IPS_SELF); // NEU WEGEN IPS2.1

siehe auch diesen Link: http://www.ip-symcon.de/forum/f52/shutter-control-problem-zeitskript-8971/

Danach funktioniert alles prima.

Gruß

Manfred

DANKE das war’s was sich gesucht habe!!
Aber soll ich was sagen, ich bin vor etwa 10 min selbst drauf gekommen:o

Ich danke dennoch das war die Bestätigung!!!

Hallo,

das ist mir völlig durchgerutscht:eek:

Da bei mir schon alle Shutter angelegt waren gabs da noch keine Probleme.

Werde das aber auch in meinem geposteten Script anpassen.

Gruß Philipp

Ergänzung:
Beim Anlegen der Timer kommt es zu einer „Bildschirmausgabe“ im ShutterControl-Script (Timer Version), die zu unschönen und irritierenden Fehlern bei erstmaliger Benutzung führen (erstmalig bei „hoch“ und erstmalig bei „runter“ je Jalousie).

Nach näherer Analyse ist die Ursache eine Warnung (in etwa: „Objekt nicht gefunden“) bei Abarbeitung folgender Codezeile:

$timerid = IPS_GetObjectIDByName($bus.$id, $IPS_SELF);

Eine kleine Änderung behebt das Problem und auch bei vorher gelöschten Timern oder neu eingebundenen und erstmalig angesteuerten Jalousien funzt alles sofort:

$timerid = @IPS_GetObjectIDByName($bus.$id, $IPS_SELF);

Gruß Gerd