Timer Zeitübergabe Problem

Hallo, ich seh grad den Wald vor lauter Bäumen nicht:
Ich möchte in einem Script einen Timer mit einem Intervall von 60s anlegen …normalerweise mache ich das wie unten gezeigt … und so hat es seit Ewigkeiten funktioniert… jetzt will der Timer nicht mehr, liegt wohl an der 5stelligen Übergabe von $duration… ??? Wie macht ihr das?

    $name = "Sommerbetrieb => PPumpe steuern";
    $duration = 60*1000; #1 Minute 
    TimerDelay($duration, $name);
.....
.....
function TimerDelay($duration, $name) {
    #global $IPS_SELF;
    $sekunden=intval(substr($duration, 0,-3));
    $msekunden=substr($duration, -3, 3);
    $timerid = IPS_GetObjectIDByName($name, $_IPS['SELF']);
    if ($timerid == 0) {
       	$newtimer = IPS_CreateEvent(1);
   	    IPS_SetName($newtimer, $name);
   	    IPS_Sleep(intval($msekunden));
   	    IPS_SetEventCyclic($newtimer, 0, 0, 0, 0, 1, $sekunden);
	    IPS_SetEventCyclicDateFrom($newtimer, 0, 0, 0);
	    IPS_SetEventCyclicDateTo($newtimer, 0, 0, 0);
	    IPS_SetEventCyclicTimeFrom($newtimer, (int)date("H"), (int)date("i"), (int)date("s"));
        IPS_SetEventCyclicTimeTo($newtimer, 0, 0, 0);
        IPS_SetParent($newtimer, $_IPS['SELF']);         //Eregnis zuordnen
        IPS_SetEventAction($newtimer, "{7938A5A2-0981-5FE0-BE6C-8AA610D654EB}", []);       
  	    IPS_SetEventActive($newtimer, true);    //Ereignis aktivieren
  	}
   else
   {
   	IPS_Sleep(intval($msekunden));
       	IPS_SetEventCyclic($timerid, 0, 0, 0, 0, 1, $sekunden);
	    IPS_SetEventCyclicDateFrom($timerid, 1, 1, 2000);
	    IPS_SetEventCyclicDateTo($timerid, 0, 0, 0);
	    IPS_SetEventCyclicTimeFrom($timerid, (int)date("H"), (int)date("i"), (int)date("s"));
	    IPS_SetEventCyclicTimeTo($timerid, 0, 0, 0);
        IPS_SetParent($timerid, $_IPS['SELF']);         //Eregnis zuordnen
        IPS_SetEventAction($timerid, "{7938A5A2-0981-5FE0-BE6C-8AA610D654EB}", []);
   	    IPS_SetEventActive($timerid, true);    //Ereignis aktivieren
   }
}

Ich versteh nicht ganz, warum hier erst eine $duration in msek gemacht wird und dann mit einem String gearbeitet wird. Wird der Wert $duration immer in msek übergeben?

…sagen wir mal: das Rechnen mit msekunden ist historisch… würde ich heute sicher anders machen…

Die msek sind ja nicht das Problem - ist ja ok. Aber warum die String Verarbeitung?
Du übergibts ja einen Zahlenwert, wenn du $duration = 60*1000; rechnest.
Warum dann nicht einfach:

$sekunden = (int)($duration / 1000);
$msekunden = $duration - $sekunden*1000;

Oder gibts da einen Anwendungsfall, dass da mal ein string kommt? Dann würde ich den aber auch vorher als $duration = intval($string); übergeben.

Grüße
Stefan

Ich hab dein Skript von oben mal per copy & paste getestet. Bei mir läuft es.

Testweise hab ich mal ein paar Änderungen rein genommen:

$timerid = @IPS_GetObjectIDByName($name, $_IPS['SELF']);
    if ($timerid === FALSE) {
$sekunden = (int)($duration / 1000);
$msekunden = $duration - $sekunden*1000;
IPS_Sleep($msekunden);

Aber wie schon erwähnt - das original funktioniert bei mir für Zeiten > 1 Sekunde, was verständlich ist, weil der Timer mit 0 Sekunden deaktiviert wird.

Grüße
Stefan