Virtuelle Variablen

Hallo Paresy,

waere es moeglich, Variablen mittels Script zu erstellen, die aber dann nicht in der Variablenuebersicht von IPS (und damit ja auch in der XML Konfig) erscheinen, sondern lediglich waehrend der IPS Laufzeit im Memory gehalten werden?

Hintergrund ist, die Latenzzeit der IPS Scripte zu erhoehen. Bspw. habe ich ein Script fuer die Heizungssteuerung, welches aller 3 Sekunden laeuft und ca. 12 Variablen staendig aktualisiert. Normalerweise braucht die kein Mensch im IPS (ausser eventuell mal zu Testzwecken). Wenn ich die auf Platte auslagere und jedesmal zusaetzlich ein include aller drei Sekunden lade, wird der Plattenzugriff durch Schreiboperationen definitiv sehr oft durchgefuehrt. Wenn man aber sogenannte Share Variablen haette, koennte man das ueber einen von IPS verwaltbaren Speicherbereich abwickeln. Das duerfte dann auch wesentlich schneller sein.

Hallo Torro,

die Idee finde ich genial! Da ich bei der V2 noch immer mit Performance-Problemen kämpfe, bin ich für jede Möglichkeit dankbar, welche das Baby schneller macht. Und ich habe auch jede Menge Variablen, welche nur zum Datenaustausch zwischen den Scripten da sind und nicht bei jedem Update mit rießigem Overhead zu allen Consolen und Dashboards übertragen werden müssen. Wäre eine super Sache.

Sie können ja ruhig in der Variablenübersicht erscheinen und auch dort erstellbar sein. Aber einfach kein Update vom IPS-Dienst zu den einzelnen Applikationen und auch kein Schreiben der Inhalte in die settings.xml

Oder einfach ein „Update Ja/Nein“ - Flag bei jeder Variable.

Gruß
Erich

Rubberducks Idee finde ich ganz gut. Werde diese versuchen so einzubinden.

paresy

Bin schon gespannt, wie sich das auf die Performance auswirken wird. Habe große Erwartungen :wink:

Hallo Rubberdruck,

fein, und paresy ist ja auch wohlgestimmt…

Und ich habe auch jede Menge Variablen, welche nur zum Datenaustausch zwischen den Scripten da sind und nicht bei jedem Update mit rießigem Overhead zu allen Consolen und Dashboards übertragen werden müssen.
Sie können ja ruhig in der Variablenübersicht erscheinen und auch dort erstellbar sein. Aber einfach kein Update vom IPS-Dienst zu den einzelnen Applikationen und auch kein Schreiben der Inhalte in die settings.xml

Das bedeutet aber auch, dass in jedem Script, welches ablaeuft, vorher geprueft wird, ob die benoetigten Variablen bereits vorhanden sind, anderenfalls muessten diese angelegt werden. Das finde ich aber nicht so schlimm, sollte im RAM ja wahnsinnig schnell gehen. Ich will nur vermeiden, dass diese dann staendig in der settings.xml geschrieben werden.

Oder einfach ein „Update Ja/Nein“ - Flag bei jeder Variable.

eigentlich nicht notwendig. Sobald IPS gestoppt / beendet wird, sind diese Variablen nicht mehr vorhanden.

Ich habe zum Beispiel ein Heizungsregelungssccript, welches alle 3 Sekunden laeuft und immer 15 Variablen aktualisiert. Ein zweites Script laeuft parallel mit einem 5 Sekunden Abstand und aktualisiert eine Teilmenge diese Variablen. Das klappt soweit auch alles, aber ich brauche diese Variablen ueberhaupt nicht in der settings.xml. Lieber lege ich die neu an, wenn sie nicht vorhanden sind.

Ausserdem koennte man so auch scriptuebergreifende temporaere Variablen nutzen, ist vielleicht auch manchmal ganz nuetzlich.

Ich glaube, ich habe mich jetzt wiederholt…

Gruss Torro

Hallo Torro,

ich dachte mir bei der Sache mit dem Updatze-Flag einfach: Da kann jeder seine Scripte so belassen wie sie sind, und man sagt einfach bei den Eigenschaften einer IPS-Variable, dass sie eben nur für die Scripte zur Verfügung steht und nicht auf der Platte oder Schnittstelle landet. Ist glaube ich für den User die übersichtlichste Variante und ich hoffe auch für paresy die mit dem geringsten Aufwand. Aber ich freue mich auch über jede andere Lösung - Hauptsache es wird alles schneller.

Viele Grüße
Erich

Hallo Erich,

naja, aber dann braucht man trotzdem noch einen zusaetzlichen Befehl, um dieses Flag per Script auch gleich richtig setzen zu koennen. Und beim anlgen von Variablen per Hand muss man auch immer daran denken…ist die nun zu beflaggen oder nicht…

Gruss Torro

Hallo Torro,

hast natürlich recht. Ich dachte eigentlich an eine einfache Lösung: Beim Anlegen einer Var einfach im Fenster mit der Auswahl der Var-Art ein kleines Flag für „Private“. Default ist natürlich „Public“. Aber was mache ich dann, wenn ich es nachträglich ändern will? Bei Vars gibts ja keinen Menüpunkt für „ändern“.

Ich denke, wir warten einfach was uns paresy zaubern wird. Das hat sicher Hand und Fuß.

Gruß
Erich

Jop. Eure Idee sind gut… und es wir etwas dazwischen sein. Dauert aber noch ein wenig… vorm Jahresende gibt es immer so viele andere Dinge…

paresy

Hallo Paresy,

ich finde diese Idee ebenfalls sehr gut. Hier sind meine Vorstellungen darüber, wie man solche Variablen handhaben könnte.

Ich nenne sie jetzt einfach mal „Statische Variablen“, auch wenn der Begriff vielleicht nicht ganz zutreffend ist.

Statische variablen sind:

  • global, genauso wie IPS-Variablen; kann also von allen Skripten verwendet werden
  • speicherresident, im Gegensatz zu Plattenresident
  • existieren nur solange IPS läuft

Sie werden so verwendet bzw. angelegt:
integer: IPS_UseStaticVariable(string: Name, integer: Typ)

Als Typ sollte auch Array (!) zulässig sein.

Die Funktion prüft, ob die Variable bereits existiert oder nicht. Ist sie schon vorhanden, wird diese verwendet, Gibt es sie noch nicht, wird sie angelegt. In jedem Fall liefert die Funktion die ID der Variablen.

Jedes Skript, was statische Variablen verwenden will, muss diese Funktion aufrufen.

Lesen und Schreiben erfolgt mit den üblichen Funktionen Set/GetValue(). IP-Symcon kann anhand der ID feststellen, ob es sich dabei um eine Statische Variable handelt.

Gruß
HJH

Die Idee von HJH finde ich gut. Aber es muss dann gewährleistet werden, dass das Autostart-Skript beendet wird, bevor ein anderes Skript gestartet wird. Weil, wo sollte ich sonst die ganzen Vars anlegen. Oder liege ich da falsch?

Gruß
Rubberduck

Hallo Rubberduck,

nein, bei der von mir beschriebenen Funktionsweise von IPS_UseStaticVariable() spielt es keine Rolle, wer die Funktion zuerst aufruft. Dasjenige Skript, das die Funktion zuerst aufruft, legt die Variable an. Alle anderen geben durch ihren Aufruf lediglich bekannt, dass sie die Variable verwenden wollen.

Es wird also ein und dieselbe Funktion verwendet, um die Variable anzulegen oder sie zu verwenden.

Die Funktion muss in jedem Skript vorkommen, das eine solche Variable verwenden will und für jede Variable ein eigener Aufruf. Der zeitliche Aufwand fällt praktisch nicht ins Gewicht, da einerseits der Verwaltungsaufwand geringer ist und andererseits sich alles im RAM abspielt.

Wenn man die ID kennt, könnte man den Aufruf natürlich weglassen. Aber dann läuft man Gefahr auf eine nicht existierende Variable zuzugreifen, nämlich dann, wenn IPS inzwischen neu gestartet wurde.

Im Normalfall, also wenn die Variable bereits existiert, wird nur noch die ID ermittelt, sonst gar nichts.

Ein Skript, das 5 Statische Variablen verwenden will, muss also 5-mal diese Funktion aufrufen. Jeder Aufruf spielt sich dabei im Bereich von Mikrosekunden ab.

Beispiel:

$Tuer_Riegel = IPS_UseStaticVariable("Tuer_Riegel", boolean);
SetValue($Tuer_Riegel, true);

Wenn man die Funktion nicht in jedem Skript aufrufen will, dann müssten zum Schreiben und Lesen andere Funktionen als Set/GetValue() zusätzlich implementiert werden. Ich glaube, dass dafür der Aufwand größer ist und der Nutzen auch nicht weiter steigt.

Aber das kann natürlich nur paresy abschätzen.

Gruß
HJH

Hi,

Wenn es Hier um reine „Skriptvariabelen“ geht, warum nutzt Ihr nicht einfach die SESSION von PHP?

Die muss man zwar ein bissel austricksen aber dann funktioniert es tadellos, und die kann sogar Associative Arrays speichern…

Das einzige was es braucht ist eine String-Variabele die die SID speichert.
Einfach ganz an den Anfang von jedem Skript das die SESSION nutzen will:

$SID=getValueString("SID");
if (!empty($SID)) session_id($SID);
session_start();
setValueString("SID",session_id());

dann könnt Ihr mittels $_SESSION[…] auf deren Werte zugreifen.

also

$_SESSION["Garten_RegenSensor1"]=12;
echo $_SESSION["Garten_RegenSensor1"];

// und natürlich geht auch sowas:

$_SESSION["SkriptXY"]["Berechnungen"]["Werte"][0]="test";

Gruß Huelke

Hallo Huelke,

Du hast mit Sicherheit nicht den ganzen Thread gelesen, oder? Es geht gerade darum, laufzeitoptimierend und Scriptuebergreifend variable Daten zur Verfuegung zu haben. Und der RAM ist dafuer die schnellste und effektivste Methode - aber zur Zeit eben nicht scriptuebergreifend moeglich. Deshalb also der Wunsch nach virtuellen Variablen.

Was man alles mit Sessions machen kann, ist schon klar, die benutzen Horst und ich sowohl im Webfront als auch um WIIPS.

Gruss Torro

Ich hatte das so verstanden das es um den ganzen „Update-Schwanz“ den eine Änderung der normalen IPS Variabelen nach sich zieht.

Der entfällt halt bei Nutzung der Session.

Klar hast Du dann auch Schreibbewegungen auf der Festplatte, da die PHP-Session ja auf Dateisystem-Ebene arbeitet.
Aber man kann ja seinen eigen Session Handler schreiben.
Dafür gibt es bereits fertige Lösungen
http://kevin.vanzonneveld.net/techblog/article/enhance_php_session_management/
MemCached heisst das Zauberwort, das ist ein kleines Server Programm welches dann von PHP kontaktiert wird und das die SESSION Daten im RAM ablegt. (das gibts auch für Win32: http://jehiah.cz/projects/memcached-win32/)

Gruß Huelke

Hallo Huelke,

eigentlich eine gute Idee, aber das SESSION-System von PHP ist für einen sehr viel umfangreicheren Context gedacht als es hier benötigt wird. Es beinhaltet ein Security- und Cookie-Handling und andere Funktionalitäten, die letztendlich nur überflüssigen Ballast darstellen.

Es ist stark anzunehmen, dass die Variablen dann doch auf die Festplatte geschrieben werden, genau das, was wir unbedingt vermeiden wollen. Das sind alles Kriterien, die dem erhofften Geschwindigkeitsgewinn entgegen stehen. (Zugegeben: bei Windows weiß man auch nicht, wann ein Speicherbereich auf die Platte ausgelagert wird)

Wenn ich bedenke, wie schwer es vielen Anwendern (besonders Neulingen) fällt, nur die einfachsten Grundlagen von PHP zu erfassen, halte ich es für keine gute Idee, sie auch noch mit Session-Handling zu belasten.

Bei meinem Vorschlag wird nur ein einziger zusätzlicher IPS-Befehl benötigt und alle anderen Funktionen können, so wie sie sind, beibehalten werden.

Natürlich ist mein Vorschlag kein fertiges Konzept. Er kann durchaus Stolpersteine enthalten, die mir bisher entgangen sind. Insofern will ich die Beurteilung Deines Vorschlags anderen, insbesondere paresy, überlassen.

Da die SESSION-Extension Bestandteil von PHP ist, steht es ja jedem frei diese bereits jetzt zu nutzen. Vielleicht kann dann jemand etwas zur Performance sagen.

Gruß
HJH

@HJH:
Ja Du hast recht, dadurch wird es natürlich komplizierter.
Wobei man theoretisch auch eine IPS_Start_Session() bräuchte und hätte es auch auf einen Befehl reduziert.
Ich werd’s weiterhin mit der Session & MemCached machen weil ich den Vorteil von Assoziativen Arrays einfach nicht missen will.
Die Track(auswahl)liste meines IPS_MediaPlayers wird z.B. komplett in einem Array gespeichert (samt FileIcon / ID3 Tags / FolderIcon) und beim „Scrollen“ wird nur der PositionsZeiger verschoben und die entsprechenden "ListEntry_1 -_x "-Variabelen für die List geupdatet, damit es auch das Formular anzeigt.
Sonst müsste ich ja für jede Info (Artist,Songname,…) ein eigenes Array bauen. Nein, da siegt Faulheit über Schnelligkeit :wink:
Wobei ich es rasendschnell finde ^^.
Ich mein PHP ist für Webserver gedacht mit 100erten von Zugriffen pro Sekunde…

Ansonsten ist jede Funktion die IPS mehr zu bieten hat ja ein Gewinn.

Also warum nicht beides :slight_smile:
Wer sich ein bisschen auskennt - und ich gehe mal davon aus das die Leute, die Skripte proggen, die so komplex sind, das sie Laufzeitkritisch sind, zu dieser Gruppe gehören - kann ja immernoch die Session verwenden, wenn er darin Vorteile sieht.

Gruß Huelke

Hallo Huelke,

die haetten wir dann bei den virtuellen Variablen ja auch, und mit dem Vorschlag von HJH kombiniert haben wir dann innerhalb von IPS einen riesen Vorteil - es ist einfach einfach zu handeln.

Ansonsten ist jede Funktion die IPS mehr zu bieten hat ja ein Gewinn.

logisch.

Also warum nicht beides :slight_smile:
Wer sich ein bisschen auskennt - und ich gehe mal davon aus das die Leute, die Skripte proggen, die so komplex sind, das sie Laufzeitkritisch sind, zu dieser Gruppe gehören - kann ja immernoch die Session verwenden, wenn er darin Vorteile sieht.

ja, aber wir denken bei unseren Vorschlaegen eben nicht nur an den eigenen Vorteil, sondern auch an die vielen Anwender von IPS, die nicht unsere tiefgreifenden PHP Kenntnisse haben. Auch fuer diese ist es ein riesiger Gewinn, wenn einfache Befehle mit tollem Funktionsumfang zur Verfuegung stehen.

Gruss Torro

Ja ich stimme Dir zu, ich denke zwar nicht das mein Vorschlag egoistisch war :stuck_out_tongue: da ich euch nur einen WorkAround aufzeigen wollte - um Paresy ein bissel Arbeit abzunehmen oder einfach für die die es ganz dringend brauchen und nicht warten können. :stuck_out_tongue:

Aber ich bin auch absolut dafür das IPS wächst und gedeiht und wenn Ihr Assoziative Arrays da rein bekommt bin ich rundum glücklich. :slight_smile:

Gruß Hülke