Introduction
If you read my post, Raspberry Pi-Powered Dashboard Video Camera Using Motion and FFmpeg, you know Motion with FFmpeg on a Raspberry Pi makes an ideal dashboard camera system. However, an issue I still struggled with when using the dash-cam was Motion running without a webcam connected.
When I start my car, the Raspberry Pi boots-up, and subsequently, Motion starts. No interaction with the Pi is required. The dash-cam starts capturing images and making the time-lapse video. However, when I get home and plug my Pi back into my local network, Motion starts up again and starts recording blank images and creating the time-lapse video, even though there is no webcam connected.
To get prevent Motion from starting up without a webcam connected, I’ve added a simple function to the Motion startup script. When the system calls Motion on startup, the new function checks if a webcam is connected. If not, it immediately exits the script, without ever starting Motion. No blank images or empty time-lapse videos are created. This saves a lot of wasted processing on the Pi. It also saves a lot of wasted time moving videos and images off the Pi that end up being blank, because no webcam was connected.
Find Your Webcam
First, attach your webcam to the Raspberry Pi. Run the following command to list the USB devices connected to the Pi:
lsusb
You should see similar output to the example below. Note your webcam’s ID(s). I ran the command twice in this example, to identify both of my webcams.
There are several ways to detect your webcam, depending on you Linux distro. I found this post particularly helpful, The Webcam HOWTO.
Modify Motion
Next, open the Motion startup script, using the following command:
sudo nano /etc/init.d/motion
Add the following ‘check_for_webcam ()’ function to the top of the script, adjacent to the existing ‘check_daemon_enabled()’ function:
# Check if specific webcam(s) are connected to Pi check_for_webcam () { if lsusb | grep -s -q -e 0000:ABCD then echo "Webcam found. Continuing..." return 0 else echo "No webcam found? Shutting down Motion!" return 1 fi }
You will need to modify the function, changing the string ‘0000:ABCD’, to match your webcam’s ID. If you change your webcam model, remember to update the ID you entered in this function.
Next add the following statement to the beginning of the ‘start’ function. This code calls the new function when Motion’s ‘start’ command is executed. If no webcam is found, the Motion script exits without starting.
if ! check_for_webcam; then exit 1 fi
In my example below, I have two possible webcams that might be connected, so I search (grep) for either ID.
Testing the Script Change
Save and close the Motion script. To test the script is working, run the following command to stop Motion:
sudo /etc/init.d/motion stop
Unplug your webcam from the Raspberry Pi. Then, run the following command to start Motion:
sudo /etc/init.d/motion start
You should see the following output:
No webcam found? Shutting down Motion!
Now, plug your webcam back in and run the ‘start’ command, again. You should now see the following output:
Webcam found. Continuing...
Conclusion
Now, when you start the Raspberry Pi and don’t have a web-cam connected, Motion will no longer automatically start. Just remember, if you don’t have a way to interact directly with your Pi, you will need to restart the Pi to get Motion running again after connecting a webcam.