Lua-Variablen
Speichern Sie einen Wert in einer Automatisierung und verwenden Sie ihn in einer anderen, oder behalten Sie den Wert über mehrere Automatisierungsläufe oder über Neustarts des 1Home Servers hinweg bei.
Inhaltsübersicht
Was sind Lua-Variablen?
Das Modul variables ist in jedem Lua-Skriptblock verfügbar. Es stellt Ihnen einen gemeinsamen Schlüssel/Wert-Speicher zur Verfügung: Eine Variable, die Sie in einer Automatisierung setzen, kann von jeder anderen Automatisierung auf demselben Server gelesen werden. Das ist praktisch, um einen Zustand an einer Stelle zu halten – einen „Hausmodus", einen Zähler, den zuletzt gemessenen Wert, ein Flag – anstatt ihn überall neu zu berechnen.
Es gibt zwei Arten von Variablen:
- Im Arbeitsspeicher – schnell, für alle Automatisierungen verfügbar, solange der Server läuft, aber beim Neustart des Servers gelöscht.
- Dauerhaft gespeichert (persistent) – in der Datenbank des Servers gespeichert, sodass sie Neustarts und Reboots überdauern.
Die Gruppe variables erscheint außerdem im Helfer-Bereich des Lua-Editors, sodass Sie fertige Codeschnipsel einfügen können, ohne sich die genaue Syntax merken zu müssen.
Im Arbeitsspeicher vs. dauerhaft gespeichert
| Im Arbeitsspeicher | Dauerhaft gespeichert | |
|---|---|---|
| Über Automatisierungen geteilt | Ja | Ja |
| Übersteht einen Server-Neustart | Nein (gelöscht) | Ja (in der Datenbank gespeichert) |
| Funktionen | set / get / remove / getAllKeys | setPersisted / getPersisted / removePersisted / getAllPersistedKeys |
Verwenden Sie Variablen im Arbeitsspeicher für vorübergehende Flags, die nur während des normalen Betriebs bestehen müssen, und dauerhaft gespeicherte Variablen für Zustände, die nach einem Reboot oder Stromausfall erhalten bleiben müssen.
Funktionen
Variablenschlüssel sind immer Text (eine Zeichenkette). Werte können eine Zeichenkette, eine Zahl, ein Boolean, nil, ein Datenobjekt oder eine Tabelle sein.
Im Arbeitsspeicher
| Funktion | Beschreibung | Gibt zurück |
|---|---|---|
variables.set('key', value) | Speichert eine Variable im Arbeitsspeicher. | err – eine Fehlermeldung, wenn ein Limit überschritten wurde oder der Wert nicht gespeichert werden konnte, andernfalls nil. |
variables.get('key') | Liest eine Variable aus dem Arbeitsspeicher. | value, err – err ist gesetzt, wenn der Schlüssel nicht gefunden wird, andernfalls nil. |
variables.remove('key') | Löscht eine Variable im Arbeitsspeicher. | err |
variables.getAllKeys() | Listet die Schlüssel aller Variablen im Arbeitsspeicher auf. | keys – ein Array von Zeichenketten. |
local err = variables.set('home_mode', 'away')
if err then
log.error(err)
end
local mode, err = variables.get('home_mode')
if err then
log.error(err)
return
endlocal err = variables.set('home_mode', 'away')
if err then
log.error(err)
end
local mode, err = variables.get('home_mode')
if err then
log.error(err)
return
endDauerhaft gespeichert
Sowohl get als auch getPersisted geben einen zweiten Wert err zurück, der gesetzt ist, wenn der angeforderte Schlüssel nicht gesetzt ist. Ein dauerhaft gespeicherter Lesevorgang kann noch aus einem weiteren Grund fehlschlagen: getPersisted und getAllPersistedKeys lesen aus der Datenbank, daher geben sie auch dann err zurück, wenn dieser Lesevorgang fehlschlägt. Prüfen Sie immer err, bevor Sie den Wert verwenden.
| Funktion | Beschreibung | Gibt zurück |
|---|---|---|
variables.setPersisted('key', value) | Speichert eine dauerhafte Variable. | err |
variables.getPersisted('key') | Liest eine dauerhafte Variable. | value, err – err ist gesetzt, wenn der Schlüssel nicht gefunden wird oder der Lesevorgang fehlgeschlagen ist. |
variables.removePersisted('key') | Löscht eine dauerhafte Variable. | err |
variables.getAllPersistedKeys() | Listet die Schlüssel aller dauerhaften Variablen auf. | keys, err |
local err = variables.setPersisted('home_mode', 'away')
if err then
log.error(err)
end
local mode, err = variables.getPersisted('home_mode')
if err then
log.error(err)
return
endlocal err = variables.setPersisted('home_mode', 'away')
if err then
log.error(err)
end
local mode, err = variables.getPersisted('home_mode')
if err then
log.error(err)
return
endLimits
- Wertgröße: Jeder Wert kann ungefähr 10.000 Textzeichen aufnehmen. Das ist ausreichend für einen Modusnamen, eine Zahl oder eine kleine Liste, aber nicht für große Textblöcke oder umfangreiche Tabellen.
- Anzahl der Variablen: Sie können bis zu 1.000 Variablen in jedem Speicher behalten. Variablen im Arbeitsspeicher und dauerhaft gespeicherte Variablen werden getrennt gezählt, das sind also bis zu 1.000 von jeder Art.
- Unterstützte Werttypen: Zeichenketten, Zahlen, Booleans,
nil, Datenobjekte und Tabellen. Andere Typen – etwa Funktionen – werden nicht unterstützt. - Schlüssel müssen Text sein (eine Zeichenkette).
Wenn ein Limit erreicht ist, geben set und setPersisted eine Fehlermeldung zurück, anstatt den Wert zu speichern. Prüfen Sie immer das zurückgegebene err und protokollieren Sie es, zum Beispiel:
local err = variables.set('key', value)
if err then
log.error(err)
endlocal err = variables.set('key', value)
if err then
log.error(err)
endBeispiel: Modus Zuhause / Abwesend
Eine häufige Verwendung ist ein „Hausmodus", den eine Szene setzt und auf den mehrere Automatisierungen reagieren. Dieses Beispiel verwendet Variablen im Arbeitsspeicher. Sie erstellen zwei Dinge: eine Szene, um den Modus umzuschalten (Sie können sie aus der 1Home Mobile App auslösen), und eine Automatisierung, die den Modus liest und die LED einer Taste ansteuert.
1. Den Modus mit einer Szene umschalten
Erstellen Sie eine Szene. Fügen Sie einen Lua-Skriptblock hinzu, der den aktuellen homeMode liest, ihn zwischen home und away umschaltet und ihn als geteilte Variable zurückspeichert:
local homeMode, err = variables.get('homeMode')
if err then homeMode = 'home'
end
if homeMode == 'home' then homeMode = 'away'
else homeMode = 'home'
end
local err = variables.set('homeMode', homeMode)
if err then
log.error(err)
endlocal homeMode, err = variables.get('homeMode')
if err then homeMode = 'home'
end
if homeMode == 'home' then homeMode = 'away'
else homeMode = 'home'
end
local err = variables.set('homeMode', homeMode)
if err then
log.error(err)
endBeim ersten Ausführen der Szene ist homeMode noch nicht gesetzt, daher gibt get einen Fehler zurück und der Modus wird auf home voreingestellt, bevor er umgeschaltet wird. Jeder weitere Auslöser schaltet zwischen home und away um.

2. Den Modus lesen und darauf reagieren
Lesen Sie in einer Automatisierung die Variable und reagieren Sie darauf – hier schalten wir die LED einer Taste ein oder aus.
Fügen Sie zuerst einen Lua-Skriptblock hinzu. Definieren Sie auf der linken Seite eine Text-Ausgabe namens homeMode (siehe Ausgaben). Lesen Sie dann die Variable, prüfen Sie auf einen Fehler und schreiben Sie sie in diese Ausgabe:
local homeModeVar, err = variables.get('homeMode')
if err then log.error(err) return
end
local err = OUTPUTS.homeMode.set(homeModeVar)
if err then
log.error(err)
endlocal homeModeVar, err = variables.get('homeMode')
if err then log.error(err) return
end
local err = OUTPUTS.homeMode.set(homeModeVar)
if err then
log.error(err)
endFügen Sie als Nächstes einen Bedingungsblock hinzu. Wählen Sie den Bedingungstyp Ergebnis des vorherigen Blocks, wählen Sie die Ausgabe homeMode aus dem Lua-Skriptblock, setzen Sie den Operator auf ist gleich und geben Sie home ein. Die Automatisierung verzweigt dann anhand des Ergebnisses – zum Beispiel, indem sie die Tasten-LED ausschaltet, wenn der Modus home ist, und einschaltet, wenn er away ist.

TIP
Dieses Beispiel verwendet Variablen im Arbeitsspeicher, daher wird der Modus gelöscht, wenn der Server neu startet. Um ihn über Neustarts hinweg zu behalten, ersetzen Sie variables.set / variables.get durch variables.setPersisted / variables.getPersisted.
Siehe auch
- Lua-Skript – wo Sie die Skripte schreiben, die Variablen verwenden.
- Bedingungen – verzweigen Sie eine Automatisierung anhand eines in eine Ausgabe gelesenen Variablenwerts.
- Hinzufügen und Verknüpfen von Blöcken – wie Blöcke miteinander verbunden werden.