Hallo,
ich habe ein Problem mit der dynamischen Aktivierung/Deaktivierung von Events über den Befehl IPS_SetEventActive.
Deaktiviere ich ein Änderungs-Event für eine Variable, ändere die Variable und aktiviere das Event danach wieder, so wird das zugehörige Event nicht immer unterdrückt.
Hintergrund:
Ich nutze einen CUL-Adapter für das Senden und Empfangen von FS20 Befehlen und habe jeweils zwei Variablen für einen FS20 Aktor definiert „UI_Status“ und „UI_Intensity“. Die beiden Variablen sollen nun automatisch in Abhängigkeit geändert werden, d.h. wenn UI_Status auf True gesetzt wird, wird automatisch UI_Intensity auf 16 bzw. 100% gesetzt usw… Für beide Variablen existiert ein Änderungsevent auf das gleiche Sende-Skript.
Wird nun also z.B. UI_Status geändert wird das Sende-Skript aufgerufen und UI_Instensity in Abhängigkeit geändert. Diese Änderung soll natürlich nicht noch eine Event-Verarbeitung auslösen.
Problem:
Zu ca. 50% funktioniert die Funktion wie erwartet und korrekt. In den anderen 50% der Fälle wird trotz der Deaktivierung des Änderungsevents das Sende-Skript nochmals durch die Änderung der abhängigen Variable angestoßen (habe via Logs nachvollzogen, dass das Event tatsächlich deaktiviert wurde während der Änderung).
Wie kann dies passieren?
Ich dachte in IPS werden die Skripte und Events sequentiell und synchron abgearbeitet, somit müßte die Deaktvierung sofort aktiv werden und es dürfte nicht noch ein Event in die Verarbeitungsqueue eingehängt werden!? Oder sehe ich das falsch und die Verarbeitung in IPS läuft doch anders?
Was mache ich hier falsch bzw. wie kann ich das gewünschte Verhalten erziehlen?
Code Send-Skript:
switch ($name)
{
case "UI_Status":
$intensityID=IPS_GetObjectIDByName("UI_Intensity", $fs20);
SetEventIsActive($_IPS['SELF'], $intensityID, false); // Event für Änderung deaktivieren, damit diese nicht wieder das Script aufruft!
if($IPS_VALUE)
{
$val = "11";
SetValueInteger($intensityID, 16); // 16 = 100% for FS20
}
else
{
$val = "00";
SetValueInteger($intensityID, 0);
}
SetEventIsActive($_IPS['SELF'], $intensityID, true); // Event für Änderung wieder aktivieren, damit Änderungen durch User wieder erkannt werden
break;
case "UI_Intensity":
$val=dimmer($IPS_VALUE);
$statusID = IPS_GetObjectIDByName("UI_Status", $fs20);
SetEventIsActive($_IPS['SELF'], $statusID, false); // Event für Änderung deaktivieren, damit diese nicht wieder das Script aufruft!
if($IPS_VALUE > 0)
{
SetValueBoolean($statusID, true);
}
else
{
SetValueBoolean($statusID, false);
}
SetEventIsActive($_IPS['SELF'], $statusID, true); // Event für Änderung wieder aktivieren, damit Änderungen durch User wieder erkannt werden
break;
default:
print "Unknown Name $name";
return;
}
Code Funktion SetEventIsActive:
/**
* Activates/deactivates a event
* @param integer eventTargetID The parent object of the events to set active/deactive
* @param integer eventTriggerID The id of the trigger variable of the event
* @param boolean active Set true if event should be active; otherwise false
*/
function SetEventIsActive($eventTargetID, $eventTriggerID, $active)
{
$eventIDs = @IPS_GetChildrenIDs($eventTargetID);
if($eventIDs)
{
foreach($eventIDs as $eventID)
{
$eventObj = @IPS_GetEvent($eventID);
if($eventObj)
{
if($eventObj['TriggerVariableID'] == $eventTriggerID)
{
IPS_SetEventActive($eventObj['EventID'], $active);
IPS_LogMessage("CommonHelper.SetEventIsActive", "Event Active changed: EventID: ".$eventObj['EventID']." TriggerID: ".$eventObj['TriggerVariableID']." IsActive: ".$active);
}
}
}
}
}