Camera Trigger

With these two simple scripts, you can get MisterHouse to take a snapshot from a network camera, based on any MisterHouse event.  I am using an X10 tricky interface from my alarm system called $alarm and an Axis network camera server.

First make a file called MH/bin/get_cam
This is perl code that will retrieve a snapshot from your network camera.
$storedir should be set to the location you wish to have the picture placed.
$camurl is where you could point your browser to see a snapshot from your camera.
IMPORTANT: Right-click on your video camera's picture feed and choose "properties", then paste the URL into a new browser window.  You should see ONLY the snapshot in the browser window!
Some cameras offer a motion -or- refresh image feed.  Choose refresh image feed, then drill down to the jpg source. If your camera does not serve still pictures, the script here is unsuitable.

WebCam2000 is a program that will turn a Windows computer - that has a webcam - into a suitable source.

$basename plus HHMM timestamp plus $ext equals the stored filename.
So with the settings below, at 10:48PM, the filename would be Cam1-2048.jpg
remember there are 1440 minutes in a day, so you could end up with 1440 files!
(that's why I didn't add seconds or date to the filename, if you want to - it's your hard drive!)

#!/usr/bin/perl -w
use strict;         # Enforce safe programming
use warnings;       #
use File::Basename; # file name handling
use LWP::Simple;    # WWW interface, exports HTTP::Status

# Force the output buffer to flush
$| = 1;
# Set default values
my $storedir = "/home/public/monitoring/";
my $basename = "Cam1-";
my $camurl = "http://net.cam.I.P/fullsize.jpg?camera=1&clock=on";
my $ext = ".jpg";
my $s = "0";
my $m = "0";
my $h = "0";
my $mday = "0";
# If the storage directory does not exist, create it.
if( ! -e $storedir )
{
  mkdir( $storedir ) || die "Could not create $storedir: $!n";
}
# Generate file name
( $s,$m,$h,$mday ) = localtime( time );
if( $s < 10 ) {$s = "0$s" }
if( $m < 10 ) {$m = "0$m" }
if( $h < 10 ) {$h = "0$h" }
if( $mday < 10 ) {$mday = "0$mday" }
my $fullFilename = "$storedir$basename$h$m$ext";
# Get the file and store it locally
my $response = getstore( $camurl, $fullFilename ) || die "Could not create $fullFilename: $!n";
# Check for a valid 'get' (RC_OK defined in HTTP::Status)
if( $response == RC_OK )
{
  if( -z $fullFilename )
  {
    print "File was 0 bytes. Removing.n";
    unlink $fullFilename;
  }
}
else
{
  print "HTTP response was $response. Could not download the image.n";
}
exit 0; # =========== End of Main Program ===========

Don't forget to CHMOD the file so it has execute permissions.

Next you need a new user code file.  Store it in your MH user code directory.
i.e: MH/Code/Test/camtrigger.pl

if (state_now $alarm eq 'motion') {
    run 'get_cam';        
}

Remember to use the state_now function so that there isn't a picture taker spawned every loop!
(which is milliseconds!) Then activate the user code in MisterHouse.

By making several files and naming them get_cam1, get_ cam2, ect... you can have MisterHouse take pictures from multiple cameras.

You could use the time_now function to have a picture taken at a specific time every day.

You could set a timer, and take a picture every 5 minutes.

Top