Tabla de contenido:

Integración de Google Photos con Raspberry Pi Linux Motion: 5 pasos
Integración de Google Photos con Raspberry Pi Linux Motion: 5 pasos

Video: Integración de Google Photos con Raspberry Pi Linux Motion: 5 pasos

Video: Integración de Google Photos con Raspberry Pi Linux Motion: 5 pasos
Video: Crea tu propio modelo de Machine Learning SIN una línea de CÓDIGO 2024, Noviembre
Anonim
Integración de Google Photos con Raspberry Pi Linux Motion
Integración de Google Photos con Raspberry Pi Linux Motion

La idea es subir fotos y videos hechos con una cámara activada por movimiento conectada a Raspberry Pi para subir archivos a una nube. El software "Motion" admite la carga en Google Drive a través de PyDrive. En este artículo, "Movimiento" se utiliza para subir a Google Fotos.

Hardware:

Frambuesa Pi 3B +

Cámara web USB Logitech C920

La selección de hardware no estaba determinada, simplemente tomé lo que tenía a mano.

Requisitos previos:

Para mayor comodidad, Raspberry pi debe estar en su red local, para controlarla sin monitor / teclado y cargar / descargar archivos. Para ello, debe tener un agente ssh en su PC (por ejemplo, putty).

Muchas gracias a ssandbac por este gran tutorial. Si necesita más información sobre cómo configurar el entorno, consulte este artículo. Tomé prestada la instalación de movimiento y los pasos de configuración y agregué algunos cambios. En particular, en lugar de enviar archivos y alertas por correo electrónico, este ejemplo utiliza la carga en el álbum compartido de fotos de Google y recibe notificaciones como "fotos agregadas" en la barra de notificaciones.

Estos son los pasos:

Paso 1: Instale Linux Motion en Raspberry

Particularmente en este ejemplo se utilizó motion v4.0.

1.1 Actualizar pi

pi @ raspberrypi: ~ $ sudo apt-get update

pi @ raspberrypi: ~ $ sudo apt-get upgrade

1.2 Descargar movimiento

pi @ raspberrypi: ~ $ sudo apt-get install motion

1.3 Ahora edite este archivo con los siguientes cambios

pi @ raspberrypi: ~ $ sudo nano /etc/motion/motion.conf

# Inicie en modo demonio (en segundo plano) y libere el terminal (predeterminado: desactivado)

demonio en

# Use un archivo para guardar los mensajes de registros, si no está definido, se usa stderr y syslog. (predeterminado: no definido)

archivo de registro /var/log/motion/motion.log

# Ancho de imagen (píxeles). Rango válido: depende de la cámara, predeterminado: 352

ancho 1920

# Altura de la imagen (píxeles). Rango válido: depende de la cámara, predeterminado: 288

altura 1080

# Número máximo de fotogramas a capturar por segundo.

velocidad de fotogramas 30

# Especifica el número de imágenes capturadas previamente (almacenadas en búfer) antes del movimiento

pre_captura 5

# Número de fotogramas para capturar después de que ya no se detecta movimiento

post_capture 5

# Salida de imágenes 'normales' cuando se detecta movimiento (predeterminado: activado)

output_pictures desactivado

# La calidad (en porcentaje) que utilizará la compresión jpeg

calidad 100

# Use ffmpeg para codificar películas en tiempo real

ffmpeg_output_movies off

# o el rango 1 - 100 donde 1 significa la peor calidad y 100 es la mejor.

ffmpeg_variable_bitrate 100

# Al crear videos, ¿se deben duplicar los marcos en orden?

ffmpeg_duplicate_frames falso

# Bool para habilitar o deshabilitar extpipe (predeterminado: desactivado)

use_extpipe en

extpipe ffmpeg -y -f rawvideo -pix_fmt yuv420p -video_size% wx% h -framerate% fps -i pipe: 0 -vcodec libx264 -preset ultrafast -f mp4% f.mp4

target_dir / var / lib / motion

# Comando que se ejecutará cuando un archivo de película

; on_movie_end sudo python3 /var/lib/motion/photos.py% f.mp4 &

Deje el último con punto y coma por ahora (comentado) para descomentar después de asegurarse de que la grabación y carga de video funcione.

1.4 Luego cambia

pi @ raspberrypi: ~ $ sudo nano / etc / default / motion

pi @ raspberrypi: ~ $ start_motion_daemon = sí

Paso 2: configura la API de Google Photos para Python

Configurar la API de Google Fotos para Python
Configurar la API de Google Fotos para Python
Configurar la API de Google Fotos para Python
Configurar la API de Google Fotos para Python

2.1 Se recomienda crear una nueva cuenta para este propósito para compartir un álbum con su principal para recibir notificaciones cuando se agregan nuevos archivos, además de más espacio de almacenamiento. Habilite la API de Google Photos para la cuenta que va a usar para cargar.

Debería tener el archivo credentials.json después de esto.

2.2 Configuración del entorno Python

Básicamente, la configuración del entorno se requiere solo en frambuesa. Pero requiere autorización Oauth, que es más conveniente de lograr en la PC. Para hacer esto en frambuesa, debe conectar el monitor / teclado o configurar una interfaz de usuario de escritorio remota. Acabo de instalar el mismo entorno en frambuesa y PC. Entonces, los pasos 2.2.1..2.2.3 se realizaron en PC, 2.2.1, 2.2.2, 2.2.5, 2.2.6 en Rpi

2.2.1 instalar Python 3

2.2.2 Instale los paquetes de la API de Google de acuerdo con el manual * (consulte 5.1)

En PC

pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

En frambuesa

pi @ raspberrypi: ~ $ sudo pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

2.2.3 Echa un vistazo a la carga de secuencias de comandos en las fotos de Google. Se coloca en mi github. Colóquelo en el mismo directorio con credentials.json.

2.2.4 Toma una foto y prueba la carga

python3 photos.py image.jpg

Instale las dependencias faltantes si las hay e inténtelo de nuevo. Como resultado, debería obtener token.pickle en el directorio del script y también un nuevo álbum compartido creado en su interfaz web de Google Fotos con image.jpg. A medida que obtiene token.pickle, ya no necesita credentials.json para photos.py en el mismo directorio.

2.2.5 Comparta el álbum con la cuenta sobre lo que le gustaría recibir notificaciones sobre nuevos medios agregados. Agrega esta cuenta a tu teléfono.

2.2.6 Coloque photos.py y token.pickle en / var / lib / motion en frambuesa. El usuario "pi" no puede escribir en los directorios de "motion", así que cárguelo primero en / home / pi

scp photos.py token.pickle pi @ IP: / home / pi

Luego inicie sesión en frambuesa y mueva los archivos a sudo

ssh pi @ IP

pi @ raspberrypi: ~ $ sudo mv photos.py token.pickle / var / lib / motion

2.2.7 Compruebe cómo funciona la carga en frambuesa. Toma una foto con fswebcam e intenta subirla

pi @ raspberrypi: ~ $ sudo fswebcam /var/lib/motion/image.jpg

pi @ raspberrypi: ~ $ sudo python3 /var/lib/motion/photos.py /var/lib/motion/image.jpg

Debería haber image-j.webp

Paso 3: prueba

3.1 Iniciar el servicio Motion

pi @ raspberrypi: ~ $ sudo service motion start

Puede cambiar el comando a "detener" o "reiniciar"

3.2 Habilitar registros de movimiento

pi @ raspberrypi: ~ $ tail -f /var/log/motion/motion.log

3.2 Vea la salida de la cámara en otro dispositivo conectado a la misma red local. Ingrese en el navegador:

IP: 8081

3.3 Mirando los registros, espere hasta que se detecte el movimiento y el archivo NAME.mp4 se escriba en / var / lib / motion. Luego, inicie la carga de secuencias de comandos manualmente

pi @ raspberrypi: ~ $ sudo python3 /var/lib/motion/photos.py /var/lib/motion/NAME.mp4

Verifique los rastros de Python. Espere hasta que event_end aparezca en motion.log. Luego vaya al álbum "helloworld" en sus fotos de Google y verifique si hay un video subido.

3.4 Si la carga se realiza correctamente, descomente en /etc/motion.conf la línea:

pi @ raspberrypi: ~ $ sudo nano /etc/motion.conf

# Comando que se ejecutará cuando un archivo de película esté listo

on_movie_end sudo python3 /var/lib/motion/photos.py% f.mp4 &

pi @ raspberrypi: ~ $ sincronización

pi @ raspberrypi: ~ $ sudo service motion reiniciar

3.5 Mirando los registros de movimiento y en el álbum, verifique si el video se cargó automáticamente.

3.6 Opcionalmente, comparta el álbum con su cuenta principal para recibir una notificación cuando se agregue el nuevo video o foto.

Paso 4: Opcional: configurar el acceso web a la cámara de transmisión en tiempo real

Opcional: configurar el acceso web a la cámara de transmisión en tiempo real
Opcional: configurar el acceso web a la cámara de transmisión en tiempo real
Opcional: configurar el acceso web a la cámara de transmisión en tiempo real
Opcional: configurar el acceso web a la cámara de transmisión en tiempo real
Opcional: configurar el acceso web a la cámara de transmisión en tiempo real
Opcional: configurar el acceso web a la cámara de transmisión en tiempo real

Este paso se basa en el tutorial de Parreno de Michel. Simplemente elegí FreeDNS en lugar de NoIP como se recomienda aquí.

4.1 Configure el acceso autorizado al servidor de movimiento de transmisión de video:

pi @ raspberrypi: ~ $ sudo nano /etc/motion/motion.conf

# Establecer el método de autenticación (predeterminado: 0)

# 0 = deshabilitado

# 1 = Autenticación básica

# 2 = MD5 digest (la autenticación más segura)

stream_auth_method 2

# Autenticación para la transmisión. Nombre de usuario de sintaxis: contraseña

# Predeterminado: no definido (deshabilitado)

webcontrol_authentication nombre de usuario: contraseña

# Velocidad de fotogramas máxima para transmisiones (predeterminado: 1)

stream_maxrate 30

# Restringir las conexiones de transmisión solo a localhost (predeterminado: activado)

stream_localhost desactivado

Si no va a utilizar la interfaz de control web desde una red externa, déjela deshabilitada (por defecto)

# Restringir las conexiones de control solo a localhost (predeterminado: activado)

webcontrol_localhost en

Además, dado que frambuesa se conecta, recomiendo cambiar la contraseña predeterminada de frambuesa.

pi @ raspberrypi: ~ $ contraseña

Aunque el puerto ssh 22 no se redirige a la frambuesa, todavía.

4.2 Ir al sitio de FreeDNS

4.3 Registrarse

4.4 Agregar subdominio (para miembros -> subdominios)

4.5 Elija el cliente DNS para instalar en Raspberry (para miembros -> DNS dinámico -> Recursos de DNS dinámico -> Clientes de DNS dinámico)

Elegí wget_script update.sh de Adam Dean (en la parte inferior de la página)

Hay marcadores de posición _YOURAPIKEYHERE_ y _YOURDOMAINHERE_. Para obtenerlos, vaya a (Para miembros -> DNS dinámico)

Y en la página siguiente encontrará ejemplos de scripts con su APIKEY y DOMAIN (el que se agregó en 4.4). Tomé estos valores de Wget Script y reemplacé _YOURAPIKEYHERE_ y _YOURDOMAINHERE_ en update.sh

4.6 Luego ejecute update.sh en frambuesa. Puede requerir dnsutils para nslookup. Instálelo entonces:

pi @ raspberrypi: ~ $ sudo apt-get dnsutils

4.7 Luego configure su enrutador para redirigir las solicitudes del mundo externo al puerto 8081 a la ip de la frambuesa

4.8 Reserve la ip para el MAC de su frambuesa en la configuración de DHCP para que Rpi siempre tenga la misma ip

4.9 Luego ingrese en el navegador en un dispositivo que no esté conectado a la red local:

tudominio: 8081

Ingrese sus credenciales que definió en motion.conf.

Prueba cómo funciona el video.

4.10 para actualizar DDNS, configure automáticamente la tarea cron. Consulte quick_cron_example en (para miembros -> DNS dinámico)

Paso 5: consejos

5.1 Esté atento a la instalación de paquetes de Python en Raspberry. Pasé un día depurando esto: el problema era que desde la consola el script se ejecutaba bien, pero la llamada desde la devolución de llamada del evento de movimiento no. Lo que empeoró las cosas fue que los rastros del guión no estaban disponibles en el último caso.

La razón fue que siguiendo la guía instalé los paquetes para el usuario 'pi' (que por defecto está en el directorio / home / pi y está restringido para otros usuarios) pero para ejecutar el script como hijo del servicio 'motion' los paquetes deben ser disponible también para usuarios de "movimiento". Así que finalmente lo arreglé instalando los paquetes como

sudo pip3…

Esta no es una forma adecuada, todavía funciona. La instalación sin sudo como pip3 --system me estaba dando errores por alguna razón.

En consecuencia, el script también se llama bajo sudo (consulte motion.conf).

Durante esta resolución de problemas, hice muchos cambios innecesarios y no estoy seguro de qué son necesarios y ahora soy demasiado perezoso para revertirlos gradualmente y ver cuándo deja de funcionar. En particular, derechos de administrador de movimiento otorgados:

pi @ raspberrypi: ~ $ grupos de movimiento

movimiento: movimiento adm sudo usuarios de audio y video netdev pi

pi @ raspberrypi: ~ $ sudo cat /etc/sudoers.d/010_pi-nopasswd

pi TODOS = (TODOS) NOPASSWD: TODOS

movimiento ALL = (ALL) NOPASSWD: ALL

También se cambiaron los propietarios y los permisos de los archivos de manera similar a la carga en Google Drive. Probablemente le pueda ayudar en caso de que tenga un problema similar.

5.2 La API de Google Photos permite agregar archivos a álbumes compartidos solo para que cualquier persona con el enlace pueda acceder a ellos. No lo comparta por enlace y elimine películas antiguas ni las mueva a la papelera o del álbum. En este último caso, permanecen en la cuenta.

5.3 El asistente de fotos de Google detecta rostros, lo cual es bastante útil si la calidad de la cámara es buena. Como beneficio adicional, hace recopilaciones y gifs de medios sofisticados, etc.

5.4 Intenté usar un módem USB 4G LTE para el acceso a Internet y aquí están mis resultados 5.4.1 Huawei E3372h-153 funciona con frambuesa sin problemas y software adicional 5.4.2 También habilitó el punto de acceso para que Rasperry compartiera la conexión a Internet a través de wifi. Hay https://howtoraspberrypi.com/create-a-wi-fi-hotspot-in-less-than-10-minutes-with-pi-raspberry/ una guía realmente fácil de cómo hacerlo usando RaspAP. 5.4.3 El DNS dinámico no funcionó en la red 4G de mi carro. Hay una explicación por qué

5.5 Después de usar este sistema durante un par de semanas, aunque los videos son más convenientes para ver y cargar, Google Photos funciona mejor con imágenes. Por ejemplo, permite agrupar cosas / caras analizando solo imágenes, y solo entonces buscar caras / cosas de las imágenes en los videos, pero no al revés. Así que voy a probar imágenes subiendo más bien videos.

Recomendado: