Tutorial Raspberry Pi - TwiThief: Twython + Motion + Playstation Eye Toy

Tutorial Raspberry Pi - TwiThief: Twython + Motion + Playstation Eye Toy

a1

¡Hola de nuevo amigos! Hoy os traigo un nuevo tutorial con el que conseguiremos recibir notificaciones en nuestra cuenta de Twitter. Pero no una notificación cualquiera! Se nos avisará que se ha detectado movimiento en la zona donde tengamos vigilando a nuestro sistema de seguridad (de nuevo, la Playstation Eye o Webcam compatible) adjuntando una imagen encuadrada de la persona, objeto, animal o cosa que haya invadido nuestro espacio!

Ya vimos en Geeky Theory un tutorial de cómo hacer funcionar Motion en Raspberry Pi, pero ahora lo veremos con más funcionalidades.

Y...¿Cómo conseguimos esto?

Lo primero de todo, como siempre, vamos a detallar una lista de lo que necesitaremos:

  1. 1x Raspberry Pi con Raspbian.
  2. 1x Webcam USB (Se ha utilizado la Playstation Eye de PS3 de nuevo)
  3. 1x Cuenta/desarrollador en Twitter
  4. Librería Twython para Python
  5. Herramienta Motion
  6. Conexión Internet en Raspberry Pi
  7. Conocimientos básicos de Python y comandos en Linux (para eso estamos aquí)

¡Manos al teclado, empezamos!

Lo primero de todo, como siempre, recomiendo actualizar nuestra distribución Raspbian para actualizar todos los binarios hasta la fecha (recordad que puede demorar un tiempo hacerlo), para ello desde una terminal de la Raspberry Pi ejecutaremos los comandos:

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo reboot

A continuación, vamos a registrarnos en la red social Twitter para conseguir tener acceso a las opciones de desarrollador. Para conseguir tal registro os recomiendo seguir los pasos que mi compañero @luisvillak os detalló a la perfección (imágenes incluidas) y recientemente en el tutorial TUTORIAL RASPBERRY PI – USO DE TWITTER CON PYTHON. Lo importante es que consigamos las "API-keys" necesarias para conectarnos con la aplicación generada en nuestra cuenta de desarrollador de Twitter.

Generada la aplicación y obtenidas nuestras "API-keys" vamos a instalar las librerías y herramientas necesarias con las que va a trabajar nuestro script Python:

$ sudo apt-get install motion
$ sudo apt-get install pip
$ sudo pip install twython

A continuación se van a detallar para qué sirve cada una de ellas:

MOTION

Motion es un programa que monitoriza la señal de vídeo proveniente de una cámara. Es capaz de detectar que una parte significante de una imagen ha cambiado, es decir, que es sensible a captar movimiento entre las imágenes.

Como seguramente habréis deducido, va a ser el programa sobre el cual nos vamos a ayudar para detectar que alguien ha invadido nuestra zona privada. Motion tiene una gran lista de opciones y parámetros que se le pueden fijar, pero no creo que ésta ocasión sea con la finalidad de hacernos unos expertos en la herramienta, por lo que voy a comentar las opciones y parámetros más importantes que deberemos de ajustar (os dejaré más abajo un enlace a toda su documentación oficial para el que quiera saber más):

Para empezar, comentar que Motion se ejecuta en base a un fichero de configuración, que por defecto, en nuestras Raspberry Pi's se ha generado en la ruta /etc/motion y se llama motion.conf.

Éste fichero de configuración es bastante amplio (alrededor de 700 líneas) por lo que voy a detallar a continuación (y específicamente) aquellas líneas que deberemos de ajustar para nuestros intereses:

  • Abriremos dicho fichero de configuración que se encuentra en la ruta /etc/motion/motion.conf con la orden:
$ sudo nano /etc/motion/motion.conf
  •  Tendremos abierto en un editor de texto (nano) el archivo motion.conf y ahora vamos a ir buscando y ajustando las siguientes líneas de acuerdo a lo expuesto a continuación:
daemon off
videodevice /dev/video0
v4l2_palette 6
input 8
width 640
height 480
framerate 2
threshold 3000
gap 60
output_normal on
quality 90
locate on
target_dir /home/pi/projects/twithief
jpeg_filename photo_thief
webcam_port 8081
webcam_localhost off
control_port 8080
control_localhost off
on_event_start python /home/pi/projects/twithief/twithief.py
  • Guardamos el archivo y ahora nos fijamos en el último parámetro que se ha modificado, el cual es el más importante para la finalidad que se quiere llevar a cabo (captura de imagen cuando haya detección de movimiento):
on_event_start python /home/pi/projects/twithief/twithief.py
  • Éste parámetro de configuración sirve para ejecutar un comando externo cuando se ha detectado un evento. ¿Cómo se define un evento? Un evento comienza cuando se ha detectado movimiento después de que haya pasado un período de ausencia de movimiento definido por el parámetro gap (sí, parece un trabalenguas, a mí me costó entenderlo a la primera en su documentación oficial ;P).  Para entendernos todos, lo que hace es: ejecutar el script python que le vamos a pasar (y vamos a crear a continuación)  como parámetro, transcurrido el tiempo definido (en segundos) en el parámetro gap, que para ésta ocasión hemos elegido 1min, es decir, 60 segundos.
  • Otros parámetros importantes a explicar son: jpeg_filename y target_dir, definiendo el primero de ellos, el nombre con el que queremos guardar las imágenes que se creen cuando se detecte movimiento (por defecto se guardan con extensión *.jpeg) y el segundo de ellos, la ruta absoluta donde queremos que se guarden dichas imágenes (en nuestro ejemplo hemos elegido que se guarden en la ruta /home/pi/projects/twithief )

TWYTHON Y SCRIPT PYTHON

Como se ha explicado, mediante el programa MOTION vamos a ejecutar un script python. Éste se va a encargar básicamente de conectarse con nuestra aplicación asociada a nuestra cuenta de Twitter y actualizar nuestro estado con un mensaje e imagen del invitado no deseado. Para realizar la conexión con Twitter, vamos a utilizar en ésta ocasión la librería Twython, la cual posee una amplia API capaz de realizar consultas sobre:

  • Información de Usuario
  • Listas Twitter
  • Timelines
  • Mensajes directos
  • ...y cualquier cosa que encuentres en los documentos de la API de Twitter.
  • Subida de imágenes
  • Actualizar el estado de un usuario con una imagen (¡esta es la nuestra!)
  • Cambiar el Avatar de usuario
  • Cambiar el background de un usuario
  • Cambiar la imagen banner de un usuario
  • Soporte OAuth 2 Application Only (sólo lectura)
  • Soporte con la Twitter’s Streaming API
  • Soporte con Python 3

Si alguien quiere más información sobre Twython, aquí dejo su WEB OFICIAL TWYTHON

A continuación os dejo el código del script en cuestión que se va a ejecutar, lo he llamado TwiThief (a modo de juego de palabras entre 'Twit' y 'Thief'), al estar comentado, creo se sobreentienda:

#!/usr/bin/env python
#coding: utf-8

# Twithief v0.1 by @AlexCorvis84
# Agradecimientos a www.geekytheory.com y @luisvallik

# Importamos las librerias necesarias: 
# Twython: necesaria para creacion/autenticacion con Twitter
#     y asi poder actualizar el estado de nuestra
#     cuenta con un mensaje e imagen.

import os
import sys
import time
from twython import Twython

# Creacion de las variables necesarias para conectarnos
# con la apliacion creada en  nuestra cuenta de desarrollador.

CONSUMER_KEY = 'COPIAD_LA_VUESTRA'
CONSUMER_SECRET = 'COPIAD_LA_VUESTRA'
ACCESS_KEY = 'COPIAD_LA_VUESTRA'
ACCESS_SECRET = 'COPIAD_LA_VUESTRA'

print "Se ha detectado movimiento. Capturando imagen del invitado...." 

api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)

print "Abriendo imagen generada..."

photo = open('/home/pi/projects/twithief/photo_thief.jpg', 'rb')

print "Actualizando el estado de la cuenta Twitter con la imagen capturada"

api.update_status_with_media(status='Cuidado! Se ha detectado movimiento en la zona! Una imagen vale+ que 118 caracteres... #twithief', media=photo)

print "TwiThief enviado!!!"
print "Bye, Bye...."
sys.exit()

Lo que deberéis hacer es crear tal script en un fichero que se llame twithief.py en el directorio /home/pi/projects/twithief (NOTA: aseguraros de haber creado tal ruta de directorios), para ello:

  1. Ejecutad el siguiente comando:
    $ sudo nano /home/pi/projects/twithief/twithief.py
  2. Copiad y pegad (...todos de él) el código de arriba y guardad el archivo mediante las combinación de teclas: Ctrl+O (para guardar) y salir con la combinación de teclas Ctrl+X.
  3. Cambiad las API-Keys por vuestras personales correspondientes donde pone COPIAD_LA_VUESTRA.
  4. Dar permisos de ejecución al fichero, ésto lo logramos con:
    $ sudo chmod +x /home/pi/projects/twithief/twithief.py

Y ya hemos llegado al paso final....¡Puesta en marcha de todo el conjunto!

Para ejecutar nuestro proyecto, sólo queda ejecutar un comando, el cual dejará en funcionamiento el programa MOTION a la "escucha" de detección de movimiento, para lanzar así nuestro script y capturar al "special guest" que se ha entrometido en nuestra zona privada.

Deberemos ejecutar, por tanto, el siguiente comando (da igual donde nos encontremos):

$ sudo motion -c /etc/motion/motion.conf -n

Básicamente con éste comando, lo que estamos haciendo es:

  1. Con el parámetro -c ruta_fichero_config_motion: estamos indicando a MOTION que se ejecute con el fichero de configuración que ajustamos con nuestros requisitos al principio del tutorial.
  2. Con en parámetro -n: estamos indicando a MOTION que se ejecute en modo terminal (no modo demonio o daemon-mode), con lo que conseguimos que aparezcan mensajes en la terminal de todo lo que está sucediendo.

Y como broche final a éste tutorial, y porque como se suele decir, una imagen vale más que mil palabras.....(o 140 caracteres) aquí os va una instantánea de un "famoso intruso" que se quiso apoderar de mis queridos libros:

¡Espero os haya gustado y os animéis a crear más TwiThief's!

¡Salu2!

@AlexCorvis84

TwiThief  

Deja un comentario


9 comentarios


Ricardo Moyano · Hace 2 años

Hola! muchas gracias por este post , ya logré que tome la foto y logré que la envie por tweet, pero no me funciona la detección de movimiento , ya que tengo la raspicam, según he leido, motion no funciona con esta camara, es eso cierto? alguien sabe?

Ricardo Moyano · Hace 2 años

Nada ya lo arreglé , es con motion-mmal...por si acaso alguien lo necesita...!

Nestor Carabajal · Hace 3 años

Muy buen aporte!!. Instale todo y funciono perfecto!. Una duda, soy novato en esto. Tengo un problem con el router, se corta cada tanto. Accedo a la raspy desde mi trabajo para monitorear y trabajar en la misma. ASi me di cuenta que la conexion no es muy buena. Como podria hacer para que ante este problema, cuando se inicia nuevamente la conexion, vuelva a funcionar todo normalmente en la raspy?. Ya que cdo se corta y vuelve nuevamente la conexion, puedo entrar a la raspy, pero la pagina con la ip externa donde veo la camara ya no muestra nada. Inicion nuevamente con "sudo motion -c /etc/motion/motion.conf -n" y ahi si veo todo normal. Desde ya muchas gracias y ojala recibas este mensaje!. Saludos. Nestor

Raul · Hace 3 años

Hola. nose si este blog sigue activo... Pero cuando ejecuto sudo motion -c /etc/motion/motion.conf -n no para de decir. Problem enabling stream server in port 8081: address al ready in use tengo el puerto abierto del router. gracias.

Mario Pérez Esteso · Hace 3 años

Hola Raul. Prueba a configurar otro puerto, como el 8000, por ejemplo. Seguro que acaba funcionando. Saludos.

Raul · Hace 3 años

Hola, ese problema ya esta solucionado, gracias por responder, pero ahora he configurado tal como esta el guion, ejecuto "sudo motion -c /etc/motion/motion.conf -n" y la ultima linea de comando que me muestra es "Started stream web cam server in port 8000". Esta bien, paso x la camara captura la foto y las guarda, diciendo "File of type ...." No me da fallos y pense, que ya la foto estaba subida en el twitter, pero no fue así, que fallo puede que sea ahora? Gracias por ayudarme... se agradece mucho...

gustavo · Hace 3 años

Mi programa en python nunca inicia alguna sugerencia? :/ lo ejecuto desde la consola y todo va bien

Luis Enrique Villa · Hace 4 años

orale no vi que tenia agradecimientos hasta que vi tu código jaja es un placer haberte ayudado en algo amigo...

KaLiBre45_AcerO · Hace 4 años

Buen aporte!! Una pregunta, teneis skype o algun metodo para contactar personalmente (Geeky Theory) ?

Alejandro Esquiva Rodríguez · Hace 4 años

Que guay!!!, lo intentaré hacer cuando pueda!!!

Totemika · Hace 4 años

Woh! Me viene de perlas!

edkepex · Hace 4 años

interesante, graciias