Monitoreo de Raspberry Pi GPIO con MotionEyeOS

motionEyeOS es un sistema increíble para crear cámaras de seguridad con computadoras de placa única. Esto puede incluir sistemas para monitorear mascotas o ladrones. Tiene una serie de características agradables bajo el capó y una de esas características es la capacidad de monitorear los pines GPIO y mostrar información dentro de la interfaz web de motionEyeOS.

La función de «supervisión» le permite ejecutar un script bash a intervalos regulares y superponer la salida de texto en la interfaz web. Esto podría usarse para mostrar el estado de los pines GPIO u otros datos, como la temperatura de la CPU, las lecturas del sensor, etc.

Quería usar esta función para mostrar el estado de mis dos puertas de garaje. Tienen interruptores magnéticos, así que decidí configurar MotionEyeOS para mostrar su estado dado que la Raspberry Pi ya está configurada en la misma ubicación. Los interruptores de las puertas conectan un pin GPIO a 3.3V. Cuando se abre la puerta, la conexión se interrumpe y las resistencias desplegables internas de la Pi bajan el pin GPIO.

La función de comando de monitoreo se describe en MotionEye Wiki. En general, es lo mismo que motionEyeOS con la excepción de la ruta del archivo que debe usar.

Para empezar, podemos crear un script para monitorear un solo pin GPIO. Asegúrese de tener un sistema que funcione y de poder ver la salida de su cámara a través de la interfaz web de motionEyeOS.

Paso 1: crear un guión

Usando SSH conéctese al Pi. SSH está habilitado de forma predeterminada y debe usar la cuenta de usuario «admin» con la contraseña que estableció en la configuración. Si no ha cambiado la contraseña predeterminada, estará en blanco, pero le recomiendo que configure una contraseña decente y no la deje en el valor predeterminado.

Navegue al directorio etc:

cd /data/etc/

y cree un archivo en blanco llamado «monitor_1»:

nano monitor_1

El «1» se refiere a la cámara con ID 1. Si tiene más de una cámara, puede agregar un archivo «monitor_#» separado para cada una. Una segunda cámara puede usar «monitor_2», etc.

Escribe o pega lo siguiente:

 #!/bin/bash  GPIO=17  test -e /sys/class/gpio/gpio€GPIO ||    (echo €GPIO > /sys/class/gpio/export    && echo in > /sys/class/gpio/gpio€GPIO/direction)  val=€(cat /sys/class/gpio/gpio€GPIO/value)  if [ "€val" == "1" ]; then  GPIO_text="HIGH" else  GPIO_text="LOW" fi echo "€GPIO:€GPIO_text" echo 1 1>&2 

Salga del editor nano usando CTRL-X, Y y [Enter].

Este archivo también está disponible en mi repositorio de BitBucket. Es mejor copiar el texto del archivo monitor_1 en BitBucket y evitar posibles problemas de formato en esta página web.

El comando «test» comprueba si el pin GPIO ya se ha configurado. Si no tiene, se ejecutan dos comandos de eco para configurar el pin como entrada. Por lo general, estos estarán vinculados por defecto a Low con resistencias pull-down internas. Sin conexiones, el valor será 0/Bajo. Conectar el pin a 3.3V cambiará el estado a 1/Alto.

Paso 2: hacer ejecutable

Ahora haga que este script sea ejecutable:

chmod +x monitor_1

Paso 3: Guión de prueba

Para probar que su secuencia de comandos se ejecuta sin errores, puede escribir:

sh ./monitor_1

La salida debe reflejar el texto definido en las declaraciones de eco y no debe haber errores.

Paso 4: recargar la interfaz web

Cuando se agregan, eliminan o editan secuencias de comandos del monitor, la interfaz web debe volver a cargarse en su navegador para que los cambios surtan efecto. Al hacer clic en la imagen de la cámara, se mostrarán los iconos en la parte superior derecha y el estado del GPIO en la parte inferior izquierda:

Ahora cambie el estado del interruptor conectado a GPIO 17. Debería ver el cambio de texto en la pantalla. El texto «17: ALTO» se puede cambiar a lo que desee definir en el script bash.

Paso 5: agregue lectura GPIO adicional

El script bash ahora se puede modificar para leer más de un pin GPIO y el resultado se puede combinar en una sola salida para mostrar en la pantalla. En el siguiente ejemplo, el script verifica GPIO 17 y 27. Sus estados se combinan en una sola salida.

 #!/bin/bash  GPIOA=17 GPIOB=27  test -e /sys/class/gpio/gpio€GPIOA ||    (echo €GPIOA > /sys/class/gpio/export     && echo in > /sys/class/gpio/gpio€GPIOA/direction) test -e /sys/class/gpio/gpio€GPIOB ||   (echo €GPIOB > /sys/class/gpio/export     && echo in > /sys/class/gpio/gpio€GPIOB/direction)  valA=€(cat /sys/class/gpio/gpio€GPIOA/value) valB=€(cat /sys/class/gpio/gpio€GPIOB/value)  if [ "€valA" == "1" ]; then     GPIOA_text="HIGH" else     GPIOA_text="LOW" fi  if [ "€valB" == "1" ]; then     GPIOB_text="HIGH" else     GPIOB_text="LOW" fi echo "€GPIOA:€GPIOA_text  €GPIOB:€GPIOB_text" echo 1 1>&2 

Este archivo también está disponible en mi repositorio de BitBucket. Es mejor copiar el texto del archivo monitor_1_twin en BitBucket y evitar problemas de formato en esta página web.

No olvides hacerlo ejecutable:

chmod +x monitor_1

Paso 6: ajustar el texto

Para mi guión final, ajusté la visualización del texto para que fuera más relevante para la situación de mi puerta de garaje. El script se puede ver siguiendo el enlace de BitBucket a motion_1_doors.

Produce una línea de texto que muestra el estado de cada puerta. D1 está a la izquierda y D2 a la derecha. La siguiente captura de pantalla fue tomada de mi teléfono inteligente y ahora muestra el estado de las dos puertas de garaje:

Una cosa que noté fue que el texto de actualización estaba truncado en mi teléfono inteligente. Ajusté los elementos de texto para evitar esto. Fue la razón por la que usé «CERRADO» en lugar de «CERRADO». En mi teléfono, el límite parecía ser de 17 caracteres, pero sospecho que esto variará en otros dispositivos. En un navegador de escritorio no tuve ningún problema con el texto truncado.

Frecuencia del guión

De forma predeterminada, el script se ejecuta una vez por segundo. Puede cambiar esto ajustando el número en la última línea al final del script:

echo 5 1>&2

Esto le indicará a motionEyeOS que no ejecute el script durante otros 5 segundos.

La única desventaja que pude encontrar al aumentar la demora es que también aumenta el tiempo que se tarda en mostrar la primera lectura cuando inicialmente hace clic en la imagen de la cámara.

Solución de problemas

Si no funciona, tenga en cuenta los siguientes puntos:

  • Asegúrate de que el archivo sea ejecutable.
  • Asegúrate de que el archivo no tenga extensión.
  • Asegúrese de que use la ID de cámara correcta (es decir, monitor_1 para la cámara #1, etc.)
  • Vuelva a verificar la sintaxis en su script
  • Pruebe el script por sí solo como se muestra en el Paso 3
  • El script debería regresar inmediatamente y no debería bloquearse.

Nota: he usado un carácter «» en los scripts de Bash que se muestran arriba para dividir líneas largas. Esto fue puramente con fines de visualización. Si echa un vistazo a las versiones de BitBucket de monitor_1 y monitor_1_twin, el comando «prueba» está todo en una línea.

Conclusiones finales

Tendrá que decidir si esta técnica se adaptará a sus propósitos. Lo que no hace es proporcionar notificaciones o alertas. En mi ejemplo, muestra el estado actual de las puertas pero nada más. La utilidad de esto dependerá de sus expectativas. Sin embargo, es ciertamente una característica útil a tener en cuenta.