Integração do Raspberry Pi Linux Motion com o Google Fotos: 5 etapas
Integração do Raspberry Pi Linux Motion com o Google Fotos: 5 etapas
Anonim
Integração do Raspberry Pi Linux Motion com o Google Fotos
Integração do Raspberry Pi Linux Motion com o Google Fotos

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

Configure a API do Google Fotos para Python
Configure a API do Google Fotos para Python
Configure a API do Google Fotos para Python
Configure 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

Opcional: configure o acesso à web para a câmera de streaming em tempo real
Opcional: configure o acesso à web para a câmera de streaming em tempo real
Opcional: configure o acesso à web para a câmera de streaming em tempo real
Opcional: configure o acesso à web para a câmera de streaming em tempo real
Opcional: configure o acesso à web para a câmera de streaming em tempo real
Opcional: configure 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.