Skip to content

Variables Lua

Almacene un valor en una automatización y úselo en otra, o conserve el valor entre ejecuciones de automatizaciones o entre reinicios del 1Home Server.

Tabla de contenidos

¿Qué son las variables Lua?

El módulo variables está disponible en cada bloque de Script Lua. Le ofrece un almacén compartido de clave/valor: una variable que establece en una automatización puede ser leída por cualquier otra automatización del mismo servidor. Esto resulta útil para mantener un estado en un solo lugar —un modo de la casa, un contador, el último valor medido, un indicador— en lugar de recalcularlo en todas partes.

Hay dos tipos de variables:

  • En memoria: rápidas, compartidas entre todas las automatizaciones mientras el servidor está en marcha, pero se borran cuando el servidor se reinicia.
  • Persistentes: guardadas en la base de datos del servidor, por lo que sobreviven a reinicios y reinicios completos.

El grupo variables también aparece en el panel Helpers del editor Lua, de modo que puede insertar fragmentos de código ya preparados sin tener que recordar la sintaxis exacta.

En memoria vs. persistentes

En memoriaPersistentes
Compartidas entre automatizaciones
Sobreviven a un reinicio del servidorNo (se borran)Sí (guardadas en la base de datos)
Funcionesset / get / remove / getAllKeyssetPersisted / getPersisted / removePersisted / getAllPersistedKeys

Use variables en memoria para indicadores transitorios que solo necesitan existir durante el funcionamiento normal, y variables persistentes para el estado que debe recordarse tras un reinicio o un corte de corriente.

Funciones

Las claves de las variables son siempre texto (una cadena). Los valores pueden ser una cadena, un número, un booleano, nil, un objeto de datos o una tabla.

En memoria

FunciónQué haceDevuelve
variables.set('key', value)Almacena una variable en memoria.err: un mensaje de error si se superó un límite o el valor no se pudo almacenar; de lo contrario, nil.
variables.get('key')Lee una variable en memoria.value, err: err se establece cuando no se encuentra la clave; de lo contrario, nil.
variables.remove('key')Elimina una variable en memoria.err
variables.getAllKeys()Lista las claves de todas las variables en memoria.keys: un array de cadenas.
lua
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
end
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
end

Persistentes

Tanto get como getPersisted devuelven un segundo valor, err, que se establece cuando la clave que solicitó no está establecida. Una lectura persistente puede fallar también por otro motivo: getPersisted y getAllPersistedKeys leen de la base de datos, por lo que también devuelven err si esa lectura falla. Compruebe siempre err antes de usar el valor.

FunciónQué haceDevuelve
variables.setPersisted('key', value)Almacena una variable persistente.err
variables.getPersisted('key')Lee una variable persistente.value, err: err se establece cuando no se encuentra la clave o la lectura falló.
variables.removePersisted('key')Elimina una variable persistente.err
variables.getAllPersistedKeys()Lista las claves de todas las variables persistentes.keys, err
lua
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
end
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
end

Límites

  • Tamaño del valor: cada valor puede contener aproximadamente 10.000 caracteres de texto. Es más que suficiente para el nombre de un modo, un número o una lista pequeña, pero no para grandes bloques de texto o tablas voluminosas.
  • Número de variables: puede mantener hasta 1.000 variables en cada almacén. Las variables en memoria y las persistentes se cuentan por separado, así que son hasta 1.000 de cada tipo.
  • Tipos de valor admitidos: cadenas, números, booleanos, nil, objetos de datos y tablas. Otros tipos —como las funciones— no son compatibles.
  • Las claves deben ser texto (una cadena).

Cuando se alcanza un límite, set y setPersisted devuelven un mensaje de error en lugar de almacenar el valor. Compruebe siempre el err devuelto y regístrelo, por ejemplo:

lua
local err = variables.set('key', value)
if err then
    log.error(err)
end
local err = variables.set('key', value)
if err then
    log.error(err)
end

Ejemplo: modo En casa / Ausente

Un uso habitual es un «modo de la casa» que una escena establece y al que reaccionan varias automatizaciones. Este ejemplo usa variables en memoria. Construirá dos cosas: una escena para cambiar el modo (puede activarla desde la app móvil de 1Home) y una automatización que lee el modo y controla la LED de un botón.

1. Cambiar el modo con una escena

Cree una escena. Añada un bloque de Script Lua que lea el homeMode actual, lo alterne entre home y away, y lo vuelva a almacenar como variable compartida:

lua
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)
end
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)
end

La primera vez que se ejecuta la escena, homeMode aún no está establecido, por lo que get devuelve un error y el modo toma el valor predeterminado home antes de alternarse. Cada activación posterior alterna entre home y away.

Cambiar el modo de casa con una escena

2. Leerlo y reaccionar

En una automatización, lea la variable y actúe en consecuencia; aquí encendemos o apagamos la LED de un botón.

Primero, añada un bloque de Script Lua. En el lado izquierdo, defina una salida de tipo Texto llamada homeMode (consulte Salidas). Luego lea la variable, compruebe si hay un error y escríbala en esa salida:

lua
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)
end
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)
end

A continuación, añada un bloque de Condiciones. Elija el tipo de condición Resultado del bloque anterior, seleccione la salida homeMode del bloque de Script Lua, establezca el operador en es igual a e introduzca home. La automatización se ramifica entonces según el resultado; por ejemplo, apagando la LED del botón cuando el modo es home y encendiéndola cuando es away.

Reaccionar al modo y controlar la LED de un botón

TIP

Este ejemplo usa variables en memoria, por lo que el modo se borra si el servidor se reinicia. Para recordarlo entre reinicios, sustituya variables.set / variables.get por variables.setPersisted / variables.getPersisted.

Véase también