Code nur bei Modul-Update ausführen

Hallo zusammen,

ich habe mein Modul unter „unter der Haube“ ziemlich stark überarbeitet und diverse Dinge optimiert.
Nun gibt es aber in der neuen Version auch eine neue Property, welche abgefüllt werden soll.
Dabei würde ich gerne beim Update aus dem Modul-Store eine bereits vorhandene Property auslesen und die neue Porperty basierend auf Werten aus der alten Registrieren.

Nun frag ich mich, was der beste Weg dazu ist. Einfach mit


public function create(){
    ....
    $alt = $this->ReadPropertyString("Alte Eigenschaft");
    $neu = $alt . " zusätzlicher Text oder was auch immer";
    $this->RegisterPropertyString("Neue Eigenschaft", $neu);
    ....
} 

Dann würde „die Ableitung“ aus der alten Eigenschaft beim ersten Aufruf umgesetzt und danach bei jedem Start von IPS gemacht, jedoch nicht mehr in die neue Eigenschaft gespeichert, da diese ja nach dem ersten Aufruf bereits vorhanden ist?

Gibt es eine bessere Alternative, wie z.B. eine Funktion oder eine Nachricht, welche nur beim Modul-Update und danach nicht mehr aufgerufen wird?

Gleichzeitig habe ich bestehenden Eigenschaften, welche teilweise „bereinigt“ werden müssen, da diese so nicht mehr benötigt werden. Ist es möglich, beim Update-Prozess „alte Propertys“ zu löschen?

Als letztes gibt es noch Eigenschaften, welche angepasst werden müssen. Dies sollte ebenfalls beim Update geschehen. Im Moment würde ich das so lösen


$pollIdents = $this->ReadPropertyString("PollIdents");
$knownIdents = "Angepasste Liste"; //Werte, welche nicht mehr möglich sind werden herausgefiltert
IPS_SetProperty($this->InstanceID, "PollIdents", $knownIdents);
IPS_ApplyChanges($this->InstanceID);

Dieses Vorgehen ist aber gemäss Best Practice für PHP-Modul Erstellung von paresy „nicht erwünscht“. Darf ich hier eine Ausnahme machen oder gibt es eine andere Lösung?

Danke für eure Tipps

Das ist konzeptionell so in Ordnung. Um uns den Review zu vereinfachen, schreibe da gerne erörternde Kommentare dran, damit wir wissen, warum du hier ausnahmsweise Eigenschaften setzt und warum das in diesem Falle in Ordnung ist. Bei mir zuckt sonst ziemlich schnell der „Ablehnen“-Finger, wenn ich IPS_SetProperty lese :wink:

Im Create kannst du den Inhalt der Eigenschaften nicht lesen. Du müsstest das also in ApplyChanges machen. Hier kannst du die Properties dann überführen. Stelle nur sicher, dass du das nicht mehrfach tust, beispielsweise indem du die alte Eigenschaft danach auf „leer“ setzt und nur überführst, wenn diese nicht leer ist. Wir haben in der Szenensteuerung beispielsweise eine Funktion um die alte Struktur mit Links in eine Liste zu überführen, vielleicht hilft dir das ja: SzenenSteuerung/module.php at 6862caf5a271f1cb71e2d80eecea4911b285ded6 · symcon/SzenenSteuerung · GitHub

Hallo Dr Niels,

danke für die Tipps. Das funktioniert so hervorragend. Ich habe da so viele Kommentare reingepackt, dass ihr das einfach durchgehen lassen müsst :wink:

Nun wollte ich noch die alte Property aus Create entfernen. Bei einer neuen Instanz wird sie ja nicht mehr benötigt und funktioniert auch. Bei einer vorhandenen Instanz führt das aber direkt zu einem Crash von IPS, wenn ich ein Modul-Reload durchführe :eek:

Aktuell lasse ich es halt einfach drin, wäre aber schön, wenn man das irgendwie „aufräumen“ könnte.

Wenn du die Eigenschaften nicht registrierst, dann sind sie nicht mehr da. Um also die Legacy-Daten zu transferieren musst du diese weiterhin registrieren, verwendest sie aber halt abgesehen von der Transformation nicht.