Using USB webcams with Home Assistant
In this blog post I am using a Fedora 24 (will most likely work on other distributions too) installation with Home Assistant 0.22.1 on a Foxconn nT-330i with an old Logitech QuickCam Orbit AF
Check first if the your operating system lists your cameras.
$ lsusb
[...]
Bus 002 Device 016: ID 046d:08cc Logitech, Inc. Mic (PTZ)
[...]
The camera we are going to use is available at /dev/video1
. The C270 is the one on /dev/video0
.
$ ls -al /dev/video*
crw-rw----+ 1 root video 81, 0 Jun 23 08:05 /dev/video0
crw-rw----+ 1 root video 81, 1 Jun 23 08:36 /dev/video1
We need an additional software part to handle the cameras. motion
sudo dnf -y install motion
For our setup we need to modify the file /etc/motion/motion.conf
. For now the most important parameters are videodevice
, snapshot_interval
, and target_dir
. The other settings can be left to their defaults. We are going to use the device /dev/video1
, use a 30 seconds interval, and set the path to /tmp
.
[...]
###########################################################
# Capture device options
############################################################
# Videodevice to be used for capturing (default /dev/video0)
# for FreeBSD default is /dev/bktr0
videodevice /dev/video1
[..]
############################################################
# Snapshots (Traditional Periodic Webcam File Output)
############################################################
# Make automated snapshot every N seconds (default: 0 = disabled)
snapshot_interval 30
[...]
############################################################
# Target Directories and filenames For Images And Films
# For the options snapshot_, picture_, movie_ and timelapse_filename
# you can use conversion specifiers
# %Y = year, %m = month, %d = date,
# %H = hour, %M = minute, %S = second,
# %v = event, %q = frame number, %t = thread (camera) number,
# %D = changed pixels, %N = noise level,
# %i and %J = width and height of motion area,
# %K and %L = X and Y coordinates of motion center
# %C = value defined by text_event
# Quotation marks round string are allowed.
############################################################
# Target base directory for pictures and films
# Recommended to use absolute path. (Default: current working directory)
target_dir /tmp
[...]
It’s suggested that you adjust at least width
and height
to get a bigger image from your camera. If you are done, fire up motion
.
$ sudo motion
[0] [NTC] [ALL] conf_load: Processing thread 0 - config file /etc/motion/motion.conf
[0] [ALR] [ALL] conf_cmdparse: Unknown config option "sdl_threadnr"
[0] [NTC] [ALL] motion_startup: Motion 3.3.0 Started
[0] [NTC] [ALL] motion_startup: Logging to file (/var/log/motion.log)
Your target_dir
will start filling up with images from your camera. motion
will create a symlink called lastsnap.jpg
which always point to the latest snapshot. We will setup the Local File camera platform to use this file.
camera:
- platform: local_file
name: Cranberry cam
file_path: /tmp/lastsnap.jpg
The "Cranberry cam" in action
The machine with the attached USB camera will become a webcam server as well because motion
’s built-in HTTP server is enabled by default. This means that you could connect your USB webcams to a different machine in your network, run motion
there, adjust your firewall rules, and use Home Assistant to display the videos. Just check http://[IP of your webcam host]:8081/
to see the stream. This required more powerful hardware than using snapshots, of course.
In a scenario like this needs a Generic MJPEG IP Camera in your configuration.yaml
file.
camera:
- platform: mjpeg
mjpeg_url: http://[IP of your webcam host]:8081
name: Cranberry Live cam
motionmotion
to unleash its potential.