Wie kann ich die Webcam-Software nur ausführen, wenn ich nicht zu Hause bin (das Telefon ist nicht im LAN)?

9208
endolith

Momentan habe ich meinen Benutzer cron, der Motion mit einem Timer startet, wenn ich normalerweise zur Arbeit gehe, und dann töte, wenn ich normalerweise nach Hause komme, damit ich meine Katze / Einbrecher / etc beobachten kann:

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

Die verwendete Konfigurationsdatei ist ~/.motion/motion.confund hat daemon on.

Es wäre jedoch besser, wenn er erkennen könnte, wann ich tatsächlich zu Hause bin, und die Webcam während dieser Zeiten deaktivieren und zu anderen Zeiten aktivieren kann. Ich dachte, meine Anwesenheit könnte von meinem Android-Telefon erkannt werden, das sich dem LAN anschließt. So etwas wie

  1. Ein Skript, das alle paar Minuten prüft, ob sich der Hostname oder die MAC-Adresse meines Telefons im LAN befindet
  2. Ein Tasker- Skript auf meinem Telefon, das den Heimcomputer auf irgendeine Weise kontaktiert (einfacher Webserver?), Wenn er einer bestimmten SSID beitritt
  3. Eine Kombination der oben genannten
  4. ...

Gibt es bessere Ideen oder Ratschläge, wie man eine davon umsetzen kann? Tasker ist einfach zu bedienen, kostet aber 6 US-Dollar, daher wäre eine Lösung, die nicht davon abhängt, für ein breiteres Publikum von Nutzen.

Mein erster Versuch mit der arp-scan-Lösung funktioniert nicht sehr gut. Es erstellt mehrere Fälle motion und erkennt das Telefon nicht zuverlässig, wodurch die Kamera sporadisch ein- und ausgeschaltet wird. Vielleicht sollte es also eher so lauten: "Überprüfen Sie jede Minute, ob das Telefon vorhanden ist. Schalten Sie die Kamera nur ein, wenn das Telefon 15 Minuten lang nicht gesehen wurde".

Ok, ich habe ein Python-Skript geschrieben, um einmal pro Minute einen Arp-Scan durchzuführen, und es erkennt das Telefon perfekt:

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 

Also stimmt etwas mit Cron oder der Art, wie ich Bewegung beginne oder so.

Ich habe versucht zu laufen, /etc/init.d/motion startanstatt es auszuführen und als Benutzer zu töten, aber diese Methode funktioniert nicht:

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

Also redigierte ich /etc/default/motionzu sagen start_motion_daemon=yesund versuchte es erneut:

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

Ich weiß nicht mal was das bedeutet.

6

4 Antworten auf die Frage

5
dset0x

Das Ausführen eines Skripts auf Ihrem Computer ist viel einfacher und auf jeden Fall sauberer als das Einrichten eines Webservers, der darauf wartet, dass ein Telefon mit ihm spricht. Deshalb gehe ich zu Ihrer ersten Idee.

Annahmen:

  • Sie haben root-Zugriff.
  • /etc/init.d/motionwird zum Starten und Stoppen verwendet motion.
    • systemctl start|stop motion.service zum systemd
  • Sie stellen eine Verbindung zu demselben Netzwerk her wie Ihr Telefon eth0.
  • Ihre Cron-Implementierung verwendet den crontabBefehl.

Abrufen der MAC-Adresse:

Erhalten Sie arp-scanund laufen arp-scan -I eth0 -l -r 10als root. (Ich fand -r 10es wichtig, immer mein Android-Handy zu erkennen.)

Dadurch wird eine Liste der Geräte in Ihrem Netzwerk angezeigt. Die dritte Spalte sollte die Identifizierung Ihres Telefons erleichtern. Nehmen wir an, wir bekommen 01:01:01:01:01:01.

Skript es:

Führen Sie arp-scan -I eth0 -l -r 10 | grep -q '01:01:01:01:01:01'als root aus. Dies wird 0nur dann angezeigt, wenn das Telefon angeschlossen ist.

Führen Sie crontab -eals root aus und hängen Sie diese Zeile an, um zu prüfen, ob Ihr Telefon jede Minute mit dem Netzwerk verbunden ist:

* * * * * 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

Speichern Sie die Datei und beenden Sie den Editor.

Denken Sie daran, dass wir nicht prüfen müssen, ob motionwir selbst laufen. Das Serviceskript erledigt dies intern.

scheint wie "sudo arp-scan -I eth0 -r 10 android" ist schneller. Wenn ich versuche, `/etc/init.d/motion start` als root auszuführen, bekomme ich` * Nicht startender Motion-Daemon, deaktiviert über / etc / default / motion`. Normalerweise führe ich es einfach als "Bewegung" von meinem Nicht-Root-Benutzer aus, der meine Einstellungen in "~ / .motion / motion.conf" verwendet endolith vor 11 Jahren 0
Ich empfehle dringend, den Daemon zu verwenden. Wenn Sie dennoch als Benutzer laufen möchten, Sie haben zwei Möglichkeiten: (a) Ersetzen Sie `/etc/init.d/motion start` durch` su -c 'motion' username '. (b) Gestatten Sie Ihrem Benutzer die Ausführung von "motion" ohne Kennwort in / etc / sudoers (wenn Sie das verwenden) und fügen Sie den Eintrag zur Crontab des Benutzers mit den PID-Überprüfungen der init.d-Datei hinzu (am besten, um ein kleines Skript zu erstellen, das dies ermöglicht.) haben die gleiche Funktionalität wie die Datei init.d und rufen dieses Skript stattdessen von Ihrer crontab auf). dset0x vor 11 Jahren 1
Dies scheint mehrere Minuten der Bewegung zu verursachen. Ich hatte den Dämon gestartet, indem er als Benutzer 'motion' ausgeführt hatte. Gibt es eine Möglichkeit, die Methode `init.d start` zu verwenden, aber die Konfigurationsdatei in meinem Benutzerverzeichnis noch verwenden und die Dateien trotzdem mit den Berechtigungen des Benutzers in mein Benutzerverzeichnis schreiben? endolith vor 11 Jahren 0
`/etc/init.d/motion stop` beendet alle Instanzen, wenn ich es auf der Kommandozeile ausführe, aber innerhalb von crontab tut es nichts endolith vor 11 Jahren 0
Sie können das Skript `/ etc / init.d / motion` öffnen und die Prozessüberprüfungs- / Beendigungsfunktion von dort in ein Skript von Ihnen kopieren. Es sollte übrigens in crontab funktionieren (muss in root crontab sein, wenn es als root ausgeführt wird); Überprüfen Sie Ihre Cron-Protokolle. dset0x vor 11 Jahren 0
5
endolith

Die Antwort von zmode ist hilfreich, hat aber für mich nicht funktioniert. Nach vielem Lesen kam ich zu dieser Lösung:

#!/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 

(Die MAC-Adresse, der Hostname und der Benutzername müssen ersetzt werden.) Er prüft, ob das Telefon im Netzwerk ist, und verwendet den Hostnamen des Telefons android, um das Prüfen nicht zusammenhängender Adressen zu vermeiden. Es prüft, ob die Bewegung bereits läuft, und startet daher nicht mehrere Instanzen oder bricht sie während der Arbeit wiederholt ab.

Führen Sie anschließend sudo crontab -eden Cron des Root-Benutzers aus und fügen Sie eine Zeile wie folgt hinzu:

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

Dadurch wird das Skript alle 5 Minuten ausgeführt und die Ausgabe wird protokolliert, sodass Sie sie debuggen können. Führen Sie den Befehl aus tail -f /var/log/cron.log, um sicherzustellen, dass er funktioniert. Nachdem Sie sich vergewissert haben, dass es funktioniert, entfernen Sie die Protokollierungslinie von crontab:

*/5 * * * * /home/username/phone_webcam/phone_webcam.sh 
3
astryk

Wenn Sie die obige Antwort als Basis verwenden, können Sie sie optimieren, damit sie etwas besser funktioniert.

#!/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 

Normalerweise ist die Schnittstelle für WLAN als Wlan0 bekannt. Der Name des Android-Geräts lautet normalerweise Android, gefolgt von einer Seriennummer. Durch Hinzufügen von -i zum Befehl grep können Sie die Suche mit Groß- / Kleinschreibung ausführen (es dauerte eine Weile, bis diese ermittelt wurde). Zum Starten der Bewegung auf meinem Computer ist ein Root-Zugriff erforderlich. Dies kann erreicht werden, indem der Benutzername aus dem Befehl su entfernt wird.

Mit diesen Änderungen und dem Befolgen aller oben genannten Antworten können Sie Motion problemlos starten, sobald Sie (mit Ihrem Telefon) Ihr Haus verlassen. Makellos!

0
user2165245

Ich habe ein Bash-Skript, das alle 4 Minuten läuft. Das funktioniert ganz gut. Hier ist der Code mit einigen Erklärungen.

#!/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 - $) 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 

Das iPhoneIP wird wöchentlich mit erkannt

#!/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 '' | sed 's/[()]//g') if [[ "$" != "" ]]; then echo "$" >/home/pi/motion/IPhoneIP.txt fi 

Die Bluetooth-Erkennung basiert ebenfalls auf Bash und verwendet das folgende Skript (das alle 3 Minuten ausgeführt wird):

#!/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 "$" > /home/pi/motion/IPhoneBluetoothCheck.txt