$this->UnregisterVariable() funktioniert nicht wie erwartet

Es geht um diesen Teil einer Funktion.
Damit lösche ich bei Nichtgebrauch erst die Variablen und dann die Kategorie

// Wenn die Kategorie nicht in der Liste enthalten ist, löschen Sie sie und alle ihre Variablen
            if (!$foundInList) {
                $variables = IPS_GetChildrenIDs($categoryId);
                foreach ($variables as $variableID) 
                {
                    $variableIdent = IPS_GetObject($variableID)['ObjectIdent'];
                    $this->UnregisterVariable($variableIdent);
                    //IPS_DeleteVariable($variableID);
                    $this->SendDebug("Löschfunktion", "Die Variable: ".$variableID." mit Ident: ".$variableIdent." wurde gelöscht", 0);
                }
                IPS_DeleteCategory($categoryId);
                $this->SendDebug("Löschfunktion", "Die Kategorie: ".$categoryId." wurde gelöscht", 0);
            }

In diesem Teil möchte ich mit …

$this->UnregisterVariable($variableIdent);

… die Entsprechenden Variablen löschen.

Ich sehe am Debug dass das Script durchläuft, die Variablen werden aber nicht gelöscht.
Der Ident stimmt aber, ich vergleiche dazu Debug mit dem effektiven Ident der Variablen im Objektbaum.

IPS_DeleteVariable($variableID);

löscht die Variablen einwandfrei über die ID, ist aber offensichtlich in den Modulen nicht erwünscht.

Kategorien unterhalb deiner Instanz werden vom SDK nicht unterstützt.
Ebensowenig unterstützt Symcon selbst Kategorien unterhalb einer Instanz, diese können im Frontend ja nicht dargestellt werden.

Unregister sucht den Ident immer direkt unter deiner Instanz, somit wird das damit nie funktionieren.
Ebenso kann Registervariable keine Variable unterhalb einer Kategorie erzeugen.
Michael

Ich habe es fast vermutet dass dies nicht wirklich unterstützt ist, jedoch funktioniert das Erstellen von Variablen in eine Kategorie mit ‚RegisterVariable‘ und anschliessendem ‚IPS_SetParent‘ einwandfrei.

// Variablen erstellen
                $variableID = @IPS_GetObjectIDByIdent($variableIdentValue, $categoryID);
                if ($variableID === false) 
                {
                    if (in_array($searchKey, ['Min', 'Max', 'Value', 'id'])) 
                    {
                        $variableID = $this->RegisterVariableFloat($variableIdentValue, ucfirst($searchKey), "", $variablePosition);
            
                        // Ersetzungen für Float-Variablen anwenden
                        $gefundenerWert = (float)str_replace([',', '%', '°C'], ['.', '', ''], $gefundenerWert);
                    } 
                    elseif ($searchKey === 'Text' || $searchKey === 'Type') 
                    {
                        $variableID = $this->RegisterVariableString($variableIdentValue, ucfirst($searchKey), "", $variablePosition);
                    }
                        
                    // Setze die Kategorie als Elternobjekt
                    IPS_SetParent($variableID, $categoryID);
                } 
            
                $convertedValue = ($searchKey === 'Text' || $searchKey === 'Type') ? (string)$gefundenerWert : (float)$gefundenerWert;
                SetValue($variableID, $convertedValue);
                //Debug senden
                $this->SendDebug("Variable erstellt", "Die Variable mit dem Ident: ".$variableIdentValue.", Name: ".ucfirst($searchKey).", ID: ".$variableID.", Position: ".$variablePosition.",  Wert: ".$convertedValue." wurder erstellt oder aktualisiert", 0);
            
                $counter++;

Der Grund für die Kategorien ist, dass ich die Werte gerne Gruppieren möchte. Eine Übernahme der Kategorien in die Visualisierung ist nicht angedacht. Aber ja, ich sehe das Problem. Wird das Ganze Modul in der Visualisierung angezeigt kommt da rein gar nichts :wink:

Gibt es zur Gruppierung bessere Möglichkeiten?

Klar geht das, aber mit IPS_SetParent zerstörst Du die Beziehung Modul ↔ Variable. Michael hat ja geschrieben das RegisterVariablen nur unterhalb eines Moduls liegen können/dürfen. Wenn man sie dann händisch wegbewegt ist das halt unschön :frowning:

Leider nein bzw. mir nicht bekannt. Bei einem meiner letzten Module habe ich mich mit Prefix_ beholfen.

Heiko

Ja!
Splitter (oder IO) und Devices nutzen.
So das eine Device Instanz nur einen Teil abbildet.
Zum Beispiel nur RAM oder nur CPU.
Hat sogar dem Charme, das man nur einige Geräte anlegen kann, und somit nicht immer alles als Variable in Symcon haben muss.
Mit einem entsprechenden Konfigurator ist das Anlegen von Instanzen dann auch kein Mehraufwand für den User.
Das Modul SDK ist ja nicht dazu gedacht ein Script in ‚Form‘ einer Instanz zu gießen.
Michael

Danke für euere Unterstützung :+1:
Habe es jetzt mit einem Präfix gelöst wie @pitti .
Mit Splitter scheint mir doch zu mächtig für so ein einfaches Modul.
Und der Benutzer kann natürlich steuern, wie viele Variablen er anlegen will. Habe diese nochmals reduziert, so dass pro ID noch 4 Variablen angelegt oder allenfalls wieder gelöscht werden.

image