Smart-Security
Integrantes
Alejandro Araya
Cristian Gutiérrez
Descripción
El proyecto consiste en la elaboración de un sistema de alarma, utilizando un Raspberry Pi y basado en Python como lenguaje de programación. Este contará con una serie de características tales como la cantidad de zonas que el usuario desee abarcar, el modo de armado; ya sea que el usuario permanezca o no en el sector abarcado por la alarma, el proceso a realizar posterior a que la alarma sea activada e incluso la capacidad de ser activada remotamente.
Objetivo general
Objetivos específicos
Justificación
Realizando un estudio del mercado de alarmas, basado en ese estudio se descubrió que la mayoría de los sistemas analizados no cuentan con el sistema que se plantea desarrollar en este proyecto, por lo cual, a manera de crear mejoras, se decidió utilizar Machine Learning para generar un sistema que pueda ser considerado como innovador. Se decidió realizar el trabajo de esta manera debido a que se desea tener un sistema de alarma capaz de competir en el mercado y de ser posible superar a otros sistemas.
¿Qué es un RaspberryPi y el PiFace?
El RaspberryPi es una computadora pequeña que solo necesita de conectarse a un monitor, un teclado para funcionar y a la corriente eléctrica para funcionar. Al ser una computadora pequeña de bajo costo es posible implementarse en proyector electrónicos y trabajar de manera similar como lo haría una computadora. Para este proyecto además se utilizó un componente adicional conectado al RaspberryPi, el PiFace. Este dispositivo permite al RaspberryPi conectarse de una manera más directa con el mundo exterior, conectándose a través de su GPIO. Este tiene una serie de switchs que le permiten detectar el estado del mismo y una serie de salidas que pueden enviar comandos.
Instalación del RaspberryPi y el PiFace
En este proyecto se instaló en el RaspberryPi una distribución de Linux llamada Raspbian. Se decidió utilizar esta distribución por ser la más familiar a lo trabajado en clases. La instalación a la tarjeta SD del RaspberryPi, que es la principal memoria del mismo, se realizó desde una computadora Mac OSX. Desde aquí se trabajo desde la terminal utilizando el comando:
$sudo dd bs=1m if=/Users/alearaher/Downloads/raspberrypi/2014-01-07-wheezy-raspbian.img of=/dev/disk2s1
El propósito de este comando es copiar y convertir el archivo seleccionado en if en la localización denotada por of , que en este caso es la tarjeta SD. La tarjeta SD utilizada fue de 8gb tipo 4, ya que se investigó que menor de 4gb y menor de tipo 4 estas no funcionan con el RaspberryPi, el tamaño se debe a que solamente el sistema operativo ocupa por lo menos 3gb de espacio.
Una vez instalado el RaspsberryPi se procedió a hacer la instalación del PiFace. Para esto fue necesario activar los SPI del RaspberryPi, utilizando el siguiente comando:
$sudo raspi-config
Una vez activas dichas entradas, la conexión con el PiFace era posible, pero para poder configurarlo, es decir para poder leer los estados de las entradas y enviar señales por las salidas, es necesario instalar los módulos de PiFace Digital.
Como comprobación y verificar que todo fue instalado de manera correcta se utilizó el pifacedigital-emulator y el resultado de la instalación fue correcto.
Los tres módulos principales de esta librería son: digital_read(), digital_write() y digital_write_pullup().
En este proyecto se utilizarán principalmente las dos primeras, que leen las entras correspondientes al parámetro en los paréntesis y modifica las saldas correspondientes al parámetro respectivamente.
Estudio de mercado de alarmas en Costa Rica
Se estudió 4 compañías que brindan el servicio de alarmas de seguridad en Costa Rica, tratando de abarcar tipos diferentes de servicios y a la vez diferencias económicas entre ellas.
Según lo anterior, se descubrió que no todos los sistemas cuentan con notificación vía mensajes de texto o e-mail, sin embargo, se da el caso (compañía “Grupo Safety”), pero el costo de este sistema es muy elevado.
Por lo tanto, al no contar la mayoría de los sistemas con la notificación de mensajes o correo electrónico, el cual se puede considerar como novedoso, y al descubrir que el sistema que lo utiliza es de alto costo, presentamos nuestro sistema, el cual es de bajo costo, como un sistema que puede competir contra los sistemas estudiados.
Además, estos sistemas previamente analizados, no cuentan con Machine Learning, el cual se pretende utilizar en este sistema, el cual favorece a este sistema/
#!/usr/bin/env python import smtplib import time import datetime import os import mimetypes import pifacedigitalio as p from email.MIMEText import MIMEText from email.Encoders import encode_base64 import multiprocessing p.init() class Alarma(object): def __init__(self, principal): self.principal= principal #la matriz o base de datos principal # convierte la matriz en un diccionario para poder separar # cada uno de las filas, es decir los sensores para poder # leer cada fila y utilizar los filtros correspondientes def getSensor(self, x): # x es el sensor que se activo sensor = {} for i in range(len(self.principal)): sensor[i]=self.principal[i] print "Este es el diccionario de sensores: %s" % sensor for j in range(len(self.principal)): position = sensor.keys().index(x) if position == x: filaSensor = sensor[x] print "Esta es la fila que debo de retornar %s" % filaSensor break # para salir del ciclo apenas lo encuentra return filaSensor def lector(self): print self.principal def controlHorario(self, posicion, sensorA): if sensorA[0]==1: print "\n\n activo el primer filtro, de tiempo de activacion\n\n" #ask just the first time the method is executed alarm_HH_O = sensorA[1][0] alarm_MM_O = sensorA[1][1] alarm_HH_f = sensorA[1][2] alarm_MM_f = sensorA[1][3] now = time.localtime() armado = False print "This is the starting time: %s : %s , and this is the finalization time %s : %s" % (alarm_HH_O,alarm_MM_O, alarm_HH_f, alarm_MM_f) print "current time is %s: %s " % (now.tm_hour, now.tm_min) time.sleep(1) #if the initial time and final time are the same stop the program if int(alarm_HH_O) == int(alarm_HH_f) and int(alarm_MM_O) == int(alarm_MM_f): print "Cannot process, time span to short or something other than numbers was added" #Determina el intervalo if(now.tm_hour == int(alarm_HH_O) and now.tm_min >=int(alarm_MM_O)): print "Se ha armado la Alarma" armado = True if((now.tm_hour > int(alarm_HH_O)) and (now.tm_hour < int(alarm_HH_f))): print "Se ha armado la Alarma" armado = True if((now.tm_hour == int(alarm_HH_f)) and (now.tm_min < int(alarm_MM_f))): print "Se ha armado la Alarma" armado = True return armado print "End of first filter" def filtro(self, posicion, sensorA, armado, num): #num es el numero de sensor que esta siendo trabajado en el momento, para mantener control activacion = False if posicion == 3 and sensorA[2]==1 and armado: print "\n activo el segundo filtro, sensor de picos 1, exteriores para el sensor %s \n" % (num) #sim_entrada = 1 # detecta entrada, sustituir por pfio.read esp_tiempo = 10 # cantidad de segundos que se queda escuchando si hay algo ctr = 0 # cuenta la cantidad de veces que toleracia = 5 for i in range(esp_tiempo): detector1 = p.digital_read(num) detector2 = p.digital_read(num) detector3 = p.digital_read(num) detectorR = detector1 + detector2 + detector3 if detectorR >= 2: print "Movement detected" ctr = ctr + 1 if ctr == toleracia: now = time.localtime() print "Alarma to be activated, at: %s: %s in 5 seconds" % (now.tm_hour, now.tm_min) for i in range(5): print "%s ..." % (i+1) time.sleep(1) break time.sleep(1) # cierro el for if ctr == toleracia and p.digital_read(3) == 0: print "Activating alarm" activacion = True # agregar filtros de activacion al igual que la activacion en si else: print "Reseting Counter" if posicion ==3 and sensorA[2]== 0 and armado: print "activo el segundo filtro, sensor de picos 2, interiores" time.sleep(2) if p.digital_read(1) == 1 and p.digital_read(3) == 0: activacion = True if sensorA[3]==1 and activacion: print "activo el tercer filtro, activacion silenciosa" # Construimos el mensaje simple mensaje = MIMEText("El sistema de alarma SmartAlarm ha sido activado") mensaje['From']="smartpialarm@gmail.com" mensaje['To']="alearaher@gmail.com" mensaje['Subject']="Informe de Seguridad" # Establecemos conexion con el servidor smtp de gmail mailServer = smtplib.SMTP('smtp.gmail.com',587) mailServer.ehlo() mailServer.starttls() mailServer.ehlo() mailServer.login("smartpialarm@gmail.com","plataformas") # Envio del mensaje mailServer.sendmail("smartpialarm@gmail.com", "cris.guso93@gmail.com", mensaje.as_string()) # Cierre de la conexion mailServer.close() if sensorA[4]==1 and activacion: print "activo el cuarto filtro, de activacion ruidosa" #enciendo todas las luces del pi face p.digital_write(num,1) time.sleep(1) p.digital_write(num,0) def main(fila, colum): datam = [[1,[02,05,22,10],1,1,1,1], [1,[02,25,18,30],1,1,1,0], [1,[02,28,18,45],1,1,1,1], [0,[00,00,00,00],1,1,1,1]] laPrinc = Alarma(datam) sens = laPrinc.getSensor(fila) controlH =laPrinc.controlHorario(colum, sens) laPrinc.filtro(colum, sens, controlH, fila) if __name__=="__main__": while True: for i in range(4): p0= multiprocessing.Process(target = main, args = (i,3,)) p0.start() p0.join()