Instanz-"interne" Variablen?

Nein, das verstehst du falsch.

In der Konfig meiner „virtuellen“ Instanz wähle ich eine physikalische Instanz (also z.B. meinen Eltako-Dimmer) aus. Dann will ich nachsehen ob die physikalische Instanz „dimmen“ unterstützt, das tue ich dadurch das ich gucke ob es in der Instanz eine „Intensity“-Variable gibt. Dazu brauche ich die im Instanz-Wähler ausgewählte ID, die aber noch nicht „zur Verfügung“ steht…

Edit zu deinem Edit: Ja, ich will u.a. die Variablen der anderen Instanz lesen, oder die Scripte die es dort gibt es… insofern schon die „Eigenschaften“ oder „Fähigkeiten“ der Instanz ermitteln, aber nicht wortwörtlich die Instanz-Eigenschaften… wo ich mir nicht ganz sicher wäre was das genau meinen würde.

Meine virtuelle Instanz stellt im Programmier-technischem Sinne einen Wrapper dar mit eigenen Funktionen und auch einem Interface (also nicht vom Wrapper selber implementierten Funktionen)… ja, dazu muss ggf. in den physikalischen Instanzen ein Script hinterlegt werden… die sehen aber i.d.R. extrem simpel aus und sind immer identisch (je nach Instanz). Diese werden auch bei der Konfiguration überprüft und ggf. „angemeckert“ :wink:
Klar, man bekommt nichts umsonst, aber der Benefit ist für mich enorm. Ich arbeite seit 3 Jahren mit den virtuellen Instanzen, allerdings ausgelagert in einem Script und mit Dummy Modulen… der nutzen ist enorm… jetzt würde ich es gerne etwas „professionalisieren“ und damit auch anderen zur Verfügung stellen. Ich würde NIE wieder eine große IPS-Installation ohne das machen.

Wo (also in welchem Step des Moduls) steht diese nicht zur Verfügung?
Und wenn dem so ist, wozu brauchst du diese Information?

Ich habe eher das Gefühl, dass du aktuell gar nicht weiß, wie PHP-Instanzen so ‚ticken‘ vom ganzen Programmablauf in IPS.

Ich wähle eine Instanz, klicke auf Übernehmen.
Was muss deine Instanz dann wo machen ?
Eigentlich muss ich als User doch nichts weiter konfigurieren, dein Modul könnte alles andere jetzt allein ermitteln (siehe IPS_GetInstance) ?!
Zumindest für alle Instanzen die es in IPS ab Werk gibt, praktisch ist das aber nicht. Geht auch nicht mit ‚Dummy Instanzen‘ und PHP-Instanzen.

Also besser so umsetzen wie es auch andere ‚Sprach‘-Wrapper ja schon machen.
Auf Basis der Ziel-Variable.

Das geht sogar ganz ohne Instanz (und auch ohne Scripte unter den Ziel-Instanzen/Variablen), indem du den User einfach die ‚Status‘, ‚Dimlevel‘, Farb’ etc… Variablen auswählen lässt.
Steuern kannst du diese dann mit IPS_RequestAction.

Michael

Manchmal frag ich mich ob wir die selbe Sprache sprechen…

Folgenden Ablauf will ich umsetzen:

    • Neue Instanz anlegen vom Typ VirtualLicht (mein Modul)
    • Konfiguratonsformular geht auf, Anwender wählt Instanz die gewrappt werden soll mit Instanz-Wähler -> Eltako-Dimmer
    • Anwender drückt übernehmen im Konfigurationsformular
    • Modul guckt ob in gewählter Instanz (also im Eltako-Dimmer) eine Variable mit dem „Intensity“ vorhanden ist, wenn ja im VirtualLicht-Modul eine Property „Instanz ist dimmbar“ auf true setzen .

da aber 4. nicht geht, weil ich in ApplyChanges keine Property setzen kann habe ich nach dem Vorschlag hier den Ablauf folgendermaßen umgebaut:

    • Neue Instanz anlegen vom Typ VirtualLicht (mein Modul)
    • Konfiguratonsformular geht auf, Anwender wählt Instanz die gewrappt werden soll mit Instanz-Wähler -> Eltako-Dimmer
    • Anwender drückt lese Instanz-Button in Konfigurationsformular -> hier wird die Eltako-Instanz gelesen und per SetProperty die "Dimmbar"Variable auf true gesetzt,applychanges, idealerweise werden hier auch die anderne Werte mit gespeichert, Anwender spart sich „Übernehmen“.

das wäre noch OK, aber geht nicht, also muss es aktuell so aussehen:

    • Neue Instanz anlegen vom Typ VirtualLicht (mein Modul)
    • Konfiguratonsformular geht auf, Anwender wählt Instanz die gewrappt werden soll mit Instanz-Wähler -> Eltako-Dimmer
    • Anwender drückt übernehmen im Konfigurationsformular (und bekommt Meldung das er jetzt noch "Lese Instanz " drücken muss, solange ist die Instanz ungültig
    • Anwender drückt „Lese Instanz“
    • Modul guckt ob in gewählter Instanz (also im Eltako-Dimmer) eine Variable mit dem „Intensity“ vorhanden ist, wenn ja im VirtualLicht-Modul eine Property „Instanz ist dimmbar“ auf true setzen .

letzteres ist durch das doppelte hin und her gedrücke einfach unverständlich…

’ Property „Instanz ist dimmbar“’ -> Wozu muss dies persistent sein ? Grund ?
Du kannst doch jederzeit wieder den Typ ermitteln zur Laufzeit.
Oder das auch in einem Buffer schreiben, beim IPS-Start im Create ebenso wie im Applychanges. Falls du den Typ nicht jedes mal wieder ermitteln willst.

Was sind andere Werte ?
Jetzt habe ich ein ‚MI Xiaomi Smart Home Switch‘ als PHP-Instanz, was machst du dann ?

Das hört sich an, als wenn du etwas falsch machst.
Entweder:

    • Neue Instanz anlegen vom Typ VirtualLicht (mein Modul)
    • Konfiguratonsformular geht auf, Anwender wählt Instanz die gewrappt werden soll mit Instanz-Wähler -> Eltako-Dimmer
    • Anwender drückt übernehmen im Konfigurationsformular
    • Modul guckt (im Applychanges) ob in gewählter Instanz (also im Eltako-Dimmer) eine Variable mit dem „Intensity“ vorhanden ist merke ich mir die Funktion „Instanz ist dimmbar“ in einem Buffer.

Oder

    • Neue Instanz anlegen vom Typ VirtualLicht (mein Modul)
    • Konfiguratonsformular geht auf, Anwender wählt Instanz die gewrappt werden soll mit Instanz-Wähler -> Eltako-Dimmer
    • Anwender drückt übernehmen im Konfigurationsformular
    • Modul guckt (im Applychanges) ob die neu gewählte InstanzID von der alten ID abweicht.
    • Wenn ja, da prüfen ob in der neu gewählten Instanz (also im Eltako-Dimmer) eine Variable mit dem „Intensity“ vorhanden ist.
    • Setze den Property ‚dimmbar‘ und mache ein Applychanges.

Fertig.
Verstehe dein Problem noch immer nicht.
Zeig doch mal den Code, wenn nicht öffentlich, dann gerne auch per PN. Ich vermute eher das du etwas falsch machst.

Wie gesagt; ist es einfacher wenn du als Basis Ziel-Variablen statt Ziel-Instanzen nutzt.
Zumal deine Erkennung mit Instanzen bei Homematic schon nicht funktioniert. Es gibt bei ‚STATE‘ sowohl bei Sensoren, als auch Aktoren. Ebenso kann LEVEL dein Stellantrieb der Heizung als auch ein Dimmer sein.

Das was du eigentlich erreichen willst, gibt es in vielen Teilen schon.
Die Unterteilung in generische Typen (Licht, Heizung etc) hat KaiS schon mal aufgezeigt beim Homekit-Modul.
Das überwachen ob eine (Status)-Variable nach Zeit x nicht verändert, kann aus mein NoTrigger Modul entnommen werden.
Das Rad neu erfinden mußt du also nicht; nur Teile entnehmen und zusammen in ein neues Modul überführen.

Michael

mmmh, du versuchst mir immer andere Wege oder Usecases aufzuzeigen statt das rein technische Problem zu lösen…
einen Buffer möchte ich nicht nutzen, da ich den Wert persistent haben möchte (gibt es einige Gründe für, die will ich aber jetzt gar nicht diskutieren), genauso möchte ich den Wert nicht jedesmal neu ermitteln (aus ähnlichen Gründen wie eben, vorallem auch um Abweichungen erkennen zu können)

dein 2. Weg geht im übrigen nicht, da kam ich ja her, aber in ApplyChanges einen eigenen Wert setzen funktioniert nicht… das war mein erster Gedanke, aber

  // Überschreibt die intere IPS_ApplyChanges($id) Funktion
    public function ApplyChanges()
    {
        // Diese Zeile nicht löschen
        POS1
        parent::ApplyChanges();
        //Instanz ist aktiv
        /// POS2

an POS1 nimmt er meine Änderung der Property nicht an und an POS2 müsste ich erneute ApplyChanges auslösen, wäre eine Endlosschleife

Ja, weil das was du vorhast technisch wenig sinnvoll ist.

Super, etwas fordern aber nicht darüber reden zu wollen :rolleyes:

Weil du es falsch machst :wink:

IPS_Applychanges musst du benutzen.

Schau mal hier.
Beispiel für das ‚endlos‘-Applychanges
ist für deinen letzten Fall.

Beispiel von meiner Liste
Ist das Thema, ich wähle etwas aus, klicke auf übernehmen und dann ändert sich die Drop-Down Box für Aktion auf die Statusvariablen der Instanz. Natürlich kann man dann im Applychanges noch mal das gleiche machen mit dem unsichtbaren Propertys wie im ersten Fall.

<?
class WrapperTest extends IPSModule
{

    public function Create()
    {
        parent::Create();
        // Beispiel von meiner Liste
        $this->RegisterPropertyInteger("TargetID", 0);
        $DefaultData = array();
        $this->RegisterPropertyString('WrapperData', json_encode($DefaultData));

        // Beispiel für das 'endlos'-Applychanges
        $this->RegisterPropertyBoolean("isDimmer", false);
        $this->SetBuffer('Old', '0');
    }

    public function ApplyChanges()
    {
        parent::ApplyChanges();
        // Beispiel für das 'endlos'-Applychanges
        $Old = (int) $this->GetBuffer('Old');
        if ($this->ReadPropertyInteger('TargetID') != $Old)
        {
            $this->SetBuffer('Old', (string) $this->ReadPropertyInteger('TargetID'));
            if ($this->ReadPropertyInteger('TargetID') > 0)
            {
                echo "Eine neue Instanz ausgewählt !
 Ich setze isDimmer auf true!";
                IPS_SetProperty($this->InstanceID, 'isDimmer', true);
                IPS_ApplyChanges($this->InstanceID);
            }
            else
            {
                echo "Keine Instanz ausgewählt !
 Ich setze isDimmer auf false!";
                IPS_SetProperty($this->InstanceID, 'isDimmer', true);
                IPS_ApplyChanges($this->InstanceID);
            }
        }
    }

    // Beispiel von meiner Liste
    public function GetConfigurationForm()
    {
        $data = json_decode(file_get_contents(__DIR__ . "/form.json"), true);

        $VarListName = $data['elements'][4]['columns'][1]['edit']['options']; // Array 0 keins
        if ($this->ReadPropertyInteger('TargetID') > 0)
        {

            $VarIDs = IPS_GetChildrenIDs($this->ReadPropertyInteger('TargetID'));
            foreach ($VarIDs as $VarID)
            {
                if (IPS_GetObject($VarID)['ObjectType'] == 2)
                    $VarListName[] = array('label' => IPS_GetName($VarID), 'value' => $VarID);
            }
        }
        $data['elements'][4]['columns'][1]['edit']['options'] = $VarListName;
        return json_encode($data);
    }

}

und die form:

{
    "elements":
            [
                {
                    "type": "Label",
                    "label": "1.) Instanz wählen."
                },
                {
                    "name": "TargetID",
                    "type": "SelectInstance",
                    "caption": "Instanz:"
                }, {
                    "type": "Label",
                    "label": "2.) Übernehmen wählen."
                }, {
                    "type": "Label",
                    "label": "3.) Ziel Variablen auswählen und Typ zuordnen."
                }, {
                    "type": "List",
                    "name": "WrapperData",
                    "caption": "Virtual Light",
                    "rowCount": 3,
                    "add": true,
                    "delete": true,
                    "sort": {
                        "column": "Action",
                        "direction": "ascending"
                    },
                    "columns": [{
                            "label": "Aktion",
                            "name": "Action", 
                            "width": "80px",
                            "add": "State",
                            "edit": {
                                "type": "Select",
                                "caption": "Typ",
                                "options": [
                                    {
                                        "label": "Level",
                                        "value": "Level"
                                    },
                                    {
                                        "label": "Color",
                                        "value": "Color"
                                    },
                                    {
                                        "label": "Status",
                                        "value": "State"
                                    }
                                ]
                            }
                        },
                        {
                            "label": "VariableID",
                            "name": "VarId", 
                            "width": "100px",
                            "add": 0,
                            "edit": {
                                "type": "Select",
                                "caption": "Text alignment",
                                "options": [
                                    {
                                        "label": "Keine",
                                        "value": 0
                                    }
                                ]
                            }
                        }
                    ]
                }      
            ]
}

Michael

Das hast du gesagt, deswegen habe ich genau das was du in deinem Code hast nicht gemacht. Wenn das so geht hätte ich mir 3 Seiten Thead sparen können…

EDIT: Hab jetzt erst deinen „Workaround“ mit dem Buffer gesehen… und du sagst mir was von „technisch nicht sinnvoll“?? So ein Workaround ist alles andere als Sinnvoll sondern eine Krücke um ein bestehendes Problem zu umgehen…

Ohje… ja darum ja meine Frage WARUM willst du es in der Persistenz haben. Das wolltest du nicht diskutieren.
Tja, und dann gibt man Hilfestellung für den Workaround, welchen paresy auch so vorgeschlagen hat.
Weil es unter ganz bestimmten Umständen (deiner zählt meiner Meinung nach nicht dazu) nicht anders geht.
Und bekommt so eine Antwort, da sage ich nur: Gern geschehen

Technisch nicht sinnvoll, weil es nicht funktionieren wird, und ich dir es ersparen wollte damit auf die Nase zu fallen.
Mein ‚Workaround‘ funktioniert. Deine Logik mit Instanzen wird es nie.

Danke und Tschö

Michael

An meinen Instanzen ändert es doch gar nichts und funktioniert jetzt trotzdem… ich glaube wir sprechen immer noch aneinander vorbei. Ich mache das Modul gleich mal fertig (vorläufig) und checke es ein, dann kannst du ja nochmal gucken ob es für dich so „falsch“ ist. Zum Aufräumen des Code komme ich jetzt aber nicht mehr :wink: