Como executar o software da webcam apenas quando não estou em casa (o telefone não está na rede local)?

6

Atualmente, tenho o meu cron do usuário iniciando Motion em um timer quando eu normalmente saio para o trabalho , e depois o mato quando eu normalmente chego em casa, então eu posso assistir meus gatos / assaltantes / etc:

0 9 * * * killall motion ; motion
30 18 * * * killall motion

O arquivo de configuração usado é ~/.motion/motion.conf e tem daemon on .

Mas seria melhor se pudesse detectar quando estou realmente em casa e desativar a webcam durante esses horários e ativá-la em outros momentos. Eu estava pensando que minha presença poderia ser detectada pelo meu telefone Android se juntar à LAN. Então, algo parecido com

  1. Um script que verifica a intervalos de alguns minutos se o nome de host ou endereço MAC do meu telefone está atualmente na LAN
  2. Um script Tasker no meu telefone que entra em contato com o computador doméstico de alguma forma (servidor da Web simples?) quando se associa a um determinado SSID
  3. Uma combinação dos itens acima
  4. ...

Quaisquer melhores ideias ou conselhos sobre como implementar um destes? O Tasker é fácil de usar, mas custa US $ 6, portanto, uma solução que não depende disso seria útil para um público mais amplo.

Minha primeira tentativa na solução arp-scan não funciona muito bem. Ele cria várias instâncias de motion e não detecta o telefone de forma confiável, fazendo com que a câmera seja ligada e desligada esporadicamente. Então, talvez seja mais como "verifique cada minuto se o telefone estiver presente. ligue a câmera apenas se o telefone não for visto por 15 minutos".

Ok, eu escrevi um script python para fazer uma varredura arp uma vez por minuto e ele detecta o telefone perfeitamente:

2012-11-27 18:29:10.551552 No
2012-11-27 18:30:22.295997 No
2012-11-27 18:31:34.077431 No
2012-11-27 18:32:45.804675 No
2012-11-27 18:33:57.545211 No
2012-11-27 18:35:09.261680 No
2012-11-27 18:36:20.974378 Yes
2012-11-27 18:37:21.901076 Yes
2012-11-27 18:38:22.417423 Yes
2012-11-27 18:39:22.836101 Yes
2012-11-27 18:40:23.463507 Yes
2012-11-27 18:41:23.876693 Yes

Então, há algo errado com o cron ou o modo como estou iniciando o movimento ou algo assim.

Eu tentei executar /etc/init.d/motion start em vez de executá-lo e eliminá-lo como usuário, mas esse método não funciona:

 * Not starting motion daemon, disabled via /etc/default/motion

Então, editei /etc/default/motion para dizer start_motion_daemon=yes e tentei novamente:

 ~> /etc/init.d/motion start
mkdir: cannot create directory '/var/run/motion': Permission denied

Eu nem sei o que isso significa.

    
por endolith 25.10.2012 / 23:43

4 respostas

5

A resposta do zmode é útil, mas não funcionou para mim. Depois de muita leitura, encontrei esta solução:

#!/bin/sh
if arp-scan -I eth0 -r 10 android | grep -q '12:34:56:78:90:ab'
then
    echo "Phone present, killing motion"
    killall motion
    echo "Done killing motion"
else
    echo "Phone absent, starting motion"
    if ! ps -A | grep -q motion
        then
            echo "Motion is not running - starting it"
            su -c 'motion' - username
            echo "Motion started"
        else
            echo "Motion already running"
    fi
    echo "Done starting motion"
fi
exit

(O endereço MAC, o nome do host e o nome de usuário precisam ser substituídos.) Ele verifica se o telefone está na rede, usando o nome de host do telefone android para evitar a varredura de endereços não relacionados. Ele verifica se o movimento já está em execução, por isso não inicia várias instâncias ou o mata repetidamente enquanto está funcionando.

Em seguida, execute sudo crontab -e para editar o cron do usuário root e adicione uma linha como esta:

*/5 * * * * /home/username/phone_webcam/phone_webcam.sh >> /var/log/cron.log 2>&1

Isso executará o script a cada 5 minutos, registrando a saída para que você possa depurá-lo. Execute o comando tail -f /var/log/cron.log para se certificar de que está funcionando. Depois de confirmar que funciona, remova a linha de log do crontab:

*/5 * * * * /home/username/phone_webcam/phone_webcam.sh
    
por 30.11.2012 / 05:57
5

A execução de um script no seu computador é muito mais fácil e definitivamente mais limpa do que configurar um servidor da Web que esperará que um telefone fale com ele. Portanto, vou com sua primeira ideia.

Suposições:

  • Você tem acesso root.
  • /etc/init.d/motion é usado para iniciar e parar motion .
    • systemctl start|stop motion.service para systemd
  • Você se conecta à mesma rede que seu telefone usando eth0 .
  • Sua implementação do cron usa o comando crontab .

Obtendo o endereço MAC:

Obtenha arp-scan e execute arp-scan -I eth0 -l -r 10 como root. (achei -r 10 importante para sempre detectar meu telefone Android)

Isso retornará uma lista de dispositivos em sua rede. A terceira coluna deve facilitar a identificação do seu telefone. Digamos que recebamos 01:01:01:01:01:01 .

Script:

Execute arp-scan -I eth0 -l -r 10 | grep -q '01:01:01:01:01:01' como root. Isso retornará 0 apenas se o telefone estiver conectado.

Execute crontab -e como root e anexe esta linha para verificar se o seu telefone está conectado à rede a cada minuto:

* * * * * arp-scan -I eth0 -l -r 10 | grep -q '01:01:01:01:01:01' && /etc/init.d/motion stop || /etc/init.d/motion start

Salve o arquivo e saia do editor.

Lembre-se de que não precisamos verificar se motion está sendo executado. O script de serviço faz isso internamente.

    
por 26.10.2012 / 18:39
3

Tomando a resposta acima como base, você pode ajustá-la para que ela funcione um pouco melhor.

#!/bin/sh
if arp-scan -I wlan0 -r 10 android-11111111111111111111 | grep -qi '11:11:11:11:11:11'
then
    echo "Phone present, killing motion"
    killall motion
    echo "Done killing motion"
else
    echo "Phone absent, starting motion"
    if ! ps -A | grep -q motion
        then
            echo "Motion is not running - starting it"
            su -c 'motion'
            echo "Motion started"
        else
            echo "Motion already running"
    fi
    echo "Done starting motion"
fi
exit

Normalmente, para wifi, a interface é conhecida como wlan0. O nome do dispositivo android é tipicamente android - seguido por um número de série. Adicionando -i ao comando grep, você pode executar a pesquisa com insensibilidade a maiúsculas e minúsculas (demorou um pouco para descobrir isso). Na minha máquina, iniciar o movimento corretamente requer acesso root. Isso pode ser feito removendo o nome de usuário do comando su.

Com essas modificações e seguindo tudo na resposta acima, você pode fazer o Motion iniciar sem problemas assim que você sair (com o seu telefone) da sua casa. Impecável!

    
por 26.01.2014 / 01:50
0

Eu tenho um script baseando-se a cada 4 minutos para fazer isso. Isso funciona muito bem. Aqui está o código com algumas explicações.

#!/bin/bash
############################################################################
## looking for iPhone, 1 if iPhone logged in, else 0
## IPhoneIP.txt contains local IP-adress (also bash-based)
IPhoneIP=$(cat /home/pi/motion/IPhoneIP.txt)
NMAP=$(nmap -sn -oG - ${IPhoneIP})
iPhoneActive=$(echo $NMAP | grep -c "Status: Up")
############################################################################
## alternatively finding iPhone with Bluetooth
if [ "$iPhoneActive" -eq 0 ]; then
    #save former value ofiPhoneActive if zero
    iPhoneActive=$(cat /home/pi/motion/IPhoneBluetoothCheck.txt)
fi
############################################################################
##if network down do nothing
NetworkDown=$(echo $NMAP | grep -c "Unable to determine any DNS servers")
############################################################################
##now checking whether motion is activ
MotionDetectionActive=$(wget -O - -o /dev/null  http://localhost:8086/0/detection/status | grep -c "ACTIVE")
############################################################################
##if iPhone in Wifi and Motion active activate
if [ "$iPhoneActive" -eq 1 ] && [ "$MotionDetectionActive" -eq 1 ]
then
    wget -O - http://localhost:8086/0/detection/pause > /dev/null 2>&1
    echo "Deactivating motion detection, iPhone entered WLAN" ##logging
fi 

if [ "$iPhoneActive" -eq 0 ] && [ "$MotionDetectionActive" -eq 0 ] && [ "$NetworkDown" -eq 0 ]
then
    wget -O - http://localhost:8086/0/detection/start > /dev/null 2>&1
    echo "Activating motion detection, iPhone left WLAN or other error" ## logging
fi

O iPhoneIP é detectado semanalmente usando

#!/bin/bash
########################################################
#writes iPhoneIP into /home/pi/motion/IPhoneIP.txt / IP-range might be different!!
########################################################
#
IP=$(nmap -sP 192.168.2.100-199 >/dev/null 2>&1 && /usr/sbin/arp -an | grep "01:01:01:01:01:01" | awk '{print $2}' | sed 's/[()]//g')
if [[ "${IP}" != "" ]]; then
    echo "${IP}" >/home/pi/motion/IPhoneIP.txt
fi

A detecção do bluetooth também é bash usando o seguinte script (também executado a cada 3 minutos):

#!/bin/bash
############################################################################
## bash checks whether iPhone is detected via bluetooth
############################################################################
##
############################################################################
BLUET=$(sudo l2ping -c 1 01:01:01:01:01:01 2>/dev/null | grep -c "44 bytes")
echo "${BLUET}" > /home/pi/motion/IPhoneBluetoothCheck.txt
    
por 26.10.2016 / 22:30