Paso 7: El código de Vera
Para utilizar el controlador de mi garaje con mi Vera2, tuve que escribir un "plugin". Pero añadiendo su propio plugin para el Vera no es fácil. En primer lugar, la poca documentación que existe en la Wiki está desactualizada o incompleta. También hay un Foro donde se puede ver lo que otras personas han hecho y hacen preguntas.Vera utiliza una combinación de UPnP y LUA llama Quant. Necesita al menos dos archivos, un archivo de "definición" y un archivo de "implementación". El problema es que el archivo de implementación es una combinación de XML y LUA. La única manera de probar tu código LUA (por lo menos que conozco para Mac), es cargar el archivo de implementación y espero que funciona. Carga los archivos y reiniciar el motor de la SCAP tiene un minuto o más, para que el proceso es lento. No hay ningún depurador y su única herramienta de depuración es la facilidad de registro. ¿Ver el registro, usted puede ya sea SSH en la Vera o utilizar la siguiente URL: < yourVeraIp > / cgi-bin/cmh/log.sh? Dispositivo = LuaUPnP ". Si hay maneras más fácil, no he encontrado les todavía.
A menos que el dispositivo es un tipo de UPnP "conocido", todas las aplicaciones de control remoto de teléfono celular no podrá controlar el dispositivo. Ya que quiero hacer a control remoto, mi garaje controlador aparece como un "controlador de garaje" que tiene los siguientes dispositivos de niño:
- Una luz regulable para controlar la puerta del garaje (Recuerde, quiero abrir parcialmente la puerta)
- Tres interruptores de luz para cada uno de los relés que controlan mis zonas de riego.
Así que aquí está el archivo de definición (guardar como "D_GarageController1.xml"):
<? xml version = "1.0"? >
< raíz xmlns = "urn: schemas-upnp-org:device-1-0" >
< specVersion >
< grandes > 1 < / principales >
< menor > 0 < / menor >
< / specVersion >
dispositivo de < >
< deviceType > urn: schemas-aram-perez-com:device:GarageController:1 < / deviceType >
< friendlyName > controlador de garaje < / friendlyName >
< modelNumber > 1.0 < / modelNumber >
crlf de los < protocolo > < / protocolo >
< handleChildren > 1 < / handleChildren >
< implementationList >
< implementationFile > I_GarageController1.xml < / implementationFile >
< / implementationList >
< / dispositivo >
< / root >
Y aquí está el archivo de implementación (guardar como "I_GarageController1.xml"):
<? xml version = "1.0"? >
< aplicación >
funciones de < >
GC local = "Garage regulador, dispositivo:"
local GC_SID = "urn: schemas-aram-perez-com:device:GarageController:1"
local SP_SID = "urn: upnp-org:serviceId:SwitchPower1"
local DIM_SID = "urn: upnp-org:serviceId:Dimming1"
CR local = string.char(13)
local FIXED_LEVEL = "30"
local CSI = string.char (27, 91)--ESC + [
parentDevice local
garageDoorStatus locales
-- -------------------------------------------------------------------------
--Registro de color
función de Log (dispositivo, msg)
Luup.log (CSI... "35m"... GC... ToString(Device)... ", " .. msj... CSI... «0 m»)
final
función LogL1 (dispositivo, msg)
Luup.log (CSI... "35m"... GC... ToString(Device)... ", " .. msj... CSI... «0 m", 1)
final
función LogL2 (dispositivo, msg)
Luup.log (CSI... "35m"... GC... ToString(Device)... ", " .. msj... CSI... «0 m", 2)
final
función startup(lul_device)
dispositivo local = luup.devices[lul_device]
Dirección IP local, ignorar, ipport+password = string.match (device.ip, "^ ([w%.%-]+ %) (:? () %d-))$")
Si (dirección IP ~ = "") entonces
parentDevice = lul_device
Si (ipport+password == nil) o (ipport+password == "") entonces
Si (device.port == nil) o (device.port == "") entonces
ipport+password = 23;
final
final
Registro (lul_device, ("puesta en marcha, conectar a"... Dirección IP... ", puerto"... ipport+password))
Luup.IO.Open (lul_device, dirección IP, ipport+password)
child_devices = luup.chdev.start(lul_device);
Luup.chdev.Append (lul_device, child_devices, "GD", "Puerta", "urn: schemas-upnp-org:device:DimmableLight:1", "D_DimmableLight1.xml", "", "", true)
Luup.chdev.Append (lul_device, child_devices, "Z1", "zona de riego 1", "urn: schemas-upnp-org:device:BinaryLight:1", "D_BinaryLight1.xml", "", "", true)
Luup.chdev.Append (lul_device, child_devices, "Z2", "zona de riego 2", "urn: schemas-upnp-org:device:BinaryLight:1", "D_BinaryLight1.xml", "", "", true)
Luup.chdev.Append (lul_device, child_devices, "Z3", "zona de riego 3", "urn: schemas-upnp-org:device:BinaryLight:1", "D_BinaryLight1.xml", "", "", true)
Luup.chdev.Sync(lul_device,child_devices)
valor = luup.variable_get (GC_SID, "DelayPartialOpen", lul_device + 1)
Si (valor == nil) o (valor == "") entonces
Luup.variable_set (GC_SID, "Abrir DelayPartial", "3", lul_device + 1)
final
-Asumir todos los relevadores de riego son de
Luup.variable_set (GC_SID, "Estado", "0", lul_device + 2)
Luup.variable_set (GC_SID, "Estado", "0", lul_device + 3)
Luup.variable_set (GC_SID, "Estado", "0", lul_device + 4)
otra cosa
local err = "ERROR: no hay dirección IP encontrada"
LogL2(lul_device, err)
devuelven el valor false, err, "Controlador de garaje"
final
Luup.IO.Write("g?")
Devuelve true, "Ok", "Controlador de garaje"
final
función partialOpen(data)
Luup.IO.Write("GB")
final
< / funciones >
Inicio < startup > < / Inicio >
< entrantes >
< lua >
Registro (lul_device, ("datos recibidos:"... ToString(lul_data)))
local ch = lul_data:sub(1,1)
Si ch == 'g' entonces
estado local
CH = lul_data:sub(2,2)
Si ch == ' o ' entonces
garageDoorStatus = ch
Estado = "100"
Luup.variable_set (SP_SID, "Estado", "1", lul_device + 1)
elseif ch == 'c' luego
garageDoorStatus = ch
Estado = "0"
Luup.variable_set (SP_SID, "Estado", "0", lul_device + 1)
elseif ch == 'p' entonces
garageDoorStatus = ch
Estado = FIXED_LEVEL
Luup.variable_set (SP_SID, "Estado", "1", lul_device + 1)
otra cosa
Registro (lul_device, "datos recibidos desconocidos")
volver final
final
Luup.variable_set (DIM_SID, "LoadLevelStatus", estado, lul_device + 1)
elseif ch == 'r' entonces
CH = lul_data:sub(2,2)
Si (ch & gt; '0') y (ch & lt; '4') entonces
Luup.variable_set (SP_SID, "Estado", lul_data:sub (3,3), lul_device + ch + 1)
otra cosa
LogL1 (lul_device, ("número de la zona no válida:"... ToString(Device)))
final
otra cosa
LogL2 (lul_device, "datos desconocidos")
final
< / lua >
< / entrada >
< actionList >
< acción >
< serviceId > urna: upnp-org:serviceId:Dimming1 < / serviceId >
< nombre > SetLoadLevelTarget < / nombre >
< run >
local garageLevel = lul_settings.newLoadlevelTarget
Luup.variable_set (DIM_SID, "LoadLevelTarget", garageLevel, lul_device)
Registro (lul_device, ("ajuste de nivel de la puerta"... garageLevel))
estado local = luup.variable_get (SP_SID, "Estado", lul_device)
Si garageLevel == estado entonces
devuelva true
final
Si luup.io.write("gb") == false entonces
LogL1 (lul_device ("error al enviar el comando"))
Luup.set_failure(true)
devolver false
final
Si (garageLevel ~ = "0") y (garageLevel ~ = "100") entonces
local demora = luup.variable_get (GC_SID, "DelayPartialOpen", lul_device)
Luup.call_delay ("partialOpen", retardo, garageLevel)
final
devuelva true
< / ejecutar >
< / acción >
< acción >
< serviceId > urna: upnp-org:serviceId:SwitchPower1 < / serviceId >
< nombre > SetTarget < / nombre >
< run >
relé local = lul_device - parentDevice
Si (Relais & lt; 1) o (Relais & gt; 4) entonces
LogL1 (lul_device, ("no es un número válido de relé:"... relé))
devolver false
final
Relay = relé - 1
local newTarget = tostring(lul_settings.newTargetValue)
comando local = ""
estado local = luup.variable_get (SP_SID, "Estado", lul_device)
Si estado == nil entonces
Estado = "?"
final
Si relé == 0 entonces
Si estado ~ = newTarget entonces
comando = "gb"
final
otra cosa
comando = "r"... relé de... newTarget
final
Registro (lul_device, ("enviando:"... comando))
Luup.variable_set (SP_SID, "Destino", newTarget, lul_device)
Si comando == "" entonces
devuelva true
final
Si luup.io.write(command) == false entonces
LogL1 (lul_device, "error al enviar el comando")
Luup.set_failure(true)
devolver false
final
devuelva true
< / ejecutar >
< / acción >
< / actionList >
< / implementación >
En la Vera UI5 (yo he probado con UIs anteriores), haga clic en la pestaña aplicaciones, luego haga clic en la subpestaña "Desarrollar aplicaciones" y luego "archivos Cap" encendidos la izquierda. Usted verá una lista de la corriente y un lugar para seleccionar archivos para subir. Una vez que usted sube los dos archivos, puede haga clic en "Crear dispositivo" a la izquierda y complete la información. Bajo "Descripción" entrar "zGarage control" que aparece como el último dispositivo de la interfaz UI5. Una vez creado el dispositivo, te recomiendo que "recarga" para que todos los dispositivos de niño mostrar correctamente.
Puede Agregar listas para abrir/cerrar la puerta del garaje y las zonas de riego. Puede descargar aplicaciones móviles Vera a su teléfono celular y control de las zonas de riego y puerta de garaje desde cualquier lugar del mundo!