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…

Sensor de lluvia DIY

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:

Prueba de integración

Tendremos que soldar unos cables con conectores hembra en el extremo tanto a la batería como a las placas solares.

Cables con conectores hembra

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.

Escena en 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.

Sensor de lluvia mojado

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.

 

Manuel Pascual

Madrileño, técnico de sistemas y apasionado de la tecnología. Autodidacta, le encanta enredar todo tipo de aparatos electrónicos. En la actualidad, investigando el apasionante mundo de la domótica.


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *