<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.staging.zoneminder.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dl6er</id>
	<title>ZoneMinder Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.staging.zoneminder.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dl6er"/>
	<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/Special:Contributions/Dl6er"/>
	<updated>2026-04-20T02:38:32Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=Apexis&amp;diff=6395</id>
		<title>Apexis</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=Apexis&amp;diff=6395"/>
		<updated>2014-09-16T14:20:41Z</updated>

		<summary type="html">&lt;p&gt;Dl6er: /* Apexis APM J0233 WS IR (IR, outdoor, IP66) */ added more details and examplary picture&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Apexis APM J0233 WS IR (IR, outdoor, IP66) ==&lt;br /&gt;
[[File:APMJ0233WSIR_02.png|200px|thumb|right|Apexis APM J0233 WS IR]]&lt;br /&gt;
[[File:Snapshot 20140915180703.jpg|200px|thumb|right|Snapshot from Apexis APM J0233 WS IR]]&lt;br /&gt;
&amp;lt;strike&amp;gt;Sometimes there are distortions when switching from Nightvision to Dayvision and back.&amp;lt;/strike&amp;gt; (I have sent the camera for repair and since then it has not occurred again.)&lt;br /&gt;
&lt;br /&gt;
Overall moderate image quality (see example picture on the right).&lt;br /&gt;
I had to create a new user to access the image (needs only limited permissions).&lt;br /&gt;
&lt;br /&gt;
Remote Protocol: HTTP&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Method: Simple&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Name: &amp;lt;ip of camera&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Port: 80&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Path: videostream.cgi?user=&amp;#039;&amp;#039;&amp;#039;&amp;lt;USERNAME&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;amp;pwd=&amp;#039;&amp;#039;&amp;#039;&amp;lt;PASSWORD&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;amp;resolution=&amp;#039;&amp;#039;&amp;#039;32&amp;#039;&amp;#039;&amp;#039;&amp;amp;rate=&amp;#039;&amp;#039;&amp;#039;11&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Image colors: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Available resolutions:&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;2&amp;#039;&amp;#039;&amp;#039; = 160x120 (QQVGA); &amp;#039;&amp;#039;&amp;#039;8&amp;#039;&amp;#039;&amp;#039; = 320x240 (QVGA); &amp;#039;&amp;#039;&amp;#039;32&amp;#039;&amp;#039;&amp;#039; = 640x480 (VGA)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Possible image transmission rates:&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039; = 20fps; &amp;#039;&amp;#039;&amp;#039;3&amp;#039;&amp;#039;&amp;#039; = 15fps; &amp;#039;&amp;#039;&amp;#039;6&amp;#039;&amp;#039;&amp;#039; = 10fps; &amp;#039;&amp;#039;&amp;#039;11&amp;#039;&amp;#039;&amp;#039; = 5fps; &amp;#039;&amp;#039;&amp;#039;13&amp;#039;&amp;#039;&amp;#039; = 3fps; &amp;#039;&amp;#039;&amp;#039;15&amp;#039;&amp;#039;&amp;#039; = 1fps; &amp;#039;&amp;#039;&amp;#039;17&amp;#039;&amp;#039;&amp;#039; = 0.5fps;&lt;br /&gt;
&lt;br /&gt;
== Apexis J12 IP Camera ==&lt;br /&gt;
&lt;br /&gt;
Remote Protocol: HTTP&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Method: Simple&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Name: &amp;lt;ip of camera&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Port: 80&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Path: videostream.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Image colors: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
It is recommended to set Max FPS to 20.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apexis APM-J011-WS IP Camera ==&lt;br /&gt;
&lt;br /&gt;
Remote Protocol: HTTP &amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Method: Simple &amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Name: &amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Port: 80&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Path: videostream.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Image colors: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Maximum frame rate this IP web camera can handle is 15 fps at 640x480. The &amp;lt;USERNAME&amp;gt; and &amp;lt;PASSWORD&amp;gt; are found in the &amp;quot;Users Settings&amp;quot; section of the IP Camera&amp;#039;s web setup page. &lt;br /&gt;
Pan Tilt Control is not available in Zoneminder 1.25.0 at this time (Feb 2012.)  This IP camera does not have a zoom function, only pan and tilt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [http://apexis.cc/Products/63.aspx Apexis APM-J901-Z-WS PTZ IP Wireless/Wired Camera] ==&lt;br /&gt;
[[file:APM-J901-Z-WS-3.jpg|200px|thumb|right|Apexis APM-J901-Z-WS]]&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
:Wired and Wireless Ethernet. 802.11b/g with WEP &amp;amp; WPA WPA2 encryption&lt;br /&gt;
:3x optical zoom&lt;br /&gt;
:355° pan, 90° tilt&lt;br /&gt;
:POE&lt;br /&gt;
:DDNS&lt;br /&gt;
:Supports VLC &amp;#039;&amp;#039;(apparently!)&amp;#039;&amp;#039;&lt;br /&gt;
:Supports MSN&lt;br /&gt;
:Supports Firefox/Chrome (ie: Push-mode)&lt;br /&gt;
:Two-way audio capable (microphone and speaker not included)&lt;br /&gt;
:FTP uploads&lt;br /&gt;
:Email alerts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Settings ===&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Source&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
|width=&amp;quot;25%&amp;quot; | Remote Protocol&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | HTTP&lt;br /&gt;
|-&lt;br /&gt;
| Remote Method&lt;br /&gt;
| Simple&lt;br /&gt;
|-&lt;br /&gt;
| Remote Host Name&lt;br /&gt;
| &amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Remote Host Port&lt;br /&gt;
| 80&lt;br /&gt;
|-&lt;br /&gt;
| Remote Host Path&lt;br /&gt;
| videostream.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;or&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
snapshot.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;amp;resolution=32&amp;amp;rate=0&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;eg: snapshot.cgi?user=zoneminder&amp;amp;pwd=zonepass&amp;amp;resolution=32&amp;amp;rate=0&lt;br /&gt;
|-&lt;br /&gt;
| Remote Image colors&lt;br /&gt;
| 24 bit&lt;br /&gt;
|-&lt;br /&gt;
| Capture Width&lt;br /&gt;
| 640&lt;br /&gt;
|-&lt;br /&gt;
| Capture Height&lt;br /&gt;
| 480&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Control&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
|width=&amp;quot;25%&amp;quot; | Controllable&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| Control Type&lt;br /&gt;
| Apexis Mjpeg IP &amp;#039;&amp;#039;&amp;lt;br/&amp;gt;(Select &amp;#039;&amp;#039;&amp;#039;Edit&amp;#039;&amp;#039;&amp;#039; to access &amp;#039;&amp;#039;&amp;#039;Control Capabilities&amp;#039;&amp;#039;&amp;#039;)&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Control Address&lt;br /&gt;
| &amp;lt;USERNAME&amp;gt;:&amp;lt;PASSWORD&amp;gt;@&amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;:&amp;lt;PORT&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
eg: admin:@&amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;:80&amp;lt;br/&amp;gt;&lt;br /&gt;
eg: zoneminder:zonepass@192.168.1.111&lt;br /&gt;
|-&lt;br /&gt;
| Auto Stop Timeout&lt;br /&gt;
| 0.10&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
;Control Capability - Apexis Mjpeg IP&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Main&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
|width=&amp;quot;25%&amp;quot; | Name&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | Apexis Mjpeg IP&lt;br /&gt;
|-&lt;br /&gt;
| Type&lt;br /&gt;
| Remote&lt;br /&gt;
|-&lt;br /&gt;
| Protocol&lt;br /&gt;
| ApexisMjpegIP&amp;lt;br/&amp;gt;&amp;#039;&amp;#039;(Refer to control protocol below)&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Can Reset&lt;br /&gt;
| [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Move&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Move&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| Can Move Continuous&lt;br /&gt;
| [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Pan&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Pan&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Tilt&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Tilt&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Zoom&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Zoom&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Zoom Continuous&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Presets&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Has Presets&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Num Presets&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | 8 &amp;#039;&amp;#039;(to be confirmed)&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Set Presets&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Control protocol for Apexis MJPEG Cameras ==&lt;br /&gt;
&lt;br /&gt;
Save the following code as &amp;#039;&amp;#039;/usr/share/perl5/ZoneMinder/Control/ApexisMjpegIP.pm&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Don&amp;#039;t forget to set the user and password as I haven&amp;#039;t figured that bit out yet ;).&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 #&lt;br /&gt;
 # ZoneMinder Apexis MJPEG IP Camera Control Protocol Module&lt;br /&gt;
 # Copyright (C) 2012 Marcus Brown&lt;br /&gt;
 # Shamefully copied from the Loftek module by Philip Coombes&lt;br /&gt;
 #&lt;br /&gt;
 # This program is free software; you can redistribute it and/or&lt;br /&gt;
 # modify it under the terms of the GNU General Public License&lt;br /&gt;
 # as published by the Free Software Foundation; either version 2&lt;br /&gt;
 # of the License, or (at your option) any later version.&lt;br /&gt;
 #&lt;br /&gt;
 # This program is distributed in the hope that it will be useful,&lt;br /&gt;
 # but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&lt;br /&gt;
 # GNU General Public License for more details.&lt;br /&gt;
 #&lt;br /&gt;
 # You should have received a copy of the GNU General Public License&lt;br /&gt;
 # along with this program; if not, write to the Free Software&lt;br /&gt;
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.&lt;br /&gt;
 #&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 #&lt;br /&gt;
 # This module contains the implementation of the Apexis MJPEG IP camera control&lt;br /&gt;
 # protocol&lt;br /&gt;
 #&lt;br /&gt;
 package ZoneMinder::Control::ApexisMjpegIP;&lt;br /&gt;
 &lt;br /&gt;
 use 5.006;&lt;br /&gt;
 use strict;&lt;br /&gt;
 use warnings;&lt;br /&gt;
 &lt;br /&gt;
 require ZoneMinder::Base;&lt;br /&gt;
 require ZoneMinder::Control;&lt;br /&gt;
 &lt;br /&gt;
 our @ISA = qw(ZoneMinder::Control);&lt;br /&gt;
 &lt;br /&gt;
 our $VERSION = $ZoneMinder::Base::VERSION;&lt;br /&gt;
 &lt;br /&gt;
 our %CamParams = ();&lt;br /&gt;
 &lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 #&lt;br /&gt;
 # Apexis MJPEG IP Control Protocol&lt;br /&gt;
 #&lt;br /&gt;
 # On ControlAddress use the format :&lt;br /&gt;
 #   USERNAME:PASSWORD@ADDRESS:PORT&lt;br /&gt;
 #   eg : admin:@10.1.2.1:80&lt;br /&gt;
 #        zoneminder:zonepass@10.0.100.1:40000&lt;br /&gt;
 #&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 &lt;br /&gt;
 # Change &amp;quot;ZoneMinder::Logger&amp;quot; to &amp;quot;ZoneMinder::Debug&amp;quot; for zoneminder &amp;lt; 1.25.0&lt;br /&gt;
 use ZoneMinder::Logger qw(:all);&lt;br /&gt;
 use ZoneMinder::Config qw(:all);&lt;br /&gt;
 &lt;br /&gt;
 use Time::HiRes qw( usleep );&lt;br /&gt;
 &lt;br /&gt;
 sub new&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
     my $class = shift;&lt;br /&gt;
     my $id = shift;&lt;br /&gt;
     my $self = ZoneMinder::Control-&amp;gt;new( $id );&lt;br /&gt;
     my $logindetails = &amp;quot;&amp;quot;;&lt;br /&gt;
     bless( $self, $class );&lt;br /&gt;
     srand( time() );&lt;br /&gt;
     return $self;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 our $AUTOLOAD;&lt;br /&gt;
 &lt;br /&gt;
 sub AUTOLOAD&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $class = ref( ) || croak( &amp;quot;$self not object&amp;quot; );&lt;br /&gt;
     my $name = $AUTOLOAD;&lt;br /&gt;
     $name =~ s/.*://;&lt;br /&gt;
     if ( exists($self-&amp;gt;{$name}) )&lt;br /&gt;
     {&lt;br /&gt;
         return( $self-&amp;gt;{$name} );&lt;br /&gt;
     }&lt;br /&gt;
         Fatal( &amp;quot;Can&amp;#039;t access $name member of object of class $class&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 sub open&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
 &lt;br /&gt;
     $self-&amp;gt;loadMonitor();&lt;br /&gt;
 &lt;br /&gt;
     use LWP::UserAgent;&lt;br /&gt;
     $self-&amp;gt;{ua} = LWP::UserAgent-&amp;gt;new;&lt;br /&gt;
     $self-&amp;gt;{ua}-&amp;gt;agent( &amp;quot;ZoneMinder Control Agent/&amp;quot;.ZM_VERSION );&lt;br /&gt;
 &lt;br /&gt;
     $self-&amp;gt;{state} = &amp;#039;open&amp;#039;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub close&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     $self-&amp;gt;{state} = &amp;#039;closed&amp;#039;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub printMsg&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $msg = shift;&lt;br /&gt;
     my $msg_len = length($msg);&lt;br /&gt;
 &lt;br /&gt;
     Debug( $msg.&amp;quot;[&amp;quot;.$msg_len.&amp;quot;]&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub sendCmd&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $cmd = shift;&lt;br /&gt;
     my $result = undef;&lt;br /&gt;
     printMsg( $cmd, &amp;quot;Tx&amp;quot; );&lt;br /&gt;
 &lt;br /&gt;
     # ############################################################################################&lt;br /&gt;
     #&lt;br /&gt;
     #  CHANGE THE FOLLOWING LINE IF NECESSARY&lt;br /&gt;
     #  IT SHOULD WORK WITH A DEFAULT CAMERA, BUT SURELY YOU WILL BE SETTING AN ADMIN PASSWORD? :)&lt;br /&gt;
     #  &lt;br /&gt;
     # ############################################################################################&lt;br /&gt;
     my $req = HTTP::Request-&amp;gt;new( GET=&amp;gt;&amp;quot;http://&amp;quot;.$self-&amp;gt;{Monitor}-&amp;gt;{ControlAddress}.&amp;quot;/$cmd\&amp;amp;user=admin\&amp;amp;pwd=&amp;quot;  );&lt;br /&gt;
     my $res = $self-&amp;gt;{ua}-&amp;gt;request($req);&lt;br /&gt;
 &lt;br /&gt;
     if ( $res-&amp;gt;is_success )&lt;br /&gt;
     {&lt;br /&gt;
         $result = !undef;&lt;br /&gt;
     }&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
         Error( &amp;quot;Error check failed:&amp;#039;&amp;quot;.$res-&amp;gt;status_line().&amp;quot;&amp;#039;&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     return( $result );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub getCamParams&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
 &lt;br /&gt;
     my $req = HTTP::Request-&amp;gt;new( GET=&amp;gt;&amp;quot;http://&amp;quot;.$self-&amp;gt;{Monitor}-&amp;gt;{ControlAddress}.&amp;quot;/get_params.cgi&amp;quot; );&lt;br /&gt;
     my $res = $self-&amp;gt;{ua}-&amp;gt;request($req);&lt;br /&gt;
 &lt;br /&gt;
     if ( $res-&amp;gt;is_success )&lt;br /&gt;
     {&lt;br /&gt;
         # Parse results setting values in %FCParams&lt;br /&gt;
         my $content = $res-&amp;gt;decoded_content;&lt;br /&gt;
 &lt;br /&gt;
         while ($content =~ s/var\s+([^=]+)=([^;]+);//ms) {&lt;br /&gt;
             $CamParams{$1} = $2;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
         Error( &amp;quot;Error check failed:&amp;#039;&amp;quot;.$res-&amp;gt;status_line().&amp;quot;&amp;#039;&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #autoStop&lt;br /&gt;
 #This makes use of the ZoneMinder Auto Stop Timeout on the Control Tab&lt;br /&gt;
 sub autoStop&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = shift;&lt;br /&gt;
     my $autostop = shift;&lt;br /&gt;
     if( $stop_command &amp;amp;&amp;amp; $autostop)&lt;br /&gt;
     {&lt;br /&gt;
         Debug( &amp;quot;Auto Stop&amp;quot; );&lt;br /&gt;
         usleep( $autostop );&lt;br /&gt;
         my $cmd = &amp;quot;decoder_control.cgi?command=&amp;quot;.$stop_command;&lt;br /&gt;
         $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # Reset the Camera&lt;br /&gt;
 sub reset&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Camera Reset&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;reboot.cgi?&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Up Arrow&lt;br /&gt;
 sub moveConUp&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;1&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Up&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=0&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Down Arrow&lt;br /&gt;
 sub moveConDown&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;3&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Down&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=2&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Left Arrow&lt;br /&gt;
 sub moveConLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;5&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Left&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=4&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Right Arrow&lt;br /&gt;
 sub moveConRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;7&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Right&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=6&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 # Single-step movements&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 # &amp;#039;onestep&amp;#039; and &amp;#039;degree&amp;#039; don&amp;#039;t appear to work for the J901&lt;br /&gt;
 &lt;br /&gt;
 sub moveRelUp&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Up&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=0&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelDown&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Down&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=2&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Left&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=4&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Right&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=6&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveRelUpRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Up Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConUp( );&lt;br /&gt;
     $self-&amp;gt;stepConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelDownRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Down Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConDown( );&lt;br /&gt;
     $self-&amp;gt;stepConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelUpLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Up Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConUp( );&lt;br /&gt;
     $self-&amp;gt;stepConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelDownLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Down Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConDown( );&lt;br /&gt;
     $self-&amp;gt;stepConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 # Iris/Aperture control ... this is *NOT* &amp;#039;iris&amp;#039; as &amp;#039;brightness&amp;#039; ?&lt;br /&gt;
 #&lt;br /&gt;
 # Doubt this works on J901&lt;br /&gt;
 &lt;br /&gt;
 sub irisConClose&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;8&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=9&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub irisConOpen&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;10&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=11&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 # Focus control&lt;br /&gt;
 #&lt;br /&gt;
 # J901 is manual focus&lt;br /&gt;
 &lt;br /&gt;
 sub focusConNear&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;13&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=12&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub focusConFar&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;15&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=14&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 &lt;br /&gt;
 #Zoom In&lt;br /&gt;
 sub zoomConTele&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;19&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Zoom Tele&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=18&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #~ #Zoom Out&lt;br /&gt;
 sub zoomConWide&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;17&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Zoom Wide&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=16&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #~ #Diagonally Up Right Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConUpRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Up Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConUp( );&lt;br /&gt;
     $self-&amp;gt;moveConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Diagonally Down Right Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConDownRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Down Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConDown( );&lt;br /&gt;
     $self-&amp;gt;moveConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 #~&lt;br /&gt;
 #Diagonally Up Left Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConUpLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Up Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConUp( );&lt;br /&gt;
     $self-&amp;gt;moveConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 #~&lt;br /&gt;
 #Diagonally Down Left Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConDownLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Down Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConDown( );&lt;br /&gt;
     $self-&amp;gt;moveConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Stop&lt;br /&gt;
 #~ sub moveStop&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ Debug( &amp;quot;Move Stop&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;decoder_control.cgi?command=1&amp;quot;;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 #Set Camera Preset&lt;br /&gt;
 #Presets must be translated into values internal to the camera&lt;br /&gt;
 #Those values are: 30,32,34 ... 88,90,92 for presets 1-32 respectively&lt;br /&gt;
 sub presetSet&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $params = shift;&lt;br /&gt;
     my $preset = $self-&amp;gt;getParam( $params, &amp;#039;preset&amp;#039; );&lt;br /&gt;
     Debug( &amp;quot;Set Preset $preset&amp;quot; );&lt;br /&gt;
 #~&lt;br /&gt;
     if (( $preset &amp;gt;= 1 ) &amp;amp;&amp;amp; ( $preset &amp;lt;= 32 )) {&lt;br /&gt;
         my $cmd = &amp;quot;decoder_control.cgi?command=&amp;quot;.(($preset*2) + 28);&lt;br /&gt;
         $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Recall Camera Preset&lt;br /&gt;
 #Presets must be translated into values internal to the camera&lt;br /&gt;
 #Those values are: 31,33,35 ... 89,91,93 for presets 1-32 respectively&lt;br /&gt;
 sub presetGoto&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $params = shift;&lt;br /&gt;
     my $preset = $self-&amp;gt;getParam( $params, &amp;#039;preset&amp;#039; );&lt;br /&gt;
     Debug( &amp;quot;Goto Preset $preset&amp;quot; );&lt;br /&gt;
 #~&lt;br /&gt;
     if (( $preset &amp;gt;= 1 ) &amp;amp;&amp;amp; ( $preset &amp;lt;= 32 )) {&lt;br /&gt;
         my $cmd = &amp;quot;decoder_control.cgi?command=&amp;quot;.(($preset*2) + 29);&lt;br /&gt;
         $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     #~ if ( $preset == 9 ) {&lt;br /&gt;
         #~ $self-&amp;gt;horizontalPatrol();&lt;br /&gt;
     #~ }&lt;br /&gt;
     #~ if ( $preset == 10 ) {&lt;br /&gt;
         #~ $self-&amp;gt;horizontalPatrolStop();&lt;br /&gt;
     #~ }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #~ sub presetHome&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ Debug( &amp;quot;Home Preset&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;decoder_control.cgi?command=25&amp;quot;;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 #Horizontal Patrol - Vertical Patrols are not supported&lt;br /&gt;
 sub horizontalPatrol&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Horizontal Patrol&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=20&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Horizontal Patrol Stop&lt;br /&gt;
 sub horizontalPatrolStop&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Horizontal Patrol Stop&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=21&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # Set Absolute Brightness&lt;br /&gt;
 #~ sub setAbsBrightness&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $brightness = shift;&lt;br /&gt;
     #~ $brightness = 255 if $brightness &amp;gt; 255;&lt;br /&gt;
     #~ $brightness = 0   if $brightness &amp;lt; 0;&lt;br /&gt;
     #~ Debug( &amp;quot;Setting brightness to $brightness&amp;quot; };&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} = $brightness;&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=1&amp;amp;value=&amp;quot;.$brightness;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Increase Brightness&lt;br /&gt;
 #~ sub irisAbsOpen&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;brightness&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} += $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} = 255 if ($CamParams{&amp;#039;brightness&amp;#039;} &amp;gt; 255);&lt;br /&gt;
     #~ Debug( &amp;quot;Iris $CamParams{&amp;#039;brightness&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=1&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;brightness&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Decrease Brightness&lt;br /&gt;
 #~ sub irisAbsClose&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;brightness&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} -= $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} = 0 if ($CamParams{&amp;#039;brightness&amp;#039;} &amp;lt; 0);&lt;br /&gt;
     #~ Debug( &amp;quot;Iris $CamParams{&amp;#039;brightness&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=1&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;brightness&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Set Absolute Contrast&lt;br /&gt;
 #~ sub setAbsContrast&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $contrast = shift;&lt;br /&gt;
     #~ $contrast = 255 if $contrast &amp;gt; 255;&lt;br /&gt;
     #~ $contrast = 0   if $contrast &amp;lt; 0;&lt;br /&gt;
     #~ Debug( &amp;quot;Setting contrast to $contrast&amp;quot; };&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} = $contrast;&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=2&amp;amp;value=&amp;quot;.$contrast;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Increase Contrast&lt;br /&gt;
 #~ sub whiteAbsIn&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;contrast&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} += $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} = 6 if ($CamParams{&amp;#039;contrast&amp;#039;} &amp;gt; 6);&lt;br /&gt;
     #~ Debug( &amp;quot;Contrast $CamParams{&amp;#039;contrast&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=2&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;contrast&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Decrease Contrast&lt;br /&gt;
 #~ sub whiteAbsOut&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;contrast&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} -= $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} = 0 if ($CamParams{&amp;#039;contrast&amp;#039;} &amp;lt; 0);&lt;br /&gt;
     #~ Debug( &amp;quot;Iris $CamParams{&amp;#039;contrast&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=2&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;contrast&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 1;&lt;/div&gt;</summary>
		<author><name>Dl6er</name></author>
	</entry>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=File:Snapshot_20140915180703.jpg&amp;diff=6394</id>
		<title>File:Snapshot 20140915180703.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=File:Snapshot_20140915180703.jpg&amp;diff=6394"/>
		<updated>2014-09-16T13:57:05Z</updated>

		<summary type="html">&lt;p&gt;Dl6er: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dl6er</name></author>
	</entry>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=Apexis&amp;diff=6385</id>
		<title>Apexis</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=Apexis&amp;diff=6385"/>
		<updated>2014-09-10T13:41:23Z</updated>

		<summary type="html">&lt;p&gt;Dl6er: /* Apexis APM J0233 WS IR (IR, outdoor, IP66) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Apexis APM J0233 WS IR (IR, outdoor, IP66) ==&lt;br /&gt;
[[File:APMJ0233WSIR_02.png|200px|thumb|right|Apexis APM J0233 WS IR]]&lt;br /&gt;
Sometimes there are distortions when switching from Nightvision to normal and back. Overall nice image quality.&lt;br /&gt;
I had to create a new user to access the image (needs only limited permissions).&lt;br /&gt;
&lt;br /&gt;
Remote Protocol: HTTP&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Method: Simple&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Name: &amp;lt;ip of camera&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Port: 80&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Path: videostream.cgi?user=&amp;#039;&amp;#039;&amp;#039;&amp;lt;USERNAME&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;amp;pwd=&amp;#039;&amp;#039;&amp;#039;&amp;lt;PASSWORD&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;amp;resolution=&amp;#039;&amp;#039;&amp;#039;32&amp;#039;&amp;#039;&amp;#039;&amp;amp;rate=&amp;#039;&amp;#039;&amp;#039;11&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Image colors: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Available resolutions:&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;2&amp;#039;&amp;#039;&amp;#039; = 160x120 (QQVGA); &amp;#039;&amp;#039;&amp;#039;8&amp;#039;&amp;#039;&amp;#039; = 320x240 (QVGA); &amp;#039;&amp;#039;&amp;#039;32&amp;#039;&amp;#039;&amp;#039; = 640x480 (VGA)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Possible image transmission rates:&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039; = 20fps; &amp;#039;&amp;#039;&amp;#039;3&amp;#039;&amp;#039;&amp;#039; = 15fps; &amp;#039;&amp;#039;&amp;#039;6&amp;#039;&amp;#039;&amp;#039; = 10fps; &amp;#039;&amp;#039;&amp;#039;11&amp;#039;&amp;#039;&amp;#039; = 5fps; &amp;#039;&amp;#039;&amp;#039;13&amp;#039;&amp;#039;&amp;#039; = 3fps; &amp;#039;&amp;#039;&amp;#039;15&amp;#039;&amp;#039;&amp;#039; = 1fps; &amp;#039;&amp;#039;&amp;#039;17&amp;#039;&amp;#039;&amp;#039; = 0.5fps;&lt;br /&gt;
&lt;br /&gt;
== Apexis J12 IP Camera ==&lt;br /&gt;
&lt;br /&gt;
Remote Protocol: HTTP&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Method: Simple&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Name: &amp;lt;ip of camera&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Port: 80&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Path: videostream.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Image colors: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
It is recommended to set Max FPS to 20.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apexis APM-J011-WS IP Camera ==&lt;br /&gt;
&lt;br /&gt;
Remote Protocol: HTTP &amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Method: Simple &amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Name: &amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Port: 80&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Path: videostream.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Image colors: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Maximum frame rate this IP web camera can handle is 15 fps at 640x480. The &amp;lt;USERNAME&amp;gt; and &amp;lt;PASSWORD&amp;gt; are found in the &amp;quot;Users Settings&amp;quot; section of the IP Camera&amp;#039;s web setup page. &lt;br /&gt;
Pan Tilt Control is not available in Zoneminder 1.25.0 at this time (Feb 2012.)  This IP camera does not have a zoom function, only pan and tilt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [http://apexis.cc/Products/63.aspx Apexis APM-J901-Z-WS PTZ IP Wireless/Wired Camera] ==&lt;br /&gt;
[[file:APM-J901-Z-WS-3.jpg|200px|thumb|right|Apexis APM-J901-Z-WS]]&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
:Wired and Wireless Ethernet. 802.11b/g with WEP &amp;amp; WPA WPA2 encryption&lt;br /&gt;
:3x optical zoom&lt;br /&gt;
:355° pan, 90° tilt&lt;br /&gt;
:POE&lt;br /&gt;
:DDNS&lt;br /&gt;
:Supports VLC &amp;#039;&amp;#039;(apparently!)&amp;#039;&amp;#039;&lt;br /&gt;
:Supports MSN&lt;br /&gt;
:Supports Firefox/Chrome (ie: Push-mode)&lt;br /&gt;
:Two-way audio capable (microphone and speaker not included)&lt;br /&gt;
:FTP uploads&lt;br /&gt;
:Email alerts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Settings ===&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Source&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
|width=&amp;quot;25%&amp;quot; | Remote Protocol&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | HTTP&lt;br /&gt;
|-&lt;br /&gt;
| Remote Method&lt;br /&gt;
| Simple&lt;br /&gt;
|-&lt;br /&gt;
| Remote Host Name&lt;br /&gt;
| &amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Remote Host Port&lt;br /&gt;
| 80&lt;br /&gt;
|-&lt;br /&gt;
| Remote Host Path&lt;br /&gt;
| videostream.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;or&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
snapshot.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;amp;resolution=32&amp;amp;rate=0&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;eg: snapshot.cgi?user=zoneminder&amp;amp;pwd=zonepass&amp;amp;resolution=32&amp;amp;rate=0&lt;br /&gt;
|-&lt;br /&gt;
| Remote Image colors&lt;br /&gt;
| 24 bit&lt;br /&gt;
|-&lt;br /&gt;
| Capture Width&lt;br /&gt;
| 640&lt;br /&gt;
|-&lt;br /&gt;
| Capture Height&lt;br /&gt;
| 480&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Control&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
|width=&amp;quot;25%&amp;quot; | Controllable&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| Control Type&lt;br /&gt;
| Apexis Mjpeg IP &amp;#039;&amp;#039;&amp;lt;br/&amp;gt;(Select &amp;#039;&amp;#039;&amp;#039;Edit&amp;#039;&amp;#039;&amp;#039; to access &amp;#039;&amp;#039;&amp;#039;Control Capabilities&amp;#039;&amp;#039;&amp;#039;)&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Control Address&lt;br /&gt;
| &amp;lt;USERNAME&amp;gt;:&amp;lt;PASSWORD&amp;gt;@&amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;:&amp;lt;PORT&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
eg: admin:@&amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;:80&amp;lt;br/&amp;gt;&lt;br /&gt;
eg: zoneminder:zonepass@192.168.1.111&lt;br /&gt;
|-&lt;br /&gt;
| Auto Stop Timeout&lt;br /&gt;
| 0.10&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
;Control Capability - Apexis Mjpeg IP&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Main&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
|width=&amp;quot;25%&amp;quot; | Name&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | Apexis Mjpeg IP&lt;br /&gt;
|-&lt;br /&gt;
| Type&lt;br /&gt;
| Remote&lt;br /&gt;
|-&lt;br /&gt;
| Protocol&lt;br /&gt;
| ApexisMjpegIP&amp;lt;br/&amp;gt;&amp;#039;&amp;#039;(Refer to control protocol below)&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Can Reset&lt;br /&gt;
| [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Move&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Move&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| Can Move Continuous&lt;br /&gt;
| [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Pan&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Pan&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Tilt&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Tilt&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Zoom&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Zoom&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Zoom Continuous&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Presets&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Has Presets&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Num Presets&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | 8 &amp;#039;&amp;#039;(to be confirmed)&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Set Presets&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Control protocol for Apexis MJPEG Cameras ==&lt;br /&gt;
&lt;br /&gt;
Save the following code as &amp;#039;&amp;#039;/usr/share/perl5/ZoneMinder/Control/ApexisMjpegIP.pm&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Don&amp;#039;t forget to set the user and password as I haven&amp;#039;t figured that bit out yet ;).&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 #&lt;br /&gt;
 # ZoneMinder Apexis MJPEG IP Camera Control Protocol Module&lt;br /&gt;
 # Copyright (C) 2012 Marcus Brown&lt;br /&gt;
 # Shamefully copied from the Loftek module by Philip Coombes&lt;br /&gt;
 #&lt;br /&gt;
 # This program is free software; you can redistribute it and/or&lt;br /&gt;
 # modify it under the terms of the GNU General Public License&lt;br /&gt;
 # as published by the Free Software Foundation; either version 2&lt;br /&gt;
 # of the License, or (at your option) any later version.&lt;br /&gt;
 #&lt;br /&gt;
 # This program is distributed in the hope that it will be useful,&lt;br /&gt;
 # but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&lt;br /&gt;
 # GNU General Public License for more details.&lt;br /&gt;
 #&lt;br /&gt;
 # You should have received a copy of the GNU General Public License&lt;br /&gt;
 # along with this program; if not, write to the Free Software&lt;br /&gt;
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.&lt;br /&gt;
 #&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 #&lt;br /&gt;
 # This module contains the implementation of the Apexis MJPEG IP camera control&lt;br /&gt;
 # protocol&lt;br /&gt;
 #&lt;br /&gt;
 package ZoneMinder::Control::ApexisMjpegIP;&lt;br /&gt;
 &lt;br /&gt;
 use 5.006;&lt;br /&gt;
 use strict;&lt;br /&gt;
 use warnings;&lt;br /&gt;
 &lt;br /&gt;
 require ZoneMinder::Base;&lt;br /&gt;
 require ZoneMinder::Control;&lt;br /&gt;
 &lt;br /&gt;
 our @ISA = qw(ZoneMinder::Control);&lt;br /&gt;
 &lt;br /&gt;
 our $VERSION = $ZoneMinder::Base::VERSION;&lt;br /&gt;
 &lt;br /&gt;
 our %CamParams = ();&lt;br /&gt;
 &lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 #&lt;br /&gt;
 # Apexis MJPEG IP Control Protocol&lt;br /&gt;
 #&lt;br /&gt;
 # On ControlAddress use the format :&lt;br /&gt;
 #   USERNAME:PASSWORD@ADDRESS:PORT&lt;br /&gt;
 #   eg : admin:@10.1.2.1:80&lt;br /&gt;
 #        zoneminder:zonepass@10.0.100.1:40000&lt;br /&gt;
 #&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 &lt;br /&gt;
 # Change &amp;quot;ZoneMinder::Logger&amp;quot; to &amp;quot;ZoneMinder::Debug&amp;quot; for zoneminder &amp;lt; 1.25.0&lt;br /&gt;
 use ZoneMinder::Logger qw(:all);&lt;br /&gt;
 use ZoneMinder::Config qw(:all);&lt;br /&gt;
 &lt;br /&gt;
 use Time::HiRes qw( usleep );&lt;br /&gt;
 &lt;br /&gt;
 sub new&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
     my $class = shift;&lt;br /&gt;
     my $id = shift;&lt;br /&gt;
     my $self = ZoneMinder::Control-&amp;gt;new( $id );&lt;br /&gt;
     my $logindetails = &amp;quot;&amp;quot;;&lt;br /&gt;
     bless( $self, $class );&lt;br /&gt;
     srand( time() );&lt;br /&gt;
     return $self;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 our $AUTOLOAD;&lt;br /&gt;
 &lt;br /&gt;
 sub AUTOLOAD&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $class = ref( ) || croak( &amp;quot;$self not object&amp;quot; );&lt;br /&gt;
     my $name = $AUTOLOAD;&lt;br /&gt;
     $name =~ s/.*://;&lt;br /&gt;
     if ( exists($self-&amp;gt;{$name}) )&lt;br /&gt;
     {&lt;br /&gt;
         return( $self-&amp;gt;{$name} );&lt;br /&gt;
     }&lt;br /&gt;
         Fatal( &amp;quot;Can&amp;#039;t access $name member of object of class $class&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 sub open&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
 &lt;br /&gt;
     $self-&amp;gt;loadMonitor();&lt;br /&gt;
 &lt;br /&gt;
     use LWP::UserAgent;&lt;br /&gt;
     $self-&amp;gt;{ua} = LWP::UserAgent-&amp;gt;new;&lt;br /&gt;
     $self-&amp;gt;{ua}-&amp;gt;agent( &amp;quot;ZoneMinder Control Agent/&amp;quot;.ZM_VERSION );&lt;br /&gt;
 &lt;br /&gt;
     $self-&amp;gt;{state} = &amp;#039;open&amp;#039;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub close&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     $self-&amp;gt;{state} = &amp;#039;closed&amp;#039;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub printMsg&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $msg = shift;&lt;br /&gt;
     my $msg_len = length($msg);&lt;br /&gt;
 &lt;br /&gt;
     Debug( $msg.&amp;quot;[&amp;quot;.$msg_len.&amp;quot;]&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub sendCmd&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $cmd = shift;&lt;br /&gt;
     my $result = undef;&lt;br /&gt;
     printMsg( $cmd, &amp;quot;Tx&amp;quot; );&lt;br /&gt;
 &lt;br /&gt;
     # ############################################################################################&lt;br /&gt;
     #&lt;br /&gt;
     #  CHANGE THE FOLLOWING LINE IF NECESSARY&lt;br /&gt;
     #  IT SHOULD WORK WITH A DEFAULT CAMERA, BUT SURELY YOU WILL BE SETTING AN ADMIN PASSWORD? :)&lt;br /&gt;
     #  &lt;br /&gt;
     # ############################################################################################&lt;br /&gt;
     my $req = HTTP::Request-&amp;gt;new( GET=&amp;gt;&amp;quot;http://&amp;quot;.$self-&amp;gt;{Monitor}-&amp;gt;{ControlAddress}.&amp;quot;/$cmd\&amp;amp;user=admin\&amp;amp;pwd=&amp;quot;  );&lt;br /&gt;
     my $res = $self-&amp;gt;{ua}-&amp;gt;request($req);&lt;br /&gt;
 &lt;br /&gt;
     if ( $res-&amp;gt;is_success )&lt;br /&gt;
     {&lt;br /&gt;
         $result = !undef;&lt;br /&gt;
     }&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
         Error( &amp;quot;Error check failed:&amp;#039;&amp;quot;.$res-&amp;gt;status_line().&amp;quot;&amp;#039;&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     return( $result );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub getCamParams&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
 &lt;br /&gt;
     my $req = HTTP::Request-&amp;gt;new( GET=&amp;gt;&amp;quot;http://&amp;quot;.$self-&amp;gt;{Monitor}-&amp;gt;{ControlAddress}.&amp;quot;/get_params.cgi&amp;quot; );&lt;br /&gt;
     my $res = $self-&amp;gt;{ua}-&amp;gt;request($req);&lt;br /&gt;
 &lt;br /&gt;
     if ( $res-&amp;gt;is_success )&lt;br /&gt;
     {&lt;br /&gt;
         # Parse results setting values in %FCParams&lt;br /&gt;
         my $content = $res-&amp;gt;decoded_content;&lt;br /&gt;
 &lt;br /&gt;
         while ($content =~ s/var\s+([^=]+)=([^;]+);//ms) {&lt;br /&gt;
             $CamParams{$1} = $2;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
         Error( &amp;quot;Error check failed:&amp;#039;&amp;quot;.$res-&amp;gt;status_line().&amp;quot;&amp;#039;&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #autoStop&lt;br /&gt;
 #This makes use of the ZoneMinder Auto Stop Timeout on the Control Tab&lt;br /&gt;
 sub autoStop&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = shift;&lt;br /&gt;
     my $autostop = shift;&lt;br /&gt;
     if( $stop_command &amp;amp;&amp;amp; $autostop)&lt;br /&gt;
     {&lt;br /&gt;
         Debug( &amp;quot;Auto Stop&amp;quot; );&lt;br /&gt;
         usleep( $autostop );&lt;br /&gt;
         my $cmd = &amp;quot;decoder_control.cgi?command=&amp;quot;.$stop_command;&lt;br /&gt;
         $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # Reset the Camera&lt;br /&gt;
 sub reset&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Camera Reset&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;reboot.cgi?&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Up Arrow&lt;br /&gt;
 sub moveConUp&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;1&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Up&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=0&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Down Arrow&lt;br /&gt;
 sub moveConDown&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;3&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Down&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=2&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Left Arrow&lt;br /&gt;
 sub moveConLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;5&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Left&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=4&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Right Arrow&lt;br /&gt;
 sub moveConRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;7&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Right&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=6&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 # Single-step movements&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 # &amp;#039;onestep&amp;#039; and &amp;#039;degree&amp;#039; don&amp;#039;t appear to work for the J901&lt;br /&gt;
 &lt;br /&gt;
 sub moveRelUp&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Up&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=0&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelDown&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Down&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=2&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Left&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=4&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Right&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=6&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveRelUpRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Up Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConUp( );&lt;br /&gt;
     $self-&amp;gt;stepConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelDownRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Down Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConDown( );&lt;br /&gt;
     $self-&amp;gt;stepConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelUpLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Up Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConUp( );&lt;br /&gt;
     $self-&amp;gt;stepConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelDownLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Down Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConDown( );&lt;br /&gt;
     $self-&amp;gt;stepConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 # Iris/Aperture control ... this is *NOT* &amp;#039;iris&amp;#039; as &amp;#039;brightness&amp;#039; ?&lt;br /&gt;
 #&lt;br /&gt;
 # Doubt this works on J901&lt;br /&gt;
 &lt;br /&gt;
 sub irisConClose&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;8&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=9&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub irisConOpen&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;10&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=11&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 # Focus control&lt;br /&gt;
 #&lt;br /&gt;
 # J901 is manual focus&lt;br /&gt;
 &lt;br /&gt;
 sub focusConNear&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;13&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=12&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub focusConFar&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;15&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=14&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 &lt;br /&gt;
 #Zoom In&lt;br /&gt;
 sub zoomConTele&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;19&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Zoom Tele&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=18&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #~ #Zoom Out&lt;br /&gt;
 sub zoomConWide&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;17&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Zoom Wide&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=16&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #~ #Diagonally Up Right Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConUpRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Up Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConUp( );&lt;br /&gt;
     $self-&amp;gt;moveConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Diagonally Down Right Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConDownRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Down Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConDown( );&lt;br /&gt;
     $self-&amp;gt;moveConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 #~&lt;br /&gt;
 #Diagonally Up Left Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConUpLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Up Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConUp( );&lt;br /&gt;
     $self-&amp;gt;moveConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 #~&lt;br /&gt;
 #Diagonally Down Left Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConDownLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Down Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConDown( );&lt;br /&gt;
     $self-&amp;gt;moveConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Stop&lt;br /&gt;
 #~ sub moveStop&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ Debug( &amp;quot;Move Stop&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;decoder_control.cgi?command=1&amp;quot;;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 #Set Camera Preset&lt;br /&gt;
 #Presets must be translated into values internal to the camera&lt;br /&gt;
 #Those values are: 30,32,34 ... 88,90,92 for presets 1-32 respectively&lt;br /&gt;
 sub presetSet&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $params = shift;&lt;br /&gt;
     my $preset = $self-&amp;gt;getParam( $params, &amp;#039;preset&amp;#039; );&lt;br /&gt;
     Debug( &amp;quot;Set Preset $preset&amp;quot; );&lt;br /&gt;
 #~&lt;br /&gt;
     if (( $preset &amp;gt;= 1 ) &amp;amp;&amp;amp; ( $preset &amp;lt;= 32 )) {&lt;br /&gt;
         my $cmd = &amp;quot;decoder_control.cgi?command=&amp;quot;.(($preset*2) + 28);&lt;br /&gt;
         $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Recall Camera Preset&lt;br /&gt;
 #Presets must be translated into values internal to the camera&lt;br /&gt;
 #Those values are: 31,33,35 ... 89,91,93 for presets 1-32 respectively&lt;br /&gt;
 sub presetGoto&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $params = shift;&lt;br /&gt;
     my $preset = $self-&amp;gt;getParam( $params, &amp;#039;preset&amp;#039; );&lt;br /&gt;
     Debug( &amp;quot;Goto Preset $preset&amp;quot; );&lt;br /&gt;
 #~&lt;br /&gt;
     if (( $preset &amp;gt;= 1 ) &amp;amp;&amp;amp; ( $preset &amp;lt;= 32 )) {&lt;br /&gt;
         my $cmd = &amp;quot;decoder_control.cgi?command=&amp;quot;.(($preset*2) + 29);&lt;br /&gt;
         $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     #~ if ( $preset == 9 ) {&lt;br /&gt;
         #~ $self-&amp;gt;horizontalPatrol();&lt;br /&gt;
     #~ }&lt;br /&gt;
     #~ if ( $preset == 10 ) {&lt;br /&gt;
         #~ $self-&amp;gt;horizontalPatrolStop();&lt;br /&gt;
     #~ }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #~ sub presetHome&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ Debug( &amp;quot;Home Preset&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;decoder_control.cgi?command=25&amp;quot;;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 #Horizontal Patrol - Vertical Patrols are not supported&lt;br /&gt;
 sub horizontalPatrol&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Horizontal Patrol&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=20&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Horizontal Patrol Stop&lt;br /&gt;
 sub horizontalPatrolStop&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Horizontal Patrol Stop&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=21&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # Set Absolute Brightness&lt;br /&gt;
 #~ sub setAbsBrightness&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $brightness = shift;&lt;br /&gt;
     #~ $brightness = 255 if $brightness &amp;gt; 255;&lt;br /&gt;
     #~ $brightness = 0   if $brightness &amp;lt; 0;&lt;br /&gt;
     #~ Debug( &amp;quot;Setting brightness to $brightness&amp;quot; };&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} = $brightness;&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=1&amp;amp;value=&amp;quot;.$brightness;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Increase Brightness&lt;br /&gt;
 #~ sub irisAbsOpen&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;brightness&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} += $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} = 255 if ($CamParams{&amp;#039;brightness&amp;#039;} &amp;gt; 255);&lt;br /&gt;
     #~ Debug( &amp;quot;Iris $CamParams{&amp;#039;brightness&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=1&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;brightness&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Decrease Brightness&lt;br /&gt;
 #~ sub irisAbsClose&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;brightness&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} -= $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} = 0 if ($CamParams{&amp;#039;brightness&amp;#039;} &amp;lt; 0);&lt;br /&gt;
     #~ Debug( &amp;quot;Iris $CamParams{&amp;#039;brightness&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=1&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;brightness&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Set Absolute Contrast&lt;br /&gt;
 #~ sub setAbsContrast&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $contrast = shift;&lt;br /&gt;
     #~ $contrast = 255 if $contrast &amp;gt; 255;&lt;br /&gt;
     #~ $contrast = 0   if $contrast &amp;lt; 0;&lt;br /&gt;
     #~ Debug( &amp;quot;Setting contrast to $contrast&amp;quot; };&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} = $contrast;&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=2&amp;amp;value=&amp;quot;.$contrast;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Increase Contrast&lt;br /&gt;
 #~ sub whiteAbsIn&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;contrast&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} += $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} = 6 if ($CamParams{&amp;#039;contrast&amp;#039;} &amp;gt; 6);&lt;br /&gt;
     #~ Debug( &amp;quot;Contrast $CamParams{&amp;#039;contrast&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=2&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;contrast&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Decrease Contrast&lt;br /&gt;
 #~ sub whiteAbsOut&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;contrast&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} -= $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} = 0 if ($CamParams{&amp;#039;contrast&amp;#039;} &amp;lt; 0);&lt;br /&gt;
     #~ Debug( &amp;quot;Iris $CamParams{&amp;#039;contrast&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=2&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;contrast&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 1;&lt;/div&gt;</summary>
		<author><name>Dl6er</name></author>
	</entry>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=Apexis&amp;diff=6384</id>
		<title>Apexis</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=Apexis&amp;diff=6384"/>
		<updated>2014-09-10T12:26:10Z</updated>

		<summary type="html">&lt;p&gt;Dl6er: /* Apexis APM J0233 WS IR (IR, outdoor, IP66) */ Added details about available resolutions and rates settings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Apexis APM J0233 WS IR (IR, outdoor, IP66) ==&lt;br /&gt;
[[File:APMJ0233WSIR_02.png|200px|thumb|right|Apexis APM J0233 WS IR]]&lt;br /&gt;
Sometimes there are distortions when switching from Nightvision to normal and back. Overall nice image quality.&lt;br /&gt;
I had to create a new user to access the image (username view, password abc123).&lt;br /&gt;
&lt;br /&gt;
Remote Protocol: HTTP&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Method: Simple&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Name: &amp;lt;ip of camera&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Port: 80&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Path: videostream.cgi?user=&amp;#039;&amp;#039;&amp;#039;&amp;lt;USERNAME&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;amp;pwd=&amp;#039;&amp;#039;&amp;#039;&amp;lt;PASSWORD&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;amp;resolution=&amp;#039;&amp;#039;&amp;#039;32&amp;#039;&amp;#039;&amp;#039;&amp;amp;rate=&amp;#039;&amp;#039;&amp;#039;11&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Image colors: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Available resolutions:&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;8&amp;#039;&amp;#039;&amp;#039; = 320x240; &amp;#039;&amp;#039;&amp;#039;32&amp;#039;&amp;#039;&amp;#039; = 640x480&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Possible image transmission rates:&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039; = 20fps; &amp;#039;&amp;#039;&amp;#039;3&amp;#039;&amp;#039;&amp;#039; = 15fps; &amp;#039;&amp;#039;&amp;#039;6&amp;#039;&amp;#039;&amp;#039; = 10fps; &amp;#039;&amp;#039;&amp;#039;11&amp;#039;&amp;#039;&amp;#039; = 5fps; &amp;#039;&amp;#039;&amp;#039;13&amp;#039;&amp;#039;&amp;#039; = 3fps; &amp;#039;&amp;#039;&amp;#039;15&amp;#039;&amp;#039;&amp;#039; = 1fps; &amp;#039;&amp;#039;&amp;#039;17&amp;#039;&amp;#039;&amp;#039; = 0.5fps;&lt;br /&gt;
&lt;br /&gt;
== Apexis J12 IP Camera ==&lt;br /&gt;
&lt;br /&gt;
Remote Protocol: HTTP&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Method: Simple&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Name: &amp;lt;ip of camera&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Port: 80&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Path: videostream.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Image colors: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
It is recommended to set Max FPS to 20.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apexis APM-J011-WS IP Camera ==&lt;br /&gt;
&lt;br /&gt;
Remote Protocol: HTTP &amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Method: Simple &amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Name: &amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Port: 80&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Path: videostream.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Image colors: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Maximum frame rate this IP web camera can handle is 15 fps at 640x480. The &amp;lt;USERNAME&amp;gt; and &amp;lt;PASSWORD&amp;gt; are found in the &amp;quot;Users Settings&amp;quot; section of the IP Camera&amp;#039;s web setup page. &lt;br /&gt;
Pan Tilt Control is not available in Zoneminder 1.25.0 at this time (Feb 2012.)  This IP camera does not have a zoom function, only pan and tilt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [http://apexis.cc/Products/63.aspx Apexis APM-J901-Z-WS PTZ IP Wireless/Wired Camera] ==&lt;br /&gt;
[[file:APM-J901-Z-WS-3.jpg|200px|thumb|right|Apexis APM-J901-Z-WS]]&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
:Wired and Wireless Ethernet. 802.11b/g with WEP &amp;amp; WPA WPA2 encryption&lt;br /&gt;
:3x optical zoom&lt;br /&gt;
:355° pan, 90° tilt&lt;br /&gt;
:POE&lt;br /&gt;
:DDNS&lt;br /&gt;
:Supports VLC &amp;#039;&amp;#039;(apparently!)&amp;#039;&amp;#039;&lt;br /&gt;
:Supports MSN&lt;br /&gt;
:Supports Firefox/Chrome (ie: Push-mode)&lt;br /&gt;
:Two-way audio capable (microphone and speaker not included)&lt;br /&gt;
:FTP uploads&lt;br /&gt;
:Email alerts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Settings ===&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Source&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
|width=&amp;quot;25%&amp;quot; | Remote Protocol&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | HTTP&lt;br /&gt;
|-&lt;br /&gt;
| Remote Method&lt;br /&gt;
| Simple&lt;br /&gt;
|-&lt;br /&gt;
| Remote Host Name&lt;br /&gt;
| &amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Remote Host Port&lt;br /&gt;
| 80&lt;br /&gt;
|-&lt;br /&gt;
| Remote Host Path&lt;br /&gt;
| videostream.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;or&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
snapshot.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;amp;resolution=32&amp;amp;rate=0&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;eg: snapshot.cgi?user=zoneminder&amp;amp;pwd=zonepass&amp;amp;resolution=32&amp;amp;rate=0&lt;br /&gt;
|-&lt;br /&gt;
| Remote Image colors&lt;br /&gt;
| 24 bit&lt;br /&gt;
|-&lt;br /&gt;
| Capture Width&lt;br /&gt;
| 640&lt;br /&gt;
|-&lt;br /&gt;
| Capture Height&lt;br /&gt;
| 480&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Control&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
|width=&amp;quot;25%&amp;quot; | Controllable&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| Control Type&lt;br /&gt;
| Apexis Mjpeg IP &amp;#039;&amp;#039;&amp;lt;br/&amp;gt;(Select &amp;#039;&amp;#039;&amp;#039;Edit&amp;#039;&amp;#039;&amp;#039; to access &amp;#039;&amp;#039;&amp;#039;Control Capabilities&amp;#039;&amp;#039;&amp;#039;)&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Control Address&lt;br /&gt;
| &amp;lt;USERNAME&amp;gt;:&amp;lt;PASSWORD&amp;gt;@&amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;:&amp;lt;PORT&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
eg: admin:@&amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;:80&amp;lt;br/&amp;gt;&lt;br /&gt;
eg: zoneminder:zonepass@192.168.1.111&lt;br /&gt;
|-&lt;br /&gt;
| Auto Stop Timeout&lt;br /&gt;
| 0.10&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
;Control Capability - Apexis Mjpeg IP&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Main&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
|width=&amp;quot;25%&amp;quot; | Name&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | Apexis Mjpeg IP&lt;br /&gt;
|-&lt;br /&gt;
| Type&lt;br /&gt;
| Remote&lt;br /&gt;
|-&lt;br /&gt;
| Protocol&lt;br /&gt;
| ApexisMjpegIP&amp;lt;br/&amp;gt;&amp;#039;&amp;#039;(Refer to control protocol below)&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Can Reset&lt;br /&gt;
| [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Move&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Move&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| Can Move Continuous&lt;br /&gt;
| [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Pan&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Pan&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Tilt&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Tilt&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Zoom&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Zoom&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Zoom Continuous&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Presets&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Has Presets&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Num Presets&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | 8 &amp;#039;&amp;#039;(to be confirmed)&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Set Presets&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Control protocol for Apexis MJPEG Cameras ==&lt;br /&gt;
&lt;br /&gt;
Save the following code as &amp;#039;&amp;#039;/usr/share/perl5/ZoneMinder/Control/ApexisMjpegIP.pm&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Don&amp;#039;t forget to set the user and password as I haven&amp;#039;t figured that bit out yet ;).&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 #&lt;br /&gt;
 # ZoneMinder Apexis MJPEG IP Camera Control Protocol Module&lt;br /&gt;
 # Copyright (C) 2012 Marcus Brown&lt;br /&gt;
 # Shamefully copied from the Loftek module by Philip Coombes&lt;br /&gt;
 #&lt;br /&gt;
 # This program is free software; you can redistribute it and/or&lt;br /&gt;
 # modify it under the terms of the GNU General Public License&lt;br /&gt;
 # as published by the Free Software Foundation; either version 2&lt;br /&gt;
 # of the License, or (at your option) any later version.&lt;br /&gt;
 #&lt;br /&gt;
 # This program is distributed in the hope that it will be useful,&lt;br /&gt;
 # but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&lt;br /&gt;
 # GNU General Public License for more details.&lt;br /&gt;
 #&lt;br /&gt;
 # You should have received a copy of the GNU General Public License&lt;br /&gt;
 # along with this program; if not, write to the Free Software&lt;br /&gt;
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.&lt;br /&gt;
 #&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 #&lt;br /&gt;
 # This module contains the implementation of the Apexis MJPEG IP camera control&lt;br /&gt;
 # protocol&lt;br /&gt;
 #&lt;br /&gt;
 package ZoneMinder::Control::ApexisMjpegIP;&lt;br /&gt;
 &lt;br /&gt;
 use 5.006;&lt;br /&gt;
 use strict;&lt;br /&gt;
 use warnings;&lt;br /&gt;
 &lt;br /&gt;
 require ZoneMinder::Base;&lt;br /&gt;
 require ZoneMinder::Control;&lt;br /&gt;
 &lt;br /&gt;
 our @ISA = qw(ZoneMinder::Control);&lt;br /&gt;
 &lt;br /&gt;
 our $VERSION = $ZoneMinder::Base::VERSION;&lt;br /&gt;
 &lt;br /&gt;
 our %CamParams = ();&lt;br /&gt;
 &lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 #&lt;br /&gt;
 # Apexis MJPEG IP Control Protocol&lt;br /&gt;
 #&lt;br /&gt;
 # On ControlAddress use the format :&lt;br /&gt;
 #   USERNAME:PASSWORD@ADDRESS:PORT&lt;br /&gt;
 #   eg : admin:@10.1.2.1:80&lt;br /&gt;
 #        zoneminder:zonepass@10.0.100.1:40000&lt;br /&gt;
 #&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 &lt;br /&gt;
 # Change &amp;quot;ZoneMinder::Logger&amp;quot; to &amp;quot;ZoneMinder::Debug&amp;quot; for zoneminder &amp;lt; 1.25.0&lt;br /&gt;
 use ZoneMinder::Logger qw(:all);&lt;br /&gt;
 use ZoneMinder::Config qw(:all);&lt;br /&gt;
 &lt;br /&gt;
 use Time::HiRes qw( usleep );&lt;br /&gt;
 &lt;br /&gt;
 sub new&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
     my $class = shift;&lt;br /&gt;
     my $id = shift;&lt;br /&gt;
     my $self = ZoneMinder::Control-&amp;gt;new( $id );&lt;br /&gt;
     my $logindetails = &amp;quot;&amp;quot;;&lt;br /&gt;
     bless( $self, $class );&lt;br /&gt;
     srand( time() );&lt;br /&gt;
     return $self;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 our $AUTOLOAD;&lt;br /&gt;
 &lt;br /&gt;
 sub AUTOLOAD&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $class = ref( ) || croak( &amp;quot;$self not object&amp;quot; );&lt;br /&gt;
     my $name = $AUTOLOAD;&lt;br /&gt;
     $name =~ s/.*://;&lt;br /&gt;
     if ( exists($self-&amp;gt;{$name}) )&lt;br /&gt;
     {&lt;br /&gt;
         return( $self-&amp;gt;{$name} );&lt;br /&gt;
     }&lt;br /&gt;
         Fatal( &amp;quot;Can&amp;#039;t access $name member of object of class $class&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 sub open&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
 &lt;br /&gt;
     $self-&amp;gt;loadMonitor();&lt;br /&gt;
 &lt;br /&gt;
     use LWP::UserAgent;&lt;br /&gt;
     $self-&amp;gt;{ua} = LWP::UserAgent-&amp;gt;new;&lt;br /&gt;
     $self-&amp;gt;{ua}-&amp;gt;agent( &amp;quot;ZoneMinder Control Agent/&amp;quot;.ZM_VERSION );&lt;br /&gt;
 &lt;br /&gt;
     $self-&amp;gt;{state} = &amp;#039;open&amp;#039;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub close&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     $self-&amp;gt;{state} = &amp;#039;closed&amp;#039;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub printMsg&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $msg = shift;&lt;br /&gt;
     my $msg_len = length($msg);&lt;br /&gt;
 &lt;br /&gt;
     Debug( $msg.&amp;quot;[&amp;quot;.$msg_len.&amp;quot;]&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub sendCmd&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $cmd = shift;&lt;br /&gt;
     my $result = undef;&lt;br /&gt;
     printMsg( $cmd, &amp;quot;Tx&amp;quot; );&lt;br /&gt;
 &lt;br /&gt;
     # ############################################################################################&lt;br /&gt;
     #&lt;br /&gt;
     #  CHANGE THE FOLLOWING LINE IF NECESSARY&lt;br /&gt;
     #  IT SHOULD WORK WITH A DEFAULT CAMERA, BUT SURELY YOU WILL BE SETTING AN ADMIN PASSWORD? :)&lt;br /&gt;
     #  &lt;br /&gt;
     # ############################################################################################&lt;br /&gt;
     my $req = HTTP::Request-&amp;gt;new( GET=&amp;gt;&amp;quot;http://&amp;quot;.$self-&amp;gt;{Monitor}-&amp;gt;{ControlAddress}.&amp;quot;/$cmd\&amp;amp;user=admin\&amp;amp;pwd=&amp;quot;  );&lt;br /&gt;
     my $res = $self-&amp;gt;{ua}-&amp;gt;request($req);&lt;br /&gt;
 &lt;br /&gt;
     if ( $res-&amp;gt;is_success )&lt;br /&gt;
     {&lt;br /&gt;
         $result = !undef;&lt;br /&gt;
     }&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
         Error( &amp;quot;Error check failed:&amp;#039;&amp;quot;.$res-&amp;gt;status_line().&amp;quot;&amp;#039;&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     return( $result );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub getCamParams&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
 &lt;br /&gt;
     my $req = HTTP::Request-&amp;gt;new( GET=&amp;gt;&amp;quot;http://&amp;quot;.$self-&amp;gt;{Monitor}-&amp;gt;{ControlAddress}.&amp;quot;/get_params.cgi&amp;quot; );&lt;br /&gt;
     my $res = $self-&amp;gt;{ua}-&amp;gt;request($req);&lt;br /&gt;
 &lt;br /&gt;
     if ( $res-&amp;gt;is_success )&lt;br /&gt;
     {&lt;br /&gt;
         # Parse results setting values in %FCParams&lt;br /&gt;
         my $content = $res-&amp;gt;decoded_content;&lt;br /&gt;
 &lt;br /&gt;
         while ($content =~ s/var\s+([^=]+)=([^;]+);//ms) {&lt;br /&gt;
             $CamParams{$1} = $2;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
         Error( &amp;quot;Error check failed:&amp;#039;&amp;quot;.$res-&amp;gt;status_line().&amp;quot;&amp;#039;&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #autoStop&lt;br /&gt;
 #This makes use of the ZoneMinder Auto Stop Timeout on the Control Tab&lt;br /&gt;
 sub autoStop&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = shift;&lt;br /&gt;
     my $autostop = shift;&lt;br /&gt;
     if( $stop_command &amp;amp;&amp;amp; $autostop)&lt;br /&gt;
     {&lt;br /&gt;
         Debug( &amp;quot;Auto Stop&amp;quot; );&lt;br /&gt;
         usleep( $autostop );&lt;br /&gt;
         my $cmd = &amp;quot;decoder_control.cgi?command=&amp;quot;.$stop_command;&lt;br /&gt;
         $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # Reset the Camera&lt;br /&gt;
 sub reset&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Camera Reset&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;reboot.cgi?&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Up Arrow&lt;br /&gt;
 sub moveConUp&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;1&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Up&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=0&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Down Arrow&lt;br /&gt;
 sub moveConDown&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;3&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Down&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=2&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Left Arrow&lt;br /&gt;
 sub moveConLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;5&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Left&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=4&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Right Arrow&lt;br /&gt;
 sub moveConRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;7&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Right&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=6&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 # Single-step movements&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 # &amp;#039;onestep&amp;#039; and &amp;#039;degree&amp;#039; don&amp;#039;t appear to work for the J901&lt;br /&gt;
 &lt;br /&gt;
 sub moveRelUp&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Up&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=0&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelDown&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Down&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=2&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Left&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=4&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Right&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=6&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveRelUpRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Up Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConUp( );&lt;br /&gt;
     $self-&amp;gt;stepConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelDownRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Down Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConDown( );&lt;br /&gt;
     $self-&amp;gt;stepConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelUpLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Up Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConUp( );&lt;br /&gt;
     $self-&amp;gt;stepConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelDownLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Down Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConDown( );&lt;br /&gt;
     $self-&amp;gt;stepConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 # Iris/Aperture control ... this is *NOT* &amp;#039;iris&amp;#039; as &amp;#039;brightness&amp;#039; ?&lt;br /&gt;
 #&lt;br /&gt;
 # Doubt this works on J901&lt;br /&gt;
 &lt;br /&gt;
 sub irisConClose&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;8&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=9&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub irisConOpen&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;10&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=11&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 # Focus control&lt;br /&gt;
 #&lt;br /&gt;
 # J901 is manual focus&lt;br /&gt;
 &lt;br /&gt;
 sub focusConNear&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;13&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=12&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub focusConFar&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;15&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=14&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 &lt;br /&gt;
 #Zoom In&lt;br /&gt;
 sub zoomConTele&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;19&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Zoom Tele&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=18&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #~ #Zoom Out&lt;br /&gt;
 sub zoomConWide&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;17&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Zoom Wide&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=16&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #~ #Diagonally Up Right Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConUpRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Up Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConUp( );&lt;br /&gt;
     $self-&amp;gt;moveConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Diagonally Down Right Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConDownRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Down Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConDown( );&lt;br /&gt;
     $self-&amp;gt;moveConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 #~&lt;br /&gt;
 #Diagonally Up Left Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConUpLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Up Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConUp( );&lt;br /&gt;
     $self-&amp;gt;moveConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 #~&lt;br /&gt;
 #Diagonally Down Left Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConDownLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Down Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConDown( );&lt;br /&gt;
     $self-&amp;gt;moveConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Stop&lt;br /&gt;
 #~ sub moveStop&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ Debug( &amp;quot;Move Stop&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;decoder_control.cgi?command=1&amp;quot;;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 #Set Camera Preset&lt;br /&gt;
 #Presets must be translated into values internal to the camera&lt;br /&gt;
 #Those values are: 30,32,34 ... 88,90,92 for presets 1-32 respectively&lt;br /&gt;
 sub presetSet&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $params = shift;&lt;br /&gt;
     my $preset = $self-&amp;gt;getParam( $params, &amp;#039;preset&amp;#039; );&lt;br /&gt;
     Debug( &amp;quot;Set Preset $preset&amp;quot; );&lt;br /&gt;
 #~&lt;br /&gt;
     if (( $preset &amp;gt;= 1 ) &amp;amp;&amp;amp; ( $preset &amp;lt;= 32 )) {&lt;br /&gt;
         my $cmd = &amp;quot;decoder_control.cgi?command=&amp;quot;.(($preset*2) + 28);&lt;br /&gt;
         $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Recall Camera Preset&lt;br /&gt;
 #Presets must be translated into values internal to the camera&lt;br /&gt;
 #Those values are: 31,33,35 ... 89,91,93 for presets 1-32 respectively&lt;br /&gt;
 sub presetGoto&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $params = shift;&lt;br /&gt;
     my $preset = $self-&amp;gt;getParam( $params, &amp;#039;preset&amp;#039; );&lt;br /&gt;
     Debug( &amp;quot;Goto Preset $preset&amp;quot; );&lt;br /&gt;
 #~&lt;br /&gt;
     if (( $preset &amp;gt;= 1 ) &amp;amp;&amp;amp; ( $preset &amp;lt;= 32 )) {&lt;br /&gt;
         my $cmd = &amp;quot;decoder_control.cgi?command=&amp;quot;.(($preset*2) + 29);&lt;br /&gt;
         $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     #~ if ( $preset == 9 ) {&lt;br /&gt;
         #~ $self-&amp;gt;horizontalPatrol();&lt;br /&gt;
     #~ }&lt;br /&gt;
     #~ if ( $preset == 10 ) {&lt;br /&gt;
         #~ $self-&amp;gt;horizontalPatrolStop();&lt;br /&gt;
     #~ }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #~ sub presetHome&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ Debug( &amp;quot;Home Preset&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;decoder_control.cgi?command=25&amp;quot;;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 #Horizontal Patrol - Vertical Patrols are not supported&lt;br /&gt;
 sub horizontalPatrol&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Horizontal Patrol&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=20&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Horizontal Patrol Stop&lt;br /&gt;
 sub horizontalPatrolStop&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Horizontal Patrol Stop&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=21&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # Set Absolute Brightness&lt;br /&gt;
 #~ sub setAbsBrightness&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $brightness = shift;&lt;br /&gt;
     #~ $brightness = 255 if $brightness &amp;gt; 255;&lt;br /&gt;
     #~ $brightness = 0   if $brightness &amp;lt; 0;&lt;br /&gt;
     #~ Debug( &amp;quot;Setting brightness to $brightness&amp;quot; };&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} = $brightness;&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=1&amp;amp;value=&amp;quot;.$brightness;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Increase Brightness&lt;br /&gt;
 #~ sub irisAbsOpen&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;brightness&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} += $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} = 255 if ($CamParams{&amp;#039;brightness&amp;#039;} &amp;gt; 255);&lt;br /&gt;
     #~ Debug( &amp;quot;Iris $CamParams{&amp;#039;brightness&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=1&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;brightness&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Decrease Brightness&lt;br /&gt;
 #~ sub irisAbsClose&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;brightness&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} -= $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} = 0 if ($CamParams{&amp;#039;brightness&amp;#039;} &amp;lt; 0);&lt;br /&gt;
     #~ Debug( &amp;quot;Iris $CamParams{&amp;#039;brightness&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=1&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;brightness&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Set Absolute Contrast&lt;br /&gt;
 #~ sub setAbsContrast&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $contrast = shift;&lt;br /&gt;
     #~ $contrast = 255 if $contrast &amp;gt; 255;&lt;br /&gt;
     #~ $contrast = 0   if $contrast &amp;lt; 0;&lt;br /&gt;
     #~ Debug( &amp;quot;Setting contrast to $contrast&amp;quot; };&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} = $contrast;&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=2&amp;amp;value=&amp;quot;.$contrast;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Increase Contrast&lt;br /&gt;
 #~ sub whiteAbsIn&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;contrast&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} += $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} = 6 if ($CamParams{&amp;#039;contrast&amp;#039;} &amp;gt; 6);&lt;br /&gt;
     #~ Debug( &amp;quot;Contrast $CamParams{&amp;#039;contrast&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=2&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;contrast&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Decrease Contrast&lt;br /&gt;
 #~ sub whiteAbsOut&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;contrast&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} -= $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} = 0 if ($CamParams{&amp;#039;contrast&amp;#039;} &amp;lt; 0);&lt;br /&gt;
     #~ Debug( &amp;quot;Iris $CamParams{&amp;#039;contrast&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=2&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;contrast&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 1;&lt;/div&gt;</summary>
		<author><name>Dl6er</name></author>
	</entry>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=Hardware_Compatibility_List&amp;diff=6380</id>
		<title>Hardware Compatibility List</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=Hardware_Compatibility_List&amp;diff=6380"/>
		<updated>2014-09-09T13:11:26Z</updated>

		<summary type="html">&lt;p&gt;Dl6er: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zoneminder will work with almost any capture card that is supported by the linux kernel.  You may find additional details about supported hardware in the part of the forums.  Also if you find something in the forums that is  missing from the wiki ADD IT.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Capture Cards ==&lt;br /&gt;
&lt;br /&gt;
[[Anykeeper]] &lt;br /&gt;
&lt;br /&gt;
[[Avermedia]]&lt;br /&gt;
&lt;br /&gt;
[[Camsecure PCI Express video capture]]&lt;br /&gt;
&lt;br /&gt;
[[Digiflower]]&lt;br /&gt;
&lt;br /&gt;
[[Geovision GV250 - bt878a chip]]&lt;br /&gt;
&lt;br /&gt;
[[Grandtec Grand X Guard]] &lt;br /&gt;
&lt;br /&gt;
[[Hauppauge]]&lt;br /&gt;
&lt;br /&gt;
[[Ituner Spectra 8]]&lt;br /&gt;
&lt;br /&gt;
[[Kodicom 4400r]]&lt;br /&gt;
&lt;br /&gt;
[[Kodicom 8800]]&lt;br /&gt;
&lt;br /&gt;
[[Tungson TE-8008]]&lt;br /&gt;
&lt;br /&gt;
Leadtek WinFast VC 100 - the cheapest bt878 model with no tuner on it, just Com/Svideo in.&lt;br /&gt;
&lt;br /&gt;
[[LinkDelight CCTV H.264 4CH DVR Card]]&lt;br /&gt;
&lt;br /&gt;
[[Linux Media Labs LMLBT44]] &lt;br /&gt;
&lt;br /&gt;
[[Osprey 100]]&lt;br /&gt;
&lt;br /&gt;
[[Provideo PV- series (Bluecherry)]] &lt;br /&gt;
[[ Bluecherry - BC-H16480A]] &lt;br /&gt;
[[TView 95/99]]&lt;br /&gt;
&lt;br /&gt;
[[UDP Technology NCP3200v2]]&lt;br /&gt;
&lt;br /&gt;
[[Videocards with Philips saa7134 chipset]]&lt;br /&gt;
&lt;br /&gt;
[[WinFast TV2000 XP]]&lt;br /&gt;
&lt;br /&gt;
[[Rapid OS]]&lt;br /&gt;
&lt;br /&gt;
[[KesCom PG104]]&lt;br /&gt;
&lt;br /&gt;
[[IEI Technology Corp. IVC-268G-R20]]&lt;br /&gt;
&lt;br /&gt;
== bt8x8 Cards ==&lt;br /&gt;
A note on the bt8x8-based TV-tuner cards: these usually have beside the tuner input, also a Composite and an S-Video input. You can hook up 2 analog cameras to these, and access from ZoneMinder both of them as individual cameras, at max 15Fps. You don&amp;#039;t need two separate TV cards for two cameras!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Pico2000]] - 4 port card, one chip bt878, around 2 fps when using all channels&lt;br /&gt;
&lt;br /&gt;
[[Bt878_4chip_8inputs]] -4 chips bt878, 8 inputs, around 5 fps when using 2 inputs per chip&lt;br /&gt;
&lt;br /&gt;
[[:Image:Karta.jpg| bt878 8 chip 8 input]] - This card is supplied with D-sub to 8 BNC connector and uses the bt878 chip for each input allowing full frame rates and quality. See [[Kodicom 8800]] for more information.&lt;br /&gt;
&lt;br /&gt;
Geovision GV250 bt878a single chip 4 inputs - This capture Card is supplied with 4 video inputs but with NO audio channel&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Most other BTTV (bt878, bt848) cards, see /usr/src/linux/Documentation/video4linux/bttv/CARDLIST on your system for a list of some of them.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Analog Cameras ==&lt;br /&gt;
&lt;br /&gt;
Any regular composite or S-video camera connected via a supported capture card.  Some analog cameras feature camera control - ZM supports several of these camera&amp;#039;s Pan/Tilt/Zoom functions via serial port control, as well as camera Presets, Focus, Iris, etc.&lt;br /&gt;
*[[PicturetelControlScript | PictureTel PTZ2N]].&lt;br /&gt;
&lt;br /&gt;
== Network Cameras ==&lt;br /&gt;
For Network Cams to work they need to be able to stream MJPEG without the requirement of activex controls. If you see the requirement for the camera calls for IE then there is a good chance it may not work. The other option is to grab JPEG images if the camera supports that option which will work but at a lower frame rate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Any network camera that allows access to single JPEG image grabs or &amp;#039;&amp;#039;&amp;#039;some but not all&amp;#039;&amp;#039;&amp;#039; multi-part JPEG feeds.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Full Compatibility &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* [[7Links]](TM Trade Mark)&lt;br /&gt;
&lt;br /&gt;
* [[A-mtk]]&lt;br /&gt;
&lt;br /&gt;
* [[Abus]]  some&lt;br /&gt;
&lt;br /&gt;
* [[Airlink 101]] some &lt;br /&gt;
&lt;br /&gt;
* [[AirLive AirCam OD325HD]]&lt;br /&gt;
&lt;br /&gt;
* [[Amovision AM-Q630M]]&lt;br /&gt;
&lt;br /&gt;
* [[Anran VGB101-IP]]&lt;br /&gt;
&lt;br /&gt;
* [[Apexis]] most if not all (only tested some)&lt;br /&gt;
&lt;br /&gt;
* [[ArecontVision]] (AV3130M, probably other too)&lt;br /&gt;
&lt;br /&gt;
* [[Astak Mole]] Some&lt;br /&gt;
&lt;br /&gt;
* [[Axis]] All&lt;br /&gt;
&lt;br /&gt;
* [[Brickcom]] These have been tested&lt;br /&gt;
&lt;br /&gt;
* [[B-QTECH]] H.264 Camera&lt;br /&gt;
&lt;br /&gt;
* [[BSTI]] Some&lt;br /&gt;
&lt;br /&gt;
* [[Cisco]] some&lt;br /&gt;
&lt;br /&gt;
* [[D-Link]] Most&lt;br /&gt;
&lt;br /&gt;
* [[Edimax]] only tested some&lt;br /&gt;
&lt;br /&gt;
* [[Foscam]] (FI8908W, FI8904W, possibly others)&lt;br /&gt;
&lt;br /&gt;
* [[Gadspot]] Most&lt;br /&gt;
&lt;br /&gt;
* [[Generic]] Only tested one &lt;br /&gt;
&lt;br /&gt;
* [[Geovision]] (GV-FE420, possibly others)&lt;br /&gt;
&lt;br /&gt;
* [[Grandstream]] Grandstream (GXV-3672-FHD &amp;amp; GXV-3672-FHD-36 &amp;amp; GXV3611_HD tested)&lt;br /&gt;
&lt;br /&gt;
* [[Hikvision]] Some&lt;br /&gt;
&lt;br /&gt;
* [[hootoo]] Some&lt;br /&gt;
&lt;br /&gt;
* [[Iguard]] IP390E&lt;br /&gt;
&lt;br /&gt;
* [[Instar]] (IN-2905, possibly others)&lt;br /&gt;
&lt;br /&gt;
* [[Level One]] some&lt;br /&gt;
&lt;br /&gt;
* [[Linksys]] WVC-210 / WVC2300 / PVC2300 / WVC54GC&lt;br /&gt;
&lt;br /&gt;
* [[Loftek]] Sentinel PTZ&lt;br /&gt;
&lt;br /&gt;
* [[Maygion]] (IP-603, IP-604, possibly others)&lt;br /&gt;
&lt;br /&gt;
* [[Messoa]] (NCR870, probably others)&lt;br /&gt;
&lt;br /&gt;
* [[Rimax]] Some&lt;br /&gt;
&lt;br /&gt;
* [[Rovio]]&lt;br /&gt;
&lt;br /&gt;
* [[Sony]] Most&lt;br /&gt;
&lt;br /&gt;
* [[TP-LINK]] Some&lt;br /&gt;
&lt;br /&gt;
* [[Trendnet]] Most&lt;br /&gt;
&lt;br /&gt;
* [[Wanscam]] FR4020A2 (Foscam clone)&lt;br /&gt;
&lt;br /&gt;
* [[x-vision]] Xvision cameras by y3k (some)&lt;br /&gt;
&lt;br /&gt;
* [[Y-Cam]] (Sharx Ip) Most&lt;br /&gt;
&lt;br /&gt;
* [[Zavio]] Some&lt;br /&gt;
&lt;br /&gt;
* [[Zecumate]] JPT3815W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Remote systems, themselves running zoneminder, can be accessed as cameras using the Remote Path of &amp;#039;&amp;#039;&amp;#039;/cgi-bin/nph-zms?mode=single&amp;amp;monitor=1&amp;amp;scale=100&amp;amp;maxfps=5&amp;amp;buffer=1000&amp;#039;&amp;#039;&amp;#039; - where the monitor number is the correct camera on the remote system.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Single Jpeg Only&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* [[Airlink 101]] some&lt;br /&gt;
&lt;br /&gt;
* [[JVC]] some&lt;br /&gt;
&lt;br /&gt;
* [[Panasonic]] some&lt;br /&gt;
&lt;br /&gt;
* [[PLANET]] some   &lt;br /&gt;
&lt;br /&gt;
*[[Toshiba]] some&lt;br /&gt;
&lt;br /&gt;
* [[Veo Observer IP NetCam]] most&lt;br /&gt;
&lt;br /&gt;
*[[Vivotek]] All&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mpeg(ver1.24.0 and up)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*[[ABS_MegaCam]]&lt;br /&gt;
&lt;br /&gt;
* [[Axis]] All&lt;br /&gt;
&lt;br /&gt;
* [[ ACTi]] All&lt;br /&gt;
&lt;br /&gt;
*[[Vivotek]] Most&lt;br /&gt;
&lt;br /&gt;
*[[Logitech 700 series]] some&lt;br /&gt;
&lt;br /&gt;
*[[Ubiqiti]] some&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Compatible with modifications&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*[[Aviosys]] some&lt;br /&gt;
&lt;br /&gt;
* [[Mobotix]]  all  &lt;br /&gt;
&lt;br /&gt;
* [[Conceptronic]]  some&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Compatible with problems&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
* [[Compro]] IP70. MPEG4 only, some reliability issues and general poor firmware quality.&lt;br /&gt;
&lt;br /&gt;
* [[Grandtec]] [[Grandtec_WLAN_Camera|WLAN Camera]] WiFi or III - acceptable indoor quality, no infrared-filter (better nightvision) cheap!&lt;br /&gt;
&lt;br /&gt;
* [[Intellinet]]  IPCamera with the new firmware.&lt;br /&gt;
&lt;br /&gt;
* Old Intellinet IPCamera (model MWNC-100) with this (http://www.zoneminder.com/forums/viewtopic.php?t=7500) protocol adapter. &lt;br /&gt;
&lt;br /&gt;
* OvisLink AirLive WL-5400CAM&lt;br /&gt;
&lt;br /&gt;
Useful link: Flash&amp;#039;s IP Camera Database, with Zoneminder compatibility guide:   http://digdilem.org/cameras&lt;br /&gt;
&lt;br /&gt;
== Network Digitizers ==&lt;br /&gt;
&lt;br /&gt;
Like Network Cameras, these devices produce a video stream - but they accept an analog video input from a camera or other video source.&lt;br /&gt;
&lt;br /&gt;
* [[Synectics E100]] encoder&lt;br /&gt;
*The [[IP9100 | Aviosys IP9100, Models A, B and Plus]] has four analog video inputs.  It produces a ZM compatible video stream from one of the inputs, which is selectable via an HTTP GET command.  There might even be a control script for ZM that lets you select the active video input using &amp;#039;&amp;#039;ZM&amp;#039;s Camera Control Presets!&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
With the yoics Aviosys 9100 firmware at http://www.yoics.com/?p=28, ZoneMinder can directly access all four ports via /usr/yoicsX.jpg as the remote host path, where X is 0 - 3.&lt;br /&gt;
&lt;br /&gt;
* [[Bosch VIP X1 Single-channel]] video encoder [http://products.boschsecuritysystems.eu/en/EMEA/products/bxp/SKU15449253232961378955-CATMda7ec5dc0edf5b1a0b8cb619e2e11308]&lt;br /&gt;
&lt;br /&gt;
* Video cameras &amp;amp; safes for antitheft purpose on the website http://www.infosafe.fr&lt;br /&gt;
&lt;br /&gt;
== USB Cameras ==&lt;br /&gt;
&lt;br /&gt;
*Just Zoom USB cam&lt;br /&gt;
&lt;br /&gt;
*Creative Webcam Pro, Webcam 3, LIVE! Cam OPTIA PRO (V4L2, Chan 0, PAL, YUYV)&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;Most&amp;#039;&amp;#039; UVCvideo cameras, including: [[Logitech QuickCam Express]], QuickCam Pro 3000, [[QuickCam Pro 4000]],  QuickCam Communicate STX/Deluxe, [[Logitech Webcam Pro 9000]], and [[Webcam C250]]&lt;br /&gt;
&lt;br /&gt;
*Logitech Quickcam Orbit/Sphere (experimental basic pan/tilt control has also published for testing and hacking [http://www.zoneminder.com/forums/viewtopic.php?t=9788])&lt;br /&gt;
&lt;br /&gt;
*[[Philips]] &lt;br /&gt;
&lt;br /&gt;
*Any OV511 based USB camera [http://alpha.dyndns.org/ov511/cameras.html]&lt;br /&gt;
&lt;br /&gt;
*Any CPIA based USB camera [http://webcam.sourceforge.net]&lt;br /&gt;
&lt;br /&gt;
*[[LabTec WebCam Pro]]&lt;br /&gt;
&lt;br /&gt;
*Confirmed basic functionality with Microsoft Lifecam VX 5000 using UVC Streaming method&lt;br /&gt;
&lt;br /&gt;
Note that most USB cameras that can use Video4Linux/V4L2, and so can be used by ZoneMinder.  Some have older chipsets and can be hard to find new.&lt;br /&gt;
&lt;br /&gt;
Note that PWC drivers are not included in the kernel. Some distribution&amp;#039;s add them in and other may not. Here are some relevant links:&lt;br /&gt;
* [http://www.smcc.demon.nl/webcam/ Old Maintainer]&lt;br /&gt;
* [http://www.saillard.org/linux/pwc/ Current PWC Maintainer]&lt;br /&gt;
&lt;br /&gt;
== X10 Devices ==&lt;br /&gt;
The only device that really needs to be compatable with ZM is the Transceiver, all other x10 devices comunicate through that device.&lt;br /&gt;
*[[CM11]] Bi-Directional Transceiver&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other X10 notes:&lt;br /&gt;
&lt;br /&gt;
[http://www.zoneminder.com/forums/viewtopic.php?t=6423&amp;amp;highlight=x10 Topic 6423]&lt;br /&gt;
&lt;br /&gt;
[http://www.zoneminder.com/forums/viewtopic.php?t=7082&amp;amp;highlight=x10 Topic 7082]&lt;br /&gt;
&lt;br /&gt;
== All other hardware as supported by Linux ==&lt;br /&gt;
To find out if your hardware is supported, check the [http://www.zoneminder.com/forums/viewforum.php?f=10 HCL]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Plug Computers ==&lt;br /&gt;
Guruplug Server Plus -&amp;gt; How to install Zoneminder&lt;/div&gt;</summary>
		<author><name>Dl6er</name></author>
	</entry>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=Edimax&amp;diff=6379</id>
		<title>Edimax</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=Edimax&amp;diff=6379"/>
		<updated>2014-09-09T11:59:25Z</updated>

		<summary type="html">&lt;p&gt;Dl6er: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Edimax IC3116W (WiFi IP Camera 720p) ==&lt;br /&gt;
[[File:1027659_LB_00_FB.EPS_1000.jpg|200px|thumb|right|Edimax IC3116W]]&lt;br /&gt;
I wasn&amp;#039;t able to get it working with H.264 (the camera is dropping half of the images every few minutes -&amp;gt; Motion alert). However, it works fine with MJPEG.&lt;br /&gt;
Overall, I have to say that the image is not too great and IR illumination is weak (compared to other cameras).&lt;br /&gt;
&lt;br /&gt;
Source Type: Ffmpeg&amp;lt;br/&amp;gt;&lt;br /&gt;
Source Path: rtsp://XXX.XXX.XXX.XXX:554/ipcam_mjpeg.sdp?tcp&amp;lt;br/&amp;gt;&lt;br /&gt;
Target Colorspace: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Edimax IC3110P/W (LAN/(WiFi) IP Camera 1,3MP, PoE, Nightvision) ==&lt;br /&gt;
[[File:IC-3110P 01.png|200px|thumb|right|Edimax IC3110P]]&lt;br /&gt;
Same problem as with the IC3116W when using H.264. Works fine with MJPEG.&lt;br /&gt;
Image quality is nice - absolutely no complains, worth the price (abt 85 Euros in Germany).&lt;br /&gt;
&lt;br /&gt;
Source Type: Ffmpeg&amp;lt;br/&amp;gt;&lt;br /&gt;
Source Path: http://XXX.XXX.XXX.XXX/mjpg/video.mjpg&amp;lt;br/&amp;gt;&lt;br /&gt;
Target Colorspace: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 1280&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 1024&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: I have not tested the WiFi-Version but according to the manual they are identical (except for the WiFi connectivity, of course).&lt;br /&gt;
&lt;br /&gt;
== Edimax IC1500 ==&lt;br /&gt;
The edimax IC 1500 delivers a strange form of motion jpeg with a little help from a little script on your webserver&lt;br /&gt;
you should be able to view the motion jpeg stream in zoneminder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
function handlejpeg($jpeg) {&lt;br /&gt;
  if(strlen($jpeg)) {&lt;br /&gt;
    echo &amp;quot;--video boundary--\r\n&amp;quot;;&lt;br /&gt;
    echo &amp;quot;Content-length: &amp;quot;.strlen($jpeg).&amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    echo &amp;quot;Content-type: image/jpeg\r\n&amp;quot;;&lt;br /&gt;
    echo &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    echo &amp;quot;$jpeg&amp;quot;.&amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
  @ini_set(&amp;#039;zlib.output_compression&amp;#039;, 0);&lt;br /&gt;
  @ini_set(&amp;#039;implicit_flush&amp;#039;, 1);&lt;br /&gt;
  header(&amp;#039;Content-Type: multipart/x-mixed-replace;boundary=--video boundary--&amp;#039;);&lt;br /&gt;
  $handle = fopen(&amp;quot;http://admin:1234@&amp;lt;YOURHOST&amp;gt;/snapshot.cgi&amp;quot;, &amp;quot;rb&amp;quot;);	&lt;br /&gt;
  $cl=0;&lt;br /&gt;
  $jpeg=NULL;&lt;br /&gt;
  if ($handle) {&lt;br /&gt;
    while (!feof($handle)) {&lt;br /&gt;
        $buffer = fgets($handle, 4096);&lt;br /&gt;
        if(trim($buffer)==&amp;quot;--myboundary&amp;quot;) {&lt;br /&gt;
           $CT=fgets($handle, 4096);&lt;br /&gt;
           $CL=fgets($handle, 4096);&lt;br /&gt;
           $crap=fgets($handle, 4096);&lt;br /&gt;
           $cl=preg_replace(&amp;quot;/Content-Length: /&amp;quot;,&amp;#039;&amp;#039;,trim($CL));&lt;br /&gt;
           handlejpeg($jpeg,$i);&lt;br /&gt;
           $jpeg=NULL;&lt;br /&gt;
           for($j=0;$j&amp;lt;$cl;$j++) {&lt;br /&gt;
             $jpeg.=fgetc($handle);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    fclose($handle);&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
http://www.zoneminder.com/forums/viewtopic.php?t=13587&amp;amp;highlight=cameras&lt;/div&gt;</summary>
		<author><name>Dl6er</name></author>
	</entry>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=Apexis&amp;diff=6378</id>
		<title>Apexis</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=Apexis&amp;diff=6378"/>
		<updated>2014-09-09T11:57:55Z</updated>

		<summary type="html">&lt;p&gt;Dl6er: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Apexis APM J0233 WS IR (IR, outdoor, IP66) ==&lt;br /&gt;
[[File:APMJ0233WSIR_02.png|200px|thumb|right|Apexis APM J0233 WS IR]]&lt;br /&gt;
Sometimes there are distortions when switching from Nightvision to normal and back. Overall nice image quality.&lt;br /&gt;
I had to create a new user to access the image (username view, password abc123).&lt;br /&gt;
&lt;br /&gt;
Remote Protocol: HTTP&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Method: Simple&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Name: &amp;lt;ip of camera&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Port: 80&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Path: videostream.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;amp;resolution=32&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Image colors: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apexis J12 IP Camera ==&lt;br /&gt;
&lt;br /&gt;
Remote Protocol: HTTP&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Method: Simple&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Name: &amp;lt;ip of camera&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Port: 80&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Path: videostream.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Image colors: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
It is recommended to set Max FPS to 20.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apexis APM-J011-WS IP Camera ==&lt;br /&gt;
&lt;br /&gt;
Remote Protocol: HTTP &amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Method: Simple &amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Name: &amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Port: 80&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Path: videostream.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Image colors: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Maximum frame rate this IP web camera can handle is 15 fps at 640x480. The &amp;lt;USERNAME&amp;gt; and &amp;lt;PASSWORD&amp;gt; are found in the &amp;quot;Users Settings&amp;quot; section of the IP Camera&amp;#039;s web setup page. &lt;br /&gt;
Pan Tilt Control is not available in Zoneminder 1.25.0 at this time (Feb 2012.)  This IP camera does not have a zoom function, only pan and tilt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [http://apexis.cc/Products/63.aspx Apexis APM-J901-Z-WS PTZ IP Wireless/Wired Camera] ==&lt;br /&gt;
[[file:APM-J901-Z-WS-3.jpg|200px|thumb|right|Apexis APM-J901-Z-WS]]&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
:Wired and Wireless Ethernet. 802.11b/g with WEP &amp;amp; WPA WPA2 encryption&lt;br /&gt;
:3x optical zoom&lt;br /&gt;
:355° pan, 90° tilt&lt;br /&gt;
:POE&lt;br /&gt;
:DDNS&lt;br /&gt;
:Supports VLC &amp;#039;&amp;#039;(apparently!)&amp;#039;&amp;#039;&lt;br /&gt;
:Supports MSN&lt;br /&gt;
:Supports Firefox/Chrome (ie: Push-mode)&lt;br /&gt;
:Two-way audio capable (microphone and speaker not included)&lt;br /&gt;
:FTP uploads&lt;br /&gt;
:Email alerts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Settings ===&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Source&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
|width=&amp;quot;25%&amp;quot; | Remote Protocol&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | HTTP&lt;br /&gt;
|-&lt;br /&gt;
| Remote Method&lt;br /&gt;
| Simple&lt;br /&gt;
|-&lt;br /&gt;
| Remote Host Name&lt;br /&gt;
| &amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Remote Host Port&lt;br /&gt;
| 80&lt;br /&gt;
|-&lt;br /&gt;
| Remote Host Path&lt;br /&gt;
| videostream.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;or&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
snapshot.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;amp;resolution=32&amp;amp;rate=0&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;eg: snapshot.cgi?user=zoneminder&amp;amp;pwd=zonepass&amp;amp;resolution=32&amp;amp;rate=0&lt;br /&gt;
|-&lt;br /&gt;
| Remote Image colors&lt;br /&gt;
| 24 bit&lt;br /&gt;
|-&lt;br /&gt;
| Capture Width&lt;br /&gt;
| 640&lt;br /&gt;
|-&lt;br /&gt;
| Capture Height&lt;br /&gt;
| 480&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Control&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
|width=&amp;quot;25%&amp;quot; | Controllable&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| Control Type&lt;br /&gt;
| Apexis Mjpeg IP &amp;#039;&amp;#039;&amp;lt;br/&amp;gt;(Select &amp;#039;&amp;#039;&amp;#039;Edit&amp;#039;&amp;#039;&amp;#039; to access &amp;#039;&amp;#039;&amp;#039;Control Capabilities&amp;#039;&amp;#039;&amp;#039;)&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Control Address&lt;br /&gt;
| &amp;lt;USERNAME&amp;gt;:&amp;lt;PASSWORD&amp;gt;@&amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;:&amp;lt;PORT&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
eg: admin:@&amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;:80&amp;lt;br/&amp;gt;&lt;br /&gt;
eg: zoneminder:zonepass@192.168.1.111&lt;br /&gt;
|-&lt;br /&gt;
| Auto Stop Timeout&lt;br /&gt;
| 0.10&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
;Control Capability - Apexis Mjpeg IP&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Main&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
|width=&amp;quot;25%&amp;quot; | Name&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | Apexis Mjpeg IP&lt;br /&gt;
|-&lt;br /&gt;
| Type&lt;br /&gt;
| Remote&lt;br /&gt;
|-&lt;br /&gt;
| Protocol&lt;br /&gt;
| ApexisMjpegIP&amp;lt;br/&amp;gt;&amp;#039;&amp;#039;(Refer to control protocol below)&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Can Reset&lt;br /&gt;
| [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Move&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Move&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| Can Move Continuous&lt;br /&gt;
| [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Pan&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Pan&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Tilt&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Tilt&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Zoom&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Zoom&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Zoom Continuous&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Presets&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Has Presets&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Num Presets&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | 8 &amp;#039;&amp;#039;(to be confirmed)&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Set Presets&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Control protocol for Apexis MJPEG Cameras ==&lt;br /&gt;
&lt;br /&gt;
Save the following code as &amp;#039;&amp;#039;/usr/share/perl5/ZoneMinder/Control/ApexisMjpegIP.pm&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Don&amp;#039;t forget to set the user and password as I haven&amp;#039;t figured that bit out yet ;).&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 #&lt;br /&gt;
 # ZoneMinder Apexis MJPEG IP Camera Control Protocol Module&lt;br /&gt;
 # Copyright (C) 2012 Marcus Brown&lt;br /&gt;
 # Shamefully copied from the Loftek module by Philip Coombes&lt;br /&gt;
 #&lt;br /&gt;
 # This program is free software; you can redistribute it and/or&lt;br /&gt;
 # modify it under the terms of the GNU General Public License&lt;br /&gt;
 # as published by the Free Software Foundation; either version 2&lt;br /&gt;
 # of the License, or (at your option) any later version.&lt;br /&gt;
 #&lt;br /&gt;
 # This program is distributed in the hope that it will be useful,&lt;br /&gt;
 # but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&lt;br /&gt;
 # GNU General Public License for more details.&lt;br /&gt;
 #&lt;br /&gt;
 # You should have received a copy of the GNU General Public License&lt;br /&gt;
 # along with this program; if not, write to the Free Software&lt;br /&gt;
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.&lt;br /&gt;
 #&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 #&lt;br /&gt;
 # This module contains the implementation of the Apexis MJPEG IP camera control&lt;br /&gt;
 # protocol&lt;br /&gt;
 #&lt;br /&gt;
 package ZoneMinder::Control::ApexisMjpegIP;&lt;br /&gt;
 &lt;br /&gt;
 use 5.006;&lt;br /&gt;
 use strict;&lt;br /&gt;
 use warnings;&lt;br /&gt;
 &lt;br /&gt;
 require ZoneMinder::Base;&lt;br /&gt;
 require ZoneMinder::Control;&lt;br /&gt;
 &lt;br /&gt;
 our @ISA = qw(ZoneMinder::Control);&lt;br /&gt;
 &lt;br /&gt;
 our $VERSION = $ZoneMinder::Base::VERSION;&lt;br /&gt;
 &lt;br /&gt;
 our %CamParams = ();&lt;br /&gt;
 &lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 #&lt;br /&gt;
 # Apexis MJPEG IP Control Protocol&lt;br /&gt;
 #&lt;br /&gt;
 # On ControlAddress use the format :&lt;br /&gt;
 #   USERNAME:PASSWORD@ADDRESS:PORT&lt;br /&gt;
 #   eg : admin:@10.1.2.1:80&lt;br /&gt;
 #        zoneminder:zonepass@10.0.100.1:40000&lt;br /&gt;
 #&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 &lt;br /&gt;
 # Change &amp;quot;ZoneMinder::Logger&amp;quot; to &amp;quot;ZoneMinder::Debug&amp;quot; for zoneminder &amp;lt; 1.25.0&lt;br /&gt;
 use ZoneMinder::Logger qw(:all);&lt;br /&gt;
 use ZoneMinder::Config qw(:all);&lt;br /&gt;
 &lt;br /&gt;
 use Time::HiRes qw( usleep );&lt;br /&gt;
 &lt;br /&gt;
 sub new&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
     my $class = shift;&lt;br /&gt;
     my $id = shift;&lt;br /&gt;
     my $self = ZoneMinder::Control-&amp;gt;new( $id );&lt;br /&gt;
     my $logindetails = &amp;quot;&amp;quot;;&lt;br /&gt;
     bless( $self, $class );&lt;br /&gt;
     srand( time() );&lt;br /&gt;
     return $self;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 our $AUTOLOAD;&lt;br /&gt;
 &lt;br /&gt;
 sub AUTOLOAD&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $class = ref( ) || croak( &amp;quot;$self not object&amp;quot; );&lt;br /&gt;
     my $name = $AUTOLOAD;&lt;br /&gt;
     $name =~ s/.*://;&lt;br /&gt;
     if ( exists($self-&amp;gt;{$name}) )&lt;br /&gt;
     {&lt;br /&gt;
         return( $self-&amp;gt;{$name} );&lt;br /&gt;
     }&lt;br /&gt;
         Fatal( &amp;quot;Can&amp;#039;t access $name member of object of class $class&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 sub open&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
 &lt;br /&gt;
     $self-&amp;gt;loadMonitor();&lt;br /&gt;
 &lt;br /&gt;
     use LWP::UserAgent;&lt;br /&gt;
     $self-&amp;gt;{ua} = LWP::UserAgent-&amp;gt;new;&lt;br /&gt;
     $self-&amp;gt;{ua}-&amp;gt;agent( &amp;quot;ZoneMinder Control Agent/&amp;quot;.ZM_VERSION );&lt;br /&gt;
 &lt;br /&gt;
     $self-&amp;gt;{state} = &amp;#039;open&amp;#039;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub close&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     $self-&amp;gt;{state} = &amp;#039;closed&amp;#039;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub printMsg&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $msg = shift;&lt;br /&gt;
     my $msg_len = length($msg);&lt;br /&gt;
 &lt;br /&gt;
     Debug( $msg.&amp;quot;[&amp;quot;.$msg_len.&amp;quot;]&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub sendCmd&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $cmd = shift;&lt;br /&gt;
     my $result = undef;&lt;br /&gt;
     printMsg( $cmd, &amp;quot;Tx&amp;quot; );&lt;br /&gt;
 &lt;br /&gt;
     # ############################################################################################&lt;br /&gt;
     #&lt;br /&gt;
     #  CHANGE THE FOLLOWING LINE IF NECESSARY&lt;br /&gt;
     #  IT SHOULD WORK WITH A DEFAULT CAMERA, BUT SURELY YOU WILL BE SETTING AN ADMIN PASSWORD? :)&lt;br /&gt;
     #  &lt;br /&gt;
     # ############################################################################################&lt;br /&gt;
     my $req = HTTP::Request-&amp;gt;new( GET=&amp;gt;&amp;quot;http://&amp;quot;.$self-&amp;gt;{Monitor}-&amp;gt;{ControlAddress}.&amp;quot;/$cmd\&amp;amp;user=admin\&amp;amp;pwd=&amp;quot;  );&lt;br /&gt;
     my $res = $self-&amp;gt;{ua}-&amp;gt;request($req);&lt;br /&gt;
 &lt;br /&gt;
     if ( $res-&amp;gt;is_success )&lt;br /&gt;
     {&lt;br /&gt;
         $result = !undef;&lt;br /&gt;
     }&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
         Error( &amp;quot;Error check failed:&amp;#039;&amp;quot;.$res-&amp;gt;status_line().&amp;quot;&amp;#039;&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     return( $result );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub getCamParams&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
 &lt;br /&gt;
     my $req = HTTP::Request-&amp;gt;new( GET=&amp;gt;&amp;quot;http://&amp;quot;.$self-&amp;gt;{Monitor}-&amp;gt;{ControlAddress}.&amp;quot;/get_params.cgi&amp;quot; );&lt;br /&gt;
     my $res = $self-&amp;gt;{ua}-&amp;gt;request($req);&lt;br /&gt;
 &lt;br /&gt;
     if ( $res-&amp;gt;is_success )&lt;br /&gt;
     {&lt;br /&gt;
         # Parse results setting values in %FCParams&lt;br /&gt;
         my $content = $res-&amp;gt;decoded_content;&lt;br /&gt;
 &lt;br /&gt;
         while ($content =~ s/var\s+([^=]+)=([^;]+);//ms) {&lt;br /&gt;
             $CamParams{$1} = $2;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
         Error( &amp;quot;Error check failed:&amp;#039;&amp;quot;.$res-&amp;gt;status_line().&amp;quot;&amp;#039;&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #autoStop&lt;br /&gt;
 #This makes use of the ZoneMinder Auto Stop Timeout on the Control Tab&lt;br /&gt;
 sub autoStop&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = shift;&lt;br /&gt;
     my $autostop = shift;&lt;br /&gt;
     if( $stop_command &amp;amp;&amp;amp; $autostop)&lt;br /&gt;
     {&lt;br /&gt;
         Debug( &amp;quot;Auto Stop&amp;quot; );&lt;br /&gt;
         usleep( $autostop );&lt;br /&gt;
         my $cmd = &amp;quot;decoder_control.cgi?command=&amp;quot;.$stop_command;&lt;br /&gt;
         $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # Reset the Camera&lt;br /&gt;
 sub reset&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Camera Reset&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;reboot.cgi?&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Up Arrow&lt;br /&gt;
 sub moveConUp&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;1&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Up&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=0&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Down Arrow&lt;br /&gt;
 sub moveConDown&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;3&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Down&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=2&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Left Arrow&lt;br /&gt;
 sub moveConLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;5&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Left&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=4&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Right Arrow&lt;br /&gt;
 sub moveConRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;7&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Right&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=6&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 # Single-step movements&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 # &amp;#039;onestep&amp;#039; and &amp;#039;degree&amp;#039; don&amp;#039;t appear to work for the J901&lt;br /&gt;
 &lt;br /&gt;
 sub moveRelUp&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Up&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=0&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelDown&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Down&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=2&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Left&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=4&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Right&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=6&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveRelUpRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Up Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConUp( );&lt;br /&gt;
     $self-&amp;gt;stepConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelDownRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Down Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConDown( );&lt;br /&gt;
     $self-&amp;gt;stepConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelUpLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Up Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConUp( );&lt;br /&gt;
     $self-&amp;gt;stepConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelDownLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Down Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConDown( );&lt;br /&gt;
     $self-&amp;gt;stepConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 # Iris/Aperture control ... this is *NOT* &amp;#039;iris&amp;#039; as &amp;#039;brightness&amp;#039; ?&lt;br /&gt;
 #&lt;br /&gt;
 # Doubt this works on J901&lt;br /&gt;
 &lt;br /&gt;
 sub irisConClose&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;8&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=9&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub irisConOpen&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;10&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=11&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 # Focus control&lt;br /&gt;
 #&lt;br /&gt;
 # J901 is manual focus&lt;br /&gt;
 &lt;br /&gt;
 sub focusConNear&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;13&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=12&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub focusConFar&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;15&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=14&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 &lt;br /&gt;
 #Zoom In&lt;br /&gt;
 sub zoomConTele&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;19&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Zoom Tele&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=18&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #~ #Zoom Out&lt;br /&gt;
 sub zoomConWide&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;17&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Zoom Wide&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=16&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #~ #Diagonally Up Right Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConUpRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Up Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConUp( );&lt;br /&gt;
     $self-&amp;gt;moveConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Diagonally Down Right Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConDownRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Down Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConDown( );&lt;br /&gt;
     $self-&amp;gt;moveConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 #~&lt;br /&gt;
 #Diagonally Up Left Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConUpLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Up Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConUp( );&lt;br /&gt;
     $self-&amp;gt;moveConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 #~&lt;br /&gt;
 #Diagonally Down Left Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConDownLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Down Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConDown( );&lt;br /&gt;
     $self-&amp;gt;moveConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Stop&lt;br /&gt;
 #~ sub moveStop&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ Debug( &amp;quot;Move Stop&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;decoder_control.cgi?command=1&amp;quot;;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 #Set Camera Preset&lt;br /&gt;
 #Presets must be translated into values internal to the camera&lt;br /&gt;
 #Those values are: 30,32,34 ... 88,90,92 for presets 1-32 respectively&lt;br /&gt;
 sub presetSet&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $params = shift;&lt;br /&gt;
     my $preset = $self-&amp;gt;getParam( $params, &amp;#039;preset&amp;#039; );&lt;br /&gt;
     Debug( &amp;quot;Set Preset $preset&amp;quot; );&lt;br /&gt;
 #~&lt;br /&gt;
     if (( $preset &amp;gt;= 1 ) &amp;amp;&amp;amp; ( $preset &amp;lt;= 32 )) {&lt;br /&gt;
         my $cmd = &amp;quot;decoder_control.cgi?command=&amp;quot;.(($preset*2) + 28);&lt;br /&gt;
         $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Recall Camera Preset&lt;br /&gt;
 #Presets must be translated into values internal to the camera&lt;br /&gt;
 #Those values are: 31,33,35 ... 89,91,93 for presets 1-32 respectively&lt;br /&gt;
 sub presetGoto&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $params = shift;&lt;br /&gt;
     my $preset = $self-&amp;gt;getParam( $params, &amp;#039;preset&amp;#039; );&lt;br /&gt;
     Debug( &amp;quot;Goto Preset $preset&amp;quot; );&lt;br /&gt;
 #~&lt;br /&gt;
     if (( $preset &amp;gt;= 1 ) &amp;amp;&amp;amp; ( $preset &amp;lt;= 32 )) {&lt;br /&gt;
         my $cmd = &amp;quot;decoder_control.cgi?command=&amp;quot;.(($preset*2) + 29);&lt;br /&gt;
         $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     #~ if ( $preset == 9 ) {&lt;br /&gt;
         #~ $self-&amp;gt;horizontalPatrol();&lt;br /&gt;
     #~ }&lt;br /&gt;
     #~ if ( $preset == 10 ) {&lt;br /&gt;
         #~ $self-&amp;gt;horizontalPatrolStop();&lt;br /&gt;
     #~ }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #~ sub presetHome&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ Debug( &amp;quot;Home Preset&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;decoder_control.cgi?command=25&amp;quot;;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 #Horizontal Patrol - Vertical Patrols are not supported&lt;br /&gt;
 sub horizontalPatrol&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Horizontal Patrol&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=20&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Horizontal Patrol Stop&lt;br /&gt;
 sub horizontalPatrolStop&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Horizontal Patrol Stop&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=21&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # Set Absolute Brightness&lt;br /&gt;
 #~ sub setAbsBrightness&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $brightness = shift;&lt;br /&gt;
     #~ $brightness = 255 if $brightness &amp;gt; 255;&lt;br /&gt;
     #~ $brightness = 0   if $brightness &amp;lt; 0;&lt;br /&gt;
     #~ Debug( &amp;quot;Setting brightness to $brightness&amp;quot; };&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} = $brightness;&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=1&amp;amp;value=&amp;quot;.$brightness;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Increase Brightness&lt;br /&gt;
 #~ sub irisAbsOpen&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;brightness&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} += $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} = 255 if ($CamParams{&amp;#039;brightness&amp;#039;} &amp;gt; 255);&lt;br /&gt;
     #~ Debug( &amp;quot;Iris $CamParams{&amp;#039;brightness&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=1&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;brightness&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Decrease Brightness&lt;br /&gt;
 #~ sub irisAbsClose&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;brightness&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} -= $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} = 0 if ($CamParams{&amp;#039;brightness&amp;#039;} &amp;lt; 0);&lt;br /&gt;
     #~ Debug( &amp;quot;Iris $CamParams{&amp;#039;brightness&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=1&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;brightness&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Set Absolute Contrast&lt;br /&gt;
 #~ sub setAbsContrast&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $contrast = shift;&lt;br /&gt;
     #~ $contrast = 255 if $contrast &amp;gt; 255;&lt;br /&gt;
     #~ $contrast = 0   if $contrast &amp;lt; 0;&lt;br /&gt;
     #~ Debug( &amp;quot;Setting contrast to $contrast&amp;quot; };&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} = $contrast;&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=2&amp;amp;value=&amp;quot;.$contrast;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Increase Contrast&lt;br /&gt;
 #~ sub whiteAbsIn&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;contrast&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} += $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} = 6 if ($CamParams{&amp;#039;contrast&amp;#039;} &amp;gt; 6);&lt;br /&gt;
     #~ Debug( &amp;quot;Contrast $CamParams{&amp;#039;contrast&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=2&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;contrast&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Decrease Contrast&lt;br /&gt;
 #~ sub whiteAbsOut&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;contrast&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} -= $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} = 0 if ($CamParams{&amp;#039;contrast&amp;#039;} &amp;lt; 0);&lt;br /&gt;
     #~ Debug( &amp;quot;Iris $CamParams{&amp;#039;contrast&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=2&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;contrast&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 1;&lt;/div&gt;</summary>
		<author><name>Dl6er</name></author>
	</entry>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=Apexis&amp;diff=6377</id>
		<title>Apexis</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=Apexis&amp;diff=6377"/>
		<updated>2014-09-09T11:47:52Z</updated>

		<summary type="html">&lt;p&gt;Dl6er: Added one camera&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Apexis APM J0233 WS IR (IR, outdoor, IP66) ==&lt;br /&gt;
[[File:APMJ0233WSIR_02.png|200px|thumb|right|Apexis APM J0233 WS IR]]&lt;br /&gt;
Sometimes there are distortions when switching from Nightvision to normal and back. Overall nice image quality.&lt;br /&gt;
I had to create a new user to access the image (username view, password abc123). Was not able to use the HTTP remote protocol but works fine with ffmpeg.&lt;br /&gt;
&lt;br /&gt;
Source Type: Ffmpeg&amp;lt;br/&amp;gt;&lt;br /&gt;
Source Path: http://XXX.XXX.XXX.XXX/videostream.asf?user=view&amp;amp;pwd=abc123&amp;amp;resolution=32&amp;lt;br/&amp;gt;&lt;br /&gt;
Target Colorspace: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apexis J12 IP Camera ==&lt;br /&gt;
&lt;br /&gt;
Remote Protocol: HTTP&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Method: Simple&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Name: &amp;lt;ip of camera&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Port: 80&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Path: videostream.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Image colors: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
It is recommended to set Max FPS to 20.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Apexis APM-J011-WS IP Camera ==&lt;br /&gt;
&lt;br /&gt;
Remote Protocol: HTTP &amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Method: Simple &amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Name: &amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Port: 80&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Host Path: videostream.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Remote Image colors: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Maximum frame rate this IP web camera can handle is 15 fps at 640x480. The &amp;lt;USERNAME&amp;gt; and &amp;lt;PASSWORD&amp;gt; are found in the &amp;quot;Users Settings&amp;quot; section of the IP Camera&amp;#039;s web setup page. &lt;br /&gt;
Pan Tilt Control is not available in Zoneminder 1.25.0 at this time (Feb 2012.)  This IP camera does not have a zoom function, only pan and tilt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [http://apexis.cc/Products/63.aspx Apexis APM-J901-Z-WS PTZ IP Wireless/Wired Camera] ==&lt;br /&gt;
[[file:APM-J901-Z-WS-3.jpg|200px|thumb|right|Apexis APM-J901-Z-WS]]&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
:Wired and Wireless Ethernet. 802.11b/g with WEP &amp;amp; WPA WPA2 encryption&lt;br /&gt;
:3x optical zoom&lt;br /&gt;
:355° pan, 90° tilt&lt;br /&gt;
:POE&lt;br /&gt;
:DDNS&lt;br /&gt;
:Supports VLC &amp;#039;&amp;#039;(apparently!)&amp;#039;&amp;#039;&lt;br /&gt;
:Supports MSN&lt;br /&gt;
:Supports Firefox/Chrome (ie: Push-mode)&lt;br /&gt;
:Two-way audio capable (microphone and speaker not included)&lt;br /&gt;
:FTP uploads&lt;br /&gt;
:Email alerts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Settings ===&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Source&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
|width=&amp;quot;25%&amp;quot; | Remote Protocol&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | HTTP&lt;br /&gt;
|-&lt;br /&gt;
| Remote Method&lt;br /&gt;
| Simple&lt;br /&gt;
|-&lt;br /&gt;
| Remote Host Name&lt;br /&gt;
| &amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Remote Host Port&lt;br /&gt;
| 80&lt;br /&gt;
|-&lt;br /&gt;
| Remote Host Path&lt;br /&gt;
| videostream.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;or&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
snapshot.cgi?user=&amp;lt;USERNAME&amp;gt;&amp;amp;pwd=&amp;lt;PASSWORD&amp;gt;&amp;amp;resolution=32&amp;amp;rate=0&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;eg: snapshot.cgi?user=zoneminder&amp;amp;pwd=zonepass&amp;amp;resolution=32&amp;amp;rate=0&lt;br /&gt;
|-&lt;br /&gt;
| Remote Image colors&lt;br /&gt;
| 24 bit&lt;br /&gt;
|-&lt;br /&gt;
| Capture Width&lt;br /&gt;
| 640&lt;br /&gt;
|-&lt;br /&gt;
| Capture Height&lt;br /&gt;
| 480&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Control&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
|width=&amp;quot;25%&amp;quot; | Controllable&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| Control Type&lt;br /&gt;
| Apexis Mjpeg IP &amp;#039;&amp;#039;&amp;lt;br/&amp;gt;(Select &amp;#039;&amp;#039;&amp;#039;Edit&amp;#039;&amp;#039;&amp;#039; to access &amp;#039;&amp;#039;&amp;#039;Control Capabilities&amp;#039;&amp;#039;&amp;#039;)&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Control Address&lt;br /&gt;
| &amp;lt;USERNAME&amp;gt;:&amp;lt;PASSWORD&amp;gt;@&amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;:&amp;lt;PORT&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
eg: admin:@&amp;lt;IP_ADDRESS_OF_CAMERA&amp;gt;:80&amp;lt;br/&amp;gt;&lt;br /&gt;
eg: zoneminder:zonepass@192.168.1.111&lt;br /&gt;
|-&lt;br /&gt;
| Auto Stop Timeout&lt;br /&gt;
| 0.10&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
;Control Capability - Apexis Mjpeg IP&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Main&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
|width=&amp;quot;25%&amp;quot; | Name&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | Apexis Mjpeg IP&lt;br /&gt;
|-&lt;br /&gt;
| Type&lt;br /&gt;
| Remote&lt;br /&gt;
|-&lt;br /&gt;
| Protocol&lt;br /&gt;
| ApexisMjpegIP&amp;lt;br/&amp;gt;&amp;#039;&amp;#039;(Refer to control protocol below)&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Can Reset&lt;br /&gt;
| [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Move&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Move&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| Can Move Continuous&lt;br /&gt;
| [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Pan&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Pan&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Tilt&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Tilt&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Zoom&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Zoom&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Zoom Continuous&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; width=&amp;quot;100px&amp;quot; | Presets&lt;br /&gt;
| width=&amp;quot;90%&amp;quot; |&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;95%&amp;quot;&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Has Presets&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Num Presets&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | 8 &amp;#039;&amp;#039;(to be confirmed)&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;25%&amp;quot; | Can Set Presets&lt;br /&gt;
| width=&amp;quot;75%&amp;quot; | [[Image:Tick.png|frameless|selected]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Control protocol for Apexis MJPEG Cameras ==&lt;br /&gt;
&lt;br /&gt;
Save the following code as &amp;#039;&amp;#039;/usr/share/perl5/ZoneMinder/Control/ApexisMjpegIP.pm&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Don&amp;#039;t forget to set the user and password as I haven&amp;#039;t figured that bit out yet ;).&lt;br /&gt;
&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 #&lt;br /&gt;
 # ZoneMinder Apexis MJPEG IP Camera Control Protocol Module&lt;br /&gt;
 # Copyright (C) 2012 Marcus Brown&lt;br /&gt;
 # Shamefully copied from the Loftek module by Philip Coombes&lt;br /&gt;
 #&lt;br /&gt;
 # This program is free software; you can redistribute it and/or&lt;br /&gt;
 # modify it under the terms of the GNU General Public License&lt;br /&gt;
 # as published by the Free Software Foundation; either version 2&lt;br /&gt;
 # of the License, or (at your option) any later version.&lt;br /&gt;
 #&lt;br /&gt;
 # This program is distributed in the hope that it will be useful,&lt;br /&gt;
 # but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&lt;br /&gt;
 # GNU General Public License for more details.&lt;br /&gt;
 #&lt;br /&gt;
 # You should have received a copy of the GNU General Public License&lt;br /&gt;
 # along with this program; if not, write to the Free Software&lt;br /&gt;
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.&lt;br /&gt;
 #&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 #&lt;br /&gt;
 # This module contains the implementation of the Apexis MJPEG IP camera control&lt;br /&gt;
 # protocol&lt;br /&gt;
 #&lt;br /&gt;
 package ZoneMinder::Control::ApexisMjpegIP;&lt;br /&gt;
 &lt;br /&gt;
 use 5.006;&lt;br /&gt;
 use strict;&lt;br /&gt;
 use warnings;&lt;br /&gt;
 &lt;br /&gt;
 require ZoneMinder::Base;&lt;br /&gt;
 require ZoneMinder::Control;&lt;br /&gt;
 &lt;br /&gt;
 our @ISA = qw(ZoneMinder::Control);&lt;br /&gt;
 &lt;br /&gt;
 our $VERSION = $ZoneMinder::Base::VERSION;&lt;br /&gt;
 &lt;br /&gt;
 our %CamParams = ();&lt;br /&gt;
 &lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 #&lt;br /&gt;
 # Apexis MJPEG IP Control Protocol&lt;br /&gt;
 #&lt;br /&gt;
 # On ControlAddress use the format :&lt;br /&gt;
 #   USERNAME:PASSWORD@ADDRESS:PORT&lt;br /&gt;
 #   eg : admin:@10.1.2.1:80&lt;br /&gt;
 #        zoneminder:zonepass@10.0.100.1:40000&lt;br /&gt;
 #&lt;br /&gt;
 # ==========================================================================&lt;br /&gt;
 &lt;br /&gt;
 # Change &amp;quot;ZoneMinder::Logger&amp;quot; to &amp;quot;ZoneMinder::Debug&amp;quot; for zoneminder &amp;lt; 1.25.0&lt;br /&gt;
 use ZoneMinder::Logger qw(:all);&lt;br /&gt;
 use ZoneMinder::Config qw(:all);&lt;br /&gt;
 &lt;br /&gt;
 use Time::HiRes qw( usleep );&lt;br /&gt;
 &lt;br /&gt;
 sub new&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
     my $class = shift;&lt;br /&gt;
     my $id = shift;&lt;br /&gt;
     my $self = ZoneMinder::Control-&amp;gt;new( $id );&lt;br /&gt;
     my $logindetails = &amp;quot;&amp;quot;;&lt;br /&gt;
     bless( $self, $class );&lt;br /&gt;
     srand( time() );&lt;br /&gt;
     return $self;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 our $AUTOLOAD;&lt;br /&gt;
 &lt;br /&gt;
 sub AUTOLOAD&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $class = ref( ) || croak( &amp;quot;$self not object&amp;quot; );&lt;br /&gt;
     my $name = $AUTOLOAD;&lt;br /&gt;
     $name =~ s/.*://;&lt;br /&gt;
     if ( exists($self-&amp;gt;{$name}) )&lt;br /&gt;
     {&lt;br /&gt;
         return( $self-&amp;gt;{$name} );&lt;br /&gt;
     }&lt;br /&gt;
         Fatal( &amp;quot;Can&amp;#039;t access $name member of object of class $class&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 sub open&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
 &lt;br /&gt;
     $self-&amp;gt;loadMonitor();&lt;br /&gt;
 &lt;br /&gt;
     use LWP::UserAgent;&lt;br /&gt;
     $self-&amp;gt;{ua} = LWP::UserAgent-&amp;gt;new;&lt;br /&gt;
     $self-&amp;gt;{ua}-&amp;gt;agent( &amp;quot;ZoneMinder Control Agent/&amp;quot;.ZM_VERSION );&lt;br /&gt;
 &lt;br /&gt;
     $self-&amp;gt;{state} = &amp;#039;open&amp;#039;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub close&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     $self-&amp;gt;{state} = &amp;#039;closed&amp;#039;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub printMsg&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $msg = shift;&lt;br /&gt;
     my $msg_len = length($msg);&lt;br /&gt;
 &lt;br /&gt;
     Debug( $msg.&amp;quot;[&amp;quot;.$msg_len.&amp;quot;]&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub sendCmd&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $cmd = shift;&lt;br /&gt;
     my $result = undef;&lt;br /&gt;
     printMsg( $cmd, &amp;quot;Tx&amp;quot; );&lt;br /&gt;
 &lt;br /&gt;
     # ############################################################################################&lt;br /&gt;
     #&lt;br /&gt;
     #  CHANGE THE FOLLOWING LINE IF NECESSARY&lt;br /&gt;
     #  IT SHOULD WORK WITH A DEFAULT CAMERA, BUT SURELY YOU WILL BE SETTING AN ADMIN PASSWORD? :)&lt;br /&gt;
     #  &lt;br /&gt;
     # ############################################################################################&lt;br /&gt;
     my $req = HTTP::Request-&amp;gt;new( GET=&amp;gt;&amp;quot;http://&amp;quot;.$self-&amp;gt;{Monitor}-&amp;gt;{ControlAddress}.&amp;quot;/$cmd\&amp;amp;user=admin\&amp;amp;pwd=&amp;quot;  );&lt;br /&gt;
     my $res = $self-&amp;gt;{ua}-&amp;gt;request($req);&lt;br /&gt;
 &lt;br /&gt;
     if ( $res-&amp;gt;is_success )&lt;br /&gt;
     {&lt;br /&gt;
         $result = !undef;&lt;br /&gt;
     }&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
         Error( &amp;quot;Error check failed:&amp;#039;&amp;quot;.$res-&amp;gt;status_line().&amp;quot;&amp;#039;&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     return( $result );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 sub getCamParams&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
 &lt;br /&gt;
     my $req = HTTP::Request-&amp;gt;new( GET=&amp;gt;&amp;quot;http://&amp;quot;.$self-&amp;gt;{Monitor}-&amp;gt;{ControlAddress}.&amp;quot;/get_params.cgi&amp;quot; );&lt;br /&gt;
     my $res = $self-&amp;gt;{ua}-&amp;gt;request($req);&lt;br /&gt;
 &lt;br /&gt;
     if ( $res-&amp;gt;is_success )&lt;br /&gt;
     {&lt;br /&gt;
         # Parse results setting values in %FCParams&lt;br /&gt;
         my $content = $res-&amp;gt;decoded_content;&lt;br /&gt;
 &lt;br /&gt;
         while ($content =~ s/var\s+([^=]+)=([^;]+);//ms) {&lt;br /&gt;
             $CamParams{$1} = $2;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
         Error( &amp;quot;Error check failed:&amp;#039;&amp;quot;.$res-&amp;gt;status_line().&amp;quot;&amp;#039;&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #autoStop&lt;br /&gt;
 #This makes use of the ZoneMinder Auto Stop Timeout on the Control Tab&lt;br /&gt;
 sub autoStop&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = shift;&lt;br /&gt;
     my $autostop = shift;&lt;br /&gt;
     if( $stop_command &amp;amp;&amp;amp; $autostop)&lt;br /&gt;
     {&lt;br /&gt;
         Debug( &amp;quot;Auto Stop&amp;quot; );&lt;br /&gt;
         usleep( $autostop );&lt;br /&gt;
         my $cmd = &amp;quot;decoder_control.cgi?command=&amp;quot;.$stop_command;&lt;br /&gt;
         $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # Reset the Camera&lt;br /&gt;
 sub reset&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Camera Reset&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;reboot.cgi?&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Up Arrow&lt;br /&gt;
 sub moveConUp&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;1&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Up&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=0&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Down Arrow&lt;br /&gt;
 sub moveConDown&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;3&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Down&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=2&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Left Arrow&lt;br /&gt;
 sub moveConLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;5&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Left&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=4&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Right Arrow&lt;br /&gt;
 sub moveConRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;7&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Move Right&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=6&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 # Single-step movements&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 # &amp;#039;onestep&amp;#039; and &amp;#039;degree&amp;#039; don&amp;#039;t appear to work for the J901&lt;br /&gt;
 &lt;br /&gt;
 sub moveRelUp&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Up&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=0&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelDown&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Down&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=2&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Left&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=4&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Right&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=6&amp;amp;onestep=1&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveRelUpRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Up Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConUp( );&lt;br /&gt;
     $self-&amp;gt;stepConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelDownRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Down Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConDown( );&lt;br /&gt;
     $self-&amp;gt;stepConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelUpLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Up Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConUp( );&lt;br /&gt;
     $self-&amp;gt;stepConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub moveRelDownLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Step Diagonally Down Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;stepConDown( );&lt;br /&gt;
     $self-&amp;gt;stepConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 # Iris/Aperture control ... this is *NOT* &amp;#039;iris&amp;#039; as &amp;#039;brightness&amp;#039; ?&lt;br /&gt;
 #&lt;br /&gt;
 # Doubt this works on J901&lt;br /&gt;
 &lt;br /&gt;
 sub irisConClose&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;8&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=9&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub irisConOpen&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;10&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=11&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 # Focus control&lt;br /&gt;
 #&lt;br /&gt;
 # J901 is manual focus&lt;br /&gt;
 &lt;br /&gt;
 sub focusConNear&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;13&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=12&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 #~ #~&lt;br /&gt;
 sub focusConFar&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;15&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Focus Near&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=14&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 #&lt;br /&gt;
 #####################################################################################&lt;br /&gt;
 &lt;br /&gt;
 #Zoom In&lt;br /&gt;
 sub zoomConTele&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;19&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Zoom Tele&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=18&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #~ #Zoom Out&lt;br /&gt;
 sub zoomConWide&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $stop_command = &amp;quot;17&amp;quot;;&lt;br /&gt;
     Debug( &amp;quot;Zoom Wide&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=16&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     $self-&amp;gt;autoStop( $stop_command, $self-&amp;gt;{Monitor}-&amp;gt;{AutoStopTimeout} );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #~ #Diagonally Up Right Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConUpRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Up Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConUp( );&lt;br /&gt;
     $self-&amp;gt;moveConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Diagonally Down Right Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConDownRight&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Down Right&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConDown( );&lt;br /&gt;
     $self-&amp;gt;moveConRight( );&lt;br /&gt;
 }&lt;br /&gt;
 #~&lt;br /&gt;
 #Diagonally Up Left Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConUpLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Up Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConUp( );&lt;br /&gt;
     $self-&amp;gt;moveConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 #~&lt;br /&gt;
 #Diagonally Down Left Arrow&lt;br /&gt;
 #This camera does not have builtin diagonal commands so we emulate them&lt;br /&gt;
 sub moveConDownLeft&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Move Diagonally Down Left&amp;quot; );&lt;br /&gt;
     $self-&amp;gt;moveConDown( );&lt;br /&gt;
     $self-&amp;gt;moveConLeft( );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Stop&lt;br /&gt;
 #~ sub moveStop&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ Debug( &amp;quot;Move Stop&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;decoder_control.cgi?command=1&amp;quot;;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 #Set Camera Preset&lt;br /&gt;
 #Presets must be translated into values internal to the camera&lt;br /&gt;
 #Those values are: 30,32,34 ... 88,90,92 for presets 1-32 respectively&lt;br /&gt;
 sub presetSet&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $params = shift;&lt;br /&gt;
     my $preset = $self-&amp;gt;getParam( $params, &amp;#039;preset&amp;#039; );&lt;br /&gt;
     Debug( &amp;quot;Set Preset $preset&amp;quot; );&lt;br /&gt;
 #~&lt;br /&gt;
     if (( $preset &amp;gt;= 1 ) &amp;amp;&amp;amp; ( $preset &amp;lt;= 32 )) {&lt;br /&gt;
         my $cmd = &amp;quot;decoder_control.cgi?command=&amp;quot;.(($preset*2) + 28);&lt;br /&gt;
         $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Recall Camera Preset&lt;br /&gt;
 #Presets must be translated into values internal to the camera&lt;br /&gt;
 #Those values are: 31,33,35 ... 89,91,93 for presets 1-32 respectively&lt;br /&gt;
 sub presetGoto&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     my $params = shift;&lt;br /&gt;
     my $preset = $self-&amp;gt;getParam( $params, &amp;#039;preset&amp;#039; );&lt;br /&gt;
     Debug( &amp;quot;Goto Preset $preset&amp;quot; );&lt;br /&gt;
 #~&lt;br /&gt;
     if (( $preset &amp;gt;= 1 ) &amp;amp;&amp;amp; ( $preset &amp;lt;= 32 )) {&lt;br /&gt;
         my $cmd = &amp;quot;decoder_control.cgi?command=&amp;quot;.(($preset*2) + 29);&lt;br /&gt;
         $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     #~ if ( $preset == 9 ) {&lt;br /&gt;
         #~ $self-&amp;gt;horizontalPatrol();&lt;br /&gt;
     #~ }&lt;br /&gt;
     #~ if ( $preset == 10 ) {&lt;br /&gt;
         #~ $self-&amp;gt;horizontalPatrolStop();&lt;br /&gt;
     #~ }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #~ sub presetHome&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ Debug( &amp;quot;Home Preset&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;decoder_control.cgi?command=25&amp;quot;;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 #Horizontal Patrol - Vertical Patrols are not supported&lt;br /&gt;
 sub horizontalPatrol&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Horizontal Patrol&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=20&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #Horizontal Patrol Stop&lt;br /&gt;
 sub horizontalPatrolStop&lt;br /&gt;
 {&lt;br /&gt;
     my $self = shift;&lt;br /&gt;
     Debug( &amp;quot;Horizontal Patrol Stop&amp;quot; );&lt;br /&gt;
     my $cmd = &amp;quot;decoder_control.cgi?command=21&amp;quot;;&lt;br /&gt;
     $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # Set Absolute Brightness&lt;br /&gt;
 #~ sub setAbsBrightness&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $brightness = shift;&lt;br /&gt;
     #~ $brightness = 255 if $brightness &amp;gt; 255;&lt;br /&gt;
     #~ $brightness = 0   if $brightness &amp;lt; 0;&lt;br /&gt;
     #~ Debug( &amp;quot;Setting brightness to $brightness&amp;quot; };&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} = $brightness;&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=1&amp;amp;value=&amp;quot;.$brightness;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Increase Brightness&lt;br /&gt;
 #~ sub irisAbsOpen&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;brightness&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} += $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} = 255 if ($CamParams{&amp;#039;brightness&amp;#039;} &amp;gt; 255);&lt;br /&gt;
     #~ Debug( &amp;quot;Iris $CamParams{&amp;#039;brightness&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=1&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;brightness&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Decrease Brightness&lt;br /&gt;
 #~ sub irisAbsClose&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;brightness&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} -= $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;brightness&amp;#039;} = 0 if ($CamParams{&amp;#039;brightness&amp;#039;} &amp;lt; 0);&lt;br /&gt;
     #~ Debug( &amp;quot;Iris $CamParams{&amp;#039;brightness&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=1&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;brightness&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Set Absolute Contrast&lt;br /&gt;
 #~ sub setAbsContrast&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $contrast = shift;&lt;br /&gt;
     #~ $contrast = 255 if $contrast &amp;gt; 255;&lt;br /&gt;
     #~ $contrast = 0   if $contrast &amp;lt; 0;&lt;br /&gt;
     #~ Debug( &amp;quot;Setting contrast to $contrast&amp;quot; };&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} = $contrast;&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=2&amp;amp;value=&amp;quot;.$contrast;&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Increase Contrast&lt;br /&gt;
 #~ sub whiteAbsIn&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;contrast&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} += $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} = 6 if ($CamParams{&amp;#039;contrast&amp;#039;} &amp;gt; 6);&lt;br /&gt;
     #~ Debug( &amp;quot;Contrast $CamParams{&amp;#039;contrast&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=2&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;contrast&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 # Decrease Contrast&lt;br /&gt;
 #~ sub whiteAbsOut&lt;br /&gt;
 #~ {&lt;br /&gt;
     #~ my $self = shift;&lt;br /&gt;
     #~ my $params = shift;&lt;br /&gt;
     #~ $self-&amp;gt;getCamParams() unless($CamParams{&amp;#039;contrast&amp;#039;});&lt;br /&gt;
     #~ my $step = $self-&amp;gt;getParam( $params, &amp;#039;step&amp;#039; );&lt;br /&gt;
 #~&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} -= $step;&lt;br /&gt;
     #~ $CamParams{&amp;#039;contrast&amp;#039;} = 0 if ($CamParams{&amp;#039;contrast&amp;#039;} &amp;lt; 0);&lt;br /&gt;
     #~ Debug( &amp;quot;Iris $CamParams{&amp;#039;contrast&amp;#039;}&amp;quot; );&lt;br /&gt;
     #~ my $cmd = &amp;quot;camera_control.cgi?param=2&amp;amp;value=&amp;quot;.$CamParams{&amp;#039;contrast&amp;#039;};&lt;br /&gt;
     #~ $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
 #~ }&lt;br /&gt;
 &lt;br /&gt;
 1;&lt;/div&gt;</summary>
		<author><name>Dl6er</name></author>
	</entry>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=File:APMJ0233WSIR_02.png&amp;diff=6376</id>
		<title>File:APMJ0233WSIR 02.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=File:APMJ0233WSIR_02.png&amp;diff=6376"/>
		<updated>2014-09-09T11:42:46Z</updated>

		<summary type="html">&lt;p&gt;Dl6er: Taken from reichelt.de&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Taken from reichelt.de&lt;/div&gt;</summary>
		<author><name>Dl6er</name></author>
	</entry>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=Hardware_Compatibility_List&amp;diff=6375</id>
		<title>Hardware Compatibility List</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=Hardware_Compatibility_List&amp;diff=6375"/>
		<updated>2014-09-09T11:40:41Z</updated>

		<summary type="html">&lt;p&gt;Dl6er: Two Edimax Cameras are fully compatible so replaced the link to Edimax&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zoneminder will work with almost any capture card that is supported by the linux kernel.  You may find additional details about supported hardware in the part of the forums.  Also if you find something in the forums that is  missing from the wiki ADD IT.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Capture Cards ==&lt;br /&gt;
&lt;br /&gt;
[[Anykeeper]] &lt;br /&gt;
&lt;br /&gt;
[[Avermedia]]&lt;br /&gt;
&lt;br /&gt;
[[Camsecure PCI Express video capture]]&lt;br /&gt;
&lt;br /&gt;
[[Digiflower]]&lt;br /&gt;
&lt;br /&gt;
[[Geovision GV250 - bt878a chip]]&lt;br /&gt;
&lt;br /&gt;
[[Grandtec Grand X Guard]] &lt;br /&gt;
&lt;br /&gt;
[[Hauppauge]]&lt;br /&gt;
&lt;br /&gt;
[[Ituner Spectra 8]]&lt;br /&gt;
&lt;br /&gt;
[[Kodicom 4400r]]&lt;br /&gt;
&lt;br /&gt;
[[Kodicom 8800]]&lt;br /&gt;
&lt;br /&gt;
[[Tungson TE-8008]]&lt;br /&gt;
&lt;br /&gt;
Leadtek WinFast VC 100 - the cheapest bt878 model with no tuner on it, just Com/Svideo in.&lt;br /&gt;
&lt;br /&gt;
[[LinkDelight CCTV H.264 4CH DVR Card]]&lt;br /&gt;
&lt;br /&gt;
[[Linux Media Labs LMLBT44]] &lt;br /&gt;
&lt;br /&gt;
[[Osprey 100]]&lt;br /&gt;
&lt;br /&gt;
[[Provideo PV- series (Bluecherry)]] &lt;br /&gt;
[[ Bluecherry - BC-H16480A]] &lt;br /&gt;
[[TView 95/99]]&lt;br /&gt;
&lt;br /&gt;
[[UDP Technology NCP3200v2]]&lt;br /&gt;
&lt;br /&gt;
[[Videocards with Philips saa7134 chipset]]&lt;br /&gt;
&lt;br /&gt;
[[WinFast TV2000 XP]]&lt;br /&gt;
&lt;br /&gt;
[[Rapid OS]]&lt;br /&gt;
&lt;br /&gt;
[[KesCom PG104]]&lt;br /&gt;
&lt;br /&gt;
[[IEI Technology Corp. IVC-268G-R20]]&lt;br /&gt;
&lt;br /&gt;
== bt8x8 Cards ==&lt;br /&gt;
A note on the bt8x8-based TV-tuner cards: these usually have beside the tuner input, also a Composite and an S-Video input. You can hook up 2 analog cameras to these, and access from ZoneMinder both of them as individual cameras, at max 15Fps. You don&amp;#039;t need two separate TV cards for two cameras!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Pico2000]] - 4 port card, one chip bt878, around 2 fps when using all channels&lt;br /&gt;
&lt;br /&gt;
[[Bt878_4chip_8inputs]] -4 chips bt878, 8 inputs, around 5 fps when using 2 inputs per chip&lt;br /&gt;
&lt;br /&gt;
[[:Image:Karta.jpg| bt878 8 chip 8 input]] - This card is supplied with D-sub to 8 BNC connector and uses the bt878 chip for each input allowing full frame rates and quality. See [[Kodicom 8800]] for more information.&lt;br /&gt;
&lt;br /&gt;
Geovision GV250 bt878a single chip 4 inputs - This capture Card is supplied with 4 video inputs but with NO audio channel&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Most other BTTV (bt878, bt848) cards, see /usr/src/linux/Documentation/video4linux/bttv/CARDLIST on your system for a list of some of them.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Analog Cameras ==&lt;br /&gt;
&lt;br /&gt;
Any regular composite or S-video camera connected via a supported capture card.  Some analog cameras feature camera control - ZM supports several of these camera&amp;#039;s Pan/Tilt/Zoom functions via serial port control, as well as camera Presets, Focus, Iris, etc.&lt;br /&gt;
*[[PicturetelControlScript | PictureTel PTZ2N]].&lt;br /&gt;
&lt;br /&gt;
== Network Cameras ==&lt;br /&gt;
For Network Cams to work they need to be able to stream MJPEG without the requirement of activex controls. If you see the requirement for the camera calls for IE then there is a good chance it may not work. The other option is to grab JPEG images if the camera supports that option which will work but at a lower frame rate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Any network camera that allows access to single JPEG image grabs or &amp;#039;&amp;#039;&amp;#039;some but not all&amp;#039;&amp;#039;&amp;#039; multi-part JPEG feeds.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Full Compatibility &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* [[7Links]](TM Trade Mark)&lt;br /&gt;
&lt;br /&gt;
* [[A-mtk]]&lt;br /&gt;
&lt;br /&gt;
* [[Abus]]  some&lt;br /&gt;
&lt;br /&gt;
* [[Airlink 101]] some &lt;br /&gt;
&lt;br /&gt;
* [[AirLive AirCam OD325HD]]&lt;br /&gt;
&lt;br /&gt;
* [[Amovision AM-Q630M]]&lt;br /&gt;
&lt;br /&gt;
* [[Anran VGB101-IP]]&lt;br /&gt;
&lt;br /&gt;
* [[Apexis]] (APM-J011-WS, APM-J012-WS, possibly others) &lt;br /&gt;
&lt;br /&gt;
* [[ArecontVision]] (AV3130M, probably other too)&lt;br /&gt;
&lt;br /&gt;
* [[Astak Mole]] Some&lt;br /&gt;
&lt;br /&gt;
* [[Axis]] All&lt;br /&gt;
&lt;br /&gt;
* [[Brickcom]] These have been tested&lt;br /&gt;
&lt;br /&gt;
* [[B-QTECH]] H.264 Camera&lt;br /&gt;
&lt;br /&gt;
* [[BSTI]] Some&lt;br /&gt;
&lt;br /&gt;
* [[Cisco]] some&lt;br /&gt;
&lt;br /&gt;
* [[D-Link]] Most&lt;br /&gt;
&lt;br /&gt;
* [[Edimax]] only tested some&lt;br /&gt;
&lt;br /&gt;
* [[Foscam]] (FI8908W, FI8904W, possibly others)&lt;br /&gt;
&lt;br /&gt;
* [[Gadspot]] Most&lt;br /&gt;
&lt;br /&gt;
* [[Generic]] Only tested one &lt;br /&gt;
&lt;br /&gt;
* [[Geovision]] (GV-FE420, possibly others)&lt;br /&gt;
&lt;br /&gt;
* [[Grandstream]] Grandstream (GXV-3672-FHD &amp;amp; GXV-3672-FHD-36 &amp;amp; GXV3611_HD tested)&lt;br /&gt;
&lt;br /&gt;
* [[Hikvision]] Some&lt;br /&gt;
&lt;br /&gt;
* [[hootoo]] Some&lt;br /&gt;
&lt;br /&gt;
* [[Iguard]] IP390E&lt;br /&gt;
&lt;br /&gt;
* [[Instar]] (IN-2905, possibly others)&lt;br /&gt;
&lt;br /&gt;
* [[Level One]] some&lt;br /&gt;
&lt;br /&gt;
* [[Linksys]] WVC-210 / WVC2300 / PVC2300 / WVC54GC&lt;br /&gt;
&lt;br /&gt;
* [[Loftek]] Sentinel PTZ&lt;br /&gt;
&lt;br /&gt;
* [[Maygion]] (IP-603, IP-604, possibly others)&lt;br /&gt;
&lt;br /&gt;
* [[Messoa]] (NCR870, probably others)&lt;br /&gt;
&lt;br /&gt;
* [[Rimax]] Some&lt;br /&gt;
&lt;br /&gt;
* [[Rovio]]&lt;br /&gt;
&lt;br /&gt;
* [[Sony]] Most&lt;br /&gt;
&lt;br /&gt;
* [[TP-LINK]] Some&lt;br /&gt;
&lt;br /&gt;
* [[Trendnet]] Most&lt;br /&gt;
&lt;br /&gt;
* [[Wanscam]] FR4020A2 (Foscam clone)&lt;br /&gt;
&lt;br /&gt;
* [[x-vision]] Xvision cameras by y3k (some)&lt;br /&gt;
&lt;br /&gt;
* [[Y-Cam]] (Sharx Ip) Most&lt;br /&gt;
&lt;br /&gt;
* [[Zavio]] Some&lt;br /&gt;
&lt;br /&gt;
* [[Zecumate]] JPT3815W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Remote systems, themselves running zoneminder, can be accessed as cameras using the Remote Path of &amp;#039;&amp;#039;&amp;#039;/cgi-bin/nph-zms?mode=single&amp;amp;monitor=1&amp;amp;scale=100&amp;amp;maxfps=5&amp;amp;buffer=1000&amp;#039;&amp;#039;&amp;#039; - where the monitor number is the correct camera on the remote system.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Single Jpeg Only&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* [[Airlink 101]] some&lt;br /&gt;
&lt;br /&gt;
* [[JVC]] some&lt;br /&gt;
&lt;br /&gt;
* [[Panasonic]] some&lt;br /&gt;
&lt;br /&gt;
* [[PLANET]] some   &lt;br /&gt;
&lt;br /&gt;
*[[Toshiba]] some&lt;br /&gt;
&lt;br /&gt;
* [[Veo Observer IP NetCam]] most&lt;br /&gt;
&lt;br /&gt;
*[[Vivotek]] All&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mpeg(ver1.24.0 and up)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*[[ABS_MegaCam]]&lt;br /&gt;
&lt;br /&gt;
* [[Axis]] All&lt;br /&gt;
&lt;br /&gt;
* [[ ACTi]] All&lt;br /&gt;
&lt;br /&gt;
*[[Vivotek]] Most&lt;br /&gt;
&lt;br /&gt;
*[[Logitech 700 series]] some&lt;br /&gt;
&lt;br /&gt;
*[[Ubiqiti]] some&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Compatible with modifications&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*[[Aviosys]] some&lt;br /&gt;
&lt;br /&gt;
* [[Mobotix]]  all  &lt;br /&gt;
&lt;br /&gt;
* [[Conceptronic]]  some&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Compatible with problems&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
* [[Compro]] IP70. MPEG4 only, some reliability issues and general poor firmware quality.&lt;br /&gt;
&lt;br /&gt;
* [[Grandtec]] [[Grandtec_WLAN_Camera|WLAN Camera]] WiFi or III - acceptable indoor quality, no infrared-filter (better nightvision) cheap!&lt;br /&gt;
&lt;br /&gt;
* [[Intellinet]]  IPCamera with the new firmware.&lt;br /&gt;
&lt;br /&gt;
* Old Intellinet IPCamera (model MWNC-100) with this (http://www.zoneminder.com/forums/viewtopic.php?t=7500) protocol adapter. &lt;br /&gt;
&lt;br /&gt;
* OvisLink AirLive WL-5400CAM&lt;br /&gt;
&lt;br /&gt;
Useful link: Flash&amp;#039;s IP Camera Database, with Zoneminder compatibility guide:   http://digdilem.org/cameras&lt;br /&gt;
&lt;br /&gt;
== Network Digitizers ==&lt;br /&gt;
&lt;br /&gt;
Like Network Cameras, these devices produce a video stream - but they accept an analog video input from a camera or other video source.&lt;br /&gt;
&lt;br /&gt;
* [[Synectics E100]] encoder&lt;br /&gt;
*The [[IP9100 | Aviosys IP9100, Models A, B and Plus]] has four analog video inputs.  It produces a ZM compatible video stream from one of the inputs, which is selectable via an HTTP GET command.  There might even be a control script for ZM that lets you select the active video input using &amp;#039;&amp;#039;ZM&amp;#039;s Camera Control Presets!&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
With the yoics Aviosys 9100 firmware at http://www.yoics.com/?p=28, ZoneMinder can directly access all four ports via /usr/yoicsX.jpg as the remote host path, where X is 0 - 3.&lt;br /&gt;
&lt;br /&gt;
* [[Bosch VIP X1 Single-channel]] video encoder [http://products.boschsecuritysystems.eu/en/EMEA/products/bxp/SKU15449253232961378955-CATMda7ec5dc0edf5b1a0b8cb619e2e11308]&lt;br /&gt;
&lt;br /&gt;
* Video cameras &amp;amp; safes for antitheft purpose on the website http://www.infosafe.fr&lt;br /&gt;
&lt;br /&gt;
== USB Cameras ==&lt;br /&gt;
&lt;br /&gt;
*Just Zoom USB cam&lt;br /&gt;
&lt;br /&gt;
*Creative Webcam Pro, Webcam 3, LIVE! Cam OPTIA PRO (V4L2, Chan 0, PAL, YUYV)&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;Most&amp;#039;&amp;#039; UVCvideo cameras, including: [[Logitech QuickCam Express]], QuickCam Pro 3000, [[QuickCam Pro 4000]],  QuickCam Communicate STX/Deluxe, [[Logitech Webcam Pro 9000]], and [[Webcam C250]]&lt;br /&gt;
&lt;br /&gt;
*Logitech Quickcam Orbit/Sphere (experimental basic pan/tilt control has also published for testing and hacking [http://www.zoneminder.com/forums/viewtopic.php?t=9788])&lt;br /&gt;
&lt;br /&gt;
*[[Philips]] &lt;br /&gt;
&lt;br /&gt;
*Any OV511 based USB camera [http://alpha.dyndns.org/ov511/cameras.html]&lt;br /&gt;
&lt;br /&gt;
*Any CPIA based USB camera [http://webcam.sourceforge.net]&lt;br /&gt;
&lt;br /&gt;
*[[LabTec WebCam Pro]]&lt;br /&gt;
&lt;br /&gt;
*Confirmed basic functionality with Microsoft Lifecam VX 5000 using UVC Streaming method&lt;br /&gt;
&lt;br /&gt;
Note that most USB cameras that can use Video4Linux/V4L2, and so can be used by ZoneMinder.  Some have older chipsets and can be hard to find new.&lt;br /&gt;
&lt;br /&gt;
Note that PWC drivers are not included in the kernel. Some distribution&amp;#039;s add them in and other may not. Here are some relevant links:&lt;br /&gt;
* [http://www.smcc.demon.nl/webcam/ Old Maintainer]&lt;br /&gt;
* [http://www.saillard.org/linux/pwc/ Current PWC Maintainer]&lt;br /&gt;
&lt;br /&gt;
== X10 Devices ==&lt;br /&gt;
The only device that really needs to be compatable with ZM is the Transceiver, all other x10 devices comunicate through that device.&lt;br /&gt;
*[[CM11]] Bi-Directional Transceiver&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other X10 notes:&lt;br /&gt;
&lt;br /&gt;
[http://www.zoneminder.com/forums/viewtopic.php?t=6423&amp;amp;highlight=x10 Topic 6423]&lt;br /&gt;
&lt;br /&gt;
[http://www.zoneminder.com/forums/viewtopic.php?t=7082&amp;amp;highlight=x10 Topic 7082]&lt;br /&gt;
&lt;br /&gt;
== All other hardware as supported by Linux ==&lt;br /&gt;
To find out if your hardware is supported, check the [http://www.zoneminder.com/forums/viewforum.php?f=10 HCL]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Plug Computers ==&lt;br /&gt;
Guruplug Server Plus -&amp;gt; How to install Zoneminder&lt;/div&gt;</summary>
		<author><name>Dl6er</name></author>
	</entry>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=Edimax&amp;diff=6374</id>
		<title>Edimax</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=Edimax&amp;diff=6374"/>
		<updated>2014-09-09T11:38:10Z</updated>

		<summary type="html">&lt;p&gt;Dl6er: Added two cameras&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Edimax IC3116W (WiFi IP Camera 720p) ==&lt;br /&gt;
[[File:1027659_LB_00_FB.EPS_1000.jpg|200px|thumb|right|Edimax IC3116W]]&lt;br /&gt;
I wasn&amp;#039;t able to get it working with H.264 (the camera is dropping half of the images every few minutes -&amp;gt; Motion alert). However, it works fine with MJPEG.&lt;br /&gt;
Overall, I have to say that the image is not too great and IR illumination is weak (compared to other cameras).&lt;br /&gt;
&lt;br /&gt;
Source Type: Ffmpeg&amp;lt;br/&amp;gt;&lt;br /&gt;
Source Path: rtsp://XXX.XXX.XXX.XXX:554/ipcam_mjpeg.sdp?tcp&amp;lt;br/&amp;gt;&lt;br /&gt;
Target Colorspace: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 640&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 480&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Edimax IC3110P/W (LAN/(WiFi) IP Camera 1,3MP, PoE, Nightvision) ==&lt;br /&gt;
[[File:IC-3110P 01.png|200px|thumb|right|Edimax IC3110P]]&lt;br /&gt;
Same problem as with the IC3116W when using H.264. Works fine with MJPEG.&lt;br /&gt;
Image quality is nice - absolutely no complains, worth the price (abt 85 Euros in Germany).&lt;br /&gt;
&lt;br /&gt;
Source Type: Ffmpeg&amp;lt;br/&amp;gt;&lt;br /&gt;
Source Path: http://XXX.XXX.XXX.XXX/mjpg/video.mjpg&amp;lt;br/&amp;gt;&lt;br /&gt;
Target Colorspace: 24 bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Width: 1280&amp;lt;br/&amp;gt;&lt;br /&gt;
Capture Height: 1024&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Edimax IC1500 ==&lt;br /&gt;
The edimax IC 1500 delivers a strange form of motion jpeg with a little help from a little script on your webserver&lt;br /&gt;
you should be able to view the motion jpeg stream in zoneminder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
function handlejpeg($jpeg) {&lt;br /&gt;
  if(strlen($jpeg)) {&lt;br /&gt;
    echo &amp;quot;--video boundary--\r\n&amp;quot;;&lt;br /&gt;
    echo &amp;quot;Content-length: &amp;quot;.strlen($jpeg).&amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    echo &amp;quot;Content-type: image/jpeg\r\n&amp;quot;;&lt;br /&gt;
    echo &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
    echo &amp;quot;$jpeg&amp;quot;.&amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
  @ini_set(&amp;#039;zlib.output_compression&amp;#039;, 0);&lt;br /&gt;
  @ini_set(&amp;#039;implicit_flush&amp;#039;, 1);&lt;br /&gt;
  header(&amp;#039;Content-Type: multipart/x-mixed-replace;boundary=--video boundary--&amp;#039;);&lt;br /&gt;
  $handle = fopen(&amp;quot;http://admin:1234@&amp;lt;YOURHOST&amp;gt;/snapshot.cgi&amp;quot;, &amp;quot;rb&amp;quot;);	&lt;br /&gt;
  $cl=0;&lt;br /&gt;
  $jpeg=NULL;&lt;br /&gt;
  if ($handle) {&lt;br /&gt;
    while (!feof($handle)) {&lt;br /&gt;
        $buffer = fgets($handle, 4096);&lt;br /&gt;
        if(trim($buffer)==&amp;quot;--myboundary&amp;quot;) {&lt;br /&gt;
           $CT=fgets($handle, 4096);&lt;br /&gt;
           $CL=fgets($handle, 4096);&lt;br /&gt;
           $crap=fgets($handle, 4096);&lt;br /&gt;
           $cl=preg_replace(&amp;quot;/Content-Length: /&amp;quot;,&amp;#039;&amp;#039;,trim($CL));&lt;br /&gt;
           handlejpeg($jpeg,$i);&lt;br /&gt;
           $jpeg=NULL;&lt;br /&gt;
           for($j=0;$j&amp;lt;$cl;$j++) {&lt;br /&gt;
             $jpeg.=fgetc($handle);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    fclose($handle);&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
http://www.zoneminder.com/forums/viewtopic.php?t=13587&amp;amp;highlight=cameras&lt;/div&gt;</summary>
		<author><name>Dl6er</name></author>
	</entry>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=File:1027659_LB_00_FB.EPS_1000.jpg&amp;diff=6373</id>
		<title>File:1027659 LB 00 FB.EPS 1000.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=File:1027659_LB_00_FB.EPS_1000.jpg&amp;diff=6373"/>
		<updated>2014-09-09T11:36:51Z</updated>

		<summary type="html">&lt;p&gt;Dl6er: From Conrad.de&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;From Conrad.de&lt;/div&gt;</summary>
		<author><name>Dl6er</name></author>
	</entry>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=File:IC-3110P_01.png&amp;diff=6372</id>
		<title>File:IC-3110P 01.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=File:IC-3110P_01.png&amp;diff=6372"/>
		<updated>2014-09-09T11:35:15Z</updated>

		<summary type="html">&lt;p&gt;Dl6er: From Edimax Homepage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;From Edimax Homepage&lt;/div&gt;</summary>
		<author><name>Dl6er</name></author>
	</entry>
</feed>