Dynamische Listen

Hallo zusammen,

ich weiß es wurde schon hundert mal behandelt, aber ich stehe hier leider total auf dem Schlauch, für etwas (aus meiner Sicht) eigentlich einfachem :frowning: .

Und zwar will ich mir ein Modul machen, welches einmal meine Baumstruktur durchläuft und alle Geräte IDs in eine Liste innerhalb des Moduls einträgt. Im Anschluss will ich die Geräte klassifizieren (z.B. Raum, Typ, Hersteller etc.).

Jetzt scheitere ich hier schon an einem ersten Versuch, mit dem ich einfach nur die Liste sichtbar befüllen will.

Und zwar habe ich die Liste mit der Form erstellt:
{
„elements“:
[

    {
        "type": "List",
        "name": "Devices",
        "caption": "Devices",
        "rowCount": 5,
        "add": true,
        "delete": true,
        "sort": {
            "column": "Room",
            "direction": "ascending"
        },
        "columns": [ {
            "caption": "Room",
            "name": "Room",
            "width": "75px",
            "add": "",
            "edit": { "type": "ValidationTextBox", "name": "Room", "caption": "Room" }
            }
    ]
    }
    
],
"actions":
[
   
],
"status":
[
    { "code": 102, "icon": "active", "caption": "information valid" },
    { "code": 201, "icon": "error", "caption": "information invalid" }
]

}

In der PHP habe ich für den Start erst einmal nur folgendes versucht:
class ClassificationModule extends IPSModule {

    public function Create()
	{
		//Never delete this line!
		parent::Create();
		
		$this->RegisterPropertyString("Devices","[]");

	}

    public function ApplyChanges() {
        
       parent::ApplyChanges();

    }

   public function AddList($listname, $listproperty, $value){
        $this->UpdateFormField($listname, $listproperty, json_encode($value));
        $this->ApplyChanges();
   }

Nun versuche ich von einem externen Skript aus, die Liste zu befüllen.
$arrString = json_decode(IPS_GetConfigurationForm(16966));

$arrString->elements[0]->values = Array(

          "Room" => "test"
	);

Classification_AddList(16966,„Devices“,„value“,$arrString);

Jedoch klappt dies nicht beziehungsweise wird es mir innerhalb der Modulinstanz nicht angezeigt. Ich denke ich habe hier einfach einen einfachen Denkfehler, dass ich irgendwie Properties, Configuration oder sonstiges in den Befehlen verwechsel.

Wo liegt denn mein Fehler, dass ich nicht einfach der Liste Werte per Skript zufügen kann und diese auch in der Modulinstanz direkt sichtbar sind?

Schöne Grüße

Stefan

Das grundsätzliche Vorgehen ist falsch.
Weil dein Modul kann/darf nicht selber seine eigene Eigenschaft ändern.
Dein externes Script kann aber die Eigenschaft direkt setzen mit IPS_SetProperty und dann mit IPS_Applychanges die Eigenschaft übernehmen.
Im Modul brauchst du dazu keinen Code, außer das registrieren der Eigenschaft.
Michael

okay danke schon einmal für deine Antwort.

Und wie wäre hier das beste Vorgehen, wenn ich mit Instanzieren des Modul will, dass das Modul einmal den Objektbaum durchläuft und alle IDs in die Liste einträgt? Dann wäre es doch sinnvoller es aus dem Modul heraus zu machen oder?

Das mit dem SetProperty klappt schon einmal ganz gut. Wenn ich jedoch die Modulinstanz öffne ist die Liste leer. Wie bekomme ich hin, dass die Eigenschaft, die ich über SetProperty übergebe auch dort in der Liste automatisch angezeigt wird?
IPS_SetProperty(16966,„Devices“, json_encode(Array( „Room“ => „testo“)));
IPS_ApplyChanges(16966);

Meine persönliche Meinung: Nein, ist es nicht. Ich würde aber auch niemals ein Modul schreiben was versucht Geräte zu klassifizieren. Aber das ist meine Meinung. Und deine kann natürlich eine andere sein.

Unter Beachtung meiner Meinung oben; gar nicht. Einfach schön den Add-Button in der Liste hinzufügen und alles per Hand eintragen. Wie bei den ganzen Sprachassistenz-Modulen auch.

Ansonsten kannst du doch einfach bei RegisterPropertyString die Liste vorgeben, welche beim erzeugen der Instanz als Startwert in die Eigenschaft geschrieben wird… musst wie nur füllen :slight_smile:

Jo, der Wert der Eigenschaft bei IPS_SetProperty ist auch falsch.
Das muss eine Liste(Array) von assoziierten Arrays sein… und du hast da nur direkt ein assoziiertes Array. Da Fehlt die ‚Liste‘ herum.

IPS_SetProperty(16966,"Devices", json_encode([["Room" => "testo"]]));
IPS_ApplyChanges(16966);

Und bitte den Code im Forum mit den Vorformatierter Text Icon versehen. Dann wird er auch ohne Veränderungen dargestellt.
Michael

Vielen Dank für deine Antworten!

Werde es so beherzigen, und mit IPS_SetProperty klappt es auch jetzt. Vielen Dank!

Hat es einen Grund, weshalb du nicht aus dem Modul heraus machen würdest? Ziel wäre ja wenigstens die IDs automatisiert auszulesen und einzutragen und dann kann ich als Nutzer selbst überall da editieren, wo noch Klassifizierungen fehlen. Also es soll keine automatisierte Klassifizierung entstehen. Will nur relativ einfach automatisiert aktualisieren, wenn neue IDs hinzukommen.

Weil genau das dann nicht funktioniert.
Zumindest nicht über das setzen der Eigenschaft.
Was aber geht, du kannst die Values der Liste deiner Konfig-Form mit Werten erweitern, also Zeilen mit neuen IDs hinzufügen.
Beschrieben ist das hier unter laden und Speichen von Listen: List — IP-Symcon :: Automatisierungssoftware

Damit das geht, musst du dir Konfig-Form mit den values über GetConfigurationForm an die Konsole ausliefern:
https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/module/getconfigurationform/
Michael