Befehl nur einmal ausführen in Zeit ca. 2Sek.

Hallo, (hier das 2. Problem)

ich bastele nun schon seit „einigen“ Stunden an zwei Problemen rum. Zum besseren auseinanderhalten mache ich zwei Themen dafür auf (auch wenn es am Ende im gleichen Skript landen soll.

Ziel:

Wenn die Taste auf der Fernbedienung gedrückt wird soll der Befehl nur 1x ausgeführt werden, auch wenn durch zu langes drücken das Datenpaket mehrmals kommt (toggle mit eingebaut)

Umfeld:

Es kommen bei gedrückt halten der Taste auf der FB etwa 3 Datenpakete pro Sekunde vom µC über die RS232 rein.
Es soll aber nur einer innerhalb von ca. 2sek ausgefüht werden.

Script ohne meine Versuche:


<?
$data = GetValueString("TobiInput");
$teile = explode(";", $data);

// Die Sender heißen A, B, C, D usw...
// Das entspricht dann Wohnzimmer, Flur etc...
$sender = $teile[0]{1};
echo "Sender ".$sender."
";

$typ = $teile[0]{2};
if($typ == "i") //i=Infrarot
{
  $geraet = rtrim($teile[1]);
  $taste = rtrim($teile[2]);
  echo "Infrarot ";
  echo "Geraetenummer ".$geraet;
  echo " Taste *".$taste."*
";
  
  switch($geraet)
  {
	 case "0": // Gerätecode 0
		switch($taste)
		{
		  case "32":
			 echo "rauf";
			 MBT_WriteCoil(10397 /*[Wago MBT]*/ ,514 /* Ausgang514 = Licht wozi */,true);
			 break;
                         IPS_Sleep (500);
			 MBT_WriteCoil(10397 /*[Wago MBT]*/ ,514 /* Ausgang514 = Licht wozi */,false);
       

case "02":
			 echo "02";                                                                   // Taste IR Code-02 Gerät-0 mit Toggle-Funktion                                                                           
			 
			 $Hilfe02 = GetValueBoolean("HilfVTaste02");                                  //Hilfsvariable nach $Hilfe02
                         if ($Hilfe02== False){                                                       //wenn False dann folgendes ausführen
			 COMPort_SendText(20531 /*[Serial Port 17 / 3-1..4a+b]*/ , "\xffCa\0\1\xfe"); //LCD LED AN
			 SetValueBoolean("HilfVTaste02",True);                                        //HilfsVariable auf "True" setzen
			 }
			 if ($Hilfe02== True){                                                        //wenn True dann folgendes ausführen
			 COMPort_SendText(20531 /*[Serial Port 17 / 3-1..4a+b]*/ , "\xffCb\0\1\xfe"); //LCD LED AUS
			 SetValueBoolean("HilfVTaste02",False);                                       //HilfsVariable auf "False" setzen
          		 }
          		 break;
			 
  }
}

?>

Gemeint ist der Bereich → case „02“: … …LCD LED AN…

nun meine :o Versuche -erröt- denn er weiß nicht was er kopiert

case "02":
			 echo "02";                                                                   // Taste IR Code-02 Gerät-0 mit Toggle-Funktion
    define ("SPERRZEIT", 2);                                                     // Wartezeit in Sekunden

			 if (IPS_GetScriptTimer ($IPS_SELF) == 0)
			 {                                                                            // Timer läuft nicht, Skript darf gestartet werden
    IPS_SetScriptTimer ($IPS_SELF, SPERRZEIT);
			 $Hilfe02 = GetValueBoolean("HilfVTaste02");                                  //Hilfsvariable nach $Hilfe02
          if ($Hilfe02== False){                                                       //wenn False dann folgendes ausführen
			 COMPort_SendText(20531 /*[Serial Port 17 / 3-1..4a+b]*/ , "\xffCa\0\1\xfe"); //LCD LED AN
			 SetValueBoolean("HilfVTaste02",True);                                        //HilfsVariable auf "True" setzen
			 }
			 if ($Hilfe02== True){                                                        //wenn True dann folgendes ausführen
			 COMPort_SendText(20531 /*[Serial Port 17 / 3-1..4a+b]*/ , "\xffCb\0\1\xfe"); //LCD LED AUS
			 SetValueBoolean("HilfVTaste02",False);                                       //HilfsVariable auf "False" setzen
          }
          else
          return;
          break;
			 case "TimerEvent":
				 IPS_SetScriptTimer($IPS_SELF, 0);
			 break;

Danke

Jan


$t2 = IPS_GetVariable($id_run_og_zz_modus);
if((time()-$t2['VariableUpdated'])>2) setvalue($id_run_og_zz_modus, false);
if(getvalue($id_run_og_zz_modus)) return; // Mehrfaches Triggern in kurzer Zeit verhindern
SetValue($id_run_og_zz_modus, true);

Beispiel aus einem meiner Fernbedienungsscripte.

Danke für die Hilfe, aber…

leider verstehe ich nicht was da passiert und wie ich das in mein Script rein bekomme. Kann ich noch ein paar Erläuterungen zu den Zeilen haben:rolleyes:

Bitte nicht mein PHP-Wissen aus dem angehängtem Script ableiten, davon habe ich nur sehr wenig selbst von erstellt.:frowning:

Gruß

Jan

Die Variable $id_run_og_zz_modus (Bool) erstellen. Darf bei Dir natürlich einen anderen Namen haben.
Die Codezeilen von mir müssen am Anfang des von der FB zu triggernden Scripts stehen.
Hier wird einfach ein Zeitstempel einer Variablen geprüft. Ist dieser < 2 Sekunden bleibt die Variable auf true und das Script wird verlassen, sonst wird diese false und das Script wird ausgeführt.:wink:

Danke!
Nach dem ich den Namen des Skrips durch die ID ersetzt habe geht es.

Jan