Contador de presencia con envío por mqtt

Objetivo: Contar, almacenar y transmitir con mqtt el número de veces que se pasa por delante de un sensor PIR. Enviará a un servidor mqtt un resumen de las últimas 24 horas del número de veces que se ha pasado por delante.

sensor

Requisitos:

Tener instalado mosquitto en Linux:

En caso de Ubuntu, linux Mint y Raspberry Pi:

sudo apt-get update ; sudo apt-get install mosquitto mosquitto-clients

Para Openwrt:

opkg-update ; opkg install mosquitto mosquitto-client libmosquitto

Tener instalado Sqlite en Ubuntu, Mint:

sudo apt-get update; sudo apt-get install sqlite3 libsqlite3-dev

Instalación en Openwrt:

opkg update; opkg install libsqlite3 sqlite3-cli

Tener instalado Triggerhappy en Ubuntu, Mint:

sudo apt-get update; sudo apt-get install triggerhappy

Instalación en Openwrt:

opkg update; opkg install triggerhappy

Cada vez que alguien pase por delante del sensor almacenará la fecha y hora en la que se ha detectado ese movimiento. En un servidor mqtt publicará una estadística de activaciones las últimas 24 horas. Publicará algo como lo siguiente:

2016|07|01|00|10
2016|07|01|01|21
2016|07|01|02|2
2016|07|01|07|57
2016|07|01|08|17
2016|07|01|09|2
2016|07|01|10|63
2016|07|01|11|98
2016|07|01|12|47
2016|07|01|13|39
2016|07|01|14|103
2016|07|01|15|98
2016|07|01|16|15
2016|07|01|17|39
2016|07|01|18|79
2016|07|01|19|41
2016|07|01|22|32
2016|07|01|23|35
2016|07|02|00|7
2016|07|02|01|6

En la primera línea se ve que el día 01/07/2106 a entre las 00:00 horas y las 01:00 horas hubo 10 activaciones.
En la segunda línea se ve que el día 01/07/2106 a entre las 01:00 horas y las 02:00 horas hubo 21 activaciones.
Podremos ver que el día 01/07/2106 a entre las 03:00 horas y las 07:00 horas no hubo activaciones.

Siempre mostrará las últimas 24 horas por lo que si consultamos a las 18:00 de la tarde cuantas veces se ha pasado nos mostrará desde las 18:00 horas del día anterior hasta la hora actual.

El sensor de movimiento

Hemos modificado un ratón antiguo al que se le ha añadido un sensor de movimiento. Cada vez que alguien pasa por delante del sensor, éste envía un clic de ratón derecho al sistema operativo. La aplicación triggerhappy estará monitorizando lo pulsado y ejecutará un script cada vez que reciba un clic de ratón derecho.

Para más información consultar otra de las entradas a este blog: http://openwrt.tuinstituto.es/sensor-de-movimiento-pir-conectado-a-un-raton-usb

Una vez instalado triggerhappy crearemos un fichero dentro de /etc/triggerhappy/triggers.d que llamaremos sensor.conf

nano /etc/triggerhappy/triggers.d/sensor.conf

El contenido de dicho archivo tendrá lo siguiente cambiando <usuario> por el que corresponda:

BTN_RIGHT           0         /home/<usuario>/sensor.sh

Creación de la base de datos

Utilizaremos sqlite para almacenar los datos.

Con esto almacenaremos los eventos en una base de datos para poder realizar consultas con sql.

En caso de usar openwrt la ruta /home/<usuario> será /root

El siguiente comando nos generará base de datos en /home/<usuario>/BASEDATOS y crear una tabla llamada eventos con un solo campo llamado fechahora.

/usr/bin/sqlite3 /home/<usuario>/BASEDATOS "CREATE TABLE eventos (fechahora text);";

El script que guarda los datos

El siguiente script se ejecutará cada vez que alguien pase por delante del sensor.

sudo nano /home/<usuario>/sensor.sh

En él meteremos lo siguiente:

#!/bin/bash
# Con openwrt debemos cambiar lo anterior por #!/bin/sh
# Configuración del broker y topic a enviar.
# Cambiar por valores propios las siguientes variables:
broker="test.mosquitto.org" 
port="1883"
topic="movimiento/PIR"
basedatos="/home/<usuario>/BASEDATOS"
# Guardamos la fecha y hora actual en una variable llamada hora
hora=$( date "+%Y-%m-%d %H:%M:%S" );
# Inserto la hora dentro de la tabla eventos en el campo fechahora de la Base de datos 
/usr/bin/sqlite3 $basedatos "INSERT INTO eventos values ('$hora')";
# realizo consulta en base de datos obteniendo la suma de activaciones por hora de las ultimas 24 horas y almaceno en fichero /tmp/last 
/usr/bin/sqlite3 $basedatos "select strftime('%Y',fechahora) as "anno",strftime('%m',fechahora) as "mes",strftime('%d',fechahora) as "dia",strftime('%H',fechahora) as "hora",count(*) from eventos where fechahora > datetime('now','-1 day') group by anno,mes,dia,hora ORDER BY anno,mes,dia,hora;" > /tmp/last
# Obtenemos algo como lo siguiente: 
#2016|06|13|03|5 
#2016|06|13|04|33 
# ... 
#2016|06|14|01|38 
#2016|06|14|02|12
# Publico de golpe el resultado de la consulta 
mosquitto_pub -h $broker -t "$topic" -p $port -r -f /tmp/last

Lo guardamos y le damos permisos de ejecución:

sudo chmod +x /home/<usuario>/sensor.sh

Reiniciamos triggerhappy:

sudo /etc/init.d/triggerhappy restart

Comprobando que funciona

En un ordenador aparte con mosquitto instalado ejecutaremos lo siguiente:

mosquitto_sub -h test.mosquitto.org -t "movimiento/PIR"

Si todo ha ido bien veremos que cada vez que alguien pasa por delante del sensor, iremos recibiendo los datos.

Posible problema

Al realizar las pruebas me doy cuenta que con mi raspberry-pi con Ubuntu server instalado no funciona. el arreglo fue el siguiente:

sudo nano /etc/init.d/triggerhappy

Y cambiamos en la línea:

DAEMON_ARGS="--daemon --triggers /etc/triggerhappy/triggers.d/ --socket /var/run/thd.socket --pidfile $PIDFILE --user nobody /dev/input/event*"

por

DAEMON_ARGS="--daemon --triggers /etc/triggerhappy/triggers.d/ --socket /var/run/thd.socket --pidfile $PIDFILE --user root /dev/input/event*"

Guardamos y reiniciamos el servicio:

sudo /etc/init.d/triggerhappy restart

Esto es debido a que el usuario nobody no puede leer los eventos que se generan.

ATENCIÓN: Este proyecto es preferible que se ejecute sólo en equipos sin escritorio gráfico ya que cada vez que se activa, se nos abriría en el escritorio el menú contextual del clic derecho y puede ser molesto.

2 comentarios en “Contador de presencia con envío por mqtt

    1. En el tutorial está un enlace a como lo hice. http://openwrt.tuinstituto.es/sensor-de-movimiento-pir-conectado-a-un-raton-usb
      Siempre depende del ratón que estés utilizando. Busca un ratón usb que quieras reciclar. Lo conectas a un ordenador. Con un voltímetro vas midiendo voltajes. Pones la punta negra del voltímetro en el negativo y donde consigas 5V al pulsar uno de los botones del ratón será el lugar que conectarás al disparador del ratón. El sensor PIR lo alimentas con los 5 del usb del ratón.
      Saludos.

Deja un comentario

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