Cómo crear un sensor de lluvia DIY (parte IV)
- Seguimos con nuestro tutorial para crear desde cero un sensor de lluvia DIY. Hoy vamos a hablar de la integración de nuestro sensor en el HC2 de Fibaro.
Una semana más, durante este período vacacional, seguimos con nuestro tutorial paso a paso sobre cómo crear un sensor de lluvia DIY con vistas a completar nuestra instalación domótica.
Después de las tres primeras entregas (aquí las tenéis: primera entrega, segunda entrega, tercera entrega), hoy nos toca hablar de la integración de nuestro sensor con el controlador domótico Home Center 2 de Fibaro.
Vayamos al grano…
4. Integración con HC2
Antes de proceder a instalar todo en la caja estanca, vamos a probar que el controlador recibe la información correcta.
Como comentamos al principio, en este tutorial haremos la integración con Fibaro HC2. Para ello necesitaremos la escena que creamos anteriormente cuando cargamos el firmware de la tarjeta ESP.
4.1 Escena LUA
Esta escena se encargará de gestionar en principio persianas, pero podemos adaptarla a otros elementos de nuestra instalación.
La escena se disparará desde el sensor de lluvia, de tal forma que, cuando comience a llover, se almacenarán las posiciones de todas las persianas afectadas y se bajarán. Cuando se detecte que ha dejado de llover, se llevarán las persianas a su posición inicial.
Abriremos la escena que creamos anteriormente y copiaremos y pegaremos en el espacio reservado al código LUA el siguiente texto:
--[[ %% properties %% events %% globals --]] -- tabla de dispositivos hT = json.decode(fibaro:getGlobalValue('HomeTable')) --[[----- CONFIGURACION DE USUARIO -------------------------------------------]] userOptions = { -- persianas afectadas roller = {hT.Despacho.Persiana, hT.Cocina.Persiana} } --[[----- FIN CONFIGURACION DE USUARIO ---------------------------------------]] --[[-- confguración del LOG --]] OFF=1;ERROR=2;INFO=3;DEBUG=4 -- referencia para el log levelLog = DEBUG -- nivel de log --[[ Conjunto de funciones para compartir --]] if not lin then lin = { __version = "1.0", variable = function(self, varName, value, ...) local isEnum = true local isTable = true local enumValue = {"Table"} -- si no existe se crea vacia if fibaro:getGlobalValue(varName) == nil then api.post("/globalVariables/", {name = varName}) end -- si se ha pasado un valor se actualiza en la variable if value then value = json.encode(value) api.put("/globalVariables/"..varName, {name = varName, value = value, isEnum = true, enumValues = enumValue} ) end -- recuperar el valor actual de la variable local value = fibaro:getGlobalValue(varName) -- si la variable contiene un valor if value then -- devolver valor como tabla return json.decode(fibaro:getGlobalValue(varName)) end -- si la variable no tiene valor devolver false return false end, log = function(self, level, mensaje, ...) if not mensaje then mensaje = 'nil' end if levelLog >= level then local color = 'yellow' if level == INFO then color = 'green' end if level == ERROR then color = 'red' end --fibaro:debug( --string.format( --'<%s style="color:%s;">%s</%s>', "span", color, mensaje, "span" --) --) fibaro:debug( '<span style="color:'..color..';">'..(mensaje or '<nil>')..'</span>') end end, savePositionDomn = function (self, roller, rainSensor) local rollerPosition = {} -- recorrer las persianas afectadas for key, value in pairs(roller) do position = fibaro:getValue(value, 'value') -- almacenar cada uno de los estados de las persianas lin:log(DEBUG, 'almacenar cada uno de los estados de las persianas') rollerPosition[value] = position lin:log(DEBUG, 'id: '..value..' podición: '..rollerPosition[value]) -- bajar las bajarPersianas fibaro:call(value, 'close'); end -- salvar el estado de las persianas y el estado del sensor local rollerShutter = {rainSensor=rainSensor, rollerPosition=rollerPosition} return lin:variable('rollerShutter', rollerShutter) end, setPosition = function(self, rollerPosition, rainSensor) -- recorrer la persianas for key, value in pairs(rollerPosition) do -- poner las persianas como estaban fibaro:call(key, 'setValue' , value); end -- salvar el estado de las persianas y el estado del sensor local rollerShutter = {rainSensor=rainSensor, rollerPosition=rollerPosition} fibaro:setGlobal('rollerShutter', json.encode(rollerShutter)) end } end --[[ Conjunto de funciones para compartir --]] -- leer rainSensor y rollerShutter local rainSensor = json.decode(fibaro:getGlobalValue("rainSensor")) local rollerShutter = lin:variable('rollerShutter') lin:log(DEBUG, 'rainSensor: '.. json.encode(rainSensor)) lin:log(DEBUG, 'rollerShutter: '..json.encode(rollerShutter)) -- si rollerShutter tiene valores if rollerShutter then -- si comienza a llover if rainSensor.rainSensor == 0 and rollerShutter.rainSensor == 1 then lin:log(INFO, 'comienza a llover') -- almacenar el estado actual de las persinas y bajarlas lin:savePositionDomn(userOptions.roller, rainSensor.rainSensor) -- si deja de llover elseif rainSensor.rainSensor == 1 and rollerShutter.rainSensor == 0 then lin:log(INFO, 'deja de llover') -- volver las persianas a su posicion original lin:setPosition(rollerShutter.rollerPosition, rainSensor.rainSensor) -- si sigue sin llover o si sigue lloviendo else -- no hacer nada lin:log(INFO, 'nada que hacer') end else -- si comienza a llover if rainSensor.rainSensor == 0 then lin:log(INFO, 'comienza a llover por primera vez') -- almacenar el estado actual de las persinas y bajarlas local rollerShutter = lin:savePositionDomn(userOptions.roller, rainSensor.rainSensor) lin:log(DEBUG, json.encode(rollerShutter)) end -- no llueve end
Antes de grabar, debemos adecuar la escena a nuestra instalación modifcando las primeras líneas del código:
-- tabla de dispositivos hT = json.decode(fibaro:getGlobalValue('HomeTable')) --[[----- CONFIGURACION DE USUARIO -------------------------------------------]] userOptions = { -- persianas afectadas roller = {hT.Despacho.Persiana, hT.Cocina.Persiana} } --[[----- FIN CONFIGURACION DE USUARIO ---------------------------------------]]
La variable hT indica la carga de HomeTable. No es objeto de este tutorial la instalación de un sistema “HomeTable”, así que si usamos este sistema sabremos de qué se trata, en caso contrario podemos borrar la línea.
hT = json.decode(fibaro:getGlobalValue('HomeTable'))
… y proceder a configurar la variable indicada en la sección
--[[----- CONFIGURACION DE USUARIO -------------------------------------------]]
En la línea donde dice:
roller = {hT.Despacho.Persiana, hT.Cocina.Persiana}
Pondremos la lista de los ID de las persianas afectadas por la escena dentro de las llaves “{ }” separados por comas “,”, si usamos HomeTable serán nombres, en caso contrario números de ID.
Aquí tenéis el archivo con el código LUA para que os sea más fácil (para descargar el archivo, debes ser usuario de nuestro foro. Si no lo eres, ¡súmate!)
4.2 Pruebas de integración
Procederemos a conectar los componentes principales, placa, célula solar, batería y sensor de lluvia, sobrepuestos antes de realizar el montaje fnal. El sensor de lluvia no tiene polaridad, pero la célula solar y la batería sí. Nos fjamos en las imagen que marca la posición de los contactos:
Tendremos que soldar unos cables con conectores hembra en el extremo tanto a la batería como a las placas solares.
Si todo ha ido bien, el sensor debería comenzar a funcionar, enviando la información del estado de lluvia (evidentemente no llueve) y de la batería. Para comprobarlo abrimos la escena en el controlador HC2.
En la pestaña “Avanzado” en la parte inferior veremos que se ha lanzado la escena y se muestran los estados.
rainSensor: {“rainSensor”:1,”battery”:3620}
rollerShutter: {“rainSensor”:1,”rollerPosition”:{“17″:”62″,”343″:”83”}}
nada que hacer
rainSensor = 1 (no llueve)
battery = 3620 (milivoltios)
nada que hacer.
Si en este momento mojamos un poco la placa con el espiran para que se cierre el contacto del sensor de lluvia, debería dispararse la escena nuevamente y esta vez bajar las persianas indicadas.
rainSensor: {“battery”:3619,”rainSensor”:1}
rollerShutter: {“rollerPosition”:{“17″:”62″,”343″:”83″},”rainSensor”:1}
nada que hacer
rainSensor: {“battery”:3618,”rainSensor”:0}
rollerShutter: {“rollerPosition”:{“17″:”62″,”343″:”83″},”rainSensor”:1}
comienza a llover
almacenar cada uno de los estados de las persianas
id: 343 podición: 45
almacenar cada uno de los estados de las persianas
id: 17 podición: 45
rainSensor: {“battery”:3619,”rainSensor”:1}
rollerShutter: {“rollerPosition”:{“17″:”45″,”343″:”45″},”rainSensor”:0}
deja de llover
La semana que viene, quinta y última entrega. ¡No os la perdáis!
Lee aquí la quinta y última entrega.