
Índice:
2025 Autor: John Day | [email protected]. Última modificação: 2025-01-23 15:03

A ideia é fazer upload de fotos e vídeos feitos com câmera ativada por movimento conectada ao Raspberry Pi para fazer upload de arquivos para uma nuvem. O software ‘Motion’ suporta o upload para o Google Drive por meio do PyDrive. Neste artigo, ‘Motion’ é usado para fazer upload para o Google Fotos.
Hardware:
Raspberry Pi 3B +
Webcam USB Logitech C920
A seleção do hardware não foi determinada, eu apenas peguei o que estava em mãos.
Pré-requisitos:
Por conveniência, o Raspberry pi deve estar em sua rede local - para controlá-lo sem monitor / teclado e fazer upload / download de arquivos. Para isso, você deve ter um agente ssh em seu PC (por exemplo, putty).
Muito obrigado a ssandbac por um ótimo tutorial. Se você precisar de mais informações sobre como configurar o ambiente, consulte este artigo. Peguei emprestado a instalação do movimento e as etapas de configuração dele e adicionei algumas alterações. Em particular, em vez de enviar arquivos e alertas por e-mail, este exemplo usa o upload para o álbum compartilhado de fotos do Google e recebe notificações do tipo “fotos adicionadas” na barra de notificação.
Aqui estão as etapas:
Etapa 1: Instale o Linux Motion no Raspberry
Particularmente neste exemplo foi usado o motion v4.0.
1.1 Atualizar pi
pi @ raspberrypi: ~ $ sudo apt-get update
pi @ raspberrypi: ~ $ sudo apt-get upgrade
1.2 Baixar movimento
pi @ raspberrypi: ~ $ sudo apt-get install motion
1.3 Agora edite este arquivo com as seguintes alterações
pi @ raspberrypi: ~ $ sudo nano /etc/motion/motion.conf
# Inicie no modo daemon (plano de fundo) e libere o terminal (padrão: desligado)
daemon em
# Use um arquivo para salvar mensagens de log, se não for definido, stderr e syslog são usados. (padrão: não definido)
logfile /var/log/motion/motion.log
# Largura da imagem (pixels). Intervalo válido: dependente da câmera, padrão: 352
largura 1920
# Altura da imagem (pixels). Intervalo válido: dependente da câmera, padrão: 288
altura 1080
# Número máximo de quadros a serem capturados por segundo.
taxa de quadros 30
# Especifica o número de imagens pré-capturadas (armazenadas em buffer) antes do movimento
pre_capture 5
# Número de quadros a capturar após o movimento não ser mais detectado
post_capture 5
# Produz imagens 'normais' quando movimento é detectado (padrão: ativado)
output_pictures off
# A qualidade (em porcentagem) a ser usada pela compressão jpeg
qualidade 100
# Use ffmpeg para codificar filmes em tempo real
ffmpeg_output_movies off
# ou o intervalo de 1 a 100, em que 1 significa a pior qualidade e 100 a melhor.
ffmpeg_variable_bitrate 100
# Ao criar vídeos, os quadros devem ser duplicados em ordem
ffmpeg_duplicate_frames false
# Bool para habilitar ou desabilitar extpipe (padrão: desligado)
use_extpipe em
extpipe ffmpeg -y -f rawvideo -pix_fmt yuv420p -video_size% wx% h -framerate% fps -i pipe: 0 -vcodec libx264 -preset ultrarrápido -f mp4% f.mp4
target_dir / var / lib / motion
# Comando a ser executado quando um arquivo de filme
; on_movie_end sudo python3 /var/lib/motion/photos.py% f.mp4 &
Deixe o último com ponto-e-vírgula por enquanto (comentado) para descomentar depois de garantir que a gravação e o upload do vídeo funcionem.
1.4 Em seguida, mude
pi @ raspberrypi: ~ $ sudo nano / etc / default / motion
pi @ raspberrypi: ~ $ start_motion_daemon = yes
Etapa 2: configurar a API do Google Fotos para Python


2.1 Recomendado para criar uma nova conta com esta finalidade para compartilhar um álbum com o principal para receber notificações quando novos arquivos adicionados, além de mais espaço de armazenamento. Ative a API do Google Fotos para a conta que você usará para fazer uploads.
Você deve ter o arquivo credentials.json depois disso.
2.2 Configuração do ambiente Python
Basicamente, a configuração do ambiente é necessária apenas no Raspberry. Mas requer autorização oauth, que é mais conveniente de realizar no PC. Para fazer isso no raspberry, você precisa conectar o monitor / teclado a ele ou configurar uma IU de área de trabalho remota. Acabei de instalar o mesmo ambiente no Raspberry e no PC. Portanto, as etapas 2.2.1..2.2.3 foram feitas no PC, 2.2.1, 2.2.2, 2.2.5, 2.2.6 no Rpi
2.2.1 instalar o Python 3
2.2.2 Instale os pacotes API do Google de acordo com o manual * (consulte 5.1)
No PC
pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
Na framboesa
pi @ raspberrypi: ~ $ sudo pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
2.2.3 Verifique o script de upload para o google photos.. Ele é colocado no meu github. Coloque-o no mesmo diretório com credentials.json.
2.2.4 Tire uma foto e teste o upload
python3 photos.py image.jpg
Instale as dependências ausentes, se houver, e tente novamente. Como resultado, você deve obter token.pickle no diretório do script e também um novo álbum compartilhado criado na interface da web do Google Fotos com image.jpg. Conforme você obtém token.pickle, não precisa mais de credentials.json para photos.py no mesmo diretório.
2.2.5 Compartilhe o álbum com a conta sobre o que você gostaria de receber notificações sobre novas mídias adicionadas. Adicione esta conta ao seu telefone.
2.2.6 Coloque photos.py e token.pickle em / var / lib / motion no raspberry. O usuário ‘pi’ não pode escrever no diretório ‘motion’, então carregue em / home / pi primeiro
scp photos.py token.pickle pi @ IP: / home / pi
Em seguida, faça login no raspberry e mova os arquivos em sudo
ssh pi @ IP
pi @ raspberrypi: ~ $ sudo mv photos.py token.pickle / var / lib / motion
2.2.7 Verifique como o upload funciona no Raspberry. Tire uma foto com fswebcam e tente carregá-la
pi @ raspberrypi: ~ $ sudo fswebcam /var/lib/motion/image.jpg
pi @ raspberrypi: ~ $ sudo python3 /var/lib/motion/photos.py /var/lib/motion/image.jpg
Deve haver image-j.webp
Etapa 3: Teste
3.1 Serviço Start Motion
pi @ raspberrypi: ~ $ sudo service motion start
Você pode alterar o comando para "parar" ou "reiniciar"
3.2 Habilitar registros de movimento
pi @ raspberrypi: ~ $ tail -f /var/log/motion/motion.log
3.2 Visualize a saída da câmera em outro dispositivo conectado à mesma rede local. Digite no navegador:
IP: 8081
3.3 Olhando os logs, espere até que o movimento seja detectado e o arquivo NAME.mp4 seja escrito em / var / lib / motion. Em seguida, inicie o script de upload manualmente
pi @ raspberrypi: ~ $ sudo python3 /var/lib/motion/photos.py /var/lib/motion/NAME.mp4
Verifique os rastros do python. Espere até que event_end apareça em motion.log. Em seguida, vá para o álbum “helloworld” em suas fotos do google e verifique se há um vídeo carregado.
3.4 Se o upload for bem-sucedido, descomente em /etc/motion.conf a linha:
pi @ raspberrypi: ~ $ sudo nano /etc/motion.conf
# Comando a ser executado quando um arquivo de filme estiver pronto
on_movie_end sudo python3 /var/lib/motion/photos.py% f.mp4 &
pi @ raspberrypi: ~ $ sync
pi @ raspberrypi: ~ $ sudo service motion restart
3.5 Olhando os registros de movimento e no álbum, verifique se o vídeo foi carregado automaticamente.
3.6 Opcionalmente, compartilhe o álbum com sua conta principal para obter uma notificação quando o novo vídeo ou foto for adicionado.
Etapa 4: Opcional: configurar o acesso à Web para a câmera de streaming em tempo real



Esta etapa é baseada no tutorial Parreno de Michel. Eu apenas escolhi FreeDNS em vez de NoIP, conforme recomendado aqui.
4.1 Configure o acesso autorizado ao servidor de streaming de vídeo:
pi @ raspberrypi: ~ $ sudo nano /etc/motion/motion.conf
# Defina o método de autenticação (padrão: 0)
# 0 = desativado
# 1 = autenticação básica
# 2 = resumo MD5 (a autenticação mais segura)
stream_auth_method 2
# Autenticação para o stream. Sintaxe de nome de usuário: senha
# Padrão: não definido (desabilitado)
webcontrol_authentication nome de usuário: senha
# Velocidade máxima de quadros para streams de fluxo (padrão: 1)
stream_maxrate 30
# Restringir conexões de fluxo apenas para localhost (padrão: ativado)
stream_localhost desligado
Se você não for usar a interface de controle da web de uma rede externa, deixe-a desabilitada (como padrão)
# Restringir as conexões de controle apenas ao host local (padrão: ativado)
webcontrol_localhost em
Além disso, como o raspberry está online, recomendo alterar a senha padrão do raspberry
pi @ raspberrypi: ~ $ passwd
Embora a porta 22 do ssh não seja redirecionada para o framboesa, ainda.
4.2 Vá para o site FreeDNS
4.3 Inscreva-se
4.4 Adicionar subdomínio (para membros -> Subdomínios)
4.5 Escolha o cliente DNS para instalar no Raspberry (para membros -> DNS dinâmico -> Recursos de DNS sincronizado -> Clientes de DNS dinâmico)
Eu escolhi wget_script update.sh de Adam Dean (na parte inferior da página)
Existem marcadores de posição _YOURAPIKEYHERE_ e _YOURDOMAINHERE_. Para obtê-los, vá para (Para membros -> DNS dinâmico)
E na página abaixo você encontrará exemplos de scripts com APIKEY e DOMAIN (aquele adicionado em 4.4). Peguei esses valores do Wget Script e substituí _YOURAPIKEYHERE_ e _YOURDOMAINHERE_ em update.sh
4.6 Em seguida, execute update.sh no raspberry. Pode requerer dnsutils para nslookup. Instale-o então:
pi @ raspberrypi: ~ $ sudo apt-get dnsutils
4.7 Em seguida, configure seu roteador para redirecionar as solicitações mundiais externas para a porta 8081 para o ip do raspberry
4.8 Reserve o ip para o MAC do seu raspberry na configuração DHCP para que o Rpi sempre tenha o mesmo ip
4.9 Em seguida, entre no navegador em um dispositivo que não esteja conectado à rede local:
seudominio: 8081
Insira suas credenciais que você definiu em motion.conf.
Teste como o vídeo funciona.
4.10, a fim de atualizar o DDNS, configure automaticamente a tarefa cron. Veja quick_cron_example em (para membros -> DNS dinâmico)
Etapa 5: dicas
5.1 Fique atento ao instalar pacotes python no raspberry. Passei um dia depurando isso - o problema era que, no console, o script funcionava bem, mas ser chamado de um retorno de chamada de evento de movimento não. O que tornou tudo pior foi que os rastros do script não estavam disponíveis no último caso.
A razão foi que seguindo o guia eu instalei os pacotes para o usuário 'pi' (que por padrão está no diretório / home / pi e restrito para outros usuários), mas para executar o script como um filho do serviço 'motion', os pacotes devem ser disponível para o usuário 'motion' também. Então, finalmente resolvi instalar os pacotes como
sudo pip3 …
Esta não é uma maneira adequada ainda funciona. Instalação sem sudo como pip3 --system estava me dando erros por algum motivo.
Da mesma forma, o script é chamado também em sudo (consulte motion.conf).
Durante esta solução de problemas, fiz várias alterações desnecessárias e não tenho certeza do que é necessário e agora estou com preguiça de revertê-las gradativamente e ver quando ele para de funcionar. Particularmente, direitos de administrador de movimento concedidos:
pi @ raspberrypi: ~ $ groups motion
motion: motion adm sudo usuários de áudio e vídeo netdev pi
pi @ raspberrypi: ~ $ sudo cat /etc/sudoers.d/010_pi-nopasswd
pi ALL = (ALL) NOPASSWD: ALL
movimento ALL = (ALL) NOPASSWD: ALL
Também estava mudando os proprietários de arquivos e permissões semelhantes ao upload para o Google Drive. Provavelmente, isso pode ajudá-lo no caso de você ter um problema semelhante.
5.2 A API do Google Fotos permite adicionar arquivos a álbuns compartilhados apenas para que qualquer pessoa com o link possa acessá-los. Não compartilhe por link e exclua filmes antigos ou mova-os para a lixeira ou do álbum. Neste último caso, eles permanecem na conta.
5.3 O assistente de fotos do Google detecta rostos, o que é bastante útil se a qualidade da câmera for boa. Como um bônus, ele cria compilações e gifs de mídia sofisticada, etc.
5.4 Tentei usar o modem USB 4G LTE para acessar a internet e aqui estão meus resultados.5.4.1 Huawei E3372h-153 funciona com o raspberry sem problemas e software extra 5.4.2 Também habilitou o hotspot para que o Rasperry compartilhasse a conexão à internet via wi-fi. Há https://howtoraspberrypi.com/create-a-wi-fi-hotspot-in-less-than-10-minutes-with-pi-raspberry/ um guia realmente fácil de como fazer isso usando RaspAP. 5.4.3 DNS dinâmico não funcionou na rede 4G da minha carrie. Há uma explicação do porque
5.5 Depois de usar este sistema por algumas semanas acabou, embora os vídeos sejam mais convenientes para ver e fazer upload, o Google Fotos funciona melhor com imagens. Por exemplo, permite agrupar coisas / rostos analisando imagens apenas, e só então procurando rostos / coisas das imagens em vídeos, mas não o contrário. Então, vou testar imagens enviando, em vez de vídeos.
Recomendado:
Abridor de porta de garagem inteligente DIY + Integração com Assistente de casa: 5 etapas

DIY Smart Garage Door Opener + Home Assistant Integration: Transforme sua porta normal de garagem em algo inteligente usando este projeto DIY. Vou mostrar a você como construí-lo e controlá-lo usando o Home Assistant (sobre MQTT) e ter a capacidade de abrir e fechar remotamente a porta de sua garagem. Usarei uma placa ESP8266 chamada Wemos
DIY Smart Doorbell: Código, Configuração e Integração HA: 7 etapas (com imagens)

DIY Smart Doorbell: Code, Setup and HA Integration: Neste projeto, vou mostrar como você pode transformar sua campainha normal em uma inteligente sem alterar nenhuma das funcionalidades atuais ou cortar quaisquer fios. Usarei uma placa ESP8266 chamada Wemos D1 mini. Novo para ESP8266? Veja meu Introdu
Controle de cortinas com ESP8266, integração do Google Home e Openhab e controle da Web: 5 etapas (com fotos)

Controle de persianas com ESP8266, Google Home e Openhab Integração e Webcontrol: Neste Instructable, mostro como adicionei automação às minhas persianas. Eu queria ser capaz de adicionar e remover a automação, então toda a instalação é presa. As partes principais são: Motor de passo Motor de passo controlado por ESP-01 Engrenagem e montagem
Sensor de porta alimentado por bateria com integração de automação residencial, WiFi e ESP-NOW: 5 etapas (com fotos)

Sensor de porta movido a bateria com integração de automação residencial, WiFi e ESP-NOW: Neste instrutível, mostro como fiz um sensor de porta movido a bateria com integração de automação residencial. Eu vi alguns outros sensores e sistemas de alarme legais, mas eu queria fazer um para mim. Meus objetivos: Um sensor que detecta e relata um doo
Faixa LED de 12v controlada por Wi-Fi usando Raspberry Pi com Tasker, Integração Ifttt: 15 etapas (com fotos)

Faixa de Led 12v controlada por wi-fi usando Raspberry Pi com Tasker, Integração Ifttt .: Neste projeto irei mostrar como controlar uma faixa de led analógico 12v simples sobre wi-fi usando um pi de framboesa. Para este projeto você vai precisar de: 1x Raspberry Pi (I estou usando um Raspberry Pi 1 Modelo B +) 1x RGB 12v Le