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 )
@mein Ziel:
das das jeweilige Relais wieder zurückgesetzt wird.
Danke schon mal für die Hilfe im voraus.
Grüße Mirko