Aufruf modulinterner Funktionen über ein zyklisches Event

ICh habe gerade das Problem, dass ich in einem Modul ein Event erstelle, welches einmal täglich um 23 Uhr eine interne Funktion aufrufen soll. Es gibt keine Fehlermeldung, allerdings ruft er die Funktion auch nicht auf. Ich vermute, dass irgendwas mit der Aufrufsyntax nicht in Ordnung ist, habe aber in der Doku nur Sachen gefunden, wo mit einer GUID aufgerufen wird.

Der Code schaut so aus:

public function Create()
    {

        parent::Create();
        
        $this->RegisterEventTarif('GetTarifEvent','GetTarifEvent',1, $this->InstanceID, 200);   #Event zum abruf der Daten 

    }

private function RegisterEventTarif($Name, $Ident, $Typ, $Parent, $Position)
	{
		$eid = @$this->GetIDForIdent($Ident);

        if($eid === false) {
			$eid = 0;
		} else if(IPS_GetEvent($eid)['EventType'] <> $Typ) {
            $this->LogMessage("Eventregister Delete: $eid, $Typ",KL_NOTIFY);
			IPS_DeleteEvent($eid);
			$eid = 0;
		}

        //we need to create one
		if ($eid == 0) 
	        {
	        $EventID = IPS_CreateEvent($Typ);
            $this->LogMessage("Eventregister Create: $EventID, $Typ",KL_NOTIFY);

            IPS_SetEventCyclicTimeFrom($EventID, 23, 0, 0);     #Täglich um 23Uhr
            IPS_SetParent($EventID, $Parent);                   #Parent Setzen-> dieses Modul
			IPS_SetIdent($EventID, $Ident);                     #Ident setzen
			IPS_SetName($EventID, $Name);                       #Name Setzen
			IPS_SetPosition($EventID, $Position);               #Position im Modul setzen
			// Initiale Befüllung
            IPS_SetEventAction ($EventID, getVariableTarif(),[]); #Auszuführende Funktion (Hier eventuell der Fehler?)
            IPS_SetEventActive($EventID, true);                 #aktivieren

	        }
		
	}


#interne Funktion, die aufgerufen werden soll
public function getVariableTarif() {
#erst mal nur Tibber abfragen
$this->GetTibberPrice();
}


Module nutzen eigentlich nie externe Ereignisse, sondern benutzen die internen Timer mir RegisterTimer und SetTimerInterval.
Siehe auch hier unter Reviews/Best Practises Punkt 6:

Michael

OK nehme ich mal so hin. Aber bei RegisterTimer kann ich zwar angeben in welchem Abstand sich das wiederholt, also zum Beispiel alle 24h aber keine definierte Uhrzeit angeben. In meinem Fall ist halt das Problem, dass die Tibber-Daten täglich erst ab 13 Uhr vorliegen und ich mein prognosebasiertes Solarspeicherladen eben erst nach Sonnenuntergang. Aber bevor der kommende Tag beginnt anstoßen möchte.
Oder soll ich da einen minutlichen Timer anstoßen und dann einfach nachschauen, ob die Zeit gerade passt? Ist das das Konzept?

Oder die Zeit bis 23 Uhr ausrechnen :smiley:

Ja, es ist so wie Michael eben schreibt - es gibt nur den Timer. Am besten man schreibt sich eine kleine Hilfsfunktion um das immer zu berechen …

    /**
     * Update interval for a cyclic timer.
     *
     * @param string $ident  Name and ident of the timer.
     * @param int    $hour   Start hour.
     * @param int    $minute Start minute.
     * @param int    $second Start second.
     */
    protected function UpdateTimerInterval($ident, $hour, $minute, $second)
    {
        $now = new DateTime();
        $target = new DateTime();
        $target->modify('+1 day');
        $target->setTime($hour, $minute, $second);
        $diff = $target->getTimestamp() - $now->getTimestamp();
        $interval = $diff * 1000;
        $this->SetTimerInterval($ident, $interval);
    }

Gruß Heiko

1 „Gefällt mir“