In fast allen Artikeln auf siio.de ist von sogenannten globalen Variablen die Rede und in den meisten Skripts wird auch eine benötigt. In diesem Artikel werden wir uns mal mit den globalen Variablen weiter auseinandersetzen.
Bei dem Fibaro HomeCenter sind die globalen Variablen ein sehr mächtiges Mittel, neben der Möglichkeit mit LUA zu programmieren oder beim HCL die Blockszenen zusammen zu klicken, um Szenen so anzupassen, dass die auch unseren Wünschen entsprechen. Außerdem sind sie die einzige Möglichkeit Abhängigkeiten zwischen einzelnen Szenen zu realisieren. So können zum Beispiel Abwesenheitssimulationen, Szenen, welche alle Lichter im Haus ausschalten oder die Heizung herunterfahren, erstellt werden.
Variablen Steuerung
Um die Variablen-Steuerung auf dem HomeCenter aufzurufen, müsst Ihr in der Menü-Leiste auf "Steuerung" (eng. Panels) und dort dann links auf "Variablen-Steuerung" (eng. Variables Panel). Dann befindet Ihr euch im Hauptmenü der Steuerung. Hier können Variablen erstellt, verändert und wieder gelöscht werden.
Bevor Ihr hier eine Variable eurer Wahl erstellen könnt, solltet Ihr wissen, dass es zwei Arten von Variablen gibt. Dies sind zum einen die normalen, bei denen der Wert frei gesetzt werden kann und zum anderen die vordefinierten Variablen. Bei den vordefinierten müssen die Werte, welche die Variable annehmen kann, vorher festgelegt werden.
Wenn Ihr euch eine normale Variable anlegen möchtet, dann klickt unter dem Punkt "Variablen" auf "Hinzufügen". Dabei geht dann ein neues Fenster auf, in dem Ihr den Namen und den Wert festlegen könnt.
In dem rechten Feld "Wert" können nur Zahlenwerte eingegeben werden. Texteingaben werden sofort wieder entfernt (WICHTIG: Mit LUA kann hier auch Text gesetzt werden. Dies wird weiter unten im Artikel noch erläutert. Bei Blockszenen können ebenfalls nur Zahlenwerte gesetzt werden) Links kann der "Variablen Name" frei gewählt werden.
Bei den vordefinierten Variablen habt Ihr mehr Optionen, wenn Ihr auf den Button "Hinzufügen" klickt. Hierbei müssen alle möglichen Zustände beim Anlegen (Können natürlich im Nachhinein mit einem Klick auf den Bleistift noch geändert werden) definiert werden. Hier können auch Texte eingegeben werden.
"Standard"-Variablen setzen
Es gibt ein paar Variablen, welche wir und auch die globale Fibaro-Community in vielen Skripten immer wieder mal nutzen. Es wäre natürlich von Vorteil, wenn Ihr euch diese Variablen erstellt. Hierbei geht es vor allem um die Variable "PresentState", welche wir in folgenden Artikeln bereits nutzen:
Eine weitere Variable ist die "TimeOfDay"-Variable. Hier haben wir auch schon diverse Artikel, unter anderem zu der perfekten Lichtsteuerung geschrieben:
Wie geschrieben, werden die Variablen auch von der globalen Community genutzt. Ein Beispiel hierfür ist das "Very Smart Light"-Skript:
Variablen mit Blockszenen auslesen und verändern
Mit Blockszenen im Fibaro HomeCenter können die Variablen ausgelesen und geändert werden. Hier bitte beachten, dass bei normalen Variablen nur Zahlenwerte eingegeben werden können. Bei vordefinierten Variablen können alle angelegten Werte in einem Pulldown-Menü ausgewählt werden. Zum Abfragen des Value's muss in der Blockszene die entsprechende Variable ausgewählt werden oder mittels des Textfeldes vorgegeben werden:
Wenn Ihr Variablen mit Blockszenen ändert wollt, dann müssen diese in der "DANN"-Bedingung gesetzt werden. Hier können wieder in den vordefinierten Variablen die Werte mittels PullDown-Menü ausgewählt werden, oder Ihr könnt dies in dem zugehörigen Textfeld selbstständig eingeben:
Möglichkeiten mit LUA - Variablen auslesen
Mit LUA habt Ihr noch mehr Möglichkeiten mit den Variablen zu arbeiten. Wir gehen in diesem Teil davon aus, dass Ihr die bereits beschriebene Variable "PresentState" bereits angelegt habt. Solltet Ihr diese nicht angelegt haben, dann kann hier auch jeweils eine andere eingesetzt werden. Es gibt folgende drei LUA-Codes, um den Inhalt auszulesen:
1 2 3 4 5 6 |
-- 1 fibaro:getGlobal('PresentState') -- 2 fibaro:getGlobalModificationTime('PresentState') -- 3 fibaro:getGlobalValue('PresentState') |
Wir haben mal uns mal in einer LUA-Szene diese drei Möglichkeiten in einem Debug ausgegeben, um euch die Unterschiede zu erläutern:
Wie Ihr an der Ausgabe erkennt, sind alle Rückgabewerte anders. Die Funktion fibaro:getGlobal setzt sich aus dem Value (Inhalt) der Variablen und dem Zeitpunkt der letzten Änderung in Unix-Zeit zusammen. Solltet Ihr mehr Informationen zu der Weiterverarbeitung von Unix-Zeiten in LUA benötigen, dann empfehlen wir euch die dazugehörige Befehlsübersicht mal anzuschauen. Um die Rückgabewerte mit LUA richtig zu verarbeiten, haben wir für euch mal ein kurzes Beispiel geschrieben:
1 2 3 4 |
local value, modificationTime = fibaro:getGlobal('PresentState'); fibaro:debug('Aktueller Status: ' ..value) local time = ((os.time() - modificationTime)/60)/60 print('Letzte Änderung vor ' ..time.. ' Stunden') |
In Zeile 1 schreiben wir die Werte der Rückgabe in die lokalen Variablen (lokale Variable gelten nur für die Zeit, in der die Szene läuft. Danach sind diese nicht mehr abrufbar) value und modificationTime. Danach lassen wir uns ins Zeile 2 den Status von value ausgeben und in Zeile 3 berechnen wir die Stunden seit der letzten Änderung der Variablen. Wenn wir eine Division durch den Wert 60 weglassen, dann würden die Minuten seit der letzten Änderung ausgegeben werden. Sollte gar keine Division durchgeführt werden, dann erhalten wir die Sekunden zurück. Wenn die Szene jetzt ausgeführt wird, dann wird folgender Debug ausgegeben:
Solltet Ihr nur die Zeit der letzten Veränderung benötigen, dann könnt Ihr euch diese mit dem Befehl fibaro:getGlobalModificationTime aus der API holen. Hier bekommt Ihr dann nur die vergangenen Sekunden seit der letzten Änderung zurückgeliefert. Mit dem Befehl fibaro:getGlobalValue erhalten Ihr nur den Inhalt der Variablen zurück. Dies würde dann so aussehen:
1 2 3 4 5 |
local value = fibaro:getGlobalValue('PresentState') print('Aktueller Status: ' ..value) local modificationTime = fibaro:getGlobalModificationTime('PresentState') local time = ((os.time() - modificationTime)/60)/60 print('Letzte Änderung vor ' ..time.. ' Stunden') |
Der Debug der Szene würde sich von dem oben geposteten Bild nicht unterscheiden, da grundsätzlich die gleichen Befehle ausgeführt werden. Es werden nur die value und die modificationTime getrennt ausgelesen.
Möglichkeiten mit LUA - Variablen ändern
Neben der Möglichkeit die Inhalte über Blockszenen und über das Steuerungs-Panel zu verändern, könnt Ihr den Inhalt natürlich auch über LUA verändern. Dies passiert mit folgendem Code:
1 |
fibaro:setGlobal('PresentState', 'Away') |
Damit würdet Ihr beispielhaft den Wert der Variable 'PresentState' auf Away setzen. Vor dem Komma befindet sich also die betreffende Variable und nach dem Komma der gewünschte Wert. Wenn Ihr eine vordefinierte Variable nutzt, dann müsst Ihr darauf achten, dass der zu setzende Wert auch existiert. Ansonsten wird der erste mögliche Wert gesetzt. Dies könnte schnell zu Fehlern in Skripten führen, wenn der Wert Away gesetzt wird und Ihr aber eigentlich zu Hause seid.
Mit LUA Variablen anlegen
Es können mit LUA auch Variablen angelegt werden. Hier gibt es allerdings keine Funktion seitens Fibaro, sondern es muss die API des HomeCenters genutzt werden, um die Variable anzulegen. Wir haben euch dafür eine Funktion programmiert, welche Ihr in euren Szenen nutzen könnt und wir auch schon in diversen Skripten genutzt haben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
-- Funktion zum Anlegen einer Globalen Variablen local var = 'TEST_VAR' local var_value = 'TEST_VALUE' function globalVar(var,val) local http = net.HTTPClient() http:request("http://127.0.0.1:11111/api/globalVariables", { options = { method = 'POST', headers = {}, data = '{"name":"'..var..'","value":"'..val..'"}', timeout = 10000 }, success = function(response) local result = response.data; if response.status == 200 or response.status == 201 then fibaro:debug('Status: ' ..response.status.. ' - Variable wurde angelegt') else fibaro:debug('Error: ' ..response.status.. ' - Zugriff verweigert') end end, error = function(err) fibaro:debug('[ERROR] ' .. err) end }) end if (fibaro:getGlobal(var) ~= nil) then fibaro:debug('Benötigte Variable ' ..var.. ' erkannt.') else fibaro:debug('Benötigte Variable ' ..var.. ' NICHT erkannt. Wird erstellt.') globalVar(var, var_value) end |
Wie bereits geschrieben, könnt Ihr mit diesem Skript eine Variable erstellen. Das Skript prüft ab, ob die definierte Variable bereits existiert und gibt das im Debug aus. Wenn diese nicht existiert, dann wird diese Variable angelegt. Es wird auch debuggt, ob das Anlegen erfolgreich durchgeführt wurde, oder ob ein Problem aufgetreten ist.
Der Name und Value können in den beiden lokalen Variablen festgelegt werden:
1 2 |
local var = 'TEST_VAR' local var_value = 'TEST_VALUE' |
Alle Guides findet Ihr hier:
- Zeitgesteuerte Szenen
- Trigger einer Szene
- Trigger auswerten
- Globale Variablen (Dieser Artikel)
Wir hoffen, dass wir euch diesen Part des Fibaro HomeCenter mit diesem Skript ein wenig näher gebracht haben. Solltet Ihr noch Fragen haben, dann würden wir uns freuen, wenn Ihr uns einen Kommentar hinterlasst. :)
Schöne Anleitung, Danke.
Kann man über LUA auch neue globale Variablen erstellen, oder muss man diese immer zuerst im Panel manuell anlegen?
Hi,
danke für deinen Hinweis :) Ich hab den Artikel dementsprechend aktualisiert und solch eine Funktion hinzugefügt.
Gruß
Hallo, das Anlegen der Varaible über das Skript funktioniert. Nur leider wird bei mir immer eine "normale" Variable angelegt. Ich hätte gerne eine "Predefined variables" angelegt.
Kennt ihr eine Möglichkeit wie das möglich ist?
Gruß
Hallo boomx,
vielen Dank für die wie immer verständliche und mit reichlich Beispielen ausführliche Anleitung.
Hi boomx,
kann man mit LUA auch System-Logmeldungen auslesen? Als Beispiel hätte ich da diese Meldung, auf die ich mit einer Szene gern reagieren würde:
[00:15:52] ID 5: unlocked by user 1
Mein Problem ist, dass es nie einen Statuswechsel auf Away geben soll, daher wird immer unlocked gesendet.
Wie du dir bestimmt denken kannst, verwende ich ein RFID Keypad. Es soll nur die Taste Home benutzt werden. Gut wäre es. wenn man einfach irgendeinen Knopf auf dem Keypad drücken könnte (Away oder Home) und dann in jedem Fall eine Szene aktiviert wird, die den Alarm entschärft.
Vielleicht hast du ja eine Idee, wie es gehen könnte.
Danke im Voraus
Grüße
thedarknight
Hi,
das funktioniert leider nicht. (Das Auslesen würde gehen, aber das RFID Pad sendet nur Statusänderungen ans HC)
Gruß
Hallo boomx,
danke für die schnelle Rückmeldung. Ich habe gesehen, dass bei jedem einlesen eines Chips immer eine Meldung im Fibaro Home Center 2 Frontend eingetragen wird (egal, ob da nun ein Statuswechsel von Away->Home oder andersrum erfolgt ist). An diese Meldungen würde ich gerne per LUA Skript rankommen und diese auswerten. Sagst du mir, wie das geht?
Danke dir
Grüße
thedarknight
Hi,
das war mal Thema hier im Forum, da findest du den benötigten Code:
https://www.siio.de/board/thema/log-der-mesh-rekonfiguration-speichern/
Allerdings hast du keine Möglichkeit damit eine Szene zu starten. Es ist daher eher schwierig umzusetzen, hatte mal Überlegungen diesbezüglich angestellt, aber schnell wieder verworfen.
Gruß
Hi boomx,
Kann man auch eine Szene mit einer Globalen Variable starten?
so in etwa:
--[[
%% properties
fibaro:getGlobal('Test') value
%% globals
--]]
Da könnte man alle Module zentral im Panel pflegen und wenn man mal was tauscht dann nur die neue ID im V-Panel eintragen...
Danke im Voraus für deine Hilfe!
MFG
Hi,
ja... aber das sieht dann so aus:
--[[
%% properties
%% globals
Test
--]]
Gruß
Hi boomx,
ich habe das so ausprobiert aber leider wird die Szene so nicht gestartet...
Die Variable habe ich im Variablen Panel angelegt.
--[[
%% properties
%% globals
Test
--]]
Kannst du mir da weiterhelfen?
Gruß
Wenn du die Variable über das Panel änderst, dann wird die Szene nicht gestartet. Diese muss durch eine Szene geändert werden.
Gruß
Danke dir für die schnelle Antwort :)
Geht das zufällig auch mit der sceneActivation Funktion ?
Wenn ich das so einstelle dann funktioniert das so leider nicht...
Danke dir erneut im Voraus!
Ja klar...
https://www.siio.de/kleine-lua-scripte-teil-15-hue-lampen-mit-fibaro-taster-dimmen/
Gibt es eine Restriktion in der Länge eines Textes, den man in globalen Variablen speichern kann?