IPS_SetProperty in ApplyChanges()

Hallo,

ich habe da etwas, was ich einfach nicht hinbekomme:
Ich habe eine Proberty einer instanz, die ich eigentlich gerne automatisch auslesen und speichern würde. Die RINCON beim Sonos Modul.

Dazu muss ich aber zuerst die Richtige IP/Hostname haben, um dort die RINCON ermitteln zu können.
Ich sehe auch, dass ich sie im Coding zur Verfügung habe, wenn ich es aber mit

IPS_SetProperty($this->InstanceID,"RINCON",$rincon);

innerhalb des ApplyChanges() versuche zu schreiben, wird es nicht gespeichert.

Wenn ich ein „IPS_ApplyChanges($this->InstanceID);“ hinzufüge, bleibt die Console hängen, da ich wohl ein Endlos Loop erzeugt habe… :eek:

Ich habe es vor und nach dem parent::ApplyChanges(); versucht, ohne Erfolg.
Weiterhin fänd ich es gut, diesen Wert nur „read-only“ im Formular anzuzeigen. Das ist aber nicht vorgesehen, oder?

Kann mir jemand sagen wie ich es richtig machen sollte?

Danke,
Thorsten

Du willst die $rincon zurück ins Konfigformular schreiben, hab ich das richtig verstanden?

Das mache ich bei mir mit angelernten IR Codes, das Problem ist nur das diese im Konfigformular nicht übernommen werden so lange dies nicht einmal geschlossen und wieder geöffnet worden ist dann wird der Wert aber übernommen.

Genau :smiley:

Haber kannst du das nicht einfach durchbrechen ?
Ich prüfe hier auf PreSelectScript und nur wenn ein User etwas augewählt hat, wird es einmalig in die Konfig übertragen.


        switch ($this->ReadPropertyInteger('PreSelectScript'))
        {
            case 0:
                $ID = 0;
                break;
            case 1:
                $ID = $this->RegisterScript('WOLScript', 'Power ON', $this->CreateWOLScript(), -1);
                break;
            case 2:
                $ID = $this->RegisterScript('WOLScript', 'Power ON', $this->CreateFBPScript(), -1);
                break;
        }
        if ($ID > 0)
        {
            IPS_SetHidden($ID, true);
            IPS_SetProperty($this->InstanceID, 'PowerScript', $ID);
            IPS_SetProperty($this->InstanceID, 'PreSelectScript', 0);
            IPS_Applychanges($this->InstanceID);
            return true;
        }

Michael

Hi,

Du meinst ein Boolean Property „Update RINCON“?
Und nur wenn das angehakt ist oder die Property „RINCON“ leer ist und ich eine ermitteln konnte, würde ich ein Update machen?
Durch das „return true;“ wird dann beim ersten update das ApplyChanges() nach dem ApplyChanges() abgebrochen werden, richtig verstanden?

Danke,
Thorsten

Edit: Eigentlich würde es dann ja reichen auf initialität zu prüfen, und nur ein Update zu machen wenn es leer ist…

Wenn es leer ist, ja sollte so gehen.
Bei mir ist der Nutzen hat etwas anders, aber das Prinzip mit einmal Applychanges innerhalb sich selbst aufzurufen bleibt.
Musst dann den Haken natürlich mit entfernen, sonst läuft es wieder endlos in sich selbst.
Michael

Hallo,

ja, das funktioniert ganz wunderbar.

Ich habe eine public function angelegt, damit ich es auch aus dem Formular heraus über einen Knopf anbieten kann.:


    public function UpdateRINCON()
    {
        $ip      = $this->ReadPropertyString("IPAddress");
        $timeout = $this->ReadPropertyString("TimeOut");
        if ($timeout && Sys_Ping($ip, $timeout) != true)
           throw new Exception("Sonos Box ".$ip." is not available");

        $curl = curl_init();
        curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1,
                                        CURLOPT_URL => "http://".$ip.":1400/xml/device_description.xml" ));

        $result = curl_exec($curl);

        if(!$result)
           throw new Exception("Device description could not be read from ".$ip);

        $xmlr = new SimpleXMLElement($result);
        $rincon = str_replace ( "uuid:" , "" , $xmlr->device->UDN );
        if($rincon){
            IPS_SetProperty($this->InstanceID, "RINCON", $rincon );
            IPS_ApplyChanges($this->InstanceID);
        }else{
            throw new Exception("RINCON could not be read from ".$ip);
        }
    }

Und im ApplyChanges() habe ich dann recht weit am Anfang folgendes:


        if(!$this->ReadPropertyString("RINCON"))
        {
            $this->UpdateRINCON();
            return true;
        }

Somit wird zwar das ApplyChanges() zwei Mal durchlaufen, wenn die RINCON leer ist, dafür geht es aber :wink:

Danke,
Thorsten