Statusvariablen ausserhalb von "Create" anlegen?

Hi,

wenn ich in der CREATE Methode Statusvariablen anlege, so funktioniert das prima.
Mache ich es aber später (weil ich erst dann weiss, was benötigt wird), dann erscheinen die Variablen nach RegisterVariable aber nicht in IPS.

Im Create werden zum Schluss ja noch ein paar Funktionen aufgerufen. Was muss ich also aufrufen, damit die Variablen „persistiert“ werden?

Gruss
Coyote

ApplyChanges.

Und schau dir in der UIPSTypes.pas mal die MaintainVariable Funktion an. Die ist auch immer gut zu gebrauchen.

paresy

Hi,

ich nutze ApplyChanges, habe aber folgendes Phänomen:

Im Create lege ich 3 Statusvariablen, sagen wir mal A, B und C an. Sobald klar ist, das welche weiteren Variablen benötigt werden, lege ich diese, X,Y und Z an (inkl. ApplyChanges).

Das funktioniert problemlos, wenn ich das Modul anlege und nutze. Die Variablen werden intern über ihren Namen identifiziert.

Wenn ich den Server dann aber runterfahre und wieder starte, kann ich zwar auf die Variablen A, B und C zugreifen, die Variablen X, Y und Z werden allerdings nicht mehr gefunden! Sie sind im Configurator und im XML vorhanden, aber die Identifzierung via Name geht nicht!?

Was mache ich also falsch?

Gruss
Coyote

Achso. Ja. Du musst dir merken, dass du X,Y,Z auch hast, und diese direkt beim Start dann wieder laden. Ansonsten verwirft IP-Symcon X,Y,Z weil du sie ja nicht definiert hast.

paresy

PS: Warum machst du es eigentlich nicht als PHP Skript?.. ist schneller und universeller. Oder kommen so viele Daten, dass es ein Performance Problem geben würde? :slight_smile:

Ok. Das erklärt es dann. Mal ne blöde Frage: Wo mache ich das dann wieder? In welcher Methode? Und einfach wieder mit RegisterVariable ?

Hab ich doch schon… immer dasselbe wäre doch langweilig :smiley:

Ich interessiere mich halt dafür, wie man Module für IPS codiert. Und da ich finde, das das meine Anbindung der Viessmann Heinzung mit PHP nicht wirklich simple für jeden ist und diverse Schritte benötigt, lag ein Modul einfach nahe :wink:

Mit dem Modul ist die Anbindung einer Viessmann Heizung ein Com-Port anlegen, Modul-Instanz anlegen, fertig :wink:

Hat doch auch was (und Skripte fliegen bei mir schon mehr als genug rum) :wink:

Gruss
Coyote

Folgende Vorgehensweise:

In SaveSettings musst abspeichern, welche Variablen (X,Y,Z) du quasi dynamisch erstellt hast - mit den notwendigen Informationen, sodass du dann wiederrum in LoadSettings diese auslesen kannst, um dann immernoch in LoadSettings die RegisterVariable Funktionen aufrufen zu können. Im einfachsten Fall wäre das der Name des VariableIdent, wenn du daraus Typ und Profil ableiten kannst. Ansonsten müsstest du diese Information en auch noch speichern.

Der kritische Punkt ist das inherited im ApplyChanges, da dort das matching gemacht wird zwischen den Variablen die du per RegisterVariable/MaintainVariable definiert hast und den VariableID der StatusVariablen die in der settings.xml verzeichnet sind. Alle zu dem Zeitpunkt nicht definierten StatusVariablen werden aus dieser Verknüpfungsliste entfernt.

paresy

Hi,

erstmal: VIELEN DANK für deine Hilfe, Paresy! Das kann man eigentlich gar nicht oft genug sagen!

Das Speichern ist eigentlich kein Problem, da ich die Heizungskennung in einer Statusvariablen (die im Create erzeugt wird) abgelegt habe. Die steht somit zur Verfügung, und daraus kann ich ableiten, welche anderen Variablen ich noch brauche.

Ich meine, das ich ein LOG-Auswurf im LoadSettings gemacht habe, und kein Eintrag ins Log geschrieben wurde. LoadSettings wird aber sicher gerufen, oder?

Ich werde es mal testen.

Danke und Gruss
Coyote

Das Speichern ist eigentlich kein Problem, da ich die Heizungskennung in einer Statusvariablen (die im Create erzeugt wird) abgelegt habe. Die steht somit zur Verfügung, und daraus kann ich ableiten, welche anderen Variablen ich noch brauche.

Das ist ja dann etwas schwierig, da die StatusVariable zwar registriert wird, du aber erst nach dem ApplyChanges zugriff auf diese hast. Und dann ist es im Prinzip zu spät. Du müsstet diese ID also im SaveSettings nochmal abspeichern und dann im LoadSettings reinladen, auswerten und die entsprechenden RegisterVariable Befehle aufrufen.

erstmal: VIELEN DANK für deine Hilfe, Paresy! Das kann man eigentlich gar nicht oft genug sagen!

Mich erfreut es immer wieder, wenn jemand das SDK nutzt :slight_smile:

paresy