<?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=Dc740</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=Dc740"/>
	<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/Special:Contributions/Dc740"/>
	<updated>2026-04-20T05:49:05Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=Apexis&amp;diff=7527</id>
		<title>Apexis</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=Apexis&amp;diff=7527"/>
		<updated>2016-03-24T19:27:55Z</updated>

		<summary type="html">&lt;p&gt;Dc740: /* Apexis APM-HP602-MPC-WS IP Wireless/Wired 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;
[[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;
== [http://www.apexis.com.cn/productsdetails_211.html Apexis APM-HP602-MPC-WS IP Wireless/Wired Camera] ==&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;
:1280*720 Pixels(1.0 megapixel)&lt;br /&gt;
:Night Vision. 30 IR LEDs,40meters&lt;br /&gt;
:UPnP&lt;br /&gt;
:DDNS&lt;br /&gt;
:Supports Firefox/Chrome (Push-mode, VLC and Quicktime)&lt;br /&gt;
:Audio capable&lt;br /&gt;
:FTP uploads&lt;br /&gt;
:Email alerts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ActiveX control, Quicktime and VLC plugins all use an rtsp stream.&lt;br /&gt;
There is an ActiveX control file for Internet Explorer found in: http://&amp;lt;CAMERA_IP&amp;gt;/codebase/DvmHIPCam.zip or http://&amp;lt;CAMERA_IP&amp;gt;/codebase/DvmHIPCam.exe if the firmware is outdated.&lt;br /&gt;
&lt;br /&gt;
=== RTSP 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; | Source Type&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | ffmpeg or libvlc&lt;br /&gt;
|-&lt;br /&gt;
| Source Path&lt;br /&gt;
| rtsp://&amp;lt;CAMERA_IP&amp;gt;/live/av0?user=&amp;lt;USER&amp;gt;&amp;amp;passwd=&amp;lt;PASSWORD&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Remote Method&lt;br /&gt;
| RTSP&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;
Notes: libvlc ends up with a segmentation fault in some installations.&lt;br /&gt;
Source type: Remote and RTSP settings may work. I couldn&amp;#039;t make it work, but I suspect that it was a problem with the capture size.&lt;br /&gt;
&lt;br /&gt;
=== Simple snapshot 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;
| /cgi-bin/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;
/cgi-bin/video_snapshot.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;
/cgi-bin/mobile_snapshot.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;eg: /cgi-bin/videostream.cgi?user=zoneminder&amp;amp;pwd=zonepass&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;
== 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>Dc740</name></author>
	</entry>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=Apexis&amp;diff=7008</id>
		<title>Apexis</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=Apexis&amp;diff=7008"/>
		<updated>2015-10-05T23:48:57Z</updated>

		<summary type="html">&lt;p&gt;Dc740: Add Apexis 602 camera configuration&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;
== [http://apexis.cc/Products/89.aspx Apexis APM-HP602-MPC-WS IP Wireless/Wired Camera] ==&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;
:1280*720 Pixels(1.0 megapixel)&lt;br /&gt;
:Night Vision. 30 IR LEDs,40meters&lt;br /&gt;
:UPnP&lt;br /&gt;
:DDNS&lt;br /&gt;
:Supports Firefox/Chrome (Push-mode, VLC and Quicktime)&lt;br /&gt;
:Audio capable&lt;br /&gt;
:FTP uploads&lt;br /&gt;
:Email alerts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ActiveX control, Quicktime and VLC plugins all use an rtsp stream.&lt;br /&gt;
There is an ActiveX control file for Internet Explorer found in: http://&amp;lt;CAMERA_IP&amp;gt;/codebase/DvmHIPCam.zip or http://&amp;lt;CAMERA_IP&amp;gt;/codebase/DvmHIPCam.exe if the firmware is outdated.&lt;br /&gt;
&lt;br /&gt;
=== RTSP 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; | Source Type&lt;br /&gt;
|width=&amp;quot;75%&amp;quot; | ffmpeg or libvlc&lt;br /&gt;
|-&lt;br /&gt;
| Source Path&lt;br /&gt;
| rtsp://&amp;lt;CAMERA_IP&amp;gt;/live/av0?user=&amp;lt;USER&amp;gt;&amp;amp;passwd=&amp;lt;PASSWORD&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Remote Method&lt;br /&gt;
| RTSP&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;
Notes: libvlc ends up with a segmentation fault in some installations.&lt;br /&gt;
Source type: Remote and RTSP settings may work. I couldn&amp;#039;t make it work, but I suspect that it was a problem with the capture size.&lt;br /&gt;
&lt;br /&gt;
=== Simple snapshot 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;
| /cgi-bin/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;
/cgi-bin/video_snapshot.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;
/cgi-bin/mobile_snapshot.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;eg: /cgi-bin/videostream.cgi?user=zoneminder&amp;amp;pwd=zonepass&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;
== 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>Dc740</name></author>
	</entry>
</feed>