Vorhandene Liste um eine Spalte erweitern, Änderungen übernehmen

Ich nutze eine dynamische Liste, welche ich über

public function GetConfigurationForm()
{
        .... Inhalt
}

erstellt habe. Soweit so gut.

Jetzt kann es ja sein, dass ich diese Liste um eine oder mehrere Spalten erweitern will.

Wenn ich jetzt mit

MC_ReloadModule(12345, "Testmodule");

durchläuft er ja auch

ApplyChanges

Wenn ich mir jetzt aber mit

$id = 12345;
$config = json_decode(IPS_GetConfiguration($id), true);
print_r($config);
$list = json_decode($config['List'], true);
print_r($list);

die Konfiguration auslese, dann ist/sind die neuen Spalten nicht mir den vergebenen Standard-Werten (add) enthalten.

Gehe ich einmal in die Liste und erzwinge eine Änderung, übernehme diese, dann sind sie selbstverständlich da.

Was übersehe ich hier, bzw. wie kann ich forcieren, dass die neuen Spalten mit den vorgegebenen Werten übernommen werden?

Uli

Ja nix übersieht du.
Die Konsole ergänzt ja die Spalten erst beim laden und anzeigen der Liste.
Michael

Edit: Ab IPS 7.0 kannst du die Eigenschaft in der Migrate Methode migrieren.

Ja, wenn ich das Konfigurationsformular aufrufe, dann sehe ich die neue Spalte mit dem Standardwert.

Wenn ich nichts ändere und mit

$id = 12345;
$config = json_decode(IPS_GetConfiguration($id), true);
print_r($config);
$list = json_decode($config['List'], true);
print_r($list);

Die Konfiguration aus lese, dann ist die neue Spalte da nicht aufgeführt!

Beispiel vorher:

Array
(
    [List] => [{"Use":true,"Priority":3},{"Use":true,"Priority":2},{"Use":true,"Priority":1}]
)
Array
(
    [0] => Array
        (
            [Use] => 1
            [Priority] => 3
        )

    [1] => Array
        (
            [Use] => 1
            [Priority] => 2
        )

    [2] => Array
        (
            [Use] => 1
            [Priority] => 1
        )

)

Füge ich eine Spalte " ‚name‘ => ‚ForceSignaling‘ hinzu, mache ein MC_ReloadModule() dann ist die Ausgabe der Configuration immer noch:

Array
(
    [List] => [{"Use":true,"Priority":3},{"Use":true,"Priority":2},{"Use":true,"Priority":1}]
)
Array
(
    [0] => Array
        (
            [Use] => 1
            [Priority] => 3
        )

    [1] => Array
        (
            [Use] => 1
            [Priority] => 2
        )

    [2] => Array
        (
            [Use] => 1
            [Priority] => 1
        )

)

D.h. doch wenn ich in einer Methode versuche per $this->ReadPropertyBoolean zugreife, dann ist der Wert nicht da!

Gerade noch getestet:

Warning: Undefined array key "ForceSignaling" in /var/lib/symcon/modules/DummyModule/DummyModule/module.php on line 139
Test: null

Uli

Ja. Weil die Konsole die Spalten ergänzt und das natürlich nur wenn sie die Instanz Konfig anzeigt.

Den Fehler kann man ja mit einer einfachen isset oder array_key_exists Prüfung abfangen.
Michael

Hi Michael,

dies ist mir schon klar.

Ich möchte aber nicht, dass der Benutzer in die Konfiguration gehen muss und eine Änderung erzwingen muss, damit dann der Wert vorhanden ist.

Andersherum:
Wie kann ich es erzwingen, dass der Standardwert genutzt wird, bis der Benutzer etwas ändert?

Wie machst du das in deinen Modulen? Da sagst du auch nicht dem Benutzer, gehe in die Konfiguration und ändere irgendetwas, damit der Änderungen speichern Dialog auftritt, um dann die Änderungen zu übernehmen?

@Dr.Niels
Wie ist da euere Strategie?

Uli

Na so:

Wenn false, dann Default Wert nutzen.

Ich habe bisher nie Spalten ergänzt, aber dafür neue Zeilen :sweat_smile:
Dazu prüfe ich im Applychanges die Eigenschaft, ergänze sie mit den ‚verbotenen‘ IPS_SetPropery und IPS_Applychanges und verlasse das Applychanges damit es keine Endlosschleife gibt. (Bis IPS 7.0)
Edit: Und dazu ein Kommentar im Code warum das so ist, damit @Dr.Niels es beim Review einfacher hat.

Die Strategie, auch wenn von @paresy, ist, die Funktion Migrate (ab IPS 7) zu benutzen.

Diese Funktion wird nur beim Start von IP-Symcon oder nach eine Modul-Update aufgerufen. Sie wird nicht beim erstmaligem Erstellen einer Instanz aufgerufen. Die gelieferte Persistenz ist unabhängig von der bereits im Create registrierten Properties/Attributen. Dadurch kann diese beliebig angepasst/korrigiert werden, sodass diese für die neuen Properties/Attribute passt. Dadurch können z.B. alte Properties (z.B. wegen einem Tippfehler) im Namen oder Inhalt korrigiert werden.

Michael

Hi Michael,

danke für die Ausführungen.

Werde ich dann so anwenden.

Uli