Tabla de contenido:
- Paso 1: Instale Linux Motion en Raspberry
- Paso 2: configura la API de Google Photos para Python
- Paso 3: prueba
- Paso 4: Opcional: configurar el acceso web a la cámara de transmisión en tiempo real
- Paso 5: consejos
Video: Integración de Google Photos con Raspberry Pi Linux Motion: 5 pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:41
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
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
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:
Sistema simple de reserva y estado de Kicker con integración Slack: 12 pasos (con imágenes)
Sistema de reserva y estado de kicker simple con integración de Slack: En una empresa en la que trabajo hay una mesa de kicker. La empresa ocupa muchas plantas y algunos de los empleados tardan hasta 3 minutos en llegar a la mesa y … darse cuenta de que la mesa ya está ocupada, por lo que surgió la idea de construir un ki
Control de persianas con ESP8266, integración de Google Home y Openhab y control web: 5 pasos (con imágenes)
Control de persianas con ESP8266, integración de Google Home y Openhab y Webcontrol: en este Instructable, les muestro cómo agregué automatización a mis persianas. Quería poder agregar y quitar la automatización, por lo que toda la instalación se engancha. Las partes principales son: Motor paso a paso Controlado por controlador paso a paso bij ESP-01 Engranaje y montaje
Sensor de puerta a batería con integración de automatización del hogar, WiFi y ESP-NOW: 5 pasos (con imágenes)
Sensor de puerta a batería con integración de automatización del hogar, WiFi y ESP-NOW: En este instructivo, le muestro cómo hice un sensor de puerta a batería con integración de automatización del hogar. He visto otros buenos sensores y sistemas de alarma, pero quería hacer uno yo mismo. Mis objetivos: un sensor que detecta e informa un doo
Tira de led de 12v controlada por wifi usando Raspberry Pi con Tasker, integración de Ifttt .: 15 pasos (con imágenes)
Tira de LED de 12v controlada por wifi usando Raspberry Pi con Tasker, integración de Ifttt .: En este proyecto, le mostraré cómo controlar una tira de LED analógica de 12v simple a través de wifi usando una Raspberry Pi. Para este proyecto necesitará: 1x Raspberry Pi (I estoy usando una Raspberry Pi 1 Modelo B +) 1x RGB 12v Le
Música inteligente en el dormitorio y el baño con Raspberry Pi: integración de multisala, alarma, control de botones y automatización del hogar: 7 pasos
Música inteligente en el dormitorio y el baño con Raspberry Pi: integración de multisala, alarma, control de botones y automatización del hogar: hoy queremos darte dos ejemplos de cómo puedes usar Raspberry Pi con nuestro software Max2Play para domótica: en el baño y en el dormitorio. . Ambos proyectos son similares en el sentido de que la música de alta fidelidad de varias fuentes se puede transmitir a través de