Migration von Instanzen nach Modulupdate

Ich habe noch einen Wunsch. Und zwar hätte ich gerne noch eine Update-Method die nach einem Modulupdate aufgerufen wird. Damit möchte ich Anpassungen die nach einem Modulupdate notwendig sind durchführen lassen ohne das der Benutzer hier aktiv werden muss und ggf. etwas bei ihm nicht mehr funktioniert.

@paresy

Das wäre inzwischen wirklich wichtig. Da viele alte Module des PHP-SDK schon ganz schön viel ‚Müll‘ mit sich rumtragen.
Michael

Wäre ich auch SEHR dafür - hab immer wieder Kram im Modul-Code der sowas macht - wäre dann viiiel schöner und einfacher! :slight_smile:

Danke und Grüße,
Chris

@paresy Was für IPSModuleStrict?

Tatsächliche wäre das für beides Möglich. Was hältst du von sowas?

paresy

1 „Gefällt mir“

Feature landet zum nächsten 7.0er Update. Für IPSModule und IPSModuleStrict.

paresy

Jetzt hätte ich einen Fall wo ich genau die Funktion zum Einsatz bringen möchte.

Ich habe eine List, welche ich in ein Tree konvertieren möchte! Wenn ich das richtig verstehe, wird die funktion immer beim Start und beim Update aufgerufen, d.h.

1.) die alte Liste darf ich nicht aus dem Create-Prozess (und form.json) löschen

2.) ich muss mir irgendwie merken ob ich die Konvertierung schon vorgenommen habe

Richtig?

Mein Vorgehen wäre jetzt …

1.) Ich lege ein Tree Property parallel zur List an

2.) setzt das List Property auf visible false (damit da niemand mehr ran kommt)

3.) in der Migrate Methode mache ich die Konvertierung, z.B. nur wenn der Tree keine Values hat

Korrekt?

Frage: sollte man den Test ob Tree keine Values haben über ReadPropertyString machen oder über die übergebenen JSON Data machen?

Danke & Ciao
Heiko

doch. einfach weglassen.
Migrate hat dann genau einmal die Chance das alte Property zu nutzen.

Nein, nur prüfen ob das alte Property noch existiert.

Nur das JSON nutzen (als Objekt, nicht als Array) und das einfach zurückgeben.

Beispiel von mir, ConditionBoolean ist alt und wird zu Value migriert.

public function Create(): void
{
    parent::Create();
    $this->RegisterPropertyInteger('Source', 1);
    $this->RegisterPropertyString('Value', '[]');
    // ConditionBoolean ist alt
    $this->SourceID = 1;
}

public function Migrate(string $JSONData): string
{
    $Data = json_decode($JSONData);
    if (property_exists($Data->configuration, 'ConditionBoolean')) { 
        $VarId = $Data->configuration->Source;
        if (IPS_VariableExists($VarId)) {
            $Source = IPS_GetVariable($VarId);
            switch ($Source['VariableType']) {
                case VARIABLETYPE_BOOLEAN:
                    $Value = (bool) $Data->configuration->ConditionBoolean;
                    break;
                case VARIABLETYPE_INTEGER:
                    $Value = (int) $Data->configuration->ConditionValue;
                    break;
                case VARIABLETYPE_FLOAT:
                    $Value = (float) $Data->configuration->ConditionValue;
                    break;
                case VARIABLETYPE_STRING:
                    $Value = $Data->configuration->ConditionValue;
                    break;
            }
            $Data->configuration->Value = json_encode($Value);
        }
        $this->SendDebug('Migrate', json_encode($Data), 0);
        $this->LogMessage('Migrated settings:' . json_encode($Data), KL_MESSAGE);
    }
    return json_encode($Data);
}

Michael

1 „Gefällt mir“

Hi,

ich habe gerade etwas, was mich in den wahnsinn treibt…

Ich muss ein Attribut (VIN) in eine property (VehicleID) wandeln. Dazu nutze ich diese funktion

public function Migrate($JSONData)
		{
			parent::Migrate($JSONData);
			$Data = json_decode($JSONData);
			if (property_exists($Data->attributes, 'VIN')) { 
				$Data->configuration->VehicleID = $Data->attributes->VIN;
				$this->LogMessage('MIGRATION: ' . json_encode($Data), KL_MESSAGE);
			}
			return json_encode($Data);
		}

Laut Log sieht es auch gut aus, die VehicleID wird gesetz. Nun habe ich in der Form ein entsprechendes Feld im elements bereich

           {
                "type": "ValidationTextBox",
                "caption": "Vehicle Identification number",
                "name": "VehicleID"
            }

Ich würde nun erwarten, dass, wen ich die Form öffne, auch den Wert sehe. Leider ist das Feld leer.

Ich habe mir mit

print_r(json_decode(IPS_GetConfiguration(INSTANZ),true));

die Konfig angesehen und dort steht korrekt der übernommene Wert.

    [VehicleID] => 121

Also, dachte ich mir, habe ich in der Form einen Schreibfehler, also mit

print_r(json_decode(IPS_GetConfigurationForm(INSTANZ),true));

die Form ausgegeben…

 [9] => Array
                (
                    [caption] => Vehicle Identification number
                    [name] => VehicleID
                    [type] => ValidationTextBox
                )

Muss ich noch irgendwas machen? Die Instanz-Fenster sind immer geschlossen, ich habe auch schon die Prokonsole geschlossen, nix…

Als gegenprobe habe ich in der Form im passendem Feld mal etwas eingetragen (zb „abc“) und gespeichert. Siehe da, dieser wert wird übernommen und auch immer wieder angezeigt.

Habe ich einen Bug gefunden oder übersehe ich da was? Kann das auch ein anderer Nachvollziehen? Es handelt sich um die letzte 8er Version von symcon

Viele Grüße

Hast du die Eigenschaft mir Registerpropery im create registriert?
Michael

ja, sonst würde die gegenprobe auch nicht funktionieren. Ich setze das jetzt mal anders um…