dynamische Parameter im Konfigurationsformular

Hallo,

vielleicht sehe ich ja den Lösung nicht vor lauter Ideen.
Ich habe folgendes Problem. Mein Modul enthält ein Konfigurationsformular in welchem der User wählen kann welche Parameter verarbeitet werde sollen. Das Weitere arbeiten mit den gewählten Parametern funktioniert auch zuverlässig.
Jedoch möchte ich z.b. mit einem Update des Modules weiter Zeilen und ggf auch Anpassungen von Labels dem User zur Verfügung stellen.
Die Liste der aktuelle Parameter hole ich mit

$this->RegisterPropertyString("Variables", "");

mir zum verarbeiten.
Die Parameter selbst sind im Formular als „Liste“ hinterlegt

  { "type": "CheckBox",           "name": "Debug",    "caption": "Debug" },
        { "type": "List",
          "name": "Variables",
          "caption": "",
          "add": false,
          "delete": false,
          "columns": [
			{"caption": "ID", "name": "ID", "width": "100px", "save": true},
						{"caption": "Description","name": "Description","width": "400px","save": true},
						{"caption": "Unit","name": "Unit","width": "400px","save": true},
						{"caption": "Format","name": "Format","visible": true,"width": "400px","save": true},
						{"caption": "Type","name": "Type","visible": true,"width": "100px","save": true},
						{"caption": "Intervall","name": "Intervall","width": "60px", "edit": {
                            "caption": "Intervall",
							"type": "ValidationTextBox",
							"validate": "5|60"}
						},
						{"caption": "VarName","name": "VarName","visible": false, "width": "60px","save": true},
						{"caption": "Active","name": "Active","width": "70px","edit": {
                            "caption": "Active",
							"type": "CheckBox" }
                        }],
                    "values": [
					{"ID":"11016",	"Description":"VT Operating mode", "Unit":"0:Night,1:StartUp","Format":"SHORT_ENUM","Type":"VT_Group","Intervall":"5", 	"VarName":"VT_OperatingMode"},	
                                        {"ID":"3000",	"Description":"Battery voltage","Unit":"V","Format":"FLOAT",	"Type":"VT_Group","Intervall":"5", "VarName":"Battery_voltage"},
					{"ID":"3020",	"Description":"State of transfer relay","Unit":"0:Opened,1:Closed",	"Format":"SHORT_ENUM","Type":"XT_Group","Intervall":"5","VarName":"XT_State_transfer_Relay"}
]

Ich möchte also mit einem „Update“ weitere Zeilen (Values der List) wie folgt hinzufügen


{"ID":"11099",	"Description":"VT Operating mode 2", "Unit":"0:Night,1:StartUp","Format":"SHORT_ENUM","Type":"VT_Group","Intervall":"5", 	"VarName":"VT_OperatingMode"},	

Evtl. ja wäre es auch ein Idee die Aktuelle Parameterliste als seperate Datei zu speichern und dann mit einem Button das neu zu laden?!
Gibt es da ein Beispiel?

Du kannst via UpdateFormField (UpdateFormField — IP-Symcon :: Automatisierungssoftware) die Werte der Liste neu setzen. Alternativ kannst du via ReloadForm (ReloadForm — IP-Symcon :: Automatisierungssoftware) die Form neu laden. UpdateFormField ist hier meiner Meinung nach die schönere und ReloadForm die einfachere Variante. In SymconTest kannst du dir anschauen, was man bei einer Liste alles dynamisch machen kann: SymconTest/DynamicTest at master · symcon/SymconTest · GitHub

Danke für Die Infos,

die genannten Möglichkeiten hatte ich mir schon angeschaut. Sobald ich aber die Liste als Variable speichere scheint das nicht mehr zu funktionieren und die Var wird nicht geupdatet


 public function Create() {
		// Diese Zeile nicht löschen.
		parent::Create();
		$this->RegisterPropertyString("Variables", "");
    }

Eine Aktualisierung der Form aktualisiert auch nicht direkt die Eigenschaft. Das soll sie auch garnicht. Du änderst dabei „lediglich“ die aktuell sichtbare Konfigurationsseite. Die Änderungen werden dann erst übernommen, wenn der Benutzer auf übernehmen klickt.

Entschuldigung aber irgendwie stehe ich auf dem Schlauch.
Sobald 1x der User etwas an der Liste im Conf-Formular geändert(Edit) hat greifen keinerlei Änderung an der form.json
Lediglich das hinzufügen von Zeilen in der List ist möglich. Aber z.b. einen Parameter (Tippfehler) zu ändern aus Zeilen die schon da waren geht nicht.

Ich verstehe gerade leider nicht, was du vorhast. Vielleicht habe ich dich auch falsch verstanden, da ich bei dem Trigger „Dynamik“ direkt an eine dynamische Anpassung des Konfigurationsformulares bei Laufzeit und durch das Modul dachte. Hast du so etwas vor? Denn darüber könntest du definitiv auch existierende Zeilen einer Liste anpassen oder auch ganz löschen.

Kannst du vielleicht noch einmal erörtern, wie du dir den ganzen Ablauf vorstellst?

Was möchte ich erreichen:
In meinem Modul für Studer-Innotec Solartechnik gibt es momentan im KonfigurationsFormular eine Liste in welcher der User auswählt (active:ja/nein) welche Settings er in IPS darstellen möchte.
Die Liste der Möglichkeiten (Property’s) welche der Hersteller da erlaubt ist sehr lang (einige 100). Da ich es aktuell aber nicht schaffe alle im Modul sofort darzustellen wollte ich in regelmäßigen Abständen die Liste erweitern. Manche Property’s erfordern dann später auch neue Funktionen im Modul selbst.

Frage:
Wie kann ich die Liste jederzeit ergänzen und ggf. auch wieder Zeilen in der Liste entfernen (wenn es diese bsp aufgrund von Firmwareänderungen so nicht mehr gibt)

Modul_URL: GitHub - eisenkoch/IPSKoch-Studer

Ich habe z.b gerade gemerkt das die Zeile

{"ID":"15013",	"Description":"PV operating mode", "Unit":"0:Night,1:Security,2:OFF,3:Charge,4:ChargeV,5:Charge_I,6:ChargeP,7:ChargeIpv,8:ChargeT,10:Charge_Ibsp",	"Format":"SHORT_ENUM", "Type":"VT_Group", "Intervall":"5", "VarName":"VS_Operating_mode"}

eigentlich so richtig heißen muss:

{"ID":"15013",	"Description":"PV operating mode", "Unit":"0:Night,1:Security,2:OFF,3:Charge,4:ChargeV,5:Charge_I,6:ChargeP,7:ChargeIpv,8:ChargeT,10:Charge_Ibsp",	"Format":"SHORT_ENUM", "Type":"VS_Group", "Intervall":"5", "VarName":"VS_Operating_mode"}

also anstelle von „Type“:„VT_Group“ muss es richtig lauten "„Type“:„VS_Group“

Ah, jetzt habe ich es verstanden. Da gingen meine bisherigen Anmerkungen in eine ganz andere Richtung und sind damit hinfällig.

Das kannst du aber problemlos erweitern. Wenn du in der Form den Parameter „values“ der Liste anpasst, dann werden für die Zeilen, welche neu hinzugefügt wurden, erst einmal mit den Standardparametern gefüllt, wenn in der Eigenschaft des Moduls noch nichts steht. Du müsstest nur darauf achten, dass die abgespeicherten Werte möglicherweise nicht die gesamte Liste abdecken. Wenn es den Index also nicht gibt, müsstest du selbstständig auf den Standardwert zurückgehen.

Beispiel: Du fängst mit drei Einträgen an und der Benutzer möchte den ersten und den dritten aktivieren. Wenn du dann zwei weitere hinzufügst, dann hast du innerhalb der Eigenschaft dennoch die Werte für die ersten drei und müsstest beim Check ob der vierte aktiviert ist auf den Standardwert, wahrscheinlich inaktiv, ausweichen.

Hallo Dr. Niels,
ja das war auch meine Erwartung das es so funktioniert… Aber folgendes passiert: In der Liste (initial) sieht es z.b. so aus


"values": [
{"ID":"11016", "Description":"VT Operating mode", "Type":"VT_Group"},
{"ID":"3000", "Description":"Battery voltage", "Type":"VT_Group"},
{"ID":"3020", "Description":"State of transfer relay", "Type":"XT_Group"}
]

ändere ich jetzt in der form.json für die ID:11016 den Wert „Type“ auf „VS_Group“ zeigt mir Symcon das nicht an. :banghead:

Wie sind die Spalten dazu definiert? Im elements-Bereich hat nämlich die abgespeicherte Eigenschaft Vorrang vor den definierten values. Sprich, wenn in den Eigenschaften VT_Group für den ersten Eintrag abgespeichert ist, dann bleibt das auch dort, egal was du in der form.json einträgst. Siehe auch hier: List — IP-Symcon :: Automatisierungssoftware

Hallo Dr. Niels,
ich muss das hier doch noch einmal aufgreifen denn so richtig will das noch nicht.
Meine Spalten sind wie folgt definiert:

„columns“: [
{„caption“: „ID“, „name“: „ID“, „visible“: true, „width“: „70px“, „save“: true},
{„caption“: „Description“, „name“: „Description“, „visible“: true, „width“: „400px“, „save“: false},
{„caption“: „Unit“, „name“: „Unit“, „visible“: true, „width“: „400px“, „save“: false},
{„caption“: „Format“, „name“: „Format“, „visible“: true, „width“: „150px“, „save“: false},
{„caption“: „Type“, „name“: „Type“, „visible“: true, „width“: „100px“, „save“: false},
{„caption“: „Intervall“, „name“: „Intervall“, „visible“: true, „width“: „70px“, „save“: true, „edit“: {
„caption“: „Intervall“,
„type“: „ValidationTextBox“,
„validate“: „1|2|5|60|360|720“}
},
{„caption“: „VarName“, „name“: „VarName“, „visible“: true, „width“: „250px“, „save“: false},
{„caption“: „summary“, „name“: „summary“, „visible“: false, „width“: „50px“, „save“: false},
{„caption“: „devInfo“, „name“: „devInfo“, „visible“: false, „width“: „50px“, „save“: false},
{„caption“: „mbP“, „name“: „mbP“, „visible“: false, „width“: „50px“, „save“: false},
{„caption“: „Archive“, „name“: „Archive“, „visible“: true, „width“: „70px“, „save“: true, „edit“: {
„caption“: „Archive“,
„type“: „CheckBox“,
„value“: false}
},
{„caption“: „Active“, „name“: „Active“, „visible“: true, „width“: „70px“, „save“: true, „edit“: {
„caption“: „Active“,
„type“: „CheckBox“ }
}],

Die Inhalte selbst lade ich über ein separates ParameterFile:

{„ID“:„3020“,
„Description“:„State of transfer relay“,
„Unit“:„0:Opened,1:Closed“,
„Format“:„SHORT_ENUM“,
„Type“:„XT_Group“,
„Intervall“:„5“,
„VarName“:„XT_State_transfer_Relay“,
„summary“:„0“,
„devInfo“:„info“,
„mbP“:„10:40“},
{„ID“:„3028“,
„Description“:„Operating state“,
„Unit“:„0:Invalid_value,1:Inverter,2:Charger,3:Boost,4:Injection“,
„Format“:„SHORT_ENUM“,
„Type“:„XT_Group“,
„Intervall“:„5“,
„VarName“:„XT_Operating_State“,
„summary“:„2“,
„devInfo“:„info“,
„mbP“:„10:56“}

Wenn ich jetzt im ParameterFile einen Eintrag vorn dranstelle mit derBsp. ID: 1100
kommt leider eine Kudelmuddel raus

Wie kann ich das lösen das sauber immer das paramFile in die Liste geladen wird?

Magst du mir verraten, wie du die Parameterdatei denn lädst? Das scheint ja ein eigenes Konzept von dir zu sein.

Hallo,

das ist eigentlich ein ganz simples verfahren.

public function GetConfigurationForm(){
$data = json_decode(file_get_contents(DIR . „/form.json“), true);
$var_element = json_decode(file_get_contents(DIR . „/…/libs/_param.json“),true);
$data[‚elements‘][2][‚values‘] = $var_element ;
return json_encode($data);
}

Mein Modul ist hier zu finden:

Alles klar, ich verstehe. Das „Problem“ ist hier, dass die Liste im Elements-Bereich steckt und somit auch eine Eigenschaft darstellt. Wird die Form geladen, haben die Werte in den Eigenschaften Vorrang vor den values. Daher kommen in deinem obigen Beispiel die IDs 3000 und 3020 aus der Eigenschaft. Die dritte Zeile mit der ID (nochmal) 3020 wird dann aus der dritten Zeile der paramsFile genommen. Das ganze ist sonst auch hier nochmal erklärt, falls du den Link oben übersehen hast: List — IP-Symcon :: Automatisierungssoftware

Das Matching der Zeilen geschieht halt auf Basis der Position in der Liste. Wenn du jetzt vorne eine Zeile in der paramsFile hinzufügst, dann funktioniert diese nicht mehr. Um das weiter funktional zu halten, könntest du einfach nur Zeilen hinten anfügen. Damit diese dennoch vernünftig dargestellt werden, könntest du eine Standardsortierung einbauen, beispielsweise auf Basis der ID-Spalte.