Hallo Leute,
ich habe ein Problem und kann es einfach nicht lösen.
Vielleicht hat jemand von Euch eine gute Idee - ich ware wirklich dankbar.
Ich schalte über Webfront meine Beregnungsanlage. Es gibt dazu verschiedenste Funktionen und Beregnungsmöglichkeiten. Bei der Version 3.0 war alles ok. Seit dem Update zu 3.1 spinnt das Ganze ein wenig rum.
Ich habe SetEventCyclicDateBounds gegen die neuen Befehle ersetzt.
Wenn die folgende Funktion aufgerufen wird, passiert folgendes:
Timer wird richtig gesetzt jedoch bekomme ich am Webfront folgende Fehlermeldungen:
- Error Trying reconnect in a few seconds
- Error Connection lost! NullError: Cannot call „Rn,0)“ on null
Danach wird die Verbindung zu Webfront unterbrochen und sofort wieder aufgebaut - fühlt sich an wie ein Refresh im Explorer. Nehme ist testweise die beiden Zeilen IPS_SetEventCyclicTimeFrom und IPS_SetEventCyclicDateFrom raus, dann wird natürlich der Timer nicht richtig gesetzt, aber die Fehlermeldung verschwindet.
Das ist meine Funktion:
function Update_Wait_Timer($CircleId, $ProgramNo, $Value, $ControlId, $Time_until_next_Date)
{
$Parent_ID = IPS_GetParent($ControlId);
$Parent_ID = IPS_GetParent($Parent_ID);
$Parent_ID = IPS_GetParent($Parent_ID);
$Parent_ID = IPS_GetScriptIDByName(c_Bewaesserung_Regelung, $Parent_ID); // Script Bewässerungs_Regelung suchen
if ($Value)
{
$New_Timer_Name = "Wait_Timer_".$CircleId."_".$ProgramNo; // Namen für neuen Timer festlegen
$New_Timer = @IPS_GetEventIDByName($New_Timer_Name, $Parent_ID);
if ($New_Timer === false) // wenn Timer noch nicht existiert
{
$New_Timer = IPS_CreateEvent(1); // zyklisches Event anlegen
IPS_SetParent($New_Timer, $Parent_ID); // Timer wird immer in der Root angelegt - Timer ins richtige Verzeichnis verschieben
IPS_SetName($New_Timer, $New_Timer_Name); // Timer Name festlegen
IPS_SetEventScript($New_Timer, $Parent_ID); // Aktuelles Skript aufrufen wenn Timer abläuft
IPS_SetEventCyclic($New_Timer, 1, 0, 0, 0, 0, 0); // Timer auf Beregnungsdauer einstellen; einmalig - für CyclicDateTo
}
$End_Time = time() + $Time_until_next_Date; // Endzeit für Timer ausrechnen, time() = Zeit ins sec. seit 1.1.1970; $Time_until_next Date = Zeit in sec. bis zum Ablauf des Timers
$End_Time_Hour = idate('H', $End_Time);
$End_Time_Minute = idate('i', $End_Time);
$End_Time_Second = idate('s', $End_Time);
$End_Time_Year = idate('Y', $End_Time);
$End_Time_Month = idate('m', $End_Time);
$End_Time_Day = idate('d', $End_Time);
IPS_SetEventCyclicTimeFrom($New_Timer, (int)$End_Time_Hour, (int)$End_Time_Minute, (int)$End_Time_Second); // Ablaufzeit des Timers einsteller - Uhrzeit
IPS_SetEventCyclicDateFrom($New_Timer, (int)$End_Time_Day, (int)$End_Time_Month, (int)$End_Time_Year); // Ablaufzeit des Timers einstellen - Datum
IPS_SetEventActive($New_Timer, true); // Timer aktivieren
// ************ Alte Variante - nur möglich bis IPS 3.0 *******************
// IPS_SetEventCyclicDateBounds($New_Timer, time()+$Time_until_next_Date, time()+$Time_until_next_Date); // Enddatum für den Timer festlegen - wird das nicht gemacht läuft der Timer vom alten Wert weiter herunter sonderbarerweise auch wenn dieser zwischenzeitlich gelöscht wird
// IPS_SetEventCyclicTimeBounds($New_Timer, time()+$Time_until_next_Date, time()+$Time_until_next_Date); // Endzeit festlegen
}
else
{
$Timer_Name = "Wait_Timer_".$CircleId."_".$ProgramNo;
if(@IPS_GetEventIDByName($Timer_Name, $Parent_ID) <> false) // wenn Timer existiert löschen
IPS_DeleteEvent(@IPS_GetEventIDByName($Timer_Name, $Parent_ID));
}
return;
}