<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.staging.zoneminder.com/index.php?action=history&amp;feed=atom&amp;title=TV-IP672PI_Control_Script</id>
	<title>TV-IP672PI Control Script - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.staging.zoneminder.com/index.php?action=history&amp;feed=atom&amp;title=TV-IP672PI_Control_Script"/>
	<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=TV-IP672PI_Control_Script&amp;action=history"/>
	<updated>2026-05-03T13:37:52Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=TV-IP672PI_Control_Script&amp;diff=6164&amp;oldid=prev</id>
		<title>Thekorn: Add IR control comments</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=TV-IP672PI_Control_Script&amp;diff=6164&amp;oldid=prev"/>
		<updated>2014-04-29T17:01:41Z</updated>

		<summary type="html">&lt;p&gt;Add IR control comments&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:01, 29 April 2014&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l29&quot;&gt;Line 29:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 29:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#   *  Main:  name it (suggest TVIP672PI), type is FFMPEG (or remote if you&amp;#039;re using MJPEG), protocol is TVIP672PI&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#   *  Main:  name it (suggest TVIP672PI), type is FFMPEG (or remote if you&amp;#039;re using MJPEG), protocol is TVIP672PI&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#   *  Main (more):  Can wake, can sleep, can reset&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#   *  Move:  Can move, can move diagonally, can move mapped, can move relative&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#   *  Move:  Can move, can move diagonally, can move mapped, can move relative&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#   *  Pan:  Can pan&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#   *  Pan:  Can pan&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l397&quot;&gt;Line 397:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 398:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     $self-&amp;gt;sendCmd( $cmd );&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     $self-&amp;gt;sendCmd( $cmd );&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#  ****  IR CONTROLS  ****&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#   Wake:  Force IR on, always.  (always night mode)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#   Sleep:  Force IR off, always.  (always day mode)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#   Reset:  Automatic IR mode.  (day/night mode determined by camera)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Thekorn</name></author>
	</entry>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=TV-IP672PI_Control_Script&amp;diff=6163&amp;oldid=prev</id>
		<title>Thekorn: comment clarity</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=TV-IP672PI_Control_Script&amp;diff=6163&amp;oldid=prev"/>
		<updated>2014-04-29T16:53:50Z</updated>

		<summary type="html">&lt;p&gt;comment clarity&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 12:53, 29 April 2014&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l352&quot;&gt;Line 352:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 352:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#  (Home preset needs to be set via the camera&amp;#039;s web gui, and is unaffected by any of this.)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#  (Home preset needs to be set via the camera&amp;#039;s web gui, and is unaffected by any of this.)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#  So that&amp;#039;s the limitation:  DEFINE YOUR PRESETS IN ORDER THROUGH (and only through &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ZM&lt;/del&gt;!) AND DON&amp;#039;T SKIP ANY.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#  So that&amp;#039;s the limitation:  DEFINE YOUR PRESETS IN ORDER THROUGH (and only through!) &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ZM &lt;/ins&gt;AND DON&amp;#039;T SKIP ANY.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Thekorn</name></author>
	</entry>
	<entry>
		<id>http://wiki.staging.zoneminder.com/index.php?title=TV-IP672PI_Control_Script&amp;diff=6160&amp;oldid=prev</id>
		<title>Thekorn: Control script for the TV-IP672PI (and probably the P and WI and W with slight alterations)</title>
		<link rel="alternate" type="text/html" href="http://wiki.staging.zoneminder.com/index.php?title=TV-IP672PI_Control_Script&amp;diff=6160&amp;oldid=prev"/>
		<updated>2014-04-29T16:29:52Z</updated>

		<summary type="html">&lt;p&gt;Control script for the TV-IP672PI (and probably the P and WI and W with slight alterations)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# =========================================================================&lt;br /&gt;
#&lt;br /&gt;
# ZoneMinder Trendnet TV-IP672(w|p)I IP Control Protocol Module, $Date: $, $Revision: $&lt;br /&gt;
# Copyright (C) 2014 Vincent Giovannone&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
# ==========================================================================&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 Trendnet TV-IP672PI IP camera control&lt;br /&gt;
# protocol.&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
#  For Zoneminder 1.26+&lt;br /&gt;
#&lt;br /&gt;
#  Under control capability:&lt;br /&gt;
#&lt;br /&gt;
#   *  Main:  name it (suggest TVIP672PI), type is FFMPEG (or remote if you&amp;#039;re using MJPEG), protocol is TVIP672PI&lt;br /&gt;
#   *  Move:  Can move, can move diagonally, can move mapped, can move relative&lt;br /&gt;
#   *  Pan:  Can pan&lt;br /&gt;
#   *  Tilt:  Can tilt&lt;br /&gt;
#   *  Presets:  Has presets, num presets 20, has home preset  (don&amp;#039;t set presets via camera&amp;#039;s web server, only set via ZM.)&lt;br /&gt;
#&lt;br /&gt;
#  Under control tab in the monitor itself:&lt;br /&gt;
#&lt;br /&gt;
#   *  Controllable&lt;br /&gt;
#   *  Control type is the name you gave it in control capability above&lt;br /&gt;
#   *  Control device is the password you use to authenticate to the camera  (see further below if you need to change the username from &amp;quot;admin&amp;quot;)&lt;br /&gt;
#   *  Control address is the camera&amp;#039;s ip address AND web port.  example:  192.168.1.1:80 &lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
# If using with anything but a TV-IP672PI (ex:  TV-IP672WI), YOU MUST MATCH THE REALM TO MATCH YOUR CAMERA FURTHER DOWN!&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
#  Due to how the TVIP672 represents presets internally, you MUST define the presets in order...  i.e. 1,2,3,4...  not 1,10,3,4.&lt;br /&gt;
#   (see much further down for why, if you care...)&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
package ZoneMinder::Control::TVIP672;&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;
#&lt;br /&gt;
#  ********  YOU MUST CHANGE THE FOLLOWING LINES TO MATCH YOUR CAMERA!  **********&lt;br /&gt;
#  &lt;br /&gt;
#  I assume that &amp;quot;TV-IP672WI&amp;quot; would work for the TV-IP672WI, but can&amp;#039;t test since I don&amp;#039;t own one.&lt;br /&gt;
#  &lt;br /&gt;
#  TV-IP672PI works for the PI version, of course.&lt;br /&gt;
#&lt;br /&gt;
#  Finally, the username is the username you&amp;#039;d like to authenticate as.&lt;br /&gt;
#&lt;br /&gt;
our $REALM = &amp;quot;TV-IP672PI&amp;quot;;&lt;br /&gt;
our $USERNAME = &amp;quot;admin&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ==========================================================================&lt;br /&gt;
#&lt;br /&gt;
# Trendnet TV-IP672PI Control Protocol&lt;br /&gt;
#&lt;br /&gt;
# ==========================================================================&lt;br /&gt;
&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;
    my $class = shift;&lt;br /&gt;
    my $id = shift;&lt;br /&gt;
    my $self = ZoneMinder::Control-&amp;gt;new( $id );&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($self) || 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;.ZoneMinder::Base::ZM_VERSION );&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;
&lt;br /&gt;
#   This routine is used for all moving, which are all GET commands...&lt;br /&gt;
&lt;br /&gt;
    my $self = shift;&lt;br /&gt;
    my $cmd = shift;&lt;br /&gt;
&lt;br /&gt;
    my $result = undef;&lt;br /&gt;
&lt;br /&gt;
    Debug ( $cmd, &amp;quot;Tx&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    my $ua = LWP::UserAgent-&amp;gt;new();&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;/cgi/ptdc.cgi?command=&amp;quot;.$cmd );&lt;br /&gt;
&lt;br /&gt;
#	credentials:  (&amp;quot;ip:port&amp;quot; (no prefix!), realm (string), username (string), password (string)&lt;br /&gt;
    $self-&amp;gt;{ua}-&amp;gt;credentials($self-&amp;gt;{Monitor}-&amp;gt;{ControlAddress},$REALM,$USERNAME,$self-&amp;gt;{Monitor}-&amp;gt;{ControlDevice});&lt;br /&gt;
&lt;br /&gt;
    Debug ( &amp;quot;sendCmd credentials control address:&amp;#039;&amp;quot;.$self-&amp;gt;{Monitor}-&amp;gt;{ControlAddress}.&amp;quot;&amp;#039;  realm:&amp;#039;&amp;quot; . $REALM . &amp;quot;&amp;#039;  username:&amp;#039;&amp;quot; . $USERNAME . &amp;quot;&amp;#039;  password:&amp;#039;&amp;quot;.$self-&amp;gt;{Monitor}-&amp;gt;{ControlDevice}.&amp;quot;&amp;#039;&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
    Debug (&amp;quot;sendCmd command: &amp;quot; . $cmd);&lt;br /&gt;
    &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; cmd:&amp;#039;&amp;quot;.$cmd.&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;
&lt;br /&gt;
&lt;br /&gt;
sub sendCmdPost&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
#   This routine is used for setting/clearing presets and IR commands, which are POST commands...&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
    my $self = shift;&lt;br /&gt;
    my $url = shift;&lt;br /&gt;
    my $cmd = shift;&lt;br /&gt;
&lt;br /&gt;
    my $result = undef;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if ($url eq undef)&lt;br /&gt;
	{&lt;br /&gt;
		Error (&amp;quot;url passed to sendCmdPost is undefined.&amp;quot;);&lt;br /&gt;
		return(-1);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    Debug (&amp;quot;sendCmdPost url: &amp;quot; . $url . &amp;quot; cmd: &amp;quot; . $cmd);&lt;br /&gt;
&lt;br /&gt;
    my $ua = LWP::UserAgent-&amp;gt;new();&lt;br /&gt;
&lt;br /&gt;
    my $req = HTTP::Request-&amp;gt;new (POST =&amp;gt; &amp;quot;http://&amp;quot;.$self-&amp;gt;{Monitor}-&amp;gt;{ControlAddress}.$url);&lt;br /&gt;
    $req -&amp;gt; content_type(&amp;#039;application/x-www-form-urlencoded&amp;#039;);&lt;br /&gt;
    $req -&amp;gt; content($cmd);&lt;br /&gt;
&lt;br /&gt;
    $self-&amp;gt;{ua}-&amp;gt;credentials($self-&amp;gt;{Monitor}-&amp;gt;{ControlAddress},$REALM,$USERNAME,$self-&amp;gt;{Monitor}-&amp;gt;{ControlDevice});&lt;br /&gt;
&lt;br /&gt;
    Debug ( &amp;quot;sendCmdPost credentials control address:&amp;#039;&amp;quot;.$self-&amp;gt;{Monitor}-&amp;gt;{ControlAddress}.&amp;quot;&amp;#039;  realm:&amp;#039;&amp;quot; . $REALM . &amp;quot;&amp;#039;  username:&amp;#039;&amp;quot; . $USERNAME . &amp;quot;&amp;#039;&lt;br /&gt;
password:&amp;#039;&amp;quot;.$self-&amp;gt;{Monitor}-&amp;gt;{ControlDevice}.&amp;quot;&amp;#039;&amp;quot;);&lt;br /&gt;
    &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; cmd:&amp;#039;&amp;quot;.$cmd.&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;
&lt;br /&gt;
&lt;br /&gt;
sub move&lt;br /&gt;
{&lt;br /&gt;
    my $self = shift;&lt;br /&gt;
    my $panSteps = shift;&lt;br /&gt;
    my $tiltSteps = shift;&lt;br /&gt;
&lt;br /&gt;
    my $cmd = &amp;quot;set_relative_pos&amp;amp;posX=$panSteps&amp;amp;posY=$tiltSteps&amp;quot;;&lt;br /&gt;
    $self-&amp;gt;sendCmd( $cmd );&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;Move Up Left&amp;quot; );&lt;br /&gt;
    $self-&amp;gt;move(-3, 3);&lt;br /&gt;
}&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;
    $self-&amp;gt;move(0, 3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub moveRelUpRight&lt;br /&gt;
{&lt;br /&gt;
    my $self = shift;&lt;br /&gt;
    Debug( &amp;quot;Move Up Right&amp;quot; );&lt;br /&gt;
    $self-&amp;gt;move(3, 3);&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;
    $self-&amp;gt;move(-3, 0);&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;
    $self-&amp;gt;move(3, 0);&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;Move Down Left&amp;quot; );&lt;br /&gt;
    $self-&amp;gt;move(-3, -3);&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;
    $self-&amp;gt;move(0, -3);&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;Move Down Right&amp;quot; );&lt;br /&gt;
    $self-&amp;gt;move(3, -3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# moves the camera to center on the point that the user clicked on in the video image. &lt;br /&gt;
# This isn&amp;#039;t mega accurate but good enough for most purposes &lt;br /&gt;
&lt;br /&gt;
sub moveMap&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    # If the camera moves too much, increase hscale and vscale. (...if it doesn&amp;#039;t move enough, try decreasing!)&lt;br /&gt;
    # They scale the movement and are here to compensate for manufacturing variation.&lt;br /&gt;
    # It&amp;#039;s never going to be perfect, so just get somewhere in the ballpark and call it a day.&lt;br /&gt;
    #  (Don&amp;#039;t forget to kill the zmcontrol process while tweaking!)&lt;br /&gt;
&lt;br /&gt;
    #  1280x800&lt;br /&gt;
    my $hscale = 31;&lt;br /&gt;
    my $vscale = 25;&lt;br /&gt;
&lt;br /&gt;
    #  1280x800 with fisheye&lt;br /&gt;
    #my $hscale = 15;&lt;br /&gt;
    #my $vscale = 15;&lt;br /&gt;
&lt;br /&gt;
    #  640x400&lt;br /&gt;
    #my $hscale = 14;&lt;br /&gt;
    #my $vscale = 12;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    my $self = shift;&lt;br /&gt;
    my $params = shift;&lt;br /&gt;
    my $xcoord = $self-&amp;gt;getParam( $params, &amp;#039;xcoord&amp;#039; );&lt;br /&gt;
    my $ycoord = $self-&amp;gt;getParam( $params, &amp;#039;ycoord&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
    my $hor = ($xcoord - ($self-&amp;gt;{Monitor}-&amp;gt;{Width} / 2))/$hscale;&lt;br /&gt;
    my $ver = ($ycoord - ($self-&amp;gt;{Monitor}-&amp;gt;{Height} / 2))/$vscale;&lt;br /&gt;
&lt;br /&gt;
    $hor = int($hor);&lt;br /&gt;
    $ver = -1 * int($ver);&lt;br /&gt;
   &lt;br /&gt;
    Debug( &amp;quot;Move Map to $xcoord,$ycoord, hor=$hor, ver=$ver&amp;quot; );&lt;br /&gt;
    $self-&amp;gt;move( $hor, $ver );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#  ****  PRESETS  ****&lt;br /&gt;
#&lt;br /&gt;
#  OK, presets work a little funky but they DO work, provided you define them in order and don&amp;#039;t skip any. &lt;br /&gt;
#  &lt;br /&gt;
#  The problem is that when you load the web page for this camera, it gives a list of preset names tied to index numbers.&lt;br /&gt;
#  So let&amp;#039;s say you have four presets...  A, B, C, and D, and defined them in that order.&lt;br /&gt;
#  So A is index 0, B is index 1, C is index 2, D is index 3.  When you tell the camera to go to a preset, you actually tell it by number, not by name. &lt;br /&gt;
#  (So &amp;quot;Go to D&amp;quot; is really &amp;quot;go to index 3&amp;quot;.)&lt;br /&gt;
#&lt;br /&gt;
#  Now let&amp;#039;s say somebody deletes C via the camera&amp;#039;s web GUI.  The camera re-numbers the existing presets A=0, B=1, D=2.  &lt;br /&gt;
#  There&amp;#039;s really no easy way for ZM to discover this re-numbering, so zoneminder would still send &amp;quot;go to preset 3&amp;quot; thinking&lt;br /&gt;
#  it&amp;#039;s telling the camera to go to point D.  In actuality it&amp;#039;s telling the camera to go to a preset that no longer exists.&lt;br /&gt;
#  &lt;br /&gt;
#  As long as you define your presets in order (i.e. define preset 1, then preset 2, then preset 3, etc.) everything will work just &lt;br /&gt;
#  fine in ZoneMinder.&lt;br /&gt;
#&lt;br /&gt;
#  (Home preset needs to be set via the camera&amp;#039;s web gui, and is unaffected by any of this.)&lt;br /&gt;
#&lt;br /&gt;
#  So that&amp;#039;s the limitation:  DEFINE YOUR PRESETS IN ORDER THROUGH (and only through ZM!) AND DON&amp;#039;T SKIP ANY.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub presetClear&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;
    my $cmd = &amp;quot;presetName=$preset&amp;amp;command=del&amp;quot;;&lt;br /&gt;
    my $url = &amp;quot;/eng/admin/cam_control.cgi&amp;quot;;&lt;br /&gt;
    Debug (&amp;quot;presetClear: &amp;quot; . $preset . &amp;quot; cmd: &amp;quot; . $cmd);&lt;br /&gt;
    $self-&amp;gt;sendCmdPost($url,$cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&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;
    my $cmd = &amp;quot;presetName=$preset&amp;amp;command=add&amp;quot;;&lt;br /&gt;
    my $url = &amp;quot;/eng/admin/cam_control.cgi&amp;quot;;&lt;br /&gt;
    Debug (&amp;quot;presetSet &amp;quot; . $preset . &amp;quot; cmd: &amp;quot; . $cmd);&lt;br /&gt;
    $self-&amp;gt;sendCmdPost ($url,$cmd);&lt;br /&gt;
}&lt;br /&gt;
&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;
    $preset = $preset - 1;&lt;br /&gt;
    Debug( &amp;quot;Goto Preset $preset&amp;quot; );&lt;br /&gt;
    my $cmd = &amp;quot;goto_preset_position&amp;amp;index=$preset&amp;quot;;&lt;br /&gt;
    $self-&amp;gt;sendCmd( $cmd );&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;go_home&amp;quot;;&lt;br /&gt;
    $self-&amp;gt;sendCmd( $cmd );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub wake&lt;br /&gt;
{&lt;br /&gt;
    #  force IR on  (&amp;quot;always night mode&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    my $self = shift;&lt;br /&gt;
    my $url = &amp;quot;/eng/admin/adv_audiovideo.cgi&amp;quot;;&lt;br /&gt;
    my $cmd = &amp;quot;irMode=3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    Debug(&amp;quot;Wake -- IR on&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    $self-&amp;gt;sendCmdPost ($url,$cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub sleep&lt;br /&gt;
{&lt;br /&gt;
    #  force IR off (&amp;quot;always day mode&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    my $self=shift;&lt;br /&gt;
    my $url = &amp;quot;/eng/admin/adv_audiovideo.cgi&amp;quot;;&lt;br /&gt;
    my $cmd = &amp;quot;irMode=2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    Debug(&amp;quot;Sleep -- IR off&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    $self-&amp;gt;sendCmdPost ($url,$cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub reset&lt;br /&gt;
{&lt;br /&gt;
    #  IR auto&lt;br /&gt;
&lt;br /&gt;
    my $self=shift;&lt;br /&gt;
    my $url = &amp;quot;/eng/admin/adv_audiovideo.cgi&amp;quot;;&lt;br /&gt;
    my $cmd = &amp;quot;irMode=0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    Debug(&amp;quot;Reset -- IR auto&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    $self-&amp;gt;sendCmdPost ($url,$cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
__END__&lt;br /&gt;
# Below is stub documentation for your module. You&amp;#039;d better edit it!&lt;br /&gt;
&lt;br /&gt;
=head1 NAME&lt;br /&gt;
&lt;br /&gt;
ZoneMinder::Database - Perl extension for Trendnet TVIP672&lt;br /&gt;
&lt;br /&gt;
=head1 SYNOPSIS&lt;br /&gt;
&lt;br /&gt;
  use ZoneMinder::Database;&lt;br /&gt;
  stuff this in /usr/share/perl5/ZoneMinder/Control , then eat a sandwich&lt;br /&gt;
&lt;br /&gt;
=head1 DESCRIPTION&lt;br /&gt;
&lt;br /&gt;
Stub documentation for Trendnet TVIP672, created by Vince. &lt;br /&gt;
&lt;br /&gt;
=head2 EXPORT&lt;br /&gt;
&lt;br /&gt;
None by default.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=head1 SEE ALSO&lt;br /&gt;
&lt;br /&gt;
Read the comments at the beginning of this file to see the usage for zoneminder 1.25.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=head1 AUTHOR&lt;br /&gt;
&lt;br /&gt;
Vincent Giovannone, I&amp;#039;d rather you not email me.&lt;br /&gt;
&lt;br /&gt;
=head1 COPYRIGHT AND LICENSE&lt;br /&gt;
&lt;br /&gt;
Copyright (C) 2014 by Vincent Giovannone&lt;br /&gt;
&lt;br /&gt;
This library is free software; you can redistribute it and/or modify&lt;br /&gt;
it under the same terms as Perl itself, either Perl version 5.8.3 or,&lt;br /&gt;
at your option, any later version of Perl 5 you may have available.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thekorn</name></author>
	</entry>
</feed>