IR Befehle nach Ausführung verzögern

Hallo!

Ich habe jetzt schon länger gesucht, aber leider keinen Hinweis zu folgendem Problem gefunden.

Ich benutze IRTrans im einige Geräte zu steuern. Da ich ja über Infrarot keine Rückmeldung bekomme muss ich bestimmte Aktionen verzögern.
Beispiel:
Ich habe einen Sat Receiver der zum einschalten ca. 5 Sekunden benötigt. Zum abschalten aber ca. 20 Sekunden. Den aktuellen Zustand kann ich mir in einer Variablen merken. Ich muss aber für die Dauer von ca. 20 Sekunden das WebFrontend „einfrieren“, damit der Benutzer keine weiteren Aktionen ausführen kann die der Sat Receiver dann noch nicht verarbeiten kann.
Wie löse ich das am besten?

Danke für die Hilfe!

habe das selbe Problem, mein angestrebter Lösungsweg wäre den Änderungszeitpunkt der Variable auszulesen und dann ein Sleep einzubauen oder den IR-Befehl zu ignorieren.

By the way, bin kurz davor eine komplette Entertainment Steuerung hier ins Forum zu stellen, wenn Du Dich noch etwas in Geduld übst, kannst Du eventuell auch auf dieser aufsetzen …

lg
Andreas

Also wenn der Benutzer warten muss, damit es Funktioniert, wirst du das nicht über IPS regeln können, sondern nur mit dem Benutzer. Der muss dann halt nochmal drücken, wenn das Gerät so weit ist.

Wenn du möchtest, dass IPS deine Befehle in gewissen Abständen sendet, kannst du dir gerne ein Beispiel an meiner Lösung nehmen.

<?
$status=GetValueBoolean(12644 /*[Erdgeschoss\Wohnzimmer\MediaCenter\MediaCenter Power Ist]*/);
if ($status) {
	IPS_SetScriptTimer($IPS_SELF, 0);
	return;
	}
$commands =array( //Fernbedienung, Befehl, Anzahl/Wiederholungen, Pause (minimal 1)
   array("mediacenter","livetv",2,1),
	array("panasonicplasma","power on",4,5),
   array("logisound","power",2,2),
	array("panasonicplasma","input pc",2,1),
	array("logisound","analog",2,1),
	array("mediacenter","livetv",2,1)
);
if($IPS_SENDER == "RunScript")	{
   IPS_Execute("c:\\ip-symcon\programme\wakeonlan\startpcmce.bat", "", false, false);
   SetValue(12909 /*[Erdgeschoss\Wohnzimmer\MediaCenter\Mediacenter einschalten\Step]*/,0);
   IPS_SetScriptTimer($IPS_SELF,1);
	}

if($IPS_SENDER == "TimerEvent"){
	$step=GetValue(12909 /*[Erdgeschoss\Wohnzimmer\MediaCenter\Mediacenter einschalten\Step]*/);
	$count = count($commands);
	if($step<$count){
	   $rep = $commands[$step][2];$i=0;
	   while ($i < $rep) {
			USCK_SendText(45331 /*[UDP Socket - IR-Trans Wohnzimmer]*/, "snd ".$commands[$step][0].",".$commands[$step][1]);
			$i++;
			}
		IPS_SetScriptTimer($IPS_SELF, $commands[$step][3]);
		$step++;
		SetValue(12909 /*[Erdgeschoss\Wohnzimmer\MediaCenter\Mediacenter einschalten\Step]*/,$step);
		}
	else{
		SetValue(12644 /*[Erdgeschoss\Wohnzimmer\MediaCenter\MediaCenter Power Ist]*/,true);
	   IPS_SetScriptTimer($IPS_SELF, 0);
	   }
	}
?>

Dieses Script müsste natürlich, falls du es überhaupt gebrauchen kannst/willst angepasst werden.

Gruß
Smudo

Hallo!
Vielen Dank an Brownson und Smudo!

Auf Basis von Smudos Code habe ich folgende Lösung erstellt:

<?
$status=GetValueBoolean(13083  /*[Geräte\Technisat\Power]*/);
IPS_LogMessage($IPS_SELF, $IPS_SENDER);

if($IPS_SENDER == "RunScript" or $IPS_SENDER == "WebFront")    {
   IPS_LogMessage($IPS_SELF, "");
    if (!GetValueBoolean(29534  /*[Geräte\Technisat\IsActive]*/)){
       IRT_SendOnce(40207  /*[Geräte\IRTrans\IRTrans WLAN]*/,"technisatmf4s", "power");
        SetValueBoolean(13083 /*[Geräte\Technisat\Power]*/,!GetValueBoolean(13083 /*[Geräte\Technisat\Power]*/));
        $duration = 20;
        if (GetValueBoolean(13083  /*[Geräte\Technisat\Power]*/))
       {
          $duration = 5;
       }
       SetValueBoolean(29534  /*[Geräte\Technisat\IsActive]*/,true);
       IPS_SetScriptTimer($IPS_SELF,$duration);
   }
   else
   {
      WFC_SendNotification(28880 /*[WebFront Configurator]*/, 'Derzeit wird ein anderer Befehl ausgeführt', 'Bitte warten Sie!','Information' , 3);
   }
}

if($IPS_SENDER == "TimerEvent")
{
   SetValueBoolean(29534  /*[Geräte\Technisat\IsActive]*/,false);
    IPS_SetScriptTimer($IPS_SELF, 0);
   }
?>

Die IsActive Variable zeige ich auf dem Bildschirm als „Status“ an und ich habe ihr ein eigenes Profil aus Basis von ~Presence angelegt welches bei FALSE „Bereit“ und bei TRUE „Beschäftigt“ anzeigt. So kann der Nutzer auch unter iFront jederzeit sehen ob gerade etwas passiert.

Hallo Waahnsinn,

das hat jetzt mal gar nichts mehr mit dem zu tun was mein Script so macht aber mir war im nachhinein auch schon klar, dass es eigentlich gar nicht so richtig zu deinem Problem passte.

Um so mehr freut es mich, dass dir das Script eine Inspiration/Hilfe war.

Gruß
Smudo