Gateway bei Instanz-Erstellung durch Konfigurator

Hallo Leute,

ich bin eben auf einen Fehler gestossen, bei dem ich nicht weiß wie ich das beheben kann…

Es gibt einen Konfigurator der Devices eines ganz bestimmten Splitters findet. Wenn ich die Device-Instanz dann erstellen lasse, wird aber das Gateway (weil es in meiner Test-Konfiguration mehrere Splitter des gleichen Moduls gibt) nicht richtig gesetzt, weiß in der Folge zu einem Fehler führt.
Wie kann ich also das richtige Gateway bei der Erstellung des Devices aus dem Konfigurator heraus setzen (also das Gateway, dass auch der Konfigurator nutzt)?

Joachim

Wenn du keine Kette angegeben hast, dann hängt die Konsole beim Erstellen über das Configurator Element, das Device automatisch an den gleichen Splitter an welchen auch der Konfigurator hängt.
Was aber passieren kann; beim erstellen/setzen der Einstellung/umhängen tritt ein Fehler auf.
Wenn es dein eigenes Modul ist, würde ich dort suchen wo es ( z.b. beim Datenaustausch) kaputt gehen kann.
Michael

Hallo Michael,

vielen Dank für Deine Antwort.

Ich weiß nicht genau was Du mit der „Kette“ meinst.

  • Wenn ich das Device „solo“ (also ohne irgendeinen passenden Splitter) erstelle, würden in der Folge eben auch ein Splitter sowie das I/O angelegt werden, die Zuordnung ist dann okay.
  • Wenn ich ein Device bei nur einem vorhandenen Splitter erstelle, wird dieser quasi „richtig“ zugeordnet (obwohl ja eigentlich unklar ist ob es der sein sollte)
  • Wenn ich ein Device bei mehreren Splittern erstelle, wird es „irgendeinem“ vorhandenen Splitter zugeordnet, ohne das ich da explizit irgendetwas auswählen kann

Wenn ich das aus dem Konfigurator mache sieht das hier ähnlich aus.

Joachim

Das beschrieben Verhalten bezieht sich jetzt darauf wenn du in der Konsole selber so eine Device Instanz anlegst, korrekt? Schaut auch erstmal soweit okay aus.
Wie gesagt, die Konsole löst, nach dem erstellen der Instanz, die Verbindung zum Splitter und hängt diese Instanz an den gleichen Splitter wie der Konfigurator. Wenn das nicht passiert, prüfe doch zu dem Zeitpunkt das Log/Meldungen Fenster.
Michael

Poste sonst auch gerne mal die Ausgabe von IPS_GetConfigurationForm auf deinen Konfigurator. Dann können wir da mal raufschauen und sehen vielleicht noch woran es liegt.

…hier der entsprechende Teil:

public function GetConfigurationForm()
{
$arrayStatus = array();
$arrayStatus = array(„code“ => 101, „icon“ => „inactive“, „caption“ => „Instanz wird erstellt“);
$arrayStatus = array(„code“ => 102, „icon“ => „active“, „caption“ => „Instanz ist aktiv“);
$arrayStatus = array(„code“ => 104, „icon“ => „inactive“, „caption“ => „Instanz ist inaktiv“);
$arrayStatus = array(„code“ => 202, „icon“ => „error“, „caption“ => „Kommunikationfehler!“);

	$arrayElements = array(); 
	$arrayElements[] = array("type" => "Label", "caption" => "UNVOLLSTÄNDIGE FUNKTION!");
	$arrayElements[] = array("type" => "SelectCategory", "name" => "Category", "caption" => "Zielkategorie");
	$arrayElements[] = array("type" => "Label", "label" => "_____________________________________________________________________________________________________");

	// Tabelle für die gefundenen I²C-Devices
	$arraySort = array();
	$arraySort = array("column" => "DeviceTyp", "direction" => "ascending");
	$arrayColumns = array();
	$arrayColumns[] = array("caption" => "Typ", "name" => "DeviceTyp", "width" => "200px", "add" => "");
	$arrayColumns[] = array("caption" => "Adresse", "name" => "DeviceAddress", "width" => "100px", "add" => "");
	$arrayColumns[] = array("caption" => "Bus", "name" => "DeviceBus", "width" => "auto", "add" => "");
	
	$Category = $this->ReadPropertyInteger("Category");
	$RootNames = [];
	$RootId = $Category;
	while ($RootId != 0) {
	    	if ($RootId != 0) {
			$RootNames[] = IPS_GetName($RootId);
	    	}
	    	$RootId = IPS_GetParent($RootId);
		}
	$RootNames = array_reverse($RootNames);

	$DeviceArray = array();
	If ($this->HasActiveParent() == true) {
		$DeviceArray = unserialize($this->GetData());
	}
	$TypeArray = array("AS3935" => "{BC292F9B-7CAB-4195-A85D-A6228B521E08}", "S.USV" => "{E6955943-F7F1-48CD-979D-45EEDCF91629}", "PCF8574" => "{E1E9F012-A15A-4C05-834E-7893DFE34526}",
			     "PCF8591" => "{A2E052CE-055C-4249-A536-7082B233B583}", "PCF8583" => "{95276FA0-4847-411E-B700-2E5F1866A7F6}", "GeCoS PWM16Out" => "{2ED6393D-E9A6-4C68-824C-90530EDDCE5C}",
			     "GeCoS RGBW" => "{3AB26B93-0DD1-4F5C-AFC8-1C3A855F7D14}", "iAQ" => "{1ABC9D19-31BF-4482-8FE0-6D3843D1D77A}", "BH1750" => "{C3884BB9-1D68-4AF7-B73E-357D810042A7}",
			     "EZO ORP" => "{51401510-EBA1-2C99-5B39-3C0C9C9758B6}", "EZO PH" => "{4D846905-0066-AB5D-F997-DC01CB1D975E}", "MCP3424" => "{0EBA825C-47AD-4BC6-AC0D-1ADF9CD55AB2}",
			     "BME280" => "{64E6464A-664C-46DE-B49F-8629497ED56F}", "BME680" => "{54EBA6FB-A557-4CB9-B384-933D6F5155B6}", "BMP180" => "{9D970308-36E7-428D-8AC0-D8C1496DDCCA}");
	$BusArray = array("I²C-Bus 0", "I²C-Bus 1", "MUX I²C-Bus 0", "MUX I²C-Bus 1", "MUX I²C-Bus 2", "MUX I²C-Bus 3", "MUX I²C-Bus 4", "MUX I²C-Bus 5", "MUX I²C-Bus 6", "MUX I²C-Bus 7",);

	$arrayValues = array();
	for ($i = 0; $i < Count($DeviceArray); $i++) {
		If (array_key_exists($DeviceArray[$i]["Typ"], $TypeArray)) {
			$arrayCreate = array();
			$GUID = $TypeArray[$DeviceArray[$i]["Typ"]];
			$Bus = array_search($DeviceArray[$i]["Bus"], $BusArray);
			$arrayCreate[] = array("moduleID" => $GUID, "location" => $RootNames, 
				       "configuration" => array("DeviceAddress" => $DeviceArray[$i]["Adresse"], "DeviceBus" => $Bus));
			$arrayValues[] = array("DeviceTyp" => $DeviceArray[$i]["Typ"], "DeviceAddress" => $DeviceArray[$i]["Adresse"], "DeviceBus" => $DeviceArray[$i]["Bus"],
				       "instanceID" => $DeviceArray[$i]["InstanceID"], "create" => $arrayCreate);
		}
		else {
			$arrayValues[] = array("DeviceTyp" => $DeviceArray[$i]["Typ"], "DeviceAddress" => $DeviceArray[$i]["Adresse"], "DeviceBus" => $DeviceArray[$i]["Bus"],
				       "instanceID" => $DeviceArray[$i]["InstanceID"]);
		}
	}
	
	$arrayElements[] = array("type" => "Configurator", "name" => "I2CDevices", "caption" => "I2C Devices", "rowCount" => 10, "delete" => false, "sort" => $arraySort, "columns" => $arrayColumns, "values" => $arrayValues);

		
	return JSON_encode(array("status" => $arrayStatus, "elements" => $arrayElements)); 		 
}

Das war nicht das was @Dr.Niels meinte.
Sondern die Ausgabe von echo IPS_GetConfigurationForm(ConfiguratorInstanceID);
Michael

Sorry…

Das hier?

{
	"status": [
		{
			"code": 101,
			"icon": "inactive",
			"caption": "Instanz wird erstellt"
		},
		{
			"code": 102,
			"icon": "active",
			"caption": "Instanz ist aktiv"
		},
		{
			"code": 104,
			"icon": "inactive",
			"caption": "Instanz ist inaktiv"
		},
		{
			"code": 202,
			"icon": "error",
			"caption": "Kommunikationfehler!"
		}
	],
	"elements": [
		{
			"type": "Label",
			"caption": "UNVOLLSTÄNDIGE FUNKTION!"
		},
		{
			"type": "SelectCategory",
			"name": "Category",
			"caption": "Zielkategorie"
		},
		{
			"type": "Label",
			"label": "_____________________________________________________________________________________________________"
		},
		{
			"type": "Configurator",
			"name": "I2CDevices",
			"caption": "I2C Devices",
			"rowCount": 10,
			"delete": false,
			"sort": {
				"column": "DeviceTyp",
				"direction": "ascending"
			},
			"columns": [
				{
					"caption": "Typ",
					"name": "DeviceTyp",
					"width": "200px",
					"add": ""
				},
				{
					"caption": "Adresse",
					"name": "DeviceAddress",
					"width": "100px",
					"add": ""
				},
				{
					"caption": "Bus",
					"name": "DeviceBus",
					"width": "auto",
					"add": ""
				}
			],
			"values": [
				{
					"DeviceTyp": "PCF8583",
					"DeviceAddress": 80,
					"DeviceBus": "MUX I²C-Bus 0",
					"instanceID": 0,
					"create": [
						{
							"moduleID": "{95276FA0-4847-411E-B700-2E5F1866A7F6}",
							"location": [
								"MCP3424"
							],
							"configuration": {
								"DeviceAddress": 80,
								"DeviceBus": 2
							}
						}
					]
				},
				{
					"DeviceTyp": "PCF8583",
					"DeviceAddress": 80,
					"DeviceBus": "MUX I²C-Bus 1",
					"instanceID": 0,
					"create": [
						{
							"moduleID": "{95276FA0-4847-411E-B700-2E5F1866A7F6}",
							"location": [
								"MCP3424"
							],
							"configuration": {
								"DeviceAddress": 80,
								"DeviceBus": 3
							}
						}
					]
				}
			]
		}
	]
}

Ich habe es mal leserlich formatiert :smiley:
Mit fallen zwei Sachen auf. Es steht zwar nicht in der Doku, und eventuell kann da @Dr.Niels mehr zu sagen, aber ein Configurator gehört in den Actions-Bereich und nicht in den Elements. Es ist ja keine Eigenschaft.

Und dein Create ist ein Array; also eine Kette. Somit wird die Konsole wohl nichts umhängen, da sie glaubt du hast den ganzen Datenfluss als Array angegeben.
Dein Create sollte nur aus einem Objekt bestehen:


	"create": {
		"moduleID": "{95276FA0-4847-411E-B700-2E5F1866A7F6}",
		"location": [
			"MCP3424"
		],
		"configuration": {
			"DeviceAddress": 80,
			"DeviceBus": 2
		}
	}

Michael

Hallo Michael,

alle meine Konfiguratoren sind so aufgebaut, bisher hat ich diesbezüglich keine Einschränkungen wahrgenommen, ist ja aber nur eine Fleißaufgabe das zu ändern bzw. anzupassen.

Das zweite verstehe ich nicht ganz…

Muss da noch ein Parameter für den Gateway hinzugefügt werden?

Joachim

Nein, du musst aus dem Array bei create ein Objekt machen.
Du hast ein Array angegeben, das ist Variante 2 in der Doku (Variante 2: Konfiguration einer Kette):
https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/konfigurationsformulare/configurator/#Parameter_für_create

Und wenn du das nicht willst, dann darf create kein Array sein.
Sobald das ein Objekt ist, hängt die Konsole es auch an den gleichen Splitter wo dieser Configurator hängt.
Michael

Mit der Kette hat @Nall-chan voll und ganz recht. Wenn du das create als Array darstellst, wird es nicht an den Splitter des Konfigurators umgehängt, bei einem Objekt sehr wohl.

Ein Konfigurator ist prinzipiell im action und im elements Bereich möglich. Klassischerweise landet er im action-Bereich, aber wenn es dir besser gefällt, finde ich den elements-Bereich auch unproblematisch.

Hallo Dr.Niels und Michael,

ich versuche Euch zu folgen - verstehe aber bisher nicht wie es denn zur „Variante 1“ wird…

Wie würde das Create bei mir denn korrekt aussehen?

Joachim

Habe ich dir doch in Beitrag #9 gezeigt.
Im Code ist hier der Fehler:

$arrayCreate[] = array("moduleID

Und so sollte es funktionieren (ungetestet).

$arrayCreate = array("moduleID

Michael

Sorry, das hatte ich übersehen.

Vielen Dank! Jetzt hat es geklappt!

Joachim