Índice:
2025 Autor: John Day | [email protected]. Última modificação: 2025-01-13 06:58
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.