Buffer in Scripten

Gibt es eigentlich die Möglichkeit, die befehle GetBuffer und SetBuffer auch in normalen Scripten zu benutzen (also keine Module)?

Ich benötige ein Paar Werte, die ich in einem Script Zwischenspeichern muss, möchte aber keine Variablen in der Baum Struktur nutzen.

Ja klar. Das kannst du mit der RegisterVariable lösen.
Dazugehörige Befehle sind dann RegVar_SetBuffer und RegVar_GetBuffer.

Michael

Ja, aber welche InstanzID gibt man bei RegVar_SetBuffer() an?
Die ID vom Script?
Soweit ich das verstehe, ist das für RegisterVariablen Instanzen gedacht.
Ich habe aber nur ein loses Script, welches über ein Timer-Event regelmäßig gestartet wird.

Michael

Die ID der Instanz. Wie bei allen Instanz-Funktionen.

Die RegVar Instanz musst du schon anlegen, um den Buffer dieser Instanz zu verwenden.
Ein Script hat kein Buffer.
Die Module haben einen, weil sie eine Instanz sind :wink:
Michael

Dass man ein Buffer nur verwenden kann, wenn eine Instanz vorhanden ist, weis ich.
Das habe ich ja auch bei der Modulentwicklung immer wieder verwendet.
Aber genau das ist ja mein Problem, warum ich die Buffer so nicht verwenden kann:
Ich habe keine Instanz!

In meinem fall hab ich aber nur ein loses Script.
Was ich machen könnte wäre eine Dummyinstanz und darunter das Script.
Allerdings ist das auch nicht schön.

Aktuell habe ich unter dem Script einfach Variablen angelegt.
Find ich halt nicht schön, da dort nur Scriptinterne Daten abgelegt werden (zeitstempel, regelwerte etc).

Michael

Ich habe dafür immer mal den Infobereich eine Objektes benutzt. Z.b. des Scriptes
Schreiben mit: IPS_SetInfo
Lesen über: IPS_GetObject

Eine Dummy Instanz hat keinen Buffer.
Was hindert dich daran, einfach per Script eine RegisterVariable anzulegen, wenn sie nicht vorhanden ist, und einfach deren Buffer zu benutzen?
Sonst bleibt nur eine String Variable in Symcon.
Dort kann man z.b. mit serialize die Daten auch ablegen, ohne das es dem System schaden sollte.
Geht mit dem Info Feld auch, aber da kenne ich die max Größe nicht.
Michael

Da mit dem Speichern von Daten im Infofeld eines Objektes hab ich auch schon gemacht.
geht ganz gut. Nachteil auch hier

  1. Info-Feld zweck entfremdet
  2. Wird immer in der IPS-Config-Datei mitgespeichert.

Ich glaube ich werde da mal ein Featurewunsch erzeugen.
Coll wäre es, wenn es eine Möglichkeit gibt wie
IPS_SetBuffer($ObjectID, $Ident, $Value);
=> IPS_SetBuffer(67343, ‚MeineLetzenDaten‘, ‚7346736375438‘);
Also Buffern von beliebigen Daten zu einer ObjectID.
Und das von überall aus…

Wo ist jetzt dein Problem, unterhalb des Scripts eine Registervariable anzulegen? Kann man im Objektbaum schön einsortieren. Kostet dich keine Variablen (Lizenzzählung) und bleibt dem System treu, ohne für dich das Rad neuerfinden zu müssen.

Was auch noch gehen sollte: Mit GetChild die Registervariable finden und falls nicht vorhanden anlegen. So bleibt es sogar relativ generisch.

Ja, das ist ja auch alles richtig. Das kann man schon so machen und wird auch das Problem lösen,
aber ist nun mal nicht „schön“.

Ich bin nicht allwissend.
Daher die ursprüngliche Frage: Gibt es da eine bessere Lösung zum Speichern von Daten in Scripten.
Wenn die Antwort nein ist, dann ist die Frage auch schon beantwortet.

Michael

Ja, die deiner Meinung nach nicht schöne Lösung ist die bessere :wink:

Glaube auch kaum das @paresy den Scripten einen eigenen Buffer spendieren kann. Das sind ja Objekte ohne ‚Funktion‘, also nur Text (Script) welche durch PHP ausgeführt werden. Während eine Instanz ja ein ‚lebendes‘ Objekt mit eigenen Speicher und Code ist.
Michael