Problem: Aufruf einer public function aus ApplyChanges() Funktion (Modulerstellung)

Hallo,

bevor ich meinen kompletten Code veröffentlich habe ich folgendes Szenario bei einer Modulerstellung.

Ich habe eine public function GetConfigurationData(), diese liest per curl von einem Server Konfigurationsdaten per json aus. Bestimmte Werte sollen dann in das Konfigurationsformular von dem Modul gespeichert werden.

Generell klappt das auch, ausserhalb der ApplyChanges(), z.B. wenn ich die Funktion manuell aufrufe…
Beispiel (Auszug): innerhalb der GetConfigurationData()


$locationID = $jsonObject->user->roles[0]->location_id;
IPS_SetProperty($this->InstanceID, "LocationID", $locationID); 
if(IPS_HasChanges($this->InstanceID)) {
    IPS_ApplyChanges($this->InstanceID);
}

In dem Konfigurationsformular gibt es zwei Textfelder, Username und Passwort.
Wenn diese Werte eingetragen sind und die Änderungen mit „übernehmen“ bestätigt werden, sollen die weiteren Konfigurationsdaten vom Server eingelesen werden.

Wenn ich aber nun innerhalb der Funktion ApplyChanges() eintrage:


$this->GetConfigurationData();

kommt es zum Absturz, vermutlich weil er sich in einer Dauerschleife befindet.

Im Moment komme ich da nicht weiter… jemand eine Idee?

Das auslesen der Daten am besten in eine eigene Methode packen und dann per Button im Elements Bereich der Form unterbringen.

Sprich, der Nutzer gibt erst die Zugangsdaten ein und klickt übernehmen.
Dadurch wird der Button aktiv und kann vom User betätigt werden.
Dann hast du auch keine Endlosschleife.
Gibt natürlich auch andere Wege…
Ein Konfigurator wäre auch eine Möglichkeit.
Hier musst du dir die Frage stellen, wann dein Modul diese Daten die es lädt wann braucht.
Edit:
Sehe gerade dass du im ApplyChanges GetConfigurationForm aufrufst, das hat dort nix zu suchen, diese Methode nutzt nur die Console.
Es sollte also auch so funktionieren wie du es beschreibst.

Michael

Ist GetConfigurationData hat nix mit IPS zu tun, war nur als Beispiel kann auch EigeneFunktionName heissen [emoji3]
Ich brauche vom Server den Cookie zur Authentifizierung, der ist nur 24 Stunden gültig, daher muss ich zusätzlich ein Ereignis anlegen, welches erneut ein Login durchführt, um den neuen Cookie im Konfigurationsformular ablegt, für die weitere Kommunikation.

Erstmal Danke, ich probiere weiter!

Gesendet von iPhone mit Tapatalk

Du legst kein Ereignis an :wink:
Du willst einen Timer erstellen:
$this->RegisterTimer()
RegisterTimer — IP-Symcon :: Automatisierungssoftware

Wenn du den Cookie abfragen kannst, und ihn der User nicht selbst einzutragen braucht…

Warum nicht beim IPS_KERNELSTARTED den Cookie holen und in einen InstanzBuffer schreiben.
Diesen über den Timer alle 24h aktualisieren.

Dann braucht der Cookie gar nicht in der Settings gespeichert werden und dein aktuelles Problem stellt sich gar nicht erst.

Michael

An den Buffer habe ich auch schon gedacht, überlege ich mir nochmal…

Wie funktioniert das mit dem IPS_KERNALSTARTED bringe ich das auch im Modul unter? Und wenn ja wo?

Nochmals vielen Dank für deine Hilfe!

Gesendet von iPhone mit Tapatalk

Du musst diese Funktion einbauen:

MessageSink — IP-Symcon :: Automatisierungssoftware

z.B. so:


    public function MessageSink($TimeStamp, $SenderID, $Message, $Data)
    {
       if ($Message == 10001) // KERNELSTARTED
        {
           // Hier ist IPS gestartet und meldet sich als Betriebsbereit.
           // $this->GetMyToken();

        }
    }

Damit IPS auch weiß, dass dein Modul diese Nachricht erhalten möchte, musst du in Applychanges noch das hier einbauen:

RegisterMessage — IP-Symcon :: Automatisierungssoftware

        $this->RegisterMessage(0, 10001);

Die Nummern der Nachrichten sind hier:
Nachrichten — IP-Symcon :: Automatisierungssoftware

Michael

Perfekt, schaue ich mir morgen mal an [emoji1303][emoji3]

Gesendet von iPhone mit Tapatalk

Hi Michael,

nochmals Danke, funktioniert [emoji3]

Gesendet von iPhone mit Tapatalk