Umgang mit Properties in Moduln

Hallo,

ich habe mal eine Frage zu Properties in Moduln…

Ich möchte gerne einige aus einem Gerät ausgelesene Informationen speichern. Da sie für den Anwender nicht interessant sind, dachte ich, sie in Properties - und nicht in Statusvariablen - abzulegen.

Leider will das nicht klappen. Da es keine Methode ‚$this->SetPropertyString‘ gibt, habe ich es versucht mit:

IPS_SetProperty($this->InstanceID, 'Information', 'bla bla');
$this->ApplyChanges();

Wenn ich die Information jedoch direkt danach wieder mit

 $myInformation = $this->ReadPropertyString('Information');

auslese, dann ist der Inhalt leer.

Geht das nicht so wie ich mir das denke? Kann mir da jemand auf die Sprünge helfen?

Gruß

Burkhard

Du musst schon IPS_Applychanges nutzen.
Aber, das Thema hatten wir schon mindestens 10 mal, das darfst du nicht machen! Oder genauer, mache es wirklich nur wenn du genau weißt was dann passiert und du weißt was du tust! Du kannst damit Endlosschleifen erzeugen.

Wenn die Daten für den User nicht interessant sind, verarbeite sie doch einfach gar nicht :wink:
Wenn du sie brauchst um irgendwas damit anzufangen, dann nimm einen InstanceBuffer.
Michael
PS: Falsche Rubrik…ich verschiebe es mal.
Und immer schön das Best Practice beachten :wink:

Hi!

Wenn die Daten nicht über einen IPS-Neustart hinweg vorhanden sein sollen >> Buffer

Wenn über einen IPS-Neustart hinweg >> unsichtbares Feld in Liste (wenn eh eine in der Form sein sollte), Datenbank, Datei, Variable, RegisterProperty und dann Set/Read

Das fällt mir so spontan ein :slight_smile:

Viele Grüße,
Chris

Besten Dank für Eure Hilfe.

Mit IPS_ApplyChanges statt $this->ApplyChanges funktioniert es nun.

Im konkreten Fall geht es um einen Sony TV, bei dem man sich einmalig anmelden muss und einen Cookie erhält. Zusätzlich lasse ich mir die FB-Codes geben.

Beide Informationen sind für den Benutzer uninteressant lassen sich meines Erachtens perfekt in Properties speichern. Angestoßen werden die Methoden über ‚actions‘ im Formular. Nach meinem Verständnis kann ich zu diesem Zeitpunkt die Properties setzen, oder? Zumindest widerspricht es nicht den Best Practices :slight_smile:

Gruß

Burkhard

Das kannst du machen. Da dies ja Aktionen sind, welche man manuell ausführen muss.
Böse ist es halt wenn du in ApplyChanges den Cookie in eine Eigenschaft speicherst und dann wieder ApplyChanges aufrufst.
Wobei du diese Daten doch auch im ApplyChanges abholen und in einen InstanceBuffer speichern kannst. Oder was spricht dagegen?
Michael

Um den Cookie zu bekommen muss der Benutzer einen Code eingeben, der am TV angezeigt wird. Diese Prozedur soll nur einmal gemacht werden und nicht bei jedem IPS-Neustart;)

Meine bisherige Lösung:

  • der Benutzer ruft die Aktion ‚Anmeldung starten‘ auf. Daraufhin wird der Code am Fernseher angezeigt.
  • diesen Code gibt er im Formular ein und übernimmt ihn.
  • dann ruft er die Aktion ‚Code senden‘ auf, in der der erhaltene Cookie gespeichert wird.

Etwas umständlich, aber mir ist nichts besseres eingefallen.

Der Cookie ist für 14 Tage gültig und kann auch wohl verlängert werden - aber soweit bin ich noch nicht…

Gruß

Burkhard

Den Code brauchst du nur zum Cookie holen?
Dann platziere das Textfeld mit einem Button Code übernehmen auch in Action Bereich.
Der Name des Textfeldes ist dann eine PHP-Variable mit $name im PHP-Code des Button.
Der ruft dann eine Funktion deines Moduls auf, welches den Cookie in der Settings speichert.
Hat den Charme, dass du im ApplyChanges gleich prüfen kannst ob Cookie gültig und die Instanz sonst in Fehlerzustand setzen kannst, ohne das der User übernehmen klicken muss.
Michael

Wie Nall-Chan schon sagte ist das, was du tust, nicht wirklich gut. Aber: Bisher gibt es keine bessere Lösung und in deinem Fall wahrscheinlich die einzige praktikable Lösung und somit vollkommen ok. Wir weisen nur immer extra und gerne drei mal darauf hin, dass man sich schnell Endlosschleifen bauen kann, welche du / der User kaum finden wird :wink:

paresy

Hallo,

könnte man doch mit dem Registrieren in meinem PS4 Modul vergleichen?
Dort habe ich im Action Bereich ein Textfeld, dort wird ein Pincode eingegeben und danach wird auf einen Button geklickt.

Grüße,
Kai

Ja, sowas ähnliches machen wir auch im dS Gateway und eher kompliziert im HomeKit Modul.

paresy

Cool, wieder was dazugelernt:) Diese Möglichkeit kannte ich noch nicht. Gesagt - getan:D