<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.linuxmce.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Trippleg</id>
	<title>LinuxMCE - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.linuxmce.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Trippleg"/>
	<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php/Special:Contributions/Trippleg"/>
	<updated>2026-07-21T23:35:17Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29660</id>
		<title>Insteon Venstar Thermostat Module</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29660"/>
		<updated>2012-03-08T21:14:20Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo |810Status=Working|810UpdatedDate=8 Feb 2012|810UpdatedBy=Trippleg}}&lt;br /&gt;
[[Category: Climate ]]&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
&#039;&#039;&#039;**UPDATED** --[[User:Trippleg|Trippleg]] 22:14, 8 March 2012 (CET)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Uses Prebuilt Template 2197&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Overview&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Venstar Thermostat expects Insteon to send specific commands to the device, and each command is encapsulated in a mode.  &lt;br /&gt;
For example: In order to send a command to change the temperature. Venstar has to know what mode ie. Heat, Auto, Cool. Therefore; the code sent specifies mode and temperature setting.  &lt;br /&gt;
Since there is no built in mechanism for this In the DCE router one was created.&lt;br /&gt;
&lt;br /&gt;
--[[User:Trippleg|Trippleg]] 00:22, 9 February 2012 (CET)trippleg&lt;br /&gt;
&lt;br /&gt;
Added Template Sample --[[User:Trippleg|Trippleg]] 23:24, 24 February 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Issuing A Command&#039;&#039;&#039; ==&lt;br /&gt;
&#039;&#039;&#039;This assumes you have already built and  reconfigured the Ruby code for template 2197.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Click Climate, and pick the appropriate device.&lt;br /&gt;
&lt;br /&gt;
2. Click Advanced&lt;br /&gt;
&lt;br /&gt;
3. Click Send Command to Device.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mode Commands&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Off&#039;&#039;&#039; command = Works as programmed within LMCE&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On&#039;&#039;&#039; command does not work. We have to issue a mode instead.&lt;br /&gt;
&lt;br /&gt;
 The following effectively turns the device &#039;&#039;&#039;ON&#039;&#039;&#039;.&lt;br /&gt;
    1. Send to this device the command select &#039;&#039;&#039;Set Heat/Cool&#039;&#039;&#039; &lt;br /&gt;
    2. # 8 On/Off (string) Box place the following:&lt;br /&gt;
        For &#039;&#039;&#039;Auto&#039;&#039;&#039; String will = A&lt;br /&gt;
        For &#039;&#039;&#039;Cool&#039;&#039;&#039; String will = C&lt;br /&gt;
        For &#039;&#039;&#039;Heat&#039;&#039;&#039; String will = H &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sending a command to change temperature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
With this command we have to send both mode and temp to get it to set, otherwise the thermostat will ignore the request.&lt;br /&gt;
   1. Send to this device the command select &#039;&#039;&#039;Set Tempurature&#039;&#039;&#039;.&lt;br /&gt;
   2. # 5 Value To Assign (string) Box Place The following: Mode/Temperature&lt;br /&gt;
      For &#039;&#039;&#039;Cool Temperature Setting&#039;&#039;&#039; String will = C/72  for Cool at 72 degrees&lt;br /&gt;
      For &#039;&#039;&#039;Heat Temperature Setting&#039;&#039;&#039; String will = H/78  for Heat at 74 degrees&lt;br /&gt;
  (&#039;&#039;Both of the above temp controls work in all 3 modes sending the C or the H effectively tells the unit to change the temp at which the A/C or Heater turns on&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reporting Device Status ==&lt;br /&gt;
&lt;br /&gt;
This feature has not been enabled yet. Insteon does have the ability do do this, it just has not been coded for yet.&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_-_Setting_Up_PLM_Template&amp;diff=29659</id>
		<title>Insteon - Setting Up PLM Template</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_-_Setting_Up_PLM_Template&amp;diff=29659"/>
		<updated>2012-03-08T21:12:00Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo|810Status=Q/A|810UpdatedDate=29 JUNE 2010|810UpdatedBy=langstonius|710Status=N/A|710UpdatedDate=29JUNE 2010|710UpdatedBy=langstonius}}&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:Power Line Control]]&lt;br /&gt;
[[Category:GSD| ]]&lt;br /&gt;
 {| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: 11-MAR-08 Many bugs fixed, X10 fixes...&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: 13-FEB-08 X10 Support fixed! &lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
:--ddamron&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: 7-FEB-12 Remove instructions on setting up template, use Template 1932&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
:--Aviator&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: Adding Info for 2412n template In addition to posting plm code changes to enable Venstar Thermostat&#039;&#039;&#039; --[[User:Trippleg|Trippleg]] 00:06, 25 February 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here are the steps to create an Insteon PLM Template.  This driver is written entirely in Ruby.  Please consider this driver complete, and is in Release Candidate 1.  I&#039;m sure there are still a few bugs (although we&#039;ve ironed most of them out now). The more people testing this code, the more bugs we can find, and get this to a release state.  Once it&#039;s in release state, it will be added to sqlcvs and offered via a &#039;quick&#039; update.&lt;br /&gt;
&lt;br /&gt;
==Supported Devices==&lt;br /&gt;
This driver supports ONLY the Powerlinc Modem model (PLM)#2412S, #2413S, #2412U and #2413U. The code will NOT work for a model #2414 also known as a Powerlinc CONTROLLER (PLC).&lt;br /&gt;
&lt;br /&gt;
NOTE:  I am expecting a PLC to arrive in the mail in the next few days.  Support for that device will be sooner than later.&lt;br /&gt;
&lt;br /&gt;
*Febuary 2, 2012 - PLC support will NOT be added to this driver -Aviator&lt;br /&gt;
&lt;br /&gt;
*Febuary 3, 2012 - Thanks to the work of trippleg, we now have support for the 2412N as well. -Aviator&lt;br /&gt;
&lt;br /&gt;
This driver now supports  the  Smartlinc 2412N as well. Please use template 2197&lt;br /&gt;
&lt;br /&gt;
Simplehomenet&#039;s EZBridge/EZServ products will be added once this code is stable.  These products are a &#039;wrapper&#039; for the PLM, and hence, use the same code.  Integration will be a matter of adding the &#039;wrapper&#039; code. (which is done)&lt;br /&gt;
&lt;br /&gt;
==Setting up the Template==&lt;br /&gt;
* The template is Plug and Play, configuration should have been taken care of for you.&lt;br /&gt;
&lt;br /&gt;
* Goto [[LinuxMCE Admin Website]]--&amp;gt;Wizard--&amp;gt;Devices--&amp;gt;Interfaces&lt;br /&gt;
* Add device--&amp;gt;Template Id 1932 Insteon PLM&lt;br /&gt;
For 2412N &lt;br /&gt;
* Add device --&amp;gt;Template Id 2197 Smartlinc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:* Now, in the COM PORT ON PC, you can select the com port it&#039;s on. &#039;&#039;&#039;UPDATE&#039;&#039;&#039; I didn&#039;t see any &amp;quot;COM PORT ON PC&amp;quot; field. You wil need to reload the router first, then you see the &amp;quot;COM PORT ON PC&amp;quot; field. 8/9/08 Williammanda&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039; Other than looking on the motherboard for the com port label and guess and check methods, what else can be done to identify the correct com port?&lt;br /&gt;
:* select Update (at the bottom)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You are Done!&lt;br /&gt;
&lt;br /&gt;
==Next Steps==&lt;br /&gt;
go to [[Running the Insteon PLM Driver for the First Time]]&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_384&amp;diff=29658</id>
		<title>Insteon PLM Ruby Code 384</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_384&amp;diff=29658"/>
		<updated>2012-03-08T21:10:35Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#### #384 Process Receive Command for Child ####&lt;br /&gt;
#&lt;br /&gt;
#Commands needing implementation&lt;br /&gt;
# Climate Events:&lt;br /&gt;
# 25 Temperature Changed  Partially working&lt;br /&gt;
# 26 Humidity Changed     Partially working&lt;br /&gt;
# 27 Thermostat Set Point Changed  Partially working&lt;br /&gt;
&lt;br /&gt;
# Security Commands:&lt;br /&gt;
# 746 Disarm Panel&lt;br /&gt;
# 758 Get Sensors List&lt;br /&gt;
# 19 Set House Mode&lt;br /&gt;
# 387 Verify PIN&lt;br /&gt;
# Security Events:&lt;br /&gt;
# 9 Sensor Tripped&lt;br /&gt;
# 16 Security Breach&lt;br /&gt;
# 17 Fire Alarm&lt;br /&gt;
# 18 Reset Alarm&lt;br /&gt;
# 39 Air Quality&lt;br /&gt;
# 40 Doorbell&lt;br /&gt;
# 41 Monitor Mode&lt;br /&gt;
# 42 Movement Detected&lt;br /&gt;
# 43 House Mode Changed&lt;br /&gt;
# 44 Presence Detected&lt;br /&gt;
# 45 Presence Lost&lt;br /&gt;
# 67 Alarm Panel Mode Change&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
deviceID = device_.childdevices_[cmd.devidto_].devdata_[12]&lt;br /&gt;
insteonID = deviceID.chomp.split(&#039;.&#039;)&lt;br /&gt;
$cmdID = cmd.id_&lt;br /&gt;
$cmdTo = cmd.devidto_&lt;br /&gt;
childType = device_.childdevices_[cmd.devidto_].devtemplid_&lt;br /&gt;
$cmdFrom = cmd.devidfrom_&lt;br /&gt;
$cmdPriority = cmd.priority_&lt;br /&gt;
$cmdType = cmd.type_&lt;br /&gt;
$cmdParams = cmd.params_&lt;br /&gt;
##Used Only for Thermostat Tempruature Changes########&lt;br /&gt;
$TempParamSplit =cmd.params_.to_s.split(&#039;/&#039;) # splits Tempurature string to allow for heat and cool settings&lt;br /&gt;
$ConvertTempInt = $TempParamSplit[1].to_i * 2&lt;br /&gt;
$ConvertTempHex = $ConvertTempInt.to_s(16) #Converts temp to hex to send to Thermostat&lt;br /&gt;
#################################&lt;br /&gt;
log(&#039;------dce--- cmdID:&#039; + $cmdID.to_s + &#039;, cmdFrom:&#039; + $cmdFrom.to_s + &#039;, cmdTo:&#039; + $cmdTo.to_s + &#039;, cmdType:&#039; + $cmdType.to_s + &#039;, Priority:&#039; + $cmdPriority.to_s)&lt;br /&gt;
if $cmdTo == $cmdFrom&lt;br /&gt;
log(&#039;Detected Command sent to Self!&#039;)&lt;br /&gt;
return&lt;br /&gt;
end&lt;br /&gt;
case cmd.id_&lt;br /&gt;
&lt;br /&gt;
when 278 # Set Temp&lt;br /&gt;
log(&#039;Processing Temp Control command&#039;)&lt;br /&gt;
#log($cmdParams)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
case $TempParamSplit[0].to_s&lt;br /&gt;
when &#039;5C&#039; #sending Heatpoint Tempurature&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6C&#039;, # Defines Cool Setpoint&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; $ConvertTempHex} # send Tempurature Value in Hex&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;5H&#039; #sending Heatpoint Tempurature&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6D&#039;, # Defines Heat Setpoint&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; $ConvertTempHex} # send Tempurature Value in Hex&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 279 #Fan Control&lt;br /&gt;
log(&#039;Processing Fan Control command&#039;)&lt;br /&gt;
log($cmdParams)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
&lt;br /&gt;
case $cmdParams.to_s&lt;br /&gt;
when &#039;81&#039; # Fan ON&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;07&#039;} # Sets Fan to ON&lt;br /&gt;
log(param)&lt;br /&gt;
when &#039;82&#039; # Fan OFF&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;08&#039;} # Sets fan OFF&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 280 # Heat/Cool/Auto&lt;br /&gt;
log(&#039;Processing Heat/Cool/Auto command&#039;)&lt;br /&gt;
#log(&#039;Test Param:&#039; +$cmdParams.to_s)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
case $cmdParams.to_s&lt;br /&gt;
when &#039;8H&#039; # Heat Command&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Indicates device is a Thermostat&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;04&#039;} # sets to Heat Mode&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;8C&#039; # Cool Command&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;05&#039;} # Sets to Cool&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;8A&#039; # Auto Command&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;06&#039;} # Sets to Auto&lt;br /&gt;
&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
when 192 # ON&lt;br /&gt;
log(&#039;Processing ON command&#039;)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
if childType == 2198 then #Used For Thermostat only Sets to Auto, No on command.&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Indicates device is a Thermostat&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;06&#039;} # sets to Auto&lt;br /&gt;
else #Used For Everything else&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;11&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;FF&#039;}&lt;br /&gt;
end&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log &amp;quot;------dce--- X10 DEVICE!!!&amp;quot;&lt;br /&gt;
# Send X10 ON command.&lt;br /&gt;
#first, figure out the house code and unit code.&lt;br /&gt;
log(&#039;DeviceID=&#039; + deviceID)&lt;br /&gt;
x10Byte1 = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10Byte1 += $X10UnitCodes.index(deviceID[1].chr)&lt;br /&gt;
x10cmd = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10cmd += &#039;2&#039; # command code for ON&lt;br /&gt;
log(&#039;X10 Byte1:&#039; + x10Byte1)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10Byte1,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10cmd,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;80&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
reportStatus($children[deviceID], 100)&lt;br /&gt;
when 193 #OFF&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
if childType == 2198 then #Used For Thermostat only&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Indicates Device is Thermostat&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;09&#039;} # Sets to Off&lt;br /&gt;
else&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;13&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
end&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log &amp;quot;------dce--- X10 DEVICE!!!&amp;quot;&lt;br /&gt;
log(&#039;DeviceID=&#039; + deviceID)&lt;br /&gt;
&lt;br /&gt;
x10Byte1 = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10Byte1 += $X10UnitCodes.index(deviceID[1].chr)&lt;br /&gt;
x10cmd = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10cmd += &#039;3&#039; # command code for OFF&lt;br /&gt;
log(&#039;X10 Byte1:&#039; + x10Byte1)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10Byte1,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10cmd,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;80&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
reportStatus($children[deviceID], 0)&lt;br /&gt;
when 193&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
#Needs Work&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 184 #SetLevel&lt;br /&gt;
# convert from percent to hex&lt;br /&gt;
dim_level = percenttohex(cmd.params_[76])&lt;br /&gt;
#log(&amp;quot;------dce--- Dim Level:&amp;quot; + dim_level.to_s)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;11&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; dim_level}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
# In the PRESET DIM X10 command, the lsbit of the command code is the MSB of the&lt;br /&gt;
# dim level, and the house code represents the 4 lsbits of the dim level.&lt;br /&gt;
# This is why Pre-Set Dim command is A AND B.&lt;br /&gt;
log(&#039;Parameter 76 = &#039; + cmd.params_[76].to_s)&lt;br /&gt;
log &amp;quot;X10 DEVICE!!! relative Dimming command&amp;quot;&lt;br /&gt;
log(&#039;DeviceID=&#039; + deviceID)&lt;br /&gt;
x10Byte1 = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10Byte1 += $X10UnitCodes.index(deviceID[1].chr)&lt;br /&gt;
x10cmd = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
#first, determine if its UP or Down&lt;br /&gt;
&lt;br /&gt;
if $state[deviceID].to_i &amp;gt; hextopercent(dim_level).to_i&lt;br /&gt;
# DOWN&lt;br /&gt;
x10cmd += $X10CommandCodes.index(&#039;Dim&#039;)&lt;br /&gt;
else&lt;br /&gt;
# UP&lt;br /&gt;
x10cmd += $X10CommandCodes.index(&#039;Bright&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
log(&#039;X10 Byte1:&#039; + x10Byte1)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10Byte1,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10cmd,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;80&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
&lt;br /&gt;
SndIns()&lt;br /&gt;
log(&#039;Dim Level:&#039; + hextopercent(dim_level).to_s)&lt;br /&gt;
#now send status info (we should not have to to this, but do)&lt;br /&gt;
reportStatus($children[deviceID], hextopercent(dim_level))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_373&amp;diff=29657</id>
		<title>Insteon PLM Ruby Code 373</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_373&amp;diff=29657"/>
		<updated>2012-03-08T21:09:56Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#### #373 Private Method Listing ####&lt;br /&gt;
&lt;br /&gt;
def mainStart() ## This is called FIRST, reruns cannot call this.&lt;br /&gt;
#Register Message Interceptor&lt;br /&gt;
@interceptor = Command.new(device_.devid_, -1000, 1, 5, 37)&lt;br /&gt;
@interceptor.params_[2] = device_.devid_.to_s&lt;br /&gt;
SendCommand(@interceptor)&lt;br /&gt;
&lt;br /&gt;
#Get the PLM Database&lt;br /&gt;
sendGetLink&lt;br /&gt;
#get Child devices&lt;br /&gt;
log(&#039;Finding Children..&#039;)&lt;br /&gt;
device_.childdevices_.each{|c|&lt;br /&gt;
if device_.childdevices_[c.to_s.to_i].devdata_[12].include? &amp;quot;Group&amp;quot;&lt;br /&gt;
log(&#039;FOUND A GROUP&#039;)&lt;br /&gt;
else&lt;br /&gt;
$children[device_.childdevices_[c.to_s.to_i].devdata_[12].chomp.lstrip.rstrip] = c.to_s.to_i&lt;br /&gt;
end}&lt;br /&gt;
$children.keys.each{|c| log(c + &#039; = &#039; + $children[c].to_s)&lt;br /&gt;
}&lt;br /&gt;
log(&#039;reading stored Child configuration:&#039;)&lt;br /&gt;
&lt;br /&gt;
$children.keys.each{|c|&lt;br /&gt;
#Get each Childs configuration&lt;br /&gt;
$state[$children[c]] = 0&lt;br /&gt;
getdeviceconfig(c) #&lt;br /&gt;
&lt;br /&gt;
#the above getdeviceconfig packs $configparams array&lt;br /&gt;
log(&#039;Configuration for &#039; + c + &#039; = &#039; + $configparams.inspect.to_s)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
log(&#039;********************************************************&#039;)&lt;br /&gt;
#get childs actual configuation and status&lt;br /&gt;
$children.keys.each{|c| sendGetChildStatus(c)}&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
def mainRestart()&lt;br /&gt;
#We have hashes already set up.&lt;br /&gt;
$childdatabases.each_key{|@insteonID|&lt;br /&gt;
$state[$children[@insteonID]] = 0&lt;br /&gt;
sendGetChildStatus(@insteonID)}&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def setdeviceconfig(insteonid, configurestring)&lt;br /&gt;
@deviceid = $children[insteonid]&lt;br /&gt;
@cmdfrom = device_.devid_&lt;br /&gt;
@cmdto = 4 #general info plugin&lt;br /&gt;
@priority = 1&lt;br /&gt;
@type=1 #command&lt;br /&gt;
@cmdid = 246&lt;br /&gt;
&lt;br /&gt;
#set up command..&lt;br /&gt;
@cmd = Command.new(@cmdfrom, @cmdto, @priority, @type, @cmdid)&lt;br /&gt;
@cmd.params_[2] = @deviceid.to_s&lt;br /&gt;
@cmd.params_[52] = &#039;59&#039; # Configuration&lt;br /&gt;
@cmd.params_[5] = configurestring&lt;br /&gt;
SendCommand(@cmd)&lt;br /&gt;
log(&#039;SetDeviceConfig:&#039; + @cmd.to_s)&lt;br /&gt;
#log(&#039;SetDeviceConfig:&#039; + configurestring)&lt;br /&gt;
#log(&#039;Configuration Saved - will be available on next reload&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def getdeviceconfig(insteonid)&lt;br /&gt;
@deviceid = $children[insteonid]&lt;br /&gt;
@configstring = &#039;&#039;&lt;br /&gt;
begin&lt;br /&gt;
@configstring = device_.childdevices_[@deviceid].devdata_[59].to_s&lt;br /&gt;
rescue&lt;br /&gt;
log(&#039;Device ID = &#039; + @deviceid.to_s)&lt;br /&gt;
log($red + &#039;Error - Child has no configuration&#039;+ $grey)&lt;br /&gt;
log(&#039;Setting initial value of &amp;quot;****************&amp;quot;&#039;)&lt;br /&gt;
setdeviceconfig(insteonid, (&#039;*&#039; * 16))&lt;br /&gt;
@configstring = &#039;*&#039; * 16&lt;br /&gt;
sendPing(insteonid)&lt;br /&gt;
end&lt;br /&gt;
if @configstring == &#039;&#039;&lt;br /&gt;
$configparams = [&#039;****************&#039;]&lt;br /&gt;
log(&#039;CAUGHT BLANK RECORD&#039;)&lt;br /&gt;
setdeviceconfig(insteonid, (&#039;*&#039; * 16))&lt;br /&gt;
sendPing(insteonid)&lt;br /&gt;
else&lt;br /&gt;
$configparams = @configstring.unpack(&#039;a16&#039; * (@configstring.length / 16))&lt;br /&gt;
$devicetemplate[insteonid] = getdevicetemplate($configparams[0][0..1], $configparams[0][2..3])&lt;br /&gt;
end&lt;br /&gt;
#log($yellow + &#039;getdeviceconfig:&#039; + $configparams.inspect + $grey)&lt;br /&gt;
#add the configuration parameters to the child database&lt;br /&gt;
$childdatabases[insteonid] = $configparams&lt;br /&gt;
#get the device type&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def sendGetLink()&lt;br /&gt;
#lets just see exactly what is in the PLM database&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;GetLnk&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def sendGetNext()&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;GetNext&#039;}&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(1, param)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(0,param)&lt;br /&gt;
end&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def sendRemoteGetLink(insteonID)&lt;br /&gt;
# Read First ALDB Record&lt;br /&gt;
# a few variables need to be set up here..&lt;br /&gt;
$recordof = insteonID # save the insteon ID&lt;br /&gt;
insID = insteonID.chomp.split(&#039;.&#039;) # get the seperate bytes&lt;br /&gt;
$remoteDBOffsetMSB = 0x0F # initial offset&lt;br /&gt;
$remoteDBOffsetLSB = 0xF8 # initial LSB offset&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insID[0], #HB&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insID[1], #MB&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insID[2], #LB&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;, #Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;28&#039;, #Cmd1&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &amp;quot;%X&amp;quot; %$remoteDBOffsetMSB #Cmd2 Set MSB Offset&lt;br /&gt;
}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
# repeat last param for each byte to read (F8..FF)=first record&lt;br /&gt;
&lt;br /&gt;
for x in 0..7&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insID[0], #HB&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insID[1], #MB&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insID[2], #LB&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;, #Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;2B&#039;, #Cmd1 Peek&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &amp;quot;%X&amp;quot; %($remoteDBOffsetLSB + x) #Cmd2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def sendRemoteGetNext(insteonID)&lt;br /&gt;
insID = insteonID.chomp.split(&#039;.&#039;) # get the seperate bytes&lt;br /&gt;
### Do NOT forget to check to see if we need to decrease the MSB&lt;br /&gt;
&lt;br /&gt;
if $remoteDBOffsetLSB == 0x00&lt;br /&gt;
#OffsetMSB needs to be decreased, and LSB needs reset.&lt;br /&gt;
$remoteDBOffsetMSB = $remoteDBOffsetMSB - 1&lt;br /&gt;
$remoteDBOffsetLSN = 0xFF # the next line will decrease this by 8&lt;br /&gt;
end&lt;br /&gt;
# decrease DBOffsetLSB by 0x08&lt;br /&gt;
$remoteDBOffsetLSB = $remoteDBOffsetLSB - 0x08&lt;br /&gt;
&lt;br /&gt;
for x in 0..7&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insID[0], #HB&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insID[1], #MB&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insID[2], #LB&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;, #Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;2B&#039;, #Cmd1 Peek&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &amp;quot;%X&amp;quot; %($remoteDBOffsetLSB + x) #Cmd2&lt;br /&gt;
}&lt;br /&gt;
#log(&#039;sendRemoteGetNet:added to queue:&#039; + param.inspect)&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(x + 1, param)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(x,param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
### Main command parsing routine is EZToDCE&lt;br /&gt;
def EZToDCE(param)&lt;br /&gt;
#param contains a hash of EZBridge command structure&lt;br /&gt;
#log($blue + &#039;Queue:&#039; + $cmdqueue[0].inspect + $grey)&lt;br /&gt;
#log($blue + &#039;Param:&#039; + param.inspect + $grey)&lt;br /&gt;
#log($blue + &#039;currentcmd:&#039; + $currentcmd.to_s + $grey)&lt;br /&gt;
#checkWait(param)&lt;br /&gt;
case param[&#039;Response&#039;]&lt;br /&gt;
# Standard RESPONSES (to commands)&lt;br /&gt;
when &#039;GetRevision&#039; # Special Response&lt;br /&gt;
log(&#039;-----|---------GetRevision:&#039; + param[&#039;Parameter1&#039;])&lt;br /&gt;
&lt;br /&gt;
when &#039;GetLatLong&#039; # Special Response&lt;br /&gt;
log(&#039;-----|---------GetLatLong: Lat=&#039; + param[&#039;Lat&#039;] + &#039;, Long=&#039; + param[&#039;Long&#039;])&lt;br /&gt;
&lt;br /&gt;
when &#039;SetLatLong&#039;&lt;br /&gt;
if param[&#039;Parameter1&#039;] == &#039;True&#039; then&lt;br /&gt;
log(&#039;-----|---------SetLatLong: Ok&#039;)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;-----X---------SetLatLong: FAILED!&#039;)&lt;br /&gt;
end&lt;br /&gt;
when &#039;SetPasswd&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;SetTimeZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetClock&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;SetClock&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;SetNTPServer&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;Upgrade&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;NetCfg&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;Reset&#039;&lt;br /&gt;
#Reset Response&lt;br /&gt;
&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
when &#039;LstTimers&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when &#039;ClrTimers&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;AddTimer&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetTimer&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;SetTimer&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;DelTimer&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetVersion&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;SndGrp&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;SndIns&#039; # response from SndIns&lt;br /&gt;
### BUG FOUND ### When the EZBridge receives a command from an EXTERNAL source&lt;br /&gt;
### ie not from this device, cmdqueue will be nil, and the code below&lt;br /&gt;
### fails. Have to check against that.&lt;br /&gt;
if $cmdqueue.length &amp;gt; 0&lt;br /&gt;
#First, check the response to make sure the command made it ok.&lt;br /&gt;
if param[&#039;Parameter9&#039;].to_i == 6 #Ack received&lt;br /&gt;
#log(&#039;Sending to ProcessACK&#039;)&lt;br /&gt;
processACK(param)&lt;br /&gt;
else # NACK received - command failed.&lt;br /&gt;
log(&#039;Command NACKED&#039;)&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
#Response received for another device.&lt;br /&gt;
log(&#039;Response detected for a command that was not sent by me&#039;)&lt;br /&gt;
end&lt;br /&gt;
when &#039;SndX10&#039;&lt;br /&gt;
log(&#039;Response detected for SndX10&#039;)&lt;br /&gt;
if param[&#039;Parameter5&#039;].to_i == 6 #ack&lt;br /&gt;
log(&#039;X10 Command Successfull&#039;)&lt;br /&gt;
&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;X10 Command FAILED&#039;)&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
when &#039;StLnk&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;CancelLnk&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;SetDev&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;RstPLM&#039;&lt;br /&gt;
#Reset Response&lt;br /&gt;
$timeout = 1&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;GetLnk&#039;&lt;br /&gt;
if param[&#039;Parameter3&#039;].to_i == 6 #ack&lt;br /&gt;
log(&#039;GetLnk ACKED&#039;)&lt;br /&gt;
#if we get this, we should get a AllLink Record Response next&lt;br /&gt;
else&lt;br /&gt;
log(&#039;GetLnk NACKED&#039;)&lt;br /&gt;
# The PLM is BLANK&lt;br /&gt;
#have to add records to the PLM here.&lt;br /&gt;
cmdComplete&lt;br /&gt;
### FINISHED WITH GetLnk&lt;br /&gt;
checkChildRecordsinPLM()&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
when &#039;GetNext&#039;&lt;br /&gt;
if param[&#039;Parameter3&#039;].to_i == 6 #ack&lt;br /&gt;
log(&#039;sendGetNext ACKED&#039;)&lt;br /&gt;
#if we get this, we should get a AllLink Record Response next&lt;br /&gt;
else&lt;br /&gt;
log(&#039;sendGetNext NACKED&#039;)&lt;br /&gt;
#we get this when there are no more records&lt;br /&gt;
cmdComplete&lt;br /&gt;
#FINISHED with GetNext&lt;br /&gt;
# if we are here, we are in config mode&lt;br /&gt;
# so, next is to check to make sure the&lt;br /&gt;
# childrens insteon ID is in the PLM&lt;br /&gt;
checkChildRecordsinPLM()&lt;br /&gt;
# now, to make sure that all the records in the PLM are sensed as children&lt;br /&gt;
&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when &#039;SetCfg&#039; # response from Setcfg command&lt;br /&gt;
if param[&#039;Parameter4&#039;].to_i == 6 #ack&lt;br /&gt;
log(&#039;SetCfg Completed&#039;)&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;SetCfg NACKED&#039;)&lt;br /&gt;
end&lt;br /&gt;
when &#039;GetLnkData&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;LEDON&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;LEDOFF&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;MngLnk&#039;&lt;br /&gt;
if param[&#039;Parameter12&#039;].to_i == 6&lt;br /&gt;
log(&#039;MngLnk =&amp;gt; ACK&#039;)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;MngLnk =&amp;gt; NACK&#039;)&lt;br /&gt;
end&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;GetCfg&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;LstMacros&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;ClrMacros&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;AddMacro&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetMacro&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;SetMacro&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;DelMacro&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;LstDevices&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;ClrDevices&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;AddDevice&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetDevice&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;SetDevice&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;DelDevice&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;LstZones&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;ClrZones&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;AddZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;SetZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;DelZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;AddDevZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;DelDevZone&#039;&lt;br /&gt;
&lt;br /&gt;
# Response Messages&lt;br /&gt;
when &#039;InsExtMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;InsStdMsg&#039;&lt;br /&gt;
case $currentcmd # if this msg is part of a response, the Insteon Cmd1 will be saved here.&lt;br /&gt;
when 0x0&lt;br /&gt;
#log(&#039;REROUTING to processExternalCommand(param)&#039;)&lt;br /&gt;
processExternalCommand(param)&lt;br /&gt;
when 0x1 #Assign to Group&lt;br /&gt;
### This is a broadcast message sent&lt;br /&gt;
# from a PING command&lt;br /&gt;
# or from a StartLink...&lt;br /&gt;
log(&#039;Caught Assign to Group Message from Device&#039;)&lt;br /&gt;
### BUG HERE&lt;br /&gt;
#have to check flags to see if this is a broadcast message&lt;br /&gt;
log(&#039;Checking if this is a broadcast message&#039;)&lt;br /&gt;
log(&#039;Flags:&#039; + param[&#039;Parameter9&#039;])&lt;br /&gt;
if (param[&#039;Parameter9&#039;].hex &amp;amp; 0x80) == 0x80&lt;br /&gt;
log(&#039;Message IS BROADCAST&#039;)&lt;br /&gt;
#recvComplete&lt;br /&gt;
processDeviceInfo(param)&lt;br /&gt;
&lt;br /&gt;
# check to see if current cmd is for this broadcast..&lt;br /&gt;
log(&#039;Current Command:&#039; + $cmdqueue[0][&#039;Parameter5&#039;])&lt;br /&gt;
if $cmdqueue[0][&#039;Parameter5&#039;] == &#039;10&#039;&lt;br /&gt;
#log(&#039;Clearing PING Command&#039;)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;CURRENT CMD IS NOT PING - NOT CLEARING&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Message is NOT Broadcast&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x2 #Delete from Group&lt;br /&gt;
when 0x10 # PING&lt;br /&gt;
#this is where I catch the InsStdMsg for ping.&lt;br /&gt;
log(&#039;Caught PING Message from Device&#039;)&lt;br /&gt;
$currentcmd = 1&lt;br /&gt;
&lt;br /&gt;
when 0x11 # ON&lt;br /&gt;
log(&#039;Caught Insteon ON from INTERNAL source&#039;)&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
log(&#039;Current DIM level:&#039; + param[&#039;Parameter11&#039;])&lt;br /&gt;
&lt;br /&gt;
reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
&lt;br /&gt;
SndIns()&lt;br /&gt;
when 0x13 # OFF&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
reportStatus(myDevFrom, 0)&lt;br /&gt;
&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
SndIns()&lt;br /&gt;
#####Thermostat Does Not report Status correctly Yet. Have to figure out reportStatus###&lt;br /&gt;
when 0x6A #Thermostat Control Get Zone Data (Temp, Setpoint,Humidity)&lt;br /&gt;
log(&#039;Thermostat returned Zone Info: &#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when 0x6B #Thermostat Control Command Handle Response&lt;br /&gt;
log(&#039;Thermostat returned: &#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
case param[&#039;Parameter11&#039;].to_s&lt;br /&gt;
when &#039;06&#039; # ON/Auto&lt;br /&gt;
# $ThermostatStatus = &#039;ON/Auto&#039; ##not used&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 6)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;09&#039; #OFF&lt;br /&gt;
# $ThermostatStatus = &#039;OFF&#039; ## not used may be for reportstatus&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 9)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;04&#039; # Heat&lt;br /&gt;
#$ThermostatStatus = &#039;HEAT&#039;&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 4)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;05&#039; # Cool&lt;br /&gt;
#$ThermostatStatus = &#039;COOL&#039;&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 5)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when &#039;07&#039; # Fan On&lt;br /&gt;
2#$ThermostatStatus = &#039;COOL&#039;&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 5)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when &#039;08&#039; # Fan Off&lt;br /&gt;
#$ThermostatStatus = &#039;COOL&#039;&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 5)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when 0x6C #Thermostat Control Get Zone Cool Point Data&lt;br /&gt;
log(&#039;Thermostat returned Zone Info: &#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
log(&#039;Current Zone level:&#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
#reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when 0x6D #Thermostat Control Get Zone Heat Point Data&lt;br /&gt;
log(&#039;Thermostat returned Zone Info: &#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
log(&#039;Current Zone level:&#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
#reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when 0x19 # Status Report&lt;br /&gt;
# now to clear the currentcmd and remove command from the queue&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
&lt;br /&gt;
log(&#039;Processing 0x19 Status Report&#039;)&lt;br /&gt;
#This is where I get the database delta (in cmd1)&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
#First, to compare the DB Delta with current config.&lt;br /&gt;
#Database Delta...&lt;br /&gt;
delta = param[&#039;Parameter10&#039;].to_s&lt;br /&gt;
log($blue + &#039;Database Delta=&#039; + delta + $grey)&lt;br /&gt;
log($blue + &#039;Configuration is:&#039; + getdeltafromconfig(insID) + $grey)&lt;br /&gt;
if delta == getdeltafromconfig(insID)&lt;br /&gt;
if $children[insID] != nil&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
myDevTo = -1000 #DCE Router&lt;br /&gt;
myPriority = 1&lt;br /&gt;
myType = 2 #Event&lt;br /&gt;
&lt;br /&gt;
#Send an EVENT to report STATE ONLY if database has not changed&lt;br /&gt;
# AND child exists in pluto&lt;br /&gt;
reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Databse CHANGED -getting remote database&#039;)&lt;br /&gt;
#here, I have to WIPE the databse&lt;br /&gt;
# to prepare it for new data&lt;br /&gt;
### here is where the DAMN CONFIG was reset!!!&lt;br /&gt;
oldconfigstring = $childdatabases[insID][0]&lt;br /&gt;
$childdatabases[insID] = [oldconfigstring]&lt;br /&gt;
log(&#039;Setting Database Config&#039;)&lt;br /&gt;
$childdatabases[insID][0][6..7] = delta&lt;br /&gt;
savechilddatabases(insID)&lt;br /&gt;
sendRemoteGetLink(insID)&lt;br /&gt;
end&lt;br /&gt;
# finally, to check execute next command...&lt;br /&gt;
SndIns()&lt;br /&gt;
when 0x28 # Set Address MSB&lt;br /&gt;
log(&#039;Received SET Address MSB from remote device&#039;)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
$remoteLinkRecord = &#039;&#039;&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
when 0x2B # peek&lt;br /&gt;
### BUG HERE... have to verify response is a PEEK command&lt;br /&gt;
#response command is stored in parameter10&lt;br /&gt;
if param[&#039;Parameter10&#039;].hex == 0x2B # this is the peek command&lt;br /&gt;
cmdComplete&lt;br /&gt;
log(&#039;Received PEEK from remote Device! DATA=&#039; + param[&#039;Parameter11&#039;])&lt;br /&gt;
checkPeekData(param)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Waiting for remote PEEK response, but got :&#039; + param[&#039;Parameter10&#039;])&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when &#039;X10Msg&#039;&lt;br /&gt;
log($purple + &#039;X10 Message Received&#039; + $grey)&lt;br /&gt;
if param[&#039;Parameter4&#039;].hex == 0x00&lt;br /&gt;
log(&#039;This byte is a House/Unit Code&#039;)&lt;br /&gt;
hn = param[&#039;Parameter3&#039;][0].chr&lt;br /&gt;
ln = param[&#039;Parameter3&#039;][1].chr&lt;br /&gt;
$x10byte1 = $X10HouseCodes[hn]&lt;br /&gt;
$x10byte1 += $X10UnitCodes[ln]&lt;br /&gt;
log(&#039;Translated X10 House/Unit Code:&#039; + $x10byte1)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;This byte is a House/Command Code&#039;)&lt;br /&gt;
hn = param[&#039;Parameter3&#039;][0].chr&lt;br /&gt;
ln = param[&#039;Parameter3&#039;][1].chr&lt;br /&gt;
$x10byte2 = $X10HouseCodes[hn]&lt;br /&gt;
$x10byte2 += $X10CommandCodes[ln]&lt;br /&gt;
log(&#039;Translated X10 Command Code:&#039; + $x10byte2)&lt;br /&gt;
log(&#039;X10 Command ready to send:&#039; + $x10byte1 + &#039; &#039; + $x10byte2)&lt;br /&gt;
case $X10CommandCodes[ln]&lt;br /&gt;
when &#039;On&#039;&lt;br /&gt;
#Send ON to lmnce&lt;br /&gt;
if $children[$x10byte1] == nil&lt;br /&gt;
log(&#039;I do not control this X10 device&#039;)&lt;br /&gt;
else&lt;br /&gt;
cmd = Command.new($children[$x10byte1].to_i, -1000, 1, 1, 192)&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
when &#039;Off&#039;&lt;br /&gt;
#Send OFF to lmnce&lt;br /&gt;
if $children[$x10byte1] == nil&lt;br /&gt;
log(&#039;I do not control this X10 device&#039;)&lt;br /&gt;
else&lt;br /&gt;
cmd = Command.new($children[$x10byte1].to_i, -1000, 1, 1, 193)&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
when &#039;Bright&#039;&lt;br /&gt;
if $children[$x10byte1] == nil&lt;br /&gt;
log(&#039;I do not control this X10 device&#039;)&lt;br /&gt;
else&lt;br /&gt;
#send a command to set the state + 1&lt;br /&gt;
@curstate = ($state[$x10byte1] / 100) * 32 #get equal 32 steps&lt;br /&gt;
$state[$x10byte1] = ((@curstate + 1) / 32) * 100&lt;br /&gt;
cmd = Command.new($children[$x10byte1].to_i, -1000, 1, 1, 184)&lt;br /&gt;
cmd.params_[76] = $state[$x10byte1].to_s&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
#$state[$x10byte1] = ($state[$x10byte1] / 100) * 32&lt;br /&gt;
end&lt;br /&gt;
when &#039;Dim&#039;&lt;br /&gt;
@curstate = ($state[$x10byte1] / 100) * 32 #get equal 32 steps&lt;br /&gt;
$state[$x10byte1] = ((@curstate - 1) / 32) * 100&lt;br /&gt;
cmd = Command.new($children[$x10byte1].to_i, -1000, 1, 1, 184)&lt;br /&gt;
cmd.params_[76] = $state[$x10byte1].to_s&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
when &#039;All Lights Off&#039;&lt;br /&gt;
log(&#039;ALL Lights OFF Command not implemented&#039;)&lt;br /&gt;
when &#039;All Lights On&#039;&lt;br /&gt;
log(&#039;All Lights ON Command not implemented&#039;)&lt;br /&gt;
when &#039;Status Request&#039;&lt;br /&gt;
log(&#039;Status Request Command not implemented&#039;)&lt;br /&gt;
when &#039;Hail Ack&#039;&lt;br /&gt;
log(&#039;Hail Ack Command not implemented&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
when &#039;InsLnkSts&#039;&lt;br /&gt;
log(&#039;InsLnkSts Received&#039;)&lt;br /&gt;
&lt;br /&gt;
when &#039;BtnRpt&#039;&lt;br /&gt;
log(&#039;Button Report Received&#039;)&lt;br /&gt;
when &#039;UsrRst&#039;&lt;br /&gt;
log(&#039;User Reset Response Received&#039;)&lt;br /&gt;
when &#039;GrpEvntRpt&#039;&lt;br /&gt;
log(&#039;Group Event Report Received&#039;)&lt;br /&gt;
&lt;br /&gt;
when &#039;LnkData&#039;&lt;br /&gt;
processLnkData(param)&lt;br /&gt;
# Other messages&lt;br /&gt;
when &#039;PLMTimeout&#039;&lt;br /&gt;
log(&#039;PLM Timeout detected.. resetting EZBridge&#039;)&lt;br /&gt;
resetcmd = {&#039;Command&#039; =&amp;gt; &#039;Reset&#039;}&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(1, resetcmd)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(0,resetcmd)&lt;br /&gt;
end&lt;br /&gt;
sleep 15&lt;br /&gt;
$wAIT = false&lt;br /&gt;
SndIns()&lt;br /&gt;
when &#039;PLMEchoError&#039; # Have not seen this since a1.23&lt;br /&gt;
# error sending command to PLM, reset command and try again&lt;br /&gt;
log(&#039;-----XXXXXXX&#039; + param[&#039;Response&#039;])&lt;br /&gt;
resetcmd = {&#039;Command&#039; =&amp;gt; &#039;Reset&#039;}&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(1, resetcmd)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(0,resetcmd)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sleep 15&lt;br /&gt;
$wAIT = false&lt;br /&gt;
SndIns()&lt;br /&gt;
when &#039;LongAck&#039;&lt;br /&gt;
log(&#039;-----XXXXXXX&#039; + param[&#039;Response&#039;])&lt;br /&gt;
# Error - seems to show up after PLMEchoError&lt;br /&gt;
resetcmd = {&#039;Command&#039; =&amp;gt; &#039;Reset&#039;}&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(1, resetcmd)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(0,resetcmd)&lt;br /&gt;
end&lt;br /&gt;
sleep 15&lt;br /&gt;
$wAIT = false&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;-----XXXXXXX UNKNOWN Response Received&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
### Support routine for EZToDCE&lt;br /&gt;
def processLnkData(param)&lt;br /&gt;
#Caught a LnkData Response&lt;br /&gt;
log(&#039;LnkData Message Received&#039;)&lt;br /&gt;
log(param.inspect)&lt;br /&gt;
if param[&#039;Parameter6&#039;] == &#039;00&#039; and param[&#039;Parameter7&#039;] == &#039;00&#039;&lt;br /&gt;
log(&#039;FOUND X10 DEVICE!!!&#039;)&lt;br /&gt;
insteonID = padhex(param[&#039;Parameter5&#039;])&lt;br /&gt;
else&lt;br /&gt;
insteonID = padhex(param[&#039;Parameter5&#039;]) + &#039;.&#039; + padhex(param[&#039;Parameter6&#039;]) + &#039;.&#039; + padhex(param[&#039;Parameter7&#039;])&lt;br /&gt;
end&lt;br /&gt;
group = param[&#039;Parameter4&#039;]&lt;br /&gt;
recflags = param[&#039;Parameter3&#039;]&lt;br /&gt;
lnkdata1 = param[&#039;Parameter8&#039;]&lt;br /&gt;
lnkdata2 = param[&#039;Parameter9&#039;]&lt;br /&gt;
lnkdata3 = param[&#039;Parameter10&#039;]&lt;br /&gt;
#pack string to store for PLM Database&lt;br /&gt;
@currentrecord = recflags + group&lt;br /&gt;
@currentrecord += param[&#039;Parameter5&#039;] + param[&#039;Parameter6&#039;] + param[&#039;Parameter7&#039;]&lt;br /&gt;
@currentrecord += lnkdata1 + lnkdata2 + lnkdata3&lt;br /&gt;
&lt;br /&gt;
#Add to plmdatabase&lt;br /&gt;
$plmdatabase &amp;lt;&amp;lt; @currentrecord&lt;br /&gt;
log(&#039;record Flags:&#039; + recflags)&lt;br /&gt;
#log(&#039;PLM database=&#039; +$plmdatabase.inspect)&lt;br /&gt;
if (recflags[0] &amp;amp; 0x80) == 0x80 # Record is in use if true&lt;br /&gt;
end&lt;br /&gt;
if (recflags[0] &amp;amp; 0x40) == 0x40 # Controller if true&lt;br /&gt;
log(&#039;Controller&#039;)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Responder&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
log(&#039;Insteon ID:&#039; + insteonID + &#039;, Group:&#039; + group)&lt;br /&gt;
&lt;br /&gt;
cmdComplete&lt;br /&gt;
sendGetNext()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
### Support Routine for EZToDCE&lt;br /&gt;
def processExternalCommand(param)&lt;br /&gt;
#there is no current command&lt;br /&gt;
# THIS IS COMING FROM AN OUTSIDE SOURCE&lt;br /&gt;
#EG: Manually turning Light Switch On/Off&lt;br /&gt;
# process this command.&lt;br /&gt;
# Note, this is a standard message&lt;br /&gt;
### have to check here if child is mine!&lt;br /&gt;
&lt;br /&gt;
# This is where I have to check for a broadcast command..&lt;br /&gt;
#if so, search the child databases for responders,&lt;br /&gt;
#and fire events for each responder.&lt;br /&gt;
#Message flag is in parameter9 Group command 0xCx (All-Link Broadcast Message Pg 42.)&lt;br /&gt;
#Group is in parameter8&lt;br /&gt;
#From InsteonID is parameters 3, 4, 5&lt;br /&gt;
if (param[&#039;Parameter9&#039;].hex &amp;amp; 0xC0) == 0xC0 # Message is Broadcast&lt;br /&gt;
log(&#039;Rerouting to processBroadcastMessage&#039;)&lt;br /&gt;
processBroadcastMessage(param)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Process External Command:&#039;)&lt;br /&gt;
log(&#039;Param:&#039; + param.inspect)&lt;br /&gt;
&lt;br /&gt;
# there is no ack here. Simply Send COMMANDS back to DCE&lt;br /&gt;
# and Complete the recv..&lt;br /&gt;
case param[&#039;Parameter10&#039;].hex #this is the command&lt;br /&gt;
when 0x01 #Assign to Group&lt;br /&gt;
log(&#039;Caught EXTERNAL Assign to Group&#039;)&lt;br /&gt;
processDeviceInfo(param)&lt;br /&gt;
recvComplete&lt;br /&gt;
when 0x02 #Delete from Group&lt;br /&gt;
when 0x02 #Delete from Group&lt;br /&gt;
log(&#039;Caught EXTERNAL Delete from Group&#039;)&lt;br /&gt;
recvComplete&lt;br /&gt;
when 0x10 # PING&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon PING result&#039;)&lt;br /&gt;
recvComplete&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when 0x11 #ON&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon ON command result&#039;)&lt;br /&gt;
#on level is in cmd2&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
log(&#039;From:&#039; +insID)&lt;br /&gt;
log(&#039;Device:&#039; + $children[insID].to_s)&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
# check to see if I own child&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
end&lt;br /&gt;
recvComplete&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when 0x13 #OFF&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon OFF result&#039;)&lt;br /&gt;
#on level is in cmd2&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
reportStatus(myDevFrom, 0)&lt;br /&gt;
&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
end&lt;br /&gt;
recvComplete&lt;br /&gt;
&lt;br /&gt;
when 0x6A #Thermostat Zone Command&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon Thermostat result&#039;)&lt;br /&gt;
#on level is in cmd2&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
#case param[&#039;Parameter11&#039;].to_s&lt;br /&gt;
#when &#039;00&#039;&lt;br /&gt;
reportStatus(myDevFrom, hextoTempurature(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
#when &#039;60&#039; #humidity&lt;br /&gt;
#when &#039;20&#039;#setpoint&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 0x6B #Thermostat Mode Command&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon Thermostat result&#039;)&lt;br /&gt;
#on level is in cmd2 ie( HEAT(0x04), COOL(0x05), or AUTO(0x06))&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
#reportStatus(myDevFrom, 0)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 0x6C #Thermostat Zone Cool Command&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon Thermostat result&#039;)&lt;br /&gt;
#on level is in cmd2&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
reportStatus(myDevFrom, hextoTempurature(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 0x6D #Thermostat Zone Heat Command&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon Thermostat result&#039;)&lt;br /&gt;
#on level is in cmd2&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
reportStatus(myDevFrom, hextoTempurature(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when 0x15; log(&#039;Caught EXTERNAL Insteon Brighten Result&#039;)&lt;br /&gt;
when 0x16; log(&#039;Caught EXTERNAL Insteon DIM Result&#039;)&lt;br /&gt;
when 0x24; log(&#039;Caught EXTERNAL Insteon DO EE READ&#039;)&lt;br /&gt;
when 0x28; log(&#039;Caught EXTERNAL Insteon SET ADDRESS MSB&#039;)&lt;br /&gt;
when 0x29; log(&#039;Caught EXTERNAL Insteon POKE&#039;)&lt;br /&gt;
when 0x2A; log(&#039;Caught EXTERNAL Insteon POKE EXTENDED&#039;)&lt;br /&gt;
when 0x2B; log(&#039;Caught EXTERNAL Insteon PEEK&#039;)&lt;br /&gt;
when 0x2C; log(&#039;Caught EXTERNAL Insteon PEEK INTERNAL&#039;)&lt;br /&gt;
when 0x2D; log(&#039;Caught EXTERNAL Insteon POKE INTERNAL&#039;)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Unknown EXTERNAL Insteon Command.&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
### Support Routine for EZToDCE&lt;br /&gt;
def processACK(param)&lt;br /&gt;
#log(&#039;In ProcessACK: Param7:&#039; + param[&#039;Parameter7&#039;])&lt;br /&gt;
#log(&#039;CurrentCmd=&#039; + $currentcmd.to_s)&lt;br /&gt;
case param[&#039;Parameter7&#039;].hex #Received an ack to THIS command&lt;br /&gt;
when 0x1 #Assign to Group&lt;br /&gt;
log(&#039;Got Assign to Group ACK&#039;)&lt;br /&gt;
$currentcmd = 0x01&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
#processDeviceInfo(param)&lt;br /&gt;
#cmdComplete&lt;br /&gt;
when 0x2 #Delete from Group&lt;br /&gt;
when 0x10 # PING&lt;br /&gt;
log(&#039;Got PING ACK&#039;)&lt;br /&gt;
#cmdComplete&lt;br /&gt;
$currentcmd = 0x1&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x11 #ON&lt;br /&gt;
$currentcmd = 0x11&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x13 #OFF&lt;br /&gt;
$currentcmd = 0x13&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x6A #Thermostat Zone Command&lt;br /&gt;
$currentcmd = 0x6A&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x6B #Thermostat Control Command&lt;br /&gt;
$currentcmd = 0x6B&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x6C #Thermostat Cool Command&lt;br /&gt;
$currentcmd = 0x6C&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x6D #Thermostat Cool Command&lt;br /&gt;
$currentcmd = 0x6D&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x15 #Bright&lt;br /&gt;
$currentcmd = 0x15&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x16 #DIM&lt;br /&gt;
$currentcmd = 0x16&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x17 #Start Manual Change&lt;br /&gt;
when 0x18 #Stop Manual Change&lt;br /&gt;
when 0x19 #Status Request&lt;br /&gt;
# Status Request Acked - get ready for InsStdMsg&lt;br /&gt;
$currentcmd = 0x19&lt;br /&gt;
# change cmd to reflect InsStdMsg&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x24&lt;br /&gt;
log(&#039;Caught ACK for Insteon DO EE READ&#039;)&lt;br /&gt;
$currentcmd = 0x24&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x28&lt;br /&gt;
log(&#039;Caught ACK for Insteon SET ADDRESS MSB&#039;)&lt;br /&gt;
$currentcmd = 0x28&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when 0x29&lt;br /&gt;
log(&#039;Caught ACK for Insteon POKE&#039;)&lt;br /&gt;
$currentcmd = 0x29&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when 0x2A&lt;br /&gt;
log(&#039;Caught ACK for Insteon POKE EXTENDED&#039;)&lt;br /&gt;
$currentcmd = 0x2A&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when 0x2B&lt;br /&gt;
#log(&#039;Caught ACK for Insteon PEEK&#039;)&lt;br /&gt;
$currentcmd = 0x2B&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when 0x2C&lt;br /&gt;
log(&#039;Caught ACK for Insteon PEEK INTERNAL&#039;)&lt;br /&gt;
$currentcmd = 0x2C&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when 0x2D&lt;br /&gt;
log(&#039;Caught ACK for Insteon POKE INTERNAL&#039;)&lt;br /&gt;
$currentcmd = 0x2D&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Unknown Insteon Cmd1&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def checkPeekData(param)&lt;br /&gt;
&lt;br /&gt;
$remoteLinkRecord += param[&#039;Parameter11&#039;].hex.chr&lt;br /&gt;
log(&#039;CURRENT REMOTE RECORD IS:&#039;)&lt;br /&gt;
debug($remoteLinkRecord)&lt;br /&gt;
if $remoteLinkRecord.length == 8&lt;br /&gt;
log(&#039;REMOTE RECORD COMPLETE!&#039;)&lt;br /&gt;
processRemoteRecord(param)&lt;br /&gt;
$remoteLinkRecord = &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def processRemoteRecord(param)&lt;br /&gt;
#have to find MY address&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = padhex(insHb) + &amp;quot;.&amp;quot; + padhex(insMb) + &amp;quot;.&amp;quot; + padhex(insLb)&lt;br /&gt;
&lt;br /&gt;
log(&#039;Processing remote Record below:&#039;)&lt;br /&gt;
&lt;br /&gt;
@flags = &amp;quot;\nFrom Device:&amp;quot; + insID + &amp;quot;\nFlags:\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if ($remoteLinkRecord[0] &amp;amp; 0x02) == 0x02 # High water mark&lt;br /&gt;
@flags += &amp;quot;Not the last record\n&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
@flags += &amp;quot;This IS the last record\n&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if ($remoteLinkRecord[0] &amp;amp; 0x80) == 0x80 # Record is in use&lt;br /&gt;
@flags += &amp;quot;Record In Use\n&amp;quot;&lt;br /&gt;
if ($remoteLinkRecord[0] &amp;amp; 0x40) == 0x40 # Controller/Responder&lt;br /&gt;
@flags += &amp;quot;I am a Controller of &amp;quot;&lt;br /&gt;
else&lt;br /&gt;
@flags += &amp;quot;I am a Responder of &amp;quot;&lt;br /&gt;
end&lt;br /&gt;
@insteonID = padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[2]) + &#039;.&#039;&lt;br /&gt;
@insteonID += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[3]) + &#039;.&#039;&lt;br /&gt;
@insteonID += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[4])&lt;br /&gt;
&lt;br /&gt;
@group = &amp;quot;%X&amp;quot; %$remoteLinkRecord[1]&lt;br /&gt;
@flags += @insteonID + &amp;quot; Group:&amp;quot; + @group&lt;br /&gt;
@work = padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[0]) #Control byte&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[1]) # Group&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[2]) # ID HB&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[3]) # ID MB&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[4]) # ID LB&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[5]) # Data1&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[6]) # Data2&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[7]) # Data3&lt;br /&gt;
log(&#039;adding to:&#039; + insID)&lt;br /&gt;
log(&#039;Value:&#039; + @work)&lt;br /&gt;
$childdatabases[insID] &amp;lt;&amp;lt; @work #add it to the database&lt;br /&gt;
# log(&#039;Current Database:&#039; + $childdatabases.inspect)&lt;br /&gt;
#now to save the database to configuration.&lt;br /&gt;
savechilddatabases(insID)&lt;br /&gt;
# Now to check to see if the child exists as a record&lt;br /&gt;
if $childdatabases[@insteonID] == nil&lt;br /&gt;
log(&#039;InsteonID is NEW, adding Child database entry&#039;)&lt;br /&gt;
$childdatabases[@insteonID] = [&#039;****************&#039;]&lt;br /&gt;
$rerun = true&lt;br /&gt;
sendAddtoPLM(@insteonID)&lt;br /&gt;
sendPing(@insteonID)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;InsteonID:&#039; + @insteonID.to_s + &#039;seems to exist in child databases&#039;)&lt;br /&gt;
log(&#039;CDB:&#039; + $childdatabases.inspect)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
@flags += &amp;quot;Record NOT in use\n&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
log($aqua + @flags + $grey)&lt;br /&gt;
log2(@flags)&lt;br /&gt;
if ($remoteLinkRecord[0] &amp;amp; 0x02) == 0x02&lt;br /&gt;
sendRemoteGetNext(insID)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def savechilddatabases(insteonID)&lt;br /&gt;
#This takes the $childdatabase hash+array and encodes it to&lt;br /&gt;
# save it as a string.&lt;br /&gt;
@work = &#039;&#039;&lt;br /&gt;
#log($yellow + &#039;SaveChildDatabases::nitems:&#039; + $childdatabases[insteonID].nitems.to_s)&lt;br /&gt;
#log($childdatabases[insteonID].inspect + $grey)&lt;br /&gt;
$childdatabases[insteonID].each{|record|&lt;br /&gt;
@work += record&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#now to save the string...&lt;br /&gt;
setdeviceconfig(insteonID, @work)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
def sendPing(insteonID)&lt;br /&gt;
insID = insteonID.split(&#039;.&#039;)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;10&#039;, #ID Request&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
log(&#039;PING Sent!&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def getdevicetemplate(cat, subcat)&lt;br /&gt;
&lt;br /&gt;
log(&#039;Entered getdevicetemplate, Cat=&#039; + cat.to_s + &#039;, subcat = &#039; + subcat.to_s)&lt;br /&gt;
@templid = 0&lt;br /&gt;
case cat.hex&lt;br /&gt;
when 0x0 # Generalized Controllers&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x04; log(&#039;Found ControLinc [2430]&#039;)&lt;br /&gt;
when 0x05; log(&#039;Found RemoteLinc [2440]&#039;)&lt;br /&gt;
when 0x06; log(&#039;Found Icon Tabletop Controller [2830]&#039;)&lt;br /&gt;
when 0x09; log(&#039;Found SignaLinc RF Signal Enhancer [2442]&#039;)&lt;br /&gt;
when 0x0A; log(&#039;Found Balboa Instruments Poolux LCD Controller&#039;)&lt;br /&gt;
when 0x0B; log(&#039;Found Access Point [2443]&#039;)&lt;br /&gt;
when 0x0C; log(&#039;Found IES Color Touchscreen&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x01 # Dimmable Lighting Control&lt;br /&gt;
# all these devices are associated with Template 38&lt;br /&gt;
# Light Switch (dimmable)&lt;br /&gt;
@templid = 38&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00; log(&#039;Found LampLinc V2 [2456D3]&#039;)&lt;br /&gt;
when 0x01; log(&#039;Found SwitchLinc V2 Dimmer 600W [2476D]&#039;)&lt;br /&gt;
when 0x02; log(&#039;Found In-LineLinc Dimmer [2475D]&#039;)&lt;br /&gt;
when 0x03; log(&#039;Found Icon Switch Dimmer [2876D]&#039;)&lt;br /&gt;
when 0x04; log(&#039;Found SwitchLinc V2 Dimmer 1000W [2476DH]&#039;)&lt;br /&gt;
when 0x06; log(&#039;Found LampLinc 2-pin [2456D2]&#039;)&lt;br /&gt;
when 0x07; log(&#039;Found Icon LampLinc V2 2-pin [2456D2]&#039;)&lt;br /&gt;
when 0x09; log(&#039;Found KeypadLinc Dimmer [2486D]&#039;)&lt;br /&gt;
when 0x0A; log(&#039;Found Icon In-Wall Controller [2886D]&#039;)&lt;br /&gt;
when 0x0D; log(&#039;Found SocketLinc [2454D]&#039;)&lt;br /&gt;
when 0x13; log(&#039;Found Icon SwitchLinc Dimmer for Lixar/Bell Canada [2676D-B]&#039;)&lt;br /&gt;
when 0x17; log(&#039;Found ToggleLinc Dimmer [2466D]&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x02 # Switched Lighting Control&lt;br /&gt;
# all these devices are associated with Template 37&lt;br /&gt;
# Light Switch (ON/OFF)&lt;br /&gt;
@templid = 37&lt;br /&gt;
case subcat.hex&lt;br /&gt;
&lt;br /&gt;
when 0x09; log(&#039;Found ApplianceLinc [2456S3]&#039;)&lt;br /&gt;
when 0x0A; log(&#039;Found SwitchLinc Relay [2476S]&#039;)&lt;br /&gt;
when 0x0B; log(&#039;Found Icon On Off Switch [2876S]&#039;)&lt;br /&gt;
when 0x0C; log(&#039;Found Icon Appliance Adapter [2856S3]&#039;)&lt;br /&gt;
when 0x0D; log(&#039;Found ToggleLinc Relay [2466S]&#039;)&lt;br /&gt;
when 0x0E; log(&#039;Found Switchlinc Relay Countdown Timer [2476ST]&#039;)&lt;br /&gt;
when 0x10; log(&#039;Found In-LineLinc Relay [2475D]&#039;)&lt;br /&gt;
when 0x13; log(&#039;Found Icon SwitchLinc Relay for Lixar/Bell Canada [2676R-B]&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x03 # Network Bridges&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x01; log(&#039;Found PowerLinc Serial [2414S]&#039;)&lt;br /&gt;
when 0x02; log(&#039;Found PowerLinc USB [2414U]&#039;)&lt;br /&gt;
when 0x03; log(&#039;Found Icon PowerLinc Serial [2814S]&#039;)&lt;br /&gt;
when 0x04; log(&#039;Found Icon PowerLinc USB [2814U]&#039;)&lt;br /&gt;
when 0x05; log(&#039;Found Smartlabs Power Line Modem Serial [2412S]&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x04 # Irrigation Control&lt;br /&gt;
# all these devices are associated with Template 1780&lt;br /&gt;
# Standard Irrigation Sprinkler&lt;br /&gt;
@templid = 1780&lt;br /&gt;
case subcat.hex&lt;br /&gt;
&lt;br /&gt;
when 0x00; log(&#039;Found Simplehomenet EZRain1 Sprinkler Controller&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x05 # Climate Control&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00; log(&#039;Found Broan SMSC080 Exhaust Fan&#039;)&lt;br /&gt;
when 0x01; log(&#039;Found Simplehomenet EZTherm&#039;)&lt;br /&gt;
when 0x02; log(&#039;Found Broan SMSC110 Exhaust Fan&#039;)&lt;br /&gt;
when 0x03&lt;br /&gt;
log(&#039;Found Venstar RF Thermostat Module&#039;)&lt;br /&gt;
@templid = 2198 #Set Template&lt;br /&gt;
when 0x04; log(&#039;Found Simplehomenet EZStat Thermostat&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x06 # Pool and Spa Control&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00; log(&#039;Found Simplehomenet EZPool&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x07 # Sensors and Actuators&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x08 # Home Entertainment&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x09 # Energy Management&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0A # Built-In Appliance Control&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0B # Plumbing&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0C # Communication&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0D # Computer Control&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0E # Window Coverings&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0F # Access Control&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x10 # Security, Health, and Safety&lt;br /&gt;
when 0x11 # Surveillance&lt;br /&gt;
when 0x12 # Automotive&lt;br /&gt;
when 0x13 # Pet care&lt;br /&gt;
when 0x14 # Toys&lt;br /&gt;
when 0x15 # Timekeeping&lt;br /&gt;
when 0x16 # Holiday&lt;br /&gt;
end&lt;br /&gt;
return @templid&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def processDeviceInfo(param)&lt;br /&gt;
### temporary&lt;br /&gt;
### 12-24-07 Adding Device Template compatibility..&lt;br /&gt;
#have to find MY address&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
&lt;br /&gt;
insID = padhex(insHb) + &amp;quot;.&amp;quot; + padhex(insMb) + &amp;quot;.&amp;quot; + padhex(insLb)&lt;br /&gt;
#set the devicecat and device subcat in the childdatabases&lt;br /&gt;
# 0-1 Device Category&lt;br /&gt;
# 2-3 Device SubCategory&lt;br /&gt;
# 4-5 Device Firmware&lt;br /&gt;
log(&#039;proccessDeviceInfo:Insteon ID&#039; + insID)&lt;br /&gt;
$childdatabases[insID][0][0..1] = param[&#039;Parameter6&#039;]&lt;br /&gt;
$childdatabases[insID][0][2..3] = param[&#039;Parameter7&#039;]&lt;br /&gt;
$childdatabases[insID][0][4..5] = param[&#039;Parameter8&#039;]&lt;br /&gt;
savechilddatabases(insID)&lt;br /&gt;
log(&#039;InsteonID: &#039; + insID)&lt;br /&gt;
#log(&#039;Child Config AFTER update:&#039; + $childdatabases[insID][0].to_s)&lt;br /&gt;
log($yellow)&lt;br /&gt;
@template = getdevicetemplate(param[&#039;Parameter6&#039;], param[&#039;Parameter7&#039;])&lt;br /&gt;
$devicetemplate[insID] = @template&lt;br /&gt;
log(&#039;Template ID:&#039; + @template.to_s)&lt;br /&gt;
### eventually, open a XML configuration script?&lt;br /&gt;
### or read saved data from mysql?&lt;br /&gt;
### most likely save this information to sql with device.&lt;br /&gt;
### eventually, IPKDB will be available to ping.&lt;br /&gt;
log(&#039;for Insteon ID:&#039; + insID)&lt;br /&gt;
log($grey)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def recvComplete&lt;br /&gt;
# Clears the wait flag, but does not remove a command from the queue&lt;br /&gt;
$wAIT = false&lt;br /&gt;
log($green + &amp;quot;Receive Completed. Checking command queue&amp;quot; + $grey)&lt;br /&gt;
if $cmdqueue.nitems &amp;gt; 0 then&lt;br /&gt;
log(&amp;quot;Queue:&amp;quot; + $aqua + $cmdqueue.nitems.to_s + $grey + &amp;quot; : executing next command&amp;quot;)&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log($yellow + &#039;Queue Empty.&#039; + $grey)&lt;br /&gt;
if $rerun == true&lt;br /&gt;
log(&#039;RERUN=TRUE, RESTARTING&#039;)&lt;br /&gt;
$rerun = false&lt;br /&gt;
mainRestart()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;RERUN Not needed. Checking if reported..&#039;)&lt;br /&gt;
#report Child devices here.&lt;br /&gt;
if $reported == false&lt;br /&gt;
log(&#039;Reporting Child Devices&#039;)&lt;br /&gt;
@work = &amp;quot;&amp;quot;&lt;br /&gt;
$childdatabases.each_key{&lt;br /&gt;
|insteonID|&lt;br /&gt;
log(&#039;Child:&#039; + insteonID)&lt;br /&gt;
log(&#039;Config:&#039; + $childdatabases[insteonID].inspect)&lt;br /&gt;
@template = $devicetemplate[insteonID]&lt;br /&gt;
@work += insteonID + &amp;quot;\t\t\t&amp;quot; + @template.to_s + &amp;quot;\t\n&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
log(@work)&lt;br /&gt;
cmd = Command.new(device_.devid_, -1001, 1, 2, 54)&lt;br /&gt;
cmd.params_[13] = @work&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
&lt;br /&gt;
$reported = true&lt;br /&gt;
else&lt;br /&gt;
log(&#039;report not needed&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
def removecurrentcommand&lt;br /&gt;
#get the current child&lt;br /&gt;
log(&#039;in RemoveCurrentCommand&#039;)&lt;br /&gt;
log(&#039;Current Command:&#039; + $cmdqueue[0].inspect)&lt;br /&gt;
#id is in param123&lt;br /&gt;
@id = $cmdqueue[0][&#039;Parameter1&#039;]&lt;br /&gt;
@id += &#039;.&#039; + $cmdqueue[0][&#039;Parameter2&#039;]&lt;br /&gt;
@id += &#039;.&#039; + $cmdqueue[0][&#039;Parameter3&#039;]&lt;br /&gt;
log(&#039;ID=&#039; + @id)&lt;br /&gt;
#now to remove from child and PLM databases&lt;br /&gt;
removefromchild(@id)&lt;br /&gt;
removefromplm(@id)&lt;br /&gt;
cmdComplete&lt;br /&gt;
end&lt;br /&gt;
def cmdComplete&lt;br /&gt;
# Clears the wait flag, and removes the command from the queue.&lt;br /&gt;
$wAIT = false&lt;br /&gt;
$resetNext = 0&lt;br /&gt;
$cmdqueue.delete_at(0)&lt;br /&gt;
# now that THAT command is completed, check to see if there is&lt;br /&gt;
# another command ready to transmit.&lt;br /&gt;
log($green + &amp;quot;Command Completed.&amp;quot; + $grey)&lt;br /&gt;
end&lt;br /&gt;
def checkWait(param)&lt;br /&gt;
#Checks for response from current command.&lt;br /&gt;
if $cmdqueue[0] != nil&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
#log(&#039;CW:waiting for command to complete&#039;)&lt;br /&gt;
else&lt;br /&gt;
#log(&#039;CW:reports clear&#039;)&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
log(&#039;------:)----checkWait: command queue is emtpy&#039;)&lt;br /&gt;
if $wAIT == true #this should never happen&lt;br /&gt;
log(&#039;------:(XXX-CheckWait: TRUE&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def plmparse(value)&lt;br /&gt;
#THIS ROUTINE REPLACES parsestring()&lt;br /&gt;
#this routine will PARSE the incoming stream into valid messages&lt;br /&gt;
# value is the complete command&lt;br /&gt;
param = {}&lt;br /&gt;
#here is a special case, the PLM seems to lock up.&lt;br /&gt;
if value == 0x15.chr&lt;br /&gt;
log(&#039;The PLM stopped responding&#039;)&lt;br /&gt;
log(&#039;Please unplug it, and plug it back in&#039;)&lt;br /&gt;
log(&#039;and do a quick reload router.&#039;)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
while value.length &amp;gt; 2&lt;br /&gt;
case value[1]&lt;br /&gt;
when 0x62 # Special case, need to look at flags&lt;br /&gt;
if (value[5] &amp;amp; 0x10) == 0x10 # check for extended flag&lt;br /&gt;
cmdlen = 23&lt;br /&gt;
else&lt;br /&gt;
cmdlen = 9&lt;br /&gt;
end&lt;br /&gt;
param[&#039;Response&#039;] = &#039;SndIns&#039;&lt;br /&gt;
when 0x50; cmdlen = 11; param[&#039;Response&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x51; cmdlen = 25; param[&#039;Response&#039;] = &#039;InsExtMsg&#039;&lt;br /&gt;
when 0x68; cmdlen = 4 #Set Insteon ACK Message Byte&lt;br /&gt;
when 0x71; cmdlen = 5 #Set Insteon ACK Message Two Bytes&lt;br /&gt;
when 0x70; cmdlen = 4 #Set Insteon NACK Message Byte&lt;br /&gt;
when 0x63; cmdlen = 5; param[&#039;Response&#039;] = &#039;SndX10&#039;&lt;br /&gt;
when 0x52; cmdlen = 4; param[&#039;Response&#039;] = &#039;X10Msg&#039;&lt;br /&gt;
when 0x61; cmdlen = 6; param[&#039;Response&#039;] = &#039;SndGrp&#039;&lt;br /&gt;
when 0x56; cmdlen = 7; param[&#039;Response&#039;] = &#039;GrpEvntRpt&#039;&lt;br /&gt;
when 0x58; cmdlen = 3 #All-Link Cleanup Status Report&lt;br /&gt;
when 0x64; cmdlen = 5; param[&#039;Response&#039;] = &#039;StLnk&#039;&lt;br /&gt;
when 0x65; cmdlen = 3; param[&#039;Response&#039;] = &#039;CancelLnk&#039;&lt;br /&gt;
when 0x53; cmdlen = 10; param[&#039;Response&#039;] = &#039;InsLnkSts&#039;&lt;br /&gt;
when 0x69; cmdlen = 3; param[&#039;Response&#039;] = &#039;GetLnk&#039;&lt;br /&gt;
when 0x6A; cmdlen = 3; param[&#039;Response&#039;] = &#039;GetNext&#039;&lt;br /&gt;
when 0x6C; cmdlen = 3 #Get All-Link Record for Sender&lt;br /&gt;
when 0x57; cmdlen = 10; param[&#039;Response&#039;] = &#039;LnkData&#039;&lt;br /&gt;
when 0x6F; cmdlen = 12; param[&#039;Response&#039;] = &#039;MngLnk&#039;&lt;br /&gt;
when 0x67; cmdlen = 3; param[&#039;Response&#039;] = &#039;RstPLM&#039;&lt;br /&gt;
when 0x6B; cmdlen = 4; param[&#039;Response&#039;] = &#039;SetCfg&#039;&lt;br /&gt;
when 0x60; cmdlen = 9; param[&#039;Response&#039;] = &#039;GetVersion&#039;&lt;br /&gt;
when 0x66; cmdlen = 6 #Set Host Device Category&lt;br /&gt;
when 0x72; cmdlen = 3 # RF Sleep&lt;br /&gt;
when 0x54; cmdlen = 3; param[&#039;Response&#039;] = &#039;BtnRpt&#039;&lt;br /&gt;
when 0x6D; cmdlen = 3; param[&#039;Response&#039;] = &#039;LEDON&#039;&lt;br /&gt;
when 0x6E; cmdlen = 3; param[&#039;Response&#039;] = &#039;LEDOFF&#039;&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
log(&#039;ERROR IN PLMPARSE- Unknown Command&#039;)&lt;br /&gt;
debug(value)&lt;br /&gt;
&lt;br /&gt;
return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
#Now we know the length the command should be, see if we have it.&lt;br /&gt;
#log(&#039;waiting for &#039; + cmdlen.to_s + &#039; characters...&#039;)&lt;br /&gt;
#log(&#039;length of current input is &#039; + value.length.to_s)&lt;br /&gt;
if value.length &amp;gt;= cmdlen&lt;br /&gt;
#log(&#039;GOT whole response&#039;)&lt;br /&gt;
#Yes, we have the whole command, Pack it in param&lt;br /&gt;
for byt in 1..cmdlen&lt;br /&gt;
param[&#039;Parameter&#039; + byt.to_s] = padhex(&amp;quot;%X&amp;quot; %value[byt - 1])&lt;br /&gt;
end&lt;br /&gt;
#now remove it from the string..&lt;br /&gt;
value = value.slice(cmdlen, value.length - cmdlen)&lt;br /&gt;
#Send it off for parsing&lt;br /&gt;
#log(&#039;Sending to EZToDCE:&#039; + param.inspect.to_s)&lt;br /&gt;
EZToDCE(param)&lt;br /&gt;
else&lt;br /&gt;
#log(&#039;Still waiting...&#039;)&lt;br /&gt;
#no, we have NOT received the whole command.&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
return value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def rawX10(value)&lt;br /&gt;
&lt;br /&gt;
x10MSN = $X10HouseCodes.index[value[0..0]]&lt;br /&gt;
x10LSN = $X10UnitCodes.index[value[1..1]]&lt;br /&gt;
return x10MSN + x10LSN&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def X10Flag(value)&lt;br /&gt;
return + $X10CommandCodes.index[Value] + &#039;0&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def SndIns&lt;br /&gt;
# create a new PLM command for SndIns&lt;br /&gt;
if $wAIT == false&lt;br /&gt;
#log(&#039;SndIns:currentcmd=&#039; + $currentcmd.to_s)&lt;br /&gt;
&lt;br /&gt;
if $cmdqueue.nitems &amp;gt; 0&lt;br /&gt;
log(&amp;quot;SndIns:Queue:&amp;quot; + $aqua + $cmdqueue.nitems.to_s + $grey)&lt;br /&gt;
#log(&#039;SndIns:&#039; + $cmdqueue.inspect)&lt;br /&gt;
param = $cmdqueue[0]&lt;br /&gt;
### have to figure out the command byte 2 here&lt;br /&gt;
work = &#039;02&#039;.hex.chr + plmcommand(param)&lt;br /&gt;
### PLM command compilation&lt;br /&gt;
for loop in 2..param.keys.nitems&lt;br /&gt;
@dummy = param[&#039;Parameter&#039; + (loop - 1).to_s].to_s&lt;br /&gt;
work+= @dummy.hex.chr&lt;br /&gt;
end&lt;br /&gt;
conn_.Reconnect()&lt;br /&gt;
debugout(work)&lt;br /&gt;
conn_.Send(work)&lt;br /&gt;
#sleep 0.1&lt;br /&gt;
$wAIT = TRUE&lt;br /&gt;
else&lt;br /&gt;
log($yellow + &#039;Queue Empty.&#039; + $grey)&lt;br /&gt;
if $rerun == true&lt;br /&gt;
log(&#039;RERUN=TRUE, RESTARTING&#039;)&lt;br /&gt;
$rerun = false&lt;br /&gt;
mainRestart()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;RERUN Not needed&#039;)&lt;br /&gt;
if $reported == false&lt;br /&gt;
log(&#039;Reporting Child Devices&#039;)&lt;br /&gt;
@work = &amp;quot;&amp;quot;&lt;br /&gt;
$childdatabases.each_key{&lt;br /&gt;
|insteonID|&lt;br /&gt;
log(&#039;Child:&#039; + insteonID)&lt;br /&gt;
log(&#039;Config:&#039; + $childdatabases[insteonID].inspect)&lt;br /&gt;
@template = $devicetemplate[insteonID]&lt;br /&gt;
@work += insteonID + &amp;quot;\t\t\t&amp;quot; + @template.to_s + &amp;quot;\t\n&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
log(@work)&lt;br /&gt;
cmd = Command.new(device_.devid_, -1001, 1, 2, 54)&lt;br /&gt;
cmd.params_[13] = @work&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
&lt;br /&gt;
$reported = true&lt;br /&gt;
else&lt;br /&gt;
log(&#039;report not needed&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
log(&#039;X-----------SndIns: Waiting for response to:&#039; + $cmdqueue[0][&#039;Command&#039;].to_s)&lt;br /&gt;
log(&#039;X-----------SndIns: Current Queue Length:&#039; + $cmdqueue.nitems.to_s)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
def plmcommand(param)&lt;br /&gt;
### this returns the proper Byte2 for the command.&lt;br /&gt;
case param[&#039;Command&#039;]&lt;br /&gt;
when &#039;GetVersion&#039;; return 0x60.chr&lt;br /&gt;
when &#039;SndIns&#039;; return 0x62.chr&lt;br /&gt;
when &#039;SndGrp&#039;; return 0x61.chr&lt;br /&gt;
when &#039;SndX10&#039;; return 0x63.chr&lt;br /&gt;
when &#039;GetLnk&#039;; return 0x69.chr&lt;br /&gt;
when &#039;GetNext&#039;; return 0x6A.chr&lt;br /&gt;
when &#039;BtnRpt&#039;; return 0x54.chr&lt;br /&gt;
when &#039;GetCfg&#039;; return 0x73.chr&lt;br /&gt;
when &#039;StLnk&#039;; return 0x64.chr&lt;br /&gt;
when &#039;CancelLnk&#039;; return 0x65.chr&lt;br /&gt;
when &#039;MngLnk&#039;; return 0x6F.chr&lt;br /&gt;
when &#039;RstPLM&#039;; return 0x67.chr&lt;br /&gt;
when &#039;SetCfg&#039;; return 0x6B.chr&lt;br /&gt;
when &#039;LEDON&#039;; return 0x6D.chr&lt;br /&gt;
when &#039;LEDOFF&#039;; return 0x6E.chr&lt;br /&gt;
## hack&lt;br /&gt;
when &#039;InsStdMsg&#039;&lt;br /&gt;
log(&#039;ERROR:PLMCommand encountered a COMMAND of INSSTDMSG&#039;)&lt;br /&gt;
break&lt;br /&gt;
return 0x62.chr&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def debug(text)&lt;br /&gt;
work = &#039;DEBUG:&#039;&lt;br /&gt;
&lt;br /&gt;
for c in 1..text.length&lt;br /&gt;
work += padhex(&amp;quot;%X&amp;quot; %text[c-1]) + &#039; &#039;&lt;br /&gt;
end&lt;br /&gt;
log($yellow + work + &amp;quot;Length:&amp;quot; + text.length.to_s + $grey)&lt;br /&gt;
end&lt;br /&gt;
def debugout(text)&lt;br /&gt;
work = &#039;out:&#039;&lt;br /&gt;
&lt;br /&gt;
for c in 1..text.length&lt;br /&gt;
work += padhex(&amp;quot;%X&amp;quot; %text[c-1]) + &#039; &#039;&lt;br /&gt;
end&lt;br /&gt;
log($green + work + &amp;quot;Length:&amp;quot; + text.length.to_s + $grey)&lt;br /&gt;
end&lt;br /&gt;
def debugin(text)&lt;br /&gt;
work = &#039;IN:&#039;&lt;br /&gt;
&lt;br /&gt;
for c in 1..text.length&lt;br /&gt;
work += padhex(&amp;quot;%X&amp;quot; %text[c-1]) + &#039; &#039;&lt;br /&gt;
end&lt;br /&gt;
log($red + work + &amp;quot;Length:&amp;quot; + text.length.to_s + $grey)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def padhex(hex)&lt;br /&gt;
if hex.length==1&lt;br /&gt;
hex = &amp;quot;0&amp;quot; + hex&lt;br /&gt;
end&lt;br /&gt;
return hex&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def percenttohex(level)&lt;br /&gt;
# convert from percent to byte&lt;br /&gt;
return &amp;quot;%X&amp;quot; %((level.to_i * 2.55)).to_i&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def hextopercent(level)&lt;br /&gt;
return ((level.hex.to_i / 2.55)).to_i&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def hextoTempurature(degree) #Thermostat change hex to tempurature&lt;br /&gt;
return ((degree.hex.to_i / 2)).to_i&lt;br /&gt;
end&lt;br /&gt;
def Tempuraturetohex (degree) #Thermostat Cahnge tempurature to hex&lt;br /&gt;
return ((degree.to_1 * 2)).hex&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def log(line)&lt;br /&gt;
$log = File.open(&amp;quot;/var/log/pluto/&amp;quot; + device_.devid_.to_s + &amp;quot;_Generic_Serial_Device.log&amp;quot;, &amp;quot;a&amp;quot;)&lt;br /&gt;
$log.puts &amp;quot;(***):&amp;quot; + line.to_s&lt;br /&gt;
$log.close&lt;br /&gt;
end&lt;br /&gt;
def log2(line)&lt;br /&gt;
#this will send a message out the the orbiters..&lt;br /&gt;
#/usr/pluto/bin/MessageSend localhost 0 20 1 809 9 &amp;quot;Text to Display&amp;quot; 70 &amp;quot;alert&amp;quot; 182 &amp;quot;30&amp;quot; 251 &amp;quot;??&amp;quot;&lt;br /&gt;
cmd = Command.new(device_.devid_, -1000, 1, 1, 809)&lt;br /&gt;
cmd.params_[9] = line #text to display&lt;br /&gt;
cmd.params_[70] = &#039;PLMMessage&#039; #Token&lt;br /&gt;
cmd.params_[182] = &#039;10&#039; #Timeout in seconds&lt;br /&gt;
cmd.params_[251] = &#039;??&#039;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
def checkChildRecordsinPLM()&lt;br /&gt;
log(&#039;Entered CheckChildRecordsinPLM&#039;)&lt;br /&gt;
# log(&#039;In CheckChildRecordsinPLM&#039;)&lt;br /&gt;
# time to verify all children are in the PLM&lt;br /&gt;
#&lt;br /&gt;
# log(&#039;Total PLM Records:&#039; + $plmdatabase.nitems.to_s)&lt;br /&gt;
$plmdatabase.each{|record|&lt;br /&gt;
log(&#039;Record: = &#039;+ getIIDfromRecord(record) + &#039; Group:&#039; + getGroupfromRecord(record))&lt;br /&gt;
log(&#039;checking to see if it needs to be added as a child...&#039;)&lt;br /&gt;
if existsinchild(getIIDfromRecord(record)) == false&lt;br /&gt;
&lt;br /&gt;
log(getIIDfromRecord(record) + &#039; needs to be added to the child database&#039;)&lt;br /&gt;
addtochild(getIIDfromRecord(record))&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$childdatabases.each_key {|child|&lt;br /&gt;
if existsinplm(child) == false&lt;br /&gt;
log(child + &#039; needs to be added to PLM&#039;)&lt;br /&gt;
sendAddtoPLM(child)&lt;br /&gt;
else&lt;br /&gt;
log(child + &#039; exists in PLM&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
#now to scan the childs database&lt;br /&gt;
for record in 1..($childdatabases[child].nitems - 1)&lt;br /&gt;
@test = $childdatabases[child][record]&lt;br /&gt;
if existsinplm(getIIDfromRecord(@test)) == false&lt;br /&gt;
log(getIIDfromRecord(@test) + &#039; needs to be added to PLM&#039;)&lt;br /&gt;
sendAddtoPLM(getIIDfromRecord(@test))&lt;br /&gt;
else&lt;br /&gt;
log(getIIDfromRecord(@test) + &#039; exists in PLM&#039;)&lt;br /&gt;
end&lt;br /&gt;
#Also check to see if it needs to be added in the childdatabases&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
def existsinplm(insteonid)&lt;br /&gt;
result = false&lt;br /&gt;
$plmdatabase.each{|record|&lt;br /&gt;
#log(insteonid + &#039;==&#039; + getIIDfromRecord(record))&lt;br /&gt;
if insteonid == getIIDfromRecord(record)&lt;br /&gt;
result = true&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
return result&lt;br /&gt;
end&lt;br /&gt;
def existsinchild(insteonid)&lt;br /&gt;
log(&#039;ExistsinChild:InsteonID:&#039; + insteonid)&lt;br /&gt;
result = false&lt;br /&gt;
$childdatabases.each_key{|record|&lt;br /&gt;
if insteonid == record&lt;br /&gt;
result = true&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
log(&#039;ExistsinChild result:FALSE&#039;) if result == false&lt;br /&gt;
log(&#039;ExistsinChild result:TRUE&#039;) if result == true&lt;br /&gt;
return result&lt;br /&gt;
end&lt;br /&gt;
def addtochild(insteonID)&lt;br /&gt;
log(&#039;addtochild Routne called&#039;)&lt;br /&gt;
log(&#039;Adding &#039; + insteonID + &#039; to the child database...&#039;)&lt;br /&gt;
if insteonID.length == 2 then&lt;br /&gt;
log(&#039;Child is X10&#039;)&lt;br /&gt;
$state[insteonID] = 0&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Child is Insteon&#039;)&lt;br /&gt;
$childdatabases[insteonID] = [&#039;****************&#039;]&lt;br /&gt;
sendPing(insteonID)&lt;br /&gt;
$rerun = true&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def removefromchild(insteonID)&lt;br /&gt;
log(&#039;Removing &#039; + insteonID + &#039; from child database&#039;)&lt;br /&gt;
$childdatabases.delete(insteonID)&lt;br /&gt;
$state.delete(insteonID)&lt;br /&gt;
end&lt;br /&gt;
def removefromplm(insteonID)&lt;br /&gt;
log(&#039;Removing from plm&#039;)&lt;br /&gt;
$plmdatabase.each{|record|&lt;br /&gt;
#log(insteonid + &#039;==&#039; + getIIDfromRecord(record))&lt;br /&gt;
if insteonID == getIIDfromRecord(record)&lt;br /&gt;
debug(record)&lt;br /&gt;
log(&#039;Found Record, Deleting&#039;)&lt;br /&gt;
$plmdatabase.delete(record)&lt;br /&gt;
&lt;br /&gt;
#now, we have to remove it from the device.&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt;&#039;MngLnk&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; &#039;80&#039;, #DELETE&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; record[0..1], #control byte&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; record[2..3], #group&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; record[4..5],#HB&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; record[6..7],#MB&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; record[8..9],#LB&lt;br /&gt;
&#039;Parameter7&#039; =&amp;gt; record[10..11],#data1&lt;br /&gt;
&#039;Parameter8&#039; =&amp;gt; record[12..13],#data2&lt;br /&gt;
&#039;Parameter9&#039; =&amp;gt; record[14..15] #data3&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
log(param.inspect)&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
end&lt;br /&gt;
def sendAddtoPLM(insteonID)&lt;br /&gt;
log(&#039;Adding &#039; + insteonID + &#039; to the PLM database...&#039;)&lt;br /&gt;
#This adds a record into the PLM&lt;br /&gt;
@insID = insteonID.split(&#039;.&#039;)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;MngLnk&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; &#039;40&#039;, #control code -- add new record as Controller&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;C2&#039;, #All Link Record Flags AKA Record Control Byte&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; &#039;01&#039;, #All Link Group&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; @insID[0], #HB&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; @insID[1], #MB&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; @insID[2], #LB&lt;br /&gt;
&#039;Parameter7&#039; =&amp;gt; &#039;01&#039;, #Link Data 1 ON-Level&lt;br /&gt;
&#039;Parameter8&#039; =&amp;gt; &#039;01&#039;, #Link Data 2 Ramp Rate&lt;br /&gt;
&#039;Parameter9&#039; =&amp;gt; &#039;FF&#039;} #Link Data 3 not used&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(1, param)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(0, param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def getIIDfromRecord(recordstring)&lt;br /&gt;
#this extracts the insteonID string from the record.&lt;br /&gt;
#log(&#039;getIIDfromRecord::recordstring:&#039; + recordstring)&lt;br /&gt;
@idhb = recordstring[4..5]&lt;br /&gt;
@idmb = recordstring[6..7]&lt;br /&gt;
@idlb = recordstring[8..9]&lt;br /&gt;
@result = @idhb + &#039;.&#039; + @idmb + &#039;.&#039; +@idlb&lt;br /&gt;
#log(&#039;GetIIDfromRecord: Found ID:&#039; + @result)&lt;br /&gt;
return @result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def processBroadcastMessage(param)&lt;br /&gt;
#search the child databases for responders,&lt;br /&gt;
#and fire COMMANDS for each responder. 06Feb08&lt;br /&gt;
#and fire events for each responder.XXXXXXXXXXXXX&lt;br /&gt;
#Message flag is in parameter9 Group command 0xCx (All-Link Broadcast Message Pg 42.)&lt;br /&gt;
#Group is in parameter8&lt;br /&gt;
#From InsteonID is parameters 3, 4, 5&lt;br /&gt;
group = param[&#039;Parameter8&#039;]&lt;br /&gt;
from = padhex(param[&#039;Parameter3&#039;]) + &#039;.&#039;&lt;br /&gt;
from += padhex(param[&#039;Parameter4&#039;]) + &#039;.&#039;&lt;br /&gt;
from += padhex(param[&#039;Parameter5&#039;])&lt;br /&gt;
log(&#039;Looking for &#039; + from + &#039; Group:&#039; + group)&lt;br /&gt;
log(&#039;Showing Parameter10:&#039; + param[&#039;Parameter10&#039;].to_s)&lt;br /&gt;
#Ok, now have to search child databases for from AND group AND responder&lt;br /&gt;
$childdatabases.each_key{|child|&lt;br /&gt;
#log(&#039;Searching:&#039; + child)&lt;br /&gt;
for rec in 1..($childdatabases[child].nitems - 1)&lt;br /&gt;
record = $childdatabases[child][rec]&lt;br /&gt;
if getIIDfromRecord(record) == from # First, look for Insteon ID&lt;br /&gt;
#log(&#039;Found ID&#039;)&lt;br /&gt;
if getGroupfromRecord(record) == group #next, Group&lt;br /&gt;
#log(&#039;Found Group&#039;)&lt;br /&gt;
if isResponderRecord(record) # is a responder?&lt;br /&gt;
#log(&#039;Found Responder&#039;)&lt;br /&gt;
#figure out the child devicenum&lt;br /&gt;
from = $children[child]&lt;br /&gt;
#figure out the command&lt;br /&gt;
case param[&#039;Parameter10&#039;].hex&lt;br /&gt;
when 0x11 #on&lt;br /&gt;
reportStatus(from, 100)&lt;br /&gt;
when 0x13 #off&lt;br /&gt;
reportStatus(from, 0)&lt;br /&gt;
when 0x6B # Thermostat Command On/OFF/AUTO&lt;br /&gt;
case param[&#039;Parameter11&#039;].to_s&lt;br /&gt;
when &#039;09&#039; #status to OFF&lt;br /&gt;
#need to set current temp&lt;br /&gt;
reportStatus(from, 0)&lt;br /&gt;
else&lt;br /&gt;
#check thermostat for state and update and set current temp&lt;br /&gt;
#reportStatus(from, 100)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 0x6C # Thermostat Command Cool Point&lt;br /&gt;
tempurature =param[&#039;Parameter11&#039;] /2 #temp in hex need to devide by 2 = current cool point&lt;br /&gt;
#reportStatus(from,tempurature)&lt;br /&gt;
when 0x6D# Thermostat Command Heat Point&lt;br /&gt;
tempurature =param[&#039;Parameter11&#039;] /2 #temp in hex need to devide by 2 = current heat point&lt;br /&gt;
#reportStatus(from,tempurature)&lt;br /&gt;
&lt;br /&gt;
when 0x17 #dim/brighten -ignore&lt;br /&gt;
level = 0&lt;br /&gt;
when 0x18 # STOP dim/brighten - sendgetstatus&lt;br /&gt;
level = 0&lt;br /&gt;
sendGetChildStatus(child)&lt;br /&gt;
else&lt;br /&gt;
level = 0&lt;br /&gt;
log(&#039;Command is other than ON/OFF/Dim/Brighten&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def reportStatus(from, level)&lt;br /&gt;
log(&#039;From:&#039; + from.to_s) #shows child id&lt;br /&gt;
log(&#039;current State:&#039; + $state[from].to_s)&lt;br /&gt;
log(&#039;Wanted State:&#039; + level.to_s)&lt;br /&gt;
case $state[from]&lt;br /&gt;
when 0&lt;br /&gt;
if level &amp;gt;=1&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 192) #on&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 184)&lt;br /&gt;
cmd.params_[76] = level.to_s&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
when 100&lt;br /&gt;
if level &amp;gt;= 1&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 184)&lt;br /&gt;
cmd.params_[76] = level.to_s&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
else&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 193) # off&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
if level == 100&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 193) #off&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 192) # on&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 184) #SetLevel&lt;br /&gt;
cmd.params_[76] = level.to_s&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
log(&#039;ReportStatus: device:&#039; + from.to_s + &#039; Status:&#039; + level.to_s)&lt;br /&gt;
$state[from] = level&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def isResponderRecord(recordstring)&lt;br /&gt;
work = recordstring[0..1].hex&lt;br /&gt;
if (work &amp;amp; 0x40) == 0x40 #check bit 6&lt;br /&gt;
result = false #signifies Controller record&lt;br /&gt;
else&lt;br /&gt;
result = true #signifies Responder record&lt;br /&gt;
end&lt;br /&gt;
return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def getGroupfromRecord(recordstring)&lt;br /&gt;
#this extracts the GROUP from the record.&lt;br /&gt;
if recordstring == nil&lt;br /&gt;
return &#039;00&#039;&lt;br /&gt;
else&lt;br /&gt;
return recordstring[2..3]&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
def getdeltafromconfig(insteonID)&lt;br /&gt;
#This returns the delta from the child.&lt;br /&gt;
@work = $childdatabases[insteonID][0] # the settings stored in [0]&lt;br /&gt;
if @work == nil&lt;br /&gt;
return &#039;00&#039;&lt;br /&gt;
else&lt;br /&gt;
return @work[6..7]&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
def sendGetChildStatus(insteonID)&lt;br /&gt;
#log(&#039;sendGetChildStatus Called&#039;)&lt;br /&gt;
if insteonID.length != 2 #X10 device&lt;br /&gt;
@insID = insteonID.split(&#039;.&#039;)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;, #flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;19&#039;, #Status Request&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;00&#039;} #not used.&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
#Returned response will have cmd1 = DBDelta&lt;br /&gt;
#Returned response will have cmd2 = ON-Level&lt;br /&gt;
else&lt;br /&gt;
log(&#039;X10 does not report status&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
def islast(record)&lt;br /&gt;
#high water mark&lt;br /&gt;
return false if (record[0..1].hex &amp;amp; 0x02) == 0x02&lt;br /&gt;
return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def isinuse(record)&lt;br /&gt;
return true if (record[0..1].hex &amp;amp; 0x80) == 0x80&lt;br /&gt;
return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def iscontroller(record)&lt;br /&gt;
return true if (record[0..1].hex &amp;amp; 0x40) == 0x40&lt;br /&gt;
return false&lt;br /&gt;
end&lt;br /&gt;
def group(record)&lt;br /&gt;
return record[2..3]&lt;br /&gt;
end&lt;br /&gt;
def remoteid(record)&lt;br /&gt;
&lt;br /&gt;
@insteonID = record[4..5] + &#039;.&#039;&lt;br /&gt;
@insteonID += record[6..7] + &#039;.&#039;&lt;br /&gt;
@insteonID += record[8..9]&lt;br /&gt;
return @insteonID&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def findresponderrecord(masterid, slaveid, groupid)&lt;br /&gt;
# log(masterid + &#039;:&#039; + slaveid + &#039;:&#039; + groupid)&lt;br /&gt;
$childdatabases[slaveid].each{|check|&lt;br /&gt;
# log(&#039;Record:&#039; + check.to_s)&lt;br /&gt;
if iscontroller(check.to_s) == false #responder record&lt;br /&gt;
# log(&#039;found responder record&#039;)&lt;br /&gt;
# log(&#039;remoteid:&#039; + remoteid(check.to_s))&lt;br /&gt;
if remoteid(check.to_s) == masterid # found&lt;br /&gt;
# log(&#039;Found Controller ID in responder record&#039;)&lt;br /&gt;
if group(check.to_s) == groupid&lt;br /&gt;
# log(&#039;Group Matches&#039;)&lt;br /&gt;
#found group&lt;br /&gt;
return true&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
return false&lt;br /&gt;
end&lt;br /&gt;
def findcontrollerrecord(masterid, slaveid, groupid)&lt;br /&gt;
# log(masterid + &#039;:&#039; + slaveid + &#039;:&#039; + groupid)&lt;br /&gt;
$childdatabases[masterid].each{|check|&lt;br /&gt;
# log(&#039;Record:&#039; + check.to_s)&lt;br /&gt;
if iscontroller(check.to_s) == true #controller&lt;br /&gt;
# log(&#039;found controller record&#039;)&lt;br /&gt;
if remoteid(check.to_s) == slaveid # found&lt;br /&gt;
# log(&#039;found Responder ID in Controller record&#039;)&lt;br /&gt;
if group(check.to_s) == groupid&lt;br /&gt;
# log(&#039;Group Matches&#039;)&lt;br /&gt;
#found group&lt;br /&gt;
return true&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# time to define a structure to save the raw data in hex&lt;br /&gt;
# starts at [0]&lt;br /&gt;
# Bytes Meaning&lt;br /&gt;
# 0-1 Device Category&lt;br /&gt;
# 2-3 Device SubCategory&lt;br /&gt;
# 4-5 Device Firmware&lt;br /&gt;
# 6-7 Database Delta&lt;br /&gt;
# 8-9 reserved&lt;br /&gt;
# 10-11 reserved&lt;br /&gt;
# 12-13 reserved&lt;br /&gt;
# 14-15 reserved&lt;br /&gt;
###### First database record below (in same format its read from the device)&lt;br /&gt;
###### This is the same format as an ALL-Link Record Response from the PLM&lt;br /&gt;
###### (0x57) bytes 3..10&lt;br /&gt;
# 16-17 record control byte&lt;br /&gt;
# 18-19 Group&lt;br /&gt;
# 20-21 ID HB&lt;br /&gt;
# 22-23 ID MB&lt;br /&gt;
# 24-25 ID LB&lt;br /&gt;
# 26-27 Link Specific Data1&lt;br /&gt;
# 28-29 Link Specific Data2&lt;br /&gt;
# 30-31 Link Specific Data3&lt;br /&gt;
######&lt;br /&gt;
# 32-47 next database record...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_760&amp;diff=29656</id>
		<title>Insteon PLM Ruby Code 760</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_760&amp;diff=29656"/>
		<updated>2012-03-08T21:09:20Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#### #760 Send Command to Child ####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@insteonID = id.chomp.split(&#039;.&#039;)&lt;br /&gt;
@parameters = parameters&lt;br /&gt;
@command = pk_command&lt;br /&gt;
@cmd = cmd&lt;br /&gt;
childType =device_.childdevices_[cmdTo].devtemplid_ # find out device type&lt;br /&gt;
$cmdParams = cmd.params_&lt;br /&gt;
&lt;br /&gt;
log(&#039;#760:id=&#039; + id.inspect)&lt;br /&gt;
log(&#039;#760:parameters=&#039; + parameters.inspect)&lt;br /&gt;
log(&#039;#760:pk_command=&#039; + pk_command.inspect)&lt;br /&gt;
log(&#039;#760:cmd=&#039; + cmd.inspect)&lt;br /&gt;
### ok, I get the insteonID in @insteonID&lt;br /&gt;
# pk_command has one of THREE values, 192, 193, or NOTHING&lt;br /&gt;
# when I click 50%, I get in parameters: 76&lt;br /&gt;
# but NOTHING in pk_command.&lt;br /&gt;
&lt;br /&gt;
case pk_command&lt;br /&gt;
when &#039;192&#039; #ON&lt;br /&gt;
if chiltType ==2198 then #used when Device is Thermostat&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;OF&#039;, # Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Insteon Thermostat Control&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;06&#039;} # ON&lt;br /&gt;
else&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;OF&#039;, # Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;11&#039;, # Insteon SetLevel&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;FF&#039;} # FULL ON&lt;br /&gt;
end&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;193&#039; #OFF&lt;br /&gt;
log(&amp;quot;childtype:&amp;quot; +childtype.to_s)&lt;br /&gt;
if childtype == 2198 then #used when Device is Thermostat&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;09&#039;} #OFF&lt;br /&gt;
else #used when Device not Thermostat&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;13&#039;, #OFF&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
end&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
#when &#039;280&#039; # Heat/Cool/Auto&lt;br /&gt;
#log(&#039;Test Param:&#039; +$cmdParams.to_s)&lt;br /&gt;
#case $cmdParams.to_s&lt;br /&gt;
#when &#039;8H&#039; # Heat Command&lt;br /&gt;
#param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
#&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
#&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
#&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
#&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
#&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Indicates device is a Thermostat&lt;br /&gt;
#&#039;Parameter6&#039; =&amp;gt; &#039;04&#039;} # sets to Heat Mode&lt;br /&gt;
#$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
# SndIns()&lt;br /&gt;
&lt;br /&gt;
#when &#039;8C&#039; # Cool Command&lt;br /&gt;
#param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
#&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
#&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
#&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
#&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
#&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
#&#039;Parameter6&#039; =&amp;gt; &#039;05&#039;} # Sets to Cool&lt;br /&gt;
#$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
# SndIns()&lt;br /&gt;
#when &#039;8A&#039; # Auto Command&lt;br /&gt;
#param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
#&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
#&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
#&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
#&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
#&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
#&#039;Parameter6&#039; =&amp;gt; &#039;06&#039;} # Sets to Auto&lt;br /&gt;
#$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
#SndIns()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&lt;br /&gt;
when &#039;&#039;&lt;br /&gt;
if parameters==&#039;76&#039;&lt;br /&gt;
#SetLevel 50%&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;OF&#039;, # Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;11&#039;, # Insteon SetLevel&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;76&#039;} # 50%&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_756&amp;diff=29655</id>
		<title>Insteon PLM Ruby Code 756</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_756&amp;diff=29655"/>
		<updated>2012-03-08T21:08:05Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#### #756 Report Child Devices ####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#here is where I send all my newly discovered children..&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#I need to fire an event [54]&lt;br /&gt;
#with params_:&lt;br /&gt;
#12 Error Message (string)&lt;br /&gt;
# if this is not empty, that means an error occurred.&lt;br /&gt;
#&lt;br /&gt;
#13 Text (string)&lt;br /&gt;
# a list like this:&lt;br /&gt;
# [internal id] \t&lt;br /&gt;
# [description] \t&lt;br /&gt;
# [room name] \t&lt;br /&gt;
# [device template] \t&lt;br /&gt;
# [floorplan id] \n&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#First, Lets see if we actually &#039;get this command&#039;&lt;br /&gt;
log($yellow+ &#039;*#*#*#*#*#*#*#*# GOT #756 Report Child Devices! *#*#*#*#*#*#*#*#*&#039;+ $grey)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
##lets try sending an event..&lt;br /&gt;
&lt;br /&gt;
#cmd = Command.new(37,-1000,1, 2, 54)&lt;br /&gt;
#cmd.params_[13] = &amp;quot;0A.97.0B\tTestLamp\t\t38\t\n&amp;quot;&lt;br /&gt;
#log(cmd.params_[13])&lt;br /&gt;
#SendCommand(cmd)&lt;br /&gt;
@work = &amp;quot;&amp;quot;&lt;br /&gt;
$childdatabases.each_key{|insteonID|&lt;br /&gt;
@work += insteonID + &amp;quot;\t&amp;quot;&lt;br /&gt;
# figure out what type of device to add here..&lt;br /&gt;
log(&#039;Child:&#039; + insteonID)&lt;br /&gt;
log(&#039;Config:&#039; + $childdatabases[insteonID].inspect)&lt;br /&gt;
case $childdatabases[insteonID][0][0..1].hex # Device Category&lt;br /&gt;
when 0x00 # Generalized Controllers&lt;br /&gt;
case $childdatabases[insteonID][0][2..3].hex&lt;br /&gt;
when 0x00&lt;br /&gt;
when 0x01&lt;br /&gt;
when 0x02&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
when 0x01 # Dimmable Lighting Control&lt;br /&gt;
case $childdatabases[insteonID][0][2..3].hex&lt;br /&gt;
when 0x00; @work += &#039;LampLinc V2 [2456D3]&#039;&lt;br /&gt;
when 0x01; @work += &#039;SwitchLinc V2 Dimmer 600W [2476D]&#039;&lt;br /&gt;
when 0x02; @work += &#039;In-LineLinc Dimmer [2475D]&#039;&lt;br /&gt;
when 0x03; @work += &#039;Icon Switch Dimmer [2876D]&#039;&lt;br /&gt;
when 0x04; @work += &#039;SwitchLinc V2 Dimmer 1000W [2476DH]&#039;&lt;br /&gt;
when 0x06; @work += &#039;LampLinc 2-pin [2456D2]&#039;&lt;br /&gt;
when 0x07; @work += &#039;Icon LampLinc V2 2-pin [2456D2]&#039;&lt;br /&gt;
when 0x09; @work += &#039;KeypadLinc Dimmer [2486D]&#039;&lt;br /&gt;
when 0x0A; @work += &#039;Icon In-Wall Controller [2886D]&#039;&lt;br /&gt;
when 0x0D; @work += &#039;SocketLinc [2454D]&#039;&lt;br /&gt;
when 0x13; @work += &#039;Icon SwitchLinc Dimmer for Lixar/Bell Canada [2676D-B]&#039;&lt;br /&gt;
when 0x17; @work += &#039;ToggleLinc Dimmer [2466D]&#039;&lt;br /&gt;
end&lt;br /&gt;
@work += &amp;quot;\t\t38&amp;quot; # set Template 38&lt;br /&gt;
when 0x02 # Switched Lighting Control&lt;br /&gt;
case $childdatabases[insteonID][0][2..3].hex&lt;br /&gt;
when 0x09; @work += &#039;ApplianceLinc [2456S3]&#039;&lt;br /&gt;
when 0x0A; @work += &#039;SwitchLinc Relay [2476S]&#039;&lt;br /&gt;
when 0x0B; @work += &#039;Icon On Off Switch [2876S]&#039;&lt;br /&gt;
when 0x0C; @work += &#039;Icon Appliance Adapter [2856S3]&#039;&lt;br /&gt;
when 0x0D; @work += &#039;ToggleLinc Relay [2466S]&#039;&lt;br /&gt;
when 0x0E; @work += &#039;Switchlinc Relay Countdown Timer [2476ST]&#039;&lt;br /&gt;
when 0x10; @work += &#039;In-LineLinc Relay [2475D]&#039;&lt;br /&gt;
when 0x13; @work += &#039;Icon SwitchLinc Relay for Lixar/Bell Canada [2676R-B]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
@work += &amp;quot;\t\t37&amp;quot; # Set Template 37&lt;br /&gt;
when 0x03 # Network Bridges&lt;br /&gt;
case $childdatabases[insteonID][0][2..3].hex&lt;br /&gt;
when 0x10; @work += &#039;SmartLinc [2412N]&#039;&lt;br /&gt;
end&lt;br /&gt;
when 0x04 # Irrigation Control&lt;br /&gt;
@work += &#039;Simplehomenet EZRain1 Sprinkler Controller&#039;&lt;br /&gt;
@work += &amp;quot;\t\t1780&amp;quot; # Set Template 1780&lt;br /&gt;
&lt;br /&gt;
when 0x05 # Climate Control&lt;br /&gt;
case $childdatabases[insteonID][0][2..3].hex&lt;br /&gt;
when 0x00; @work += &#039;Broan SMSC080 Exhaust Fan&#039;&lt;br /&gt;
when 0x01; @work += &#039;Simplehomenet EZTherm&#039;&lt;br /&gt;
when 0x02; @work += &#039;Broan SMSC110 Exhaust Fan&#039;&lt;br /&gt;
when 0x03&lt;br /&gt;
@work += &#039;Venstar RF Thermostat Module&#039;&lt;br /&gt;
@work += &amp;quot;\t\t2198&amp;quot; # Set Template 2198&lt;br /&gt;
when 0x04; @work += &#039;Simplehomenet EZStat Thermostat&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 0x06 # Pool and Spa Control&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x07 # Sensors and Actuators&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x08&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x09&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0A&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0B&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0C&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0D&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0E&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0F&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x10 # Security, Health, and Safety&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x11 # Surveillance&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x12 # Automotive&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x13 # Pet care&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x14 # Toys&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x15 # Timekeeping&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x16 # Holiday&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
@work += &amp;quot;\t\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
log(@work)&lt;br /&gt;
cmd = Command.new(device_.devid_, -1000, 1, 2, 54)&lt;br /&gt;
cmd.params_[13] = @work&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_-_Setting_Up_PLM_Template&amp;diff=29555</id>
		<title>Insteon - Setting Up PLM Template</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_-_Setting_Up_PLM_Template&amp;diff=29555"/>
		<updated>2012-02-28T22:10:43Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo|810Status=Q/A|810UpdatedDate=29 JUNE 2010|810UpdatedBy=langstonius|710Status=N/A|710UpdatedDate=29JUNE 2010|710UpdatedBy=langstonius}}&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:Power Line Control]]&lt;br /&gt;
[[Category:GSD| ]]&lt;br /&gt;
 {| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: 11-MAR-08 Many bugs fixed, X10 fixes...&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: 13-FEB-08 X10 Support fixed! &lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
:--ddamron&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: 7-FEB-12 Remove instructions on setting up template, use Template 1932&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
:--Aviator&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: Adding Info for 2412n template In addition to posting plm code changes to enable Venstar Thermostat&#039;&#039;&#039; --[[User:Trippleg|Trippleg]] 00:06, 25 February 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here are the steps to create an Insteon PLM Template.  This driver is written entirely in Ruby.  Please consider this driver complete, and is in Release Candidate 1.  I&#039;m sure there are still a few bugs (although we&#039;ve ironed most of them out now). The more people testing this code, the more bugs we can find, and get this to a release state.  Once it&#039;s in release state, it will be added to sqlcvs and offered via a &#039;quick&#039; update.&lt;br /&gt;
&lt;br /&gt;
==Supported Devices==&lt;br /&gt;
This driver supports ONLY the Powerlinc Modem model (PLM)#2412S, #2413S, #2412U and #2413U. The code will NOT work for a model #2414 also known as a Powerlinc CONTROLLER (PLC).&lt;br /&gt;
&lt;br /&gt;
NOTE:  I am expecting a PLC to arrive in the mail in the next few days.  Support for that device will be sooner than later.&lt;br /&gt;
&lt;br /&gt;
*Febuary 2, 2012 - PLC support will NOT be added to this driver -Aviator&lt;br /&gt;
&lt;br /&gt;
*Febuary 3, 2012 - Thanks to the work of trippleg, we now have support for the 2412N as well. -Aviator&lt;br /&gt;
&lt;br /&gt;
This driver now supports  the  Smartlinc 2412N as well. Please use template 2203 &lt;br /&gt;
&lt;br /&gt;
Simplehomenet&#039;s EZBridge/EZServ products will be added once this code is stable.  These products are a &#039;wrapper&#039; for the PLM, and hence, use the same code.  Integration will be a matter of adding the &#039;wrapper&#039; code. (which is done)&lt;br /&gt;
&lt;br /&gt;
==Setting up the Template==&lt;br /&gt;
* The template is Plug and Play, configuration should have been taken care of for you.&lt;br /&gt;
&lt;br /&gt;
* Goto [[LinuxMCE Admin Website]]--&amp;gt;Wizard--&amp;gt;Devices--&amp;gt;Interfaces&lt;br /&gt;
* Add device--&amp;gt;Template Id 1932 Insteon PLM&lt;br /&gt;
For 2412N &lt;br /&gt;
* Add device --&amp;gt;Template Id 2203 Smartlinc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:* Now, in the COM PORT ON PC, you can select the com port it&#039;s on. &#039;&#039;&#039;UPDATE&#039;&#039;&#039; I didn&#039;t see any &amp;quot;COM PORT ON PC&amp;quot; field. You wil need to reload the router first, then you see the &amp;quot;COM PORT ON PC&amp;quot; field. 8/9/08 Williammanda&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039; Other than looking on the motherboard for the com port label and guess and check methods, what else can be done to identify the correct com port?&lt;br /&gt;
:* select Update (at the bottom)&lt;br /&gt;
&lt;br /&gt;
===Adding Ruby Code For Venstar Thermostat ===  Only use this if your Code is prior to 2/12/2012 &lt;br /&gt;
::* In the #756 Report Child Devices field (the big one) copy and paste this code:&lt;br /&gt;
:::[[Insteon PLM Ruby Code 756]]&lt;br /&gt;
::* In the #760 Send Command to Child field, copy and paste this code:&lt;br /&gt;
:::[[Insteon PLM Ruby Code 760]]&lt;br /&gt;
::* In the #373 Private Method Listing field, copy and paste this code:&lt;br /&gt;
:::[[Insteon PLM Ruby Code 373]]&lt;br /&gt;
::* In the #384 Process Receive Command for Child field, copy and paste this code:&lt;br /&gt;
:::[[Insteon PLM Ruby Code 384]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You are Done!&lt;br /&gt;
&lt;br /&gt;
==Next Steps==&lt;br /&gt;
go to [[Running the Insteon PLM Driver for the First Time]]&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29554</id>
		<title>Insteon Venstar Thermostat Module</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29554"/>
		<updated>2012-02-28T22:02:15Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo |810Status=Working|810UpdatedDate=8 Feb 2012|810UpdatedBy=Trippleg}}&lt;br /&gt;
[[Category: Climate ]]&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
&#039;&#039;&#039;Uses Prebuilt Template 2197&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You must update the folowing PLM Ruby code replacing &#039;&#039;&#039;2209&#039;&#039;&#039; with &#039;&#039;&#039;2197&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
756,&lt;br /&gt;
760, &lt;br /&gt;
373,&lt;br /&gt;
384&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Overview&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Venstar Thermostat expects Insteon to send specific commands to the device, and each command is encapsulated in a mode.  &lt;br /&gt;
For example: In order to send a command to change the temperature. Venstar has to know what mode ie. Heat, Auto, Cool. Therefore; the code sent specifies mode and temperature setting.  &lt;br /&gt;
Since there is no built in mechanism for this In the DCE router one was created.&lt;br /&gt;
&lt;br /&gt;
--[[User:Trippleg|Trippleg]] 00:22, 9 February 2012 (CET)trippleg&lt;br /&gt;
&lt;br /&gt;
Added Template Sample --[[User:Trippleg|Trippleg]] 23:24, 24 February 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Issuing A Command&#039;&#039;&#039; ==&lt;br /&gt;
&#039;&#039;&#039;This assumes you have already built and  reconfigured the Ruby code for template 2197.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Click Climate, and pick the appropriate device.&lt;br /&gt;
&lt;br /&gt;
2. Click Advanced&lt;br /&gt;
&lt;br /&gt;
3. Click Send Command to Device.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mode Commands&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Off&#039;&#039;&#039; command = Works as programmed within LMCE&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On&#039;&#039;&#039; command does not work. We have to issue a mode instead.&lt;br /&gt;
&lt;br /&gt;
 The following effectively turns the device &#039;&#039;&#039;ON&#039;&#039;&#039;.&lt;br /&gt;
    1. Send to this device the command select &#039;&#039;&#039;Set Heat/Cool&#039;&#039;&#039; &lt;br /&gt;
    2. # 8 On/Off (string) Box place the following:&lt;br /&gt;
        For &#039;&#039;&#039;Auto&#039;&#039;&#039; String will = A&lt;br /&gt;
        For &#039;&#039;&#039;Cool&#039;&#039;&#039; String will = C&lt;br /&gt;
        For &#039;&#039;&#039;Heat&#039;&#039;&#039; String will = H &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sending a command to change temperature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
With this command we have to send both mode and temp to get it to set, otherwise the thermostat will ignore the request.&lt;br /&gt;
   1. Send to this device the command select &#039;&#039;&#039;Set Tempurature&#039;&#039;&#039;.&lt;br /&gt;
   2. # 5 Value To Assign (string) Box Place The following: Mode/Temperature&lt;br /&gt;
      For &#039;&#039;&#039;Cool Temperature Setting&#039;&#039;&#039; String will = C/72  for Cool at 72 degrees&lt;br /&gt;
      For &#039;&#039;&#039;Heat Temperature Setting&#039;&#039;&#039; String will = H/78  for Heat at 74 degrees&lt;br /&gt;
  (&#039;&#039;Both of the above temp controls work in all 3 modes sending the C or the H effectively tells the unit to change the temp at which the A/C or Heater turns on&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reporting Device Status ==&lt;br /&gt;
&lt;br /&gt;
This feature has not been enabled yet. Insteon does have the ability do do this, it just has not been coded for yet.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Template Sample&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
To Build the template I used the default Thermostat template and added some extra Device Data fields required By the Insteon PLM. Below are some template screen shots.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please Note: You will need the updated version of the Insteon PLM.  I am working on posting it to the existing wiki page. The code has been posted so it should be available in the current SVN&#039;&#039;&lt;br /&gt;
[[{{ns:6}}:Template2209-1.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[{{ns:6}}:Template2209-2.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[{{ns:6}}:Template2209-3.JPG]]&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29553</id>
		<title>Insteon Venstar Thermostat Module</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29553"/>
		<updated>2012-02-28T22:01:51Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo |810Status=Working|810UpdatedDate=8 Feb 2012|810UpdatedBy=Trippleg}}&lt;br /&gt;
[[Category: Climate ]]&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
&#039;&#039;&#039;Uses Prebuilt Template 2197&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You must update the folowing PLM Ruby code replacing &#039;&#039;&#039;2209&#039;&#039;&#039; with &#039;&#039;&#039;2197&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
756,&lt;br /&gt;
760, &lt;br /&gt;
373,&lt;br /&gt;
384&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Overview&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Venstar Thermostat expects Insteon to send specific commands to the device, and each command is encapsulated in a mode.  &lt;br /&gt;
For example: In order to send a command to change the temperature. Venstar has to know what mode ie. Heat, Auto, Cool. Therefore; the code sent specifies mode and temperature setting.  &lt;br /&gt;
Since there is no built in mechanism for this In the DCE router one was created.&lt;br /&gt;
&lt;br /&gt;
--[[User:Trippleg|Trippleg]] 00:22, 9 February 2012 (CET)trippleg&lt;br /&gt;
&lt;br /&gt;
Added Template Sample --[[User:Trippleg|Trippleg]] 23:24, 24 February 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Issuing A Command&#039;&#039;&#039; ==&lt;br /&gt;
&#039;&#039;&#039;This assumes you have already built and  reconfiugerd the Ruby code for template 2197.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Click Climate, and pick the appropriate device.&lt;br /&gt;
&lt;br /&gt;
2. Click Advanced&lt;br /&gt;
&lt;br /&gt;
3. Click Send Command to Device.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mode Commands&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Off&#039;&#039;&#039; command = Works as programmed within LMCE&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On&#039;&#039;&#039; command does not work. We have to issue a mode instead.&lt;br /&gt;
&lt;br /&gt;
 The following effectively turns the device &#039;&#039;&#039;ON&#039;&#039;&#039;.&lt;br /&gt;
    1. Send to this device the command select &#039;&#039;&#039;Set Heat/Cool&#039;&#039;&#039; &lt;br /&gt;
    2. # 8 On/Off (string) Box place the following:&lt;br /&gt;
        For &#039;&#039;&#039;Auto&#039;&#039;&#039; String will = A&lt;br /&gt;
        For &#039;&#039;&#039;Cool&#039;&#039;&#039; String will = C&lt;br /&gt;
        For &#039;&#039;&#039;Heat&#039;&#039;&#039; String will = H &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sending a command to change temperature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
With this command we have to send both mode and temp to get it to set, otherwise the thermostat will ignore the request.&lt;br /&gt;
   1. Send to this device the command select &#039;&#039;&#039;Set Tempurature&#039;&#039;&#039;.&lt;br /&gt;
   2. # 5 Value To Assign (string) Box Place The following: Mode/Temperature&lt;br /&gt;
      For &#039;&#039;&#039;Cool Temperature Setting&#039;&#039;&#039; String will = C/72  for Cool at 72 degrees&lt;br /&gt;
      For &#039;&#039;&#039;Heat Temperature Setting&#039;&#039;&#039; String will = H/78  for Heat at 74 degrees&lt;br /&gt;
  (&#039;&#039;Both of the above temp controls work in all 3 modes sending the C or the H effectively tells the unit to change the temp at which the A/C or Heater turns on&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reporting Device Status ==&lt;br /&gt;
&lt;br /&gt;
This feature has not been enabled yet. Insteon does have the ability do do this, it just has not been coded for yet.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Template Sample&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
To Build the template I used the default Thermostat template and added some extra Device Data fields required By the Insteon PLM. Below are some template screen shots.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please Note: You will need the updated version of the Insteon PLM.  I am working on posting it to the existing wiki page. The code has been posted so it should be available in the current SVN&#039;&#039;&lt;br /&gt;
[[{{ns:6}}:Template2209-1.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[{{ns:6}}:Template2209-2.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[{{ns:6}}:Template2209-3.JPG]]&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29552</id>
		<title>Insteon Venstar Thermostat Module</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29552"/>
		<updated>2012-02-28T21:58:19Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo |810Status=Working|810UpdatedDate=8 Feb 2012|810UpdatedBy=Trippleg}}&lt;br /&gt;
[[Category: Climate ]]&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
&#039;&#039;&#039;Uses Prebuilt Template 2197&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You must update the folowing PLM Ruby code replacing &#039;&#039;&#039;2209&#039;&#039;&#039; with &#039;&#039;&#039;2197&#039;&#039;&#039;:&lt;br /&gt;
#756,#760,#373,#384&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Overview&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Venstar Thermostat expects Insteon to send specific commands to the device, and each command is encapsulated in a mode.  &lt;br /&gt;
For example: In order to send a command to change the temperature. Venstar has to know what mode ie. Heat, Auto, Cool. Therefore; the code sent specifies mode and temperature setting.  &lt;br /&gt;
Since there is no built in mechanism for this In the DCE router one was created.&lt;br /&gt;
&lt;br /&gt;
--[[User:Trippleg|Trippleg]] 00:22, 9 February 2012 (CET)trippleg&lt;br /&gt;
&lt;br /&gt;
Added Template Sample --[[User:Trippleg|Trippleg]] 23:24, 24 February 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Issuing A Command&#039;&#039;&#039; ==&lt;br /&gt;
&#039;&#039;&#039;This assumes you have already built and configured template 2209.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Click Climate, and pick the appropriate device.&lt;br /&gt;
&lt;br /&gt;
2. Click Advanced&lt;br /&gt;
&lt;br /&gt;
3. Click Send Command to Device.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mode Commands&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Off&#039;&#039;&#039; command = Works as programmed within LMCE&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On&#039;&#039;&#039; command does not work. We have to issue a mode instead.&lt;br /&gt;
&lt;br /&gt;
 The following effectively turns the device &#039;&#039;&#039;ON&#039;&#039;&#039;.&lt;br /&gt;
    1. Send to this device the command select &#039;&#039;&#039;Set Heat/Cool&#039;&#039;&#039; &lt;br /&gt;
    2. # 8 On/Off (string) Box place the following:&lt;br /&gt;
        For &#039;&#039;&#039;Auto&#039;&#039;&#039; String will = A&lt;br /&gt;
        For &#039;&#039;&#039;Cool&#039;&#039;&#039; String will = C&lt;br /&gt;
        For &#039;&#039;&#039;Heat&#039;&#039;&#039; String will = H &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sending a command to change temperature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
With this command we have to send both mode and temp to get it to set, otherwise the thermostat will ignore the request.&lt;br /&gt;
   1. Send to this device the command select &#039;&#039;&#039;Set Tempurature&#039;&#039;&#039;.&lt;br /&gt;
   2. # 5 Value To Assign (string) Box Place The following: Mode/Temperature&lt;br /&gt;
      For &#039;&#039;&#039;Cool Temperature Setting&#039;&#039;&#039; String will = C/72  for Cool at 72 degrees&lt;br /&gt;
      For &#039;&#039;&#039;Heat Temperature Setting&#039;&#039;&#039; String will = H/78  for Heat at 74 degrees&lt;br /&gt;
  (&#039;&#039;Both of the above temp controls work in all 3 modes sending the C or the H effectively tells the unit to change the temp at which the A/C or Heater turns on&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reporting Device Status ==&lt;br /&gt;
&lt;br /&gt;
This feature has not been enabled yet. Insteon does have the ability do do this, it just has not been coded for yet.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Template Sample&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
To Build the template I used the default Thermostat template and added some extra Device Data fields required By the Insteon PLM. Below are some template screen shots.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please Note: You will need the updated version of the Insteon PLM.  I am working on posting it to the existing wiki page. The code has been posted so it should be available in the current SVN&#039;&#039;&lt;br /&gt;
[[{{ns:6}}:Template2209-1.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[{{ns:6}}:Template2209-2.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[{{ns:6}}:Template2209-3.JPG]]&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29551</id>
		<title>Insteon Venstar Thermostat Module</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29551"/>
		<updated>2012-02-28T21:47:54Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo |810Status=Working|810UpdatedDate=8 Feb 2012|810UpdatedBy=Trippleg}}&lt;br /&gt;
[[Category: Climate ]]&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
&#039;&#039;&#039;Overview&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Venstar Thermostat expects Insteon to send specific commands to the device, and each command is encapsulated in a mode.  &lt;br /&gt;
For example: In order to send a command to change the temperature. Venstar has to know what mode ie. Heat, Auto, Cool. Therefore; the code sent specifies mode and temperature setting.  &lt;br /&gt;
Since there is no built in mechanism for this In the DCE router one was created.&lt;br /&gt;
&lt;br /&gt;
--[[User:Trippleg|Trippleg]] 00:22, 9 February 2012 (CET)trippleg&lt;br /&gt;
&lt;br /&gt;
Added Template Sample --[[User:Trippleg|Trippleg]] 23:24, 24 February 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Issuing A Command&#039;&#039;&#039; ==&lt;br /&gt;
&#039;&#039;&#039;This assumes you have already built and configured template 2209.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Click Climate, and pick the appropriate device.&lt;br /&gt;
&lt;br /&gt;
2. Click Advanced&lt;br /&gt;
&lt;br /&gt;
3. Click Send Command to Device.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mode Commands&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Off&#039;&#039;&#039; command = Works as programmed within LMCE&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On&#039;&#039;&#039; command does not work. We have to issue a mode instead.&lt;br /&gt;
&lt;br /&gt;
 The following effectively turns the device &#039;&#039;&#039;ON&#039;&#039;&#039;.&lt;br /&gt;
    1. Send to this device the command select &#039;&#039;&#039;Set Heat/Cool&#039;&#039;&#039; &lt;br /&gt;
    2. # 8 On/Off (string) Box place the following:&lt;br /&gt;
        For &#039;&#039;&#039;Auto&#039;&#039;&#039; String will = A&lt;br /&gt;
        For &#039;&#039;&#039;Cool&#039;&#039;&#039; String will = C&lt;br /&gt;
        For &#039;&#039;&#039;Heat&#039;&#039;&#039; String will = H &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sending a command to change temperature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
With this command we have to send both mode and temp to get it to set, otherwise the thermostat will ignore the request.&lt;br /&gt;
   1. Send to this device the command select &#039;&#039;&#039;Set Tempurature&#039;&#039;&#039;.&lt;br /&gt;
   2. # 5 Value To Assign (string) Box Place The following: Mode/Temperature&lt;br /&gt;
      For &#039;&#039;&#039;Cool Temperature Setting&#039;&#039;&#039; String will = C/72  for Cool at 72 degrees&lt;br /&gt;
      For &#039;&#039;&#039;Heat Temperature Setting&#039;&#039;&#039; String will = H/78  for Heat at 74 degrees&lt;br /&gt;
  (&#039;&#039;Both of the above temp controls work in all 3 modes sending the C or the H effectively tells the unit to change the temp at which the A/C or Heater turns on&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reporting Device Status ==&lt;br /&gt;
&lt;br /&gt;
This feature has not been enabled yet. Insteon does have the ability do do this, it just has not been coded for yet.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Template Sample Use Template 2197&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
To Build the template I used the default Thermostat template and added some extra Device Data fields required By the Insteon PLM. Below are some template screen shots.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please Note: You will need the updated version of the Insteon PLM.  I am working on posting it to the existing wiki page. The code has been posted so it should be available in the current SVN&#039;&#039;&lt;br /&gt;
[[{{ns:6}}:Template2209-1.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[{{ns:6}}:Template2209-2.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[{{ns:6}}:Template2209-3.JPG]]&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_384&amp;diff=29550</id>
		<title>Insteon PLM Ruby Code 384</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_384&amp;diff=29550"/>
		<updated>2012-02-28T21:46:42Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#### #384 Process Receive Command for Child ####&lt;br /&gt;
#&lt;br /&gt;
#Commands needing implementation&lt;br /&gt;
# Climate Events:&lt;br /&gt;
# 25 Temperature Changed  Partially working&lt;br /&gt;
# 26 Humidity Changed     Partially working&lt;br /&gt;
# 27 Thermostat Set Point Changed  Partially working&lt;br /&gt;
&lt;br /&gt;
# Security Commands:&lt;br /&gt;
# 746 Disarm Panel&lt;br /&gt;
# 758 Get Sensors List&lt;br /&gt;
# 19 Set House Mode&lt;br /&gt;
# 387 Verify PIN&lt;br /&gt;
# Security Events:&lt;br /&gt;
# 9 Sensor Tripped&lt;br /&gt;
# 16 Security Breach&lt;br /&gt;
# 17 Fire Alarm&lt;br /&gt;
# 18 Reset Alarm&lt;br /&gt;
# 39 Air Quality&lt;br /&gt;
# 40 Doorbell&lt;br /&gt;
# 41 Monitor Mode&lt;br /&gt;
# 42 Movement Detected&lt;br /&gt;
# 43 House Mode Changed&lt;br /&gt;
# 44 Presence Detected&lt;br /&gt;
# 45 Presence Lost&lt;br /&gt;
# 67 Alarm Panel Mode Change&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
deviceID = device_.childdevices_[cmd.devidto_].devdata_[12]&lt;br /&gt;
insteonID = deviceID.chomp.split(&#039;.&#039;)&lt;br /&gt;
$cmdID = cmd.id_&lt;br /&gt;
$cmdTo = cmd.devidto_&lt;br /&gt;
childType = device_.childdevices_[cmd.devidto_].devtemplid_&lt;br /&gt;
$cmdFrom = cmd.devidfrom_&lt;br /&gt;
$cmdPriority = cmd.priority_&lt;br /&gt;
$cmdType = cmd.type_&lt;br /&gt;
$cmdParams = cmd.params_&lt;br /&gt;
##Used Only for Thermostat Tempruature Changes########&lt;br /&gt;
$TempParamSplit =cmd.params_.to_s.split(&#039;/&#039;) # splits Tempurature string to allow for heat and cool settings&lt;br /&gt;
$ConvertTempInt = $TempParamSplit[1].to_i * 2&lt;br /&gt;
$ConvertTempHex = $ConvertTempInt.to_s(16) #Converts temp to hex to send to Thermostat&lt;br /&gt;
#################################&lt;br /&gt;
log(&#039;------dce--- cmdID:&#039; + $cmdID.to_s + &#039;, cmdFrom:&#039; + $cmdFrom.to_s + &#039;, cmdTo:&#039; + $cmdTo.to_s + &#039;, cmdType:&#039; + $cmdType.to_s + &#039;, Priority:&#039; + $cmdPriority.to_s)&lt;br /&gt;
if $cmdTo == $cmdFrom&lt;br /&gt;
log(&#039;Detected Command sent to Self!&#039;)&lt;br /&gt;
return&lt;br /&gt;
end&lt;br /&gt;
case cmd.id_&lt;br /&gt;
&lt;br /&gt;
when 278 # Set Temp&lt;br /&gt;
log(&#039;Processing Temp Control command&#039;)&lt;br /&gt;
#log($cmdParams)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
case $TempParamSplit[0].to_s&lt;br /&gt;
when &#039;5C&#039; #sending Heatpoint Tempurature&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6C&#039;, # Defines Cool Setpoint&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; $ConvertTempHex} # send Tempurature Value in Hex&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;5H&#039; #sending Heatpoint Tempurature&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6D&#039;, # Defines Heat Setpoint&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; $ConvertTempHex} # send Tempurature Value in Hex&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 279 #Fan Control&lt;br /&gt;
log(&#039;Processing Fan Control command&#039;)&lt;br /&gt;
log($cmdParams)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
&lt;br /&gt;
case $cmdParams.to_s&lt;br /&gt;
when &#039;81&#039; # Fan ON&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;07&#039;} # Sets Fan to ON&lt;br /&gt;
log(param)&lt;br /&gt;
when &#039;82&#039; # Fan OFF&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;08&#039;} # Sets fan OFF&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 280 # Heat/Cool/Auto&lt;br /&gt;
log(&#039;Processing Heat/Cool/Auto command&#039;)&lt;br /&gt;
#log(&#039;Test Param:&#039; +$cmdParams.to_s)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
case $cmdParams.to_s&lt;br /&gt;
when &#039;8H&#039; # Heat Command&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Indicates device is a Thermostat&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;04&#039;} # sets to Heat Mode&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;8C&#039; # Cool Command&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;05&#039;} # Sets to Cool&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;8A&#039; # Auto Command&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;06&#039;} # Sets to Auto&lt;br /&gt;
&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
when 192 # ON&lt;br /&gt;
log(&#039;Processing ON command&#039;)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
if childType == 2197 then #Used For Thermostat only Sets to Auto, No on command.&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Indicates device is a Thermostat&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;06&#039;} # sets to Auto&lt;br /&gt;
else #Used For Everything else&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;11&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;FF&#039;}&lt;br /&gt;
end&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log &amp;quot;------dce--- X10 DEVICE!!!&amp;quot;&lt;br /&gt;
# Send X10 ON command.&lt;br /&gt;
#first, figure out the house code and unit code.&lt;br /&gt;
log(&#039;DeviceID=&#039; + deviceID)&lt;br /&gt;
x10Byte1 = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10Byte1 += $X10UnitCodes.index(deviceID[1].chr)&lt;br /&gt;
x10cmd = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10cmd += &#039;2&#039; # command code for ON&lt;br /&gt;
log(&#039;X10 Byte1:&#039; + x10Byte1)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10Byte1,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10cmd,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;80&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
reportStatus($children[deviceID], 100)&lt;br /&gt;
when 193 #OFF&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
if childType == 2197 then #Used For Thermostat only&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Indicates Device is Thermostat&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;09&#039;} # Sets to Off&lt;br /&gt;
else&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;13&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
end&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log &amp;quot;------dce--- X10 DEVICE!!!&amp;quot;&lt;br /&gt;
log(&#039;DeviceID=&#039; + deviceID)&lt;br /&gt;
&lt;br /&gt;
x10Byte1 = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10Byte1 += $X10UnitCodes.index(deviceID[1].chr)&lt;br /&gt;
x10cmd = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10cmd += &#039;3&#039; # command code for OFF&lt;br /&gt;
log(&#039;X10 Byte1:&#039; + x10Byte1)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10Byte1,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10cmd,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;80&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
reportStatus($children[deviceID], 0)&lt;br /&gt;
when 193&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
#Needs Work&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 184 #SetLevel&lt;br /&gt;
# convert from percent to hex&lt;br /&gt;
dim_level = percenttohex(cmd.params_[76])&lt;br /&gt;
#log(&amp;quot;------dce--- Dim Level:&amp;quot; + dim_level.to_s)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;11&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; dim_level}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
# In the PRESET DIM X10 command, the lsbit of the command code is the MSB of the&lt;br /&gt;
# dim level, and the house code represents the 4 lsbits of the dim level.&lt;br /&gt;
# This is why Pre-Set Dim command is A AND B.&lt;br /&gt;
log(&#039;Parameter 76 = &#039; + cmd.params_[76].to_s)&lt;br /&gt;
log &amp;quot;X10 DEVICE!!! relative Dimming command&amp;quot;&lt;br /&gt;
log(&#039;DeviceID=&#039; + deviceID)&lt;br /&gt;
x10Byte1 = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10Byte1 += $X10UnitCodes.index(deviceID[1].chr)&lt;br /&gt;
x10cmd = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
#first, determine if its UP or Down&lt;br /&gt;
&lt;br /&gt;
if $state[deviceID].to_i &amp;gt; hextopercent(dim_level).to_i&lt;br /&gt;
# DOWN&lt;br /&gt;
x10cmd += $X10CommandCodes.index(&#039;Dim&#039;)&lt;br /&gt;
else&lt;br /&gt;
# UP&lt;br /&gt;
x10cmd += $X10CommandCodes.index(&#039;Bright&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
log(&#039;X10 Byte1:&#039; + x10Byte1)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10Byte1,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10cmd,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;80&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
&lt;br /&gt;
SndIns()&lt;br /&gt;
log(&#039;Dim Level:&#039; + hextopercent(dim_level).to_s)&lt;br /&gt;
#now send status info (we should not have to to this, but do)&lt;br /&gt;
reportStatus($children[deviceID], hextopercent(dim_level))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_373&amp;diff=29549</id>
		<title>Insteon PLM Ruby Code 373</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_373&amp;diff=29549"/>
		<updated>2012-02-28T21:45:37Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#### #373 Private Method Listing ####&lt;br /&gt;
&lt;br /&gt;
def mainStart() ## This is called FIRST, reruns cannot call this.&lt;br /&gt;
#Register Message Interceptor&lt;br /&gt;
@interceptor = Command.new(device_.devid_, -1000, 1, 5, 37)&lt;br /&gt;
@interceptor.params_[2] = device_.devid_.to_s&lt;br /&gt;
SendCommand(@interceptor)&lt;br /&gt;
&lt;br /&gt;
#Get the PLM Database&lt;br /&gt;
sendGetLink&lt;br /&gt;
#get Child devices&lt;br /&gt;
log(&#039;Finding Children..&#039;)&lt;br /&gt;
device_.childdevices_.each{|c|&lt;br /&gt;
if device_.childdevices_[c.to_s.to_i].devdata_[12].include? &amp;quot;Group&amp;quot;&lt;br /&gt;
log(&#039;FOUND A GROUP&#039;)&lt;br /&gt;
else&lt;br /&gt;
$children[device_.childdevices_[c.to_s.to_i].devdata_[12].chomp.lstrip.rstrip] = c.to_s.to_i&lt;br /&gt;
end}&lt;br /&gt;
$children.keys.each{|c| log(c + &#039; = &#039; + $children[c].to_s)&lt;br /&gt;
}&lt;br /&gt;
log(&#039;reading stored Child configuration:&#039;)&lt;br /&gt;
&lt;br /&gt;
$children.keys.each{|c|&lt;br /&gt;
#Get each Childs configuration&lt;br /&gt;
$state[$children[c]] = 0&lt;br /&gt;
getdeviceconfig(c) #&lt;br /&gt;
&lt;br /&gt;
#the above getdeviceconfig packs $configparams array&lt;br /&gt;
log(&#039;Configuration for &#039; + c + &#039; = &#039; + $configparams.inspect.to_s)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
log(&#039;********************************************************&#039;)&lt;br /&gt;
#get childs actual configuation and status&lt;br /&gt;
$children.keys.each{|c| sendGetChildStatus(c)}&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
def mainRestart()&lt;br /&gt;
#We have hashes already set up.&lt;br /&gt;
$childdatabases.each_key{|@insteonID|&lt;br /&gt;
$state[$children[@insteonID]] = 0&lt;br /&gt;
sendGetChildStatus(@insteonID)}&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def setdeviceconfig(insteonid, configurestring)&lt;br /&gt;
@deviceid = $children[insteonid]&lt;br /&gt;
@cmdfrom = device_.devid_&lt;br /&gt;
@cmdto = 4 #general info plugin&lt;br /&gt;
@priority = 1&lt;br /&gt;
@type=1 #command&lt;br /&gt;
@cmdid = 246&lt;br /&gt;
&lt;br /&gt;
#set up command..&lt;br /&gt;
@cmd = Command.new(@cmdfrom, @cmdto, @priority, @type, @cmdid)&lt;br /&gt;
@cmd.params_[2] = @deviceid.to_s&lt;br /&gt;
@cmd.params_[52] = &#039;59&#039; # Configuration&lt;br /&gt;
@cmd.params_[5] = configurestring&lt;br /&gt;
SendCommand(@cmd)&lt;br /&gt;
log(&#039;SetDeviceConfig:&#039; + @cmd.to_s)&lt;br /&gt;
#log(&#039;SetDeviceConfig:&#039; + configurestring)&lt;br /&gt;
#log(&#039;Configuration Saved - will be available on next reload&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def getdeviceconfig(insteonid)&lt;br /&gt;
@deviceid = $children[insteonid]&lt;br /&gt;
@configstring = &#039;&#039;&lt;br /&gt;
begin&lt;br /&gt;
@configstring = device_.childdevices_[@deviceid].devdata_[59].to_s&lt;br /&gt;
rescue&lt;br /&gt;
log(&#039;Device ID = &#039; + @deviceid.to_s)&lt;br /&gt;
log($red + &#039;Error - Child has no configuration&#039;+ $grey)&lt;br /&gt;
log(&#039;Setting initial value of &amp;quot;****************&amp;quot;&#039;)&lt;br /&gt;
setdeviceconfig(insteonid, (&#039;*&#039; * 16))&lt;br /&gt;
@configstring = &#039;*&#039; * 16&lt;br /&gt;
sendPing(insteonid)&lt;br /&gt;
end&lt;br /&gt;
if @configstring == &#039;&#039;&lt;br /&gt;
$configparams = [&#039;****************&#039;]&lt;br /&gt;
log(&#039;CAUGHT BLANK RECORD&#039;)&lt;br /&gt;
setdeviceconfig(insteonid, (&#039;*&#039; * 16))&lt;br /&gt;
sendPing(insteonid)&lt;br /&gt;
else&lt;br /&gt;
$configparams = @configstring.unpack(&#039;a16&#039; * (@configstring.length / 16))&lt;br /&gt;
$devicetemplate[insteonid] = getdevicetemplate($configparams[0][0..1], $configparams[0][2..3])&lt;br /&gt;
end&lt;br /&gt;
#log($yellow + &#039;getdeviceconfig:&#039; + $configparams.inspect + $grey)&lt;br /&gt;
#add the configuration parameters to the child database&lt;br /&gt;
$childdatabases[insteonid] = $configparams&lt;br /&gt;
#get the device type&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def sendGetLink()&lt;br /&gt;
#lets just see exactly what is in the PLM database&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;GetLnk&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def sendGetNext()&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;GetNext&#039;}&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(1, param)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(0,param)&lt;br /&gt;
end&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def sendRemoteGetLink(insteonID)&lt;br /&gt;
# Read First ALDB Record&lt;br /&gt;
# a few variables need to be set up here..&lt;br /&gt;
$recordof = insteonID # save the insteon ID&lt;br /&gt;
insID = insteonID.chomp.split(&#039;.&#039;) # get the seperate bytes&lt;br /&gt;
$remoteDBOffsetMSB = 0x0F # initial offset&lt;br /&gt;
$remoteDBOffsetLSB = 0xF8 # initial LSB offset&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insID[0], #HB&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insID[1], #MB&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insID[2], #LB&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;, #Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;28&#039;, #Cmd1&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &amp;quot;%X&amp;quot; %$remoteDBOffsetMSB #Cmd2 Set MSB Offset&lt;br /&gt;
}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
# repeat last param for each byte to read (F8..FF)=first record&lt;br /&gt;
&lt;br /&gt;
for x in 0..7&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insID[0], #HB&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insID[1], #MB&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insID[2], #LB&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;, #Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;2B&#039;, #Cmd1 Peek&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &amp;quot;%X&amp;quot; %($remoteDBOffsetLSB + x) #Cmd2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def sendRemoteGetNext(insteonID)&lt;br /&gt;
insID = insteonID.chomp.split(&#039;.&#039;) # get the seperate bytes&lt;br /&gt;
### Do NOT forget to check to see if we need to decrease the MSB&lt;br /&gt;
&lt;br /&gt;
if $remoteDBOffsetLSB == 0x00&lt;br /&gt;
#OffsetMSB needs to be decreased, and LSB needs reset.&lt;br /&gt;
$remoteDBOffsetMSB = $remoteDBOffsetMSB - 1&lt;br /&gt;
$remoteDBOffsetLSN = 0xFF # the next line will decrease this by 8&lt;br /&gt;
end&lt;br /&gt;
# decrease DBOffsetLSB by 0x08&lt;br /&gt;
$remoteDBOffsetLSB = $remoteDBOffsetLSB - 0x08&lt;br /&gt;
&lt;br /&gt;
for x in 0..7&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insID[0], #HB&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insID[1], #MB&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insID[2], #LB&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;, #Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;2B&#039;, #Cmd1 Peek&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &amp;quot;%X&amp;quot; %($remoteDBOffsetLSB + x) #Cmd2&lt;br /&gt;
}&lt;br /&gt;
#log(&#039;sendRemoteGetNet:added to queue:&#039; + param.inspect)&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(x + 1, param)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(x,param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
### Main command parsing routine is EZToDCE&lt;br /&gt;
def EZToDCE(param)&lt;br /&gt;
#param contains a hash of EZBridge command structure&lt;br /&gt;
#log($blue + &#039;Queue:&#039; + $cmdqueue[0].inspect + $grey)&lt;br /&gt;
#log($blue + &#039;Param:&#039; + param.inspect + $grey)&lt;br /&gt;
#log($blue + &#039;currentcmd:&#039; + $currentcmd.to_s + $grey)&lt;br /&gt;
#checkWait(param)&lt;br /&gt;
case param[&#039;Response&#039;]&lt;br /&gt;
# Standard RESPONSES (to commands)&lt;br /&gt;
when &#039;GetRevision&#039; # Special Response&lt;br /&gt;
log(&#039;-----|---------GetRevision:&#039; + param[&#039;Parameter1&#039;])&lt;br /&gt;
&lt;br /&gt;
when &#039;GetLatLong&#039; # Special Response&lt;br /&gt;
log(&#039;-----|---------GetLatLong: Lat=&#039; + param[&#039;Lat&#039;] + &#039;, Long=&#039; + param[&#039;Long&#039;])&lt;br /&gt;
&lt;br /&gt;
when &#039;SetLatLong&#039;&lt;br /&gt;
if param[&#039;Parameter1&#039;] == &#039;True&#039; then&lt;br /&gt;
log(&#039;-----|---------SetLatLong: Ok&#039;)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;-----X---------SetLatLong: FAILED!&#039;)&lt;br /&gt;
end&lt;br /&gt;
when &#039;SetPasswd&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;SetTimeZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetClock&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;SetClock&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;SetNTPServer&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;Upgrade&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;NetCfg&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;Reset&#039;&lt;br /&gt;
#Reset Response&lt;br /&gt;
&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
when &#039;LstTimers&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when &#039;ClrTimers&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;AddTimer&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetTimer&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;SetTimer&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;DelTimer&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetVersion&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;SndGrp&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;SndIns&#039; # response from SndIns&lt;br /&gt;
### BUG FOUND ### When the EZBridge receives a command from an EXTERNAL source&lt;br /&gt;
### ie not from this device, cmdqueue will be nil, and the code below&lt;br /&gt;
### fails. Have to check against that.&lt;br /&gt;
if $cmdqueue.length &amp;gt; 0&lt;br /&gt;
#First, check the response to make sure the command made it ok.&lt;br /&gt;
if param[&#039;Parameter9&#039;].to_i == 6 #Ack received&lt;br /&gt;
#log(&#039;Sending to ProcessACK&#039;)&lt;br /&gt;
processACK(param)&lt;br /&gt;
else # NACK received - command failed.&lt;br /&gt;
log(&#039;Command NACKED&#039;)&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
#Response received for another device.&lt;br /&gt;
log(&#039;Response detected for a command that was not sent by me&#039;)&lt;br /&gt;
end&lt;br /&gt;
when &#039;SndX10&#039;&lt;br /&gt;
log(&#039;Response detected for SndX10&#039;)&lt;br /&gt;
if param[&#039;Parameter5&#039;].to_i == 6 #ack&lt;br /&gt;
log(&#039;X10 Command Successfull&#039;)&lt;br /&gt;
&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;X10 Command FAILED&#039;)&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
when &#039;StLnk&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;CancelLnk&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;SetDev&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;RstPLM&#039;&lt;br /&gt;
#Reset Response&lt;br /&gt;
$timeout = 1&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;GetLnk&#039;&lt;br /&gt;
if param[&#039;Parameter3&#039;].to_i == 6 #ack&lt;br /&gt;
log(&#039;GetLnk ACKED&#039;)&lt;br /&gt;
#if we get this, we should get a AllLink Record Response next&lt;br /&gt;
else&lt;br /&gt;
log(&#039;GetLnk NACKED&#039;)&lt;br /&gt;
# The PLM is BLANK&lt;br /&gt;
#have to add records to the PLM here.&lt;br /&gt;
cmdComplete&lt;br /&gt;
### FINISHED WITH GetLnk&lt;br /&gt;
checkChildRecordsinPLM()&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
when &#039;GetNext&#039;&lt;br /&gt;
if param[&#039;Parameter3&#039;].to_i == 6 #ack&lt;br /&gt;
log(&#039;sendGetNext ACKED&#039;)&lt;br /&gt;
#if we get this, we should get a AllLink Record Response next&lt;br /&gt;
else&lt;br /&gt;
log(&#039;sendGetNext NACKED&#039;)&lt;br /&gt;
#we get this when there are no more records&lt;br /&gt;
cmdComplete&lt;br /&gt;
#FINISHED with GetNext&lt;br /&gt;
# if we are here, we are in config mode&lt;br /&gt;
# so, next is to check to make sure the&lt;br /&gt;
# childrens insteon ID is in the PLM&lt;br /&gt;
checkChildRecordsinPLM()&lt;br /&gt;
# now, to make sure that all the records in the PLM are sensed as children&lt;br /&gt;
&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when &#039;SetCfg&#039; # response from Setcfg command&lt;br /&gt;
if param[&#039;Parameter4&#039;].to_i == 6 #ack&lt;br /&gt;
log(&#039;SetCfg Completed&#039;)&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;SetCfg NACKED&#039;)&lt;br /&gt;
end&lt;br /&gt;
when &#039;GetLnkData&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;LEDON&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;LEDOFF&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;MngLnk&#039;&lt;br /&gt;
if param[&#039;Parameter12&#039;].to_i == 6&lt;br /&gt;
log(&#039;MngLnk =&amp;gt; ACK&#039;)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;MngLnk =&amp;gt; NACK&#039;)&lt;br /&gt;
end&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;GetCfg&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;LstMacros&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;ClrMacros&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;AddMacro&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetMacro&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;SetMacro&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;DelMacro&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;LstDevices&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;ClrDevices&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;AddDevice&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetDevice&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;SetDevice&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;DelDevice&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;LstZones&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;ClrZones&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;AddZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;SetZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;DelZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;AddDevZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;DelDevZone&#039;&lt;br /&gt;
&lt;br /&gt;
# Response Messages&lt;br /&gt;
when &#039;InsExtMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;InsStdMsg&#039;&lt;br /&gt;
case $currentcmd # if this msg is part of a response, the Insteon Cmd1 will be saved here.&lt;br /&gt;
when 0x0&lt;br /&gt;
#log(&#039;REROUTING to processExternalCommand(param)&#039;)&lt;br /&gt;
processExternalCommand(param)&lt;br /&gt;
when 0x1 #Assign to Group&lt;br /&gt;
### This is a broadcast message sent&lt;br /&gt;
# from a PING command&lt;br /&gt;
# or from a StartLink...&lt;br /&gt;
log(&#039;Caught Assign to Group Message from Device&#039;)&lt;br /&gt;
### BUG HERE&lt;br /&gt;
#have to check flags to see if this is a broadcast message&lt;br /&gt;
log(&#039;Checking if this is a broadcast message&#039;)&lt;br /&gt;
log(&#039;Flags:&#039; + param[&#039;Parameter9&#039;])&lt;br /&gt;
if (param[&#039;Parameter9&#039;].hex &amp;amp; 0x80) == 0x80&lt;br /&gt;
log(&#039;Message IS BROADCAST&#039;)&lt;br /&gt;
#recvComplete&lt;br /&gt;
processDeviceInfo(param)&lt;br /&gt;
&lt;br /&gt;
# check to see if current cmd is for this broadcast..&lt;br /&gt;
log(&#039;Current Command:&#039; + $cmdqueue[0][&#039;Parameter5&#039;])&lt;br /&gt;
if $cmdqueue[0][&#039;Parameter5&#039;] == &#039;10&#039;&lt;br /&gt;
#log(&#039;Clearing PING Command&#039;)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;CURRENT CMD IS NOT PING - NOT CLEARING&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Message is NOT Broadcast&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x2 #Delete from Group&lt;br /&gt;
when 0x10 # PING&lt;br /&gt;
#this is where I catch the InsStdMsg for ping.&lt;br /&gt;
log(&#039;Caught PING Message from Device&#039;)&lt;br /&gt;
$currentcmd = 1&lt;br /&gt;
&lt;br /&gt;
when 0x11 # ON&lt;br /&gt;
log(&#039;Caught Insteon ON from INTERNAL source&#039;)&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
log(&#039;Current DIM level:&#039; + param[&#039;Parameter11&#039;])&lt;br /&gt;
&lt;br /&gt;
reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
&lt;br /&gt;
SndIns()&lt;br /&gt;
when 0x13 # OFF&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
reportStatus(myDevFrom, 0)&lt;br /&gt;
&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
SndIns()&lt;br /&gt;
#####Thermostat Does Not report Status correctly Yet. Have to figure out reportStatus###&lt;br /&gt;
when 0x6A #Thermostat Control Get Zone Data (Temp, Setpoint,Humidity)&lt;br /&gt;
log(&#039;Thermostat returned Zone Info: &#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when 0x6B #Thermostat Control Command Handle Response&lt;br /&gt;
log(&#039;Thermostat returned: &#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
case param[&#039;Parameter11&#039;].to_s&lt;br /&gt;
when &#039;06&#039; # ON/Auto&lt;br /&gt;
# $ThermostatStatus = &#039;ON/Auto&#039; ##not used&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 6)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;09&#039; #OFF&lt;br /&gt;
# $ThermostatStatus = &#039;OFF&#039; ## not used may be for reportstatus&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 9)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;04&#039; # Heat&lt;br /&gt;
#$ThermostatStatus = &#039;HEAT&#039;&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 4)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;05&#039; # Cool&lt;br /&gt;
#$ThermostatStatus = &#039;COOL&#039;&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 5)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when &#039;07&#039; # Fan On&lt;br /&gt;
2#$ThermostatStatus = &#039;COOL&#039;&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 5)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when &#039;08&#039; # Fan Off&lt;br /&gt;
#$ThermostatStatus = &#039;COOL&#039;&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 5)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when 0x6C #Thermostat Control Get Zone Cool Point Data&lt;br /&gt;
log(&#039;Thermostat returned Zone Info: &#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
log(&#039;Current Zone level:&#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
#reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when 0x6D #Thermostat Control Get Zone Heat Point Data&lt;br /&gt;
log(&#039;Thermostat returned Zone Info: &#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
log(&#039;Current Zone level:&#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
#reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when 0x19 # Status Report&lt;br /&gt;
# now to clear the currentcmd and remove command from the queue&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
&lt;br /&gt;
log(&#039;Processing 0x19 Status Report&#039;)&lt;br /&gt;
#This is where I get the database delta (in cmd1)&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
#First, to compare the DB Delta with current config.&lt;br /&gt;
#Database Delta...&lt;br /&gt;
delta = param[&#039;Parameter10&#039;].to_s&lt;br /&gt;
log($blue + &#039;Database Delta=&#039; + delta + $grey)&lt;br /&gt;
log($blue + &#039;Configuration is:&#039; + getdeltafromconfig(insID) + $grey)&lt;br /&gt;
if delta == getdeltafromconfig(insID)&lt;br /&gt;
if $children[insID] != nil&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
myDevTo = -1000 #DCE Router&lt;br /&gt;
myPriority = 1&lt;br /&gt;
myType = 2 #Event&lt;br /&gt;
&lt;br /&gt;
#Send an EVENT to report STATE ONLY if database has not changed&lt;br /&gt;
# AND child exists in pluto&lt;br /&gt;
reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Databse CHANGED -getting remote database&#039;)&lt;br /&gt;
#here, I have to WIPE the databse&lt;br /&gt;
# to prepare it for new data&lt;br /&gt;
### here is where the DAMN CONFIG was reset!!!&lt;br /&gt;
oldconfigstring = $childdatabases[insID][0]&lt;br /&gt;
$childdatabases[insID] = [oldconfigstring]&lt;br /&gt;
log(&#039;Setting Database Config&#039;)&lt;br /&gt;
$childdatabases[insID][0][6..7] = delta&lt;br /&gt;
savechilddatabases(insID)&lt;br /&gt;
sendRemoteGetLink(insID)&lt;br /&gt;
end&lt;br /&gt;
# finally, to check execute next command...&lt;br /&gt;
SndIns()&lt;br /&gt;
when 0x28 # Set Address MSB&lt;br /&gt;
log(&#039;Received SET Address MSB from remote device&#039;)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
$remoteLinkRecord = &#039;&#039;&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
when 0x2B # peek&lt;br /&gt;
### BUG HERE... have to verify response is a PEEK command&lt;br /&gt;
#response command is stored in parameter10&lt;br /&gt;
if param[&#039;Parameter10&#039;].hex == 0x2B # this is the peek command&lt;br /&gt;
cmdComplete&lt;br /&gt;
log(&#039;Received PEEK from remote Device! DATA=&#039; + param[&#039;Parameter11&#039;])&lt;br /&gt;
checkPeekData(param)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Waiting for remote PEEK response, but got :&#039; + param[&#039;Parameter10&#039;])&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when &#039;X10Msg&#039;&lt;br /&gt;
log($purple + &#039;X10 Message Received&#039; + $grey)&lt;br /&gt;
if param[&#039;Parameter4&#039;].hex == 0x00&lt;br /&gt;
log(&#039;This byte is a House/Unit Code&#039;)&lt;br /&gt;
hn = param[&#039;Parameter3&#039;][0].chr&lt;br /&gt;
ln = param[&#039;Parameter3&#039;][1].chr&lt;br /&gt;
$x10byte1 = $X10HouseCodes[hn]&lt;br /&gt;
$x10byte1 += $X10UnitCodes[ln]&lt;br /&gt;
log(&#039;Translated X10 House/Unit Code:&#039; + $x10byte1)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;This byte is a House/Command Code&#039;)&lt;br /&gt;
hn = param[&#039;Parameter3&#039;][0].chr&lt;br /&gt;
ln = param[&#039;Parameter3&#039;][1].chr&lt;br /&gt;
$x10byte2 = $X10HouseCodes[hn]&lt;br /&gt;
$x10byte2 += $X10CommandCodes[ln]&lt;br /&gt;
log(&#039;Translated X10 Command Code:&#039; + $x10byte2)&lt;br /&gt;
log(&#039;X10 Command ready to send:&#039; + $x10byte1 + &#039; &#039; + $x10byte2)&lt;br /&gt;
case $X10CommandCodes[ln]&lt;br /&gt;
when &#039;On&#039;&lt;br /&gt;
#Send ON to lmnce&lt;br /&gt;
if $children[$x10byte1] == nil&lt;br /&gt;
log(&#039;I do not control this X10 device&#039;)&lt;br /&gt;
else&lt;br /&gt;
cmd = Command.new($children[$x10byte1].to_i, -1000, 1, 1, 192)&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
when &#039;Off&#039;&lt;br /&gt;
#Send OFF to lmnce&lt;br /&gt;
if $children[$x10byte1] == nil&lt;br /&gt;
log(&#039;I do not control this X10 device&#039;)&lt;br /&gt;
else&lt;br /&gt;
cmd = Command.new($children[$x10byte1].to_i, -1000, 1, 1, 193)&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
when &#039;Bright&#039;&lt;br /&gt;
if $children[$x10byte1] == nil&lt;br /&gt;
log(&#039;I do not control this X10 device&#039;)&lt;br /&gt;
else&lt;br /&gt;
#send a command to set the state + 1&lt;br /&gt;
@curstate = ($state[$x10byte1] / 100) * 32 #get equal 32 steps&lt;br /&gt;
$state[$x10byte1] = ((@curstate + 1) / 32) * 100&lt;br /&gt;
cmd = Command.new($children[$x10byte1].to_i, -1000, 1, 1, 184)&lt;br /&gt;
cmd.params_[76] = $state[$x10byte1].to_s&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
#$state[$x10byte1] = ($state[$x10byte1] / 100) * 32&lt;br /&gt;
end&lt;br /&gt;
when &#039;Dim&#039;&lt;br /&gt;
@curstate = ($state[$x10byte1] / 100) * 32 #get equal 32 steps&lt;br /&gt;
$state[$x10byte1] = ((@curstate - 1) / 32) * 100&lt;br /&gt;
cmd = Command.new($children[$x10byte1].to_i, -1000, 1, 1, 184)&lt;br /&gt;
cmd.params_[76] = $state[$x10byte1].to_s&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
when &#039;All Lights Off&#039;&lt;br /&gt;
log(&#039;ALL Lights OFF Command not implemented&#039;)&lt;br /&gt;
when &#039;All Lights On&#039;&lt;br /&gt;
log(&#039;All Lights ON Command not implemented&#039;)&lt;br /&gt;
when &#039;Status Request&#039;&lt;br /&gt;
log(&#039;Status Request Command not implemented&#039;)&lt;br /&gt;
when &#039;Hail Ack&#039;&lt;br /&gt;
log(&#039;Hail Ack Command not implemented&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
when &#039;InsLnkSts&#039;&lt;br /&gt;
log(&#039;InsLnkSts Received&#039;)&lt;br /&gt;
&lt;br /&gt;
when &#039;BtnRpt&#039;&lt;br /&gt;
log(&#039;Button Report Received&#039;)&lt;br /&gt;
when &#039;UsrRst&#039;&lt;br /&gt;
log(&#039;User Reset Response Received&#039;)&lt;br /&gt;
when &#039;GrpEvntRpt&#039;&lt;br /&gt;
log(&#039;Group Event Report Received&#039;)&lt;br /&gt;
&lt;br /&gt;
when &#039;LnkData&#039;&lt;br /&gt;
processLnkData(param)&lt;br /&gt;
# Other messages&lt;br /&gt;
when &#039;PLMTimeout&#039;&lt;br /&gt;
log(&#039;PLM Timeout detected.. resetting EZBridge&#039;)&lt;br /&gt;
resetcmd = {&#039;Command&#039; =&amp;gt; &#039;Reset&#039;}&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(1, resetcmd)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(0,resetcmd)&lt;br /&gt;
end&lt;br /&gt;
sleep 15&lt;br /&gt;
$wAIT = false&lt;br /&gt;
SndIns()&lt;br /&gt;
when &#039;PLMEchoError&#039; # Have not seen this since a1.23&lt;br /&gt;
# error sending command to PLM, reset command and try again&lt;br /&gt;
log(&#039;-----XXXXXXX&#039; + param[&#039;Response&#039;])&lt;br /&gt;
resetcmd = {&#039;Command&#039; =&amp;gt; &#039;Reset&#039;}&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(1, resetcmd)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(0,resetcmd)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sleep 15&lt;br /&gt;
$wAIT = false&lt;br /&gt;
SndIns()&lt;br /&gt;
when &#039;LongAck&#039;&lt;br /&gt;
log(&#039;-----XXXXXXX&#039; + param[&#039;Response&#039;])&lt;br /&gt;
# Error - seems to show up after PLMEchoError&lt;br /&gt;
resetcmd = {&#039;Command&#039; =&amp;gt; &#039;Reset&#039;}&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(1, resetcmd)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(0,resetcmd)&lt;br /&gt;
end&lt;br /&gt;
sleep 15&lt;br /&gt;
$wAIT = false&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;-----XXXXXXX UNKNOWN Response Received&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
### Support routine for EZToDCE&lt;br /&gt;
def processLnkData(param)&lt;br /&gt;
#Caught a LnkData Response&lt;br /&gt;
log(&#039;LnkData Message Received&#039;)&lt;br /&gt;
log(param.inspect)&lt;br /&gt;
if param[&#039;Parameter6&#039;] == &#039;00&#039; and param[&#039;Parameter7&#039;] == &#039;00&#039;&lt;br /&gt;
log(&#039;FOUND X10 DEVICE!!!&#039;)&lt;br /&gt;
insteonID = padhex(param[&#039;Parameter5&#039;])&lt;br /&gt;
else&lt;br /&gt;
insteonID = padhex(param[&#039;Parameter5&#039;]) + &#039;.&#039; + padhex(param[&#039;Parameter6&#039;]) + &#039;.&#039; + padhex(param[&#039;Parameter7&#039;])&lt;br /&gt;
end&lt;br /&gt;
group = param[&#039;Parameter4&#039;]&lt;br /&gt;
recflags = param[&#039;Parameter3&#039;]&lt;br /&gt;
lnkdata1 = param[&#039;Parameter8&#039;]&lt;br /&gt;
lnkdata2 = param[&#039;Parameter9&#039;]&lt;br /&gt;
lnkdata3 = param[&#039;Parameter10&#039;]&lt;br /&gt;
#pack string to store for PLM Database&lt;br /&gt;
@currentrecord = recflags + group&lt;br /&gt;
@currentrecord += param[&#039;Parameter5&#039;] + param[&#039;Parameter6&#039;] + param[&#039;Parameter7&#039;]&lt;br /&gt;
@currentrecord += lnkdata1 + lnkdata2 + lnkdata3&lt;br /&gt;
&lt;br /&gt;
#Add to plmdatabase&lt;br /&gt;
$plmdatabase &amp;lt;&amp;lt; @currentrecord&lt;br /&gt;
log(&#039;record Flags:&#039; + recflags)&lt;br /&gt;
#log(&#039;PLM database=&#039; +$plmdatabase.inspect)&lt;br /&gt;
if (recflags[0] &amp;amp; 0x80) == 0x80 # Record is in use if true&lt;br /&gt;
end&lt;br /&gt;
if (recflags[0] &amp;amp; 0x40) == 0x40 # Controller if true&lt;br /&gt;
log(&#039;Controller&#039;)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Responder&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
log(&#039;Insteon ID:&#039; + insteonID + &#039;, Group:&#039; + group)&lt;br /&gt;
&lt;br /&gt;
cmdComplete&lt;br /&gt;
sendGetNext()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
### Support Routine for EZToDCE&lt;br /&gt;
def processExternalCommand(param)&lt;br /&gt;
#there is no current command&lt;br /&gt;
# THIS IS COMING FROM AN OUTSIDE SOURCE&lt;br /&gt;
#EG: Manually turning Light Switch On/Off&lt;br /&gt;
# process this command.&lt;br /&gt;
# Note, this is a standard message&lt;br /&gt;
### have to check here if child is mine!&lt;br /&gt;
&lt;br /&gt;
# This is where I have to check for a broadcast command..&lt;br /&gt;
#if so, search the child databases for responders,&lt;br /&gt;
#and fire events for each responder.&lt;br /&gt;
#Message flag is in parameter9 Group command 0xCx (All-Link Broadcast Message Pg 42.)&lt;br /&gt;
#Group is in parameter8&lt;br /&gt;
#From InsteonID is parameters 3, 4, 5&lt;br /&gt;
if (param[&#039;Parameter9&#039;].hex &amp;amp; 0xC0) == 0xC0 # Message is Broadcast&lt;br /&gt;
log(&#039;Rerouting to processBroadcastMessage&#039;)&lt;br /&gt;
processBroadcastMessage(param)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Process External Command:&#039;)&lt;br /&gt;
log(&#039;Param:&#039; + param.inspect)&lt;br /&gt;
&lt;br /&gt;
# there is no ack here. Simply Send COMMANDS back to DCE&lt;br /&gt;
# and Complete the recv..&lt;br /&gt;
case param[&#039;Parameter10&#039;].hex #this is the command&lt;br /&gt;
when 0x01 #Assign to Group&lt;br /&gt;
log(&#039;Caught EXTERNAL Assign to Group&#039;)&lt;br /&gt;
processDeviceInfo(param)&lt;br /&gt;
recvComplete&lt;br /&gt;
when 0x02 #Delete from Group&lt;br /&gt;
when 0x02 #Delete from Group&lt;br /&gt;
log(&#039;Caught EXTERNAL Delete from Group&#039;)&lt;br /&gt;
recvComplete&lt;br /&gt;
when 0x10 # PING&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon PING result&#039;)&lt;br /&gt;
recvComplete&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when 0x11 #ON&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon ON command result&#039;)&lt;br /&gt;
#on level is in cmd2&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
log(&#039;From:&#039; +insID)&lt;br /&gt;
log(&#039;Device:&#039; + $children[insID].to_s)&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
# check to see if I own child&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
end&lt;br /&gt;
recvComplete&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when 0x13 #OFF&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon OFF result&#039;)&lt;br /&gt;
#on level is in cmd2&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
reportStatus(myDevFrom, 0)&lt;br /&gt;
&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
end&lt;br /&gt;
recvComplete&lt;br /&gt;
&lt;br /&gt;
when 0x6A #Thermostat Zone Command&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon Thermostat result&#039;)&lt;br /&gt;
#on level is in cmd2&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
#case param[&#039;Parameter11&#039;].to_s&lt;br /&gt;
#when &#039;00&#039;&lt;br /&gt;
reportStatus(myDevFrom, hextoTempurature(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
#when &#039;60&#039; #humidity&lt;br /&gt;
#when &#039;20&#039;#setpoint&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 0x6B #Thermostat Mode Command&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon Thermostat result&#039;)&lt;br /&gt;
#on level is in cmd2 ie( HEAT(0x04), COOL(0x05), or AUTO(0x06))&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
#reportStatus(myDevFrom, 0)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 0x6C #Thermostat Zone Cool Command&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon Thermostat result&#039;)&lt;br /&gt;
#on level is in cmd2&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
reportStatus(myDevFrom, hextoTempurature(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 0x6D #Thermostat Zone Heat Command&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon Thermostat result&#039;)&lt;br /&gt;
#on level is in cmd2&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
reportStatus(myDevFrom, hextoTempurature(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when 0x15; log(&#039;Caught EXTERNAL Insteon Brighten Result&#039;)&lt;br /&gt;
when 0x16; log(&#039;Caught EXTERNAL Insteon DIM Result&#039;)&lt;br /&gt;
when 0x24; log(&#039;Caught EXTERNAL Insteon DO EE READ&#039;)&lt;br /&gt;
when 0x28; log(&#039;Caught EXTERNAL Insteon SET ADDRESS MSB&#039;)&lt;br /&gt;
when 0x29; log(&#039;Caught EXTERNAL Insteon POKE&#039;)&lt;br /&gt;
when 0x2A; log(&#039;Caught EXTERNAL Insteon POKE EXTENDED&#039;)&lt;br /&gt;
when 0x2B; log(&#039;Caught EXTERNAL Insteon PEEK&#039;)&lt;br /&gt;
when 0x2C; log(&#039;Caught EXTERNAL Insteon PEEK INTERNAL&#039;)&lt;br /&gt;
when 0x2D; log(&#039;Caught EXTERNAL Insteon POKE INTERNAL&#039;)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Unknown EXTERNAL Insteon Command.&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
### Support Routine for EZToDCE&lt;br /&gt;
def processACK(param)&lt;br /&gt;
#log(&#039;In ProcessACK: Param7:&#039; + param[&#039;Parameter7&#039;])&lt;br /&gt;
#log(&#039;CurrentCmd=&#039; + $currentcmd.to_s)&lt;br /&gt;
case param[&#039;Parameter7&#039;].hex #Received an ack to THIS command&lt;br /&gt;
when 0x1 #Assign to Group&lt;br /&gt;
log(&#039;Got Assign to Group ACK&#039;)&lt;br /&gt;
$currentcmd = 0x01&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
#processDeviceInfo(param)&lt;br /&gt;
#cmdComplete&lt;br /&gt;
when 0x2 #Delete from Group&lt;br /&gt;
when 0x10 # PING&lt;br /&gt;
log(&#039;Got PING ACK&#039;)&lt;br /&gt;
#cmdComplete&lt;br /&gt;
$currentcmd = 0x1&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x11 #ON&lt;br /&gt;
$currentcmd = 0x11&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x13 #OFF&lt;br /&gt;
$currentcmd = 0x13&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x6A #Thermostat Zone Command&lt;br /&gt;
$currentcmd = 0x6A&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x6B #Thermostat Control Command&lt;br /&gt;
$currentcmd = 0x6B&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x6C #Thermostat Cool Command&lt;br /&gt;
$currentcmd = 0x6C&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x6D #Thermostat Cool Command&lt;br /&gt;
$currentcmd = 0x6D&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x15 #Bright&lt;br /&gt;
$currentcmd = 0x15&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x16 #DIM&lt;br /&gt;
$currentcmd = 0x16&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x17 #Start Manual Change&lt;br /&gt;
when 0x18 #Stop Manual Change&lt;br /&gt;
when 0x19 #Status Request&lt;br /&gt;
# Status Request Acked - get ready for InsStdMsg&lt;br /&gt;
$currentcmd = 0x19&lt;br /&gt;
# change cmd to reflect InsStdMsg&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x24&lt;br /&gt;
log(&#039;Caught ACK for Insteon DO EE READ&#039;)&lt;br /&gt;
$currentcmd = 0x24&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x28&lt;br /&gt;
log(&#039;Caught ACK for Insteon SET ADDRESS MSB&#039;)&lt;br /&gt;
$currentcmd = 0x28&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when 0x29&lt;br /&gt;
log(&#039;Caught ACK for Insteon POKE&#039;)&lt;br /&gt;
$currentcmd = 0x29&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when 0x2A&lt;br /&gt;
log(&#039;Caught ACK for Insteon POKE EXTENDED&#039;)&lt;br /&gt;
$currentcmd = 0x2A&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when 0x2B&lt;br /&gt;
#log(&#039;Caught ACK for Insteon PEEK&#039;)&lt;br /&gt;
$currentcmd = 0x2B&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when 0x2C&lt;br /&gt;
log(&#039;Caught ACK for Insteon PEEK INTERNAL&#039;)&lt;br /&gt;
$currentcmd = 0x2C&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when 0x2D&lt;br /&gt;
log(&#039;Caught ACK for Insteon POKE INTERNAL&#039;)&lt;br /&gt;
$currentcmd = 0x2D&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Unknown Insteon Cmd1&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def checkPeekData(param)&lt;br /&gt;
&lt;br /&gt;
$remoteLinkRecord += param[&#039;Parameter11&#039;].hex.chr&lt;br /&gt;
log(&#039;CURRENT REMOTE RECORD IS:&#039;)&lt;br /&gt;
debug($remoteLinkRecord)&lt;br /&gt;
if $remoteLinkRecord.length == 8&lt;br /&gt;
log(&#039;REMOTE RECORD COMPLETE!&#039;)&lt;br /&gt;
processRemoteRecord(param)&lt;br /&gt;
$remoteLinkRecord = &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def processRemoteRecord(param)&lt;br /&gt;
#have to find MY address&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = padhex(insHb) + &amp;quot;.&amp;quot; + padhex(insMb) + &amp;quot;.&amp;quot; + padhex(insLb)&lt;br /&gt;
&lt;br /&gt;
log(&#039;Processing remote Record below:&#039;)&lt;br /&gt;
&lt;br /&gt;
@flags = &amp;quot;\nFrom Device:&amp;quot; + insID + &amp;quot;\nFlags:\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if ($remoteLinkRecord[0] &amp;amp; 0x02) == 0x02 # High water mark&lt;br /&gt;
@flags += &amp;quot;Not the last record\n&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
@flags += &amp;quot;This IS the last record\n&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if ($remoteLinkRecord[0] &amp;amp; 0x80) == 0x80 # Record is in use&lt;br /&gt;
@flags += &amp;quot;Record In Use\n&amp;quot;&lt;br /&gt;
if ($remoteLinkRecord[0] &amp;amp; 0x40) == 0x40 # Controller/Responder&lt;br /&gt;
@flags += &amp;quot;I am a Controller of &amp;quot;&lt;br /&gt;
else&lt;br /&gt;
@flags += &amp;quot;I am a Responder of &amp;quot;&lt;br /&gt;
end&lt;br /&gt;
@insteonID = padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[2]) + &#039;.&#039;&lt;br /&gt;
@insteonID += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[3]) + &#039;.&#039;&lt;br /&gt;
@insteonID += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[4])&lt;br /&gt;
&lt;br /&gt;
@group = &amp;quot;%X&amp;quot; %$remoteLinkRecord[1]&lt;br /&gt;
@flags += @insteonID + &amp;quot; Group:&amp;quot; + @group&lt;br /&gt;
@work = padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[0]) #Control byte&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[1]) # Group&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[2]) # ID HB&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[3]) # ID MB&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[4]) # ID LB&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[5]) # Data1&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[6]) # Data2&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[7]) # Data3&lt;br /&gt;
log(&#039;adding to:&#039; + insID)&lt;br /&gt;
log(&#039;Value:&#039; + @work)&lt;br /&gt;
$childdatabases[insID] &amp;lt;&amp;lt; @work #add it to the database&lt;br /&gt;
# log(&#039;Current Database:&#039; + $childdatabases.inspect)&lt;br /&gt;
#now to save the database to configuration.&lt;br /&gt;
savechilddatabases(insID)&lt;br /&gt;
# Now to check to see if the child exists as a record&lt;br /&gt;
if $childdatabases[@insteonID] == nil&lt;br /&gt;
log(&#039;InsteonID is NEW, adding Child database entry&#039;)&lt;br /&gt;
$childdatabases[@insteonID] = [&#039;****************&#039;]&lt;br /&gt;
$rerun = true&lt;br /&gt;
sendAddtoPLM(@insteonID)&lt;br /&gt;
sendPing(@insteonID)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;InsteonID:&#039; + @insteonID.to_s + &#039;seems to exist in child databases&#039;)&lt;br /&gt;
log(&#039;CDB:&#039; + $childdatabases.inspect)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
@flags += &amp;quot;Record NOT in use\n&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
log($aqua + @flags + $grey)&lt;br /&gt;
log2(@flags)&lt;br /&gt;
if ($remoteLinkRecord[0] &amp;amp; 0x02) == 0x02&lt;br /&gt;
sendRemoteGetNext(insID)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def savechilddatabases(insteonID)&lt;br /&gt;
#This takes the $childdatabase hash+array and encodes it to&lt;br /&gt;
# save it as a string.&lt;br /&gt;
@work = &#039;&#039;&lt;br /&gt;
#log($yellow + &#039;SaveChildDatabases::nitems:&#039; + $childdatabases[insteonID].nitems.to_s)&lt;br /&gt;
#log($childdatabases[insteonID].inspect + $grey)&lt;br /&gt;
$childdatabases[insteonID].each{|record|&lt;br /&gt;
@work += record&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#now to save the string...&lt;br /&gt;
setdeviceconfig(insteonID, @work)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
def sendPing(insteonID)&lt;br /&gt;
insID = insteonID.split(&#039;.&#039;)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;10&#039;, #ID Request&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
log(&#039;PING Sent!&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def getdevicetemplate(cat, subcat)&lt;br /&gt;
&lt;br /&gt;
log(&#039;Entered getdevicetemplate, Cat=&#039; + cat.to_s + &#039;, subcat = &#039; + subcat.to_s)&lt;br /&gt;
@templid = 0&lt;br /&gt;
case cat.hex&lt;br /&gt;
when 0x0 # Generalized Controllers&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x04; log(&#039;Found ControLinc [2430]&#039;)&lt;br /&gt;
when 0x05; log(&#039;Found RemoteLinc [2440]&#039;)&lt;br /&gt;
when 0x06; log(&#039;Found Icon Tabletop Controller [2830]&#039;)&lt;br /&gt;
when 0x09; log(&#039;Found SignaLinc RF Signal Enhancer [2442]&#039;)&lt;br /&gt;
when 0x0A; log(&#039;Found Balboa Instruments Poolux LCD Controller&#039;)&lt;br /&gt;
when 0x0B; log(&#039;Found Access Point [2443]&#039;)&lt;br /&gt;
when 0x0C; log(&#039;Found IES Color Touchscreen&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x01 # Dimmable Lighting Control&lt;br /&gt;
# all these devices are associated with Template 38&lt;br /&gt;
# Light Switch (dimmable)&lt;br /&gt;
@templid = 38&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00; log(&#039;Found LampLinc V2 [2456D3]&#039;)&lt;br /&gt;
when 0x01; log(&#039;Found SwitchLinc V2 Dimmer 600W [2476D]&#039;)&lt;br /&gt;
when 0x02; log(&#039;Found In-LineLinc Dimmer [2475D]&#039;)&lt;br /&gt;
when 0x03; log(&#039;Found Icon Switch Dimmer [2876D]&#039;)&lt;br /&gt;
when 0x04; log(&#039;Found SwitchLinc V2 Dimmer 1000W [2476DH]&#039;)&lt;br /&gt;
when 0x06; log(&#039;Found LampLinc 2-pin [2456D2]&#039;)&lt;br /&gt;
when 0x07; log(&#039;Found Icon LampLinc V2 2-pin [2456D2]&#039;)&lt;br /&gt;
when 0x09; log(&#039;Found KeypadLinc Dimmer [2486D]&#039;)&lt;br /&gt;
when 0x0A; log(&#039;Found Icon In-Wall Controller [2886D]&#039;)&lt;br /&gt;
when 0x0D; log(&#039;Found SocketLinc [2454D]&#039;)&lt;br /&gt;
when 0x13; log(&#039;Found Icon SwitchLinc Dimmer for Lixar/Bell Canada [2676D-B]&#039;)&lt;br /&gt;
when 0x17; log(&#039;Found ToggleLinc Dimmer [2466D]&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x02 # Switched Lighting Control&lt;br /&gt;
# all these devices are associated with Template 37&lt;br /&gt;
# Light Switch (ON/OFF)&lt;br /&gt;
@templid = 37&lt;br /&gt;
case subcat.hex&lt;br /&gt;
&lt;br /&gt;
when 0x09; log(&#039;Found ApplianceLinc [2456S3]&#039;)&lt;br /&gt;
when 0x0A; log(&#039;Found SwitchLinc Relay [2476S]&#039;)&lt;br /&gt;
when 0x0B; log(&#039;Found Icon On Off Switch [2876S]&#039;)&lt;br /&gt;
when 0x0C; log(&#039;Found Icon Appliance Adapter [2856S3]&#039;)&lt;br /&gt;
when 0x0D; log(&#039;Found ToggleLinc Relay [2466S]&#039;)&lt;br /&gt;
when 0x0E; log(&#039;Found Switchlinc Relay Countdown Timer [2476ST]&#039;)&lt;br /&gt;
when 0x10; log(&#039;Found In-LineLinc Relay [2475D]&#039;)&lt;br /&gt;
when 0x13; log(&#039;Found Icon SwitchLinc Relay for Lixar/Bell Canada [2676R-B]&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x03 # Network Bridges&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x01; log(&#039;Found PowerLinc Serial [2414S]&#039;)&lt;br /&gt;
when 0x02; log(&#039;Found PowerLinc USB [2414U]&#039;)&lt;br /&gt;
when 0x03; log(&#039;Found Icon PowerLinc Serial [2814S]&#039;)&lt;br /&gt;
when 0x04; log(&#039;Found Icon PowerLinc USB [2814U]&#039;)&lt;br /&gt;
when 0x05; log(&#039;Found Smartlabs Power Line Modem Serial [2412S]&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x04 # Irrigation Control&lt;br /&gt;
# all these devices are associated with Template 1780&lt;br /&gt;
# Standard Irrigation Sprinkler&lt;br /&gt;
@templid = 1780&lt;br /&gt;
case subcat.hex&lt;br /&gt;
&lt;br /&gt;
when 0x00; log(&#039;Found Simplehomenet EZRain1 Sprinkler Controller&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x05 # Climate Control&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00; log(&#039;Found Broan SMSC080 Exhaust Fan&#039;)&lt;br /&gt;
when 0x01; log(&#039;Found Simplehomenet EZTherm&#039;)&lt;br /&gt;
when 0x02; log(&#039;Found Broan SMSC110 Exhaust Fan&#039;)&lt;br /&gt;
when 0x03&lt;br /&gt;
log(&#039;Found Venstar RF Thermostat Module&#039;)&lt;br /&gt;
@templid = 2197 #Set Template&lt;br /&gt;
when 0x04; log(&#039;Found Simplehomenet EZStat Thermostat&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x06 # Pool and Spa Control&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00; log(&#039;Found Simplehomenet EZPool&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x07 # Sensors and Actuators&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x08 # Home Entertainment&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x09 # Energy Management&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0A # Built-In Appliance Control&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0B # Plumbing&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0C # Communication&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0D # Computer Control&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0E # Window Coverings&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0F # Access Control&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x10 # Security, Health, and Safety&lt;br /&gt;
when 0x11 # Surveillance&lt;br /&gt;
when 0x12 # Automotive&lt;br /&gt;
when 0x13 # Pet care&lt;br /&gt;
when 0x14 # Toys&lt;br /&gt;
when 0x15 # Timekeeping&lt;br /&gt;
when 0x16 # Holiday&lt;br /&gt;
end&lt;br /&gt;
return @templid&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def processDeviceInfo(param)&lt;br /&gt;
### temporary&lt;br /&gt;
### 12-24-07 Adding Device Template compatibility..&lt;br /&gt;
#have to find MY address&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
&lt;br /&gt;
insID = padhex(insHb) + &amp;quot;.&amp;quot; + padhex(insMb) + &amp;quot;.&amp;quot; + padhex(insLb)&lt;br /&gt;
#set the devicecat and device subcat in the childdatabases&lt;br /&gt;
# 0-1 Device Category&lt;br /&gt;
# 2-3 Device SubCategory&lt;br /&gt;
# 4-5 Device Firmware&lt;br /&gt;
log(&#039;proccessDeviceInfo:Insteon ID&#039; + insID)&lt;br /&gt;
$childdatabases[insID][0][0..1] = param[&#039;Parameter6&#039;]&lt;br /&gt;
$childdatabases[insID][0][2..3] = param[&#039;Parameter7&#039;]&lt;br /&gt;
$childdatabases[insID][0][4..5] = param[&#039;Parameter8&#039;]&lt;br /&gt;
savechilddatabases(insID)&lt;br /&gt;
log(&#039;InsteonID: &#039; + insID)&lt;br /&gt;
#log(&#039;Child Config AFTER update:&#039; + $childdatabases[insID][0].to_s)&lt;br /&gt;
log($yellow)&lt;br /&gt;
@template = getdevicetemplate(param[&#039;Parameter6&#039;], param[&#039;Parameter7&#039;])&lt;br /&gt;
$devicetemplate[insID] = @template&lt;br /&gt;
log(&#039;Template ID:&#039; + @template.to_s)&lt;br /&gt;
### eventually, open a XML configuration script?&lt;br /&gt;
### or read saved data from mysql?&lt;br /&gt;
### most likely save this information to sql with device.&lt;br /&gt;
### eventually, IPKDB will be available to ping.&lt;br /&gt;
log(&#039;for Insteon ID:&#039; + insID)&lt;br /&gt;
log($grey)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def recvComplete&lt;br /&gt;
# Clears the wait flag, but does not remove a command from the queue&lt;br /&gt;
$wAIT = false&lt;br /&gt;
log($green + &amp;quot;Receive Completed. Checking command queue&amp;quot; + $grey)&lt;br /&gt;
if $cmdqueue.nitems &amp;gt; 0 then&lt;br /&gt;
log(&amp;quot;Queue:&amp;quot; + $aqua + $cmdqueue.nitems.to_s + $grey + &amp;quot; : executing next command&amp;quot;)&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log($yellow + &#039;Queue Empty.&#039; + $grey)&lt;br /&gt;
if $rerun == true&lt;br /&gt;
log(&#039;RERUN=TRUE, RESTARTING&#039;)&lt;br /&gt;
$rerun = false&lt;br /&gt;
mainRestart()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;RERUN Not needed. Checking if reported..&#039;)&lt;br /&gt;
#report Child devices here.&lt;br /&gt;
if $reported == false&lt;br /&gt;
log(&#039;Reporting Child Devices&#039;)&lt;br /&gt;
@work = &amp;quot;&amp;quot;&lt;br /&gt;
$childdatabases.each_key{&lt;br /&gt;
|insteonID|&lt;br /&gt;
log(&#039;Child:&#039; + insteonID)&lt;br /&gt;
log(&#039;Config:&#039; + $childdatabases[insteonID].inspect)&lt;br /&gt;
@template = $devicetemplate[insteonID]&lt;br /&gt;
@work += insteonID + &amp;quot;\t\t\t&amp;quot; + @template.to_s + &amp;quot;\t\n&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
log(@work)&lt;br /&gt;
cmd = Command.new(device_.devid_, -1001, 1, 2, 54)&lt;br /&gt;
cmd.params_[13] = @work&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
&lt;br /&gt;
$reported = true&lt;br /&gt;
else&lt;br /&gt;
log(&#039;report not needed&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
def removecurrentcommand&lt;br /&gt;
#get the current child&lt;br /&gt;
log(&#039;in RemoveCurrentCommand&#039;)&lt;br /&gt;
log(&#039;Current Command:&#039; + $cmdqueue[0].inspect)&lt;br /&gt;
#id is in param123&lt;br /&gt;
@id = $cmdqueue[0][&#039;Parameter1&#039;]&lt;br /&gt;
@id += &#039;.&#039; + $cmdqueue[0][&#039;Parameter2&#039;]&lt;br /&gt;
@id += &#039;.&#039; + $cmdqueue[0][&#039;Parameter3&#039;]&lt;br /&gt;
log(&#039;ID=&#039; + @id)&lt;br /&gt;
#now to remove from child and PLM databases&lt;br /&gt;
removefromchild(@id)&lt;br /&gt;
removefromplm(@id)&lt;br /&gt;
cmdComplete&lt;br /&gt;
end&lt;br /&gt;
def cmdComplete&lt;br /&gt;
# Clears the wait flag, and removes the command from the queue.&lt;br /&gt;
$wAIT = false&lt;br /&gt;
$resetNext = 0&lt;br /&gt;
$cmdqueue.delete_at(0)&lt;br /&gt;
# now that THAT command is completed, check to see if there is&lt;br /&gt;
# another command ready to transmit.&lt;br /&gt;
log($green + &amp;quot;Command Completed.&amp;quot; + $grey)&lt;br /&gt;
end&lt;br /&gt;
def checkWait(param)&lt;br /&gt;
#Checks for response from current command.&lt;br /&gt;
if $cmdqueue[0] != nil&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
#log(&#039;CW:waiting for command to complete&#039;)&lt;br /&gt;
else&lt;br /&gt;
#log(&#039;CW:reports clear&#039;)&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
log(&#039;------:)----checkWait: command queue is emtpy&#039;)&lt;br /&gt;
if $wAIT == true #this should never happen&lt;br /&gt;
log(&#039;------:(XXX-CheckWait: TRUE&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def plmparse(value)&lt;br /&gt;
#THIS ROUTINE REPLACES parsestring()&lt;br /&gt;
#this routine will PARSE the incoming stream into valid messages&lt;br /&gt;
# value is the complete command&lt;br /&gt;
param = {}&lt;br /&gt;
#here is a special case, the PLM seems to lock up.&lt;br /&gt;
if value == 0x15.chr&lt;br /&gt;
log(&#039;The PLM stopped responding&#039;)&lt;br /&gt;
log(&#039;Please unplug it, and plug it back in&#039;)&lt;br /&gt;
log(&#039;and do a quick reload router.&#039;)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
while value.length &amp;gt; 2&lt;br /&gt;
case value[1]&lt;br /&gt;
when 0x62 # Special case, need to look at flags&lt;br /&gt;
if (value[5] &amp;amp; 0x10) == 0x10 # check for extended flag&lt;br /&gt;
cmdlen = 23&lt;br /&gt;
else&lt;br /&gt;
cmdlen = 9&lt;br /&gt;
end&lt;br /&gt;
param[&#039;Response&#039;] = &#039;SndIns&#039;&lt;br /&gt;
when 0x50; cmdlen = 11; param[&#039;Response&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x51; cmdlen = 25; param[&#039;Response&#039;] = &#039;InsExtMsg&#039;&lt;br /&gt;
when 0x68; cmdlen = 4 #Set Insteon ACK Message Byte&lt;br /&gt;
when 0x71; cmdlen = 5 #Set Insteon ACK Message Two Bytes&lt;br /&gt;
when 0x70; cmdlen = 4 #Set Insteon NACK Message Byte&lt;br /&gt;
when 0x63; cmdlen = 5; param[&#039;Response&#039;] = &#039;SndX10&#039;&lt;br /&gt;
when 0x52; cmdlen = 4; param[&#039;Response&#039;] = &#039;X10Msg&#039;&lt;br /&gt;
when 0x61; cmdlen = 6; param[&#039;Response&#039;] = &#039;SndGrp&#039;&lt;br /&gt;
when 0x56; cmdlen = 7; param[&#039;Response&#039;] = &#039;GrpEvntRpt&#039;&lt;br /&gt;
when 0x58; cmdlen = 3 #All-Link Cleanup Status Report&lt;br /&gt;
when 0x64; cmdlen = 5; param[&#039;Response&#039;] = &#039;StLnk&#039;&lt;br /&gt;
when 0x65; cmdlen = 3; param[&#039;Response&#039;] = &#039;CancelLnk&#039;&lt;br /&gt;
when 0x53; cmdlen = 10; param[&#039;Response&#039;] = &#039;InsLnkSts&#039;&lt;br /&gt;
when 0x69; cmdlen = 3; param[&#039;Response&#039;] = &#039;GetLnk&#039;&lt;br /&gt;
when 0x6A; cmdlen = 3; param[&#039;Response&#039;] = &#039;GetNext&#039;&lt;br /&gt;
when 0x6C; cmdlen = 3 #Get All-Link Record for Sender&lt;br /&gt;
when 0x57; cmdlen = 10; param[&#039;Response&#039;] = &#039;LnkData&#039;&lt;br /&gt;
when 0x6F; cmdlen = 12; param[&#039;Response&#039;] = &#039;MngLnk&#039;&lt;br /&gt;
when 0x67; cmdlen = 3; param[&#039;Response&#039;] = &#039;RstPLM&#039;&lt;br /&gt;
when 0x6B; cmdlen = 4; param[&#039;Response&#039;] = &#039;SetCfg&#039;&lt;br /&gt;
when 0x60; cmdlen = 9; param[&#039;Response&#039;] = &#039;GetVersion&#039;&lt;br /&gt;
when 0x66; cmdlen = 6 #Set Host Device Category&lt;br /&gt;
when 0x72; cmdlen = 3 # RF Sleep&lt;br /&gt;
when 0x54; cmdlen = 3; param[&#039;Response&#039;] = &#039;BtnRpt&#039;&lt;br /&gt;
when 0x6D; cmdlen = 3; param[&#039;Response&#039;] = &#039;LEDON&#039;&lt;br /&gt;
when 0x6E; cmdlen = 3; param[&#039;Response&#039;] = &#039;LEDOFF&#039;&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
log(&#039;ERROR IN PLMPARSE- Unknown Command&#039;)&lt;br /&gt;
debug(value)&lt;br /&gt;
&lt;br /&gt;
return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
#Now we know the length the command should be, see if we have it.&lt;br /&gt;
#log(&#039;waiting for &#039; + cmdlen.to_s + &#039; characters...&#039;)&lt;br /&gt;
#log(&#039;length of current input is &#039; + value.length.to_s)&lt;br /&gt;
if value.length &amp;gt;= cmdlen&lt;br /&gt;
#log(&#039;GOT whole response&#039;)&lt;br /&gt;
#Yes, we have the whole command, Pack it in param&lt;br /&gt;
for byt in 1..cmdlen&lt;br /&gt;
param[&#039;Parameter&#039; + byt.to_s] = padhex(&amp;quot;%X&amp;quot; %value[byt - 1])&lt;br /&gt;
end&lt;br /&gt;
#now remove it from the string..&lt;br /&gt;
value = value.slice(cmdlen, value.length - cmdlen)&lt;br /&gt;
#Send it off for parsing&lt;br /&gt;
#log(&#039;Sending to EZToDCE:&#039; + param.inspect.to_s)&lt;br /&gt;
EZToDCE(param)&lt;br /&gt;
else&lt;br /&gt;
#log(&#039;Still waiting...&#039;)&lt;br /&gt;
#no, we have NOT received the whole command.&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
return value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def rawX10(value)&lt;br /&gt;
&lt;br /&gt;
x10MSN = $X10HouseCodes.index[value[0..0]]&lt;br /&gt;
x10LSN = $X10UnitCodes.index[value[1..1]]&lt;br /&gt;
return x10MSN + x10LSN&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def X10Flag(value)&lt;br /&gt;
return + $X10CommandCodes.index[Value] + &#039;0&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def SndIns&lt;br /&gt;
# create a new PLM command for SndIns&lt;br /&gt;
if $wAIT == false&lt;br /&gt;
#log(&#039;SndIns:currentcmd=&#039; + $currentcmd.to_s)&lt;br /&gt;
&lt;br /&gt;
if $cmdqueue.nitems &amp;gt; 0&lt;br /&gt;
log(&amp;quot;SndIns:Queue:&amp;quot; + $aqua + $cmdqueue.nitems.to_s + $grey)&lt;br /&gt;
#log(&#039;SndIns:&#039; + $cmdqueue.inspect)&lt;br /&gt;
param = $cmdqueue[0]&lt;br /&gt;
### have to figure out the command byte 2 here&lt;br /&gt;
work = &#039;02&#039;.hex.chr + plmcommand(param)&lt;br /&gt;
### PLM command compilation&lt;br /&gt;
for loop in 2..param.keys.nitems&lt;br /&gt;
@dummy = param[&#039;Parameter&#039; + (loop - 1).to_s].to_s&lt;br /&gt;
work+= @dummy.hex.chr&lt;br /&gt;
end&lt;br /&gt;
conn_.Reconnect()&lt;br /&gt;
debugout(work)&lt;br /&gt;
conn_.Send(work)&lt;br /&gt;
#sleep 0.1&lt;br /&gt;
$wAIT = TRUE&lt;br /&gt;
else&lt;br /&gt;
log($yellow + &#039;Queue Empty.&#039; + $grey)&lt;br /&gt;
if $rerun == true&lt;br /&gt;
log(&#039;RERUN=TRUE, RESTARTING&#039;)&lt;br /&gt;
$rerun = false&lt;br /&gt;
mainRestart()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;RERUN Not needed&#039;)&lt;br /&gt;
if $reported == false&lt;br /&gt;
log(&#039;Reporting Child Devices&#039;)&lt;br /&gt;
@work = &amp;quot;&amp;quot;&lt;br /&gt;
$childdatabases.each_key{&lt;br /&gt;
|insteonID|&lt;br /&gt;
log(&#039;Child:&#039; + insteonID)&lt;br /&gt;
log(&#039;Config:&#039; + $childdatabases[insteonID].inspect)&lt;br /&gt;
@template = $devicetemplate[insteonID]&lt;br /&gt;
@work += insteonID + &amp;quot;\t\t\t&amp;quot; + @template.to_s + &amp;quot;\t\n&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
log(@work)&lt;br /&gt;
cmd = Command.new(device_.devid_, -1001, 1, 2, 54)&lt;br /&gt;
cmd.params_[13] = @work&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
&lt;br /&gt;
$reported = true&lt;br /&gt;
else&lt;br /&gt;
log(&#039;report not needed&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
log(&#039;X-----------SndIns: Waiting for response to:&#039; + $cmdqueue[0][&#039;Command&#039;].to_s)&lt;br /&gt;
log(&#039;X-----------SndIns: Current Queue Length:&#039; + $cmdqueue.nitems.to_s)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
def plmcommand(param)&lt;br /&gt;
### this returns the proper Byte2 for the command.&lt;br /&gt;
case param[&#039;Command&#039;]&lt;br /&gt;
when &#039;GetVersion&#039;; return 0x60.chr&lt;br /&gt;
when &#039;SndIns&#039;; return 0x62.chr&lt;br /&gt;
when &#039;SndGrp&#039;; return 0x61.chr&lt;br /&gt;
when &#039;SndX10&#039;; return 0x63.chr&lt;br /&gt;
when &#039;GetLnk&#039;; return 0x69.chr&lt;br /&gt;
when &#039;GetNext&#039;; return 0x6A.chr&lt;br /&gt;
when &#039;BtnRpt&#039;; return 0x54.chr&lt;br /&gt;
when &#039;GetCfg&#039;; return 0x73.chr&lt;br /&gt;
when &#039;StLnk&#039;; return 0x64.chr&lt;br /&gt;
when &#039;CancelLnk&#039;; return 0x65.chr&lt;br /&gt;
when &#039;MngLnk&#039;; return 0x6F.chr&lt;br /&gt;
when &#039;RstPLM&#039;; return 0x67.chr&lt;br /&gt;
when &#039;SetCfg&#039;; return 0x6B.chr&lt;br /&gt;
when &#039;LEDON&#039;; return 0x6D.chr&lt;br /&gt;
when &#039;LEDOFF&#039;; return 0x6E.chr&lt;br /&gt;
## hack&lt;br /&gt;
when &#039;InsStdMsg&#039;&lt;br /&gt;
log(&#039;ERROR:PLMCommand encountered a COMMAND of INSSTDMSG&#039;)&lt;br /&gt;
break&lt;br /&gt;
return 0x62.chr&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def debug(text)&lt;br /&gt;
work = &#039;DEBUG:&#039;&lt;br /&gt;
&lt;br /&gt;
for c in 1..text.length&lt;br /&gt;
work += padhex(&amp;quot;%X&amp;quot; %text[c-1]) + &#039; &#039;&lt;br /&gt;
end&lt;br /&gt;
log($yellow + work + &amp;quot;Length:&amp;quot; + text.length.to_s + $grey)&lt;br /&gt;
end&lt;br /&gt;
def debugout(text)&lt;br /&gt;
work = &#039;out:&#039;&lt;br /&gt;
&lt;br /&gt;
for c in 1..text.length&lt;br /&gt;
work += padhex(&amp;quot;%X&amp;quot; %text[c-1]) + &#039; &#039;&lt;br /&gt;
end&lt;br /&gt;
log($green + work + &amp;quot;Length:&amp;quot; + text.length.to_s + $grey)&lt;br /&gt;
end&lt;br /&gt;
def debugin(text)&lt;br /&gt;
work = &#039;IN:&#039;&lt;br /&gt;
&lt;br /&gt;
for c in 1..text.length&lt;br /&gt;
work += padhex(&amp;quot;%X&amp;quot; %text[c-1]) + &#039; &#039;&lt;br /&gt;
end&lt;br /&gt;
log($red + work + &amp;quot;Length:&amp;quot; + text.length.to_s + $grey)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def padhex(hex)&lt;br /&gt;
if hex.length==1&lt;br /&gt;
hex = &amp;quot;0&amp;quot; + hex&lt;br /&gt;
end&lt;br /&gt;
return hex&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def percenttohex(level)&lt;br /&gt;
# convert from percent to byte&lt;br /&gt;
return &amp;quot;%X&amp;quot; %((level.to_i * 2.55)).to_i&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def hextopercent(level)&lt;br /&gt;
return ((level.hex.to_i / 2.55)).to_i&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def hextoTempurature(degree) #Thermostat change hex to tempurature&lt;br /&gt;
return ((degree.hex.to_i / 2)).to_i&lt;br /&gt;
end&lt;br /&gt;
def Tempuraturetohex (degree) #Thermostat Cahnge tempurature to hex&lt;br /&gt;
return ((degree.to_1 * 2)).hex&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def log(line)&lt;br /&gt;
$log = File.open(&amp;quot;/var/log/pluto/&amp;quot; + device_.devid_.to_s + &amp;quot;_Generic_Serial_Device.log&amp;quot;, &amp;quot;a&amp;quot;)&lt;br /&gt;
$log.puts &amp;quot;(***):&amp;quot; + line.to_s&lt;br /&gt;
$log.close&lt;br /&gt;
end&lt;br /&gt;
def log2(line)&lt;br /&gt;
#this will send a message out the the orbiters..&lt;br /&gt;
#/usr/pluto/bin/MessageSend localhost 0 20 1 809 9 &amp;quot;Text to Display&amp;quot; 70 &amp;quot;alert&amp;quot; 182 &amp;quot;30&amp;quot; 251 &amp;quot;??&amp;quot;&lt;br /&gt;
cmd = Command.new(device_.devid_, -1000, 1, 1, 809)&lt;br /&gt;
cmd.params_[9] = line #text to display&lt;br /&gt;
cmd.params_[70] = &#039;PLMMessage&#039; #Token&lt;br /&gt;
cmd.params_[182] = &#039;10&#039; #Timeout in seconds&lt;br /&gt;
cmd.params_[251] = &#039;??&#039;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
def checkChildRecordsinPLM()&lt;br /&gt;
log(&#039;Entered CheckChildRecordsinPLM&#039;)&lt;br /&gt;
# log(&#039;In CheckChildRecordsinPLM&#039;)&lt;br /&gt;
# time to verify all children are in the PLM&lt;br /&gt;
#&lt;br /&gt;
# log(&#039;Total PLM Records:&#039; + $plmdatabase.nitems.to_s)&lt;br /&gt;
$plmdatabase.each{|record|&lt;br /&gt;
log(&#039;Record: = &#039;+ getIIDfromRecord(record) + &#039; Group:&#039; + getGroupfromRecord(record))&lt;br /&gt;
log(&#039;checking to see if it needs to be added as a child...&#039;)&lt;br /&gt;
if existsinchild(getIIDfromRecord(record)) == false&lt;br /&gt;
&lt;br /&gt;
log(getIIDfromRecord(record) + &#039; needs to be added to the child database&#039;)&lt;br /&gt;
addtochild(getIIDfromRecord(record))&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$childdatabases.each_key {|child|&lt;br /&gt;
if existsinplm(child) == false&lt;br /&gt;
log(child + &#039; needs to be added to PLM&#039;)&lt;br /&gt;
sendAddtoPLM(child)&lt;br /&gt;
else&lt;br /&gt;
log(child + &#039; exists in PLM&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
#now to scan the childs database&lt;br /&gt;
for record in 1..($childdatabases[child].nitems - 1)&lt;br /&gt;
@test = $childdatabases[child][record]&lt;br /&gt;
if existsinplm(getIIDfromRecord(@test)) == false&lt;br /&gt;
log(getIIDfromRecord(@test) + &#039; needs to be added to PLM&#039;)&lt;br /&gt;
sendAddtoPLM(getIIDfromRecord(@test))&lt;br /&gt;
else&lt;br /&gt;
log(getIIDfromRecord(@test) + &#039; exists in PLM&#039;)&lt;br /&gt;
end&lt;br /&gt;
#Also check to see if it needs to be added in the childdatabases&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
def existsinplm(insteonid)&lt;br /&gt;
result = false&lt;br /&gt;
$plmdatabase.each{|record|&lt;br /&gt;
#log(insteonid + &#039;==&#039; + getIIDfromRecord(record))&lt;br /&gt;
if insteonid == getIIDfromRecord(record)&lt;br /&gt;
result = true&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
return result&lt;br /&gt;
end&lt;br /&gt;
def existsinchild(insteonid)&lt;br /&gt;
log(&#039;ExistsinChild:InsteonID:&#039; + insteonid)&lt;br /&gt;
result = false&lt;br /&gt;
$childdatabases.each_key{|record|&lt;br /&gt;
if insteonid == record&lt;br /&gt;
result = true&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
log(&#039;ExistsinChild result:FALSE&#039;) if result == false&lt;br /&gt;
log(&#039;ExistsinChild result:TRUE&#039;) if result == true&lt;br /&gt;
return result&lt;br /&gt;
end&lt;br /&gt;
def addtochild(insteonID)&lt;br /&gt;
log(&#039;addtochild Routne called&#039;)&lt;br /&gt;
log(&#039;Adding &#039; + insteonID + &#039; to the child database...&#039;)&lt;br /&gt;
if insteonID.length == 2 then&lt;br /&gt;
log(&#039;Child is X10&#039;)&lt;br /&gt;
$state[insteonID] = 0&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Child is Insteon&#039;)&lt;br /&gt;
$childdatabases[insteonID] = [&#039;****************&#039;]&lt;br /&gt;
sendPing(insteonID)&lt;br /&gt;
$rerun = true&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def removefromchild(insteonID)&lt;br /&gt;
log(&#039;Removing &#039; + insteonID + &#039; from child database&#039;)&lt;br /&gt;
$childdatabases.delete(insteonID)&lt;br /&gt;
$state.delete(insteonID)&lt;br /&gt;
end&lt;br /&gt;
def removefromplm(insteonID)&lt;br /&gt;
log(&#039;Removing from plm&#039;)&lt;br /&gt;
$plmdatabase.each{|record|&lt;br /&gt;
#log(insteonid + &#039;==&#039; + getIIDfromRecord(record))&lt;br /&gt;
if insteonID == getIIDfromRecord(record)&lt;br /&gt;
debug(record)&lt;br /&gt;
log(&#039;Found Record, Deleting&#039;)&lt;br /&gt;
$plmdatabase.delete(record)&lt;br /&gt;
&lt;br /&gt;
#now, we have to remove it from the device.&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt;&#039;MngLnk&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; &#039;80&#039;, #DELETE&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; record[0..1], #control byte&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; record[2..3], #group&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; record[4..5],#HB&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; record[6..7],#MB&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; record[8..9],#LB&lt;br /&gt;
&#039;Parameter7&#039; =&amp;gt; record[10..11],#data1&lt;br /&gt;
&#039;Parameter8&#039; =&amp;gt; record[12..13],#data2&lt;br /&gt;
&#039;Parameter9&#039; =&amp;gt; record[14..15] #data3&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
log(param.inspect)&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
end&lt;br /&gt;
def sendAddtoPLM(insteonID)&lt;br /&gt;
log(&#039;Adding &#039; + insteonID + &#039; to the PLM database...&#039;)&lt;br /&gt;
#This adds a record into the PLM&lt;br /&gt;
@insID = insteonID.split(&#039;.&#039;)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;MngLnk&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; &#039;40&#039;, #control code -- add new record as Controller&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;C2&#039;, #All Link Record Flags AKA Record Control Byte&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; &#039;01&#039;, #All Link Group&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; @insID[0], #HB&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; @insID[1], #MB&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; @insID[2], #LB&lt;br /&gt;
&#039;Parameter7&#039; =&amp;gt; &#039;01&#039;, #Link Data 1 ON-Level&lt;br /&gt;
&#039;Parameter8&#039; =&amp;gt; &#039;01&#039;, #Link Data 2 Ramp Rate&lt;br /&gt;
&#039;Parameter9&#039; =&amp;gt; &#039;FF&#039;} #Link Data 3 not used&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(1, param)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(0, param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def getIIDfromRecord(recordstring)&lt;br /&gt;
#this extracts the insteonID string from the record.&lt;br /&gt;
#log(&#039;getIIDfromRecord::recordstring:&#039; + recordstring)&lt;br /&gt;
@idhb = recordstring[4..5]&lt;br /&gt;
@idmb = recordstring[6..7]&lt;br /&gt;
@idlb = recordstring[8..9]&lt;br /&gt;
@result = @idhb + &#039;.&#039; + @idmb + &#039;.&#039; +@idlb&lt;br /&gt;
#log(&#039;GetIIDfromRecord: Found ID:&#039; + @result)&lt;br /&gt;
return @result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def processBroadcastMessage(param)&lt;br /&gt;
#search the child databases for responders,&lt;br /&gt;
#and fire COMMANDS for each responder. 06Feb08&lt;br /&gt;
#and fire events for each responder.XXXXXXXXXXXXX&lt;br /&gt;
#Message flag is in parameter9 Group command 0xCx (All-Link Broadcast Message Pg 42.)&lt;br /&gt;
#Group is in parameter8&lt;br /&gt;
#From InsteonID is parameters 3, 4, 5&lt;br /&gt;
group = param[&#039;Parameter8&#039;]&lt;br /&gt;
from = padhex(param[&#039;Parameter3&#039;]) + &#039;.&#039;&lt;br /&gt;
from += padhex(param[&#039;Parameter4&#039;]) + &#039;.&#039;&lt;br /&gt;
from += padhex(param[&#039;Parameter5&#039;])&lt;br /&gt;
log(&#039;Looking for &#039; + from + &#039; Group:&#039; + group)&lt;br /&gt;
log(&#039;Showing Parameter10:&#039; + param[&#039;Parameter10&#039;].to_s)&lt;br /&gt;
#Ok, now have to search child databases for from AND group AND responder&lt;br /&gt;
$childdatabases.each_key{|child|&lt;br /&gt;
#log(&#039;Searching:&#039; + child)&lt;br /&gt;
for rec in 1..($childdatabases[child].nitems - 1)&lt;br /&gt;
record = $childdatabases[child][rec]&lt;br /&gt;
if getIIDfromRecord(record) == from # First, look for Insteon ID&lt;br /&gt;
#log(&#039;Found ID&#039;)&lt;br /&gt;
if getGroupfromRecord(record) == group #next, Group&lt;br /&gt;
#log(&#039;Found Group&#039;)&lt;br /&gt;
if isResponderRecord(record) # is a responder?&lt;br /&gt;
#log(&#039;Found Responder&#039;)&lt;br /&gt;
#figure out the child devicenum&lt;br /&gt;
from = $children[child]&lt;br /&gt;
#figure out the command&lt;br /&gt;
case param[&#039;Parameter10&#039;].hex&lt;br /&gt;
when 0x11 #on&lt;br /&gt;
reportStatus(from, 100)&lt;br /&gt;
when 0x13 #off&lt;br /&gt;
reportStatus(from, 0)&lt;br /&gt;
when 0x6B # Thermostat Command On/OFF/AUTO&lt;br /&gt;
case param[&#039;Parameter11&#039;].to_s&lt;br /&gt;
when &#039;09&#039; #status to OFF&lt;br /&gt;
#need to set current temp&lt;br /&gt;
reportStatus(from, 0)&lt;br /&gt;
else&lt;br /&gt;
#check thermostat for state and update and set current temp&lt;br /&gt;
#reportStatus(from, 100)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 0x6C # Thermostat Command Cool Point&lt;br /&gt;
tempurature =param[&#039;Parameter11&#039;] /2 #temp in hex need to devide by 2 = current cool point&lt;br /&gt;
#reportStatus(from,tempurature)&lt;br /&gt;
when 0x6D# Thermostat Command Heat Point&lt;br /&gt;
tempurature =param[&#039;Parameter11&#039;] /2 #temp in hex need to devide by 2 = current heat point&lt;br /&gt;
#reportStatus(from,tempurature)&lt;br /&gt;
&lt;br /&gt;
when 0x17 #dim/brighten -ignore&lt;br /&gt;
level = 0&lt;br /&gt;
when 0x18 # STOP dim/brighten - sendgetstatus&lt;br /&gt;
level = 0&lt;br /&gt;
sendGetChildStatus(child)&lt;br /&gt;
else&lt;br /&gt;
level = 0&lt;br /&gt;
log(&#039;Command is other than ON/OFF/Dim/Brighten&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def reportStatus(from, level)&lt;br /&gt;
log(&#039;From:&#039; + from.to_s) #shows child id&lt;br /&gt;
log(&#039;current State:&#039; + $state[from].to_s)&lt;br /&gt;
log(&#039;Wanted State:&#039; + level.to_s)&lt;br /&gt;
case $state[from]&lt;br /&gt;
when 0&lt;br /&gt;
if level &amp;gt;=1&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 192) #on&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 184)&lt;br /&gt;
cmd.params_[76] = level.to_s&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
when 100&lt;br /&gt;
if level &amp;gt;= 1&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 184)&lt;br /&gt;
cmd.params_[76] = level.to_s&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
else&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 193) # off&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
if level == 100&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 193) #off&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 192) # on&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 184) #SetLevel&lt;br /&gt;
cmd.params_[76] = level.to_s&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
log(&#039;ReportStatus: device:&#039; + from.to_s + &#039; Status:&#039; + level.to_s)&lt;br /&gt;
$state[from] = level&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def isResponderRecord(recordstring)&lt;br /&gt;
work = recordstring[0..1].hex&lt;br /&gt;
if (work &amp;amp; 0x40) == 0x40 #check bit 6&lt;br /&gt;
result = false #signifies Controller record&lt;br /&gt;
else&lt;br /&gt;
result = true #signifies Responder record&lt;br /&gt;
end&lt;br /&gt;
return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def getGroupfromRecord(recordstring)&lt;br /&gt;
#this extracts the GROUP from the record.&lt;br /&gt;
if recordstring == nil&lt;br /&gt;
return &#039;00&#039;&lt;br /&gt;
else&lt;br /&gt;
return recordstring[2..3]&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
def getdeltafromconfig(insteonID)&lt;br /&gt;
#This returns the delta from the child.&lt;br /&gt;
@work = $childdatabases[insteonID][0] # the settings stored in [0]&lt;br /&gt;
if @work == nil&lt;br /&gt;
return &#039;00&#039;&lt;br /&gt;
else&lt;br /&gt;
return @work[6..7]&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
def sendGetChildStatus(insteonID)&lt;br /&gt;
#log(&#039;sendGetChildStatus Called&#039;)&lt;br /&gt;
if insteonID.length != 2 #X10 device&lt;br /&gt;
@insID = insteonID.split(&#039;.&#039;)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;, #flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;19&#039;, #Status Request&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;00&#039;} #not used.&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
#Returned response will have cmd1 = DBDelta&lt;br /&gt;
#Returned response will have cmd2 = ON-Level&lt;br /&gt;
else&lt;br /&gt;
log(&#039;X10 does not report status&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
def islast(record)&lt;br /&gt;
#high water mark&lt;br /&gt;
return false if (record[0..1].hex &amp;amp; 0x02) == 0x02&lt;br /&gt;
return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def isinuse(record)&lt;br /&gt;
return true if (record[0..1].hex &amp;amp; 0x80) == 0x80&lt;br /&gt;
return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def iscontroller(record)&lt;br /&gt;
return true if (record[0..1].hex &amp;amp; 0x40) == 0x40&lt;br /&gt;
return false&lt;br /&gt;
end&lt;br /&gt;
def group(record)&lt;br /&gt;
return record[2..3]&lt;br /&gt;
end&lt;br /&gt;
def remoteid(record)&lt;br /&gt;
&lt;br /&gt;
@insteonID = record[4..5] + &#039;.&#039;&lt;br /&gt;
@insteonID += record[6..7] + &#039;.&#039;&lt;br /&gt;
@insteonID += record[8..9]&lt;br /&gt;
return @insteonID&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def findresponderrecord(masterid, slaveid, groupid)&lt;br /&gt;
# log(masterid + &#039;:&#039; + slaveid + &#039;:&#039; + groupid)&lt;br /&gt;
$childdatabases[slaveid].each{|check|&lt;br /&gt;
# log(&#039;Record:&#039; + check.to_s)&lt;br /&gt;
if iscontroller(check.to_s) == false #responder record&lt;br /&gt;
# log(&#039;found responder record&#039;)&lt;br /&gt;
# log(&#039;remoteid:&#039; + remoteid(check.to_s))&lt;br /&gt;
if remoteid(check.to_s) == masterid # found&lt;br /&gt;
# log(&#039;Found Controller ID in responder record&#039;)&lt;br /&gt;
if group(check.to_s) == groupid&lt;br /&gt;
# log(&#039;Group Matches&#039;)&lt;br /&gt;
#found group&lt;br /&gt;
return true&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
return false&lt;br /&gt;
end&lt;br /&gt;
def findcontrollerrecord(masterid, slaveid, groupid)&lt;br /&gt;
# log(masterid + &#039;:&#039; + slaveid + &#039;:&#039; + groupid)&lt;br /&gt;
$childdatabases[masterid].each{|check|&lt;br /&gt;
# log(&#039;Record:&#039; + check.to_s)&lt;br /&gt;
if iscontroller(check.to_s) == true #controller&lt;br /&gt;
# log(&#039;found controller record&#039;)&lt;br /&gt;
if remoteid(check.to_s) == slaveid # found&lt;br /&gt;
# log(&#039;found Responder ID in Controller record&#039;)&lt;br /&gt;
if group(check.to_s) == groupid&lt;br /&gt;
# log(&#039;Group Matches&#039;)&lt;br /&gt;
#found group&lt;br /&gt;
return true&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# time to define a structure to save the raw data in hex&lt;br /&gt;
# starts at [0]&lt;br /&gt;
# Bytes Meaning&lt;br /&gt;
# 0-1 Device Category&lt;br /&gt;
# 2-3 Device SubCategory&lt;br /&gt;
# 4-5 Device Firmware&lt;br /&gt;
# 6-7 Database Delta&lt;br /&gt;
# 8-9 reserved&lt;br /&gt;
# 10-11 reserved&lt;br /&gt;
# 12-13 reserved&lt;br /&gt;
# 14-15 reserved&lt;br /&gt;
###### First database record below (in same format its read from the device)&lt;br /&gt;
###### This is the same format as an ALL-Link Record Response from the PLM&lt;br /&gt;
###### (0x57) bytes 3..10&lt;br /&gt;
# 16-17 record control byte&lt;br /&gt;
# 18-19 Group&lt;br /&gt;
# 20-21 ID HB&lt;br /&gt;
# 22-23 ID MB&lt;br /&gt;
# 24-25 ID LB&lt;br /&gt;
# 26-27 Link Specific Data1&lt;br /&gt;
# 28-29 Link Specific Data2&lt;br /&gt;
# 30-31 Link Specific Data3&lt;br /&gt;
######&lt;br /&gt;
# 32-47 next database record...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_760&amp;diff=29548</id>
		<title>Insteon PLM Ruby Code 760</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_760&amp;diff=29548"/>
		<updated>2012-02-28T21:44:49Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#### #760 Send Command to Child ####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@insteonID = id.chomp.split(&#039;.&#039;)&lt;br /&gt;
@parameters = parameters&lt;br /&gt;
@command = pk_command&lt;br /&gt;
@cmd = cmd&lt;br /&gt;
childType =device_.childdevices_[cmdTo].devtemplid_ # find out device type&lt;br /&gt;
$cmdParams = cmd.params_&lt;br /&gt;
&lt;br /&gt;
log(&#039;#760:id=&#039; + id.inspect)&lt;br /&gt;
log(&#039;#760:parameters=&#039; + parameters.inspect)&lt;br /&gt;
log(&#039;#760:pk_command=&#039; + pk_command.inspect)&lt;br /&gt;
log(&#039;#760:cmd=&#039; + cmd.inspect)&lt;br /&gt;
### ok, I get the insteonID in @insteonID&lt;br /&gt;
# pk_command has one of THREE values, 192, 193, or NOTHING&lt;br /&gt;
# when I click 50%, I get in parameters: 76&lt;br /&gt;
# but NOTHING in pk_command.&lt;br /&gt;
&lt;br /&gt;
case pk_command&lt;br /&gt;
when &#039;192&#039; #ON&lt;br /&gt;
if chiltType ==2197 then #used when Device is Thermostat&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;OF&#039;, # Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Insteon Thermostat Control&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;06&#039;} # ON&lt;br /&gt;
else&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;OF&#039;, # Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;11&#039;, # Insteon SetLevel&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;FF&#039;} # FULL ON&lt;br /&gt;
end&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;193&#039; #OFF&lt;br /&gt;
log(&amp;quot;childtype:&amp;quot; +childtype.to_s)&lt;br /&gt;
if childtype == 2197 then #used when Device is Thermostat&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;09&#039;} #OFF&lt;br /&gt;
else #used when Device not Thermostat&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;13&#039;, #OFF&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
end&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
#when &#039;280&#039; # Heat/Cool/Auto&lt;br /&gt;
#log(&#039;Test Param:&#039; +$cmdParams.to_s)&lt;br /&gt;
#case $cmdParams.to_s&lt;br /&gt;
#when &#039;8H&#039; # Heat Command&lt;br /&gt;
#param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
#&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
#&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
#&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
#&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
#&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Indicates device is a Thermostat&lt;br /&gt;
#&#039;Parameter6&#039; =&amp;gt; &#039;04&#039;} # sets to Heat Mode&lt;br /&gt;
#$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
# SndIns()&lt;br /&gt;
&lt;br /&gt;
#when &#039;8C&#039; # Cool Command&lt;br /&gt;
#param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
#&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
#&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
#&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
#&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
#&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
#&#039;Parameter6&#039; =&amp;gt; &#039;05&#039;} # Sets to Cool&lt;br /&gt;
#$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
# SndIns()&lt;br /&gt;
#when &#039;8A&#039; # Auto Command&lt;br /&gt;
#param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
#&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
#&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
#&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
#&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
#&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
#&#039;Parameter6&#039; =&amp;gt; &#039;06&#039;} # Sets to Auto&lt;br /&gt;
#$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
#SndIns()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&lt;br /&gt;
when &#039;&#039;&lt;br /&gt;
if parameters==&#039;76&#039;&lt;br /&gt;
#SetLevel 50%&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;OF&#039;, # Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;11&#039;, # Insteon SetLevel&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;76&#039;} # 50%&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_756&amp;diff=29547</id>
		<title>Insteon PLM Ruby Code 756</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_756&amp;diff=29547"/>
		<updated>2012-02-28T21:43:46Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#### #756 Report Child Devices ####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#here is where I send all my newly discovered children..&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#I need to fire an event [54]&lt;br /&gt;
#with params_:&lt;br /&gt;
#12 Error Message (string)&lt;br /&gt;
# if this is not empty, that means an error occurred.&lt;br /&gt;
#&lt;br /&gt;
#13 Text (string)&lt;br /&gt;
# a list like this:&lt;br /&gt;
# [internal id] \t&lt;br /&gt;
# [description] \t&lt;br /&gt;
# [room name] \t&lt;br /&gt;
# [device template] \t&lt;br /&gt;
# [floorplan id] \n&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#First, Lets see if we actually &#039;get this command&#039;&lt;br /&gt;
log($yellow+ &#039;*#*#*#*#*#*#*#*# GOT #756 Report Child Devices! *#*#*#*#*#*#*#*#*&#039;+ $grey)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
##lets try sending an event..&lt;br /&gt;
&lt;br /&gt;
#cmd = Command.new(37,-1000,1, 2, 54)&lt;br /&gt;
#cmd.params_[13] = &amp;quot;0A.97.0B\tTestLamp\t\t38\t\n&amp;quot;&lt;br /&gt;
#log(cmd.params_[13])&lt;br /&gt;
#SendCommand(cmd)&lt;br /&gt;
@work = &amp;quot;&amp;quot;&lt;br /&gt;
$childdatabases.each_key{|insteonID|&lt;br /&gt;
@work += insteonID + &amp;quot;\t&amp;quot;&lt;br /&gt;
# figure out what type of device to add here..&lt;br /&gt;
log(&#039;Child:&#039; + insteonID)&lt;br /&gt;
log(&#039;Config:&#039; + $childdatabases[insteonID].inspect)&lt;br /&gt;
case $childdatabases[insteonID][0][0..1].hex # Device Category&lt;br /&gt;
when 0x00 # Generalized Controllers&lt;br /&gt;
case $childdatabases[insteonID][0][2..3].hex&lt;br /&gt;
when 0x00&lt;br /&gt;
when 0x01&lt;br /&gt;
when 0x02&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
when 0x01 # Dimmable Lighting Control&lt;br /&gt;
case $childdatabases[insteonID][0][2..3].hex&lt;br /&gt;
when 0x00; @work += &#039;LampLinc V2 [2456D3]&#039;&lt;br /&gt;
when 0x01; @work += &#039;SwitchLinc V2 Dimmer 600W [2476D]&#039;&lt;br /&gt;
when 0x02; @work += &#039;In-LineLinc Dimmer [2475D]&#039;&lt;br /&gt;
when 0x03; @work += &#039;Icon Switch Dimmer [2876D]&#039;&lt;br /&gt;
when 0x04; @work += &#039;SwitchLinc V2 Dimmer 1000W [2476DH]&#039;&lt;br /&gt;
when 0x06; @work += &#039;LampLinc 2-pin [2456D2]&#039;&lt;br /&gt;
when 0x07; @work += &#039;Icon LampLinc V2 2-pin [2456D2]&#039;&lt;br /&gt;
when 0x09; @work += &#039;KeypadLinc Dimmer [2486D]&#039;&lt;br /&gt;
when 0x0A; @work += &#039;Icon In-Wall Controller [2886D]&#039;&lt;br /&gt;
when 0x0D; @work += &#039;SocketLinc [2454D]&#039;&lt;br /&gt;
when 0x13; @work += &#039;Icon SwitchLinc Dimmer for Lixar/Bell Canada [2676D-B]&#039;&lt;br /&gt;
when 0x17; @work += &#039;ToggleLinc Dimmer [2466D]&#039;&lt;br /&gt;
end&lt;br /&gt;
@work += &amp;quot;\t\t38&amp;quot; # set Template 38&lt;br /&gt;
when 0x02 # Switched Lighting Control&lt;br /&gt;
case $childdatabases[insteonID][0][2..3].hex&lt;br /&gt;
when 0x09; @work += &#039;ApplianceLinc [2456S3]&#039;&lt;br /&gt;
when 0x0A; @work += &#039;SwitchLinc Relay [2476S]&#039;&lt;br /&gt;
when 0x0B; @work += &#039;Icon On Off Switch [2876S]&#039;&lt;br /&gt;
when 0x0C; @work += &#039;Icon Appliance Adapter [2856S3]&#039;&lt;br /&gt;
when 0x0D; @work += &#039;ToggleLinc Relay [2466S]&#039;&lt;br /&gt;
when 0x0E; @work += &#039;Switchlinc Relay Countdown Timer [2476ST]&#039;&lt;br /&gt;
when 0x10; @work += &#039;In-LineLinc Relay [2475D]&#039;&lt;br /&gt;
when 0x13; @work += &#039;Icon SwitchLinc Relay for Lixar/Bell Canada [2676R-B]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
@work += &amp;quot;\t\t37&amp;quot; # Set Template 37&lt;br /&gt;
when 0x03 # Network Bridges&lt;br /&gt;
case $childdatabases[insteonID][0][2..3].hex&lt;br /&gt;
when 0x10; @work += &#039;SmartLinc [2412N]&#039;&lt;br /&gt;
end&lt;br /&gt;
when 0x04 # Irrigation Control&lt;br /&gt;
@work += &#039;Simplehomenet EZRain1 Sprinkler Controller&#039;&lt;br /&gt;
@work += &amp;quot;\t\t1780&amp;quot; # Set Template 1780&lt;br /&gt;
&lt;br /&gt;
when 0x05 # Climate Control&lt;br /&gt;
case $childdatabases[insteonID][0][2..3].hex&lt;br /&gt;
when 0x00; @work += &#039;Broan SMSC080 Exhaust Fan&#039;&lt;br /&gt;
when 0x01; @work += &#039;Simplehomenet EZTherm&#039;&lt;br /&gt;
when 0x02; @work += &#039;Broan SMSC110 Exhaust Fan&#039;&lt;br /&gt;
when 0x03&lt;br /&gt;
@work += &#039;Venstar RF Thermostat Module&#039;&lt;br /&gt;
@work += &amp;quot;\t\t2197&amp;quot; # Set Template 2197&lt;br /&gt;
when 0x04; @work += &#039;Simplehomenet EZStat Thermostat&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 0x06 # Pool and Spa Control&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x07 # Sensors and Actuators&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x08&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x09&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0A&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0B&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0C&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0D&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0E&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0F&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x10 # Security, Health, and Safety&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x11 # Surveillance&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x12 # Automotive&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x13 # Pet care&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x14 # Toys&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x15 # Timekeeping&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x16 # Holiday&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
@work += &amp;quot;\t\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
log(@work)&lt;br /&gt;
cmd = Command.new(device_.devid_, -1000, 1, 2, 54)&lt;br /&gt;
cmd.params_[13] = @work&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_-_Setting_Up_PLM_Template&amp;diff=29546</id>
		<title>Insteon - Setting Up PLM Template</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_-_Setting_Up_PLM_Template&amp;diff=29546"/>
		<updated>2012-02-28T21:42:58Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo|810Status=Q/A|810UpdatedDate=29 JUNE 2010|810UpdatedBy=langstonius|710Status=N/A|710UpdatedDate=29JUNE 2010|710UpdatedBy=langstonius}}&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:Power Line Control]]&lt;br /&gt;
[[Category:GSD| ]]&lt;br /&gt;
 {| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: 11-MAR-08 Many bugs fixed, X10 fixes...&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: 13-FEB-08 X10 Support fixed! &lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
:--ddamron&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: 7-FEB-12 Remove instructions on setting up template, use Template 1932&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
:--Aviator&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: Adding Info for 2412n template In addition to posting plm code changes to enable Venstar Thermostat&#039;&#039;&#039; --[[User:Trippleg|Trippleg]] 00:06, 25 February 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here are the steps to create an Insteon PLM Template.  This driver is written entirely in Ruby.  Please consider this driver complete, and is in Release Candidate 1.  I&#039;m sure there are still a few bugs (although we&#039;ve ironed most of them out now). The more people testing this code, the more bugs we can find, and get this to a release state.  Once it&#039;s in release state, it will be added to sqlcvs and offered via a &#039;quick&#039; update.&lt;br /&gt;
&lt;br /&gt;
==Supported Devices==&lt;br /&gt;
This driver supports ONLY the Powerlinc Modem model (PLM)#2412S, #2413S, #2412U and #2413U. The code will NOT work for a model #2414 also known as a Powerlinc CONTROLLER (PLC).&lt;br /&gt;
&lt;br /&gt;
NOTE:  I am expecting a PLC to arrive in the mail in the next few days.  Support for that device will be sooner than later.&lt;br /&gt;
&lt;br /&gt;
*Febuary 2, 2012 - PLC support will NOT be added to this driver -Aviator&lt;br /&gt;
&lt;br /&gt;
*Febuary 3, 2012 - Thanks to the work of trippleg, we now have support for the 2412N as well. -Aviator&lt;br /&gt;
&lt;br /&gt;
This driver now supports  the  Smartlinc 2412N as well. Please use template 2197 &lt;br /&gt;
&lt;br /&gt;
Simplehomenet&#039;s EZBridge/EZServ products will be added once this code is stable.  These products are a &#039;wrapper&#039; for the PLM, and hence, use the same code.  Integration will be a matter of adding the &#039;wrapper&#039; code. (which is done)&lt;br /&gt;
&lt;br /&gt;
==Setting up the Template==&lt;br /&gt;
* The template is Plug and Play, configuration should have been taken care of for you.&lt;br /&gt;
&lt;br /&gt;
* Goto [[LinuxMCE Admin Website]]--&amp;gt;Wizard--&amp;gt;Devices--&amp;gt;Interfaces&lt;br /&gt;
* Add device--&amp;gt;Template Id 1932 Insteon PLM&lt;br /&gt;
For 2412N &lt;br /&gt;
* Add device --&amp;gt;Template Id 2197 Smartlinc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:* Now, in the COM PORT ON PC, you can select the com port it&#039;s on. &#039;&#039;&#039;UPDATE&#039;&#039;&#039; I didn&#039;t see any &amp;quot;COM PORT ON PC&amp;quot; field. You wil need to reload the router first, then you see the &amp;quot;COM PORT ON PC&amp;quot; field. 8/9/08 Williammanda&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039; Other than looking on the motherboard for the com port label and guess and check methods, what else can be done to identify the correct com port?&lt;br /&gt;
:* select Update (at the bottom)&lt;br /&gt;
&lt;br /&gt;
===Adding Ruby Code For Venstar Thermostat ===  Only use this if your Code is prior to 2/12/2012 &lt;br /&gt;
::* In the #756 Report Child Devices field (the big one) copy and paste this code:&lt;br /&gt;
:::[[Insteon PLM Ruby Code 756]]&lt;br /&gt;
::* In the #760 Send Command to Child field, copy and paste this code:&lt;br /&gt;
:::[[Insteon PLM Ruby Code 760]]&lt;br /&gt;
::* In the #373 Private Method Listing field, copy and paste this code:&lt;br /&gt;
:::[[Insteon PLM Ruby Code 373]]&lt;br /&gt;
::* In the #384 Process Receive Command for Child field, copy and paste this code:&lt;br /&gt;
:::[[Insteon PLM Ruby Code 384]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You are Done!&lt;br /&gt;
&lt;br /&gt;
==Next Steps==&lt;br /&gt;
go to [[Running the Insteon PLM Driver for the First Time]]&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_-_Setting_Up_PLM_Template&amp;diff=29538</id>
		<title>Insteon - Setting Up PLM Template</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_-_Setting_Up_PLM_Template&amp;diff=29538"/>
		<updated>2012-02-24T23:07:07Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo|810Status=Q/A|810UpdatedDate=29 JUNE 2010|810UpdatedBy=langstonius|710Status=N/A|710UpdatedDate=29JUNE 2010|710UpdatedBy=langstonius}}&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:Power Line Control]]&lt;br /&gt;
[[Category:GSD| ]]&lt;br /&gt;
 {| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: 11-MAR-08 Many bugs fixed, X10 fixes...&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: 13-FEB-08 X10 Support fixed! &lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
:--ddamron&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: 7-FEB-12 Remove instructions on setting up template, use Template 1932&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
:--Aviator&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: Adding Info for 2412n template In addition to posting plm code changes to enable Venstar Thermostat&#039;&#039;&#039; --[[User:Trippleg|Trippleg]] 00:06, 25 February 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here are the steps to create an Insteon PLM Template.  This driver is written entirely in Ruby.  Please consider this driver complete, and is in Release Candidate 1.  I&#039;m sure there are still a few bugs (although we&#039;ve ironed most of them out now). The more people testing this code, the more bugs we can find, and get this to a release state.  Once it&#039;s in release state, it will be added to sqlcvs and offered via a &#039;quick&#039; update.&lt;br /&gt;
&lt;br /&gt;
==Supported Devices==&lt;br /&gt;
This driver supports ONLY the Powerlinc Modem model (PLM)#2412S, #2413S, #2412U and #2413U. The code will NOT work for a model #2414 also known as a Powerlinc CONTROLLER (PLC).&lt;br /&gt;
&lt;br /&gt;
NOTE:  I am expecting a PLC to arrive in the mail in the next few days.  Support for that device will be sooner than later.&lt;br /&gt;
&lt;br /&gt;
*Febuary 2, 2012 - PLC support will NOT be added to this driver -Aviator&lt;br /&gt;
&lt;br /&gt;
*Febuary 3, 2012 - Thanks to the work of trippleg, we now have support for the 2412N as well. -Aviator&lt;br /&gt;
&lt;br /&gt;
This driver now supports  the  Smartlinc 2412N as well. Please use template 2203 &lt;br /&gt;
&lt;br /&gt;
Simplehomenet&#039;s EZBridge/EZServ products will be added once this code is stable.  These products are a &#039;wrapper&#039; for the PLM, and hence, use the same code.  Integration will be a matter of adding the &#039;wrapper&#039; code. (which is done)&lt;br /&gt;
&lt;br /&gt;
==Setting up the Template==&lt;br /&gt;
* The template is Plug and Play, configuration should have been taken care of for you.&lt;br /&gt;
&lt;br /&gt;
* Goto [[LinuxMCE Admin Website]]--&amp;gt;Wizard--&amp;gt;Devices--&amp;gt;Interfaces&lt;br /&gt;
* Add device--&amp;gt;Template Id 1932 Insteon PLM&lt;br /&gt;
For 2412N &lt;br /&gt;
* Add device --&amp;gt;Template Id 2203 Smartlinc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:* Now, in the COM PORT ON PC, you can select the com port it&#039;s on. &#039;&#039;&#039;UPDATE&#039;&#039;&#039; I didn&#039;t see any &amp;quot;COM PORT ON PC&amp;quot; field. You wil need to reload the router first, then you see the &amp;quot;COM PORT ON PC&amp;quot; field. 8/9/08 Williammanda&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039; Other than looking on the motherboard for the com port label and guess and check methods, what else can be done to identify the correct com port?&lt;br /&gt;
:* select Update (at the bottom)&lt;br /&gt;
&lt;br /&gt;
===Adding Ruby Code For Venstar Thermostat ===  Only use this if your Code is prior to 2/12/2012 &lt;br /&gt;
::* In the #756 Report Child Devices field (the big one) copy and paste this code:&lt;br /&gt;
:::[[Insteon PLM Ruby Code 756]]&lt;br /&gt;
::* In the #760 Send Command to Child field, copy and paste this code:&lt;br /&gt;
:::[[Insteon PLM Ruby Code 760]]&lt;br /&gt;
::* In the #373 Private Method Listing field, copy and paste this code:&lt;br /&gt;
:::[[Insteon PLM Ruby Code 373]]&lt;br /&gt;
::* In the #384 Process Receive Command for Child field, copy and paste this code:&lt;br /&gt;
:::[[Insteon PLM Ruby Code 384]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You are Done!&lt;br /&gt;
&lt;br /&gt;
==Next Steps==&lt;br /&gt;
go to [[Running the Insteon PLM Driver for the First Time]]&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_-_Setting_Up_PLM_Template&amp;diff=29537</id>
		<title>Insteon - Setting Up PLM Template</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_-_Setting_Up_PLM_Template&amp;diff=29537"/>
		<updated>2012-02-24T23:06:30Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo|810Status=Q/A|810UpdatedDate=29 JUNE 2010|810UpdatedBy=langstonius|710Status=N/A|710UpdatedDate=29JUNE 2010|710UpdatedBy=langstonius}}&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:Power Line Control]]&lt;br /&gt;
[[Category:GSD| ]]&lt;br /&gt;
 {| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: 11-MAR-08 Many bugs fixed, X10 fixes...&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: 13-FEB-08 X10 Support fixed! &lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
:--ddamron&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: 7-FEB-12 Remove instructions on setting up template, use Template 1932&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
:--Aviator&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039; UPDATED: Adding Info for 2412n template In addition to posting plm code changes to enable Thermostat&#039;&#039;&#039; --[[User:Trippleg|Trippleg]] 00:06, 25 February 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here are the steps to create an Insteon PLM Template.  This driver is written entirely in Ruby.  Please consider this driver complete, and is in Release Candidate 1.  I&#039;m sure there are still a few bugs (although we&#039;ve ironed most of them out now). The more people testing this code, the more bugs we can find, and get this to a release state.  Once it&#039;s in release state, it will be added to sqlcvs and offered via a &#039;quick&#039; update.&lt;br /&gt;
&lt;br /&gt;
==Supported Devices==&lt;br /&gt;
This driver supports ONLY the Powerlinc Modem model (PLM)#2412S, #2413S, #2412U and #2413U. The code will NOT work for a model #2414 also known as a Powerlinc CONTROLLER (PLC).&lt;br /&gt;
&lt;br /&gt;
NOTE:  I am expecting a PLC to arrive in the mail in the next few days.  Support for that device will be sooner than later.&lt;br /&gt;
&lt;br /&gt;
*Febuary 2, 2012 - PLC support will NOT be added to this driver -Aviator&lt;br /&gt;
&lt;br /&gt;
*Febuary 3, 2012 - Thanks to the work of trippleg, we now have support for the 2412N as well. -Aviator&lt;br /&gt;
&lt;br /&gt;
This driver now supports  the  Smartlinc 2412N as well. Please use template 2203 &lt;br /&gt;
&lt;br /&gt;
Simplehomenet&#039;s EZBridge/EZServ products will be added once this code is stable.  These products are a &#039;wrapper&#039; for the PLM, and hence, use the same code.  Integration will be a matter of adding the &#039;wrapper&#039; code. (which is done)&lt;br /&gt;
&lt;br /&gt;
==Setting up the Template==&lt;br /&gt;
* The template is Plug and Play, configuration should have been taken care of for you.&lt;br /&gt;
&lt;br /&gt;
* Goto [[LinuxMCE Admin Website]]--&amp;gt;Wizard--&amp;gt;Devices--&amp;gt;Interfaces&lt;br /&gt;
* Add device--&amp;gt;Template Id 1932 Insteon PLM&lt;br /&gt;
For 2412N &lt;br /&gt;
* Add device --&amp;gt;Template Id 2203 Smartlinc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:* Now, in the COM PORT ON PC, you can select the com port it&#039;s on. &#039;&#039;&#039;UPDATE&#039;&#039;&#039; I didn&#039;t see any &amp;quot;COM PORT ON PC&amp;quot; field. You wil need to reload the router first, then you see the &amp;quot;COM PORT ON PC&amp;quot; field. 8/9/08 Williammanda&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039; Other than looking on the motherboard for the com port label and guess and check methods, what else can be done to identify the correct com port?&lt;br /&gt;
:* select Update (at the bottom)&lt;br /&gt;
&lt;br /&gt;
===Adding Ruby Code For Venstar Thermostat ===  Only use this if your Code is prior to 2/12/2012 &lt;br /&gt;
::* In the #756 Report Child Devices field (the big one) copy and paste this code:&lt;br /&gt;
:::[[Insteon PLM Ruby Code 756]]&lt;br /&gt;
::* In the #760 Send Command to Child field, copy and paste this code:&lt;br /&gt;
:::[[Insteon PLM Ruby Code 760]]&lt;br /&gt;
::* In the #373 Private Method Listing field, copy and paste this code:&lt;br /&gt;
:::[[Insteon PLM Ruby Code 373]]&lt;br /&gt;
::* In the #384 Process Receive Command for Child field, copy and paste this code:&lt;br /&gt;
:::[[Insteon PLM Ruby Code 384]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You are Done!&lt;br /&gt;
&lt;br /&gt;
==Next Steps==&lt;br /&gt;
go to [[Running the Insteon PLM Driver for the First Time]]&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_384&amp;diff=29536</id>
		<title>Insteon PLM Ruby Code 384</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_384&amp;diff=29536"/>
		<updated>2012-02-24T22:39:51Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#### #384 Process Receive Command for Child ####&lt;br /&gt;
#&lt;br /&gt;
#Commands needing implementation&lt;br /&gt;
# Climate Events:&lt;br /&gt;
# 25 Temperature Changed  Partially working&lt;br /&gt;
# 26 Humidity Changed     Partially working&lt;br /&gt;
# 27 Thermostat Set Point Changed  Partially working&lt;br /&gt;
&lt;br /&gt;
# Security Commands:&lt;br /&gt;
# 746 Disarm Panel&lt;br /&gt;
# 758 Get Sensors List&lt;br /&gt;
# 19 Set House Mode&lt;br /&gt;
# 387 Verify PIN&lt;br /&gt;
# Security Events:&lt;br /&gt;
# 9 Sensor Tripped&lt;br /&gt;
# 16 Security Breach&lt;br /&gt;
# 17 Fire Alarm&lt;br /&gt;
# 18 Reset Alarm&lt;br /&gt;
# 39 Air Quality&lt;br /&gt;
# 40 Doorbell&lt;br /&gt;
# 41 Monitor Mode&lt;br /&gt;
# 42 Movement Detected&lt;br /&gt;
# 43 House Mode Changed&lt;br /&gt;
# 44 Presence Detected&lt;br /&gt;
# 45 Presence Lost&lt;br /&gt;
# 67 Alarm Panel Mode Change&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
deviceID = device_.childdevices_[cmd.devidto_].devdata_[12]&lt;br /&gt;
insteonID = deviceID.chomp.split(&#039;.&#039;)&lt;br /&gt;
$cmdID = cmd.id_&lt;br /&gt;
$cmdTo = cmd.devidto_&lt;br /&gt;
childType = device_.childdevices_[cmd.devidto_].devtemplid_&lt;br /&gt;
$cmdFrom = cmd.devidfrom_&lt;br /&gt;
$cmdPriority = cmd.priority_&lt;br /&gt;
$cmdType = cmd.type_&lt;br /&gt;
$cmdParams = cmd.params_&lt;br /&gt;
##Used Only for Thermostat Tempruature Changes########&lt;br /&gt;
$TempParamSplit =cmd.params_.to_s.split(&#039;/&#039;) # splits Tempurature string to allow for heat and cool settings&lt;br /&gt;
$ConvertTempInt = $TempParamSplit[1].to_i * 2&lt;br /&gt;
$ConvertTempHex = $ConvertTempInt.to_s(16) #Converts temp to hex to send to Thermostat&lt;br /&gt;
#################################&lt;br /&gt;
log(&#039;------dce--- cmdID:&#039; + $cmdID.to_s + &#039;, cmdFrom:&#039; + $cmdFrom.to_s + &#039;, cmdTo:&#039; + $cmdTo.to_s + &#039;, cmdType:&#039; + $cmdType.to_s + &#039;, Priority:&#039; + $cmdPriority.to_s)&lt;br /&gt;
if $cmdTo == $cmdFrom&lt;br /&gt;
log(&#039;Detected Command sent to Self!&#039;)&lt;br /&gt;
return&lt;br /&gt;
end&lt;br /&gt;
case cmd.id_&lt;br /&gt;
&lt;br /&gt;
when 278 # Set Temp&lt;br /&gt;
log(&#039;Processing Temp Control command&#039;)&lt;br /&gt;
#log($cmdParams)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
case $TempParamSplit[0].to_s&lt;br /&gt;
when &#039;5C&#039; #sending Heatpoint Tempurature&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6C&#039;, # Defines Cool Setpoint&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; $ConvertTempHex} # send Tempurature Value in Hex&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;5H&#039; #sending Heatpoint Tempurature&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6D&#039;, # Defines Heat Setpoint&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; $ConvertTempHex} # send Tempurature Value in Hex&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 279 #Fan Control&lt;br /&gt;
log(&#039;Processing Fan Control command&#039;)&lt;br /&gt;
log($cmdParams)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
&lt;br /&gt;
case $cmdParams.to_s&lt;br /&gt;
when &#039;81&#039; # Fan ON&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;07&#039;} # Sets Fan to ON&lt;br /&gt;
log(param)&lt;br /&gt;
when &#039;82&#039; # Fan OFF&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;08&#039;} # Sets fan OFF&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 280 # Heat/Cool/Auto&lt;br /&gt;
log(&#039;Processing Heat/Cool/Auto command&#039;)&lt;br /&gt;
#log(&#039;Test Param:&#039; +$cmdParams.to_s)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
case $cmdParams.to_s&lt;br /&gt;
when &#039;8H&#039; # Heat Command&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Indicates device is a Thermostat&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;04&#039;} # sets to Heat Mode&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;8C&#039; # Cool Command&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;05&#039;} # Sets to Cool&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;8A&#039; # Auto Command&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;06&#039;} # Sets to Auto&lt;br /&gt;
&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
when 192 # ON&lt;br /&gt;
log(&#039;Processing ON command&#039;)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
if childType == 2209 then #Used For Thermostat only Sets to Auto, No on command.&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Indicates device is a Thermostat&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;06&#039;} # sets to Auto&lt;br /&gt;
else #Used For Everything else&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;11&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;FF&#039;}&lt;br /&gt;
end&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log &amp;quot;------dce--- X10 DEVICE!!!&amp;quot;&lt;br /&gt;
# Send X10 ON command.&lt;br /&gt;
#first, figure out the house code and unit code.&lt;br /&gt;
log(&#039;DeviceID=&#039; + deviceID)&lt;br /&gt;
x10Byte1 = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10Byte1 += $X10UnitCodes.index(deviceID[1].chr)&lt;br /&gt;
x10cmd = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10cmd += &#039;2&#039; # command code for ON&lt;br /&gt;
log(&#039;X10 Byte1:&#039; + x10Byte1)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10Byte1,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10cmd,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;80&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
reportStatus($children[deviceID], 100)&lt;br /&gt;
when 193 #OFF&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
if childType == 2209 then #Used For Thermostat only&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Indicates Device is Thermostat&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;09&#039;} # Sets to Off&lt;br /&gt;
else&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;13&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
end&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log &amp;quot;------dce--- X10 DEVICE!!!&amp;quot;&lt;br /&gt;
log(&#039;DeviceID=&#039; + deviceID)&lt;br /&gt;
&lt;br /&gt;
x10Byte1 = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10Byte1 += $X10UnitCodes.index(deviceID[1].chr)&lt;br /&gt;
x10cmd = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10cmd += &#039;3&#039; # command code for OFF&lt;br /&gt;
log(&#039;X10 Byte1:&#039; + x10Byte1)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10Byte1,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10cmd,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;80&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
reportStatus($children[deviceID], 0)&lt;br /&gt;
when 193&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
#Needs Work&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 184 #SetLevel&lt;br /&gt;
# convert from percent to hex&lt;br /&gt;
dim_level = percenttohex(cmd.params_[76])&lt;br /&gt;
#log(&amp;quot;------dce--- Dim Level:&amp;quot; + dim_level.to_s)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;11&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; dim_level}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
# In the PRESET DIM X10 command, the lsbit of the command code is the MSB of the&lt;br /&gt;
# dim level, and the house code represents the 4 lsbits of the dim level.&lt;br /&gt;
# This is why Pre-Set Dim command is A AND B.&lt;br /&gt;
log(&#039;Parameter 76 = &#039; + cmd.params_[76].to_s)&lt;br /&gt;
log &amp;quot;X10 DEVICE!!! relative Dimming command&amp;quot;&lt;br /&gt;
log(&#039;DeviceID=&#039; + deviceID)&lt;br /&gt;
x10Byte1 = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10Byte1 += $X10UnitCodes.index(deviceID[1].chr)&lt;br /&gt;
x10cmd = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
#first, determine if its UP or Down&lt;br /&gt;
&lt;br /&gt;
if $state[deviceID].to_i &amp;gt; hextopercent(dim_level).to_i&lt;br /&gt;
# DOWN&lt;br /&gt;
x10cmd += $X10CommandCodes.index(&#039;Dim&#039;)&lt;br /&gt;
else&lt;br /&gt;
# UP&lt;br /&gt;
x10cmd += $X10CommandCodes.index(&#039;Bright&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
log(&#039;X10 Byte1:&#039; + x10Byte1)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10Byte1,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10cmd,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;80&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
&lt;br /&gt;
SndIns()&lt;br /&gt;
log(&#039;Dim Level:&#039; + hextopercent(dim_level).to_s)&lt;br /&gt;
#now send status info (we should not have to to this, but do)&lt;br /&gt;
reportStatus($children[deviceID], hextopercent(dim_level))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_384&amp;diff=29535</id>
		<title>Insteon PLM Ruby Code 384</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_384&amp;diff=29535"/>
		<updated>2012-02-24T22:38:28Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#### #384 Process Receive Command for Child ####&lt;br /&gt;
#&lt;br /&gt;
#Commands needing implementation&lt;br /&gt;
# Climate Events:&lt;br /&gt;
# 25 Temperature Changed&lt;br /&gt;
# 26 Humidity Changed&lt;br /&gt;
# 27 Thermostat Set Point Changed&lt;br /&gt;
&lt;br /&gt;
# Security Commands:&lt;br /&gt;
# 746 Disarm Panel&lt;br /&gt;
# 758 Get Sensors List&lt;br /&gt;
# 19 Set House Mode&lt;br /&gt;
# 387 Verify PIN&lt;br /&gt;
# Security Events:&lt;br /&gt;
# 9 Sensor Tripped&lt;br /&gt;
# 16 Security Breach&lt;br /&gt;
# 17 Fire Alarm&lt;br /&gt;
# 18 Reset Alarm&lt;br /&gt;
# 39 Air Quality&lt;br /&gt;
# 40 Doorbell&lt;br /&gt;
# 41 Monitor Mode&lt;br /&gt;
# 42 Movement Detected&lt;br /&gt;
# 43 House Mode Changed&lt;br /&gt;
# 44 Presence Detected&lt;br /&gt;
# 45 Presence Lost&lt;br /&gt;
# 67 Alarm Panel Mode Change&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
deviceID = device_.childdevices_[cmd.devidto_].devdata_[12]&lt;br /&gt;
insteonID = deviceID.chomp.split(&#039;.&#039;)&lt;br /&gt;
$cmdID = cmd.id_&lt;br /&gt;
$cmdTo = cmd.devidto_&lt;br /&gt;
childType = device_.childdevices_[cmd.devidto_].devtemplid_&lt;br /&gt;
$cmdFrom = cmd.devidfrom_&lt;br /&gt;
$cmdPriority = cmd.priority_&lt;br /&gt;
$cmdType = cmd.type_&lt;br /&gt;
$cmdParams = cmd.params_&lt;br /&gt;
##Used Only for Thermostat Tempruature Changes########&lt;br /&gt;
$TempParamSplit =cmd.params_.to_s.split(&#039;/&#039;) # splits Tempurature string to allow for heat and cool settings&lt;br /&gt;
$ConvertTempInt = $TempParamSplit[1].to_i * 2&lt;br /&gt;
$ConvertTempHex = $ConvertTempInt.to_s(16) #Converts temp to hex to send to Thermostat&lt;br /&gt;
#################################&lt;br /&gt;
log(&#039;------dce--- cmdID:&#039; + $cmdID.to_s + &#039;, cmdFrom:&#039; + $cmdFrom.to_s + &#039;, cmdTo:&#039; + $cmdTo.to_s + &#039;, cmdType:&#039; + $cmdType.to_s + &#039;, Priority:&#039; + $cmdPriority.to_s)&lt;br /&gt;
if $cmdTo == $cmdFrom&lt;br /&gt;
log(&#039;Detected Command sent to Self!&#039;)&lt;br /&gt;
return&lt;br /&gt;
end&lt;br /&gt;
case cmd.id_&lt;br /&gt;
&lt;br /&gt;
when 278 # Set Temp&lt;br /&gt;
log(&#039;Processing Temp Control command&#039;)&lt;br /&gt;
#log($cmdParams)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
case $TempParamSplit[0].to_s&lt;br /&gt;
when &#039;5C&#039; #sending Heatpoint Tempurature&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6C&#039;, # Defines Cool Setpoint&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; $ConvertTempHex} # send Tempurature Value in Hex&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;5H&#039; #sending Heatpoint Tempurature&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6D&#039;, # Defines Heat Setpoint&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; $ConvertTempHex} # send Tempurature Value in Hex&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 279 #Fan Control&lt;br /&gt;
log(&#039;Processing Fan Control command&#039;)&lt;br /&gt;
log($cmdParams)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
&lt;br /&gt;
case $cmdParams.to_s&lt;br /&gt;
when &#039;81&#039; # Fan ON&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;07&#039;} # Sets Fan to ON&lt;br /&gt;
log(param)&lt;br /&gt;
when &#039;82&#039; # Fan OFF&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;08&#039;} # Sets fan OFF&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 280 # Heat/Cool/Auto&lt;br /&gt;
log(&#039;Processing Heat/Cool/Auto command&#039;)&lt;br /&gt;
#log(&#039;Test Param:&#039; +$cmdParams.to_s)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
case $cmdParams.to_s&lt;br /&gt;
when &#039;8H&#039; # Heat Command&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Indicates device is a Thermostat&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;04&#039;} # sets to Heat Mode&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;8C&#039; # Cool Command&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;05&#039;} # Sets to Cool&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;8A&#039; # Auto Command&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;06&#039;} # Sets to Auto&lt;br /&gt;
&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
when 192 # ON&lt;br /&gt;
log(&#039;Processing ON command&#039;)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
if childType == 2209 then #Used For Thermostat only Sets to Auto, No on command.&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Indicates device is a Thermostat&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;06&#039;} # sets to Auto&lt;br /&gt;
else #Used For Everything else&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;11&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;FF&#039;}&lt;br /&gt;
end&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log &amp;quot;------dce--- X10 DEVICE!!!&amp;quot;&lt;br /&gt;
# Send X10 ON command.&lt;br /&gt;
#first, figure out the house code and unit code.&lt;br /&gt;
log(&#039;DeviceID=&#039; + deviceID)&lt;br /&gt;
x10Byte1 = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10Byte1 += $X10UnitCodes.index(deviceID[1].chr)&lt;br /&gt;
x10cmd = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10cmd += &#039;2&#039; # command code for ON&lt;br /&gt;
log(&#039;X10 Byte1:&#039; + x10Byte1)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10Byte1,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10cmd,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;80&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
reportStatus($children[deviceID], 100)&lt;br /&gt;
when 193 #OFF&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
if childType == 2209 then #Used For Thermostat only&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Indicates Device is Thermostat&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;09&#039;} # Sets to Off&lt;br /&gt;
else&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;13&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
end&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log &amp;quot;------dce--- X10 DEVICE!!!&amp;quot;&lt;br /&gt;
log(&#039;DeviceID=&#039; + deviceID)&lt;br /&gt;
&lt;br /&gt;
x10Byte1 = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10Byte1 += $X10UnitCodes.index(deviceID[1].chr)&lt;br /&gt;
x10cmd = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10cmd += &#039;3&#039; # command code for OFF&lt;br /&gt;
log(&#039;X10 Byte1:&#039; + x10Byte1)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10Byte1,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10cmd,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;80&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
reportStatus($children[deviceID], 0)&lt;br /&gt;
when 193&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
#Needs Work&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 184 #SetLevel&lt;br /&gt;
# convert from percent to hex&lt;br /&gt;
dim_level = percenttohex(cmd.params_[76])&lt;br /&gt;
#log(&amp;quot;------dce--- Dim Level:&amp;quot; + dim_level.to_s)&lt;br /&gt;
if insteonID.length &amp;gt; 2 then&lt;br /&gt;
&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;11&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; dim_level}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
# In the PRESET DIM X10 command, the lsbit of the command code is the MSB of the&lt;br /&gt;
# dim level, and the house code represents the 4 lsbits of the dim level.&lt;br /&gt;
# This is why Pre-Set Dim command is A AND B.&lt;br /&gt;
log(&#039;Parameter 76 = &#039; + cmd.params_[76].to_s)&lt;br /&gt;
log &amp;quot;X10 DEVICE!!! relative Dimming command&amp;quot;&lt;br /&gt;
log(&#039;DeviceID=&#039; + deviceID)&lt;br /&gt;
x10Byte1 = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
x10Byte1 += $X10UnitCodes.index(deviceID[1].chr)&lt;br /&gt;
x10cmd = $X10HouseCodes.index(deviceID[0].chr)&lt;br /&gt;
#first, determine if its UP or Down&lt;br /&gt;
&lt;br /&gt;
if $state[deviceID].to_i &amp;gt; hextopercent(dim_level).to_i&lt;br /&gt;
# DOWN&lt;br /&gt;
x10cmd += $X10CommandCodes.index(&#039;Dim&#039;)&lt;br /&gt;
else&lt;br /&gt;
# UP&lt;br /&gt;
x10cmd += $X10CommandCodes.index(&#039;Bright&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
log(&#039;X10 Byte1:&#039; + x10Byte1)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10Byte1,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndX10&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; x10cmd,&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;80&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
&lt;br /&gt;
SndIns()&lt;br /&gt;
log(&#039;Dim Level:&#039; + hextopercent(dim_level).to_s)&lt;br /&gt;
#now send status info (we should not have to to this, but do)&lt;br /&gt;
reportStatus($children[deviceID], hextopercent(dim_level))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_373&amp;diff=29534</id>
		<title>Insteon PLM Ruby Code 373</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_373&amp;diff=29534"/>
		<updated>2012-02-24T22:36:19Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#### #373 Private Method Listing ####&lt;br /&gt;
&lt;br /&gt;
def mainStart() ## This is called FIRST, reruns cannot call this.&lt;br /&gt;
#Register Message Interceptor&lt;br /&gt;
@interceptor = Command.new(device_.devid_, -1000, 1, 5, 37)&lt;br /&gt;
@interceptor.params_[2] = device_.devid_.to_s&lt;br /&gt;
SendCommand(@interceptor)&lt;br /&gt;
&lt;br /&gt;
#Get the PLM Database&lt;br /&gt;
sendGetLink&lt;br /&gt;
#get Child devices&lt;br /&gt;
log(&#039;Finding Children..&#039;)&lt;br /&gt;
device_.childdevices_.each{|c|&lt;br /&gt;
if device_.childdevices_[c.to_s.to_i].devdata_[12].include? &amp;quot;Group&amp;quot;&lt;br /&gt;
log(&#039;FOUND A GROUP&#039;)&lt;br /&gt;
else&lt;br /&gt;
$children[device_.childdevices_[c.to_s.to_i].devdata_[12].chomp.lstrip.rstrip] = c.to_s.to_i&lt;br /&gt;
end}&lt;br /&gt;
$children.keys.each{|c| log(c + &#039; = &#039; + $children[c].to_s)&lt;br /&gt;
}&lt;br /&gt;
log(&#039;reading stored Child configuration:&#039;)&lt;br /&gt;
&lt;br /&gt;
$children.keys.each{|c|&lt;br /&gt;
#Get each Childs configuration&lt;br /&gt;
$state[$children[c]] = 0&lt;br /&gt;
getdeviceconfig(c) #&lt;br /&gt;
&lt;br /&gt;
#the above getdeviceconfig packs $configparams array&lt;br /&gt;
log(&#039;Configuration for &#039; + c + &#039; = &#039; + $configparams.inspect.to_s)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
log(&#039;********************************************************&#039;)&lt;br /&gt;
#get childs actual configuation and status&lt;br /&gt;
$children.keys.each{|c| sendGetChildStatus(c)}&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
def mainRestart()&lt;br /&gt;
#We have hashes already set up.&lt;br /&gt;
$childdatabases.each_key{|@insteonID|&lt;br /&gt;
$state[$children[@insteonID]] = 0&lt;br /&gt;
sendGetChildStatus(@insteonID)}&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def setdeviceconfig(insteonid, configurestring)&lt;br /&gt;
@deviceid = $children[insteonid]&lt;br /&gt;
@cmdfrom = device_.devid_&lt;br /&gt;
@cmdto = 4 #general info plugin&lt;br /&gt;
@priority = 1&lt;br /&gt;
@type=1 #command&lt;br /&gt;
@cmdid = 246&lt;br /&gt;
&lt;br /&gt;
#set up command..&lt;br /&gt;
@cmd = Command.new(@cmdfrom, @cmdto, @priority, @type, @cmdid)&lt;br /&gt;
@cmd.params_[2] = @deviceid.to_s&lt;br /&gt;
@cmd.params_[52] = &#039;59&#039; # Configuration&lt;br /&gt;
@cmd.params_[5] = configurestring&lt;br /&gt;
SendCommand(@cmd)&lt;br /&gt;
log(&#039;SetDeviceConfig:&#039; + @cmd.to_s)&lt;br /&gt;
#log(&#039;SetDeviceConfig:&#039; + configurestring)&lt;br /&gt;
#log(&#039;Configuration Saved - will be available on next reload&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def getdeviceconfig(insteonid)&lt;br /&gt;
@deviceid = $children[insteonid]&lt;br /&gt;
@configstring = &#039;&#039;&lt;br /&gt;
begin&lt;br /&gt;
@configstring = device_.childdevices_[@deviceid].devdata_[59].to_s&lt;br /&gt;
rescue&lt;br /&gt;
log(&#039;Device ID = &#039; + @deviceid.to_s)&lt;br /&gt;
log($red + &#039;Error - Child has no configuration&#039;+ $grey)&lt;br /&gt;
log(&#039;Setting initial value of &amp;quot;****************&amp;quot;&#039;)&lt;br /&gt;
setdeviceconfig(insteonid, (&#039;*&#039; * 16))&lt;br /&gt;
@configstring = &#039;*&#039; * 16&lt;br /&gt;
sendPing(insteonid)&lt;br /&gt;
end&lt;br /&gt;
if @configstring == &#039;&#039;&lt;br /&gt;
$configparams = [&#039;****************&#039;]&lt;br /&gt;
log(&#039;CAUGHT BLANK RECORD&#039;)&lt;br /&gt;
setdeviceconfig(insteonid, (&#039;*&#039; * 16))&lt;br /&gt;
sendPing(insteonid)&lt;br /&gt;
else&lt;br /&gt;
$configparams = @configstring.unpack(&#039;a16&#039; * (@configstring.length / 16))&lt;br /&gt;
$devicetemplate[insteonid] = getdevicetemplate($configparams[0][0..1], $configparams[0][2..3])&lt;br /&gt;
end&lt;br /&gt;
#log($yellow + &#039;getdeviceconfig:&#039; + $configparams.inspect + $grey)&lt;br /&gt;
#add the configuration parameters to the child database&lt;br /&gt;
$childdatabases[insteonid] = $configparams&lt;br /&gt;
#get the device type&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def sendGetLink()&lt;br /&gt;
#lets just see exactly what is in the PLM database&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;GetLnk&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def sendGetNext()&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;GetNext&#039;}&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(1, param)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(0,param)&lt;br /&gt;
end&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def sendRemoteGetLink(insteonID)&lt;br /&gt;
# Read First ALDB Record&lt;br /&gt;
# a few variables need to be set up here..&lt;br /&gt;
$recordof = insteonID # save the insteon ID&lt;br /&gt;
insID = insteonID.chomp.split(&#039;.&#039;) # get the seperate bytes&lt;br /&gt;
$remoteDBOffsetMSB = 0x0F # initial offset&lt;br /&gt;
$remoteDBOffsetLSB = 0xF8 # initial LSB offset&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insID[0], #HB&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insID[1], #MB&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insID[2], #LB&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;, #Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;28&#039;, #Cmd1&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &amp;quot;%X&amp;quot; %$remoteDBOffsetMSB #Cmd2 Set MSB Offset&lt;br /&gt;
}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
# repeat last param for each byte to read (F8..FF)=first record&lt;br /&gt;
&lt;br /&gt;
for x in 0..7&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insID[0], #HB&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insID[1], #MB&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insID[2], #LB&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;, #Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;2B&#039;, #Cmd1 Peek&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &amp;quot;%X&amp;quot; %($remoteDBOffsetLSB + x) #Cmd2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def sendRemoteGetNext(insteonID)&lt;br /&gt;
insID = insteonID.chomp.split(&#039;.&#039;) # get the seperate bytes&lt;br /&gt;
### Do NOT forget to check to see if we need to decrease the MSB&lt;br /&gt;
&lt;br /&gt;
if $remoteDBOffsetLSB == 0x00&lt;br /&gt;
#OffsetMSB needs to be decreased, and LSB needs reset.&lt;br /&gt;
$remoteDBOffsetMSB = $remoteDBOffsetMSB - 1&lt;br /&gt;
$remoteDBOffsetLSN = 0xFF # the next line will decrease this by 8&lt;br /&gt;
end&lt;br /&gt;
# decrease DBOffsetLSB by 0x08&lt;br /&gt;
$remoteDBOffsetLSB = $remoteDBOffsetLSB - 0x08&lt;br /&gt;
&lt;br /&gt;
for x in 0..7&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insID[0], #HB&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insID[1], #MB&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insID[2], #LB&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;, #Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;2B&#039;, #Cmd1 Peek&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &amp;quot;%X&amp;quot; %($remoteDBOffsetLSB + x) #Cmd2&lt;br /&gt;
}&lt;br /&gt;
#log(&#039;sendRemoteGetNet:added to queue:&#039; + param.inspect)&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(x + 1, param)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(x,param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
### Main command parsing routine is EZToDCE&lt;br /&gt;
def EZToDCE(param)&lt;br /&gt;
#param contains a hash of EZBridge command structure&lt;br /&gt;
#log($blue + &#039;Queue:&#039; + $cmdqueue[0].inspect + $grey)&lt;br /&gt;
#log($blue + &#039;Param:&#039; + param.inspect + $grey)&lt;br /&gt;
#log($blue + &#039;currentcmd:&#039; + $currentcmd.to_s + $grey)&lt;br /&gt;
#checkWait(param)&lt;br /&gt;
case param[&#039;Response&#039;]&lt;br /&gt;
# Standard RESPONSES (to commands)&lt;br /&gt;
when &#039;GetRevision&#039; # Special Response&lt;br /&gt;
log(&#039;-----|---------GetRevision:&#039; + param[&#039;Parameter1&#039;])&lt;br /&gt;
&lt;br /&gt;
when &#039;GetLatLong&#039; # Special Response&lt;br /&gt;
log(&#039;-----|---------GetLatLong: Lat=&#039; + param[&#039;Lat&#039;] + &#039;, Long=&#039; + param[&#039;Long&#039;])&lt;br /&gt;
&lt;br /&gt;
when &#039;SetLatLong&#039;&lt;br /&gt;
if param[&#039;Parameter1&#039;] == &#039;True&#039; then&lt;br /&gt;
log(&#039;-----|---------SetLatLong: Ok&#039;)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;-----X---------SetLatLong: FAILED!&#039;)&lt;br /&gt;
end&lt;br /&gt;
when &#039;SetPasswd&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;SetTimeZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetClock&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;SetClock&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;SetNTPServer&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;Upgrade&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;NetCfg&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;Reset&#039;&lt;br /&gt;
#Reset Response&lt;br /&gt;
&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
when &#039;LstTimers&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when &#039;ClrTimers&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;AddTimer&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetTimer&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;SetTimer&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;DelTimer&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetVersion&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;SndGrp&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;SndIns&#039; # response from SndIns&lt;br /&gt;
### BUG FOUND ### When the EZBridge receives a command from an EXTERNAL source&lt;br /&gt;
### ie not from this device, cmdqueue will be nil, and the code below&lt;br /&gt;
### fails. Have to check against that.&lt;br /&gt;
if $cmdqueue.length &amp;gt; 0&lt;br /&gt;
#First, check the response to make sure the command made it ok.&lt;br /&gt;
if param[&#039;Parameter9&#039;].to_i == 6 #Ack received&lt;br /&gt;
#log(&#039;Sending to ProcessACK&#039;)&lt;br /&gt;
processACK(param)&lt;br /&gt;
else # NACK received - command failed.&lt;br /&gt;
log(&#039;Command NACKED&#039;)&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
#Response received for another device.&lt;br /&gt;
log(&#039;Response detected for a command that was not sent by me&#039;)&lt;br /&gt;
end&lt;br /&gt;
when &#039;SndX10&#039;&lt;br /&gt;
log(&#039;Response detected for SndX10&#039;)&lt;br /&gt;
if param[&#039;Parameter5&#039;].to_i == 6 #ack&lt;br /&gt;
log(&#039;X10 Command Successfull&#039;)&lt;br /&gt;
&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;X10 Command FAILED&#039;)&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
when &#039;StLnk&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;CancelLnk&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;SetDev&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;RstPLM&#039;&lt;br /&gt;
#Reset Response&lt;br /&gt;
$timeout = 1&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;GetLnk&#039;&lt;br /&gt;
if param[&#039;Parameter3&#039;].to_i == 6 #ack&lt;br /&gt;
log(&#039;GetLnk ACKED&#039;)&lt;br /&gt;
#if we get this, we should get a AllLink Record Response next&lt;br /&gt;
else&lt;br /&gt;
log(&#039;GetLnk NACKED&#039;)&lt;br /&gt;
# The PLM is BLANK&lt;br /&gt;
#have to add records to the PLM here.&lt;br /&gt;
cmdComplete&lt;br /&gt;
### FINISHED WITH GetLnk&lt;br /&gt;
checkChildRecordsinPLM()&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
when &#039;GetNext&#039;&lt;br /&gt;
if param[&#039;Parameter3&#039;].to_i == 6 #ack&lt;br /&gt;
log(&#039;sendGetNext ACKED&#039;)&lt;br /&gt;
#if we get this, we should get a AllLink Record Response next&lt;br /&gt;
else&lt;br /&gt;
log(&#039;sendGetNext NACKED&#039;)&lt;br /&gt;
#we get this when there are no more records&lt;br /&gt;
cmdComplete&lt;br /&gt;
#FINISHED with GetNext&lt;br /&gt;
# if we are here, we are in config mode&lt;br /&gt;
# so, next is to check to make sure the&lt;br /&gt;
# childrens insteon ID is in the PLM&lt;br /&gt;
checkChildRecordsinPLM()&lt;br /&gt;
# now, to make sure that all the records in the PLM are sensed as children&lt;br /&gt;
&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when &#039;SetCfg&#039; # response from Setcfg command&lt;br /&gt;
if param[&#039;Parameter4&#039;].to_i == 6 #ack&lt;br /&gt;
log(&#039;SetCfg Completed&#039;)&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;SetCfg NACKED&#039;)&lt;br /&gt;
end&lt;br /&gt;
when &#039;GetLnkData&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;LEDON&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;LEDOFF&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;MngLnk&#039;&lt;br /&gt;
if param[&#039;Parameter12&#039;].to_i == 6&lt;br /&gt;
log(&#039;MngLnk =&amp;gt; ACK&#039;)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;MngLnk =&amp;gt; NACK&#039;)&lt;br /&gt;
end&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;GetCfg&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;LstMacros&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;ClrMacros&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;AddMacro&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetMacro&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;SetMacro&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;DelMacro&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;LstDevices&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;ClrDevices&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;AddDevice&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetDevice&#039; # Special Response&lt;br /&gt;
&lt;br /&gt;
when &#039;SetDevice&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;DelDevice&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;LstZones&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;ClrZones&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;AddZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;GetZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;SetZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;DelZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;AddDevZone&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;DelDevZone&#039;&lt;br /&gt;
&lt;br /&gt;
# Response Messages&lt;br /&gt;
when &#039;InsExtMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when &#039;InsStdMsg&#039;&lt;br /&gt;
case $currentcmd # if this msg is part of a response, the Insteon Cmd1 will be saved here.&lt;br /&gt;
when 0x0&lt;br /&gt;
#log(&#039;REROUTING to processExternalCommand(param)&#039;)&lt;br /&gt;
processExternalCommand(param)&lt;br /&gt;
when 0x1 #Assign to Group&lt;br /&gt;
### This is a broadcast message sent&lt;br /&gt;
# from a PING command&lt;br /&gt;
# or from a StartLink...&lt;br /&gt;
log(&#039;Caught Assign to Group Message from Device&#039;)&lt;br /&gt;
### BUG HERE&lt;br /&gt;
#have to check flags to see if this is a broadcast message&lt;br /&gt;
log(&#039;Checking if this is a broadcast message&#039;)&lt;br /&gt;
log(&#039;Flags:&#039; + param[&#039;Parameter9&#039;])&lt;br /&gt;
if (param[&#039;Parameter9&#039;].hex &amp;amp; 0x80) == 0x80&lt;br /&gt;
log(&#039;Message IS BROADCAST&#039;)&lt;br /&gt;
#recvComplete&lt;br /&gt;
processDeviceInfo(param)&lt;br /&gt;
&lt;br /&gt;
# check to see if current cmd is for this broadcast..&lt;br /&gt;
log(&#039;Current Command:&#039; + $cmdqueue[0][&#039;Parameter5&#039;])&lt;br /&gt;
if $cmdqueue[0][&#039;Parameter5&#039;] == &#039;10&#039;&lt;br /&gt;
#log(&#039;Clearing PING Command&#039;)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;CURRENT CMD IS NOT PING - NOT CLEARING&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Message is NOT Broadcast&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x2 #Delete from Group&lt;br /&gt;
when 0x10 # PING&lt;br /&gt;
#this is where I catch the InsStdMsg for ping.&lt;br /&gt;
log(&#039;Caught PING Message from Device&#039;)&lt;br /&gt;
$currentcmd = 1&lt;br /&gt;
&lt;br /&gt;
when 0x11 # ON&lt;br /&gt;
log(&#039;Caught Insteon ON from INTERNAL source&#039;)&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
log(&#039;Current DIM level:&#039; + param[&#039;Parameter11&#039;])&lt;br /&gt;
&lt;br /&gt;
reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
&lt;br /&gt;
SndIns()&lt;br /&gt;
when 0x13 # OFF&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
reportStatus(myDevFrom, 0)&lt;br /&gt;
&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
SndIns()&lt;br /&gt;
#####Thermostat Does Not report Status correctly Yet. Have to figure out reportStatus###&lt;br /&gt;
when 0x6A #Thermostat Control Get Zone Data (Temp, Setpoint,Humidity)&lt;br /&gt;
log(&#039;Thermostat returned Zone Info: &#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when 0x6B #Thermostat Control Command Handle Response&lt;br /&gt;
log(&#039;Thermostat returned: &#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
case param[&#039;Parameter11&#039;].to_s&lt;br /&gt;
when &#039;06&#039; # ON/Auto&lt;br /&gt;
# $ThermostatStatus = &#039;ON/Auto&#039; ##not used&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 6)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;09&#039; #OFF&lt;br /&gt;
# $ThermostatStatus = &#039;OFF&#039; ## not used may be for reportstatus&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 9)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;04&#039; # Heat&lt;br /&gt;
#$ThermostatStatus = &#039;HEAT&#039;&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 4)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;05&#039; # Cool&lt;br /&gt;
#$ThermostatStatus = &#039;COOL&#039;&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 5)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when &#039;07&#039; # Fan On&lt;br /&gt;
2#$ThermostatStatus = &#039;COOL&#039;&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 5)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when &#039;08&#039; # Fan Off&lt;br /&gt;
#$ThermostatStatus = &#039;COOL&#039;&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
#log(&#039;Current Thermostat State:&#039; + $ThermostatStatus)&lt;br /&gt;
#reportStatus(myDevFrom, 5)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when 0x6C #Thermostat Control Get Zone Cool Point Data&lt;br /&gt;
log(&#039;Thermostat returned Zone Info: &#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
log(&#039;Current Zone level:&#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
#reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when 0x6D #Thermostat Control Get Zone Heat Point Data&lt;br /&gt;
log(&#039;Thermostat returned Zone Info: &#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
log(&#039;Current Zone level:&#039; + param[&#039;Parameter11&#039;].to_s)&lt;br /&gt;
#reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when 0x19 # Status Report&lt;br /&gt;
# now to clear the currentcmd and remove command from the queue&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
cmdComplete&lt;br /&gt;
&lt;br /&gt;
log(&#039;Processing 0x19 Status Report&#039;)&lt;br /&gt;
#This is where I get the database delta (in cmd1)&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
#First, to compare the DB Delta with current config.&lt;br /&gt;
#Database Delta...&lt;br /&gt;
delta = param[&#039;Parameter10&#039;].to_s&lt;br /&gt;
log($blue + &#039;Database Delta=&#039; + delta + $grey)&lt;br /&gt;
log($blue + &#039;Configuration is:&#039; + getdeltafromconfig(insID) + $grey)&lt;br /&gt;
if delta == getdeltafromconfig(insID)&lt;br /&gt;
if $children[insID] != nil&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
myDevTo = -1000 #DCE Router&lt;br /&gt;
myPriority = 1&lt;br /&gt;
myType = 2 #Event&lt;br /&gt;
&lt;br /&gt;
#Send an EVENT to report STATE ONLY if database has not changed&lt;br /&gt;
# AND child exists in pluto&lt;br /&gt;
reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Databse CHANGED -getting remote database&#039;)&lt;br /&gt;
#here, I have to WIPE the databse&lt;br /&gt;
# to prepare it for new data&lt;br /&gt;
### here is where the DAMN CONFIG was reset!!!&lt;br /&gt;
oldconfigstring = $childdatabases[insID][0]&lt;br /&gt;
$childdatabases[insID] = [oldconfigstring]&lt;br /&gt;
log(&#039;Setting Database Config&#039;)&lt;br /&gt;
$childdatabases[insID][0][6..7] = delta&lt;br /&gt;
savechilddatabases(insID)&lt;br /&gt;
sendRemoteGetLink(insID)&lt;br /&gt;
end&lt;br /&gt;
# finally, to check execute next command...&lt;br /&gt;
SndIns()&lt;br /&gt;
when 0x28 # Set Address MSB&lt;br /&gt;
log(&#039;Received SET Address MSB from remote device&#039;)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
$remoteLinkRecord = &#039;&#039;&lt;br /&gt;
cmdComplete&lt;br /&gt;
SndIns()&lt;br /&gt;
when 0x2B # peek&lt;br /&gt;
### BUG HERE... have to verify response is a PEEK command&lt;br /&gt;
#response command is stored in parameter10&lt;br /&gt;
if param[&#039;Parameter10&#039;].hex == 0x2B # this is the peek command&lt;br /&gt;
cmdComplete&lt;br /&gt;
log(&#039;Received PEEK from remote Device! DATA=&#039; + param[&#039;Parameter11&#039;])&lt;br /&gt;
checkPeekData(param)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Waiting for remote PEEK response, but got :&#039; + param[&#039;Parameter10&#039;])&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when &#039;X10Msg&#039;&lt;br /&gt;
log($purple + &#039;X10 Message Received&#039; + $grey)&lt;br /&gt;
if param[&#039;Parameter4&#039;].hex == 0x00&lt;br /&gt;
log(&#039;This byte is a House/Unit Code&#039;)&lt;br /&gt;
hn = param[&#039;Parameter3&#039;][0].chr&lt;br /&gt;
ln = param[&#039;Parameter3&#039;][1].chr&lt;br /&gt;
$x10byte1 = $X10HouseCodes[hn]&lt;br /&gt;
$x10byte1 += $X10UnitCodes[ln]&lt;br /&gt;
log(&#039;Translated X10 House/Unit Code:&#039; + $x10byte1)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;This byte is a House/Command Code&#039;)&lt;br /&gt;
hn = param[&#039;Parameter3&#039;][0].chr&lt;br /&gt;
ln = param[&#039;Parameter3&#039;][1].chr&lt;br /&gt;
$x10byte2 = $X10HouseCodes[hn]&lt;br /&gt;
$x10byte2 += $X10CommandCodes[ln]&lt;br /&gt;
log(&#039;Translated X10 Command Code:&#039; + $x10byte2)&lt;br /&gt;
log(&#039;X10 Command ready to send:&#039; + $x10byte1 + &#039; &#039; + $x10byte2)&lt;br /&gt;
case $X10CommandCodes[ln]&lt;br /&gt;
when &#039;On&#039;&lt;br /&gt;
#Send ON to lmnce&lt;br /&gt;
if $children[$x10byte1] == nil&lt;br /&gt;
log(&#039;I do not control this X10 device&#039;)&lt;br /&gt;
else&lt;br /&gt;
cmd = Command.new($children[$x10byte1].to_i, -1000, 1, 1, 192)&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
when &#039;Off&#039;&lt;br /&gt;
#Send OFF to lmnce&lt;br /&gt;
if $children[$x10byte1] == nil&lt;br /&gt;
log(&#039;I do not control this X10 device&#039;)&lt;br /&gt;
else&lt;br /&gt;
cmd = Command.new($children[$x10byte1].to_i, -1000, 1, 1, 193)&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
when &#039;Bright&#039;&lt;br /&gt;
if $children[$x10byte1] == nil&lt;br /&gt;
log(&#039;I do not control this X10 device&#039;)&lt;br /&gt;
else&lt;br /&gt;
#send a command to set the state + 1&lt;br /&gt;
@curstate = ($state[$x10byte1] / 100) * 32 #get equal 32 steps&lt;br /&gt;
$state[$x10byte1] = ((@curstate + 1) / 32) * 100&lt;br /&gt;
cmd = Command.new($children[$x10byte1].to_i, -1000, 1, 1, 184)&lt;br /&gt;
cmd.params_[76] = $state[$x10byte1].to_s&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
#$state[$x10byte1] = ($state[$x10byte1] / 100) * 32&lt;br /&gt;
end&lt;br /&gt;
when &#039;Dim&#039;&lt;br /&gt;
@curstate = ($state[$x10byte1] / 100) * 32 #get equal 32 steps&lt;br /&gt;
$state[$x10byte1] = ((@curstate - 1) / 32) * 100&lt;br /&gt;
cmd = Command.new($children[$x10byte1].to_i, -1000, 1, 1, 184)&lt;br /&gt;
cmd.params_[76] = $state[$x10byte1].to_s&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
when &#039;All Lights Off&#039;&lt;br /&gt;
log(&#039;ALL Lights OFF Command not implemented&#039;)&lt;br /&gt;
when &#039;All Lights On&#039;&lt;br /&gt;
log(&#039;All Lights ON Command not implemented&#039;)&lt;br /&gt;
when &#039;Status Request&#039;&lt;br /&gt;
log(&#039;Status Request Command not implemented&#039;)&lt;br /&gt;
when &#039;Hail Ack&#039;&lt;br /&gt;
log(&#039;Hail Ack Command not implemented&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
when &#039;InsLnkSts&#039;&lt;br /&gt;
log(&#039;InsLnkSts Received&#039;)&lt;br /&gt;
&lt;br /&gt;
when &#039;BtnRpt&#039;&lt;br /&gt;
log(&#039;Button Report Received&#039;)&lt;br /&gt;
when &#039;UsrRst&#039;&lt;br /&gt;
log(&#039;User Reset Response Received&#039;)&lt;br /&gt;
when &#039;GrpEvntRpt&#039;&lt;br /&gt;
log(&#039;Group Event Report Received&#039;)&lt;br /&gt;
&lt;br /&gt;
when &#039;LnkData&#039;&lt;br /&gt;
processLnkData(param)&lt;br /&gt;
# Other messages&lt;br /&gt;
when &#039;PLMTimeout&#039;&lt;br /&gt;
log(&#039;PLM Timeout detected.. resetting EZBridge&#039;)&lt;br /&gt;
resetcmd = {&#039;Command&#039; =&amp;gt; &#039;Reset&#039;}&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(1, resetcmd)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(0,resetcmd)&lt;br /&gt;
end&lt;br /&gt;
sleep 15&lt;br /&gt;
$wAIT = false&lt;br /&gt;
SndIns()&lt;br /&gt;
when &#039;PLMEchoError&#039; # Have not seen this since a1.23&lt;br /&gt;
# error sending command to PLM, reset command and try again&lt;br /&gt;
log(&#039;-----XXXXXXX&#039; + param[&#039;Response&#039;])&lt;br /&gt;
resetcmd = {&#039;Command&#039; =&amp;gt; &#039;Reset&#039;}&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(1, resetcmd)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(0,resetcmd)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sleep 15&lt;br /&gt;
$wAIT = false&lt;br /&gt;
SndIns()&lt;br /&gt;
when &#039;LongAck&#039;&lt;br /&gt;
log(&#039;-----XXXXXXX&#039; + param[&#039;Response&#039;])&lt;br /&gt;
# Error - seems to show up after PLMEchoError&lt;br /&gt;
resetcmd = {&#039;Command&#039; =&amp;gt; &#039;Reset&#039;}&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(1, resetcmd)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(0,resetcmd)&lt;br /&gt;
end&lt;br /&gt;
sleep 15&lt;br /&gt;
$wAIT = false&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;-----XXXXXXX UNKNOWN Response Received&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
### Support routine for EZToDCE&lt;br /&gt;
def processLnkData(param)&lt;br /&gt;
#Caught a LnkData Response&lt;br /&gt;
log(&#039;LnkData Message Received&#039;)&lt;br /&gt;
log(param.inspect)&lt;br /&gt;
if param[&#039;Parameter6&#039;] == &#039;00&#039; and param[&#039;Parameter7&#039;] == &#039;00&#039;&lt;br /&gt;
log(&#039;FOUND X10 DEVICE!!!&#039;)&lt;br /&gt;
insteonID = padhex(param[&#039;Parameter5&#039;])&lt;br /&gt;
else&lt;br /&gt;
insteonID = padhex(param[&#039;Parameter5&#039;]) + &#039;.&#039; + padhex(param[&#039;Parameter6&#039;]) + &#039;.&#039; + padhex(param[&#039;Parameter7&#039;])&lt;br /&gt;
end&lt;br /&gt;
group = param[&#039;Parameter4&#039;]&lt;br /&gt;
recflags = param[&#039;Parameter3&#039;]&lt;br /&gt;
lnkdata1 = param[&#039;Parameter8&#039;]&lt;br /&gt;
lnkdata2 = param[&#039;Parameter9&#039;]&lt;br /&gt;
lnkdata3 = param[&#039;Parameter10&#039;]&lt;br /&gt;
#pack string to store for PLM Database&lt;br /&gt;
@currentrecord = recflags + group&lt;br /&gt;
@currentrecord += param[&#039;Parameter5&#039;] + param[&#039;Parameter6&#039;] + param[&#039;Parameter7&#039;]&lt;br /&gt;
@currentrecord += lnkdata1 + lnkdata2 + lnkdata3&lt;br /&gt;
&lt;br /&gt;
#Add to plmdatabase&lt;br /&gt;
$plmdatabase &amp;lt;&amp;lt; @currentrecord&lt;br /&gt;
log(&#039;record Flags:&#039; + recflags)&lt;br /&gt;
#log(&#039;PLM database=&#039; +$plmdatabase.inspect)&lt;br /&gt;
if (recflags[0] &amp;amp; 0x80) == 0x80 # Record is in use if true&lt;br /&gt;
end&lt;br /&gt;
if (recflags[0] &amp;amp; 0x40) == 0x40 # Controller if true&lt;br /&gt;
log(&#039;Controller&#039;)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Responder&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
log(&#039;Insteon ID:&#039; + insteonID + &#039;, Group:&#039; + group)&lt;br /&gt;
&lt;br /&gt;
cmdComplete&lt;br /&gt;
sendGetNext()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
### Support Routine for EZToDCE&lt;br /&gt;
def processExternalCommand(param)&lt;br /&gt;
#there is no current command&lt;br /&gt;
# THIS IS COMING FROM AN OUTSIDE SOURCE&lt;br /&gt;
#EG: Manually turning Light Switch On/Off&lt;br /&gt;
# process this command.&lt;br /&gt;
# Note, this is a standard message&lt;br /&gt;
### have to check here if child is mine!&lt;br /&gt;
&lt;br /&gt;
# This is where I have to check for a broadcast command..&lt;br /&gt;
#if so, search the child databases for responders,&lt;br /&gt;
#and fire events for each responder.&lt;br /&gt;
#Message flag is in parameter9 Group command 0xCx (All-Link Broadcast Message Pg 42.)&lt;br /&gt;
#Group is in parameter8&lt;br /&gt;
#From InsteonID is parameters 3, 4, 5&lt;br /&gt;
if (param[&#039;Parameter9&#039;].hex &amp;amp; 0xC0) == 0xC0 # Message is Broadcast&lt;br /&gt;
log(&#039;Rerouting to processBroadcastMessage&#039;)&lt;br /&gt;
processBroadcastMessage(param)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Process External Command:&#039;)&lt;br /&gt;
log(&#039;Param:&#039; + param.inspect)&lt;br /&gt;
&lt;br /&gt;
# there is no ack here. Simply Send COMMANDS back to DCE&lt;br /&gt;
# and Complete the recv..&lt;br /&gt;
case param[&#039;Parameter10&#039;].hex #this is the command&lt;br /&gt;
when 0x01 #Assign to Group&lt;br /&gt;
log(&#039;Caught EXTERNAL Assign to Group&#039;)&lt;br /&gt;
processDeviceInfo(param)&lt;br /&gt;
recvComplete&lt;br /&gt;
when 0x02 #Delete from Group&lt;br /&gt;
when 0x02 #Delete from Group&lt;br /&gt;
log(&#039;Caught EXTERNAL Delete from Group&#039;)&lt;br /&gt;
recvComplete&lt;br /&gt;
when 0x10 # PING&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon PING result&#039;)&lt;br /&gt;
recvComplete&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when 0x11 #ON&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon ON command result&#039;)&lt;br /&gt;
#on level is in cmd2&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
log(&#039;From:&#039; +insID)&lt;br /&gt;
log(&#039;Device:&#039; + $children[insID].to_s)&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
# check to see if I own child&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
reportStatus(myDevFrom, hextopercent(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
end&lt;br /&gt;
recvComplete&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when 0x13 #OFF&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon OFF result&#039;)&lt;br /&gt;
#on level is in cmd2&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
reportStatus(myDevFrom, 0)&lt;br /&gt;
&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
end&lt;br /&gt;
recvComplete&lt;br /&gt;
&lt;br /&gt;
when 0x6A #Thermostat Zone Command&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon Thermostat result&#039;)&lt;br /&gt;
#on level is in cmd2&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
#case param[&#039;Parameter11&#039;].to_s&lt;br /&gt;
#when &#039;00&#039;&lt;br /&gt;
reportStatus(myDevFrom, hextoTempurature(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
#when &#039;60&#039; #humidity&lt;br /&gt;
#when &#039;20&#039;#setpoint&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 0x6B #Thermostat Mode Command&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon Thermostat result&#039;)&lt;br /&gt;
#on level is in cmd2 ie( HEAT(0x04), COOL(0x05), or AUTO(0x06))&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
#reportStatus(myDevFrom, 0)&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 0x6C #Thermostat Zone Cool Command&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon Thermostat result&#039;)&lt;br /&gt;
#on level is in cmd2&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
reportStatus(myDevFrom, hextoTempurature(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 0x6D #Thermostat Zone Heat Command&lt;br /&gt;
log(&#039;Caught EXTERNAL Insteon Thermostat result&#039;)&lt;br /&gt;
#on level is in cmd2&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = insHb + &amp;quot;.&amp;quot; + insMb + &amp;quot;.&amp;quot; + insLb&lt;br /&gt;
myDevFrom = $children[insID]&lt;br /&gt;
if myDevFrom == nil&lt;br /&gt;
log(&#039;I do not control this device.&#039;)&lt;br /&gt;
else&lt;br /&gt;
reportStatus(myDevFrom, hextoTempurature(param[&#039;Parameter11&#039;]))&lt;br /&gt;
$currentcmd = 0&lt;br /&gt;
#log(&#039;EVENT and state SENT!!!.48:[10]=0&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
when 0x15; log(&#039;Caught EXTERNAL Insteon Brighten Result&#039;)&lt;br /&gt;
when 0x16; log(&#039;Caught EXTERNAL Insteon DIM Result&#039;)&lt;br /&gt;
when 0x24; log(&#039;Caught EXTERNAL Insteon DO EE READ&#039;)&lt;br /&gt;
when 0x28; log(&#039;Caught EXTERNAL Insteon SET ADDRESS MSB&#039;)&lt;br /&gt;
when 0x29; log(&#039;Caught EXTERNAL Insteon POKE&#039;)&lt;br /&gt;
when 0x2A; log(&#039;Caught EXTERNAL Insteon POKE EXTENDED&#039;)&lt;br /&gt;
when 0x2B; log(&#039;Caught EXTERNAL Insteon PEEK&#039;)&lt;br /&gt;
when 0x2C; log(&#039;Caught EXTERNAL Insteon PEEK INTERNAL&#039;)&lt;br /&gt;
when 0x2D; log(&#039;Caught EXTERNAL Insteon POKE INTERNAL&#039;)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Unknown EXTERNAL Insteon Command.&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
### Support Routine for EZToDCE&lt;br /&gt;
def processACK(param)&lt;br /&gt;
#log(&#039;In ProcessACK: Param7:&#039; + param[&#039;Parameter7&#039;])&lt;br /&gt;
#log(&#039;CurrentCmd=&#039; + $currentcmd.to_s)&lt;br /&gt;
case param[&#039;Parameter7&#039;].hex #Received an ack to THIS command&lt;br /&gt;
when 0x1 #Assign to Group&lt;br /&gt;
log(&#039;Got Assign to Group ACK&#039;)&lt;br /&gt;
$currentcmd = 0x01&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
#processDeviceInfo(param)&lt;br /&gt;
#cmdComplete&lt;br /&gt;
when 0x2 #Delete from Group&lt;br /&gt;
when 0x10 # PING&lt;br /&gt;
log(&#039;Got PING ACK&#039;)&lt;br /&gt;
#cmdComplete&lt;br /&gt;
$currentcmd = 0x1&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x11 #ON&lt;br /&gt;
$currentcmd = 0x11&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x13 #OFF&lt;br /&gt;
$currentcmd = 0x13&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x6A #Thermostat Zone Command&lt;br /&gt;
$currentcmd = 0x6A&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x6B #Thermostat Control Command&lt;br /&gt;
$currentcmd = 0x6B&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x6C #Thermostat Cool Command&lt;br /&gt;
$currentcmd = 0x6C&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x6D #Thermostat Cool Command&lt;br /&gt;
$currentcmd = 0x6D&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x15 #Bright&lt;br /&gt;
$currentcmd = 0x15&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x16 #DIM&lt;br /&gt;
$currentcmd = 0x16&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x17 #Start Manual Change&lt;br /&gt;
when 0x18 #Stop Manual Change&lt;br /&gt;
when 0x19 #Status Request&lt;br /&gt;
# Status Request Acked - get ready for InsStdMsg&lt;br /&gt;
$currentcmd = 0x19&lt;br /&gt;
# change cmd to reflect InsStdMsg&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x24&lt;br /&gt;
log(&#039;Caught ACK for Insteon DO EE READ&#039;)&lt;br /&gt;
$currentcmd = 0x24&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x28&lt;br /&gt;
log(&#039;Caught ACK for Insteon SET ADDRESS MSB&#039;)&lt;br /&gt;
$currentcmd = 0x28&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when 0x29&lt;br /&gt;
log(&#039;Caught ACK for Insteon POKE&#039;)&lt;br /&gt;
$currentcmd = 0x29&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when 0x2A&lt;br /&gt;
log(&#039;Caught ACK for Insteon POKE EXTENDED&#039;)&lt;br /&gt;
$currentcmd = 0x2A&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when 0x2B&lt;br /&gt;
#log(&#039;Caught ACK for Insteon PEEK&#039;)&lt;br /&gt;
$currentcmd = 0x2B&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when 0x2C&lt;br /&gt;
log(&#039;Caught ACK for Insteon PEEK INTERNAL&#039;)&lt;br /&gt;
$currentcmd = 0x2C&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
when 0x2D&lt;br /&gt;
log(&#039;Caught ACK for Insteon POKE INTERNAL&#039;)&lt;br /&gt;
$currentcmd = 0x2D&lt;br /&gt;
$cmdqueue[0][&#039;Command&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Unknown Insteon Cmd1&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def checkPeekData(param)&lt;br /&gt;
&lt;br /&gt;
$remoteLinkRecord += param[&#039;Parameter11&#039;].hex.chr&lt;br /&gt;
log(&#039;CURRENT REMOTE RECORD IS:&#039;)&lt;br /&gt;
debug($remoteLinkRecord)&lt;br /&gt;
if $remoteLinkRecord.length == 8&lt;br /&gt;
log(&#039;REMOTE RECORD COMPLETE!&#039;)&lt;br /&gt;
processRemoteRecord(param)&lt;br /&gt;
$remoteLinkRecord = &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def processRemoteRecord(param)&lt;br /&gt;
#have to find MY address&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
insID = padhex(insHb) + &amp;quot;.&amp;quot; + padhex(insMb) + &amp;quot;.&amp;quot; + padhex(insLb)&lt;br /&gt;
&lt;br /&gt;
log(&#039;Processing remote Record below:&#039;)&lt;br /&gt;
&lt;br /&gt;
@flags = &amp;quot;\nFrom Device:&amp;quot; + insID + &amp;quot;\nFlags:\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if ($remoteLinkRecord[0] &amp;amp; 0x02) == 0x02 # High water mark&lt;br /&gt;
@flags += &amp;quot;Not the last record\n&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
@flags += &amp;quot;This IS the last record\n&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if ($remoteLinkRecord[0] &amp;amp; 0x80) == 0x80 # Record is in use&lt;br /&gt;
@flags += &amp;quot;Record In Use\n&amp;quot;&lt;br /&gt;
if ($remoteLinkRecord[0] &amp;amp; 0x40) == 0x40 # Controller/Responder&lt;br /&gt;
@flags += &amp;quot;I am a Controller of &amp;quot;&lt;br /&gt;
else&lt;br /&gt;
@flags += &amp;quot;I am a Responder of &amp;quot;&lt;br /&gt;
end&lt;br /&gt;
@insteonID = padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[2]) + &#039;.&#039;&lt;br /&gt;
@insteonID += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[3]) + &#039;.&#039;&lt;br /&gt;
@insteonID += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[4])&lt;br /&gt;
&lt;br /&gt;
@group = &amp;quot;%X&amp;quot; %$remoteLinkRecord[1]&lt;br /&gt;
@flags += @insteonID + &amp;quot; Group:&amp;quot; + @group&lt;br /&gt;
@work = padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[0]) #Control byte&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[1]) # Group&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[2]) # ID HB&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[3]) # ID MB&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[4]) # ID LB&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[5]) # Data1&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[6]) # Data2&lt;br /&gt;
@work += padhex(&amp;quot;%X&amp;quot; %$remoteLinkRecord[7]) # Data3&lt;br /&gt;
log(&#039;adding to:&#039; + insID)&lt;br /&gt;
log(&#039;Value:&#039; + @work)&lt;br /&gt;
$childdatabases[insID] &amp;lt;&amp;lt; @work #add it to the database&lt;br /&gt;
# log(&#039;Current Database:&#039; + $childdatabases.inspect)&lt;br /&gt;
#now to save the database to configuration.&lt;br /&gt;
savechilddatabases(insID)&lt;br /&gt;
# Now to check to see if the child exists as a record&lt;br /&gt;
if $childdatabases[@insteonID] == nil&lt;br /&gt;
log(&#039;InsteonID is NEW, adding Child database entry&#039;)&lt;br /&gt;
$childdatabases[@insteonID] = [&#039;****************&#039;]&lt;br /&gt;
$rerun = true&lt;br /&gt;
sendAddtoPLM(@insteonID)&lt;br /&gt;
sendPing(@insteonID)&lt;br /&gt;
else&lt;br /&gt;
log(&#039;InsteonID:&#039; + @insteonID.to_s + &#039;seems to exist in child databases&#039;)&lt;br /&gt;
log(&#039;CDB:&#039; + $childdatabases.inspect)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
@flags += &amp;quot;Record NOT in use\n&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
log($aqua + @flags + $grey)&lt;br /&gt;
log2(@flags)&lt;br /&gt;
if ($remoteLinkRecord[0] &amp;amp; 0x02) == 0x02&lt;br /&gt;
sendRemoteGetNext(insID)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def savechilddatabases(insteonID)&lt;br /&gt;
#This takes the $childdatabase hash+array and encodes it to&lt;br /&gt;
# save it as a string.&lt;br /&gt;
@work = &#039;&#039;&lt;br /&gt;
#log($yellow + &#039;SaveChildDatabases::nitems:&#039; + $childdatabases[insteonID].nitems.to_s)&lt;br /&gt;
#log($childdatabases[insteonID].inspect + $grey)&lt;br /&gt;
$childdatabases[insteonID].each{|record|&lt;br /&gt;
@work += record&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#now to save the string...&lt;br /&gt;
setdeviceconfig(insteonID, @work)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
def sendPing(insteonID)&lt;br /&gt;
insID = insteonID.split(&#039;.&#039;)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; insID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; insID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; insID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;10&#039;, #ID Request&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
log(&#039;PING Sent!&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def getdevicetemplate(cat, subcat)&lt;br /&gt;
&lt;br /&gt;
log(&#039;Entered getdevicetemplate, Cat=&#039; + cat.to_s + &#039;, subcat = &#039; + subcat.to_s)&lt;br /&gt;
@templid = 0&lt;br /&gt;
case cat.hex&lt;br /&gt;
when 0x0 # Generalized Controllers&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x04; log(&#039;Found ControLinc [2430]&#039;)&lt;br /&gt;
when 0x05; log(&#039;Found RemoteLinc [2440]&#039;)&lt;br /&gt;
when 0x06; log(&#039;Found Icon Tabletop Controller [2830]&#039;)&lt;br /&gt;
when 0x09; log(&#039;Found SignaLinc RF Signal Enhancer [2442]&#039;)&lt;br /&gt;
when 0x0A; log(&#039;Found Balboa Instruments Poolux LCD Controller&#039;)&lt;br /&gt;
when 0x0B; log(&#039;Found Access Point [2443]&#039;)&lt;br /&gt;
when 0x0C; log(&#039;Found IES Color Touchscreen&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x01 # Dimmable Lighting Control&lt;br /&gt;
# all these devices are associated with Template 38&lt;br /&gt;
# Light Switch (dimmable)&lt;br /&gt;
@templid = 38&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00; log(&#039;Found LampLinc V2 [2456D3]&#039;)&lt;br /&gt;
when 0x01; log(&#039;Found SwitchLinc V2 Dimmer 600W [2476D]&#039;)&lt;br /&gt;
when 0x02; log(&#039;Found In-LineLinc Dimmer [2475D]&#039;)&lt;br /&gt;
when 0x03; log(&#039;Found Icon Switch Dimmer [2876D]&#039;)&lt;br /&gt;
when 0x04; log(&#039;Found SwitchLinc V2 Dimmer 1000W [2476DH]&#039;)&lt;br /&gt;
when 0x06; log(&#039;Found LampLinc 2-pin [2456D2]&#039;)&lt;br /&gt;
when 0x07; log(&#039;Found Icon LampLinc V2 2-pin [2456D2]&#039;)&lt;br /&gt;
when 0x09; log(&#039;Found KeypadLinc Dimmer [2486D]&#039;)&lt;br /&gt;
when 0x0A; log(&#039;Found Icon In-Wall Controller [2886D]&#039;)&lt;br /&gt;
when 0x0D; log(&#039;Found SocketLinc [2454D]&#039;)&lt;br /&gt;
when 0x13; log(&#039;Found Icon SwitchLinc Dimmer for Lixar/Bell Canada [2676D-B]&#039;)&lt;br /&gt;
when 0x17; log(&#039;Found ToggleLinc Dimmer [2466D]&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x02 # Switched Lighting Control&lt;br /&gt;
# all these devices are associated with Template 37&lt;br /&gt;
# Light Switch (ON/OFF)&lt;br /&gt;
@templid = 37&lt;br /&gt;
case subcat.hex&lt;br /&gt;
&lt;br /&gt;
when 0x09; log(&#039;Found ApplianceLinc [2456S3]&#039;)&lt;br /&gt;
when 0x0A; log(&#039;Found SwitchLinc Relay [2476S]&#039;)&lt;br /&gt;
when 0x0B; log(&#039;Found Icon On Off Switch [2876S]&#039;)&lt;br /&gt;
when 0x0C; log(&#039;Found Icon Appliance Adapter [2856S3]&#039;)&lt;br /&gt;
when 0x0D; log(&#039;Found ToggleLinc Relay [2466S]&#039;)&lt;br /&gt;
when 0x0E; log(&#039;Found Switchlinc Relay Countdown Timer [2476ST]&#039;)&lt;br /&gt;
when 0x10; log(&#039;Found In-LineLinc Relay [2475D]&#039;)&lt;br /&gt;
when 0x13; log(&#039;Found Icon SwitchLinc Relay for Lixar/Bell Canada [2676R-B]&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x03 # Network Bridges&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x01; log(&#039;Found PowerLinc Serial [2414S]&#039;)&lt;br /&gt;
when 0x02; log(&#039;Found PowerLinc USB [2414U]&#039;)&lt;br /&gt;
when 0x03; log(&#039;Found Icon PowerLinc Serial [2814S]&#039;)&lt;br /&gt;
when 0x04; log(&#039;Found Icon PowerLinc USB [2814U]&#039;)&lt;br /&gt;
when 0x05; log(&#039;Found Smartlabs Power Line Modem Serial [2412S]&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x04 # Irrigation Control&lt;br /&gt;
# all these devices are associated with Template 1780&lt;br /&gt;
# Standard Irrigation Sprinkler&lt;br /&gt;
@templid = 1780&lt;br /&gt;
case subcat.hex&lt;br /&gt;
&lt;br /&gt;
when 0x00; log(&#039;Found Simplehomenet EZRain1 Sprinkler Controller&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x05 # Climate Control&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00; log(&#039;Found Broan SMSC080 Exhaust Fan&#039;)&lt;br /&gt;
when 0x01; log(&#039;Found Simplehomenet EZTherm&#039;)&lt;br /&gt;
when 0x02; log(&#039;Found Broan SMSC110 Exhaust Fan&#039;)&lt;br /&gt;
when 0x03&lt;br /&gt;
log(&#039;Found Venstar RF Thermostat Module&#039;)&lt;br /&gt;
@templid = 2209 #Set Template&lt;br /&gt;
when 0x04; log(&#039;Found Simplehomenet EZStat Thermostat&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x06 # Pool and Spa Control&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00; log(&#039;Found Simplehomenet EZPool&#039;)&lt;br /&gt;
end&lt;br /&gt;
when 0x07 # Sensors and Actuators&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x08 # Home Entertainment&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x09 # Energy Management&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0A # Built-In Appliance Control&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0B # Plumbing&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0C # Communication&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0D # Computer Control&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0E # Window Coverings&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x0F # Access Control&lt;br /&gt;
case subcat.hex&lt;br /&gt;
when 0x00&lt;br /&gt;
end&lt;br /&gt;
when 0x10 # Security, Health, and Safety&lt;br /&gt;
when 0x11 # Surveillance&lt;br /&gt;
when 0x12 # Automotive&lt;br /&gt;
when 0x13 # Pet care&lt;br /&gt;
when 0x14 # Toys&lt;br /&gt;
when 0x15 # Timekeeping&lt;br /&gt;
when 0x16 # Holiday&lt;br /&gt;
end&lt;br /&gt;
return @templid&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def processDeviceInfo(param)&lt;br /&gt;
### temporary&lt;br /&gt;
### 12-24-07 Adding Device Template compatibility..&lt;br /&gt;
#have to find MY address&lt;br /&gt;
insHb = param[&#039;Parameter3&#039;] # From&lt;br /&gt;
insMb = param[&#039;Parameter4&#039;]&lt;br /&gt;
insLb = param[&#039;Parameter5&#039;]&lt;br /&gt;
&lt;br /&gt;
insID = padhex(insHb) + &amp;quot;.&amp;quot; + padhex(insMb) + &amp;quot;.&amp;quot; + padhex(insLb)&lt;br /&gt;
#set the devicecat and device subcat in the childdatabases&lt;br /&gt;
# 0-1 Device Category&lt;br /&gt;
# 2-3 Device SubCategory&lt;br /&gt;
# 4-5 Device Firmware&lt;br /&gt;
log(&#039;proccessDeviceInfo:Insteon ID&#039; + insID)&lt;br /&gt;
$childdatabases[insID][0][0..1] = param[&#039;Parameter6&#039;]&lt;br /&gt;
$childdatabases[insID][0][2..3] = param[&#039;Parameter7&#039;]&lt;br /&gt;
$childdatabases[insID][0][4..5] = param[&#039;Parameter8&#039;]&lt;br /&gt;
savechilddatabases(insID)&lt;br /&gt;
log(&#039;InsteonID: &#039; + insID)&lt;br /&gt;
#log(&#039;Child Config AFTER update:&#039; + $childdatabases[insID][0].to_s)&lt;br /&gt;
log($yellow)&lt;br /&gt;
@template = getdevicetemplate(param[&#039;Parameter6&#039;], param[&#039;Parameter7&#039;])&lt;br /&gt;
$devicetemplate[insID] = @template&lt;br /&gt;
log(&#039;Template ID:&#039; + @template.to_s)&lt;br /&gt;
### eventually, open a XML configuration script?&lt;br /&gt;
### or read saved data from mysql?&lt;br /&gt;
### most likely save this information to sql with device.&lt;br /&gt;
### eventually, IPKDB will be available to ping.&lt;br /&gt;
log(&#039;for Insteon ID:&#039; + insID)&lt;br /&gt;
log($grey)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def recvComplete&lt;br /&gt;
# Clears the wait flag, but does not remove a command from the queue&lt;br /&gt;
$wAIT = false&lt;br /&gt;
log($green + &amp;quot;Receive Completed. Checking command queue&amp;quot; + $grey)&lt;br /&gt;
if $cmdqueue.nitems &amp;gt; 0 then&lt;br /&gt;
log(&amp;quot;Queue:&amp;quot; + $aqua + $cmdqueue.nitems.to_s + $grey + &amp;quot; : executing next command&amp;quot;)&lt;br /&gt;
SndIns()&lt;br /&gt;
else&lt;br /&gt;
log($yellow + &#039;Queue Empty.&#039; + $grey)&lt;br /&gt;
if $rerun == true&lt;br /&gt;
log(&#039;RERUN=TRUE, RESTARTING&#039;)&lt;br /&gt;
$rerun = false&lt;br /&gt;
mainRestart()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;RERUN Not needed. Checking if reported..&#039;)&lt;br /&gt;
#report Child devices here.&lt;br /&gt;
if $reported == false&lt;br /&gt;
log(&#039;Reporting Child Devices&#039;)&lt;br /&gt;
@work = &amp;quot;&amp;quot;&lt;br /&gt;
$childdatabases.each_key{&lt;br /&gt;
|insteonID|&lt;br /&gt;
log(&#039;Child:&#039; + insteonID)&lt;br /&gt;
log(&#039;Config:&#039; + $childdatabases[insteonID].inspect)&lt;br /&gt;
@template = $devicetemplate[insteonID]&lt;br /&gt;
@work += insteonID + &amp;quot;\t\t\t&amp;quot; + @template.to_s + &amp;quot;\t\n&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
log(@work)&lt;br /&gt;
cmd = Command.new(device_.devid_, -1001, 1, 2, 54)&lt;br /&gt;
cmd.params_[13] = @work&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
&lt;br /&gt;
$reported = true&lt;br /&gt;
else&lt;br /&gt;
log(&#039;report not needed&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
def removecurrentcommand&lt;br /&gt;
#get the current child&lt;br /&gt;
log(&#039;in RemoveCurrentCommand&#039;)&lt;br /&gt;
log(&#039;Current Command:&#039; + $cmdqueue[0].inspect)&lt;br /&gt;
#id is in param123&lt;br /&gt;
@id = $cmdqueue[0][&#039;Parameter1&#039;]&lt;br /&gt;
@id += &#039;.&#039; + $cmdqueue[0][&#039;Parameter2&#039;]&lt;br /&gt;
@id += &#039;.&#039; + $cmdqueue[0][&#039;Parameter3&#039;]&lt;br /&gt;
log(&#039;ID=&#039; + @id)&lt;br /&gt;
#now to remove from child and PLM databases&lt;br /&gt;
removefromchild(@id)&lt;br /&gt;
removefromplm(@id)&lt;br /&gt;
cmdComplete&lt;br /&gt;
end&lt;br /&gt;
def cmdComplete&lt;br /&gt;
# Clears the wait flag, and removes the command from the queue.&lt;br /&gt;
$wAIT = false&lt;br /&gt;
$resetNext = 0&lt;br /&gt;
$cmdqueue.delete_at(0)&lt;br /&gt;
# now that THAT command is completed, check to see if there is&lt;br /&gt;
# another command ready to transmit.&lt;br /&gt;
log($green + &amp;quot;Command Completed.&amp;quot; + $grey)&lt;br /&gt;
end&lt;br /&gt;
def checkWait(param)&lt;br /&gt;
#Checks for response from current command.&lt;br /&gt;
if $cmdqueue[0] != nil&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
#log(&#039;CW:waiting for command to complete&#039;)&lt;br /&gt;
else&lt;br /&gt;
#log(&#039;CW:reports clear&#039;)&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
log(&#039;------:)----checkWait: command queue is emtpy&#039;)&lt;br /&gt;
if $wAIT == true #this should never happen&lt;br /&gt;
log(&#039;------:(XXX-CheckWait: TRUE&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def plmparse(value)&lt;br /&gt;
#THIS ROUTINE REPLACES parsestring()&lt;br /&gt;
#this routine will PARSE the incoming stream into valid messages&lt;br /&gt;
# value is the complete command&lt;br /&gt;
param = {}&lt;br /&gt;
#here is a special case, the PLM seems to lock up.&lt;br /&gt;
if value == 0x15.chr&lt;br /&gt;
log(&#039;The PLM stopped responding&#039;)&lt;br /&gt;
log(&#039;Please unplug it, and plug it back in&#039;)&lt;br /&gt;
log(&#039;and do a quick reload router.&#039;)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
while value.length &amp;gt; 2&lt;br /&gt;
case value[1]&lt;br /&gt;
when 0x62 # Special case, need to look at flags&lt;br /&gt;
if (value[5] &amp;amp; 0x10) == 0x10 # check for extended flag&lt;br /&gt;
cmdlen = 23&lt;br /&gt;
else&lt;br /&gt;
cmdlen = 9&lt;br /&gt;
end&lt;br /&gt;
param[&#039;Response&#039;] = &#039;SndIns&#039;&lt;br /&gt;
when 0x50; cmdlen = 11; param[&#039;Response&#039;] = &#039;InsStdMsg&#039;&lt;br /&gt;
when 0x51; cmdlen = 25; param[&#039;Response&#039;] = &#039;InsExtMsg&#039;&lt;br /&gt;
when 0x68; cmdlen = 4 #Set Insteon ACK Message Byte&lt;br /&gt;
when 0x71; cmdlen = 5 #Set Insteon ACK Message Two Bytes&lt;br /&gt;
when 0x70; cmdlen = 4 #Set Insteon NACK Message Byte&lt;br /&gt;
when 0x63; cmdlen = 5; param[&#039;Response&#039;] = &#039;SndX10&#039;&lt;br /&gt;
when 0x52; cmdlen = 4; param[&#039;Response&#039;] = &#039;X10Msg&#039;&lt;br /&gt;
when 0x61; cmdlen = 6; param[&#039;Response&#039;] = &#039;SndGrp&#039;&lt;br /&gt;
when 0x56; cmdlen = 7; param[&#039;Response&#039;] = &#039;GrpEvntRpt&#039;&lt;br /&gt;
when 0x58; cmdlen = 3 #All-Link Cleanup Status Report&lt;br /&gt;
when 0x64; cmdlen = 5; param[&#039;Response&#039;] = &#039;StLnk&#039;&lt;br /&gt;
when 0x65; cmdlen = 3; param[&#039;Response&#039;] = &#039;CancelLnk&#039;&lt;br /&gt;
when 0x53; cmdlen = 10; param[&#039;Response&#039;] = &#039;InsLnkSts&#039;&lt;br /&gt;
when 0x69; cmdlen = 3; param[&#039;Response&#039;] = &#039;GetLnk&#039;&lt;br /&gt;
when 0x6A; cmdlen = 3; param[&#039;Response&#039;] = &#039;GetNext&#039;&lt;br /&gt;
when 0x6C; cmdlen = 3 #Get All-Link Record for Sender&lt;br /&gt;
when 0x57; cmdlen = 10; param[&#039;Response&#039;] = &#039;LnkData&#039;&lt;br /&gt;
when 0x6F; cmdlen = 12; param[&#039;Response&#039;] = &#039;MngLnk&#039;&lt;br /&gt;
when 0x67; cmdlen = 3; param[&#039;Response&#039;] = &#039;RstPLM&#039;&lt;br /&gt;
when 0x6B; cmdlen = 4; param[&#039;Response&#039;] = &#039;SetCfg&#039;&lt;br /&gt;
when 0x60; cmdlen = 9; param[&#039;Response&#039;] = &#039;GetVersion&#039;&lt;br /&gt;
when 0x66; cmdlen = 6 #Set Host Device Category&lt;br /&gt;
when 0x72; cmdlen = 3 # RF Sleep&lt;br /&gt;
when 0x54; cmdlen = 3; param[&#039;Response&#039;] = &#039;BtnRpt&#039;&lt;br /&gt;
when 0x6D; cmdlen = 3; param[&#039;Response&#039;] = &#039;LEDON&#039;&lt;br /&gt;
when 0x6E; cmdlen = 3; param[&#039;Response&#039;] = &#039;LEDOFF&#039;&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
log(&#039;ERROR IN PLMPARSE- Unknown Command&#039;)&lt;br /&gt;
debug(value)&lt;br /&gt;
&lt;br /&gt;
return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
#Now we know the length the command should be, see if we have it.&lt;br /&gt;
#log(&#039;waiting for &#039; + cmdlen.to_s + &#039; characters...&#039;)&lt;br /&gt;
#log(&#039;length of current input is &#039; + value.length.to_s)&lt;br /&gt;
if value.length &amp;gt;= cmdlen&lt;br /&gt;
#log(&#039;GOT whole response&#039;)&lt;br /&gt;
#Yes, we have the whole command, Pack it in param&lt;br /&gt;
for byt in 1..cmdlen&lt;br /&gt;
param[&#039;Parameter&#039; + byt.to_s] = padhex(&amp;quot;%X&amp;quot; %value[byt - 1])&lt;br /&gt;
end&lt;br /&gt;
#now remove it from the string..&lt;br /&gt;
value = value.slice(cmdlen, value.length - cmdlen)&lt;br /&gt;
#Send it off for parsing&lt;br /&gt;
#log(&#039;Sending to EZToDCE:&#039; + param.inspect.to_s)&lt;br /&gt;
EZToDCE(param)&lt;br /&gt;
else&lt;br /&gt;
#log(&#039;Still waiting...&#039;)&lt;br /&gt;
#no, we have NOT received the whole command.&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
return value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def rawX10(value)&lt;br /&gt;
&lt;br /&gt;
x10MSN = $X10HouseCodes.index[value[0..0]]&lt;br /&gt;
x10LSN = $X10UnitCodes.index[value[1..1]]&lt;br /&gt;
return x10MSN + x10LSN&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def X10Flag(value)&lt;br /&gt;
return + $X10CommandCodes.index[Value] + &#039;0&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def SndIns&lt;br /&gt;
# create a new PLM command for SndIns&lt;br /&gt;
if $wAIT == false&lt;br /&gt;
#log(&#039;SndIns:currentcmd=&#039; + $currentcmd.to_s)&lt;br /&gt;
&lt;br /&gt;
if $cmdqueue.nitems &amp;gt; 0&lt;br /&gt;
log(&amp;quot;SndIns:Queue:&amp;quot; + $aqua + $cmdqueue.nitems.to_s + $grey)&lt;br /&gt;
#log(&#039;SndIns:&#039; + $cmdqueue.inspect)&lt;br /&gt;
param = $cmdqueue[0]&lt;br /&gt;
### have to figure out the command byte 2 here&lt;br /&gt;
work = &#039;02&#039;.hex.chr + plmcommand(param)&lt;br /&gt;
### PLM command compilation&lt;br /&gt;
for loop in 2..param.keys.nitems&lt;br /&gt;
@dummy = param[&#039;Parameter&#039; + (loop - 1).to_s].to_s&lt;br /&gt;
work+= @dummy.hex.chr&lt;br /&gt;
end&lt;br /&gt;
conn_.Reconnect()&lt;br /&gt;
debugout(work)&lt;br /&gt;
conn_.Send(work)&lt;br /&gt;
#sleep 0.1&lt;br /&gt;
$wAIT = TRUE&lt;br /&gt;
else&lt;br /&gt;
log($yellow + &#039;Queue Empty.&#039; + $grey)&lt;br /&gt;
if $rerun == true&lt;br /&gt;
log(&#039;RERUN=TRUE, RESTARTING&#039;)&lt;br /&gt;
$rerun = false&lt;br /&gt;
mainRestart()&lt;br /&gt;
else&lt;br /&gt;
log(&#039;RERUN Not needed&#039;)&lt;br /&gt;
if $reported == false&lt;br /&gt;
log(&#039;Reporting Child Devices&#039;)&lt;br /&gt;
@work = &amp;quot;&amp;quot;&lt;br /&gt;
$childdatabases.each_key{&lt;br /&gt;
|insteonID|&lt;br /&gt;
log(&#039;Child:&#039; + insteonID)&lt;br /&gt;
log(&#039;Config:&#039; + $childdatabases[insteonID].inspect)&lt;br /&gt;
@template = $devicetemplate[insteonID]&lt;br /&gt;
@work += insteonID + &amp;quot;\t\t\t&amp;quot; + @template.to_s + &amp;quot;\t\n&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
log(@work)&lt;br /&gt;
cmd = Command.new(device_.devid_, -1001, 1, 2, 54)&lt;br /&gt;
cmd.params_[13] = @work&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
&lt;br /&gt;
$reported = true&lt;br /&gt;
else&lt;br /&gt;
log(&#039;report not needed&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
log(&#039;X-----------SndIns: Waiting for response to:&#039; + $cmdqueue[0][&#039;Command&#039;].to_s)&lt;br /&gt;
log(&#039;X-----------SndIns: Current Queue Length:&#039; + $cmdqueue.nitems.to_s)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
def plmcommand(param)&lt;br /&gt;
### this returns the proper Byte2 for the command.&lt;br /&gt;
case param[&#039;Command&#039;]&lt;br /&gt;
when &#039;GetVersion&#039;; return 0x60.chr&lt;br /&gt;
when &#039;SndIns&#039;; return 0x62.chr&lt;br /&gt;
when &#039;SndGrp&#039;; return 0x61.chr&lt;br /&gt;
when &#039;SndX10&#039;; return 0x63.chr&lt;br /&gt;
when &#039;GetLnk&#039;; return 0x69.chr&lt;br /&gt;
when &#039;GetNext&#039;; return 0x6A.chr&lt;br /&gt;
when &#039;BtnRpt&#039;; return 0x54.chr&lt;br /&gt;
when &#039;GetCfg&#039;; return 0x73.chr&lt;br /&gt;
when &#039;StLnk&#039;; return 0x64.chr&lt;br /&gt;
when &#039;CancelLnk&#039;; return 0x65.chr&lt;br /&gt;
when &#039;MngLnk&#039;; return 0x6F.chr&lt;br /&gt;
when &#039;RstPLM&#039;; return 0x67.chr&lt;br /&gt;
when &#039;SetCfg&#039;; return 0x6B.chr&lt;br /&gt;
when &#039;LEDON&#039;; return 0x6D.chr&lt;br /&gt;
when &#039;LEDOFF&#039;; return 0x6E.chr&lt;br /&gt;
## hack&lt;br /&gt;
when &#039;InsStdMsg&#039;&lt;br /&gt;
log(&#039;ERROR:PLMCommand encountered a COMMAND of INSSTDMSG&#039;)&lt;br /&gt;
break&lt;br /&gt;
return 0x62.chr&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def debug(text)&lt;br /&gt;
work = &#039;DEBUG:&#039;&lt;br /&gt;
&lt;br /&gt;
for c in 1..text.length&lt;br /&gt;
work += padhex(&amp;quot;%X&amp;quot; %text[c-1]) + &#039; &#039;&lt;br /&gt;
end&lt;br /&gt;
log($yellow + work + &amp;quot;Length:&amp;quot; + text.length.to_s + $grey)&lt;br /&gt;
end&lt;br /&gt;
def debugout(text)&lt;br /&gt;
work = &#039;out:&#039;&lt;br /&gt;
&lt;br /&gt;
for c in 1..text.length&lt;br /&gt;
work += padhex(&amp;quot;%X&amp;quot; %text[c-1]) + &#039; &#039;&lt;br /&gt;
end&lt;br /&gt;
log($green + work + &amp;quot;Length:&amp;quot; + text.length.to_s + $grey)&lt;br /&gt;
end&lt;br /&gt;
def debugin(text)&lt;br /&gt;
work = &#039;IN:&#039;&lt;br /&gt;
&lt;br /&gt;
for c in 1..text.length&lt;br /&gt;
work += padhex(&amp;quot;%X&amp;quot; %text[c-1]) + &#039; &#039;&lt;br /&gt;
end&lt;br /&gt;
log($red + work + &amp;quot;Length:&amp;quot; + text.length.to_s + $grey)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def padhex(hex)&lt;br /&gt;
if hex.length==1&lt;br /&gt;
hex = &amp;quot;0&amp;quot; + hex&lt;br /&gt;
end&lt;br /&gt;
return hex&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def percenttohex(level)&lt;br /&gt;
# convert from percent to byte&lt;br /&gt;
return &amp;quot;%X&amp;quot; %((level.to_i * 2.55)).to_i&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def hextopercent(level)&lt;br /&gt;
return ((level.hex.to_i / 2.55)).to_i&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def hextoTempurature(degree) #Thermostat change hex to tempurature&lt;br /&gt;
return ((degree.hex.to_i / 2)).to_i&lt;br /&gt;
end&lt;br /&gt;
def Tempuraturetohex (degree) #Thermostat Cahnge tempurature to hex&lt;br /&gt;
return ((degree.to_1 * 2)).hex&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def log(line)&lt;br /&gt;
$log = File.open(&amp;quot;/var/log/pluto/&amp;quot; + device_.devid_.to_s + &amp;quot;_Generic_Serial_Device.log&amp;quot;, &amp;quot;a&amp;quot;)&lt;br /&gt;
$log.puts &amp;quot;(***):&amp;quot; + line.to_s&lt;br /&gt;
$log.close&lt;br /&gt;
end&lt;br /&gt;
def log2(line)&lt;br /&gt;
#this will send a message out the the orbiters..&lt;br /&gt;
#/usr/pluto/bin/MessageSend localhost 0 20 1 809 9 &amp;quot;Text to Display&amp;quot; 70 &amp;quot;alert&amp;quot; 182 &amp;quot;30&amp;quot; 251 &amp;quot;??&amp;quot;&lt;br /&gt;
cmd = Command.new(device_.devid_, -1000, 1, 1, 809)&lt;br /&gt;
cmd.params_[9] = line #text to display&lt;br /&gt;
cmd.params_[70] = &#039;PLMMessage&#039; #Token&lt;br /&gt;
cmd.params_[182] = &#039;10&#039; #Timeout in seconds&lt;br /&gt;
cmd.params_[251] = &#039;??&#039;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
def checkChildRecordsinPLM()&lt;br /&gt;
log(&#039;Entered CheckChildRecordsinPLM&#039;)&lt;br /&gt;
# log(&#039;In CheckChildRecordsinPLM&#039;)&lt;br /&gt;
# time to verify all children are in the PLM&lt;br /&gt;
#&lt;br /&gt;
# log(&#039;Total PLM Records:&#039; + $plmdatabase.nitems.to_s)&lt;br /&gt;
$plmdatabase.each{|record|&lt;br /&gt;
log(&#039;Record: = &#039;+ getIIDfromRecord(record) + &#039; Group:&#039; + getGroupfromRecord(record))&lt;br /&gt;
log(&#039;checking to see if it needs to be added as a child...&#039;)&lt;br /&gt;
if existsinchild(getIIDfromRecord(record)) == false&lt;br /&gt;
&lt;br /&gt;
log(getIIDfromRecord(record) + &#039; needs to be added to the child database&#039;)&lt;br /&gt;
addtochild(getIIDfromRecord(record))&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$childdatabases.each_key {|child|&lt;br /&gt;
if existsinplm(child) == false&lt;br /&gt;
log(child + &#039; needs to be added to PLM&#039;)&lt;br /&gt;
sendAddtoPLM(child)&lt;br /&gt;
else&lt;br /&gt;
log(child + &#039; exists in PLM&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
#now to scan the childs database&lt;br /&gt;
for record in 1..($childdatabases[child].nitems - 1)&lt;br /&gt;
@test = $childdatabases[child][record]&lt;br /&gt;
if existsinplm(getIIDfromRecord(@test)) == false&lt;br /&gt;
log(getIIDfromRecord(@test) + &#039; needs to be added to PLM&#039;)&lt;br /&gt;
sendAddtoPLM(getIIDfromRecord(@test))&lt;br /&gt;
else&lt;br /&gt;
log(getIIDfromRecord(@test) + &#039; exists in PLM&#039;)&lt;br /&gt;
end&lt;br /&gt;
#Also check to see if it needs to be added in the childdatabases&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
def existsinplm(insteonid)&lt;br /&gt;
result = false&lt;br /&gt;
$plmdatabase.each{|record|&lt;br /&gt;
#log(insteonid + &#039;==&#039; + getIIDfromRecord(record))&lt;br /&gt;
if insteonid == getIIDfromRecord(record)&lt;br /&gt;
result = true&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
return result&lt;br /&gt;
end&lt;br /&gt;
def existsinchild(insteonid)&lt;br /&gt;
log(&#039;ExistsinChild:InsteonID:&#039; + insteonid)&lt;br /&gt;
result = false&lt;br /&gt;
$childdatabases.each_key{|record|&lt;br /&gt;
if insteonid == record&lt;br /&gt;
result = true&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
log(&#039;ExistsinChild result:FALSE&#039;) if result == false&lt;br /&gt;
log(&#039;ExistsinChild result:TRUE&#039;) if result == true&lt;br /&gt;
return result&lt;br /&gt;
end&lt;br /&gt;
def addtochild(insteonID)&lt;br /&gt;
log(&#039;addtochild Routne called&#039;)&lt;br /&gt;
log(&#039;Adding &#039; + insteonID + &#039; to the child database...&#039;)&lt;br /&gt;
if insteonID.length == 2 then&lt;br /&gt;
log(&#039;Child is X10&#039;)&lt;br /&gt;
$state[insteonID] = 0&lt;br /&gt;
else&lt;br /&gt;
log(&#039;Child is Insteon&#039;)&lt;br /&gt;
$childdatabases[insteonID] = [&#039;****************&#039;]&lt;br /&gt;
sendPing(insteonID)&lt;br /&gt;
$rerun = true&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def removefromchild(insteonID)&lt;br /&gt;
log(&#039;Removing &#039; + insteonID + &#039; from child database&#039;)&lt;br /&gt;
$childdatabases.delete(insteonID)&lt;br /&gt;
$state.delete(insteonID)&lt;br /&gt;
end&lt;br /&gt;
def removefromplm(insteonID)&lt;br /&gt;
log(&#039;Removing from plm&#039;)&lt;br /&gt;
$plmdatabase.each{|record|&lt;br /&gt;
#log(insteonid + &#039;==&#039; + getIIDfromRecord(record))&lt;br /&gt;
if insteonID == getIIDfromRecord(record)&lt;br /&gt;
debug(record)&lt;br /&gt;
log(&#039;Found Record, Deleting&#039;)&lt;br /&gt;
$plmdatabase.delete(record)&lt;br /&gt;
&lt;br /&gt;
#now, we have to remove it from the device.&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt;&#039;MngLnk&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; &#039;80&#039;, #DELETE&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; record[0..1], #control byte&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; record[2..3], #group&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; record[4..5],#HB&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; record[6..7],#MB&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; record[8..9],#LB&lt;br /&gt;
&#039;Parameter7&#039; =&amp;gt; record[10..11],#data1&lt;br /&gt;
&#039;Parameter8&#039; =&amp;gt; record[12..13],#data2&lt;br /&gt;
&#039;Parameter9&#039; =&amp;gt; record[14..15] #data3&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
log(param.inspect)&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
end&lt;br /&gt;
def sendAddtoPLM(insteonID)&lt;br /&gt;
log(&#039;Adding &#039; + insteonID + &#039; to the PLM database...&#039;)&lt;br /&gt;
#This adds a record into the PLM&lt;br /&gt;
@insID = insteonID.split(&#039;.&#039;)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;MngLnk&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; &#039;40&#039;, #control code -- add new record as Controller&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; &#039;C2&#039;, #All Link Record Flags AKA Record Control Byte&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; &#039;01&#039;, #All Link Group&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; @insID[0], #HB&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; @insID[1], #MB&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; @insID[2], #LB&lt;br /&gt;
&#039;Parameter7&#039; =&amp;gt; &#039;01&#039;, #Link Data 1 ON-Level&lt;br /&gt;
&#039;Parameter8&#039; =&amp;gt; &#039;01&#039;, #Link Data 2 Ramp Rate&lt;br /&gt;
&#039;Parameter9&#039; =&amp;gt; &#039;FF&#039;} #Link Data 3 not used&lt;br /&gt;
if $wAIT == true&lt;br /&gt;
$cmdqueue.insert(1, param)&lt;br /&gt;
else&lt;br /&gt;
$cmdqueue.insert(0, param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def getIIDfromRecord(recordstring)&lt;br /&gt;
#this extracts the insteonID string from the record.&lt;br /&gt;
#log(&#039;getIIDfromRecord::recordstring:&#039; + recordstring)&lt;br /&gt;
@idhb = recordstring[4..5]&lt;br /&gt;
@idmb = recordstring[6..7]&lt;br /&gt;
@idlb = recordstring[8..9]&lt;br /&gt;
@result = @idhb + &#039;.&#039; + @idmb + &#039;.&#039; +@idlb&lt;br /&gt;
#log(&#039;GetIIDfromRecord: Found ID:&#039; + @result)&lt;br /&gt;
return @result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def processBroadcastMessage(param)&lt;br /&gt;
#search the child databases for responders,&lt;br /&gt;
#and fire COMMANDS for each responder. 06Feb08&lt;br /&gt;
#and fire events for each responder.XXXXXXXXXXXXX&lt;br /&gt;
#Message flag is in parameter9 Group command 0xCx (All-Link Broadcast Message Pg 42.)&lt;br /&gt;
#Group is in parameter8&lt;br /&gt;
#From InsteonID is parameters 3, 4, 5&lt;br /&gt;
group = param[&#039;Parameter8&#039;]&lt;br /&gt;
from = padhex(param[&#039;Parameter3&#039;]) + &#039;.&#039;&lt;br /&gt;
from += padhex(param[&#039;Parameter4&#039;]) + &#039;.&#039;&lt;br /&gt;
from += padhex(param[&#039;Parameter5&#039;])&lt;br /&gt;
log(&#039;Looking for &#039; + from + &#039; Group:&#039; + group)&lt;br /&gt;
log(&#039;Showing Parameter10:&#039; + param[&#039;Parameter10&#039;].to_s)&lt;br /&gt;
#Ok, now have to search child databases for from AND group AND responder&lt;br /&gt;
$childdatabases.each_key{|child|&lt;br /&gt;
#log(&#039;Searching:&#039; + child)&lt;br /&gt;
for rec in 1..($childdatabases[child].nitems - 1)&lt;br /&gt;
record = $childdatabases[child][rec]&lt;br /&gt;
if getIIDfromRecord(record) == from # First, look for Insteon ID&lt;br /&gt;
#log(&#039;Found ID&#039;)&lt;br /&gt;
if getGroupfromRecord(record) == group #next, Group&lt;br /&gt;
#log(&#039;Found Group&#039;)&lt;br /&gt;
if isResponderRecord(record) # is a responder?&lt;br /&gt;
#log(&#039;Found Responder&#039;)&lt;br /&gt;
#figure out the child devicenum&lt;br /&gt;
from = $children[child]&lt;br /&gt;
#figure out the command&lt;br /&gt;
case param[&#039;Parameter10&#039;].hex&lt;br /&gt;
when 0x11 #on&lt;br /&gt;
reportStatus(from, 100)&lt;br /&gt;
when 0x13 #off&lt;br /&gt;
reportStatus(from, 0)&lt;br /&gt;
when 0x6B # Thermostat Command On/OFF/AUTO&lt;br /&gt;
case param[&#039;Parameter11&#039;].to_s&lt;br /&gt;
when &#039;09&#039; #status to OFF&lt;br /&gt;
#need to set current temp&lt;br /&gt;
reportStatus(from, 0)&lt;br /&gt;
else&lt;br /&gt;
#check thermostat for state and update and set current temp&lt;br /&gt;
#reportStatus(from, 100)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 0x6C # Thermostat Command Cool Point&lt;br /&gt;
tempurature =param[&#039;Parameter11&#039;] /2 #temp in hex need to devide by 2 = current cool point&lt;br /&gt;
#reportStatus(from,tempurature)&lt;br /&gt;
when 0x6D# Thermostat Command Heat Point&lt;br /&gt;
tempurature =param[&#039;Parameter11&#039;] /2 #temp in hex need to devide by 2 = current heat point&lt;br /&gt;
#reportStatus(from,tempurature)&lt;br /&gt;
&lt;br /&gt;
when 0x17 #dim/brighten -ignore&lt;br /&gt;
level = 0&lt;br /&gt;
when 0x18 # STOP dim/brighten - sendgetstatus&lt;br /&gt;
level = 0&lt;br /&gt;
sendGetChildStatus(child)&lt;br /&gt;
else&lt;br /&gt;
level = 0&lt;br /&gt;
log(&#039;Command is other than ON/OFF/Dim/Brighten&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def reportStatus(from, level)&lt;br /&gt;
log(&#039;From:&#039; + from.to_s) #shows child id&lt;br /&gt;
log(&#039;current State:&#039; + $state[from].to_s)&lt;br /&gt;
log(&#039;Wanted State:&#039; + level.to_s)&lt;br /&gt;
case $state[from]&lt;br /&gt;
when 0&lt;br /&gt;
if level &amp;gt;=1&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 192) #on&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 184)&lt;br /&gt;
cmd.params_[76] = level.to_s&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
when 100&lt;br /&gt;
if level &amp;gt;= 1&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 184)&lt;br /&gt;
cmd.params_[76] = level.to_s&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
else&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 193) # off&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
else&lt;br /&gt;
if level == 100&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 193) #off&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 192) # on&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
cmd = Command.new(from, from, 1, 1, 184) #SetLevel&lt;br /&gt;
cmd.params_[76] = level.to_s&lt;br /&gt;
cmd.params_[120] = &amp;quot;1&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
end&lt;br /&gt;
log(&#039;ReportStatus: device:&#039; + from.to_s + &#039; Status:&#039; + level.to_s)&lt;br /&gt;
$state[from] = level&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def isResponderRecord(recordstring)&lt;br /&gt;
work = recordstring[0..1].hex&lt;br /&gt;
if (work &amp;amp; 0x40) == 0x40 #check bit 6&lt;br /&gt;
result = false #signifies Controller record&lt;br /&gt;
else&lt;br /&gt;
result = true #signifies Responder record&lt;br /&gt;
end&lt;br /&gt;
return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def getGroupfromRecord(recordstring)&lt;br /&gt;
#this extracts the GROUP from the record.&lt;br /&gt;
if recordstring == nil&lt;br /&gt;
return &#039;00&#039;&lt;br /&gt;
else&lt;br /&gt;
return recordstring[2..3]&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
def getdeltafromconfig(insteonID)&lt;br /&gt;
#This returns the delta from the child.&lt;br /&gt;
@work = $childdatabases[insteonID][0] # the settings stored in [0]&lt;br /&gt;
if @work == nil&lt;br /&gt;
return &#039;00&#039;&lt;br /&gt;
else&lt;br /&gt;
return @work[6..7]&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
def sendGetChildStatus(insteonID)&lt;br /&gt;
#log(&#039;sendGetChildStatus Called&#039;)&lt;br /&gt;
if insteonID.length != 2 #X10 device&lt;br /&gt;
@insID = insteonID.split(&#039;.&#039;)&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;, #flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;19&#039;, #Status Request&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;00&#039;} #not used.&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
#Returned response will have cmd1 = DBDelta&lt;br /&gt;
#Returned response will have cmd2 = ON-Level&lt;br /&gt;
else&lt;br /&gt;
log(&#039;X10 does not report status&#039;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
def islast(record)&lt;br /&gt;
#high water mark&lt;br /&gt;
return false if (record[0..1].hex &amp;amp; 0x02) == 0x02&lt;br /&gt;
return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def isinuse(record)&lt;br /&gt;
return true if (record[0..1].hex &amp;amp; 0x80) == 0x80&lt;br /&gt;
return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def iscontroller(record)&lt;br /&gt;
return true if (record[0..1].hex &amp;amp; 0x40) == 0x40&lt;br /&gt;
return false&lt;br /&gt;
end&lt;br /&gt;
def group(record)&lt;br /&gt;
return record[2..3]&lt;br /&gt;
end&lt;br /&gt;
def remoteid(record)&lt;br /&gt;
&lt;br /&gt;
@insteonID = record[4..5] + &#039;.&#039;&lt;br /&gt;
@insteonID += record[6..7] + &#039;.&#039;&lt;br /&gt;
@insteonID += record[8..9]&lt;br /&gt;
return @insteonID&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def findresponderrecord(masterid, slaveid, groupid)&lt;br /&gt;
# log(masterid + &#039;:&#039; + slaveid + &#039;:&#039; + groupid)&lt;br /&gt;
$childdatabases[slaveid].each{|check|&lt;br /&gt;
# log(&#039;Record:&#039; + check.to_s)&lt;br /&gt;
if iscontroller(check.to_s) == false #responder record&lt;br /&gt;
# log(&#039;found responder record&#039;)&lt;br /&gt;
# log(&#039;remoteid:&#039; + remoteid(check.to_s))&lt;br /&gt;
if remoteid(check.to_s) == masterid # found&lt;br /&gt;
# log(&#039;Found Controller ID in responder record&#039;)&lt;br /&gt;
if group(check.to_s) == groupid&lt;br /&gt;
# log(&#039;Group Matches&#039;)&lt;br /&gt;
#found group&lt;br /&gt;
return true&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
return false&lt;br /&gt;
end&lt;br /&gt;
def findcontrollerrecord(masterid, slaveid, groupid)&lt;br /&gt;
# log(masterid + &#039;:&#039; + slaveid + &#039;:&#039; + groupid)&lt;br /&gt;
$childdatabases[masterid].each{|check|&lt;br /&gt;
# log(&#039;Record:&#039; + check.to_s)&lt;br /&gt;
if iscontroller(check.to_s) == true #controller&lt;br /&gt;
# log(&#039;found controller record&#039;)&lt;br /&gt;
if remoteid(check.to_s) == slaveid # found&lt;br /&gt;
# log(&#039;found Responder ID in Controller record&#039;)&lt;br /&gt;
if group(check.to_s) == groupid&lt;br /&gt;
# log(&#039;Group Matches&#039;)&lt;br /&gt;
#found group&lt;br /&gt;
return true&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# time to define a structure to save the raw data in hex&lt;br /&gt;
# starts at [0]&lt;br /&gt;
# Bytes Meaning&lt;br /&gt;
# 0-1 Device Category&lt;br /&gt;
# 2-3 Device SubCategory&lt;br /&gt;
# 4-5 Device Firmware&lt;br /&gt;
# 6-7 Database Delta&lt;br /&gt;
# 8-9 reserved&lt;br /&gt;
# 10-11 reserved&lt;br /&gt;
# 12-13 reserved&lt;br /&gt;
# 14-15 reserved&lt;br /&gt;
###### First database record below (in same format its read from the device)&lt;br /&gt;
###### This is the same format as an ALL-Link Record Response from the PLM&lt;br /&gt;
###### (0x57) bytes 3..10&lt;br /&gt;
# 16-17 record control byte&lt;br /&gt;
# 18-19 Group&lt;br /&gt;
# 20-21 ID HB&lt;br /&gt;
# 22-23 ID MB&lt;br /&gt;
# 24-25 ID LB&lt;br /&gt;
# 26-27 Link Specific Data1&lt;br /&gt;
# 28-29 Link Specific Data2&lt;br /&gt;
# 30-31 Link Specific Data3&lt;br /&gt;
######&lt;br /&gt;
# 32-47 next database record...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_760&amp;diff=29533</id>
		<title>Insteon PLM Ruby Code 760</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_760&amp;diff=29533"/>
		<updated>2012-02-24T22:34:18Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#### #760 Send Command to Child ####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@insteonID = id.chomp.split(&#039;.&#039;)&lt;br /&gt;
@parameters = parameters&lt;br /&gt;
@command = pk_command&lt;br /&gt;
@cmd = cmd&lt;br /&gt;
childType =device_.childdevices_[cmdTo].devtemplid_ # find out device type&lt;br /&gt;
$cmdParams = cmd.params_&lt;br /&gt;
&lt;br /&gt;
log(&#039;#760:id=&#039; + id.inspect)&lt;br /&gt;
log(&#039;#760:parameters=&#039; + parameters.inspect)&lt;br /&gt;
log(&#039;#760:pk_command=&#039; + pk_command.inspect)&lt;br /&gt;
log(&#039;#760:cmd=&#039; + cmd.inspect)&lt;br /&gt;
### ok, I get the insteonID in @insteonID&lt;br /&gt;
# pk_command has one of THREE values, 192, 193, or NOTHING&lt;br /&gt;
# when I click 50%, I get in parameters: 76&lt;br /&gt;
# but NOTHING in pk_command.&lt;br /&gt;
&lt;br /&gt;
case pk_command&lt;br /&gt;
when &#039;192&#039; #ON&lt;br /&gt;
if chiltType ==2209 then #used when Device is Thermostat&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;OF&#039;, # Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Insteon Thermostat Control&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;06&#039;} # ON&lt;br /&gt;
else&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;OF&#039;, # Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;11&#039;, # Insteon SetLevel&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;FF&#039;} # FULL ON&lt;br /&gt;
end&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
when &#039;193&#039; #OFF&lt;br /&gt;
log(&amp;quot;childtype:&amp;quot; +childtype.to_s)&lt;br /&gt;
if childtype == 2209 then #used when Device is Thermostat&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;09&#039;} #OFF&lt;br /&gt;
else #used when Device not Thermostat&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;13&#039;, #OFF&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;00&#039;}&lt;br /&gt;
end&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
&lt;br /&gt;
#when &#039;280&#039; # Heat/Cool/Auto&lt;br /&gt;
#log(&#039;Test Param:&#039; +$cmdParams.to_s)&lt;br /&gt;
#case $cmdParams.to_s&lt;br /&gt;
#when &#039;8H&#039; # Heat Command&lt;br /&gt;
#param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
#&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
#&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
#&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
#&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
#&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;, # Indicates device is a Thermostat&lt;br /&gt;
#&#039;Parameter6&#039; =&amp;gt; &#039;04&#039;} # sets to Heat Mode&lt;br /&gt;
#$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
# SndIns()&lt;br /&gt;
&lt;br /&gt;
#when &#039;8C&#039; # Cool Command&lt;br /&gt;
#param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
#&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
#&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
#&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
#&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
#&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
#&#039;Parameter6&#039; =&amp;gt; &#039;05&#039;} # Sets to Cool&lt;br /&gt;
#$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
# SndIns()&lt;br /&gt;
#when &#039;8A&#039; # Auto Command&lt;br /&gt;
#param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
#&#039;Parameter1&#039; =&amp;gt; insteonID[0],&lt;br /&gt;
#&#039;Parameter2&#039; =&amp;gt; insteonID[1],&lt;br /&gt;
#&#039;Parameter3&#039; =&amp;gt; insteonID[2],&lt;br /&gt;
#&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;,&lt;br /&gt;
#&#039;Parameter5&#039; =&amp;gt; &#039;6B&#039;,&lt;br /&gt;
#&#039;Parameter6&#039; =&amp;gt; &#039;06&#039;} # Sets to Auto&lt;br /&gt;
#$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
#SndIns()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&lt;br /&gt;
when &#039;&#039;&lt;br /&gt;
if parameters==&#039;76&#039;&lt;br /&gt;
#SetLevel 50%&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
&#039;Parameter1&#039; =&amp;gt; @insteonID[0],&lt;br /&gt;
&#039;Parameter2&#039; =&amp;gt; @insteonID[1],&lt;br /&gt;
&#039;Parameter3&#039; =&amp;gt; @insteonID[2],&lt;br /&gt;
&#039;Parameter4&#039; =&amp;gt; &#039;OF&#039;, # Flags&lt;br /&gt;
&#039;Parameter5&#039; =&amp;gt; &#039;11&#039;, # Insteon SetLevel&lt;br /&gt;
&#039;Parameter6&#039; =&amp;gt; &#039;76&#039;} # 50%&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_756&amp;diff=29532</id>
		<title>Insteon PLM Ruby Code 756</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_756&amp;diff=29532"/>
		<updated>2012-02-24T22:31:42Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#### #756 Report Child Devices ####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#here is where I send all my newly discovered children..&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#I need to fire an event [54]&lt;br /&gt;
#with params_:&lt;br /&gt;
#12 Error Message (string)&lt;br /&gt;
# if this is not empty, that means an error occurred.&lt;br /&gt;
#&lt;br /&gt;
#13 Text (string)&lt;br /&gt;
# a list like this:&lt;br /&gt;
# [internal id] \t&lt;br /&gt;
# [description] \t&lt;br /&gt;
# [room name] \t&lt;br /&gt;
# [device template] \t&lt;br /&gt;
# [floorplan id] \n&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#First, Lets see if we actually &#039;get this command&#039;&lt;br /&gt;
log($yellow+ &#039;*#*#*#*#*#*#*#*# GOT #756 Report Child Devices! *#*#*#*#*#*#*#*#*&#039;+ $grey)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
##lets try sending an event..&lt;br /&gt;
&lt;br /&gt;
#cmd = Command.new(37,-1000,1, 2, 54)&lt;br /&gt;
#cmd.params_[13] = &amp;quot;0A.97.0B\tTestLamp\t\t38\t\n&amp;quot;&lt;br /&gt;
#log(cmd.params_[13])&lt;br /&gt;
#SendCommand(cmd)&lt;br /&gt;
@work = &amp;quot;&amp;quot;&lt;br /&gt;
$childdatabases.each_key{|insteonID|&lt;br /&gt;
@work += insteonID + &amp;quot;\t&amp;quot;&lt;br /&gt;
# figure out what type of device to add here..&lt;br /&gt;
log(&#039;Child:&#039; + insteonID)&lt;br /&gt;
log(&#039;Config:&#039; + $childdatabases[insteonID].inspect)&lt;br /&gt;
case $childdatabases[insteonID][0][0..1].hex # Device Category&lt;br /&gt;
when 0x00 # Generalized Controllers&lt;br /&gt;
case $childdatabases[insteonID][0][2..3].hex&lt;br /&gt;
when 0x00&lt;br /&gt;
when 0x01&lt;br /&gt;
when 0x02&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
when 0x01 # Dimmable Lighting Control&lt;br /&gt;
case $childdatabases[insteonID][0][2..3].hex&lt;br /&gt;
when 0x00; @work += &#039;LampLinc V2 [2456D3]&#039;&lt;br /&gt;
when 0x01; @work += &#039;SwitchLinc V2 Dimmer 600W [2476D]&#039;&lt;br /&gt;
when 0x02; @work += &#039;In-LineLinc Dimmer [2475D]&#039;&lt;br /&gt;
when 0x03; @work += &#039;Icon Switch Dimmer [2876D]&#039;&lt;br /&gt;
when 0x04; @work += &#039;SwitchLinc V2 Dimmer 1000W [2476DH]&#039;&lt;br /&gt;
when 0x06; @work += &#039;LampLinc 2-pin [2456D2]&#039;&lt;br /&gt;
when 0x07; @work += &#039;Icon LampLinc V2 2-pin [2456D2]&#039;&lt;br /&gt;
when 0x09; @work += &#039;KeypadLinc Dimmer [2486D]&#039;&lt;br /&gt;
when 0x0A; @work += &#039;Icon In-Wall Controller [2886D]&#039;&lt;br /&gt;
when 0x0D; @work += &#039;SocketLinc [2454D]&#039;&lt;br /&gt;
when 0x13; @work += &#039;Icon SwitchLinc Dimmer for Lixar/Bell Canada [2676D-B]&#039;&lt;br /&gt;
when 0x17; @work += &#039;ToggleLinc Dimmer [2466D]&#039;&lt;br /&gt;
end&lt;br /&gt;
@work += &amp;quot;\t\t38&amp;quot; # set Template 38&lt;br /&gt;
when 0x02 # Switched Lighting Control&lt;br /&gt;
case $childdatabases[insteonID][0][2..3].hex&lt;br /&gt;
when 0x09; @work += &#039;ApplianceLinc [2456S3]&#039;&lt;br /&gt;
when 0x0A; @work += &#039;SwitchLinc Relay [2476S]&#039;&lt;br /&gt;
when 0x0B; @work += &#039;Icon On Off Switch [2876S]&#039;&lt;br /&gt;
when 0x0C; @work += &#039;Icon Appliance Adapter [2856S3]&#039;&lt;br /&gt;
when 0x0D; @work += &#039;ToggleLinc Relay [2466S]&#039;&lt;br /&gt;
when 0x0E; @work += &#039;Switchlinc Relay Countdown Timer [2476ST]&#039;&lt;br /&gt;
when 0x10; @work += &#039;In-LineLinc Relay [2475D]&#039;&lt;br /&gt;
when 0x13; @work += &#039;Icon SwitchLinc Relay for Lixar/Bell Canada [2676R-B]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
@work += &amp;quot;\t\t37&amp;quot; # Set Template 37&lt;br /&gt;
when 0x03 # Network Bridges&lt;br /&gt;
case $childdatabases[insteonID][0][2..3].hex&lt;br /&gt;
when 0x10; @work += &#039;SmartLinc [2412N]&#039;&lt;br /&gt;
end&lt;br /&gt;
when 0x04 # Irrigation Control&lt;br /&gt;
@work += &#039;Simplehomenet EZRain1 Sprinkler Controller&#039;&lt;br /&gt;
@work += &amp;quot;\t\t1780&amp;quot; # Set Template 1780&lt;br /&gt;
&lt;br /&gt;
when 0x05 # Climate Control&lt;br /&gt;
case $childdatabases[insteonID][0][2..3].hex&lt;br /&gt;
when 0x00; @work += &#039;Broan SMSC080 Exhaust Fan&#039;&lt;br /&gt;
when 0x01; @work += &#039;Simplehomenet EZTherm&#039;&lt;br /&gt;
when 0x02; @work += &#039;Broan SMSC110 Exhaust Fan&#039;&lt;br /&gt;
when 0x03&lt;br /&gt;
@work += &#039;Venstar RF Thermostat Module&#039;&lt;br /&gt;
@work += &amp;quot;\t\t2209&amp;quot; # Set Template 2209&lt;br /&gt;
when 0x04; @work += &#039;Simplehomenet EZStat Thermostat&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
when 0x06 # Pool and Spa Control&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x07 # Sensors and Actuators&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x08&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x09&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0A&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0B&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0C&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0D&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0E&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x0F&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x10 # Security, Health, and Safety&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x11 # Surveillance&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x12 # Automotive&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x13 # Pet care&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x14 # Toys&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x15 # Timekeeping&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
when 0x16 # Holiday&lt;br /&gt;
@work += &amp;quot;\t\t&amp;quot; # Set Template Unknown&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
@work += &amp;quot;\t\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
log(@work)&lt;br /&gt;
cmd = Command.new(device_.devid_, -1000, 1, 2, 54)&lt;br /&gt;
cmd.params_[13] = @work&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29531</id>
		<title>Insteon Venstar Thermostat Module</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29531"/>
		<updated>2012-02-24T22:24:15Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo |810Status=Working|810UpdatedDate=8 Feb 2012|810UpdatedBy=Trippleg}}&lt;br /&gt;
[[Category: Climate ]]&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
&#039;&#039;&#039;Overview&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Venstar Thermostat expects Insteon to send specific commands to the device, and each command is encapsulated in a mode.  &lt;br /&gt;
For example: In order to send a command to change the temperature. Venstar has to know what mode ie. Heat, Auto, Cool. Therefore; the code sent specifies mode and temperature setting.  &lt;br /&gt;
Since there is no built in mechanism for this In the DCE router one was created.&lt;br /&gt;
&lt;br /&gt;
--[[User:Trippleg|Trippleg]] 00:22, 9 February 2012 (CET)trippleg&lt;br /&gt;
&lt;br /&gt;
Added Template Sample --[[User:Trippleg|Trippleg]] 23:24, 24 February 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Issuing A Command&#039;&#039;&#039; ==&lt;br /&gt;
&#039;&#039;&#039;This assumes you have already built and configured template 2209.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Click Climate, and pick the appropriate device.&lt;br /&gt;
&lt;br /&gt;
2. Click Advanced&lt;br /&gt;
&lt;br /&gt;
3. Click Send Command to Device.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mode Commands&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Off&#039;&#039;&#039; command = Works as programmed within LMCE&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On&#039;&#039;&#039; command does not work. We have to issue a mode instead.&lt;br /&gt;
&lt;br /&gt;
 The following effectively turns the device &#039;&#039;&#039;ON&#039;&#039;&#039;.&lt;br /&gt;
    1. Send to this device the command select &#039;&#039;&#039;Set Heat/Cool&#039;&#039;&#039; &lt;br /&gt;
    2. # 8 On/Off (string) Box place the following:&lt;br /&gt;
        For &#039;&#039;&#039;Auto&#039;&#039;&#039; String will = A&lt;br /&gt;
        For &#039;&#039;&#039;Cool&#039;&#039;&#039; String will = C&lt;br /&gt;
        For &#039;&#039;&#039;Heat&#039;&#039;&#039; String will = H &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sending a command to change temperature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
With this command we have to send both mode and temp to get it to set, otherwise the thermostat will ignore the request.&lt;br /&gt;
   1. Send to this device the command select &#039;&#039;&#039;Set Tempurature&#039;&#039;&#039;.&lt;br /&gt;
   2. # 5 Value To Assign (string) Box Place The following: Mode/Temperature&lt;br /&gt;
      For &#039;&#039;&#039;Cool Temperature Setting&#039;&#039;&#039; String will = C/72  for Cool at 72 degrees&lt;br /&gt;
      For &#039;&#039;&#039;Heat Temperature Setting&#039;&#039;&#039; String will = H/78  for Heat at 74 degrees&lt;br /&gt;
  (&#039;&#039;Both of the above temp controls work in all 3 modes sending the C or the H effectively tells the unit to change the temp at which the A/C or Heater turns on&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reporting Device Status ==&lt;br /&gt;
&lt;br /&gt;
This feature has not been enabled yet. Insteon does have the ability do do this, it just has not been coded for yet.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Template Sample&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
To Build the template I used the default Thermostat template and added some extra Device Data fields required By the Insteon PLM. Below are some template screen shots.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please Note: You will need the updated version of the Insteon PLM.  I am working on posting it to the existing wiki page. The code has been posted so it should be available in the current SVN&#039;&#039;&lt;br /&gt;
[[{{ns:6}}:Template2209-1.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[{{ns:6}}:Template2209-2.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[{{ns:6}}:Template2209-3.JPG]]&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=File:Template2209-3.JPG&amp;diff=29530</id>
		<title>File:Template2209-3.JPG</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=File:Template2209-3.JPG&amp;diff=29530"/>
		<updated>2012-02-24T22:06:48Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: Template 2209 Screen Shot 3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Template 2209 Screen Shot 3&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=File:Template2209-2.JPG&amp;diff=29529</id>
		<title>File:Template2209-2.JPG</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=File:Template2209-2.JPG&amp;diff=29529"/>
		<updated>2012-02-24T22:06:09Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: Template 2209 Screen shot 2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Template 2209 Screen shot 2&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=File:Template2209-1.JPG&amp;diff=29528</id>
		<title>File:Template2209-1.JPG</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=File:Template2209-1.JPG&amp;diff=29528"/>
		<updated>2012-02-24T22:04:44Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: Template 2209 screen shot 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Template 2209 screen shot 1&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29457</id>
		<title>Insteon Venstar Thermostat Module</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29457"/>
		<updated>2012-02-09T16:19:13Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo |810Status=Working|810UpdatedDate=8 Feb 2012|810UpdatedBy=Trippleg}}&lt;br /&gt;
[[Category: Climate ]]&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
&#039;&#039;&#039;Overview&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Venstar Thermostat expects Insteon to send specific commands to the device, and each command is encapsulated in a mode.  &lt;br /&gt;
For example: In order to send a command to change the temperature. Venstar has to know what mode ie. Heat, Auto, Cool. Therefore; the code sent specifies mode and temperature setting.  &lt;br /&gt;
Since there is no built in mechanism for this In the DCE router one was created.&lt;br /&gt;
&lt;br /&gt;
--[[User:Trippleg|Trippleg]] 00:22, 9 February 2012 (CET)trippleg&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Issuing A Command&#039;&#039;&#039; ==&lt;br /&gt;
&#039;&#039;&#039;This assumes you have already built and configured template 2209.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Click Climate, and pick the appropriate device.&lt;br /&gt;
&lt;br /&gt;
2. Click Advanced&lt;br /&gt;
&lt;br /&gt;
3. Click Send Command to Device.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mode Commands&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Off&#039;&#039;&#039; command = Works as programmed within LMCE&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On&#039;&#039;&#039; command does not work. We have to issue a mode instead.&lt;br /&gt;
&lt;br /&gt;
 The following effectively turns the device &#039;&#039;&#039;ON&#039;&#039;&#039;.&lt;br /&gt;
    1. Send to this device the command select &#039;&#039;&#039;Set Heat/Cool&#039;&#039;&#039; &lt;br /&gt;
    2. # 8 On/Off (string) Box place the following:&lt;br /&gt;
        For &#039;&#039;&#039;Auto&#039;&#039;&#039; String will = A&lt;br /&gt;
        For &#039;&#039;&#039;Cool&#039;&#039;&#039; String will = C&lt;br /&gt;
        For &#039;&#039;&#039;Heat&#039;&#039;&#039; String will = H &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sending a command to change temperature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
With this command we have to send both mode and temp to get it to set, otherwise the thermostat will ignore the request.&lt;br /&gt;
   1. Send to this device the command select &#039;&#039;&#039;Set Tempurature&#039;&#039;&#039;.&lt;br /&gt;
   2. # 5 Value To Assign (string) Box Place The following: Mode/Temperature&lt;br /&gt;
      For &#039;&#039;&#039;Cool Temperature Setting&#039;&#039;&#039; String will = C/72  for Cool at 72 degrees&lt;br /&gt;
      For &#039;&#039;&#039;Heat Temperature Setting&#039;&#039;&#039; String will = H/78  for Heat at 74 degrees&lt;br /&gt;
  (&#039;&#039;Both of the above temp controls work in all 3 modes sending the C or the H effectively tells the unit to change the temp at which the A/C or Heater turns on&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reporting Device Status ==&lt;br /&gt;
&lt;br /&gt;
This feature has not been enabled yet. Insteon does have the ability do do this, it just has not been coded for yet.&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=File:2412n.jpg&amp;diff=29453</id>
		<title>File:2412n.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=File:2412n.jpg&amp;diff=29453"/>
		<updated>2012-02-08T23:41:40Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29452</id>
		<title>Insteon Venstar Thermostat Module</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29452"/>
		<updated>2012-02-08T23:30:40Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Climate ]]&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
&#039;&#039;&#039;Overview&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Venstar Thermostat expects Insteon to send specific commands to the device, and each command is encapsulated in a mode.  &lt;br /&gt;
For example: In order to send a command to change the temperature. Venstar has to know what mode ie. Heat, Auto, Cool. Therefore; the code sent specifies mode and temperature setting.  &lt;br /&gt;
Since there is no built in mechanism for this In the DCE router one was created.&lt;br /&gt;
&lt;br /&gt;
--[[User:Trippleg|Trippleg]] 00:22, 9 February 2012 (CET)trippleg&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Issuing A Command&#039;&#039;&#039; ==&lt;br /&gt;
&#039;&#039;&#039;This assumes you have already built and configured template 2209.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Click Climate, and pick the appropriate device.&lt;br /&gt;
&lt;br /&gt;
2. Click Advanced&lt;br /&gt;
&lt;br /&gt;
3. Click Send Command to Device.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mode Commands&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Off&#039;&#039;&#039; command = Works as programmed within LMCE&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On&#039;&#039;&#039; command does not work. We have to issue a mode instead.&lt;br /&gt;
&lt;br /&gt;
 The following effectively turns the device &#039;&#039;&#039;ON&#039;&#039;&#039;.&lt;br /&gt;
    1. Send to this device the command select &#039;&#039;&#039;Set Heat/Cool&#039;&#039;&#039; &lt;br /&gt;
    2. # 8 On/Off (string) Box place the following:&lt;br /&gt;
        For &#039;&#039;&#039;Auto&#039;&#039;&#039; String will = A&lt;br /&gt;
        For &#039;&#039;&#039;Cool&#039;&#039;&#039; String will = C&lt;br /&gt;
        For &#039;&#039;&#039;Heat&#039;&#039;&#039; String will = H &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sending a command to change temperature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
With this command we have to send both mode and temp to get it to set, otherwise the thermostat will ignore the request.&lt;br /&gt;
   1. Send to this device the command select &#039;&#039;&#039;Set Tempurature&#039;&#039;&#039;.&lt;br /&gt;
   2. # 5 Value To Assign (string) Box Place The following: Mode/Temperature&lt;br /&gt;
      For &#039;&#039;&#039;Cool Temperature Setting&#039;&#039;&#039; String will = C/72  for Cool at 72 degrees&lt;br /&gt;
      For &#039;&#039;&#039;Heat Temperature Setting&#039;&#039;&#039; String will = H/78  for Heat at 74 degrees&lt;br /&gt;
  (&#039;&#039;Both of the above temp controls work in all 3 modes sending the C or the H effectively tells the unit to change the temp at which the A/C or Heater turns on&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reporting Device Status ==&lt;br /&gt;
&lt;br /&gt;
This feature has not been enabled yet. Insteon does have the ability do do this, it just has not been coded for yet.&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29451</id>
		<title>Insteon Venstar Thermostat Module</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29451"/>
		<updated>2012-02-08T23:29:16Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Climate ]]&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:Power Line Control]]&lt;br /&gt;
&#039;&#039;&#039;Overview&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Venstar Thermostat expects Insteon to send specific commands to the device, and each command is encapsulated in a mode.  &lt;br /&gt;
For example: In order to send a command to change the temperature. Venstar has to know what mode ie. Heat, Auto, Cool. Therefore; the code sent specifies mode and temperature setting.  &lt;br /&gt;
Since there is no built in mechanism for this In the DCE router one was created.&lt;br /&gt;
&lt;br /&gt;
--[[User:Trippleg|Trippleg]] 00:22, 9 February 2012 (CET)trippleg&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Issuing A Command&#039;&#039;&#039; ==&lt;br /&gt;
&#039;&#039;&#039;This assumes you have already built and configured template 2209.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Click Climate, and pick the appropriate device.&lt;br /&gt;
&lt;br /&gt;
2. Click Advanced&lt;br /&gt;
&lt;br /&gt;
3. Click Send Command to Device.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mode Commands&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Off&#039;&#039;&#039; command = Works as programmed within LMCE&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On&#039;&#039;&#039; command does not work. We have to issue a mode instead.&lt;br /&gt;
&lt;br /&gt;
 The following effectively turns the device &#039;&#039;&#039;ON&#039;&#039;&#039;.&lt;br /&gt;
    1. Send to this device the command select &#039;&#039;&#039;Set Heat/Cool&#039;&#039;&#039; &lt;br /&gt;
    2. # 8 On/Off (string) Box place the following:&lt;br /&gt;
        For &#039;&#039;&#039;Auto&#039;&#039;&#039; String will = A&lt;br /&gt;
        For &#039;&#039;&#039;Cool&#039;&#039;&#039; String will = C&lt;br /&gt;
        For &#039;&#039;&#039;Heat&#039;&#039;&#039; String will = H &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sending a command to change temperature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
With this command we have to send both mode and temp to get it to set, otherwise the thermostat will ignore the request.&lt;br /&gt;
   1. Send to this device the command select &#039;&#039;&#039;Set Tempurature&#039;&#039;&#039;.&lt;br /&gt;
   2. # 5 Value To Assign (string) Box Place The following: Mode/Temperature&lt;br /&gt;
      For &#039;&#039;&#039;Cool Temperature Setting&#039;&#039;&#039; String will = C/72  for Cool at 72 degrees&lt;br /&gt;
      For &#039;&#039;&#039;Heat Temperature Setting&#039;&#039;&#039; String will = H/78  for Heat at 74 degrees&lt;br /&gt;
  (&#039;&#039;Both of the above temp controls work in all 3 modes sending the C or the H effectively tells the unit to change the temp at which the A/C or Heater turns on&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reporting Device Status ==&lt;br /&gt;
&lt;br /&gt;
This feature has not been enabled yet. Insteon does have the ability do do this, it just has not been coded for yet.&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29450</id>
		<title>Insteon Venstar Thermostat Module</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29450"/>
		<updated>2012-02-08T23:22:56Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Climate ]]&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
&#039;&#039;&#039;Overview&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Venstar Thermostat expects Insteon to send specific commands to the device, and each command is encapsulated in a mode.  &lt;br /&gt;
For example: In order to send a command to change the temperature. Venstar has to know what mode ie. Heat, Auto, Cool. Therefore; the code sent specifies mode and temperature setting.  &lt;br /&gt;
Since there is no built in mechanism for this In the DCE router one was created.&lt;br /&gt;
&lt;br /&gt;
--[[User:Trippleg|Trippleg]] 00:22, 9 February 2012 (CET)trippleg&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Issuing A Command&#039;&#039;&#039; ==&lt;br /&gt;
&#039;&#039;&#039;This assumes you have already built and configured template 2209.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Click Climate, and pick the appropriate device.&lt;br /&gt;
&lt;br /&gt;
2. Click Advanced&lt;br /&gt;
&lt;br /&gt;
3. Click Send Command to Device.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mode Commands&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Off&#039;&#039;&#039; command = Works as programmed within LMCE&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On&#039;&#039;&#039; command does not work. We have to issue a mode instead.&lt;br /&gt;
&lt;br /&gt;
 The following effectively turns the device &#039;&#039;&#039;ON&#039;&#039;&#039;.&lt;br /&gt;
    1. Send to this device the command select &#039;&#039;&#039;Set Heat/Cool&#039;&#039;&#039; &lt;br /&gt;
    2. # 8 On/Off (string) Box place the following:&lt;br /&gt;
        For &#039;&#039;&#039;Auto&#039;&#039;&#039; String will = A&lt;br /&gt;
        For &#039;&#039;&#039;Cool&#039;&#039;&#039; String will = C&lt;br /&gt;
        For &#039;&#039;&#039;Heat&#039;&#039;&#039; String will = H &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sending a command to change temperature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
With this command we have to send both mode and temp to get it to set, otherwise the thermostat will ignore the request.&lt;br /&gt;
   1. Send to this device the command select &#039;&#039;&#039;Set Tempurature&#039;&#039;&#039;.&lt;br /&gt;
   2. # 5 Value To Assign (string) Box Place The following: Mode/Temperature&lt;br /&gt;
      For &#039;&#039;&#039;Cool Temperature Setting&#039;&#039;&#039; String will = C/72  for Cool at 72 degrees&lt;br /&gt;
      For &#039;&#039;&#039;Heat Temperature Setting&#039;&#039;&#039; String will = H/78  for Heat at 74 degrees&lt;br /&gt;
  (&#039;&#039;Both of the above temp controls work in all 3 modes sending the C or the H effectively tells the unit to change the temp at which the A/C or Heater turns on&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reporting Device Status ==&lt;br /&gt;
&lt;br /&gt;
This feature has not been enabled yet. Insteon does have the ability do do this, it just has not been coded for yet.&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29449</id>
		<title>Insteon Venstar Thermostat Module</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_Venstar_Thermostat_Module&amp;diff=29449"/>
		<updated>2012-02-08T22:49:22Z</updated>

		<summary type="html">&lt;p&gt;Trippleg: Created page with &amp;quot;Category: Climate  category: Insteon &amp;#039;&amp;#039;&amp;#039;Overview&amp;#039;&amp;#039;  The Venstar Thermostat expects Insteon to send specific commands to the device, and each command is encapsulated in a ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Climate ]]&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
&#039;&#039;&#039;Overview&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Venstar Thermostat expects Insteon to send specific commands to the device, and each command is encapsulated in a mode.  &lt;br /&gt;
For example: In order to send a command to change the temperature. Venstar has to know what mode ie. Heat, Auto, Cool. Therefore; the code sent specifies mode and temperature setting.  &lt;br /&gt;
Since there is no built in mechanism for this In the DCE router one was created.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Issuing A Command&#039;&#039;&#039; ==&lt;br /&gt;
&#039;&#039;&#039;This assumes you have already built and configured template 2209.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Click Climate, and pick the appropriate device.&lt;br /&gt;
&lt;br /&gt;
2. Click Advanced&lt;br /&gt;
&lt;br /&gt;
3. Click Send Command to Device.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mode Commands&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Off&#039;&#039;&#039; command = Works as programmed within LMCE&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On&#039;&#039;&#039; command does not work. We have to issue a mode instead.&lt;br /&gt;
&lt;br /&gt;
 The following effectively turns the device &#039;&#039;&#039;ON&#039;&#039;&#039;.&lt;br /&gt;
    1. Send to this device the command select &#039;&#039;&#039;Set Heat/Cool&#039;&#039;&#039; &lt;br /&gt;
    2. # 8 On/Off (string) Box place the following:&lt;br /&gt;
        For &#039;&#039;&#039;Auto&#039;&#039;&#039; String will = A&lt;br /&gt;
        For &#039;&#039;&#039;Cool&#039;&#039;&#039; String will = C&lt;br /&gt;
        For &#039;&#039;&#039;Heat&#039;&#039;&#039; String will = H &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sending a command to change temperature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
With this command we have to send both mode and temp to get it to set, otherwise the thermostat will ignore the request.&lt;br /&gt;
   1. Send to this device the command select &#039;&#039;&#039;Set Tempurature&#039;&#039;&#039;.&lt;br /&gt;
   2. # 5 Value To Assign (string) Box Place The following: Mode/Temperature&lt;br /&gt;
      For &#039;&#039;&#039;Cool Temperature Setting&#039;&#039;&#039; String will = C/72  for Cool at 72 degrees&lt;br /&gt;
      For &#039;&#039;&#039;Heat Temperature Setting&#039;&#039;&#039; String will = H/78  for Heat at 74 degrees&lt;br /&gt;
  (&#039;&#039;Both of the above temp controls work in all 3 modes sending the C or the H effectively tells the unit to change the temp at which the A/C or Heater turns on&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reporting Device Status ==&lt;br /&gt;
&lt;br /&gt;
This feature has not been enabled yet. Insteon does have the ability do do this, it just has not been coded for yet.&lt;/div&gt;</summary>
		<author><name>Trippleg</name></author>
	</entry>
</feed>