Fehler beim oeffnen des Moduls

Hallo
Heute mal ins Alexa Modul reingeschaut und da war ein Eintrag
„Missing“.
Den Link geaendert und dann kann das Modul nicht nicht mehr geaendert werden.
Fehlermeldung beim Oeffnen :

Konnte Konfigurationsform nicht laden
Warning: foreach() argument must be of type array|object, string given in C:\ProgramData\Symcon\modules.store\de.symcon.alexa\Alexa\capabilities\inputController.php on line 82

Warning: foreach() argument must be of type array|object, string given in

das geht noch viel weiter.
Irgendjemand eine Idee ?

Kannst du mir einfach mal deine settings.json schicken? Ich vermute, du hast dich da irgendwie in einen fehlerhaften Sonderfall manövriert

Ok, konnte ich nachstellen. Tatsächlich war da ein Fehler im aktuellen Listenumbau bei verschachtelten Listen… Fix ist unterwegs. Um deine Konfiguration zu fixen, habe ich dir ein kleines Skript geschrieben:

<?php

$televisionProperty = json_decode(IPS_GetProperty(10101, 'DeviceTelevision'), true);
for ($i = 0; $i < count($televisionProperty); $i++) {
    $televisionProperty[$i]['InputControllerSupported'] = json_decode($televisionProperty[$i]['InputControllerSupported'], true);
}
IPS_SetProperty(10101, 'DeviceTelevision', json_encode($televisionProperty));
IPS_ApplyChanges(10101);

Das Skript kannst du auch schon direkt ausführen. Danach sollte sich die Instanz wieder öffnen lassen. Aber wenn du wieder Einstellungen anpasst vor der nächsten Version könntest du wieder auf den gleichen Fehler zurückrutschen…

Hallo
Danke fuer das Script.
Hat funktioniert !

Ist dieser Fix in der aktuellen Version vom 11.08.23 drin? Ich habe gerade in einem eigenen Modul mit verschachtelten Listen festgestellt, das scheinbar ein ähnliches Problem (weiterhin) besteht.

Die verschachtelte Liste wird bei mir scheinbar mehrfach json_encoded. Das Problem tritt nur bei Listenelementen auf, die ich gerade nicht bearbeitet habe, aber danach (z.B. auf Grund anderer Änderungen) ApplyChanges ausgeführt habe.

Der Fix sollte eigentlich in der Version vom 15. dabei gewesen sein. In der vom 18. habe ich aber auch nochmal was an der Liste angepasst, schau also sonst gerne nochmal, ob es jetzt funktioniert.

Das Problem besteht auch mit der aktuellsten Version (in einem meiner in Enwicklung befindlichen Module). Die verschachtelten Listen scheinen bei jedem Speichern einmal mehr json_encodiert zu werden.

Es sind auch noch andere Module betroffen, wie dies hier:

Kannst du mir vielleicht eine aktuelle Version deines Moduls schicken, wo der Fehler noch auftaucht? Und am besten eine kurze Erklärung, wie ich es auch ohne dazugehöriges Gerät verursachen kann.

Ich habe mal ein TestModul gebaut. Es heißt NestedList und du findest es in folgender Bibliothek:

Zum Nachstellen des Fehlers:

  1. NestedList Instanz erstellen
  2. Eintrag zur Haupt-Liste hinzufügen und beliebige Werte eintragen (es ist nicht erforderlich, auch in der verschachtelten Liste Werte einzutragen)
  3. Änderungen übernehmen klicken
  4. Jetzt kann der Listen-Eintrag noch fehlerfrei geöffnet werden.
  5. Kill-Switch Button umlegen
  6. Änderungen übernehmen.
  7. Jetzt kann der Listeneintrag nicht mehr geöffnet werden.

Mit jedem weiteren Umlegen des Kill-Switches und anschließendem Speichern verdoppelt sich die angezeigte Anzahl der Einträge der nestedList. Mit ShowList kann man auch sehen, dass die Einträge der nestedList jedes mal zusätzlich json-codiert werden.

In der IPS-Version vom 25.8. ist der Fehler nun behoben.

Es ist aber noch erforderlich, die kaputte Konfiguration zu reparieren. Ich habe das mit folgender Funktion gemacht:

function fixConfiguration( $id, $listName,  $childListName)
{

    $datasets = json_decode(IPS_GetProperty($id, $listName), true);

    foreach($datasets as $index => $dataset) {
        while ( is_string($dataset[$childListName]) ){
            $dataset[$childListName] = json_decode($dataset[$childListName], true);
        }
        $datasets[$index][$childListName] = $dataset[$childListName];
    }

    print_r($datasets);

    IPS_SetProperty($id, $listName, json_encode($datasets));
    IPS_ApplyChanges($id);
}
2 „Gefällt mir“