Difference between revisions of "7Links"
(added control script for 7LINKS SPX3615) |
|||
| Line 32: | Line 32: | ||
Here: http://www.youtube.com/watch?v=o9PyV4wkFZM&feature=related | Here: http://www.youtube.com/watch?v=o9PyV4wkFZM&feature=related | ||
For SPX-3615 you can enable pan-tilt: | |||
+++ | |||
package ZoneMinder::Control::7LINKSPX3615; | |||
use 5.006; | |||
use strict; | |||
use warnings; | |||
require ZoneMinder::Base; | |||
require ZoneMinder::Control; | |||
our @ISA = qw(ZoneMinder::Control); | |||
# ========================================================================== | |||
# | |||
# 7LINKS SPX3615 | |||
# Author: Bogdan Kecman <bogdan.kecman at gmail> | |||
# Tested with SPX-3615 only | |||
# | |||
# /decoder_control.cgi?command=COMMAND | |||
# | |||
# COMMAND: | |||
# 0: up | |||
# 1: stop | |||
# 2: down | |||
# 4: left | |||
# 6: right | |||
# 92: down-left | |||
# 93: down-right | |||
# 91: up-right | |||
# 90: up-left | |||
# | |||
# 25: patrol all around | |||
# 26: vertical patrol | |||
# 27: vertical patrol stop | |||
# 28: horisontal patrol | |||
# 29: horisontal patrol stop | |||
# | |||
# 94 led off | |||
# 95 led on | |||
# | |||
# CALL PRESET | |||
# 31: 1 | |||
# 33: 2 | |||
# 35: 3 | |||
# 37: 4 | |||
# 39: 5 | |||
# 41: 6 | |||
# 43: 7 | |||
# 45: 8 | |||
# 47: 9 | |||
# 49: 10 | |||
# 51: 11 | |||
# 53: 12 | |||
# 55: 13 | |||
# 57: 14 | |||
# 59: 15 | |||
# | |||
# SAVE PRESET | |||
# 30: 1 | |||
# 32: 2 | |||
# 34: 3 | |||
# 36: 4 | |||
# 38: 5 | |||
# 40: 6 | |||
# 42: 7 | |||
# 44: 8 | |||
# 46: 9 | |||
# 48: 10 | |||
# 50: 11 | |||
# 52: 12 | |||
# 54: 13 | |||
# 56: 14 | |||
# 58: 15 | |||
# | |||
# | |||
# | |||
# 640x480 | |||
# /camera_control.cgi?param=0&value=32 | |||
# | |||
# 320x240 | |||
# /camera_control.cgi?param=0&value=8 | |||
# | |||
# 160x120 | |||
# /camera_control.cgi?param=0&value=2 | |||
# | |||
# 50Hz | |||
# /camera_control.cgi?param=3&value=0 | |||
# | |||
# 60Hz | |||
# /camera_control.cgi?param=3&value=1 | |||
# | |||
# outdoor | |||
# /camera_control.cgi?param=3&value=2 | |||
# | |||
# brightness | |||
# /camera_control.cgi?param=1&value=112 (value: 0-240) | |||
# | |||
# contrast | |||
# /camera_control.cgi?param=2&value=0 (value 0-6) | |||
# | |||
# default all | |||
# /camera_control.cgi?param=0&value=8 | |||
# | |||
# ========================================================================== | |||
use ZoneMinder::Logger qw(:all); | |||
use ZoneMinder::Config qw(:all); | |||
use Data::Dumper; | |||
use Time::HiRes qw( usleep ); | |||
sub new | |||
{ | |||
my $class = shift; | |||
my $id = shift; | |||
my $self = ZoneMinder::Control->new( $id ); | |||
bless( $self, $class ); | |||
srand( time() ); | |||
return $self; | |||
} | |||
our $AUTOLOAD; | |||
sub AUTOLOAD | |||
{ | |||
my $self = shift; | |||
my $class = ref($self) || croak( "$self not object" ); | |||
my $name = $AUTOLOAD; | |||
$name =~ s/.*://; | |||
if ( exists($self->{$name}) ) | |||
{ | |||
return( $self->{$name} ); | |||
} | |||
Fatal( "Can't access $name member of object of class $class" ); | |||
} | |||
sub open | |||
{ | |||
my $self = shift; | |||
$self->loadMonitor(); | |||
use LWP::UserAgent; | |||
$self->{ua} = LWP::UserAgent->new; | |||
$self->{ua}->agent( "ZoneMinder Control Agent/".ZoneMinder::Base::ZM_VERSION ); | |||
$self->{state} = 'open'; | |||
} | |||
sub close | |||
{ | |||
my $self = shift; | |||
$self->{state} = 'closed'; | |||
} | |||
sub printMsg | |||
{ | |||
my $self = shift; | |||
my $msg = shift; | |||
my $msg_len = length($msg); | |||
Debug( $msg."[".$msg_len."]" ); | |||
} | |||
sub sendCmd | |||
{ | |||
my $self = shift; | |||
my $cmd = shift; | |||
my $result = undef; | |||
printMsg( $cmd, "Tx" ); | |||
my $req = HTTP::Request->new( GET=>"http://".$self->{Monitor}->{ControlAddress}."/$cmd" ); | |||
my $res = $self->{ua}->request($req); | |||
if ( $res->is_success ) | |||
{ | |||
$result = !undef; | |||
} | |||
else | |||
{ | |||
Error( "Error check failed: '".$res->status_line()."' for URL ".$req->uri() ); | |||
} | |||
return( $result ); | |||
} | |||
sub reset | |||
{ | |||
my $self = shift; | |||
Debug( "Camera Reset" ); | |||
$self->sendCmd( 'reboot.cgi?' ); | |||
} | |||
#Up Arrow | |||
sub moveConUp | |||
{ | |||
my $self = shift; | |||
Debug( "Move Up" ); | |||
$self->sendCmd( 'decoder_control.cgi?command=0&' ); | |||
} | |||
#Down Arrow | |||
sub moveConDown | |||
{ | |||
my $self = shift; | |||
Debug( "Move Down" ); | |||
$self->sendCmd( 'decoder_control.cgi?command=2&' ); | |||
} | |||
#Left Arrow | |||
sub moveConLeft | |||
{ | |||
my $self = shift; | |||
Debug( "Move Left" ); | |||
$self->sendCmd( 'decoder_control.cgi?command=4&' ); | |||
} | |||
#Right Arrow | |||
sub moveConRight | |||
{ | |||
my $self = shift; | |||
Debug( "Move Right" ); | |||
$self->sendCmd( 'decoder_control.cgi?command=6&' ); | |||
} | |||
#Diagonally Up Right Arrow | |||
sub moveConUpRight | |||
{ | |||
my $self = shift; | |||
Debug( "Move Diagonally Up Right" ); | |||
$self->sendCmd( 'decoder_control.cgi?command=91&' ); | |||
} | |||
#Diagonally Down Right Arrow | |||
sub moveConDownRight | |||
{ | |||
my $self = shift; | |||
Debug( "Move Diagonally Down Right" ); | |||
$self->sendCmd( 'decoder_control.cgi?command=93&' ); | |||
} | |||
#Diagonally Up Left Arrow | |||
sub moveConUpLeft | |||
{ | |||
my $self = shift; | |||
Debug( "Move Diagonally Up Left" ); | |||
$self->sendCmd( 'decoder_control.cgi?command=90&' ); | |||
} | |||
#Diagonally Down Left Arrow | |||
sub moveConDownLeft | |||
{ | |||
my $self = shift; | |||
Debug( "Move Diagonally Down Left" ); | |||
$self->sendCmd( 'decoder_control.cgi?command=92&' ); | |||
} | |||
#Stop | |||
sub moveStop | |||
{ | |||
my $self = shift; | |||
Debug( "Move Stop" ); | |||
$self->sendCmd( 'decoder_control.cgi?command=1&' ); | |||
} | |||
#Move Camera to Home Position | |||
sub presetHome | |||
{ | |||
my $self = shift; | |||
Debug( "Home Preset" ); | |||
$self->sendCmd( 'decoder_control.cgi?command=25&' ); | |||
} | |||
sub presetGoto | |||
{ | |||
my $self = shift; | |||
my $params = shift; | |||
my $preset = $self->getParam( $params, 'preset' ); | |||
Debug( "Goto Preset $preset" ); | |||
my $cmd = "decoder_control.cgi?command=" . ($preset *2 + 29 ); | |||
$self->sendCmd( $cmd ); | |||
} | |||
sub presetSet | |||
{ | |||
my $self = shift; | |||
my $params = shift; | |||
my $preset = $self->getParam( $params, 'preset' ); | |||
Debug( "Set Preset $preset" ); | |||
my $cmd = "decoder_control.cgi?command=" . ($preset *2 + 28); | |||
$self->sendCmd( $cmd ); | |||
} | |||
1; | |||
__END__ | |||
=pod | |||
=head1 DESCRIPTION | |||
This module contains the implementation of the 7LINKS PX-3615 IP camera control protocol. | |||
=cut | |||
+++ | |||
Latest revision as of 09:43, 28 May 2014
7Links WLAN-IP-Camera with IR-nightview & motion dedection
I'm using this cheap model now for 3 weeks. Working fine so far, even at -8°C, no fault.
Picture here:http://ecx.images-amazon.com/images/I/41GZi-upRuL._SL500_AA300_.jpg
Working with following settings:
Remote Protocol -> HTTP
Remote Method -> Simple
Remote Host Name -> username:password@192.168.xxx.xxx
Remote Host Port -> 80
Remote Host Path -> /videostream.cgi
Remote Image Colors -> 24 bit color
Capture Width (pixels) -> 320
Capture Height (pixels) -> 240
Preserve Aspect Ratio ->
Orientation -> Normal
Also working with 640 x 480. I had to adjust the shared memory.
Nice Video how to do this, for normal users (not linux specialists :-)
Here: http://www.youtube.com/watch?v=o9PyV4wkFZM&feature=related
For SPX-3615 you can enable pan-tilt:
+++
package ZoneMinder::Control::7LINKSPX3615;
use 5.006;
use strict;
use warnings;
require ZoneMinder::Base;
require ZoneMinder::Control;
our @ISA = qw(ZoneMinder::Control);
# ==========================================================================
#
# 7LINKS SPX3615
# Author: Bogdan Kecman <bogdan.kecman at gmail>
# Tested with SPX-3615 only
#
# /decoder_control.cgi?command=COMMAND
#
# COMMAND:
# 0: up
# 1: stop
# 2: down
# 4: left
# 6: right
# 92: down-left
# 93: down-right
# 91: up-right
# 90: up-left
#
# 25: patrol all around
# 26: vertical patrol
# 27: vertical patrol stop
# 28: horisontal patrol
# 29: horisontal patrol stop
#
# 94 led off
# 95 led on
#
# CALL PRESET
# 31: 1
# 33: 2
# 35: 3
# 37: 4
# 39: 5
# 41: 6
# 43: 7
# 45: 8
# 47: 9
# 49: 10
# 51: 11
# 53: 12
# 55: 13
# 57: 14
# 59: 15
#
# SAVE PRESET
# 30: 1
# 32: 2
# 34: 3
# 36: 4
# 38: 5
# 40: 6
# 42: 7
# 44: 8
# 46: 9
# 48: 10
# 50: 11
# 52: 12
# 54: 13
# 56: 14
# 58: 15
#
#
#
# 640x480
# /camera_control.cgi?param=0&value=32
#
# 320x240
# /camera_control.cgi?param=0&value=8
#
# 160x120
# /camera_control.cgi?param=0&value=2
#
# 50Hz
# /camera_control.cgi?param=3&value=0
#
# 60Hz
# /camera_control.cgi?param=3&value=1
#
# outdoor
# /camera_control.cgi?param=3&value=2
#
# brightness
# /camera_control.cgi?param=1&value=112 (value: 0-240)
#
# contrast
# /camera_control.cgi?param=2&value=0 (value 0-6)
#
# default all
# /camera_control.cgi?param=0&value=8
#
# ==========================================================================
use ZoneMinder::Logger qw(:all);
use ZoneMinder::Config qw(:all);
use Data::Dumper;
use Time::HiRes qw( usleep );
sub new
{
my $class = shift;
my $id = shift;
my $self = ZoneMinder::Control->new( $id );
bless( $self, $class );
srand( time() );
return $self;
}
our $AUTOLOAD;
sub AUTOLOAD
{
my $self = shift;
my $class = ref($self) || croak( "$self not object" );
my $name = $AUTOLOAD;
$name =~ s/.*://;
if ( exists($self->{$name}) )
{
return( $self->{$name} );
}
Fatal( "Can't access $name member of object of class $class" );
}
sub open
{
my $self = shift;
$self->loadMonitor();
use LWP::UserAgent;
$self->{ua} = LWP::UserAgent->new;
$self->{ua}->agent( "ZoneMinder Control Agent/".ZoneMinder::Base::ZM_VERSION );
$self->{state} = 'open';
}
sub close
{
my $self = shift;
$self->{state} = 'closed';
}
sub printMsg
{
my $self = shift;
my $msg = shift;
my $msg_len = length($msg);
Debug( $msg."[".$msg_len."]" );
}
sub sendCmd
{
my $self = shift;
my $cmd = shift;
my $result = undef;
printMsg( $cmd, "Tx" );
my $req = HTTP::Request->new( GET=>"http://".$self->{Monitor}->{ControlAddress}."/$cmd" );
my $res = $self->{ua}->request($req);
if ( $res->is_success )
{
$result = !undef;
}
else
{
Error( "Error check failed: '".$res->status_line()."' for URL ".$req->uri() );
}
return( $result );
}
sub reset
{
my $self = shift;
Debug( "Camera Reset" );
$self->sendCmd( 'reboot.cgi?' );
}
#Up Arrow
sub moveConUp
{
my $self = shift;
Debug( "Move Up" );
$self->sendCmd( 'decoder_control.cgi?command=0&' );
}
#Down Arrow
sub moveConDown
{
my $self = shift;
Debug( "Move Down" );
$self->sendCmd( 'decoder_control.cgi?command=2&' );
}
#Left Arrow
sub moveConLeft
{
my $self = shift;
Debug( "Move Left" );
$self->sendCmd( 'decoder_control.cgi?command=4&' );
}
#Right Arrow
sub moveConRight
{
my $self = shift;
Debug( "Move Right" );
$self->sendCmd( 'decoder_control.cgi?command=6&' );
}
#Diagonally Up Right Arrow
sub moveConUpRight
{
my $self = shift;
Debug( "Move Diagonally Up Right" );
$self->sendCmd( 'decoder_control.cgi?command=91&' );
}
#Diagonally Down Right Arrow
sub moveConDownRight
{
my $self = shift;
Debug( "Move Diagonally Down Right" );
$self->sendCmd( 'decoder_control.cgi?command=93&' );
}
#Diagonally Up Left Arrow
sub moveConUpLeft
{
my $self = shift;
Debug( "Move Diagonally Up Left" );
$self->sendCmd( 'decoder_control.cgi?command=90&' );
}
#Diagonally Down Left Arrow
sub moveConDownLeft
{
my $self = shift;
Debug( "Move Diagonally Down Left" );
$self->sendCmd( 'decoder_control.cgi?command=92&' );
}
#Stop
sub moveStop
{
my $self = shift;
Debug( "Move Stop" );
$self->sendCmd( 'decoder_control.cgi?command=1&' );
}
#Move Camera to Home Position
sub presetHome
{
my $self = shift;
Debug( "Home Preset" );
$self->sendCmd( 'decoder_control.cgi?command=25&' );
}
sub presetGoto
{
my $self = shift;
my $params = shift;
my $preset = $self->getParam( $params, 'preset' );
Debug( "Goto Preset $preset" );
my $cmd = "decoder_control.cgi?command=" . ($preset *2 + 29 );
$self->sendCmd( $cmd );
}
sub presetSet
{
my $self = shift;
my $params = shift;
my $preset = $self->getParam( $params, 'preset' );
Debug( "Set Preset $preset" );
my $cmd = "decoder_control.cgi?command=" . ($preset *2 + 28);
$self->sendCmd( $cmd );
}
1;
__END__
=pod
=head1 DESCRIPTION
This module contains the implementation of the 7LINKS PX-3615 IP camera control protocol.
=cut
+++