RegisterTimer zum Aufruf nicht öffentlicher Funktionen

Hallo an alle,
Ich habe eine Alarmanlage programmiert die für diverse Zwecke intern mehrere Timer benötigt. Momentan mache ich das mit RegisterTimer gelöst. Allerdings benötige ich als Ziel für den Timer eine öffentliche Funktion, welche auch unter „Befehle Testen“ erscheint. Die aufgerufenen Funktionen sollen aber auf keinen Fall manuell von extern aufgerufen werden. Zumindest würde das keinen Sinn machen und meine Befehlsliste ist auch dadurch unübersichtlich.

Gibt es eine Möglichkeit in einem Modul einen Timer zu nutzen, ohne dabei die Funktion, welche aufgerufen wird, öffentlich machen zu müssen?? Oder alternativ: Kann man öffentliche Funktionen in der Liste „Befehle Testen“ ausblenden, wenn diese zum manuellen aufrufen keinen sinn machen?

Bisher ist dies leider noch nicht möglich. Du hast aber vollkommen Recht, dass dies nicht schön ist.

paresy

Zwischenzeitlich habe ich eine recht einfache Lösung für das Problem gefunden. Anstelle für jeden Timer eine eigene öffentliche Funktion zu generieren, verwende ich einfach eine öffentliche Funktion, welche schon im System vorhanden ist, nämlich „RequestAction“

Der Timer und alle dazugehörigen Skripts sind so komplett unsichtbar. Bleibt nur zu klären, ob dies zukünftig funktionsfähig bleibt, da RequestAction eigentlich zur Aktualisierung von Variablen gedacht ist. Solange aber niemand vor dem Aufruf von RequestAction prüft, ob es ein Ident mit dem Namen „TimerCallback“ gibt, ist alles gut.

Meinen Timer registriere ich wie folgt:


$this->RegisterTimer("MeinTimer1",0,'IPS_RequestAction($_IPS["TARGET"], "TimerCallback", "MeinTimer1");');		
$this->RegisterTimer("MeinTimer2",0,'IPS_RequestAction($_IPS["TARGET"], "TimerCallback", "MeinTimer2");');

und in RequestAction werte ich den Timer so aus:

public function RequestAction($Ident, $Value) {
   switch($Ident) {
      case "TimerCallback":
         $this->TimerCallback($Value);
	 break;

}
}

private function TimerCallback(string $TimerID){
// Erst mal den Timer stoppen, da ich diesen immer nur als einmaliges Ereignis benötige.
$this->SetTimerInterval($TimerID, 0);

// Prüfen, welcher Timer ausgelöst wurde.				
switch($TimerID){
 case "MeinTimer1":
  // was auch immer der Timer machen soll hier....
  break;
						
  case "MeinTimer2":
  // was auch immer der Timer machen soll hier....
  break;
 }				
}

Ja, das kannst du so machen - da die Idents und der Dispatcher von dir „verarbeitet“ werden, dürfte dies sogar ziemlich sicher für die Zukunft funktionieren. Netter Trick übrigens :wink:

paresy

Habe diesen „Missbrauch“ in meinen Modulen nun schon mehrfach erfolgreich angewendet (hoffentlich ist mir niemand böse :relieved:). Aber gäbe es nicht irgendwie eine andere Möglichkeit, public functions als „interne Modul-Funktionen“ zu verstecken.

z.B. in dem man die Function als public deklariert (muss ja sein) aber zu Beginn beim Namen „Hidden“ vorne anstellt:

public function HIDDEN_DynamicFormFieldUpdate (string $Field, string $Parameter, mixed $Value) {
       //Danach ganz einfach ;-)
       $this->UpdateFormField($Field, $Parameter, $Value);
}

So müsste man die Parameter nicht immer kompliziert als JSON-String verpacken und trotzdem würden die User sie in den Instanz-Funktionen nicht sehen.