Difference between revisions of "AxisMotionDetection"

From ZoneMinder Wiki
Jump to navigationJump to search
Line 1: Line 1:
I had this performance problem while monitoring and event recording for 8-10 IP cameras using the ZM.
I had this performance problem while monitoring and event recording for 8-10 IP cameras using the ZM.
ZM is too good a software to abandon just for performance issues. So I decided I should pay more attention to the motion detection feature of the cameras I have and relieve the ZM server from the task of detecting motion.
ZM is too good a software to abandon just for performance issues. So I decided I should pay more attention to the motion detection feature of the cameras I have and relieve the ZM server from the task of detecting motion.
I've finally managed to use the on-camera motion detection feature of Axis Cams and here are my notes:
I've finally managed to use the on-camera motion detection feature of Axis Cams and here are my notes:


== Cameras ==
I've set my Axis camera as follows:
I've set my Axis camera as follows:


Line 32: Line 32:




Now to the ZM settings...
 
== ZM settings ==
 


There is no special setting for the ZM except that I've assigned the "Nodect" function to my camera monitor.
There is no special setting for the ZM except that I've assigned the "Nodect" function to my camera monitor.
Line 132: Line 134:


Again; many thanks to those people who developed ZM at the first place and to those who helped it to become a perfect opensource project.
Again; many thanks to those people who developed ZM at the first place and to those who helped it to become a perfect opensource project.
[http://www.zoneminder.com/forums/viewtopic.php?t=10872 Original Thread]
[http://www.zoneminder.com/forums/viewtopic.php?t=10872 Original Thread]
Copied By: KingOfKYA
Copied By: KingOfKYA
Created By: cayfer
Created By: cayfer

Revision as of 20:13, 4 May 2009

I had this performance problem while monitoring and event recording for 8-10 IP cameras using the ZM. ZM is too good a software to abandon just for performance issues. So I decided I should pay more attention to the motion detection feature of the cameras I have and relieve the ZM server from the task of detecting motion. I've finally managed to use the on-camera motion detection feature of Axis Cams and here are my notes:

Cameras

I've set my Axis camera as follows:

AxisMDetect1.png AxisMDetect2.png


The text "1|on 5|5|cause|text|showtext" means that alarm will be triggered for the monitor which has ID=1, alarm will set recording on alarm will be cleared after 5 seconds. The score of the alarm is 5 ( any score >0 is OK) "text" and "showtext" are just explanatory notes.

The ZM specs tells us that the format of the message can include a "duration" as long as the message is sent as: "1|on+5|5|cause|text|showtext" bu the problem is the Axis camera cannot or will not save the "+" sign which appears in the message. A CGI parameter conversion problem I presume...

I've taken care of this "+" problem with a small modification in zmtrigger.pl source (see below).

Next, I specified the host IP address of the zm computer and its default zmtrigger port of 6802.

AxisMDetect3.png AxisMDetect4.png

The second important setup is the "motion detection" setup on the Axis. I created a window which covers the area of interest; kept the object size as small as possible, pulled the history slider all the way back to zero and left the sensitivity slide somewhere past the %50 value.



ZM settings

There is no special setting for the ZM except that I've assigned the "Nodect" function to my camera monitor.

AxisMDetect5.png


Finally, I modified the zmtrigger.pl file so that the first few lines of the function handleMessage looks like this:

Code: sub handleMessage {

       my $connection = shift;
       my $message = shift;
       #
       #  CUA  - Axis camera send the message quoted with"
       #  CUA  - Also Axis camera cannot save the plus sign which
       #  CUA  - possibly exists in the 1|on+20|score|cause|text|showtext formatted msg
       $message=~ s/^\"//g;
       $message=~ s/\"$//g;
       $message=~ s/on /on\+/;
       #  CUA - end of modifications
       my ( $id, $action, $score, $cause, $text, $showtext ) = split( /\|/, $message );


a few other modifications I made in the zmtrigger.pl file are commenting out some unused modules and pushes:

Code: use ZoneMinder::Trigger::Channel::Inet;

  1. CUA use ZoneMinder::Trigger::Channel::Unix;
  2. CUA use ZoneMinder::Trigger::Channel::Serial;

use ZoneMinder::Trigger::Connection;

my @connections; push( @connections, ZoneMinder::Trigger::Connection->new( name=>"Chan1", channel=>ZoneMinder::Trigger::Channel::Inet->new( port=>6802 ), mode=>"rw" ) );

  1. CUA push( @connections, ZoneMinder::Trigger::Connection->new( name=>"Chan2", channel=>ZoneMinder::Trigger::Channel::Unix->new( path=>'/tmp/test.sock' ), mode=>"rw" ) );
  2. push( @connections, ZoneMinder::Trigger::Connection->new( name=>"Chan3", channel=>ZoneMinder::Trigger::Channel::File->new( path=>'/tmp/zmtrigger.out' ), mode=>"w" ) );
  3. CUA push( @connections, ZoneMinder::Trigger::Connection->new( name=>"Chan4", channel=>ZoneMinder::Trigger::Channel::Serial->new( path=>'/dev/ttyS0' ), mode=>"rw" ) );


my modifs are marked with "# CUA"


These three regular expressions remove the quotes sent by Axis which envelope the message string and insert a plus sign if the "on" command is followed by a space). These 3 statements convert an incoming message of the form

Code: "1|on 25|5|cause|text|showtext"


to

Code: 1|on+25|5|cause|text|showtext


and of course, you shouln"t forget to restart zmtrigger.pl; or better still modify the zm startup script so that it starts zmtrigger.pl everytime zm is [re]started.

I added the line '/usr/bin/zmtrigger.pl &" in the start section of /etc/init.d/zoneminder and also added the line "pkill zmtrigger.pl" in the stop section.

Code:

start() {

       echo -n "Starting $prog: "
       $command start
       # CUA
       /usr/bin/zmtrigger.pl &


       RETVAL=$?
       [ $RETVAL = 0 ] && echo success
       [ $RETVAL != 0 ] && echo failure
       echo
       [ $RETVAL = 0 ] && touch /var/lock/zm
       return $RETVAL

} stop() {

       echo -n $"Stopping $prog: "
       #
       # Why is this status check being done?
       # as $command stop returns 1 if zoneminder
       # is stopped, which will result in
       # this returning 1, which will stuff
       # dpkg when it tries to stop zoneminder before
       # uninstalling . . .
       #
       # CUA
       pkill zmtrigger.pl


I just hope that this helps other people trying to implement the on-camera motion detection with ZM.

Again; many thanks to those people who developed ZM at the first place and to those who helped it to become a perfect opensource project.

Original Thread Copied By: KingOfKYA Created By: cayfer