Home Detecção de movimento e disparo de vídeo por Telegram
Post
Cancelar

Detecção de movimento e disparo de vídeo por Telegram

Monitore sua casa com custo baixíssimo e sem se preocupar com DVR ou espaço em disco.

Mais que um monitor de movimento, uma webcam é uma poderosíssima ferramenta de automação residencial e de segurança. Usando duas soluções open source e um aplicativo de mensagens, este guia explica como fazer o envio de vídeos curtos sempre que for detectado movimento na câmera.

Requisitos

Motion

Programa de código aberto capaz de interpretar vídeo de câmeras e agir quando houver movimento. É o componente responsável por fazer o monitoramento e gerar um arquivo .mp4 sempre que houver movimento. Além disso, é capaz de fazer streaming da câmera, permitindo a visualização em tempo real do que está acontecendo, além de poder ser integrado ao Home Assistant.

Site: https://motion-project.github.io/

Video2Telegram

Pequeno script Python que monitora uma pasta e, havendo um arquivo novo, o envia pelo aplicativo Telegram. Pode fazer a conversão para gif (Video2Telegram) ou não (Document2Telegram), a depender da preferência.

Repositórios:

Telegram

O aplicativo Telegram é a escolha ideal por ser leve e com armazenamento gratuito na nuvem para arquivos de até 2GB, sem limite de quantidade. Além disso, pode ser acessado de diversos dispositivos, não ficando dependente de um celular o tempo todo.

Configuração

Raspberry Pi

Este guia foi pensado e testado em um Raspberry Pi 3 Model B Rev 1.2 e em um Raspberry Pi Zero 2 W. Pode ser aplicado também em computadores com sistema operacional Linux, desde que compatível com o Motion.

Este guia foi feito usando o sistema Raspberry Pi OS Lite de 11 de Dezembro de 2023. A vantagem da versão Lite é ser mais leve, consumindo menos espaço e recursos computacionais. Como o Raspberry Pi ficará dedicado à solução, sem softwares adicionais, a versão Lite foi a escolhida.

Baixe o sistema operacional de sua preferência no site oficial, em https://www.raspberrypi.com/software/operating-systems/.

Feito o download, crie um disco de boot da imagem baixada.

Criação de disco de boot.
Criação de disco de boot.

Acesso SSH

Para habilitar o acesso via ssh, após a criação da imagem, crie um arquivo chamado ssh na partição de boot.

1
2
cd /media/gabriel/bootfs
touch ssh

Substituindo gabriel pelo usuário de seu computador.

Criação de usuário

Por padrão, o sistema operacional do Raspberry Pi exige a criação de um novo usuário ao ser ligado pela primeira vez. Para pular este passo, recomendo os passos abaixo:

Encripte a senha do usuário

Execute o comando abaixo e armazene seu resultado, pois será usado a seguir.

1
echo '<DIGITE SUA SENHA AQUI>' | openssl passwd -6 -stdin

Crie um arquivo na partição de boot

1
touch userconf

Abra o arquivo userconf criado acima com o editor de sua preferência e cole o conteúdo

1
<USUARIO>:<SENHA ENCRIPTADA>

Ou seja, o arquivo userconf com o usuário gabriel e a senha teste teria, por exemplo, o conteúdo:

1
gabriel:$6$6OITwZhScE7vD4r7$bEGFbmrOqbVCEGp.N5rmu9ca1arqH.ynOxRXMYl6XYLeyXfPIEMaOGr0yr9tY8RKcSBJDEfXHUYva3QWRTR2G.

Atenção: A mesma senha não irá gerar a mesma saída! Não estranhe se o resultado for diferente do exemplo.

Rede

Infelizmente não é mais possível fazer a configuração da conexão à redes sem fio pelo arquivo wpa_supplicant.conf1, portanto, para seguir este guia, recomendo que faça a ligação à sua rede via cabo.

Configuração do Raspberry Pi OS

Feita a configuração inicial, acesse seu Raspberry Pi via ssh.

1
ssh <USUARIO>@<IP RASPBERRY PI>

Atualize os pacotes e instale o Motion.

1
2
sudo apt-get update
sudo apt-get install motion

O Motion irá falhar caso tente executá-lo. Para corrigir o problema, execute os dois comandos:

1
2
sudo mkdir motion:motion /var/log/motion/
sudo chown -R motion:motion /var/log/motion/

O primeiro cria a pasta de log e o segundo dá a permissão correta para esta pasta. Feito isto, o Motion já está pronto para ser usado.

Configuração do Motion

O arquivo de configuração do Motion fica armazenado em /etc/motion/motion.conf. Abaixo listo alguns pontos relevantes e algumas recomendações de mudanças. Por ser um ajuste fino que depende de diversos fatores, como modelo da câmera, intensidade da luz e área monitorada, não existe resposta 100% correta. Cada caso necessita de ajustes específicos.

  • target_dir: Pasta em que ficam os vídeos e fotos do Motion;
  • video_device: Dispositivo de vídeo. Em geral, não precisa ser alterado;
  • width: Largura da imagem. Quanto maior, melhor. Porém, quanto maior, mais pesado o arquivo. Recomendo ao menos 800;
  • height: Altura da imagem. Recomendo ao menos 600;
  • framerate: Taxa de quadros por segundo. Recomendo 30;
  • text_left: Texto exibido na esquerda;
  • text_right: Texto da direita;
  • threshold: Quantidade mínima de pixels que precisam variar para que seja considerado movimento;
  • minimum_motion_frames: Número mínimo de quadros com variação para ser considerado movimento;
  • event_gap: Intervalo em segundos entre eventos. Recomendo 0;
  • pre_capture: Número de quadros anteriores ao movimento para compor o vídeo. Recomendo 2;
  • post_capture: Número de quadros posteriores ao movimento para compor o vídeo. Recomendo 2;
  • movie_max_time: Tamanho máximo do vídeo em segundos. Recomendo 30;
  • movie_quality: Qualidade do vídeo. Recomendo 100;
  • movie_codec: Coded do vídeo. Recomendo mp42;
  • movie_filename: Nome do arquivo de vídeo;
  • webcontrol_localhost: Permitir controle de fora do Raspberry Pi. Recomendo off;
  • stream_localhost: Permitir acesso ao streaming de fora do Raspberry Pi. Recomendo off.

Após toda e qualquer mudança no arquivo motion.conf é necessário reiniciar a aplicação executando:

1
sudo systemctl restart motion

Registros / Log

Para ver o log, acesse o arquivo /var/log/motion/motion.log. Caso necessite visualizar mais detalhes, altere o valor de log_level para 9 no arquivo de configuração.

Streaming

Caso tenha permitido a visualização da câmera no parâmetro stream_localhost, acesse o endereço IP do Raspberry Pi pelo seu navegador pela porta 8080.

Acesso ao streaming da camera.
Acesso via browser ao streaming da camera.

Clicando-se na câmera é possível capturar o endereço direto de seu stream, que pode ser usado no Home Assistant ou em qualquer outro software compatível.

Video2Telegram

Requisitos

1
2
inotify==0.2.10
pyTelegramBotAPI==4.11.0

Arquivo Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import inotify.adapters
import os
import telebot

TOKEN = <TOKEN DO BOT>
FOLDER = <PASTA A SER MONITORADA>
EXTENSION = <EXTENSÃO DO ARQUIVO>
DESTINATION = <ID DE DESTINO>

bot = telegram.Bot(TOKEN)
notifier = inotify.adapters.InotifyTree(FOLDER)

for event in notifier.event_gen():
    if event is not None:
        if 'IN_CLOSE_WRITE' in event[1] and EXTENSION in event[3]:
            file_path = event[2] + '/' + event[3]
            file_open = open(file_path, 'rb')
            try:
                bot.send_chat_action(DESTINATION, 'upload_video')
                bot.send_animation(DESTINATION, file_open)
            except:
                bot.send_chat_action(DESTINATION, 'upload_document')
                bot.send_document(DESTINATION, file_open)
            os.remove(file_path)
Variáveis
  • TOKEN: Token do bot3;
  • FOLDER: Pasta a ser monitorada. Valor padrão: /var/lib/motion;
  • EXTENSION: Extensão de arquivo a ser enviada. Recomendado: mp4
  • DESTINATION: Destino da mensagem no Telegram4.
Envio de gif ou Envio de documento

O código, como mostrado acima, primeiro tenta enviar um gif e, caso falhe, tenta enviar o documento. Isto é, primeiro há a tentativa de conversão do vídeo em gif e, caso ocorra uma falha, o arquivo é enviado sem alteração. Caso prefira o envio sem conversão alguma, remova as linhas 17, 18, 19 e 20, ou seja, remova do código o trecho que contém:

1
2
3
4
            try:
                bot.send_chat_action(DESTINATION, 'upload_video')
                bot.send_animation(DESTINATION, file_open)
            except:

Ajuste a identação, alinhando as duas linhas iniciadas com bot. à linha iniciada com file_open.

A última linha, os.remove(file_path), remove o arquivo após o envio, evitando que o disco do computador fique cheio.

Por fim, execute o script python5.

Câmeras

As câmeras que podem ser usadas com esta solução são as câmeras que funcionam como webcam, câmeras comuns, geralmente que se conectam via porta USB. Para testes foram usadas três:

  • Logitech C920;
  • Logitech C120;
  • Camera V2 para Raspberry Pi.

Todas com resultados satisfatórios, variando apenas a qualidade da imagem de uma câmera para a outra.


  1. https://www.raspberrypi.com/documentation/computers/configuration.html#connect-to-a-wireless-network

  2. Recomendo o uso do codec mp4 por ser um formato que funciona bem com o Telegram. Além disso, caso o vídeo não tenha som, o Telegram automaticamente transforma o mp4 em gif

  3. Como fazer bots para o Telegram

  4. Como obter IDs no Telegram

  5. Como manter um processo rodando para sempre

Esta postagem está licenciada sob CC BY 4.0 pelo autor.