Basics: Globale Variablen

Weiter geht es mit den Grundlagen des Fibaro Home Center. In diesem Artikel geht es um globale Variablen. Welche Arten gibt es, wofür und wie können sie verwendet werden?
Globale Variablen
Möchte man Informationen oder definierte Zustände szenenübergreifend oder als Trigger verwenden, so greift man auf globale Variablen zurück. Weiterhin lassen sich Zustände des Smart Home mit globalen Variablen definieren. In diesem Artikel habe ich bereits ein paar der gängigsten globalen Variablen erwähnt. Die dort vorgestellte globale Variable TimeOfDay beispielsweise steht repräsentativ für die aktuelle Tageszeit. Ist es also Morgen, Tag, Abend oder Nacht. Da sich die Inhalte von globalen Variablen mit Lua abfragen lassen, kann der Inhalt dieser für die Steuerungen innerhalb von Szene herangezogen werden. So ist die Beleuchtung in meinem Badezimmer abhängig von eben dieser Variablen. Morgens und abends lasse ich bei Betreten das Licht vollständig einschalten wo hingegen tagsüber und nachts eine weniger helle Lichtsituation geschaffen wird. Also immer in Abhängigkeit von der jeweils aktuellen Tageszeit. Im Artikel Tageszeitsteuerung ist diese noch etwas ausführlicher erklärt.
Zwei unterschiedliche Arten
Das Home Center verfügt über zwei unterschiedliche Arten von globalen Variablen. Die bereits beschriebene Tageszeitvariable TimeOfDay hat exakt 4 Ausprägungen Morning, Day, Evening und Night. Die Werte sind also vorgegeben. Passend dazu hat Fibaro diese Art von Variablen daher als Vordefinierte Variablen bezeichnet. Immer wenn die Ausprägungen der Variable klar und eindeutig sind, wird eine solche verwendet.
Die zweite Art von globalen Variablen können beliebige Inhalte aufnehmen und heißen dementsprechend einfach Variablen. Der ursprüngliche Gedanke von Fibaro war dahingehend, dass in diesen Variablen nur Ziffern bzw. Zahlen gespeichert werden. So ist es im Webinterface nicht möglich dort andere Werte als Ziffern und Zahlen einzutragen. Füllt man diese aus Szenen heraus, lassen sich beliebige Inhalte ablegen und wiederverwendent.
Starten von Szenen
Wie bereits im Artikel zu Triggern erwähnt, kann die Änderung einer globalen Variable als Trigger verwendet werden. Um beim Beispiel TimeOfDay zu bleiben, ist es beispielsweise möglich beim Wechsel von Tag zu Abend Rolläden automatisch herunterfahren zu lassen oder beim Wechsel von Abend zu Nacht die Außenbeleuchtung auszuschalten. Hier ist jedoch zu beachten, dass die bloße Änderung der globalen Variable im Webinterface (in der Variablen Steuerung) nicht zum Triggern von Szenen führt. Lediglich Änderungen durch virtuelle Devices oder andere Szenen führen dazu, dass diese gestartet werden. Im Einsteiger-Artikel zu Triggern erfährst Du, wie diese zu verwenden sind.
Erstellung von globalen Variablen
Es gibt zwei unterschiedliche Möglichkeiten zur Erstellung von globalen Variablen. Die Point&Click Variante über das Webinterface und die automatische Erstellung über eine Lua Szene.
Manuelle Erstellung
Im Webinterface des Home Center unter Steuerung -> Variablen Steuerung werden die bereits vorhandenen globalen Variaben getrennt nach Variablen und Vordefinierten Variablen angezeigt. Unter der jeweiligen Art von Variablen befindet sich eine Schalzfläche zum hinzufügen neuer Variablen.
Variable
Das hinzufügen einer Variable ist denkbar einfach. Beim Klick auf hinzufügen öffnet sich ein kleiner Dialog mit den zwei Eingabefeldern Variablen Name und Wert. Der gewählte Name darf im Home Center natürlich nur einmal vorkommen, aber ansonsten ist dieser frei wählbar. In das Feld Wert lassen sich nur Ziffern eintragen. Aber keine Sorge, wie bereits erwähnt, aus Szenen heraus lassen sich hier auch Texte und sogar ganze Arrays speichern.
Vordefinierte Variable
Das Formular bei der Erstellung einer Vordefinierten Variable sieht etwas anders aus. Neben dem zu definierenden Namen lassen sich hier beleibig viele vordefinierte Ausprägungen der Variable angeben. Und hier nicht nur Ziffern, sondern auch Text.
Automatische Erstellung
Vielleicht nicht ganz passend in den Basics, aber wissenswert und der Vollständigkeit halber hier erwähnt, lassen sich Globale Variablen auch aus Szenen heraus automatisch erstellen. Dabei wird die API des Home Centers genutzt und erspart bei der Einbindung neuer Variablen das Klicken im Webinterface. Diese Funktion habe ich in einigen meiner Szenen bereits verwendet.
--------------------------------------------------- ------------- Handle gVar ---------------------------- -- globale Variable handeln --------------------------------------------------- function createGlobalVar(var,value) local http = net.HTTPClient() http:request("http://127.0.0.1:11111/api/globalVariables", { options = { method = 'POST', headers = {}, data = '{"name":"'..var..'","value":"'..value..'"}', timeout = 10000 }, success = function(response) local result = response.data; if response.status == 200 or response.status == 201 then debug('green','Status: ' ..response.status.. ' - Variable wurde angelegt') else debug('red','Error: ' ..response.status.. ' - Zugriff verweigert') end end, error = function(err) debug('red','[ERROR] ' .. err) end }) end createGlobalVar('BeispielVar','Beispielinhalt')
Das Auführen dieser Szene erstellt eine globale Variable namens BeispielVar mit dem Inhalt Beispielinhalt.
Verwendung von globalen Variablen
Neben der Verwendung als Trigger lassen sich die Inhalte von globalen Variablen auch innerhalb von Szenen verwenden. Fibaro stellt hierfür die folgenden Funktionen zur Verfügung:
fibaro:getGlobal("TimeOfDay") fibaro:getGlobalValue("TimeOfDay") fibaro:getGlobalModificationTime("TimeOfDay") fibaro:setGlobal("TimeOfDay", "")
fibaro:getGlobal()
Zum Auslesen von Wert und letzter Änderung einer globalen Variable. Die Rückgabe beinhaltet den aktuell gespeicherten Wert der Variable, sowie den Timestamp der letzten Änderung des Wertes. Beispiel:
--[[ %% properties %% events %% globals --]] local value, timestamp = fibaro:getGlobal("TimeOfDay") fibaro:debug(value) fibaro:debug(timestamp) Ausgabe: [DEBUG] 10:15:51: Morning [DEBUG] 10:15:51: 1485709322
fibaro:getGlobalValue() und fibaro:getGlobalModificationTime()
Mit diesen beiden Funktionen lassen sich Wert und Timestamp der letzten Änderung einzeln abfragen. Beispiel:
--[[ %% properties %% events %% globals --]] local value = fibaro:getGlobalValue("TimeOfDay") local timestamp = fibaro:getGlobalModificationTime("TimeOfDay") fibaro:debug(value) fibaro:debug(timestamp) AUSGABE: [DEBUG] 10:15:55: Morning [DEBUG] 10:15:55: 1485709322
fibaro:setGlobal()
Will man den Wert der Variable ändern, so wird diese Funktion genutzt. Der Timestamp der letzten Änderung lässt sich natürlich nicht anpassen, da dieser automatisch gesetzt wird. Beispiel:
fibaro:setGlobal("TimeOfDay","Midnight") fibaro:getGlobalValue("TimeOfDay") AUSGABE: Keine
Moment! Fällt Dir etwas auf? Die globale Variable TimeOfDay ist eine Vordefinierte Variable die den Wert Midnight gar nicht kennt. Gut aufgepasst und ein Blick in die Variablen Steuerung verrät uns, dass wir zwar den Befehl zur Änderung der Variablen abgeschickt haben, dieser aber keine Wirkung gezeigt hat, weil die Ausprägung Midnight nicht vordefiniert ist. Vordefinierte Variablen lassen eine Änderung nur zu, wenn der neue Wert auch in den vordefinierten Ausprägungen vorhanden ist.
Feedback
Ich hoffe, dass dieser Artikel die Funktionsweise und Verwendung von globalen Variablen ein wenig verdeutlicht hat und freue mich über Feedback in der Kommentarfunktion oder dem Fibaro Forum.
Comments ()