Arduino garaje controlador (7 / 8 paso)

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:

  1. Una luz regulable para controlar la puerta del garaje (Recuerde, quiero abrir parcialmente la puerta)
  2. 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!

Artículos Relacionados

3 canal arduino Powered controlador de luces de Navidad!

3 canal arduino Powered controlador de luces de Navidad!

Para Navidad este año, quise hacer un proyecto genial pero bastante no sabía qué hacer. Como me estaba poniendo la salida de luces de Navidad para decorar, había un viejo temporizador de luz de Navidad roto. Tomé distancia y miró a su alrededor en el
Enchufe y juego Arduino temperatura controlador

Enchufe y juego Arduino temperatura controlador

He visto algunos proyectos de los controlador de temperatura diferentes aquí. Yo quería crear uno, con las siguientes restricciones:Aparato "tonto" controlado puede conectarse directamente a la unidad. No quiero hackear en el dispositivo, pero l
Arduino escritorio controlador de ventilador

Arduino escritorio controlador de ventilador

Cuando cambié recientemente papeles dentro de la empresa, me trasladé a sitios, pasando de Bradford a nuestra sede en Wakefield. Le dije adiós a mi fiel escritorio antiguo con deben tener ventilador de escritorio para mantenerme fresco mientras todo
Python/Arduino Serial controlador: Horno casero

Python/Arduino Serial controlador: Horno casero

Lo que empezó como un simple proyecto para hacer un envase de leña pequeñas para los experimentos de cerámica espiral fuera de control en una chatarra-construido, CPU controlada, horno de oxígeno inyectado miniatura.El proyecto acabado combina un GUI
Arduino con controlador de pantalla LED MM5451

Arduino con controlador de pantalla LED MM5451

El tema aquí es conectar el Arduino a la pantalla de MM5451 LEDcontrolador. Esto está escrito en C para demostrar el funcionamiento del registro de cambio y programación bit a bit.Utilizando solamente dos pines de entrada (reloj y datos) para la entr
Arduino Aquaponics: Controlador de bomba de JSON

Arduino Aquaponics: Controlador de bomba de JSON

cuando empezamos a desarrollar el Controlador acuaponia nos dimos cuenta de que queríamos una sola unidad que puede manejar múltiples situaciones.  Algunos sistemas de acuaponia de inundación y desagüe cambiar la bomba enciende y apaga en intervalos
Xbox de mod controlador del 360 Arduino usando (MW3)

Xbox de mod controlador del 360 Arduino usando (MW3)

no quiero comprar un chip de controlador de modded por dos razones uno sólo hacen una cosa y dos que se convierten hacia fuera rápidamente, haciéndolos inútiles para nuevos juegos de la fecha. Así que el arduino que solo recogí parecía perfecto, es p
Guía paso a paso al controlador de robot mago Micro (Arduino compatible)

Guía paso a paso al controlador de robot mago Micro (Arduino compatible)

el Micro mago de DAGU es un bajo costo Arduino compatible controlador diseñado especialmente para principiantes que quieren construir un pequeño robot. El Consejo tiene una serie de accesorios útiles construido en forma que en la mayoría de los casos
II GOduino = Arduino + controlador de Motor L293D Velocidad Variable

II GOduino = Arduino + controlador de Motor L293D Velocidad Variable

versionesGOduino II fue presentado en dangerousprototypes.com07/04/2012 he añadido una diapositiva del presupuesto para aquellos lectores que preguntaban donde obtuve mi presupuesto < $20 para el II de GOduino.INTRODUCCIÓNEl GOduino II es un controla
Robot, conducido por el controlador de PS3 a través de Wifi y Arduino shield

Robot, conducido por el controlador de PS3 a través de Wifi y Arduino shield

esto es un robot que utiliza los dos joysticks izquierdos y derecho en el controlador de PS3 al disco "tanque-estilo." El chasis, ruedas y motores se compran en un kit. Un Arduino Uno se monta en el chasis y un escudo de Wifi se apila encima de
Velocidad coche RC controlado con (controlador de controlador de Motor de CH 4 + Arduino + Bluetooth)

Velocidad coche RC controlado con (controlador de controlador de Motor de CH 4 + Arduino + Bluetooth)

Hola, ya que este es mi primer instructivo aquí, espero que te guste y no dude en preguntar sobre cualquier cosa no clara en él.En primer lugar, empecé este proyecto después de que quería controlar 4 motores que requiere de relativamente alta potenci
Arduino Windows y el controlador de PS3

Arduino Windows y el controlador de PS3

esta guía le mostrará cómo convertir su Arduino Uno en un controlador de Windows/PS3. Es totalmente configurable y puede cambiar la entrada y salida a cualquier botón que desee. Esto significa que puede un nunchuck de wii hasta el gancho y jugar con
Arduino termopar Sous Vide controlador

Arduino termopar Sous Vide controlador

este proyecto hace uso de y estructuras en los proyectos anteriores.  Después de completar este proyecto, puede utilizar un Crock-Pot de bajo costo como una olla de Sous Vide de precisión de temperatura controlada.En la mejora de este proyecto, he añ
Controlador de velocidad de ventilador PWM de Arduino

Controlador de velocidad de ventilador PWM de Arduino

Simple dos canales PWM de Arduino velocidad controlador Escudo VentilosoPuede descargar el pcb un sch (hecho con el expresspcb) de mi sitio web (sección download): http://www.apcc.tkPaso 1: Lista de piezas Lista de piezas:-cara sola 3,5 cm x 6 cm-tra