Last summer, my mini-tech project was installing some wireless internet cameras inside and outside the house so I could keep tabs on things while I was away. For the past year I’d just been using the built-in features of each of the cameras (motion detection, e-mail alerts, etc.) which was hit-or-miss since each manufacturer offered different features, some better implemented than others, and none of them perfect.
This setup was fine, but I wanted to be able to better manage the system and maybe even store more history of events (or “live” video) without having it be all e-mail messages with static image attachments. That’s what prompted me to search for open source camera management software, and I that’s how I found ZoneMinder.
ZoneMinder is intended for use in single or multi-camera video security applications, including commercial or home CCTV, theft prevention and child, family member or home monitoring and other domestic care scenarios such as nanny cam installations. It supports capture, analysis, recording, and monitoring of video data coming from one or more video or network cameras attached to a Linux system.
ZM is free (although the author accepts donations, which I’ve done) and runs on my home Linux server. Setting it up was relatively straightforward, but tinkering with all of the cool features to tweak the system just the way I wanted it took some time. You add each of your network cameras to the ZM Console and configure the various settings so the ZoneMinder processes can access the video stream URL of the camera.
It has a bunch of presets for popular cameras, and even supports some basic PTZ functions (although I was unable to get this to work with my TrendNet units). Each camera can be set to a different function like monitor (video stream only), modect (motion detection), record (continuous recording), mocord (continuous recording plus motion detection), etc. Once you have the cameras added to the console you can create motion zones and add any event notifications.
At a high level, what ZM does is capture the video stream from the camera (at whatever frame rate you specify) as a series of still images and then performs image analysis/processing (with configurable levels of sensitivity) to determine if motion has been detected in the areas you specify. I love that you can create multiple custom-sized detection areas and even have “preclusive” zones to prevent constant triggers by changing light levels, moving plants, etc. Since the still images are all stored on your server, ZoneMinder can “play” them back in quick succession giving you a video of the event without actually storing encoded video (although you can generate a video file with ffmpeg if you want).
All of ZoneMinder’s configuration and logged information is stored in a MySQL database, and the images are stored on local disk (I’m using an old 1TB eSATA drive that used to be connected to one of my TiVos so I’ve got plenty of space). Since ZM is doing all of the “work” I’m no longer limited to the features of each manufacturer’s camera like the lack of time-stamping or NAS storage with the Foscams, or the limit of two square motion detection zones on the TrendNet models. ZM does, however, put a heavier load on the network (it’s constantly pulling images from the cameras) and on the server (there’s a separate Linux process for each camera monitor plus another process for each camera that has motion detection enabled), so that’s something to keep in mind.
Before switching to ZoneMinder, I used eyeCam on my iPhone to check on my cameras which worked very well, but now use eyeZM which is basically an iOS interface to your ZoneMinder console. The app lets you view real-time video feeds, switch monitor functions (i.e., turn motion detection on or off), and examine archived events. Unfortunately it’s not a universal binary so you have to purchase the iPhone and iPad apps separately.
For more details on ZoneMinder, check out the very detailed wiki.