Desbloquear Nexus 5X con el lector de huellas… sin usar tus huellas.

La pregunta es… ¿Soy un degenerado por intentas desbloquear mi móvil con algo que no sea mis dedos? Me invade esta preocupación durante varios días por ser el único que lo ha intentando. Comentarios son agradecidos.

Anuncios

ALEXA – DOMOTICA LOW COST CON RASPBERRY PI (II)

Quizás es un poco tarde, pero tal y como prometí en su momento, me dispongo de nuevo a documentar la nueva versión del sistema de domótica que ya desarrollé en entradas anteriores y enumerar las nuevas características con las que lo he equipado.

En la última entrada comenté que quería desensamblar aquel ser monstruoso que creé para rehacer todo de nuevo  y así lo hice, conservando, claro está, el corazón del sistema, la Raspberry Pi y los SSR (Solid State Relay). No hay la verdad mucha novedad en lo que el software se refiere, por lo que la mejor manera de mostrar las partes del hardware es, lógicamente, a través de fotografías. Pero antes de ello, os comento qué idea exactamente tenía en la cabeza.

Tenía claro que no quería insertar el sistema en el cuadro de luces de nuevo. Quería que el sistema fuera independiente e incrustado todo en una especie de cuadro eléctrico externo que podía apañar en establecimientos tipo Leroy Merlin. En un principio quería algo pequeño, sin embargo pensé en problemas de disipación de calor y luego tuve un genial idea que me hizo decidirme finalmente por un cuadro de un tamaño un tanto mayor. ¿Por qué no incluir unos altavoces? Y así fue, estuve buscando por diferentes lugares unos altavoces pequeños que NO funcionaran por USB y con una forma vertical para incrustarlos también dentro del sistema.

Vista del sistema cerrado.

Vista del sistema cerrado.

Fue lo primero que hice nada más adquirir la caja. Desmonté los altavoces junto con el transformador y los conseguí incrustar uno a cada lado dejando espacio para todo lo demás y consiguiendo un bonito efecto estéreo en la caja. Hacer hincapié en que el sistema recibe una única entrada AC y cuatro salidas fásicas que abrirían o cerrarían el circuito de cualquier cosa que conecte. Claro está, que de esa entrada AC se alimentarían los altavoces y, por supuesto, la Raspberry; por lo que también deberían buscar sitio para el transformador de 5V que necesita. Estaba ávido por probar al menos esa configuración y todo fue como la seda. Conectado por SSH y reproduciendo música sin ningún problema y con una calidad aceptable. Se abría un abanico de posibilidades.

Anteriormente tenía un pequeño ventilador que  daba aire fresco al procesador de la RBPI, y aunque quería verdaderamente mantenerlo, quería también que se pusiese en funcionamiento cuando la temperatura fuera un tanto elevada. Como muchos sabréis, la placa no cuenta con PWM para controlar la velocidad del ventilador y tampoco lo quería 24/7 girando y generando ruido. Me las apañé con la ayuda de internet, de diseñar un pequeño circuito con un Diodo y un Transistor para manejar el funcionamiento del ventilador a mi antojo y usando un puerto GPIO para ese menester. Así que con soldador y estaño en mano me lié la manta a la cabeza y quemándome un par de veces conseguir hacerlo funcionar. Aquí un diseño del circuito.

 

Circuito para controlar el ventilador del procesador

Circuito para controlar el ventilador del procesador

Circuito

Circuito

Otro nuevo abanico de posibilidades ante mí. Ahora con un script ejecutándose cada minuto, me aseguro de medir la temperatura y activando y desactivando el ventilador automáticamente. Hay que tener en cuenta que la caja de marras iba a estar cerrada y que no existe re-circulación del aire. Así que conseguí una con una bonita ventanita que podía dejar abierta con un ventilador de 12V extra que sí está funcionando permanente. Las salidas que la placa proporciona son máximo de 5V, y ahí reside el truco. Conectar un ventilador de 12V a una fuente de 5v es una maravilla. Gira, ventila y hace un ruido mínimo. Lo conecte a un Switch para poder desactivarlo a demanda ya que en verano aquí hace un calor torrador. Sin embargo, en invierno, lo mantengo desactivado y aquel que depende del script, apenas trabaja. Otra opción que estoy estudiando es hacer funcionar el puerto GPIO del ventilador en modo PWD para controlar a su vez la velocidad.

Vista del sistema cerrado.

Vista del sistema cerrado. Ventilador de 12V

También quería saber con un simple vistazo en qué estado estaba mi sistema. Mantuve la idea y hice tres bonitos agujeros en la caja para insertar tres leds. Verde, amarillo y rojo. Así, con tan sólo un vistazo, y como de un semáforo se tratara, el sistema se mantiene en un perenne verde esperanza mientras la temperatura no sobrepasa los 50ºC. En caso de hacerlo, el led amarillo se activaría junto con el ventilador para volver al estado anterior. Que no se preocupen aquellos con el sueño ligero. El sistema entra en modo “sueño” a partir de las doce donde los LEDs de desactivan y los ventiladores permanecen apagados a no ser que se sobrepase los 70ºC.

Altavoz Derecho y los tres LEDs

Altavoz Derecho y los tres LEDs

Para que me voy a engañar, construí el sistema con un propósito, poder activar la caldera a demanda. Tal y como comenté, el agua caliente en este país funciona con energía solar o, en su defecto, por la corriente eléctrica. Si quieres agua caliente, debes activar el interruptor y esperar unos 20 minutos a que el depósito se caliente. Os podéis imaginar en invierno cuando hay muy pocas horas de sol. Tener que levantarse antes o esperar sudando después de hacer deporte a que el agua esté lista. Esto solucionaría todos mis problemas, sin embargo, quería también tener una forma fácil de activar el termo sin tener que acudir a la consola. ¿Solución? Instalar un bonito botón en la caja, que al pulsarlo, mantuviera el termo activado durante 15 minutos para apagarse automáticamente transcurrido ese tiempo. Fácil, un proceso en linux que escuchara continuamente el estado de un GPIO que cuando valiera 1, activase el calentador durante un tiempo estimado. ¿Algo mejor que eso? Sí, que al pulsarlo de nuevo, lo desactive en caso de no querer mantenerlo encendido ese tiempo.

Botón para activar el calentador durante 15 minutos

Botón para activar el calentador durante 15 minutos y la circuitería de los LEDs

Teniendo el diseño más o menos pensando conseguí incrustar  todos los componentes básicos. La Raspberry, altavoces, ambos transformadores y los cinco SSRs. Faltaba también montar la circuitería de los LEDs e incluir tambien la placa que controlaba el ventilador del procesador más, obviamente, todo el cableado que tendréis la oportunidad de ver.

Me surgía en ese momento una duda, ¿qué hago con las dos cámaras que tenía instaladas? Y ya no sólo eso, sino que en el caso de mantenerlas me obligaba a también incluir en el equipo un HUB USB autoalimentado, ergo otro transformador extra. Además no había tenido muy buenas sensaciones anteriormente. Me decidí entonces por comprar una cámara IP barata que además me diera la oportunidad de controlar el movimiento y la podía instalar donde quisiera ya que se conectaría por WIFI. Concretamente adquirí este modelo por Ebay. Muy contento con el resultado. Funcionando 24/7 y dando un servicio perfecto. Sólo la uso como visor, pero cuenta con un montón de interesantes características. Si te bajas la aplicación móvil puedes incluso hablar desde el móvil y el altavoz de la cámara lo reproducirá. Ideal para amedrentar cacos.

Una vez puertos abiertos inserté la imagen procedente de la cámara Ip al servidor web de la raspberry para así poder no solo visualizar las imágenes, sino mover la cámara a mi antojo. Ahí no acababa todo. Pensé que sería una buena idea mantener una  de las dos webcams USB que tenía, pero no como webCam, sino como micrófono. Desmonté la cámara para que ocupara el menor espacio posible, localicé el micro y lo introduje en una pequeño agujero que hice en la caja. Ahora, Alexa, como llamo cariñosamente a mi sistema, tenía orejas y boca para interectuar con ella. Así luce ahora la página web y accesible desde cualquier lugar del planeta, obviamente, con doble autentificación

 

WEB

 

Micrófono y los controles de los altavoces. Switch, Salida Jack y Volumen

Micrófono y los controles de los altavoces. Switch, Salida Jack y Volumen

Los avispados habrán llegado a misma conclusión que yo. Ahora que Alexa tenía oídos, vamos a enseñarle a hablar. Encontré un software acorde a mis necesidades y hecho por y para la Raspberry. VoiceCommand Cumplía perfectamente con lo descrito y además cuenta con un archivo de configuración muy fácil. Lo primero que hice fue definir la “keyword”. El sistema estaría escuchando constantemente hasta captar la palabra que diera paso al siguiente comando. En este caso sería “Alexa”, ella respondía para escuchar a continuación el siguiente comando que había introducido con anterioridad en el archivo de configuración.

El funcionamiento en sí es simple. Graba tu voz, usa el reconocimiento de voz de google, recibe el texto y si coincide con tus patrones, responde con un “Yes, sir” o en mi caso con un “Dime”. Esto hace un poco lento el proceso. Empecé haciendo pruebas básicas… cosas como decirle “abogado” y responderme “el que tengo aquí colgado“. Modifiqué el TTS para que me respondiera en español, usando, claro, la voz femenina que tiene google en su traductor y en el GPS de maps mismamente. Sí, tiene voz de loca, lo que la hace aún más adorable. Fui puliendo poco a poco todos los comandos de voz. Le pregunto todos los días como está y ella, que es todo un amor, me responde con su temperatura y me das las gracias. Absténganse aquellos de compararme con Joaquin Phoenix en la película “Her”.

A decir verdad tengo la mayor parte del tiempo desactivado el control de voz a no ser que tenga visitas en casa para fardar un poco. La función mas divertida es gritar la palabra “Fiesta!” y Alexa automaticamente pondrá música techno y toda la casa empieza a parpadear al ritmo de la música. Próximamente, con dos palmas haré reproducir música clásica. 🙂

Aprovechando los altavoces y la voz de loca de Alexa, se me ocurrió otra manera original de aprovechar sus cualidades. Ya no sólo me activaría el agua caliente un tiempo antes, sino que también usaría como alarma para levantarme. Con la opcion tambien de controlar el volumen, hacía reproducir el Ave Maria de Shubert y subir el volumen paulatinamente acompañado del sonido de un riachuelo con pajaritos. Y no solo eso, con otro bonito script, me brindaba valiosa informacion como el tiempo actual y temperatura en la ciudad donde vivo y en la de origen y cualquier tipo de eventos, cumpleaños o citas que tuviera añadido en mi google calendar.

#!/bin/bash

cumple=/usr/local/bin/cumple
today=/usr/local/bin/today
lT=`TempVivo.sh`
cT=`TempOrigen.sh`
lC=`CondVivo.sh`
cC=`CondOrigen.sh`

amixer sset PCM 85%
mpg123 /root/BirdsMusic/AveMaria.mp3&
sleep 2
mpg123 /root/BirdsMusic/birds.mp3

google calendar today --cal "Evento*" | grep ^[A-Za-Z] | sed 's/-.*//g' > $cumple
google calendar today | grep ^[A-Za-Z] > $today

tts Arriba. Hora de levantarse
tts Actualmente $lC en "Ciudad donde vivo" con $lT grados. Y $cC en "ciudad de origen" con $cT grados.

if [[ -s $cumple ]] ; then
tts No olvides felicitar a `cat $cumple`
fi ;

if [[ -s $today ]] ; then
tts Tienes las siguientes tareas para hoy. `cat $today`
fi ;

Para conseguir las condiciones metereológicas y las temperaturas usaba el siguiente script. Pongamos que quiero conocer las los datos referentes a Lisboa:

#!/bin/bash
wget -q http://www.accuweather.com/en/pt/lisbon/274087/weather-forecast/274087?unit=c
cat 274087?unit=c | grep '<div class="info"> <span class="cond">' > current.txt
cat current.txt | cut -c 63-150 | sed 's/<.*//g' > cond.txt
cat cond.txt
rm 274087?unit=c
rm current.txt

He pensado siempre en perfeccionarlo para que me informe de la prediccion por horas, pero mira, despues de escuchar todos los días la misma cantinela, lo único que quiero es que termine de hablar cuanto antes para poder tener esos minutos de paz  en la cama antes de ponerme en marcha.

Por lo demas, la distrubucion de los relés (SSR) se distribuye de la siguiente forma:

  • SSR1 –> Salón
  • SSR2 –> Habitacion
  • SSR3 –> Termo
  • SSR4 –> Lavadora
  • SSR5 –> Altavoces
Transformador de la Raspberry PI y de los altavoces

Vista de los SSR, altavoces y demás circuitería.

Aunque puedo desactivar los altavoces por medio de un Switch, me decidí finalmente por conectarlos también a un SSR para poder activarlos o desactivarlos por software y que Alexa permanezca callada en horas de sueño. Y bueno,  dado que vivo solo decidí que sería buena idea poder activar la lavadora a distancia en caso de estar fuera y poder tender la ropa nada más acabar el programa. Introduzco la ropa, echo los productos y listo. Ayuda que mi lavadora no sea digital, aunque imagino que las digitales continuarían el programa donde lo dejaron en caso de falta de corriente.

Aunque no lo he mencionado antes, el puerto USB que queda disponible una vez conectada la Camera-micrófono, es usado lógicamente por un Nano Dongle wifi que funciona “Out of the box”. Concretamente uno basado en el chip Ralink 5370 que compré en Pi-supply.com.

Antes tenía conectado un TP-LINK cuyos drivers tenía que compilar con cada actualización del kernel y era una pesadilla. Lo que conllevaba a que tenía que abrir el sistema para conectarme a través de LAN. Solucioné ese inconveniente instalando un conector LAN exterior que me permitía conectarme sin necesidad de abrir la caja. La verdad que el dongle actual me está dando resultados excelentes. A pesar de varios Kernel updates, el módulo se carga correctamente y no he tenido hasta ahora que tirar de la conexión LAN para solucionar cualquier incidente.

Raspberry PI - Sensor de humedad y temperatura - Micrófono de la cámara USB

Raspberry PI – Sensor de humedad y temperatura – Micrófono de la cámara USB

Y para terminar, hace unos días recibí de Adafruit un sensor de temperatura y humedad para poner la guinda al sistema permitiendome controlar el nivel de humedad de mi casa que habitualmente permanece cerrada. Los requerimientos serían un puerto GPIO libre, 5V + GND y una resistencia para hacerlo funcionar. Ahora desde la consola puedo visualizar los siguientes datos:

Puta humedad

Alexa está completa, es una maravilla y es un sistema completamente portátil que puede ser transportado sin ninguna dificultad a otra vivienda brindando su amor y su voz de loca a cualquiera que esté dispuesto y que no odie aún el Ave Maria que yo ya no puedo aguantar.

Vista del sistema cerrado

Vista del sistema cerrado

Entrada AC

Entrada AC

Vista del sistema cerrado.

Vista del sistema cerrado.

Toca desemsamblar…

Toca hacerlo ya porque me he dado cuenta (tarde, quizás) del tremendo despropósito realizado hasta la fecha. La verdad sea dicha, el sistema no ha fallado. Los relés no se han resentido ni una vez y la Raspberry ha funcionado non-stop durante más de tres meses.

Despropósito porque, seamos serios, lo que “monté” fue una auténtica mierda. ¿Montar los leds y relés en una protoboard? ¿Usar cables comunes mezclados con cinta aislante para encender un termo de 3000W? Durante este tiempo me he ido adentrando un poquitín más en la electrónica y con soldador en mano y con mucho estaño poco a poco el nuevo ser va tomando forma. En breve describiré paso a paso y con fotos el nuevo sistema “domótica low cost” que está por venir.

Recordad que hay alternativas más caras en lo referente a la domótica, pero que cumplen con lo prometido, es decir, tener la casa completamente automatizada y viviendo su propia vida. Mi morada no tiene tal comportamiento, el sistema es muy limitado y como describen muchos comentarios, una vez que los relés están apagados, no hay forma alguna de usar los interruptores comunes. Para eso necesitarías un relé en cada interruptor y ese no es mi caso.

Pronto más noticias.

Domotica Low Cost con Raspberry PI

En esta ocasión me gustaría desviarme un poco de la temática 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 pequeño y robusto portátil Siemens con aproximadamente diez años de antiguedad sigue funcionando como el primer día, con incluso unos grados menos de temperatura y sin apenas mantenimiento. Sin embargo ahora toca hablar de otro pequeño proyecto que llevé a cabo hace unas semanas y que os voy a detallar a continuación… La Raspberry PI

RBPI

Como sabéis, la Raspberry Pi es  un mini ordenador con procesador ARM 700Mhz que tan sólo vale 30€. Como tal, es accesible al bolsillo de todos y cuenta con unas características muy interesantes.

La placa programable de bajo nivel que contiene llamó mi atención desde el primer momento. Mis nociones en electrónica eran limitadas, así que tuve que tirar de google para al menos aclarar ciertos conceptos básicos y descubrir qué posiblidades tenía. De lo primero que me cercioré gracias a la red de redes era la existencia de los puertos GPIO. Puertos de entrada-salida que pueden ser controlados por el usuario… vamos… que puedo aplicar 0 ó 1 cuando me plazca. También, claro está, puedo leer en qué estado se encuentran los mismos en el caso de interesarme.

Me regalaron la Raspberry PI en un hackaton y no le había prestado mucha atención por falta de tiempo y tampoco tenía claro realmente qué tipo de proyecto podía crear con ella. No tenía intención ninguna de usarlo como MediaCenter teniendo una SmartTV y mucho menos como sistema de escritorio… más 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 daréis cuenta porqué.

Es entonces cuando nació la idea de poder controlar partes básicas 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 cómo 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 pequeñas pruebas y compré un Kit con las cosas básicas:

  • Protoboard
  • LEDs
  • Cables
  • Resistencias

Los LEDs eran de varios colores y no pude sucumbir a la tentación de hacer un bonito semáforo. 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 demasía. El lenguage de programación elegido para este caso es Python y tengo que decir que me ha sorprendido su potencia y facilidad.

La distro elegida para esta causa fue, naturalmente, Raspbian, la cual es la más fiel a Debian y además cuenta ya con el entorno de desarrollo Python instalado. Tan sólo tuve que instalar unas librerías para controlar los GPIO y listo. Como comentaba anteriormente, hice mis primeras pruebas con los LEDs y aunque llevo muchos años trabajando en el mundo de la informática, a mí me sigue todavía llamando la atención cómo podía hacer parpadear LEDs a mi antojo, no sé… llamadme romántico.

RELÉS

Los relés eran una parte básica del proyecto. Necesitaba algo puramente mecánico que dejara pasar la electricidad ante cualquier evento. Hay un sin fin de relés disponibles con varios rangos de entrada y salida, pero a decir verdad, eran todos muy limitados y ninguno cumplía con mis premisas. Algunos sí se adaptaban a mis necesidades, pero como bien dice el título del presente blog, quería algo Low Cost.

Después de plantearme construir algún tipo de circuito manual para manejar tales rangos, no sé cómo fui a parar a la página de un simpático americano más bien rellenito que me dio a conocer unas de los aparatos que acabaría radicalmente con mi dolor de cabeza.

SOLID STATE RELAY

Parecía un producto caído del cielo. Ya ni siquiera no era mecánico, que es maravilloso, sino que además manejaba rangos de entrada DC de 3 a 32V… y no os lo perdáis, el rango de salida  era AC de 24 a 380V con un máximo de 25A. En cuestión, 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 cuestión ya que aguanta más amperaje y por lo que pude ver, FOTEK es una marca “consagradísima” de electrónica de Taiwan. 🙂

Antes de entrar en materia, primero tenía que saber qué partes de la casa podía controlar y cómo. Mi morada no es nada del otro mundo… de hecho es pequeña y, bueno, en teoría eso me favorecía a la hora de los relés usados. Dispongo de un salón con cocina integrada, baño y tan sólo una habitación. También cuento con una terraza que dispone a su vez de iluminación.

El siguiente paso es sencillo… ¿dónde puedo colocar la Raspberry, los relés y el cableado? Pues en el único sitio donde se encuentra todo centralizado… en el cuadro eléctrico. Sí, a mi también me tembló el pulso cuando pensé en colocar allí un mini ordenador de 30€ con la bonita responsabilidad de salvaguardar la iluminación de mi casa.

Como ya he comentado, hice una pruebas básicas con Python controlando los leds y  los nuevos  relés para comprobar que efectivamente funcionaban observando sus estados . Lo siguiente era estudiar cómo estaba diseñada la instalación eléctrica y ver qué posibilidades tenía. Unos de los fusibles controlaba las luces del salón y de la cocina, recordad, integrada. El siguiente controlaba mi habitación y, maldición, también el baño. No era partidario de incluir esta fase dentro del proyecto, pero no tenía otro remedio.

Otro de los fusibles daba al traste con la energía de los enchufes. Pensaba yo, ufano, que serían los aquellos localizados en el salón y que habría otro extra para aquellos colocados en  la habitación. Pero no, cortaba la energía de todo lo enchufado excepto los enchufes que requirieran más potencia como lavadora, horno y frigorífico; ya que estos contaban con sus propios fusibles.

Para aquellos más avispados, atentos a la siguiente explicación. Como sabéis, 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 energía de los enchufes? Tendría que conectarlos manualmente en el cuadro eléctrico o llevar el router a algún enchufe no afectado para recuperar la conexión con mi RBPI.

Mi lugar de residencia en una pequeña isla del Mediterráneo, y como tal, cálida 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 energía eléctrica. Os cuento esto porque de ese interruptor, en vez de llegar como de costumbre el cable marrón 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 hacía falta que llegase ningún cable de teléfono. El router repite la señal 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 eléctrico.

Colocando la RBPI y la protoboard en la compuerta del cuadro eléctrico.

Una vez decidido qué partes tenía la posibilidad de controlar, llegó el momento de montar el sistema con RBPI y relés en el cuadro electrico. Mi intención era que una vez todo montado, tuviera la posibilidad de cerrar de nuevo el armario, por lo que tuve que medir los espacios que tenía y poner las piezas en sitios concretos.

En la imagen publicada podéis ver en principio dónde coloqué la RBPI y la protoboard. Hay dos grupos de tres cables que provienen de los GPIO. Tres de ellos para los tres relés, 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 solución a eso, pero hasta entonces, un pequeño ventilador en el procesador bajaba la temperatura hasta los 38º. Es por eso que cuento con los Leds en forma de semáforo. Con un script en Bash y ejecutado cada minuto, visualmente puedo hacerme a la idea del calor que está pasando el sistema. Además, 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 eléctrico fue la fuente de alimentación. La que yo tenía era tan sólo de 700mA y no era suficiente para mover Raspbian (SO), el dongle WIFI y una cámara que tenía pensado poner para monitorizar la casa en mi ausencia. Luego tuve la gran idea de comprar otra cámara y poder así alternar entre ver mi cuarto y en salón cuando más 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 también en un problema, ya que no sabía donde colocar dos fuentes de alimentación en un espacio tan reducido como el cuadro eléctrico. Y no, alimentar la Raspberry por usb usando el Hub no funciona ya que el flujo de intensidad fluctúa y la hace comportarse de forma inestable.

Diseño completo antes de acoplar la compuerta al cuadro eléctrico.

Diseño completo antes de acoplar la compuerta al cuadro eléctrico.

Así es como quedó el diseño preliminar antes de acoplarlo al cuadro eléctrico, aunque he hecho algunas pequeñas modificaciones que ya veréis en el vídeo. 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 electrico.

Fui consciente del peligro que entrama que todo la intensidad de corriente para por esos pequeños cables. De los relés no tengo que preocuparme, ya que aguantan un máximo de 25A. De los cables para alimentar luces, tampoco era problema, puesto que con toda la iluminación conectada, no llega tirando por lo alto a 400W. Pero de los enchufes tengo que tener especial cuidado, porque conectando el tostador + estufa + secador podríamos llegar a los 20A fácilmente y los cables no están 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 preocupación de ver ardiendo el sistema entero por sobrecarga.

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

IMG_20130715_232538

 SOFTWARE

Sí, muy bonito, la puerta cierra perfectamente… pero ahora qué. Hagámoslo, pues, funcionar con algunas líneas de código. Mi meta era clara, quería hacer un programilla elegante y simple para mis propósitos. Aunque la aplicación en sí no va a ser utilizada por otros usuarios, quise aplicar un férreo control de validaciones y por supuesto, que admita en el caso de que los haya, nuevos relés para otra futura instalación. No os penséis una obra de arte, aunque en mi trabajo veo mucho código, no me considero un programador, aunque nunca es tarde si la dicha es buena.

Como comenté anteriormente, opté por Python para realizar la aplicación “Domo” ya que el entorno está instalado en la distribución Raspbian para RBP y verdaderamente es un lujo trabajar con él. Poco después de preparar el entorno, me sentía más cómodo 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é, lógicamente, del magnífico WinSCP con una pequeña 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 varios cosas, ya que en Python hay que tener especial cuidado porque todo funciona a través de tabulaciones. Si en tiempo de ejecución ocurrían problemas que no sabía a primera vista interpretar, tiraba del PyScripter para detectar los fallos más fácilmente.

Empecemos destripando el código:


#!/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 quería que la aplicación aceptara argumentos. Me parecía mucho más cómodo que crear un menú con diferentes opciones y de lo que se trataba era de accionar rápidamente cualquiera de los relés. 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 sólo introduzco 0 ó 1 para determinar el estado de los relés. Ahora comentaré porqué acepto más argumentos que los ya comentados.  Como veis, puedo aceptar más de un argumento debido a una propiedad que aún estoy intentando integrar para hacer parpadear las luces de la casa a mi antojo. Mi intención no es crear una casa de esas navideñas, 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á demás tomar precauciones.

Tengo que madurar aún la idea, y voy a quitar esas líneas innecesarias que afean un poco el código. Prefiero hacer otro script que invoque a este programa para manejar la simulación ya que es algo que tan sólo usaré en días 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 función no tiene ninguna complicación. Tan sólo 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 líneas anteriores tampoco tienen complicación. Es básicamente donde se realizan las acciones que invoco desde el Main que veremos más tarde. En primer lugar me aseguro que el usuario no tenga intención 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 cómo quedarán los estados después de la ejecución. A continuación, simplemente con un simple FOR, recorro tantas partes como haya definido y se aplica el resultado. Si añado más relés a la vivienda, es una parte del código que no se debe tocar, puesto que la variable “n” almacena el número de relés de los que dispongo.

Por favor, ignorar las líneas referentes al parpadeo. Las dejo si por casualidad sirven de ayuda, pero semejantes líneas merecen arder en el infierno para siempre. Para terminar, defino la función que leerá el fichero que contiene el último estado de los relés. 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 más simple. Si ignoramos la comprobación que hago  para el dichoso parpadeo, no hago más que definir en un array las partes de la casa y el número de GPIO que tienen asignado.

Las restantes líneas contienen la llamada a la función “Action” y que puedo llamar de diferentes maneras depende, cómo no, de el dichoso parpadeo.  Simplemente añadía a la función el número de parpadeos y cuánto tiempo en segundos había entre ellos.

Hasta aquí la pequeña criatura que ilumina mis momentos de tiniebla. Insisto en que las cosas se pueden hacer mucho mejor y estoy abierto a toda crítica constructiva que se precie. Al fin y al cabo y como he comentado, ya no ejerzo la programación y tan sólo la tengo como hobbie.

FRONT-END

Supongamos que llego a casa después de un arduo y sinuoso día 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 fácilmente las luces. Si a eso le añades unas camaras conectadas a la RBPI, la fabulosa idea empieza a tomar forma.

Insisto que el único usuario soy yo, pero ya lo dice el refrán… “las cosas bien hechas, bien parecen”. Sí he realizado bastante diseño 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. Aún así me armé de valor para realizar una simple interfaz donde pudiera visualizar las imágenes de la habitación y el salón y además unos botones muy monos para manejarlas.

Me compré dos cámaras muy simples Logitech c130 que funcionaban sin la necesidad de instalar ningún driver e instalé el software “motion” que aunque no es del todo fácil, pero con la ayuda de internet y una tarde tienes lo básico para hacerlo funcionar.

Aunque tampoco es lo más elegante, usando PHP tienes la intrucción “exec” donde puedes ejecutar cualquier comando en la máquina remota. Me venía de perlas para mi propósito, sin embargo había una cosa con la que no había planeado. El uso de un enlace, sea un link o un botón, conlleva que la página web se recargue. No era un problema muy grande, pero quería evitar que con cada pulsación el usuario tuviera que esperar a que las imágenes se generaran otra vez.

Tuve algunos problemas de ancho de banda con los usb que solventé bajando la calidad de las imágenes y ya por fin soy capaz de visualizar las dos cámaras sin problemas, pero con un retraso de unos cuatro segundos. Motion también 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 página recargue, me centré en el uso de AJAX y con una función para cada relé me las apañé para poder encender y apagar con sólo apretar el botón. Fácil, sencillo y puedes visualizar en la cámara sin cortes si la acción ha dado resultado o no.

He aquí la página web.

Interfaz Web

Interfaz Web

Pasando el cursor por las imágenes de la cámara, se mostrará unas flechas que te permiten visualizar la otra cámara. Pedí por DX un servomotor y será el paso siguiente del proyecto junto con unos altavoces para no sólo hacer sonar alarmas, sino también como un equipo decente de sonido mientras hago las labores del hogar.

El servomotor me permite con una solo cámara hacerla girar los grados que desee y poder visualizar incluso el baño. Los controles se añadirían en la interfaz web y es a día de hoy el siguiente paso y que documentaré tan pronto como lo instale. Obviamente perdería 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 también un simple script para levantar y desactivar la interfaz cuando me plazca dejando tan sólo el servidor SSH como método primario.

En definitiva el proyecto puede crecer mucho, pero siendo honesto no tiene mucha utilidad. A todo mortal nos gusta pulsar el interruptor para que luz se encienda y no tener que ir con el teléfono pulsando botones todo el tiempo. Además, aunque a día 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 ecuación al frigorifico y demás electrodomésticos 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 código publicado, ya que de la interfaz web ni me atrevo. Por último, os dejo un vídeo de demostración para que veáis el sistema funcionando in situ.

Suma y sigue

Han pasado muchas cosas desde la última vez que escribí aquí acerca de mi particular servidor. Afortunadamente a nivel de hardware el equipo se encuentran en perfectas condiciones, más bien hubo un cambió logístico significativo.

Como sabéis, el ordenador se encontraba en un piso particular que tenemos alquilado una serie de amigos y yo, sin embargo, por cuestiones económicas, el mantenimiento de internet se hizo insostenible y, claro… ya me diréis qué hacemos con un servidor sin estar conectado a la red de redes.

Hay que analizar por partes los pros y contras de este tipo de decisiones. La principal limitación es cláramente la imposibilidad de aprovechar las ventajas que nos daba el almacenamiento de datos de todo tipo.  Sin embargo, dado la edad avanzada del portátil, esa sería una carga que ya nunca tendría que soportar.

Dado que en mi domicilio particular cuenta también con una conexión con IP fija, no había más remedio que trasladar el servidor a mi casa. Así, si surge algún problema, ese desplazamiento que me ahorro. Lo primero que hice fue, de nuevo, rediseñar toda la estructura de directorios y eliminar los usuarios que ya no eran necesarios. Por lo tanto, eliminé uno de los discos duros externos y por supuesto la webcam, que de nada servía cuando no había nada interesante que ver. Obviamente descarté el HD de 200GB y me quedé con el gordo, que para eso son míos, y estudiaré la opción de donar el pequeño.

Una de las cosas principales que hay que realizar cuando hay un cambio como este, es volver a configurar las IPs de destino. Recordad que el servidor actúa como DNS público, por lo tanto, además de hacer una mínima modificación en mi proveedor de dominio, tendría que reconfigurar de nuevo mi servidor DNS para que los cambios surgieran efecto cuanto antes. Y ahora que tengo VirtualHost se vuelve una tarea tediosa. No vuelvo a cambiar el servidor de sitio.

Dado que nuestro álbum particular se alimenta del directorio de fotos y que yo sólo no puedo retroalimentar continuamente, tuve que crear una miniaplicación en PHP para permitir subir las fotos comprimidas y que por si solas se almacenaran en el álbum con sus respectivas fechas. De esta forma, yo era informado por mail y con otro script, generaría de nuevo el álbum con las nuevas fotos. Destacar que podría haber generado el álbum directamente cuando un usuario sube alguna foto, sin embargo es este proceso el que hace subir más la temperatura, por lo tanto prefiero tenerlo controlado. Si por algún casual tres usuarios subieran fotos a la vez, habría tres procesos generando el mismo álbum y prefiero no correr el riesgo. Para  información de los usuarios, actualmente uso  JALBUM, incluido en los repositorios Debian y Ubuntu. Usa JAVA y se puede ejecutar perfectamente desde consola. Una bonita aplicación gratis y apta a todos los públicos. Por supuesto, para aquellos a los que lo negro les de miedo (me refiero al terminal), posee también una interfaz gráfica la mar de sencilla.

Atrás quedaron los tiempos en los que tenía sólo una preocupación en la cabeza. Lo he automatizado todo tanto que no tengo que preocuparme casi en absoluto del mantenimiento. Llego incluso a arrepentirme de haber mudado el blog a wordpress dudando, lo reconozco, de mi pequeño  y su fiabilidad.

De lo que no estoy nada conforme es con el ruido. Con el tiempo y las horas de funcionamiento el ventilador se encuentra la mayor parte del tiempo funcionando y aunque se encuentra metido en un armario por las noches es difícil conciliar el sueño en ocasiones. Lamentablemente al ser un modelo muy antiguo, la aplicación sensors tan sólo encuentra los módulos para la temperatura de la CPU no pudiendo controlarse de esta forma la velocidad de los ventiladores. Un día con tiempo buscaré soluciones de sistema entrada – salida básica.

La backup la realiza todos los días a las 2:00 AM y actualmente la veo bastante fiable. El destino sigue siendo un pendrive de 1GB que alberga las bases de datos; los .conf de las aplicaciones y la totalidad de las mismas; todos mis scripts y el contenido de las páginas web comprimidas.  Genero un log y lo hago visible via web por si no tuviera modo de conectarme a la terminal:

http://gomezbecerra25.com/copia

Como medida de seguridad extra, también vuelco el contenido al disco duro externo para no correr riesgos con un pendrive y por supuesto, realizando una imagen del disco duro cada final de mes para poder poseer una base de restauración más rápida.

En definitiva, que teniendo como tengo un portátil casi sin usar mucho más nuevo, casi prefiero que algún día el actual diga basta y pueda renovar el HW por completo porque a nivel de SW, nadie me hará caer del burro.

Servidor DNS público y discos duros

Llevaba ya algún tiempo sin informar de las mejoras que se han producido en el servidor a lo largo de estos meses, y a decir verdad una de ellas es tan ventajosa que en muchas ocasiones se convierte en un martirio. Me explico:

Antes de meterme de lleno con la utilidad de DNS, quiero hacer hincapié en la incorporación de un nuevo disco duro. Para aquellos despistados, en la cabecera del blog podéis ver una foto semi-actual del conjunto del servidor donde se aprecian dos discos duros externos. Recordad que en un principio tan sólo contaba con uno de 200MB y que se empezó a hacer pequeño en cuanto el volumen de películas aumentaba.

De una manera un tanto peculiar que no voy a describir, el servidor acogió con cariño a un nuevo integrante de 1TB de tamaño y con el que se acabaron absolutamente todas los problemas de espacio (espero), porque ni nos quedan entradas USB y el ancho de banda de estos es reducido. Rediseñé la estructura de directorios y monté ambos discos duros en dos directorios distintos para albergar por un lado las fotos y música y por otro las películas y contenidos multimedia. Por lo tanto, y aunque lleno de mierda, la familia crece.

Dejando ahora la rama del hardware, me centraré ahora en una de mis creaciones que más orgulloso me siento, y es la configuración para que mi portátil se comporte como un DNS público.

Como muchos de vosotros sabéis y el que no lo sepa que se entere ahora, el crear un servidor casero se puede hacer de muchas maneras, sin embargo el contar con todos los servicios que te proporciona un hosting profesional es realmente tedioso. En un principio, tan sólo indicaba a mi proveedor de dominio que en sus DNS el nombre apuntara directamente a mi IP. Fácil y rápido, sin embargo me dejaba bastante atado de manos en lo que a subdominios se refiere. No tenía absoluta libertad de creación y mucho menos en la posibilidad de recibir y enviar mails. Se podrían recibir, pero al enviarlos, muchos de los proveedores los rechazarían al no considerar mi dominio como fiable.

Así que ni corto ni perezoso me decidí a acabar con ese monopolio y le indiqué a mi proveedor que YO MISMO gestionaría los DNS de mi nombre de dominio. Obviamente, antes de aplicar la configuración, tendría que cerciorarme que internamente mi servidor resolvía los nombres correctamente. No sólo los de la red, sino los propios que yo me creaba. Me decidí por BIND, para mí es el mejor, y aunque la configuración se realiza mediante archivos de texto, yo finalmente no tuve un éxito completo hasta que no me ayudé con WEBMIN. Sin embargo, ahora que sé cómo funciona, opto por tocar directamente los archivos.

¿Ventajas de todo esto?

En primer lugar la creación de número ilimitados de subdominios y la elección de a dónde quieres que se dirijan; la creación de tus registros SOA, NS y MX y un largo etcétera. Y a lo mejor esto a ti te suena a chino, no obstante presta atención a la creación de los registro MX ya que estos te permitirán el correcto envío de correos y la identificación de tu dominio como fiable ante otros gigantes.

Es curioso como creas un subdominio ‘wiki.gomezbecerra25.com’ y, como es natural, tu servidor en local resolverá inmediatamente, sin embargo en cuestión de horas ya tienes expandido tu subdominio por toda la red. Ahora existe una comunicación entre mi portátil y millones de ordenadores del planeta.

¡Espera! Que no todo es de color de rosa. Con razón siempre es necesario un DNS primario y otro secundario… y para qué os preguntaréis muchos. Pues para que no ocurra lo que me ocurre a mí en muchas ocasiones. Aunque ya lo detallaré en otra entrada, estoy teniendo serios problemas de temperatura y mi servidor, acosado por el calor, simplemente se apaga y si te he visto no me acuerdo.

En otras ocasiones, esto tan sólo ocasionaría que se rechace la conexión. Sin embargo en mi caso tengo abiertos diferentes puertos que apuntan a otros ordenadores. Veamos un ejemplo:

Existen dos Pcs más en el edificio además del portátil. No siempre están encendidos aunque ambos escuchan el servicio SSH. Para poder optar por uno o por otro, obviamente tienen configurado puertos diferentes… entonces… imaginemos la situación. Servidor apagado por calor infernal… qué pasa si yo tecleo en mi terminal

ssh pepe@gomezbecerra25.com -p 3654

… pues que simplemente estoy jodido. El PC está encendido, el ssh escuchando… por qué demonios no puedo conectar? Porque mi DNS está caído… es él quien se encarga de resolver mi nombre a IP… Si fuera mi proveedor el que mantuviese que ese nombre iba asociada a X.X.X.X , pues no tendría problema. Sin embargo ahora, con mi servidor KO, no hay quién suelte palabra…

La solución es bien sencilla, claro… encendemos el portátil de nuevo y ya estamos vivos de nuevo y disponibles por la red… o, claro está, si sabemos la IP de memoria como es mi caso, pues para nada quiero resolver 🙂

En definitiva, curioso mundo aquel de las resoluciones y la creación de registros que dan un toque de profesionalidad a algo tan insignificante y frágil como un ordenador portátil. Y, ojo, que no hay mucha diferencia de las configuraciones que existen en grandes dominios que muchos conocemos… obviamente a mayor escala y no a 70º de temperatura.

Me mudo

Efectivamente me he mudado a wordpress por la simple razón de que me apetece compartir mucho más mis experiencias y soy consciente que la indexación que google pueda realizar a mi hosting casero no será la misma que aquí.

Para los usuarios nuevos que puedan leerme ahora, no hay más que leer las antiguas entradas para ponerse al día en todas las cuestiones. Mi servidor web sigue intacto y mi blog es legible igualmente desde su antiguo dominio

Blog de gomezbecerra25.com

Por lo tanto, aunque ya no será lo mismo, seguiré transmitiendo la bonita experiencia de mantener un servidor funcionando en un ordenador portátil. No será lo mismo porque ahora la conexión se realizará a quién sabe dónde se encuentren los servidores de wordpress y no al mismísimo portátil. Sin embargo siempre os quedará el antiguo link para comprobar que la cosa sigue en pie.

Etiquetado