Sunteți pe pagina 1din 12

DOMOTICA LOW COST CON RASPBERRY PI En esta ocasin me gustara desviarme un poco de la temtica principal de este blog para

hablaros de un proyecto que he emprendido y del cual estoy bastante conforme con su funcionamiento, aunque a decir verdad, la utilidad es un tanto limitada. HARDWARE En primer lugar, el servidor bien, gracias. El pequeo y robusto porttil Siemens con aproximadamente diez aos de antigedad sigue funcionando como el primer da, con incluso unos grados menos de temperatura y sin apenas mantenimiento. Sin embargo ahora toca hablar de otro pequeo proyecto que llev a cabo hace unas semanas y que os voy a detallar a continuacin La Raspberry PI

RBPI Como sabis, la Raspberry Pi es un mini ordenador con procesador ARM 700Mhz que tan slo vale 30. Como tal, es accesible al bolsillo de todos y cuenta con unas caractersticas muy interesantes. La placa programable de bajo nivel que contiene llam mi atencin desde el primer momento. Mis nociones en electrnica eran limitadas, as que tuve que tirar de google para al menos aclarar ciertos conceptos bsicos y descubrir qu posibilidades tena. De lo primero que me cercior gracias a la red de redes era la existencia de los puertos GPIO. Puertos de entradasalida que pueden ser controlados por el usuario vamos que puedo aplicar 0 1 cuando me plazca. Tambin, claro est, puedo leer en qu estado se encuentran los mismos en el caso de interesarme. Me regalaron la Raspberry PI en un hackatlon y no le haba prestado mucha atencin por falta de tiempo y tampoco tena claro realmente qu tipo de proyecto poda crear con ella. No tena intencin ninguna de usarlo como MediaCenter teniendo una SmartTV y mucho menos como sistema de escritorio ms que nada por la ausencia de monitor. Servidor? Otro? Realmente me iba a poner a probar como servidor otro dispositivo y escribir sobre ello? S y no. Ya os daris cuenta porqu.

Es entonces cuando naci la idea de poder controlar partes bsicas de mi casa por medio de estos puertos. Pero antes de nada hablemos un poco de las peculiaridades de los mismos. En primer lugar, cuando el estado del puerto es 1, se aplica un voltaje de 3.3 voltios, cuando el 0, obviamente, ninguno, A ver cmo hacemos para que se lleven bien 3.3V DC con unos bonitos 220V AC que circulan por mi casa. Antes de entrar en materia, quise hacer unas pequeas pruebas y compr un Kit con las cosas bsicas: Protoboard LEDs Cables Resistencias Los LEDs eran de varios colores y no pude sucumbir a la tentacin de hacer un bonito semforo. Como la placa de la Raspberry no est protegida, tuve que tener especial cuidado al elegir las resistencias y tir por lo alto aunque los LEDs no brillen en demasa. El lenguaje de programacin elegido para este caso es Python y tengo que decir que me ha sorprendido su potencia y facilidad. La distribucin elegida para esta causa fue, naturalmente, Raspbian, la cual es la ms fiel a Debian y adems cuenta ya con el entorno de desarrollo Python instalado. Tan slo tuve que instalar unas libreras para controlar los GPIO y listo. Como comentaba anteriormente, hice mis primeras pruebas con los LEDs y aunque llevo muchos aos trabajando en el mundo de la informtica, a m me sigue todava llamando la atencin cmo poda hacer parpadear LEDs a mi antojo, no s llamadme romntico. RELS Los rels eran una parte bsica del proyecto. Necesitaba algo puramente mecnico que dejara pasar la electricidad ante cualquier evento. Hay un sin fin de rels disponibles con varios rangos de entrada y salida, pero a decir verdad, eran todos muy limitados y ninguno cumpla con mis premisas. Algunos s se adaptaban a mis necesidades, pero como bien dice el ttulo del presente blog, quera algo Low Cost. Despus de plantearme construir algn tipo de circuito manual para manejar tales rangos, no s cmo fui a parar a la pgina de un simptico americano ms bien rellenito que me dio a conocer unas de los aparatos que acabara radicalmente con mi dolor de cabeza.

SOLID STATE RELAY Pareca un producto cado del cielo. Ya ni siquiera no era mecnico, que es maravilloso, sino que adems manejaba rangos de entrada DC de 3 a 32V y no os lo perdis, el rango de salida era AC de 24 a 380V con un mximo de 25A. En cuestin, este el producto que adquir:

SSR-25 DA Aunque hay un sin fin de marcas y modelos, finalmente me decid como os he comentado por este en cuestin ya que aguanta ms amperaje y por lo que pude ver, FOTEK es una marca consagradsima de electrnica de Taiwn. Antes de entrar en materia, primero tena que saber qu partes de la casa poda controlar y cmo. Mi morada no es nada del otro mundo de hecho es pequea y, bueno, en teora eso me favoreca a la hora de los rels usados. Dispongo de un saln con cocina integrada, bao y tan slo una habitacin. Tambin cuento con una terraza que dispone a su vez de iluminacin. El siguiente paso es sencillo dnde puedo colocar la Raspberry, los rels y el cableado? Pues en el nico sitio donde se encuentra todo centralizado en el cuadro elctrico. S, a mi tambin me tembl el pulso cuando pens en colocar all un mini ordenador de 30 con la bonita responsabilidad de salvaguardar la iluminacin de mi casa. Como ya he comentado, hice unas pruebas bsicas con Python controlando los leds y los nuevos rels para comprobar que efectivamente funcionaban observando sus estados. Lo siguiente era estudiar cmo estaba diseada la instalacin elctrica y ver qu posibilidades tena. Unos de los fusibles controlaba las luces del saln y de la cocina, recordad, integrada. El siguiente controlaba mi habitacin y, maldicin, tambin el bao. No era partidario de incluir esta fase dentro del proyecto, pero no tena otro remedio. Otro de los fusibles daba al traste con la energa de los enchufes. Pensaba yo, ufano, que seran los aquellos localizados en el saln y que habra otro extra para aquellos colocados en la habitacin. Pero no, cortaba la energa de todo lo enchufado excepto los enchufes que requirieran ms potencia como lavadora, horno y frigorfico; ya que estos contaban con sus propios fusibles. Para aquellos ms avispados, atentos a la siguiente explicacin. Como sabis, la Raspberry cuenta con su puerto HDMI y poder usar as un monitor, pero claro est que donde radica su versatilidad es en poder conectar por VNC y por SSH sin necesidad de tal armatoste. Qu pasa si corto la energa de los enchufes? Tendra que conectarlos manualmente en el cuadro elctrico o llevar el router a algn enchufe no afectado para recuperar la conexin con mi RBPI.

Mi lugar de residencia en una pequea isla del Mediterrneo, y como tal, clida como es, todas las casas cuentan con unos paneles solares en los tejados para generar agua caliente. El problema es que en invierno, a veces el sol no es suficiente y contamos con un interruptor en el pasillo para calentar el agua usando la energa elctrica. Os cuento esto porque de ese interruptor, en vez de llegar como de costumbre el cable marrn de FASE, llegaban los dos, FASE y NEUTRO. Es as como fabriqu un enchufe de la nada y fuera de peligro y apagones. Al tener en router en modo repetidor, tampoco me haca falta que llegase ningn cable de telfono. El router repite la seal wifi de un hotspot de pago cercano y as me aseguro de que mi raspberry no pierde internet nunca.

Colocando la RBPI y la protoboard en la compuerta del cuadro elctrico. Una vez decidido qu partes tena la posibilidad de controlar, lleg el momento de montar el sistema con RBPI y rels en el cuadro elctrico. Mi intencin era que una vez todo montado, tuviera la posibilidad de cerrar de nuevo el armario, por lo que tuve que medir los espacios que tena y poner las piezas en sitios concretos. En la imagen publicada podis ver en principio dnde coloqu la RBPI y la protoboard. Hay dos grupos de tres cables que provienen de los GPIO. Tres de ellos para los tres rels, y los otros tres para alimentar tres Leds que usar como monitor de temperatura. Dado que el cuadro estar cerrado la mayor parte del tiempo, es posible que la temperatura suba mucho debido a que el aire de dentro no se renueva. Quiero encontrar una solucin a eso, pero hasta entonces, un pequeo ventilador en el procesador bajaba la temperatura hasta los 38. Es por eso que cuento con los Leds en forma de semforo. Con un script en Bash y ejecutado cada minuto, visualmente puedo hacerme a la idea del calor que est pasando el sistema. Adems, ahora he colocado los LEds en la esquina para poder as ver el color de los mismos con el armario cerrado. < 38 42 VERDE 42 47 VERDE-AMARILLO 48 52 AMARILLO ROJO > 52 ROJO Otro de los problemas que tuve a la hora de montar el sistema en el cuadro elctrico fue la fuente de alimentacin. La que yo tena era tan slo de 700mA y no era suficiente para mover Raspbian (SO), el dongle WIFI y una cmara que tena pensado poner para monitorizar la casa en mi ausencia. Luego tuve la gran idea de comprar otra cmara y poder as alternar entre ver mi cuarto y en saln cuando ms me plazca.

Es por eso que adquir por Amazon una USB Hub compatible con Raspberry y alimentado por su propia fuente de 2A. Eso se tornaba tambin en un problema, ya que no saba dnde colocar dos fuentes de alimentacin en un espacio tan reducido como el cuadro elctrico. Y no, alimentar la Raspberry por USB usando el Hub no funciona ya que el flujo de intensidad flucta y la hace comportarse de forma inestable.

Diseo completo antes de acoplar la compuerta al cuadro elctrico. As es como qued el diseo preliminar antes de acoplarlo al cuadro elctrico, aunque he hecho algunas pequeas modificaciones que ya veris en el vdeo. Como veis he conectado tan solo una masa de la entrada DC de la raspberry en serie al igual que la FASE en la salida AC. Los cables restantes van directamente conectados al cuadro elctrico. Fui consciente del peligro que entrama que toda la intensidad de corriente para por esos pequeos cables. De los rels no tengo que preocuparme, ya que aguantan un mximo de 25A. De los cables para alimentar luces, tampoco era problema, puesto que con toda la iluminacin conectada, no llega tirando por lo alto a 400W. Pero de los enchufes tengo que tener especial cuidado, porque conectando el tostador + estufa + secador podramos llegar a los 20A fcilmente y los cables no estn preparados para semejante intensidad. Como se puede observar, los cables que uso, aun siendo FASE y NEUTRO, uso los dos para evitarme como he comentado, calentamientos innecesarios. Aunque s es verdad que tengo mucho cuidado a la hora de enchufar cosas. De todas formas, ahora que voy a contratar mi propio internet, creo que voy a tener que buscar otro uso al tercer rel y as de paso me quito la preocupacin de ver ardiendo el sistema entero por sobrecarga.

As qued el sistema una vez acoplado todo. Os aseguro que cierra perfectamente

SOFTWARE S, muy bonito, la puerta cierra perfectamente pero ahora qu. Hagmoslo, pues, funcionar con algunas lneas de cdigo. Mi meta era clara, quera hacer un programilla elegante y simple para mis propsitos. Aunque la aplicacin en s no va a ser utilizada por otros usuarios, quise aplicar un frreo control de validaciones y por supuesto, que admita en el caso de que los haya, nuevos rels para otra futura instalacin. No os pensis una obra de arte, aunque en mi trabajo veo mucho cdigo, no me considero un programador, aunque nunca es tarde si la dicha es buena. Como coment anteriormente, opt por Python para realizar la aplicacin Domo ya que el entorno est instalado en la distribucin Raspbian para RBP y verdaderamente es un lujo trabajar con l. Poco despus de preparar el entorno, me senta ms cmodo programando en un editor con alguna ayuda integrada. Me instal para ello PyScripter Portable disponible dentro de Portable Python y para modificar directamente los archivos de la Raspberry tir, lgicamente, del magnfico WinSCP con una pequea ayudita que har las delicias de muchos En lugar de tirar del editor por defecto, instal aparte el Sublime Text 2 y lo defin como editor predeterminado del WInSCP. Una verdadera maravilla. Mi idea era editar directamente los archivos en el editor con SublimeText, que en s corrige varias cosas, ya que en Python hay que tener especial cuidado porque todo funciona a travs de tabulaciones. Si en tiempo de ejecucin ocurran problemas que no saba a primera vista interpretar, tiraba del PyScripter para detectar los fallos ms fcilmente.

Empecemos destripando el cdigo:


#!/usr/bin/env python # # Nombre: Domotica # Lenguaje: Python # Importo las librerias para manejar los GPIO from time import sleep import RPi.GPIO as GPIO import sys #Funciones ############################################ # VALIDO ARGUMENTOS ######################## ############################################ # Recojo el numero de argumentos que recibe la aplicacion. def parametres(p): blink = False if (p < 5 and p > 2): print "Missing arguments" sys.exit() if (p > 5): print "Too many arguments" sys.exit() if (p == 1): print "Domo has the followings values" read() sys.exit() # Es una puta chapuza. Pero despues de las anteriores validaciones, esta ultima quiere decir que el usuario quiere invocar el parpadeo de la casa. if (p != 2): blink = True return blink

Desde el principio quera que la aplicacin aceptara argumentos. Me pareca mucho ms cmodo que crear un men con diferentes opciones y de lo que se trataba era de accionar rpidamente cualquiera de los rels. Us para ellos el atributo argv del objeto sys. Pueden pasar tantos argumentos como quieras siendo almacenados en un array.

Los argumentos de entrada son muy simples. Tan slo introduzco 0 1 para determinar el estado de los rels. Ahora comentar porqu acepto ms argumentos que los ya comentados. Como veis, puedo aceptar ms de un argumento debido a una propiedad que an estoy intentando integrar para hacer parpadear las luces de la casa a mi antojo. Mi intencin no es crear una casa de esas navideas, sino que simule presencia en mi casa, ya que cuando vuelvo a la madre patria por vacaciones lo hago por un largo periodo de tiempo y nunca est dems tomar precauciones. Tengo que madurar an la idea, y voy a quitar esas lneas innecesarias que afean un poco el cdigo. Prefiero hacer otro script que invoque a este programa para manejar la simulacin ya que es algo que tan slo usar en das de largas ausencias.
############################## # VALIDA LOS ESTADOS ######### ############################## # Valido si el estado introducido por el usuario es 0 o 1. def StateValidation(states): for elements in states: if elements != "0" and elements != "1": print "Value " + elements + " is incorrect" sys.exit() if len(states) != n: print "Max number of states is " + str(n) print "Input states by user: " + str(len(states)) sys.exit() return states

Esta funcin no tiene ninguna complicacin. Tan slo me aseguro que no cometa el error de introducir un estado que no sea 0 1 y, obviamente, no intentar encender o apagar partes de la casa que no existen.
################## # DO THE JOB ######## ################## def Action(states, parts, blink, interval = None, times = None): GPIO.setwarnings(False) if blink == False: x=open("/usr/local/bin/logs", "w") for i in range(0, n): x.write(states[i]) GPIO.setup(parts[i], GPIO.OUT) GPIO.output(parts[i],int(states[i])) x.close else: for i in range(int(times)): print i GPIO.setup(parts[i], GPIO.OUT) if int(states[0]) == True: GPIO.output(17, 1) sleep(float(interval)) GPIO.output(17, 0) if int(states[1]) == True: GPIO.output(27, 1) sleep(float(interval)) GPIO.output(27, 0) if int(states[2]) == True: GPIO.output(22, 1) sleep(float(interval)) GPIO.output(22, 0) Action("111", parts, False) #################### # READ FILE########## #################### def read(): x = open("/usr/local/bin/logs", "r") print x.read() x.close

Las lneas anteriores tampoco tienen complicacin. Es bsicamente donde se realizan las acciones que invoco desde el Main que veremos ms tarde. En primer lugar me aseguro que el usuario no tenga intencin de hacer parpadear la casa y simplemente me dispongo a apagar o encender las partes deseadas. Antes de nada abro un fichero plano para guardar cmo quedarn los estados despus de la ejecucin. A continuacin, simplemente con un simple FOR, recorro tantas partes como haya definido y se aplica el resultado. Si aado ms rels a la vivienda, es una parte del cdigo que no se debe tocar, puesto que la variable n almacena el nmero de rels de los que dispongo. Por favor, ignorar las lneas referentes al parpadeo. Las dejo si por casualidad sirven de ayuda, pero semejantes lneas merecen arder en el infierno para siempre. Para terminar, defino la funcin que leer el fichero que contiene el ltimo estado de los rels. Ser llamada si ejecutamos el programa sin argumentos.
################################### # MAIN ############################ ################################### def main(): pass if __name__ == '__main__': main() room = 17 plugs = 22 hall = 27 parts = [hall, room, plugs] # How many rooms are available in the house n = len(parts) # How many arguments input by the user. p = len(sys.argv) #GPIO ports GPIO.setmode(GPIO.BCM) blink = parametres(p) states = StateValidation(sys.argv[1]) if blink == True: Action(states, parts, blink, sys.argv[3], sys.argv[4]) else: Action(states, parts, blink)

El cuerpo MAIN tampoco puede ser ms simple. Si ignoramos la comprobacin que hago para el dichoso parpadeo, no hago ms que definir en un array las partes de la casa y el nmero de GPIO que tienen asignado. Las restantes lneas contienen la llamada a la funcin Action y que puedo llamar de diferentes maneras depende, cmo no, del dichoso parpadeo. Simplemente aada a la funcin el nmero de parpadeos y cunto tiempo en segundos haba entre ellos. Hasta aqu la pequea criatura que ilumina mis momentos de tiniebla. Insisto en que las cosas se pueden hacer mucho mejor y estoy abierto a toda crtica constructiva que se precie. Al fin y al cabo y como he comentado, ya no ejerzo la programacin y tan slo la tengo como hobbie. FRONT-END Supongamos que llego a casa despus de un arduo y sinuoso da de trabajo. Debido al calor sofocante he bebido cantidades ingentes de agua y requiero vaciar la vejiga y no es plan de orinar a oscuras. Pues queda muy bien la pantallita negra para fardar con los colegas, sin embargo es de agradecer contar con una interfaz donde poder apagar y encender fcilmente las luces. Si a eso le aades unas cmaras conectadas a la RBPI, la fabulosa idea empieza a tomar forma. Insisto que el nico usuario soy yo, pero ya lo dice el refrn las cosas bien hechas, bien parecen. S he realizado bastante diseo web y he toqueteado muchas cosas, pero juro que odio con todas mis fuerzas todo lo relativo a HMTL, CSS y la madre que los pase a todos. An as me arm de valor para realizar una simple interfaz donde pudiera visualizar las imgenes de la habitacin y el saln y adems unos botones muy monos para manejarlas. Me compr dos cmaras muy simples Logitech c130 que funcionaban sin la necesidad de instalar ningn driver e instal el software motion que aunque no es del todo fcil, pero con la ayuda de internet y una tarde tienes lo bsico para hacerlo funcionar. Aunque tampoco es lo ms elegante, usando PHP tienes la instruccin exec donde puedes ejecutar cualquier comando en la mquina remota. Me vena de perlas para mi propsito, sin embargo haba una cosa con la que no haba planeado. El uso de un enlace, sea un link o un botn, conlleva que la pgina web se recargue. No era un problema muy grande, pero quera evitar que con cada pulsacin el usuario tuviera que esperar a que las imgenes se generaran otra vez. Tuve algunos problemas de ancho de banda con los USB que solvent bajando la calidad de las imgenes y ya por fin soy capaz de visualizar las dos cmaras sin problemas, pero con un retraso de unos cuatro segundos. Motion tambin te ofrece la posibilidad que ejecutar cualquier comando sea cual sea el evento. Por ejemplo, puedo hacer parpadear las luces si detecta movimiento e incluso hacer sonar por los altavoces una alarma y ahuyentar as a los cacos. Volviendo a la interfaz web y evitar as que la pgina recargue, me centr en el uso de AJAX y con una funcin para cada rel me las apa para poder encender y apagar con slo apretar el botn. Fcil, sencillo y puedes visualizar en la cmara sin cortes si la accin ha dado resultado o no.

He aqu la pgina web.

Interfaz Web Pasando el cursor por las imgenes de la cmara, se mostrar unas flechas que te permiten visualizar la otra cmara. Ped por DX un servomotor y ser el paso siguiente del proyecto junto con unos altavoces para no slo hacer sonar alarmas, sino tambin como un equipo decente de sonido mientras hago las labores del hogar. El servomotor me permite con una solo cmara hacerla girar los grados que desee y poder visualizar incluso el bao. Los controles se aadiran en la interfaz web y es a da de hoy el siguiente paso y que documentar tan pronto como lo instale. Obviamente perdera las prestaciones de detector de movimiento, pero creo que vale la pena. Lamentablemente no os puedo dar la url de la interfaz web porque quiero vivir tranquilo sin tener que sufrir decenas de apagones diarios. He creado tambin un simple script para levantar y desactivar la interfaz cuando me plazca dejando tan slo el servidor SSH como mtodo primario. En definitiva el proyecto puede crecer mucho, pero siendo honesto no tiene mucha utilidad. A todo mortal le gusta pulsar el interruptor para que luz se encienda y no tener que ir con el telfono pulsando botones todo el tiempo. Adems, aunque a da de hoy la Raspberry me est respondiendo perfectamente, el hecho de que un dispositivo de 30 sea el que mantenga la luz de mi casa es cuanto menos una locura. Aunque he sido lo suficientemente cuerdo para dejar fuera de la ecuacin al frigorfico y dems electrodomsticos por si acaso ocurre algo en mi ausencia. Bienvenidos sois todos de darme nuevas ideas y, por favor, corregirme si en algo me he equivocado o se puede hacer mucho mejor en lo referente al cdigo publicado, ya que de la interfaz web ni me atrevo. Por ltimo, os dejo un vdeo de demostracin para que veis el sistema funcionando in situ.

S-ar putea să vă placă și