Wie übergebe ich eine Kategorie an das Configurator Element?

Hallo,

ich möchte in einem Konfigurator (konkret im AmazonEchoKonfigurator) dem Anwender die Möglichkeit geben, die Zielinstanz vorzugeben, unter der die Geräte angelegt werden sollen.
Dazu habe ich in der Form auch erfolgreich das SelectCategory eingebunden und registriert. Soweit so gut.

Aber wie übergebe ich nun die ausgewählte Id der Kategorie an das Configurator Element?
Muss ich dazu ‚location‘ verwenden, oder gibt es eine direktere Variante?

Gruß

Burkhard

Zum Beispiel so:


private function SetLocation($module_name, $room_name)
	{
		$category = $this->ReadPropertyInteger("ImportCategoryID");
		$tree_position[] = IPS_GetName($category);
		$parent = IPS_GetObject($category)['ParentID'];
		$tree_position[] = IPS_GetName($parent);
		do {
			$parent = IPS_GetObject($parent)['ParentID'];
			$tree_position[] = IPS_GetName($parent);
		} while ($parent > 0);
		// delete last key
		end($tree_position);
		$lastkey = key($tree_position);
		unset($tree_position[$lastkey]);
		// reverse array
		$tree_position = array_reverse($tree_position);
		array_push($tree_position, $module_name);
		array_push($tree_position, $room_name);
		return $tree_position;
	}


"location" => [
							$this->SetLocation($module_name, $room_name)
						],

Ok, momentan mache ich es mit


$targetCategoryID = $this->ReadPropertyInteger('targetCategoryID');
if ($targetCategoryID !== 0){
    $location = explode('\\', IPS_GetLocation($this->ReadPropertyInteger('targetCategoryID')));
} else {
    $location = [];
}
....
"location" => $location

Meine Frage war eher, ob es nur über ‚location‘ geht, oder auch irgendwie über eine direkte Angabe der id der ZielKategorie.
Vielleicht habe ich da ja etwas übersehen.

ID geht ja nicht, weil diese Kategorie sollen ja automatisch erzeugt werden wenn nicht vorhanden.
Michael

Ok. Wollte nur sichergehen, dass ich es nicht zu umständlich mache.
In meinem Fall wählt der Anwender ja eine bestehende Kategorie aus.

Eine ergänzende Frage: in der Doku ist ‚location‘ unter ‚create‘ und nicht unter ‚Variable‘ beschrieben. Ist das so richtig? Das hatte mich zusätzlich verunsichert.

Gruß

Burkhard

Das Element hat kein Feld variable, also was meinst du?
Unter create ist korrekt, weil es ja nur Anwendung findet wenn eine Instanz erzeugt wird.
Michael

Meine Form sieht zur Zeit so aus:

Array
(
    [elements] => Array
        (
            [0] => Array
                (
                    [type] => SelectCategory
                    [name] => targetCategoryID
                    [caption] => Target Category
                )

        )

    [actions] => Array
        (
            [0] => Array
                (
                    [type] => Configurator
                    [name] => AmazonEchoConfiguration
                    [rowCount] => 20
                    [add] => 
                    [delete] => 1
                    [sort] => Array
                        (
                            [column] => name
                            [direction] => ascending
                        )

                    [columns] => Array
                        (
                            [0] => Array
                                (
                                    [caption] => device name
                                    [name] => name
                                    [width] => auto
                                )

                            [1] => Array
                                (
                                    [caption] => device type
                                    [name] => devicetype
                                    [width] => 250px
                                )

                            [2] => Array
                                (
                                    [caption] => device family
                                    [name] => devicefamily
                                    [width] => 350px
                                )

                            [3] => Array
                                (
                                    [caption] => device number
                                    [name] => devicenumber
                                    [width] => 250px
                                )

                            [4] => Array
                                (
                                    [caption] => device account id
                                    [name] => deviceaccountid
                                    [width] => 250px
                                    [visible] => 
                                )

                        )

                    [values] => Array
                        (
                            [0] => Array
                                (
                                    [instanceID] => 29103
                                    [name] => Echo Dot Badezimmer
                                    [devicetype] => Echo Dot (2.Gen)
                                    [devicefamily] => ECHO
                                    [devicenumber] => G090LF1071751P3R
                                    [deviceaccountid] => A15QISGVC2OJHK
                                    [location] => Array
                                        (
                                            [0] => Hardware
                                            [1] => Amazon Echo
                                        )

                                    [create] => Array
                                        (
                                            [moduleID] => {496AB8B5-396A-40E4-AF41-32F4C48AC90D}
                                            [configuration] => Array
                                                (
                                                    [Devicetype] => A3S5BH2HU6VAYF
                                                    [Devicenumber] => G090LF1071751P3R
                                                )

                                        )

                                )

                            [1] => Array
                                (

und da ist ‚location‘ unterhalb von ‚values‘. Trotzdem funktioniert es :confused:

Sollte ich es unter ‚create‘ packen?

Ja bitte.
Du nutzt gerade eine Übergangslösung der WebConsole welche so nie dokumentiert war.
Hintergrund: Auch eigene IPS Konfiguratoren hatten location zeitweise nicht im create.
Michael

Ach so, jetzt wird es mir klar. Ich benutze aus Versehen eine veraltete undokumentierte Eigenschaft.

Das ändere ich schnell.

Vielen Dank.

Ein klitzekleines Problem habe ich dann doch noch. Meine Lösung mit

$location = explode('\\', IPS_GetLocation($this->ReadPropertyInteger('targetCategoryID')));

hat ein Problem wenn in einem Kategorienamen ein ‚‘ vorkommt. Muss ich mich tatsächlich den Baum hochhangeln? Oder gibt es da etwas ‚Fertiges‘?

Sonst greife ich auf Fonzos Vorschlag zurück.

Fertig wohl kaum.
Weil dafür ist das Feature ja eigentlich nicht gedacht (also das der User eine Kategorie auswählt).
Die Idee ist ja das durch den Konfigurator Kategorien vorgegeben werden, welche aus den abgefragten Daten kommen.
Also z.B. Räume oder Gewerke wie z.b. bei Homematic.
Michael

OK, nur in meinem Fall muss der Benutzer eine Kategorie auswählen, da Alexa keine Informationen zu Räumen und Gewerken liefert. Ist also nicht mit Homematic und Co zu vergleichen.

Ich dachte nur, andere müssten vielleicht auch das Problem haben. Aber vielleicht bin ich ja der erste :slight_smile:

Hier nun meine Lösung:


    private function getPathOfCategory(int $categoryId): array
    {
        if ($categoryId === 0) {
            return [];
        }

        $path[]   = IPS_GetName($categoryId);
        $parentId = IPS_GetObject($categoryId)['ParentID'];
    
        while ($parentId > 0) {
            $path[]   = IPS_GetName($parentId);
            $parentId = IPS_GetObject($parentId)['ParentID'];
        }
    
        return array_reverse($path);
    }