Instanz-"interne" Variablen?

Hi,

kann ich an einer Instanz Variablen erstellen, setzen und ändern, welche nicht als normale Variablen auftauchen?

Ich brauche z.B. für einen Retry-Mechanismus eine Variable wo der Durchlaufzähler (Anzahl Retrys) gespeichert wird. Der „Anwender“ des Moduls braucht und soll die eigentlich nicht sehen, das würde ihn ja nur verwirren.

Nicht machen.
Das hier gelesen ?
[Draft] Best Practice zur PHP-Modul Erstellung
Für so etwas kannst du den InstanceBuffer nutzen.
SetBuffer — IP-Symcon :: Automatisierungssoftware
Michael

Auch wenn ich die Werte „längere“ Zeit brauche? Ich ermittle mir z.B. aufgrund der Konfiguration bestimmte Daten, welche ich dauerhaft an der Instanz brauchen würde, aber nicht wirklich zur Instanz gehören (sagen wir mal z.b. ein bei der Anmeldung ausgehandeltes Token für eine Instanz oder so)

Was ist länger?
Der Buffer steht während der IPS Laufzeit zur Verfügung.
Sobald IPS neu startet, oder sich z.b. dein IO oder dessen Status ändert musst du Vermutlich eh ein neues Token aushandeln?!
Michael

Eigentlich hat es die selbe Haltbarkeit wie die Instanz… da hilft wohl nur eine Variable oder?

Dann ist es eine Property.
Theoretisch kannst du ja den Wert im Create vorgeben.
Michael

OK, hier ist die API etwas „unausgewogen“, denn es gibt ReadProperty aber kein SetProperty, da müsste man wieder
„IPS_SetProperty ( integer $InstanzID, string $Eigenschaft, variant $Wert )“ verwenden?

Was du nicht machen ‚sollst‘, du musst dann auch IPS_ApplyChanges aufrufen.
Damit landest du wieder in deinen ApplyChanges im Modul und hast mit Pech eine Endlosschleife.
Darum ja nicht machen. :wink:
Es bleibt halt nur die Chance den Token im Create bei RegisterProperty gleich vorzugehen.
Michael

Was ja nicht geht, weil das Token erst nach dem ausfüllen des Config-Formulars geladen werden kann, denn dazu brauche ich ja die Anmelde-Daten :banghead:

Es gibt eine Möglichkeit.
Du kannst auch ein Script im Action Bereich der Konfiguration über einen Button starten.
Und dieses Inline-Script setzt die Eigenschaften :wink:
Damit sollte sich auch nichts gegenseitig beeinflussen.
Michael

Für dein Problem gibt es in der Tat keinen „optimalen“ Weg, den wir laut den Best Practices erlauben. Wie Michael schon sagte, ist wohl am einfachsten per IPS_SetProperty + IPS_ApplyChanges den Wert in die Persistenz zu schieben. Du musst halt nur sicherstellen, dass du keine Endlosschleife baust.

paresy

Hier ein Beispiel:

Bau in deinem Modul eine public-Funktion um einen Token anzufordern (z.B. GetNewToken), Dieser muss mit return zurückgeliefert werden.

In der form.json dann einen Button im Actions-Bereich:

{
„type“: „Button“,
„label“: „Create“,
„onClick“: „IPS_SetProperty($id, ‚Token‘, MyPrefix_GetNewToken($id)); IPS_ApplyChanges($id);“
}

Vorteile:

  • garantiert keine Endlosschleife, da dies Script über die Console ausgeführt wird.
  • Konform laut dem BestPractice

Michael

OK, hab das jetzt so gemacht… eigentlich geht es gut, aber ich glaube ich hab einen Bug festgestellt.
Ich habe also einen Instanz-Wähler und einen Button der die Instanz-Daten dann liest. Wenn der Anwender jetzt aber „frisch“ die Instanz ausgewählt hat, kann ich in dem Script auf die Daten der Instanz nicht zugreifen. Ich dachte mir, OK, sind ja noch nicht übernommen und hab als erstes ein IPS_ApplyChanges eingebaut, das wird auch durchgeführt, aber anscheinend da es von der Console gerufen wird, werden die frisch gewählten Daten gar nicht persistiert… hab ich nen Denkfehler?

Zeigt Mal was du wie gemacht hast, wo ist die Instanz-Auswahl ?
Im Action-Bereich oder Elements?
Michael

Ich habe dafür mal ein Ticket erstellt, da ich diese Funktion definitiv für sinnvoll erachte für einige Spezialfälle. (z.B. unser Archiv Control speichert Statistiken und würde dies auch benötigen…)

paresy

@Hagbard
Du brauchst keine SelectInstance.
Die Variable $id im Action-Bereich zeigt auf deine eigene Instanz.
Michael

Hi,

das es eine Instanze-Auswahl ist, ist eigentlich egal, und ich will nicht die eigene Instanz sondern eine andere.
Was habe ich gemacht?
Ich habe in Elements im Form.json sowohl Werte die geändert werden können als auch einen Button der dann , wie von Michael beschrieben, über die Console Funktionen ausführt… diese greifen aber auch auf die in Elements ggf. gerade geänderten Daten zu. Da diese nicht aktuell waren habe einen applychanges eingebaut, brachte aber auch nichts.

hier der erste Codeteil in dem vom Button aufgerufenen Code:

IPS_ApplyChanges($this->InstanceID);

    $O_ID = $this->ReadPropertyInteger("PropertyInstanceID");

Die ReadPropertyInteger bekommt weder mit noch ohne ApplyChanges den aktuell im form gewählten Wert, erst NACH dem übernehmen drücken und dann nochmal den Button funktioniert es… das geht aber bei mir nicht, weil er auf jeden Fall den Button drücken muss…

Ich verstehe echt nicht was du da treibst.
Viel zu kompliziert.
Warum eine fremde Instanz?
Warum den Button nicht in die Instanz welche auch wirklich den Token anfordern muss.
Und selbst so wie du es jetzt hast, erst immer übernehmen in der !Console! wenn du dort etwas einstellst.
Ein ApplyChanges im Script kann nicht funktionieren, da die Console erst beim Klick auf übernehmen die Einstellungen überträgt und speichert.
Erst nach dem Übernehmen, wird auch das Testcenter mit dem Button aktiv.
Michael

Damit wir nicht länger wegen dem Anwendungsfall diskutieren, lies dir vielleicht mal die vorläufige Beschreibung in meinem git-Repository durch. GitHub - Hagbard235/VirtualDevice das Modul ist noch lange nicht fertig und auch nicht der aktuellste Stand drin, also nicht auf DEN Source achten.

Es ist ein Wrapper für Original-Instanzen, die soll der Anwender auswählen und in der Konfiguration lädt er dann „Eigenschaften“ des Original-Modul, dazu muss er die gerade vom Anwender gewählte Instanz auslesen. Wenn er dann erst übernehmen drücken muss, dann nochmal auf den Button, dann ist das alles andere als intuitiv.

Du kannst keine fremde Konfig in dein Modul laden und bearbeiten, da dir ja dessen Eigenschaften in deinem Modul fehlen.
Was du brauchst (und das fehlt imho noch in der Console) ist ein Link zum öffnen der Konfig der ausgewählten Instanz.
Alternative ist, du lädst die Konfig der Ziel-Instanz und stellst sie in einer Liste dar. Aber warum sollte man das machen?

Deine Idee gefällt mir; jedoch wirst du wohl mit der aktuellen Umsetzung nicht glücklich werden.
Außer du schaffst es, ohne Scripten unter den Ziel-Instanzen zu arbeiten. Sonst müssen die ja auch gepflegt werden vom User.

Dein ‚Problem‘ kann ich auf jeden Fall nicht nachvollziehen, also überhaupt erkennen wo es sein soll.
Wäre es nicht einfacher, es so wie bei KaiS Homekit umzusetzen ?
Also die Ziel-Variablen auszuwählen?
Wrapper auf andere Instanzen gibt es ja schon einige, von Alexa, Homekit bis hin zu Patami Framework.
Michael

Edit: Ach, du meinst nicht Eigenschaften, sondern wirklich die Statusvariablen des Ziels, dann vergiss den Anfang von diesem Post.