<?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=RayBe</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=RayBe"/>
	<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php/Special:Contributions/RayBe"/>
	<updated>2026-07-22T02:53:31Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=You_don%27t_have_a_driver_for_my_home_automation_device&amp;diff=36831</id>
		<title>You don&#039;t have a driver for my home automation device</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=You_don%27t_have_a_driver_for_my_home_automation_device&amp;diff=36831"/>
		<updated>2016-07-11T14:57:25Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware| Yo]]&lt;br /&gt;
[[Category:Automation]]&lt;br /&gt;
[[Category:Troubleshooting]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&lt;br /&gt;
{{versioninfo}}&lt;br /&gt;
Most home automation products require equipment manufacturers to send samples back to the company so programmers can write drivers.  We&#039;ve added features in LinuxMCE that should make this unnecessary in nearly all cases, allowing new drivers to be added quickly and usually without any major programming skills.  Here are some options:&lt;br /&gt;
# Our &amp;quot;Generic Serial Device&amp;quot; module (GSD) is designed for the thousands of devices that are controlled over RS232 and Ethernet.  It allows a LinuxMCE driver to be added using a point-and-click, fill-in-the-blanks interface.  Basic protocols can be implemented with no programming at all.  For more complicated tasks GSD embeds the Ruby language.  Ruby is a high-level interpreted language with flexible string handling, like Perl, but the syntax is simpler.  The protocol and embedded Ruby for GSD devices is stored in the database and automatically synchronized with all other LinuxMCE systems as long as you leave checked the &amp;quot;Share my IR codes and GSD device&amp;quot; box on the A/V Equipment wizard.  So there&#039;s no compiling and no code to check in.  GSD devices to control a/v equipment, lighting, etc., can be done in as little as an hour or two, almost never more than a day for complex protocols.  See&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=GSD_-_Ruby_codes&amp;diff=36830</id>
		<title>GSD - Ruby codes</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=GSD_-_Ruby_codes&amp;diff=36830"/>
		<updated>2016-07-11T14:56:26Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&lt;br /&gt;
== GSD ==&lt;br /&gt;
Generic Serial Device is a module that offers basic functionality for accessing devices via the serial port (mostly through the RS232 interface). The project sources are located in pluto/src/Generic_Serial_Devices.&lt;br /&gt;
&lt;br /&gt;
== Command implementation in Ruby ==&lt;br /&gt;
For Generic Serial Devices the architecture allows implementing the commands directly from the LinuxMCE Admin Web Page, using Advanced/Device Templates. After picking the device template, select ruby codes and add the command groups that you want to implement (should be supported by the devices for which you want to create the template)&lt;br /&gt;
&lt;br /&gt;
The framework offers an Ruby &#039;&#039;Command&#039;&#039; object that actually behaves as a container for data also found in the C++ class Command from DCE. In order to create an instance of the ruby command use:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     cmd = Command.new( &amp;lt;device from&amp;gt;, &amp;lt;device to&amp;gt;, &amp;lt;priority&amp;gt;, &amp;lt;type&amp;gt;, &amp;lt;id&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There is a hash map associated with the command object that allows setting values for the command parameters:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     cmd.params_[&amp;lt;parameter id&amp;gt;] = &amp;lt;string value for command parameter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And for sending the command you should use the SendCommand function:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     SendCommand(cmd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Directly implementing each command this way may prove inconvenient. You can use the Private Method dummy command for writing helper functions. Besides from the params_ member, the ruby Command object has members for all the parameters from the constructor. Still, the wrapper offers only simple access to what a command really is in the DCE Framework, but, of course, it can be extended to allow more by adding members to the RubyCommandWrapper C++ class. All that&#039;s implemented here gets translated to Ruby.&lt;br /&gt;
&lt;br /&gt;
The actual forwarding to the DCE framework is done in the Generic_Serial_Device project, in classes implementing RubyDCEConnector (ex: RubyIOManager). These are used at their turn from the RubySerialWrapper, witch offers the actual context where the Ruby code runs (Ruby twin classes are generated for each device at runtime). The SendCommand used above is a method of the RubySerialWrapper class.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=ISY994i&amp;diff=36829</id>
		<title>ISY994i</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=ISY994i&amp;diff=36829"/>
		<updated>2016-07-11T14:53:31Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Automation]]&lt;br /&gt;
[[Category: Insteon]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&lt;br /&gt;
{{versioninfo|1004Status=Basic Functions Working|1004UpdatedDate=10 January 2014|1004UpdatedBy=Michael Brown|1204Status=Working, In Development|1204UpdatedDate=10 January 2014|1204UpdatedBy=Michael Brown}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More info to come.  Like the driver itself, this page is a work in progress. Please stand by...  Another update will hopefully land in January 2015.&lt;br /&gt;
&lt;br /&gt;
The ISY994i is a home automation controller from Universal Devices.  It has an embedded processor, runs it&#039;s own real-time OS, is network connected, and manages the various home automation devices as a stand-alone controller. Configuring and administering the ISY is done via a Java application &amp;quot;console&amp;quot;, which is used to manage devices, create programs and scheduled events, upgrade the device firmware, and add functionality via purchased license keys.  It exposes it&#039;s functionality via well-developed application programming interfaces (API&#039;s).  &lt;br /&gt;
&lt;br /&gt;
The LMCE ISY driver is being written using the Ruby GSD Device interface, and leverages the ISY&#039;s API to expose the managed devices and controls to LMCE.  The driver has been written with the assumption that the ISY &amp;quot;owns&amp;quot; the connected devices, and exposes them to LMCE for integration and control as an external controller.  As the API&#039;s develop, some capabilities to configure the ISY from LMCE may be created.  Until then, the expectation is that all home automation device configuration and management will occur using the Universal Devices Java admin console, and that the configuration and capabilities will be exposed to LMCE for use via it&#039;s capabilities. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ISY Models&#039;&#039;&#039;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; align=&amp;quot;left&amp;quot;&lt;br /&gt;
! Model&lt;br /&gt;
! IR Support&lt;br /&gt;
! Max. Devices/Scenes&lt;br /&gt;
! Max. Programs&lt;br /&gt;
|-&lt;br /&gt;
| ISY994i &lt;br /&gt;
| No&lt;br /&gt;
| 256&lt;br /&gt;
| 300&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| ISY994i/IR &lt;br /&gt;
| Yes&lt;br /&gt;
| 256&lt;br /&gt;
| 300&lt;br /&gt;
|-&lt;br /&gt;
| ISY994i PRO&lt;br /&gt;
| No&lt;br /&gt;
| 1024&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| ISY994i/IR &lt;br /&gt;
| Yes&lt;br /&gt;
| 1024&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Zigbee devices have the &#039;Z&#039; device suffix on the model number (e.g. ISY994iZ/IR PRO).  The Z-wave device is has just passed the alpha testing phase, and will be going into beta testing soon.  Support for the Z-wave radio will likely be added when it&#039;s released (and I have the opportunity to get one), as there&#039;s some pretty cool Z-wave sensors available...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.universal-devices.com/residential/isy994i-series/ Manufacturer Web page at UniversalDevices.com]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The LMCE driver utilizes template # 2276.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE&#039;&#039;&#039;:  The Driver has a dependency on the libmysql-ruby and libmysql-ruby1.8 packages, which are not currently part of the driver&#039;s automatic installation.  For now, you will need to manually install the ruby-mysql packages using the command &amp;quot;sudo apt-get install libmysql-ruby1.8 libmysql-ruby&amp;quot; and then reload the router.  This will be addressed in the next update of the driver, along with better scene controls and weather module integrations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ISY Hardware Interface support&#039;&#039;&#039;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; align=&amp;quot;left&amp;quot;&lt;br /&gt;
! Module&lt;br /&gt;
! Description&lt;br /&gt;
! Supported Features&lt;br /&gt;
|-&lt;br /&gt;
| Insteon&lt;br /&gt;
| Support for Insteon PLM&#039;s including X10 transmission/reception&lt;br /&gt;
| Working&lt;br /&gt;
|-&lt;br /&gt;
| UPB&lt;br /&gt;
| Support for UPB Modems&lt;br /&gt;
| N/A&lt;br /&gt;
|-&lt;br /&gt;
| Zigbee&lt;br /&gt;
| Support for the optional Zigbee model/radio.&lt;br /&gt;
| N/A&lt;br /&gt;
|-&lt;br /&gt;
| Z-wave&lt;br /&gt;
| Support for the optional Z-wave model/radio.&lt;br /&gt;
| N/A&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ISY series supports optional (paid) upgrades which can enable additional functionality in the ISY device.  It allows home automation users to start off small, and add additional functionality later as their environment grows or their needs change.  For example, a non-pro model can be upgraded by purchasing a Pro upgrade license key.  Some hardware upgrades can be done in the field by purchasing the hardware directly from Universal Devices web store.  The following table shows the LMCE driver support for the various add-on software modules.  Features marked N/A have not been implemented yet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ISY module support&#039;&#039;&#039;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; align=&amp;quot;left&amp;quot;&lt;br /&gt;
! Module&lt;br /&gt;
! Description&lt;br /&gt;
! Supported Features&lt;br /&gt;
|-&lt;br /&gt;
| Climate Module&lt;br /&gt;
| The ISY HAMweather Climate Module&lt;br /&gt;
| In progress, pending 12.04&lt;br /&gt;
|-&lt;br /&gt;
| Networking Module&lt;br /&gt;
| The ISY networking module&lt;br /&gt;
| N/A&lt;br /&gt;
|-&lt;br /&gt;
| X10 Module&lt;br /&gt;
| The ISY X10 module which incorporates X10 devices into the device tree.  Note: if you want to be able to control X10 devices from LMCE or any Orbiter, or receive events for X10 devices, you will need this module license.&lt;br /&gt;
| Working, Tested&lt;br /&gt;
|-&lt;br /&gt;
| Electricity Module&lt;br /&gt;
| The ISY electricity monitoring module for Brultech devices&lt;br /&gt;
| N/A&lt;br /&gt;
|-&lt;br /&gt;
| Irrigation Module&lt;br /&gt;
| The irrigation module used in conjunction with the Climate (HAMweather) module.&lt;br /&gt;
| N/A&lt;br /&gt;
|-&lt;br /&gt;
| ELK Module&lt;br /&gt;
| The ISY &amp;lt;-&amp;gt; Elk M1 Security Panel interface module.&lt;br /&gt;
| N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Using the ISY Driver&#039;&#039;&#039;&lt;br /&gt;
The ISY driver is configured for auto-discovery using DHCP.  When the ISY requests an IP addresses, LinuxMCE  will automatically  add the device template.  You will need to login to the LinuxMCE Administration Page, and change the username and password to match those configured in the ISY.  The template defaults to admin:admin.  Afterwards, you will need to reload the router.&lt;br /&gt;
&lt;br /&gt;
When the DCErouter reloads, the driver will establish a connection to the ISY.  It will create child devices of the ISY in LinuxMCE, by reading all configured /managed devices from the ISY, and creating a corresponding child in LMCE.  You will need to reload the router in order to use the devices from LMCE.  Similarly, scenes (groups) will be downloaded and appropriate child devices created.   After all devices and scenes have been recognized, you can then edit the devices in LMCE to set the room, floor plan ID (icons used in the Floor plan view in Orbiter), etc.  when you are complete, reload the router again.  Your devices and Insteon scenes  are now available to use in LMCE scenarios.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Troubleshooting&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you&#039;re having problems, the logs are the best place to look to see what&#039;s going on.  There are two logs: the &amp;lt;dev#&amp;gt;_Generic _Serial_Device.log has to do with LMCE&#039;s interaction with the driver, and &amp;lt;dev#&amp;gt;_ISY-994i-GSD.log, which logs the driver&#039;s interaction with the ISY.  Both are located in /var/log/pluto. &lt;br /&gt;
&lt;br /&gt;
Mine are 189_Generic_Serial_Device.log and 189_ISY-994i-GSD.log (as an example).&lt;br /&gt;
&lt;br /&gt;
By default, the &amp;lt;dev#&amp;gt;_ISY-994i-GSD.log logs a minimal amount of the interaction between the driver and the ISY.  That could give you hints as to what is happening when.  To get more in-depth information as to what&#039;s going on, you&#039;ll need to enable Debug mode.  In the WebAdmin, go to Generic Serial Devices, and check the box next to debug in the device info screen.  Reload the router to restart the driver with verbose logging.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=DirecTV_IP_Receiver&amp;diff=36828</id>
		<title>DirecTV IP Receiver</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=DirecTV_IP_Receiver&amp;diff=36828"/>
		<updated>2016-07-11T14:52:59Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]] &lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&lt;br /&gt;
== Minimal codeset for control of DirecTV IP Satellite boxes ==&lt;br /&gt;
&lt;br /&gt;
The template 2159 (HR24 IP) can be modified with these codes.&lt;br /&gt;
&lt;br /&gt;
Verify template Comm Method is Ethernet.&lt;br /&gt;
&lt;br /&gt;
Device Data needs #69 TCP Port(int) set to 8080&lt;br /&gt;
&lt;br /&gt;
I am unable to determine the range for the MAC address of the devices.  I set the Plug &amp;amp; Play &#039;Range of MAC&#039; From 111121700000 To 111121742000, Vendor Model ID = DirecTV HR-xx Satellite Box, and PNP Protocol = DHCP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ruby Codes ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;INTERNAL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Process Initialize&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
$logFile = File.new(&amp;quot;/var/log/pluto/DirecTV.log&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Process Incoming Data&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
buf = conn_.Recv(100, 500)&lt;br /&gt;
if !(buf.empty?)&lt;br /&gt;
  msg = buf.strip&lt;br /&gt;
  log(msg)&lt;br /&gt;
  log(&amp;quot;&amp;quot;)   &lt;br /&gt;
  log(&amp;quot;***********************************************************&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Private Method Listing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def RemoteKey(key)&lt;br /&gt;
  log(&amp;quot;**********          Sending key=&amp;quot; + key + &amp;quot;          **********&amp;quot;)&lt;br /&gt;
  conn_.Send(&amp;quot;GET\x20/remote/processKey?key=&amp;quot; + key +  &amp;amp;hold=keyPress\x20HTTP/1.1\x0D\x0AContent-Length:\x200\x0D\x0A\x0D\x0A&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def log(word)&lt;br /&gt;
    logTime = Time.now&lt;br /&gt;
    timeStr = logTime.strftime(&amp;quot;%d-%m-%Y  %H:%M:%S  &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    $logFile.print( timeStr + word + &amp;quot;\n&amp;quot; )&lt;br /&gt;
    $logFile.flush()&lt;br /&gt;
    print(word + &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;POWER&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;On&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RemoteKey(&amp;quot;poweron&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Off&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RemoteKey(&amp;quot;poweroff&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GENERAL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Enter/Go&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RemoteKey(&amp;quot;enter&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Info&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RemoteKey(&amp;quot;info&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NUMBERS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RemoteKey(&amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;1&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RemoteKey(&amp;quot;1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;2&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RemoteKey(&amp;quot;2&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;3&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RemoteKey(&amp;quot;3&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;4&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RemoteKey(&amp;quot;4&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;9&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RemoteKey(&amp;quot;9&amp;quot;)&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Panasonic_AE3000&amp;diff=36827</id>
		<title>Panasonic AE3000</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Panasonic_AE3000&amp;diff=36827"/>
		<updated>2016-07-11T14:52:12Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
{{Versioninfo}}&lt;br /&gt;
[[Category: Video]]&lt;br /&gt;
[[Category: Displays]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&lt;br /&gt;
--[[User:Johanr|Johanr]] 23:47, 15 December 2010 (CET)&lt;br /&gt;
The Panasonic AE 3000 can be controlled by rs-232.&lt;br /&gt;
I am working on a template(whenever there is time left) and here is what I have put into it this far. Currently the receiving of feedback from the projector is not working and also the init process is abit dodgy. I have therefore not uploaded the template yet.&lt;br /&gt;
Please feel free to come with suggestions regarding the ruby since this is the first one for me.&lt;br /&gt;
Below is the print of the output from the log&lt;br /&gt;
&lt;br /&gt;
 0:require &#039;Ruby_Generic_Serial_Device&#039;&lt;br /&gt;
   1:class Command &amp;lt; Ruby_Generic_Serial_Device::RubyCommandWrapper&lt;br /&gt;
   2:end&lt;br /&gt;
   3:class Device_72 &amp;lt; Ruby_Generic_Serial_Device::RubySerialIOWrapper&lt;br /&gt;
   4:#### 192 ####################################################################&lt;br /&gt;
   5:def cmd_192(pk_pipe, pk_device_pipes, cmd=nil)&lt;br /&gt;
   6:@returnParamArray.clear&lt;br /&gt;
   7:conn_.Send(&amp;quot;\x02PON\x03&amp;quot;)&lt;br /&gt;
   8:&lt;br /&gt;
   9:return @returnParamArray&lt;br /&gt;
  10:end&lt;br /&gt;
  11:#### 193 ####################################################################&lt;br /&gt;
  12:def cmd_193(pk_pipe, cmd=nil)&lt;br /&gt;
  13:@returnParamArray.clear&lt;br /&gt;
  14:conn_.Send(&amp;quot;\x02POF\x03&amp;quot;)&lt;br /&gt;
  15:&lt;br /&gt;
  16:return @returnParamArray&lt;br /&gt;
  17:end&lt;br /&gt;
  18:#### 350 ####################################################################&lt;br /&gt;
  19:def cmd_350(cmd=nil)&lt;br /&gt;
  20:@returnParamArray.clear&lt;br /&gt;
  21:buff = &#039;&#039;&lt;br /&gt;
  22:     loop do&lt;br /&gt;
  23:       buff=conn_.Recv(30,200)&lt;br /&gt;
  24:       if buff.empty?&lt;br /&gt;
  25:         print &amp;quot;Nothing Received\n&amp;quot;&lt;br /&gt;
  26:         break&lt;br /&gt;
  27:         end&lt;br /&gt;
  28:&lt;br /&gt;
  29:            if buff.include?(&amp;quot;OK&amp;quot;)&lt;br /&gt;
  30:              print &amp;quot;command received\n&amp;quot;&lt;br /&gt;
  31:            elsif buff.include?(&amp;quot;ER401&amp;quot;)&lt;br /&gt;
  32:              print &amp;quot;command ERROR\n&amp;quot;&lt;br /&gt;
  33:            end&lt;br /&gt;
  34:end&lt;br /&gt;
  35:return @returnParamArray&lt;br /&gt;
  36:end&lt;br /&gt;
  37:#### 355 ####################################################################&lt;br /&gt;
  38:def cmd_355(cmd=nil)&lt;br /&gt;
  39:@returnParamArray.clear&lt;br /&gt;
  40:#31-Nov-10 14:13 init  Panasonic AE3000&lt;br /&gt;
  41:initok=false&lt;br /&gt;
  42:&lt;br /&gt;
  43: for iRetry in 0...4&lt;br /&gt;
  44:   print &amp;quot;Initializing unit\n&amp;quot;&lt;br /&gt;
  45:   conn_.Send(&amp;quot;\x02QPW\x03\r&amp;quot;)&lt;br /&gt;
  46:   buf = conn_.Recv(100, 500)&lt;br /&gt;
  47:   if ( !buf.nil? &amp;amp;&amp;amp; !buf.index(&amp;quot;001&amp;quot;).nil? )&lt;br /&gt;
  48:        print &amp;quot;Initialized ok\n&amp;quot;&lt;br /&gt;
  49:           initok=true&lt;br /&gt;
  50:           break&lt;br /&gt;
  51:   else&lt;br /&gt;
  52:           print &amp;quot;Didn&#039;t respond to command\n&amp;quot;&lt;br /&gt;
  53:   end&lt;br /&gt;
  54:end&lt;br /&gt;
  55:&lt;br /&gt;
  56:#if initok==false&lt;br /&gt;
  57:#  DisableDevice( device_.devid_, false )&lt;br /&gt;
  58:#  print &amp;quot;panaOK.\n&amp;quot;&lt;br /&gt;
  59:#  return&lt;br /&gt;
  60:#end&lt;br /&gt;
  61:return @returnParamArray&lt;br /&gt;
  62:end&lt;br /&gt;
  63:#### 361 ####################################################################&lt;br /&gt;
  64:def cmd_361(cmd=nil)&lt;br /&gt;
  65:@returnParamArray.clear&lt;br /&gt;
  66:conn_.Send(&amp;quot;\x02IIS:HD1\x03&amp;quot;)&lt;br /&gt;
  67:&lt;br /&gt;
  68:return @returnParamArray&lt;br /&gt;
  69:end&lt;br /&gt;
  70:#### 862 ####################################################################&lt;br /&gt;
  71:def cmd_862(cmd=nil)&lt;br /&gt;
  72:@returnParamArray.clear&lt;br /&gt;
  73:conn_.Send(&amp;quot;\x02VPM:CN3\x03&amp;quot;)&lt;br /&gt;
  74:&lt;br /&gt;
  75:return @returnParamArray&lt;br /&gt;
  76:end&lt;br /&gt;
  77:#### 866 ####################################################################&lt;br /&gt;
  78:def cmd_866(cmd=nil)&lt;br /&gt;
  79:@returnParamArray.clear&lt;br /&gt;
  80:conn_.Send(&amp;quot;\x02VPM:DYN\x03&amp;quot;)&lt;br /&gt;
  81:&lt;br /&gt;
  82:return @returnParamArray&lt;br /&gt;
  83:end&lt;br /&gt;
  84:#### 969 ####################################################################&lt;br /&gt;
  85:def cmd_969(cmd=nil)&lt;br /&gt;
  86:@returnParamArray.clear&lt;br /&gt;
  87:conn_.Send(&amp;quot;\x02VPM:NOR\x03&amp;quot;)&lt;br /&gt;
  88:&lt;br /&gt;
  89:return @returnParamArray&lt;br /&gt;
  90:end&lt;br /&gt;
  91:#### START SETTERS ####################################################################&lt;br /&gt;
  92:def initialize()&lt;br /&gt;
  93:super&lt;br /&gt;
  94:@returnParamArray=Array.new&lt;br /&gt;
  95:end&lt;br /&gt;
  96:####  END  SETTERS ####################################################################&lt;br /&gt;
  97:end&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=InteractiveTechnologies_CueServer-Pro-CS-800&amp;diff=36826</id>
		<title>InteractiveTechnologies CueServer-Pro-CS-800</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=InteractiveTechnologies_CueServer-Pro-CS-800&amp;diff=36826"/>
		<updated>2016-07-11T14:51:24Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Automation]] [[Category: hardware]] &lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
This is a template for a DMX lighting controller by Interactive technologies - model [http://www.interactive-online.com/products/cueserver/overview Cueserver pro800]&lt;br /&gt;
Its very basic at the moment however it is working using the serial port I have followed the guide in the wiki &amp;quot;Implementing Clipsal Interface using Generic Serial Device&amp;quot;also adding in device data #76 COM Port ParityBit/Stop(string) #78 COM Port BaudRate(string)&lt;br /&gt;
&lt;br /&gt;
in the RUBY CODE under &amp;quot;Ruby Internal Commands&amp;quot;-&amp;quot;#384 Process Receive Command For Child &amp;quot;add &lt;br /&gt;
&lt;br /&gt;
 id=device_.childdevices_[cmd.devidto_].devdata_[12]#get child device number&lt;br /&gt;
 if cmd.id_==192 #192 is on&lt;br /&gt;
   conn_.Send(&amp;quot;[c&amp;quot;+id+&amp;quot;atfl]\r&amp;quot;) #set id to full&lt;br /&gt;
 end&lt;br /&gt;
 if cmd.id_==193 #193 is off&lt;br /&gt;
   conn_.Send(&amp;quot;[c&amp;quot;+id+&amp;quot;rel]\r&amp;quot;) #relase id to zero&lt;br /&gt;
 end&lt;br /&gt;
 if cmd.id_==184 #184 dimmer&lt;br /&gt;
   conn_.Send(&amp;quot;[c&amp;quot;+id+&amp;quot;at50]\r&amp;quot;) #set id to 50% it should step the light up or down this is not working at present&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
== Things To Do ==&lt;br /&gt;
* get #184 the dimmer command to work correctly&lt;br /&gt;
* add log/messages to keep lmce up to date&lt;br /&gt;
* intergrate the 8 contact closures on the cueserver this could work as alarm interface&lt;br /&gt;
* get it to work over the ethernet write a driver in c++&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Marantz_SR5600&amp;diff=36825</id>
		<title>Marantz SR5600</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Marantz_SR5600&amp;diff=36825"/>
		<updated>2016-07-11T14:49:00Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[Category:Amps_Receivers]]&lt;br /&gt;
{{versioninfo}}&lt;br /&gt;
{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
[[Category: Audio]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&lt;br /&gt;
More info about [http://us.marantz.com/689.asp?category=AV&amp;amp;model=SR5600&amp;amp;go.x=14&amp;amp;go.y=8 device ] :&lt;br /&gt;
&lt;br /&gt;
This is Marantz&#039;s cheapest model that has rs232c connector and surprisingly, it has two way communication capability - that means that when user does something on receiver&#039;s button or IR remote control, you get status messages about changes...&lt;br /&gt;
&lt;br /&gt;
There are few different documents about RS232 protocol on this device.  [http://linuxmce.com/wiki/images/9/9b/SR5500command_table2004_6_18.xls.pdf  This one] worked on mine, luckily is ASCII based and therefore much more user friendly...&lt;br /&gt;
&lt;br /&gt;
First I&#039;ve closely examined existing templates for Yamaha receiver, RS232 Plasma and tried to learn things. Since there is currently no special screen prepared for control of Audio/Tuner receiver device, I decided to use &#039;TV - LiveTV&#039; device with template #1751, that already has associated media screen for tuner control (it&#039;s meant for TV tuner control, but is close enough for a start)...&lt;br /&gt;
&lt;br /&gt;
I have also decided to use Marantz in Multiroom configuration (7+1 output is in this case split to 4+1 output (&amp;quot;Zone Main&amp;quot;) and 2ch stereo output (&amp;quot;Zone Multiroom&amp;quot;). There is also third zone - &amp;quot;Line Out&amp;quot;, but this is only preamp output of Multiroom Zone, but can have separate volume/mute control. Template has currently basic support for all 3 zones. There are still few things to be added, but I&#039;m learning Ruby slowly and have few problems, so maybe I will get some help from more experienced guys...&lt;br /&gt;
&lt;br /&gt;
The whole idea of implementation is to have 3 separate zones (each represented by &amp;quot;Zone&amp;quot; child devices (extended template #1867), to whom you can connect your audio sources by audio pipes. Currently squeezebox devices and other HW players will work ok, there are some slight problems with ordinary Xine player on Onscreen Orbiter, cause whole Orbiter is connected on pipe and when the media stops playing, On command for Orbiter instead of Off for player is propagated through pipe, so your amplifier stays On for some time even after stop...&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;LinuxMCE Developers: Can you please add new media screen for such type of devices (http://plutohome.com/support/mantis/view.php?id=3151)&lt;br /&gt;
and maybe even document procedure on Wiki. &lt;br /&gt;
It would ease similar contributions from other users...&#039;&#039;&lt;br /&gt;
  &lt;br /&gt;
== Description of needed templates ==&lt;br /&gt;
&lt;br /&gt;
I hope that this template will be available with stock LMCE distribution, so you won&#039;t have to create that template from scratch. Template is called &amp;quot;SR Series MultiRoom RS232&amp;quot; to be different from existing template for Marantz in 7+1 configuration (&amp;quot;SR Series RS232&amp;quot;). The main difference between those templates is that this template is more complicated, cause it gives you independent controls of more zones and therefore it has a bit different logic (for example main general power is switched off only when all zones are muted, zones are switched on/off only by muting them)&lt;br /&gt;
&lt;br /&gt;
For template to be functional I&#039;ve made certain extensions to existing template for &amp;quot;Zone&amp;quot; that I hope will be usefull also to others...&lt;br /&gt;
&lt;br /&gt;
=== Important device data and parameters for &amp;quot;SR Series MultiRoom RS232&amp;quot; template ===&lt;br /&gt;
 Description : SR Series MultiRoom RS232&lt;br /&gt;
 Implements DCE : yes&lt;br /&gt;
 Command line : Generic_Serial_Device&lt;br /&gt;
 Device Category  AV/preamps/... #103&lt;br /&gt;
 Manufacturer Marantz&lt;br /&gt;
&lt;br /&gt;
Also have added following parameters :&lt;br /&gt;
&lt;br /&gt;
 Device data&lt;br /&gt;
 Current Data 	                                    Comments 	                                Default Value&lt;br /&gt;
 #37 COM Port on PC                                                                              /dev/ttyS0 	&lt;br /&gt;
 #76 COM Port ParityBit/Stop 	                                                                 N81&lt;br /&gt;
 #78 COM Port BaudRate 	                                                                         B9600&lt;br /&gt;
 #220 Process Child Commands In Pare                                                              1 (needed to have ability to send all commands to parent) 	&lt;br /&gt;
 #157 Discrete Volume(bool)  	                                                                 1 					&lt;br /&gt;
 #220 Process Child Commands In Pare(bool) 	&lt;br /&gt;
&lt;br /&gt;
Settings are factory defaults and should&#039;t be changed (9600 baud rate, 8 bits, 1 stop bit)...&lt;br /&gt;
&lt;br /&gt;
=== &#039;Edit Ruby code&#039; (on template page)  ===&lt;br /&gt;
==== &#039;Determining proper set of inputs&#039; ====&lt;br /&gt;
&lt;br /&gt;
I&#039;ve added all inputs that are present on device. There is also a special input called &amp;quot;FM&amp;quot; where I connected Live TV embedded device to be able to control tuner functions (tuning/searching up/down, go to preset stations, etc...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;Set proper set of commands&#039; ====&lt;br /&gt;
&lt;br /&gt;
Basically I&#039;ve added command groups : &lt;br /&gt;
 Ruby Internal Commands&lt;br /&gt;
 Standard Receiver Command&lt;br /&gt;
 Volume Commands&lt;br /&gt;
and added some needed commands (important is command to tune to certain FM frequency, so you can later add scenarios for tuning to certain FM stations....)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;Add Ruby snippets to commands&#039;==== &lt;br /&gt;
&lt;br /&gt;
I&#039;ve created new IR/Codeset group called &amp;quot;Marantz SR Multiroom RS232&amp;quot;, although I&#039;m not sure how to handle it. Have also edited coresponding Ruby snippets for each command. Basically those are just simple strings that get send on rs232 to take proper action on device according to received command from LinuxMCE... There are also a lot of other functions that help :&lt;br /&gt;
 - determining for which child zone command is targeted&lt;br /&gt;
 - to &amp;quot;normalize&amp;quot; volume levels between Marantz&#039;s internal dB units and range of 0-100&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Simpler commands from Ruby part of template :&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  Power&lt;br /&gt;
 #193 Off&lt;br /&gt;
 	#SendMultiZoneCommand(cmd, [&amp;quot;@PWR:1&amp;quot;, &amp;quot;@MSP:1&amp;quot;, &amp;quot;@MAM:2&amp;quot;]) SendMultiZonePowerOffCommand(cmd, [&amp;quot;@AMT:2&amp;quot;, &amp;quot;@MSP:1&amp;quot;, &amp;quot;@MAM:2&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 #192 On&lt;br /&gt;
 	#SendMultiZoneCommand(cmd, [&amp;quot;@PWR:2&amp;quot;, &amp;quot;@MSP:2&amp;quot;, &amp;quot;@MAM:1&amp;quot;]) SendMultiZonePowerOnCommand(cmd, [&amp;quot;@AMT:1&amp;quot;, &amp;quot;@MSP:2&amp;quot;, &amp;quot;@MAM:1&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 #194 Toggle Power&lt;br /&gt;
 		&lt;br /&gt;
 &lt;br /&gt;
 Inputs&lt;br /&gt;
 #169 AM&lt;br /&gt;
 	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:H&amp;quot;, &amp;quot;@MSC:H&amp;quot;, &amp;quot;@MSC:H&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 #164 Aux&lt;br /&gt;
 	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:9&amp;quot;, &amp;quot;@MSC:9&amp;quot;, &amp;quot;@MSC:9&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 #172 Aux 2&lt;br /&gt;
 	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:A&amp;quot;, &amp;quot;@MSC:A&amp;quot;, &amp;quot;@MSC:A&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 #162 CD&lt;br /&gt;
 	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:C&amp;quot;, &amp;quot;@MSC:C&amp;quot;, &amp;quot;@MSC:C&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 #420 CDR&lt;br /&gt;
 	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:D&amp;quot;, &amp;quot;@MSC:D&amp;quot;, &amp;quot;@MSC:D&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 #178 DSS&lt;br /&gt;
 	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:4&amp;quot;, &amp;quot;@MSC:4&amp;quot;, &amp;quot;@MSC:4&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 #165 DVD&lt;br /&gt;
 	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:2&amp;quot;, &amp;quot;@MSC:2&amp;quot;, &amp;quot;@MSC:2&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 #170 FM&lt;br /&gt;
 	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:G&amp;quot;, &amp;quot;@MSC:G&amp;quot;, &amp;quot;@MSC:G&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 #160 Tape / Tape 1&lt;br /&gt;
 	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:E&amp;quot;, &amp;quot;@MSC:E&amp;quot;, &amp;quot;@MSC:E&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 #166 Tuner&lt;br /&gt;
 	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:F&amp;quot;, &amp;quot;@MSC:F&amp;quot;, &amp;quot;@MSC:F&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 #161 TV&lt;br /&gt;
 	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:1&amp;quot;, &amp;quot;@MSC:1&amp;quot;, &amp;quot;@MSC:1&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 #282 VCR-1&lt;br /&gt;
 	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:3&amp;quot;, &amp;quot;@MSC:3&amp;quot;, &amp;quot;@MSC:3&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 DSP Modes (Audio)&lt;br /&gt;
 #891 All Ch Stereo&lt;br /&gt;
 	#&amp;lt;$&amp;quot;@SUR:0H\r&amp;quot;$&amp;gt; SendIrCommand(&amp;quot;@SUR:0H&amp;quot;) 	&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 #97 Mute&lt;br /&gt;
 	SendMultiZoneCommand(cmd, [&amp;quot;@AMT:0&amp;quot;, &amp;quot;@MSM:0&amp;quot;, &amp;quot;@MAM:0&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 #90 Vol Down&lt;br /&gt;
 	SendMultiZoneCommand(cmd, [&amp;quot;@VOL:2&amp;quot;, &amp;quot;@MSV:2&amp;quot;, &amp;quot;@MVL:2&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 #89 Vol Up&lt;br /&gt;
 	SendMultiZoneCommand(cmd, [&amp;quot;@VOL:1&amp;quot;, &amp;quot;@MSV:1&amp;quot;, &amp;quot;@MVL:1&amp;quot;]) 	&lt;br /&gt;
 &lt;br /&gt;
 Speed Ctrl&lt;br /&gt;
 #125 Scan Back/Rewind&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More important parts with more Ruby code :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
###########################################################3 Internal Methods&lt;br /&gt;
# To do list :&lt;br /&gt;
# - parsing of input messages (inputs,mute,volume,power)&lt;br /&gt;
# - handling of tuner (with live/TV child device)&lt;br /&gt;
# - to properly send events and set device current volume data &lt;br /&gt;
&lt;br /&gt;
def DecodeReceivedInfo_candidate(response)&lt;br /&gt;
# Examples: Mute/On/Off: @AMT:1,@MSP:2,@MAM:2,   Volume: @VOL:-25,@MSV:-56,@MVL:-56  Inputs:@MSC:2E,@SRC:22,@SRC:2E&lt;br /&gt;
   log(&amp;quot;DecodeReceivedInfo1: &amp;quot; + response + &amp;quot;\n&amp;quot;);&lt;br /&gt;
   avrcommand = response[1..3]&lt;br /&gt;
   avrvalue = response[5]&lt;br /&gt;
   log(&amp;quot;DecodeReceivedInfo2: &amp;quot; + response + &amp;quot; -&amp;gt; Command:&amp;quot;+ avrcommand.to_s + &amp;quot; Value: &amp;quot; + avrvalue.to_s + &amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   case avrcommand&lt;br /&gt;
# Input Source changed&lt;br /&gt;
     	when &#039;SRC&#039;&lt;br /&gt;
     		log(&amp;quot;Main Zone Input Changed to &amp;quot;+ avrvalue.to_s+ &amp;quot;\n&amp;quot;);&lt;br /&gt;
     		input_param=0&lt;br /&gt;
     &lt;br /&gt;
     		case avrvalue&lt;br /&gt;
     			when &#039;1&#039;&lt;br /&gt;
     				log(&#039;Main Zone Input Changed to #161: TV&#039;)&lt;br /&gt;
     				input_param=161&lt;br /&gt;
     				temp_state=&amp;quot;Input: TV&amp;quot;&lt;br /&gt;
     			when &#039;2&#039;&lt;br /&gt;
     				log(&#039;Main Zone Input Changed to #165: DVD&#039;)&lt;br /&gt;
     				input_param=165&lt;br /&gt;
     				temp_state=&amp;quot;Input: TV&amp;quot;&lt;br /&gt;
     			when &#039;3&#039;&lt;br /&gt;
     				log(&#039;Main Zone Input Changed to #282: VCR-1&#039;)&lt;br /&gt;
     				input_param=282&lt;br /&gt;
     				temp_state=&amp;quot;Input: TV&amp;quot;&lt;br /&gt;
     			when &#039;4&#039;&lt;br /&gt;
     				log(&#039;Main Zone Input Changed to #178: DSS&#039;)&lt;br /&gt;
     				input_param=178&lt;br /&gt;
     				temp_state=&amp;quot;Input: TV&amp;quot;&lt;br /&gt;
     			when &#039;9&#039;&lt;br /&gt;
     				log(&#039;Main Zone Input Changed to #164: AUX&#039;)&lt;br /&gt;
     				input_param=164&lt;br /&gt;
     				temp_state=&amp;quot;Input: TV&amp;quot;&lt;br /&gt;
     			when &#039;A&#039;&lt;br /&gt;
     				log(&#039;Main Zone Input Changed to #171: AUX2&#039;)&lt;br /&gt;
     				input_param=171&lt;br /&gt;
     				temp_state=&amp;quot;Input: TV&amp;quot;&lt;br /&gt;
     			when &#039;C&#039;&lt;br /&gt;
     				log(&#039;Main Zone Input Changed to #162: CD&#039;)&lt;br /&gt;
     				input_param=162&lt;br /&gt;
     				temp_state=&amp;quot;Input: TV&amp;quot;&lt;br /&gt;
     			when &#039;D&#039;&lt;br /&gt;
     				log(&#039;Main Zone Input Changed to #420: CDR&#039;)&lt;br /&gt;
     				input_param=420&lt;br /&gt;
     				temp_state=&amp;quot;Input: TV&amp;quot;&lt;br /&gt;
     			when &#039;E&#039;&lt;br /&gt;
     				log(&#039;Main Zone Input Changed to #160: TAPE&#039;)&lt;br /&gt;
     				input_param=160&lt;br /&gt;
     				temp_state=&amp;quot;Input: TV&amp;quot;&lt;br /&gt;
     			when &#039;F&#039;&lt;br /&gt;
     				log(&#039;Main Zone Input Changed to #166: TUNER&#039;)&lt;br /&gt;
     				input_param=166&lt;br /&gt;
     				temp_state=&amp;quot;Input: TV&amp;quot;&lt;br /&gt;
     			when &#039;G&#039;&lt;br /&gt;
     				log(&#039;Main Zone Input Changed to #170: FM&#039;)&lt;br /&gt;
     				input_param=160&lt;br /&gt;
     				temp_state=&amp;quot;Input: TV&amp;quot;&lt;br /&gt;
     			when &#039;H&#039;&lt;br /&gt;
     				log(&#039;Main Zone Input Changed to #169: AM&#039;)&lt;br /&gt;
     				input_param=169&lt;br /&gt;
     				temp_state=&amp;quot;Input: TV&amp;quot;&lt;br /&gt;
     		end&lt;br /&gt;
#     		device_id = device_.mapPortChannel_Device_.[0.to_s]&lt;br /&gt;
		log(&amp;quot;======= Determiming device ID for Zone 0 : &amp;quot; + device_id.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
		device_.mapPortChannel_Device_.each do |key, value|&lt;br /&gt;
			log(key.to_s + &amp;quot; =&amp;gt; &amp;quot; + value.to_s+ &amp;quot;\n&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
     		cmd = Command.new(device_id, -1001, 1, 2, 49);&lt;br /&gt;
     		cmd.params_[41] = input_param.to_s();&lt;br /&gt;
     		SendCommand(cmd);&lt;br /&gt;
     		SetDeviceDataInDB( device_id, 200, temp_state ) # 200 = DEVICEDATA_State_CONST&lt;br /&gt;
&lt;br /&gt;
     	when &#039;VOL&#039;&lt;br /&gt;
     		volume = response[5..-1].to_i();&lt;br /&gt;
     		volume_norm = NormalizeVolume_MainZone(volume)&lt;br /&gt;
     		log(&amp;quot;Main Zone Volume Changed: &amp;quot; + volume.to_s + &amp;quot; Normalized Value: &amp;quot; + volume_norm.to_s + &amp;quot;\n&amp;quot;);&lt;br /&gt;
#     		device_id = device_.mapPortChannel_Device_.[0.to_s]&lt;br /&gt;
		log(&amp;quot;======= Determiming device ID for Zone 0 : &amp;quot; + device_id.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
		device_.mapPortChannel_Device_.each do |key, value|&lt;br /&gt;
			log(key.to_s + &amp;quot; =&amp;gt; &amp;quot; + value.to_s+ &amp;quot;\n&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
     		SetDeviceDataInDB( device_id, 158, volume_norm ) # 158 = DEVICEDATA_Volume_Level_CONST&lt;br /&gt;
     		cmd = Command.new(device_id, -1001, 1, 2, 71);&lt;br /&gt;
     		cmd.params_[30] = volume_norm&lt;br /&gt;
     		SendCommand(cmd);&lt;br /&gt;
     	when &#039;PWR&#039;&lt;br /&gt;
     		case avrvalue&lt;br /&gt;
     			when &#039;1&#039;&lt;br /&gt;
     				log(&amp;quot;Device Power Changed: OFF&amp;quot;);&lt;br /&gt;
     				cmd.params_[10] = &amp;quot;0&amp;quot;;&lt;br /&gt;
     				$DevicePower = 0&lt;br /&gt;
     			when &#039;2&#039;&lt;br /&gt;
     				log(&amp;quot;Device Power Changed: ON&amp;quot;);&lt;br /&gt;
     				cmd.params_[10] = &amp;quot;1&amp;quot;;&lt;br /&gt;
     				$DevicePower = 1&lt;br /&gt;
     		end&lt;br /&gt;
     		cmd = Command.new(device_.devid_, -1001, 1, 2, 48);&lt;br /&gt;
     		SendCommand(cmd);&lt;br /&gt;
     	else&lt;br /&gt;
     		log(&amp;quot;Yet not implemented: Handler for command: &amp;quot; + avrcommand.to_s)&lt;br /&gt;
     end&lt;br /&gt;
    &lt;br /&gt;
end     &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def DecodeReceivedInfo(response)&lt;br /&gt;
# Examples: Mute/On/Off: @AMT:1,@MSP:2,@MAM:2,   Volume: @VOL:-25,@MSV:-56,@MVL:-56  Inputs:@MSC:2E,@SRC:22,@SRC:2E&lt;br /&gt;
   log(&amp;quot;DecodeReceivedInfo1: &amp;quot; + response + &amp;quot;\n&amp;quot;);&lt;br /&gt;
   avrcommand = response[1..3]&lt;br /&gt;
   avrvalue = response[5]&lt;br /&gt;
   log(&amp;quot;DecodeReceivedInfo2: &amp;quot; + response + &amp;quot; -&amp;gt; Command:&amp;quot;+ avrcommand.to_s + &amp;quot; Value: &amp;quot; + avrvalue.to_s + &amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   case avrcommand&lt;br /&gt;
     	when &#039;VOL&#039;&lt;br /&gt;
     		volume = response[5..-1].to_i();&lt;br /&gt;
     		volume_norm = NormalizeVolume_MainZone(volume)&lt;br /&gt;
     		log(&amp;quot;Main Zone Volume Changed: &amp;quot; + volume.to_s + &amp;quot; Normalized Value: &amp;quot; + volume_norm.to_s + &amp;quot;\n&amp;quot;);&lt;br /&gt;
#     		device_id = device_.mapPortChannel_Device_.[0.to_s]&lt;br /&gt;
		log(&amp;quot;======= Determiming device ID for Zone 0 : &amp;quot; + device_id.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
		device_.mapPortChannel_Device_.each do |key, value|&lt;br /&gt;
			log(key.to_s + &amp;quot; =&amp;gt; &amp;quot; + value.to_s+ &amp;quot;\n&amp;quot;)&lt;br /&gt;
			if (key.to_s == &amp;quot;0&amp;quot;)&lt;br /&gt;
				device_id = value&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
     		SetDeviceDataInDB( device_id, 158, volume_norm ) # 158 = DEVICEDATA_Volume_Level_CONST&lt;br /&gt;
     		cmd = Command.new(device_id, -1001, 1, 2, 71);&lt;br /&gt;
     		cmd.params_[30] = volume_norm&lt;br /&gt;
     		SendCommand(cmd);&lt;br /&gt;
     	when &#039;PWR&#039;&lt;br /&gt;
     		case avrvalue&lt;br /&gt;
     			when &#039;1&#039;&lt;br /&gt;
     				log(&amp;quot;Device Power Changed: OFF&amp;quot;)&lt;br /&gt;
     				cmd.params_[10] = &amp;quot;0&amp;quot;;&lt;br /&gt;
     				$DevicePower = 0&lt;br /&gt;
     			when &#039;2&#039;&lt;br /&gt;
     				log(&amp;quot;Device Power Changed: ON&amp;quot;);&lt;br /&gt;
     				cmd.params_[10] = &amp;quot;1&amp;quot;;&lt;br /&gt;
     				$DevicePower = 1&lt;br /&gt;
     		end&lt;br /&gt;
     		cmd = Command.new(device_.devid_, -1001, 1, 2, 48);&lt;br /&gt;
     		SendCommand(cmd);&lt;br /&gt;
     	else&lt;br /&gt;
     		log(&amp;quot;Yet not implemented: Handler for command: &amp;quot; + avrcommand.to_s)&lt;br /&gt;
     end&lt;br /&gt;
    &lt;br /&gt;
end     &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def ReceiveReportCommand()&lt;br /&gt;
	@buff = conn_.RecvDelimited(&amp;quot;\r&amp;quot;, 1000) &lt;br /&gt;
	log(&amp;quot;Cmd response from Marantz: &amp;quot; + @buff + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	log(&amp;quot;Calling DecodeReceivedInfo: &amp;quot; + @buff + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	temp_resp=@buff;&lt;br /&gt;
	DecodeReceivedInfo(temp_resp)&lt;br /&gt;
	log(&amp;quot;End of DecodeReceivedInfo: &amp;quot; + temp_resp + &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def SendIrCommand(command)&lt;br /&gt;
        log(&amp;quot;SendIrCommand: &amp;quot; + command + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	conn_.Send(command+ &amp;quot;\r&amp;quot;)&lt;br /&gt;
        log(&amp;quot;Sending Command: &amp;quot; + command + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	ReceiveReportCommand()&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 = File.open(&amp;quot;/var/log/pluto/Marantz_SR5600.log&amp;quot;, &amp;quot;a&amp;quot;)&lt;br /&gt;
	  logTime = Time.now&lt;br /&gt;
	  timeStr = logTime.strftime(&amp;quot;%d-%m-%Y  %H:%M:%S  &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	  $log.puts timeStr + &amp;quot;(***):&amp;quot; + line.to_s&lt;br /&gt;
          $log.close&lt;br /&gt;
end 	&lt;br /&gt;
&lt;br /&gt;
def SendMultiZoneCommand(cmd, commandsArray, commandParam=&amp;quot;&amp;quot;)&lt;br /&gt;
        log(&amp;quot;Got Command with ID: &amp;quot; + cmd.id_.to_s + &amp;quot; from: &amp;quot; + cmd.devidfrom_.to_s + &amp;quot; to: &amp;quot; + cmd.devidto_.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	zone = GetZone(cmd.devidto_)&lt;br /&gt;
	if( zone &amp;gt;= 0 and zone &amp;lt; commandsArray.size )&lt;br /&gt;
	        zone_desc=device_.childdevices_[cmd.devidto_].devdata_[186]&lt;br /&gt;
		log(&amp;quot;Determine zone for command : &amp;quot; + zone_desc + &amp;quot;[&amp;quot; + zone.to_s + &amp;quot;]\n&amp;quot;)&lt;br /&gt;
		SendIrCommand(commandsArray[zone] + commandParam.to_s)&lt;br /&gt;
	else&lt;br /&gt;
		log(&amp;quot;SendMultiZoneCommand: invalid zone &amp;quot; + zone.to_s + &amp;quot;. Send commands only to valid child devices!!!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def SendMultiZonePowerOnCommand(cmd, commandsArray, commandParam=&amp;quot;&amp;quot;)&lt;br /&gt;
#It will Unmute Zone first and then see also global power should be turned on...&lt;br /&gt;
        log(&amp;quot;Got Power On Command with ID: &amp;quot; + cmd.id_.to_s + &amp;quot; from: &amp;quot; + cmd.devidfrom_.to_s + &amp;quot; to: &amp;quot; + cmd.devidto_.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	zone = GetZone(cmd.devidto_)&lt;br /&gt;
	if( zone &amp;gt;= 0 and zone &amp;lt; commandsArray.size )&lt;br /&gt;
	        zone_desc=device_.childdevices_[cmd.devidto_].devdata_[186]&lt;br /&gt;
		log(&amp;quot;Determine zone for command : &amp;quot; + zone_desc + &amp;quot;[&amp;quot; + zone.to_s + &amp;quot;]\n&amp;quot;)&lt;br /&gt;
		SendIrCommand(commandsArray[zone] + commandParam.to_s)&lt;br /&gt;
		$ZoneStatus[zone.to_s] = &#039;ON&#039;&lt;br /&gt;
		log(&amp;quot;*** Setting zone : &amp;quot; + zone_desc + &amp;quot;[&amp;quot; + zone.to_s + &amp;quot;] to ON\n&amp;quot;)&lt;br /&gt;
		ShowZones()&lt;br /&gt;
		if ($DevicePower == 0)&lt;br /&gt;
			SendIrCommand(&amp;quot;@PWR:2&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		$DevicePower = 1&lt;br /&gt;
	elsif (zone == -1)&lt;br /&gt;
		if ($DevicePower == 0)&lt;br /&gt;
			SendIrCommand(&amp;quot;@PWR:2&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		$DevicePower = 1&lt;br /&gt;
		log(&amp;quot;####### Powering device On\n&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		log(&amp;quot;SendMultiZonePowerOnCommand: invalid zone &amp;quot; + zone.to_s + &amp;quot;. Send commands only to valid child devices!!!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def SendMultiZonePowerOffCommand(cmd, commandsArray, commandParam=&amp;quot;&amp;quot;)&lt;br /&gt;
#It will Mute Zone first and then see if also global power can be turned off...&lt;br /&gt;
        log(&amp;quot;Got Power Off Command with ID: &amp;quot; + cmd.id_.to_s + &amp;quot; from: &amp;quot; + cmd.devidfrom_.to_s + &amp;quot; to: &amp;quot; + cmd.devidto_.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	zone = GetZone(cmd.devidto_)&lt;br /&gt;
	if( zone &amp;gt;= 0 and zone &amp;lt; commandsArray.size )&lt;br /&gt;
	        zone_desc=device_.childdevices_[cmd.devidto_].devdata_[186]&lt;br /&gt;
		log(&amp;quot;Determine zone for command : &amp;quot; + zone_desc + &amp;quot;[&amp;quot; + zone.to_s + &amp;quot;]\n&amp;quot;)&lt;br /&gt;
		SendIrCommand(commandsArray[zone] + commandParam.to_s)&lt;br /&gt;
		$ZoneStatus[zone.to_s] = &#039;OFF&#039;&lt;br /&gt;
		log(&amp;quot;*** Setting zone : &amp;quot; + zone_desc + &amp;quot;[&amp;quot; + zone.to_s + &amp;quot;] to OFF\n&amp;quot;)&lt;br /&gt;
		ShowZones()&lt;br /&gt;
		if (($ZoneStatus[&amp;quot;0&amp;quot;] == &#039;OFF&#039;) and ($ZoneStatus[&amp;quot;1&amp;quot;] == &#039;OFF&#039;) and ($ZoneStatus[&amp;quot;2&amp;quot;] == &#039;OFF&#039;))&lt;br /&gt;
			SendIrCommand(&amp;quot;@PWR:1&amp;quot;)&lt;br /&gt;
			$DevicePower = 0&lt;br /&gt;
			log(&amp;quot;####### All zones are muted - device is powered Off\n&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		log(&amp;quot;SendMultiZonePowerOffCommand: invalid zone &amp;quot; + zone.to_s + &amp;quot;. Send commands only to valid child devices!!!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def GetZone(deviceDestination)&lt;br /&gt;
	if( device_.mapDevice_PortChannel_.has_key?(deviceDestination) and&lt;br /&gt;
		device_.mapDevice_PortChannel_[deviceDestination] != nil and&lt;br /&gt;
		!device_.mapDevice_PortChannel_[deviceDestination].empty? )&lt;br /&gt;
		return device_.mapDevice_PortChannel_[deviceDestination].to_i&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return -1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def ShowZonesDebug()&lt;br /&gt;
	log(&amp;quot;####### Dev 2 PortChanel\n&amp;quot;)&lt;br /&gt;
	device_.mapDevice_PortChannel_.each do |key, value|&lt;br /&gt;
		log(key.to_s + &amp;quot; =&amp;gt; &amp;quot; + value.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	log(&amp;quot;======= PortChanel 2 Dev\n&amp;quot;)&lt;br /&gt;
	device_.mapPortChannel_Device_.each do |key, value|&lt;br /&gt;
		log(key.to_s + &amp;quot; =&amp;gt; &amp;quot; + value.to_s+ &amp;quot;\n&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def ShowZonesInitialVolumes()&lt;br /&gt;
	log(&amp;quot;####### Show Initial Volume Levels for zones\n&amp;quot;)&lt;br /&gt;
	device_.mapDevice_PortChannel_.each do |key, value|&lt;br /&gt;
	        volume = device_.childdevices_[key].devdata_[208]&lt;br /&gt;
		log(&amp;quot;Zone &amp;quot; + value.to_s + &amp;quot; =&amp;gt; &amp;quot; + volume.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
		SetVolumeInZone(volume,value)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def ShowZones()&lt;br /&gt;
	temp = &amp;quot;####### Zones Status : &amp;quot;&lt;br /&gt;
	device_.mapDevice_PortChannel_.each do |key, value|&lt;br /&gt;
		temp = temp + &amp;quot; | Zone &amp;quot; + value.to_s + &amp;quot; =&amp;gt; &amp;quot; + $ZoneStatus[value] &lt;br /&gt;
	end&lt;br /&gt;
	temp = temp + &amp;quot;\n&amp;quot;&lt;br /&gt;
	log(temp)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def SetZones(state)&lt;br /&gt;
	log(&amp;quot;####### Setting all zones to &amp;quot; + state + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	device_.mapDevice_PortChannel_.each do |key, value|&lt;br /&gt;
		$ZoneStatus[value] = state&lt;br /&gt;
		log(&amp;quot;Zone &amp;quot; + value.to_s + &amp;quot; =&amp;gt; &amp;quot; + state + &amp;quot;\n&amp;quot;)&lt;br /&gt;
 	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def InitZones()&lt;br /&gt;
	log(&amp;quot;####### Initializing all zones to OFF\n&amp;quot;)&lt;br /&gt;
	device_.mapDevice_PortChannel_.each do |key, value|&lt;br /&gt;
		$ZoneStatus[value] = &#039;OFF&#039;&lt;br /&gt;
		log(&amp;quot;Zone &amp;quot; + value.to_s + &amp;quot; =&amp;gt; &amp;quot; + $ZoneStatus[value] + &amp;quot;\n&amp;quot;)&lt;br /&gt;
 	end&lt;br /&gt;
	log(&amp;quot;####### Print $ZoneStatus Hash:\n&amp;quot;)&lt;br /&gt;
 	$ZoneStatus.each do |key, value|&lt;br /&gt;
		log(&amp;quot;Zone &amp;quot; + key.to_s + &amp;quot; =&amp;gt; &amp;quot; + value.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def SetVolumeInZone(level,zone)&lt;br /&gt;
# Sets Normalized Volume Level (0..100) in certain zone &lt;br /&gt;
	log(&amp;quot;SetVolumeInZone: volume: &amp;quot; + level.to_s + &amp;quot; =&amp;gt; Zone: &amp;quot; + zone + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	if ( zone == &amp;quot;0&amp;quot;)&lt;br /&gt;
		log(&amp;quot;SetVolumeInZone0: volume: &amp;quot; + level.to_s + &amp;quot; =&amp;gt; Zone: &amp;quot; + zone + &amp;quot;\n&amp;quot;)&lt;br /&gt;
      		new_level = DeNormalizeVolume_MainZone(level.to_i)&lt;br /&gt;
		log(&amp;quot;SetVolumeInZone00: volume: &amp;quot; + level.to_s + &amp;quot; =&amp;gt; Zone: &amp;quot; + zone + &amp;quot;\n&amp;quot;)&lt;br /&gt;
      		temp_str=&amp;quot;@VOL:0&amp;quot;+new_level.to_s;&lt;br /&gt;
      		log(&amp;quot;SetVolumeInZone: About to send command :&amp;quot; + temp_str + &amp;quot;\n&amp;quot;)&lt;br /&gt;
      		SendIrCommand(temp_str)&lt;br /&gt;
	elsif ( zone == &amp;quot;1&amp;quot;)&lt;br /&gt;
		log(&amp;quot;SetVolumeInZone1: volume: &amp;quot; + level.to_s + &amp;quot; =&amp;gt; Zone: &amp;quot; + zone + &amp;quot;\n&amp;quot;)&lt;br /&gt;
      		new_level = DeNormalizeVolume_OtherZone(level.to_i)&lt;br /&gt;
		log(&amp;quot;SetVolumeInZone11: volume: &amp;quot; + level.to_s + &amp;quot; =&amp;gt; Zone: &amp;quot; + zone + &amp;quot;\n&amp;quot;)&lt;br /&gt;
      		temp_str=&amp;quot;@MSV:0&amp;quot;+new_level.to_s;&lt;br /&gt;
      		log(&amp;quot;SetVolumeInZone: About to send command :&amp;quot; + temp_str + &amp;quot;\n&amp;quot;)&lt;br /&gt;
      		SendIrCommand(temp_str)&lt;br /&gt;
	elsif ( zone == &amp;quot;2&amp;quot;)&lt;br /&gt;
		log(&amp;quot;SetVolumeInZone2: volume: &amp;quot; + level.to_s + &amp;quot; =&amp;gt; Zone: &amp;quot; + zone + &amp;quot;\n&amp;quot;)&lt;br /&gt;
      		new_level = DeNormalizeVolume_OtherZone(level.to_i)&lt;br /&gt;
#		log(&amp;quot;SetVolumeInZone22: volume: &amp;quot; + level + &amp;quot; =&amp;gt; Zone: &amp;quot; + zone + &amp;quot;\n&amp;quot;)&lt;br /&gt;
      		temp_str=&amp;quot;@MVL:0&amp;quot;+new_level.to_s;&lt;br /&gt;
      		log(&amp;quot;SetVolumeInZone: About to send command :&amp;quot; + temp_str + &amp;quot;\n&amp;quot;)&lt;br /&gt;
      		SendIrCommand(temp_str)&lt;br /&gt;
	else&lt;br /&gt;
      		log(&amp;quot;SetVolumeInZone: invalid zone &amp;quot; + zone.to_s + &amp;quot;. Send commands only to valid child devices!!!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	log(&amp;quot;SetVolumeInZone End: volume: &amp;quot; + level.to_s + &amp;quot; =&amp;gt; Zone: &amp;quot; + zone + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def NormalizeVolume_MainZone(level)&lt;br /&gt;
# Normalizes Marantz Volume Level (-99..+10) to 0-100 boundaries for Main Zone &lt;br /&gt;
	temp = (level+100)/110.0*100.0&lt;br /&gt;
	temp=temp.round&lt;br /&gt;
        log(&amp;quot;Normalizing Main Zone Volume Level from : &amp;quot; + level.to_s + &amp;quot; to &amp;quot; + temp.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	return temp&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def NormalizeVolume_OtherZone(level)&lt;br /&gt;
# Normalizes Marantz Volume Level to 0-100 boundaries for Second Zone (-90..0)&lt;br /&gt;
	temp = ((level+90.0)/90.0)*100.0 &lt;br /&gt;
	temp=temp.round&lt;br /&gt;
        log(&amp;quot;Normalizing Other Zone Volume Level from : &amp;quot; + level.to_s + &amp;quot; to &amp;quot; + temp.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	return temp&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def DeNormalizeVolume_MainZone(level)&lt;br /&gt;
# DeNormalizes volume level in 0-100 boundaries to Marantz Volume Level (-99..+10) for Main Zone &lt;br /&gt;
	temp = (level/100.0)*110.0-99&lt;br /&gt;
	temp=temp.round&lt;br /&gt;
        log(&amp;quot;DeNormalizing Main Zone Volume Level from : &amp;quot; + level.to_s + &amp;quot; to &amp;quot; + temp.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	return temp&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def DeNormalizeVolume_OtherZone(level)&lt;br /&gt;
# DeNormalizes volume level in 0-100 boundaries to Marantz Volume Level (-90..0) for Other Zone &lt;br /&gt;
	temp = ((level/100.0)*90.0)-90.0&lt;br /&gt;
	temp=temp.round&lt;br /&gt;
        log(&amp;quot;DeNormalizing Other Zone Volume Level from : &amp;quot; + level.to_s + &amp;quot; to &amp;quot; + temp.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	return temp&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
###########################################################Process Incoming Data&lt;br /&gt;
@buff = conn_.RecvDelimited(&amp;quot;\r&amp;quot;, 1000)&lt;br /&gt;
log(&amp;quot;Info from Marantz: &amp;quot; + @buff + &amp;quot;\n&amp;quot;)&lt;br /&gt;
temp_line=@buff&lt;br /&gt;
log(&amp;quot;1Calling DecodeReceivedInfo: &amp;quot; + temp_line + &amp;quot;\n&amp;quot;)&lt;br /&gt;
DecodeReceivedInfo(temp_line)&lt;br /&gt;
log(&amp;quot;1End of DecodeReceivedInfo: &amp;quot; + temp_line+ &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################384 Process Receive Command For Child &lt;br /&gt;
log(&amp;quot;Received command for child with ID: &amp;quot; + cmd.id_.to_s + &amp;quot; from: &amp;quot; + cmd.devidfrom_.to_s + &amp;quot; to: &amp;quot; + cmd.devidto_.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
case cmd.id_&lt;br /&gt;
    when 169           &lt;br /&gt;
#       cmd_169(cmd);&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:H&amp;quot;, &amp;quot;@MSC:H&amp;quot;, &amp;quot;@MSC:H&amp;quot;])&lt;br /&gt;
    when 164           &lt;br /&gt;
#       cmd_164(cmd);&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:9&amp;quot;, &amp;quot;@MSC:9&amp;quot;, &amp;quot;@MSC:9&amp;quot;])&lt;br /&gt;
    when 172           &lt;br /&gt;
#       cmd_172(cmd);&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:A&amp;quot;, &amp;quot;@MSC:A&amp;quot;, &amp;quot;@MSC:A&amp;quot;])&lt;br /&gt;
    when 162           &lt;br /&gt;
#       cmd_162(cmd);&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:C&amp;quot;, &amp;quot;@MSC:C&amp;quot;, &amp;quot;@MSC:C&amp;quot;])&lt;br /&gt;
    when 420           &lt;br /&gt;
#       cmd_420(cmd);&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:D&amp;quot;, &amp;quot;@MSC:D&amp;quot;, &amp;quot;@MSC:D&amp;quot;])&lt;br /&gt;
    when 178           &lt;br /&gt;
#       cmd_178(cmd);&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:4&amp;quot;, &amp;quot;@MSC:4&amp;quot;, &amp;quot;@MSC:4&amp;quot;])&lt;br /&gt;
    when 165           &lt;br /&gt;
#       cmd_165(cmd);&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:2&amp;quot;, &amp;quot;@MSC:2&amp;quot;, &amp;quot;@MSC:2&amp;quot;])&lt;br /&gt;
    when 170           &lt;br /&gt;
#       cmd_170(cmd);&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:G&amp;quot;, &amp;quot;@MSC:G&amp;quot;, &amp;quot;@MSC:G&amp;quot;])&lt;br /&gt;
    when 160           &lt;br /&gt;
#       cmd_160(cmd);&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:E&amp;quot;, &amp;quot;@MSC:E&amp;quot;, &amp;quot;@MSC:E&amp;quot;])&lt;br /&gt;
    when 166           &lt;br /&gt;
#       cmd_166(cmd);&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:F&amp;quot;, &amp;quot;@MSC:F&amp;quot;, &amp;quot;@MSC:F&amp;quot;])&lt;br /&gt;
    when 161           &lt;br /&gt;
#       cmd_161(cmd);&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:1&amp;quot;, &amp;quot;@MSC:1&amp;quot;, &amp;quot;@MSC:1&amp;quot;])&lt;br /&gt;
    when 891           &lt;br /&gt;
#       cmd_891(cmd);&lt;br /&gt;
        SendIrCommand(&amp;quot;@SUR:0H&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    when 587           &lt;br /&gt;
#       cmd_587(cmd);&lt;br /&gt;
	identifier = cmd.params_[216]&lt;br /&gt;
 	# Main Frequency		&amp;quot;TFQ:0xxxxx&amp;quot;  from 08700 till + 10800&lt;br /&gt;
	# Multiroom Frequency		â€śMTF:0xxxxxâ€ś  from 08700 till + 10800&lt;br /&gt;
	# switch to tuner mode first&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:G&amp;quot;, &amp;quot;@MSC:G&amp;quot;, &amp;quot;@MSC:G&amp;quot;])&lt;br /&gt;
	# tune to desired frequency&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@TFQ:0&amp;quot;+identifier, &amp;quot;@MTF:0&amp;quot;+identifier, &amp;quot;@MTF:0&amp;quot;+identifier])&lt;br /&gt;
	log(&amp;quot;Sending Marantz : Setting tuner frequency to &amp;quot;+identifier+&amp;quot;\n&amp;quot;)&lt;br /&gt;
    when 97            &lt;br /&gt;
#       cmd_97(cmd);&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@AMT:0&amp;quot;, &amp;quot;@MSM:0&amp;quot;, &amp;quot;@MAM:0&amp;quot;])&lt;br /&gt;
    when 313           &lt;br /&gt;
#       cmd_313(cmd);&lt;br /&gt;
	level = cmd.params_[76]&lt;br /&gt;
	# Main volume 			“VOL:0xxx”  from - 99 till + 18&lt;br /&gt;
	# Multiroom Speakers		&amp;quot;MSV:0xxx&amp;quot;  from - 99 till + 0&lt;br /&gt;
	# Multiroom Speakers		“MVL:0xxx”  from - 99 till + 0&lt;br /&gt;
	zone = GetZone(cmd.devidto_)&lt;br /&gt;
	log(&amp;quot;313:Set Volume Command: Got Cmd with ID: &amp;quot; + cmd.id_.to_s + &amp;quot; from: &amp;quot; + cmd.devidfrom_.to_s + &amp;quot; to: &amp;quot; + cmd.devidto_.to_s + &amp;quot; | Zone : &amp;quot; + zone.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	if ( zone == 0)&lt;br /&gt;
      		new_level = DeNormalizeVolume_MainZone(level.to_i)&lt;br /&gt;
      		temp_str = &amp;quot;@VOL:0&amp;quot;+new_level.to_s&lt;br /&gt;
      		log(&amp;quot;SetVolumeCommand: About to send command :&amp;quot; + temp_str + &amp;quot;\n&amp;quot;)&lt;br /&gt;
      		SendIrCommand(temp_str)&lt;br /&gt;
	elsif ( zone == 1)&lt;br /&gt;
      		new_level = DeNormalizeVolume_OtherZone(level.to_i)&lt;br /&gt;
      		temp_str = &amp;quot;@MSV:0&amp;quot;+new_level.to_s&lt;br /&gt;
      		SendIrCommand(temp_str)&lt;br /&gt;
	elsif ( zone == 2)&lt;br /&gt;
      		new_level = DeNormalizeVolume_OtherZone(level.to_i)&lt;br /&gt;
      		temp_str = &amp;quot;@MVL:0&amp;quot;+new_level.to_s&lt;br /&gt;
      		log(&amp;quot;SetVolumeCommand: About to send command :&amp;quot; + temp_str + &amp;quot;\n&amp;quot;)&lt;br /&gt;
      		SendIrCommand(temp_str)&lt;br /&gt;
&lt;br /&gt;
	else&lt;br /&gt;
      		log(&amp;quot;SetVolumeCommand: invalid zone &amp;quot; + zone.to_s + &amp;quot;:&amp;quot; + zone.to_i + &amp;quot;. Send commands only to valid child devices!!!\n&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    when 90           &lt;br /&gt;
#       cmd_90(cmd);&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@VOL:2&amp;quot;, &amp;quot;@MSV:2&amp;quot;, &amp;quot;@MVL:2&amp;quot;])&lt;br /&gt;
    when 89           &lt;br /&gt;
#       cmd_89(cmd);&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@VOL:1&amp;quot;, &amp;quot;@MSV:1&amp;quot;, &amp;quot;@MVL:1&amp;quot;])&lt;br /&gt;
    when 192           &lt;br /&gt;
#       cmd_192(cmd);&lt;br /&gt;
	#SendMultiZoneCommand(cmd, [&amp;quot;@PWR:2&amp;quot;, &amp;quot;@MSP:2&amp;quot;, &amp;quot;@MAM:1&amp;quot;])&lt;br /&gt;
  	SendMultiZonePowerOnCommand(cmd, [&amp;quot;@AMT:1&amp;quot;, &amp;quot;@MSP:2&amp;quot;, &amp;quot;@MAM:1&amp;quot;])&lt;br /&gt;
    when 193           &lt;br /&gt;
#       cmd_193(cmd);&lt;br /&gt;
	#SendMultiZoneCommand(cmd, [&amp;quot;@PWR:1&amp;quot;, &amp;quot;@MSP:1&amp;quot;, &amp;quot;@MAM:2&amp;quot;])    &lt;br /&gt;
  	SendMultiZonePowerOffCommand(cmd, [&amp;quot;@AMT:2&amp;quot;, &amp;quot;@MSP:1&amp;quot;, &amp;quot;@MAM:2&amp;quot;])    &lt;br /&gt;
    when 282  &lt;br /&gt;
#       cmd_282(cmd);&lt;br /&gt;
	SendMultiZoneCommand(cmd, [&amp;quot;@SRC:3&amp;quot;, &amp;quot;@MSC:3&amp;quot;, &amp;quot;@MSC:3&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
        log(&amp;quot;Unmatched command for child received with ID: &amp;quot; + cmd.id_.to_s + &amp;quot; from: &amp;quot; + cmd.devidfrom_.to_s + &amp;quot; to: &amp;quot; + cmd.devidto_.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
###########################################################Set Tuner Frequency&lt;br /&gt;
identifier = cmd.params_[216]&lt;br /&gt;
# Main Frequency		&amp;quot;TFQ:0xxxxx&amp;quot;  from 08700 till + 10800&lt;br /&gt;
# Multiroom Frequency		“MTF:0xxxxx“  from 08700 till + 10800&lt;br /&gt;
&lt;br /&gt;
# switch to tuner mode first&lt;br /&gt;
SendMultiZoneCommand(cmd, [&amp;quot;@SRC:G&amp;quot;, &amp;quot;@MSC:G&amp;quot;, &amp;quot;@MSC:G&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
# tune to desired frequency&lt;br /&gt;
SendMultiZoneCommand(cmd, [&amp;quot;@TFQ:0&amp;quot;+identifier, &amp;quot;@MTF:0&amp;quot;+identifier, &amp;quot;@MTF:0&amp;quot;+identifier])&lt;br /&gt;
log(&amp;quot;Sending Marantz : Setting tuner frequency to &amp;quot;+identifier+&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
###########################################################313 Set Volume command&lt;br /&gt;
level = cmd.params_[76]&lt;br /&gt;
# Main volume 			“VOL:0xxx”  from - 99 till + 18&lt;br /&gt;
# Multiroom Speakers		&amp;quot;MSV:0xxx&amp;quot;  from - 99 till + 0&lt;br /&gt;
# Multiroom Speakers		“MVL:0xxx”  from - 99 till + 0&lt;br /&gt;
zone = GetZone(cmd.devidto_)&lt;br /&gt;
log(&amp;quot;313:Set Volume Command: Got Cmd with ID: &amp;quot; + cmd.id_.to_s + &amp;quot; from: &amp;quot; + cmd.devidfrom_.to_s + &amp;quot; to: &amp;quot; + cmd.devidto_.to_s + &amp;quot; | Zone : &amp;quot; + zone.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
if ( zone == 0)&lt;br /&gt;
      new_level = DeNormalizeVolume_MainZone(level.to_i)&lt;br /&gt;
      temp_str = &amp;quot;@VOL:0&amp;quot;+new_level.to_s&lt;br /&gt;
      log(&amp;quot;SetVolumeCommand: About to send command :&amp;quot; + temp_str + &amp;quot;\n&amp;quot;)&lt;br /&gt;
      SendIrCommand(temp_str)&lt;br /&gt;
elsif ( zone == 1)&lt;br /&gt;
      new_level = DeNormalizeVolume_OtherZone(level.to_i)&lt;br /&gt;
      temp_str = &amp;quot;@MSV:0&amp;quot;+new_level.to_s&lt;br /&gt;
      SendIrCommand(temp_str)&lt;br /&gt;
elsif ( zone == 2)&lt;br /&gt;
      new_level = DeNormalizeVolume_OtherZone(level.to_i)&lt;br /&gt;
      temp_str = &amp;quot;@MVL:0&amp;quot;+new_level.to_s&lt;br /&gt;
      log(&amp;quot;SetVolumeCommand: About to send command :&amp;quot; + temp_str + &amp;quot;\n&amp;quot;)&lt;br /&gt;
      SendIrCommand(temp_str)&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
      log(&amp;quot;SetVolumeCommand: invalid zone &amp;quot; + zone.to_s + &amp;quot;:&amp;quot; + zone.to_i + &amp;quot;. Send commands only to valid child devices!!!\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
###########################################################Process Initialize&lt;br /&gt;
$DevicePower = 1&lt;br /&gt;
SendIrCommand(&amp;quot;@PWR:2&amp;quot;)&lt;br /&gt;
log(&amp;quot;Initializing Marantz GSD Device\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;@AST:F&amp;quot;) # max level of feedback&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;@MPW:2&amp;quot;) # multi room always on&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;@MSP:1&amp;quot;) # turn multi room speakers off by default&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;@MAM:2&amp;quot;) # mute multi room line out by default&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;@VOL:0-20&amp;quot;) # default main volume -20&lt;br /&gt;
SendIrCommand(&amp;quot;@MSV:0-60&amp;quot;) # default multi speaker volume&lt;br /&gt;
SendIrCommand(&amp;quot;@MVL:0-60&amp;quot;) # default multi room line out volume&lt;br /&gt;
&lt;br /&gt;
$ZoneStatus = Hash.new()&lt;br /&gt;
&lt;br /&gt;
InitZones()&lt;br /&gt;
ShowZonesInitialVolumes()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#$DevicePower = 0&lt;br /&gt;
#SendIrCommand(&amp;quot;@PWR:1&amp;quot;)&lt;br /&gt;
log(&amp;quot;Initialization of Marantz GSD Device finished - Device is powered off!!!!\n&amp;quot;)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &#039;TV - LiveTV&#039; device with template #1751 as child device&#039;==== &lt;br /&gt;
&lt;br /&gt;
TV- LiveTV device is automatically added as child to parent device, because I have selected it for connection to FM input. Therefore nothing more is needed to do, except support for commands that can be sent from LiveTV Orbiter screen.&lt;br /&gt;
&lt;br /&gt;
=== Important device data and parameters for &amp;quot;Zone&amp;quot; template (#1867)===&lt;br /&gt;
&lt;br /&gt;
I&#039;ve extended that template to be useful for multizone audio devices. Basically such device should include everything that is needed to control Audio Zone (input switching, A/B switching, volume control, On/Off Commands). But bevare, those devices are embedded - that means that they don&#039;t do anything - they are just empty boxes you add to parent device for representing each audio zone. All processing of commands should be done in parent device. But using Zones, you can easily connect devices via pipes, create scenarios with sending commands to certain devices/zones etc...&lt;br /&gt;
&lt;br /&gt;
Important extensions to Zone template:&lt;br /&gt;
 - added common audio inputs (so input switching can be implemented)&lt;br /&gt;
 - added commands (volume, inputs, on/off, A/B switching)&lt;br /&gt;
 - added &amp;quot;controlled by&amp;quot; category of Amps,...&lt;br /&gt;
&lt;br /&gt;
Have added following command groups are used in Zone :&lt;br /&gt;
 A/B switching           (select A, select B)  	&lt;br /&gt;
 Generic IO Commands 	(On, Off)&lt;br /&gt;
 Inputs 	                (common inputs on audio receiver)&lt;br /&gt;
 Radio 	                (command for tuning to certain radio frequency)&lt;br /&gt;
&lt;br /&gt;
Zones are automatically added to parent device by having this on parent template :&lt;br /&gt;
&lt;br /&gt;
 Device Template Related&lt;br /&gt;
 #1867 	Zone 	My Child 	Extra 	12|2|186|Line Out 	&lt;br /&gt;
 #1867 	Zone 	My Child 	Extra 	12|1|186|Zone MultiRoom 	&lt;br /&gt;
 #1867 	Zone 	My Child 	Extra 	12|0|186|Zone Main 	&lt;br /&gt;
&lt;br /&gt;
3 child zone devices are automatically added to parent device.&lt;br /&gt;
&lt;br /&gt;
12|2 means that device data #12 (Port) will have value of 2 and that Line Out is description (data #186) of that zone 2.&lt;br /&gt;
&lt;br /&gt;
== Using device ==&lt;br /&gt;
&lt;br /&gt;
=== Add device based on created template ===&lt;br /&gt;
=== Specify COM port for it ===&lt;br /&gt;
=== Assign it to new room ===&lt;br /&gt;
&lt;br /&gt;
Assign also child zones to rooms or EAs.&lt;br /&gt;
&lt;br /&gt;
=== Specifiy Audio pipe connections to inputs on zones ===&lt;br /&gt;
In my case, I connnected output of Hybrid Core and one MD to different inputs (CD and DVD) and different zones. In that way, when you press play on each source, commands to setup inputs on SR5600 should be done automatically so you can hear music right away....&lt;br /&gt;
&lt;br /&gt;
Now reload Router, regenerate Orbiters and new device should appear in specified room. On click you get into control screen where you can control device &#039;manually&#039; beside automatic handling described above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Prepare Media scenarios ===&lt;br /&gt;
&lt;br /&gt;
Beside from commands that are sent from Orbiters, you can also create various media scenarios, with On/Off, Volume, A/B, Input switching (you can for example put both (all three) output zones to same source - no sync problems !!!...&lt;br /&gt;
&lt;br /&gt;
== Where the problems arise ==&lt;br /&gt;
&lt;br /&gt;
I&#039;m describing few potential problems I&#039;m facing in my setup. Will be happy on any opinion or guidance...&lt;br /&gt;
&lt;br /&gt;
=== Proper support for connecting On screen media player (MD or Hybrid) to Amplifier ===&lt;br /&gt;
&lt;br /&gt;
Currently it seems that media players cannot be connected to amplifier in a clean way. The problem is in routing of volume and on/off commands through audio pipe. In short, the problem is that currently you have to connect hybrid or MD to audio pipe, but when media ends in that EA, Off is sent to Xine player, but On command to Orbiter and this On command also gets propagated on pipe - so Amplifier turns on, instead of Off. Also when screen saver jumps in, there is also possibility that Off command will get to the amplifier, which is not correct if you&#039;re listening to media... There are at least few threads on forums and Mantis, if you want to read more... &lt;br /&gt;
&lt;br /&gt;
=== Some older discussions ===&lt;br /&gt;
&lt;br /&gt;
Below I&#039;m leaving some older discussions about potential problems. Not sure if they still hold...&lt;br /&gt;
&lt;br /&gt;
=== Proper support for MultiRoom feature ===&lt;br /&gt;
Device supports separate stereo device on two back channels. That means that with enabling multiroom feature, basically you get two devices (one 4+1 and other 2 channels) that can have separate or same sources and different volume levels. I&#039;m not sure how to properly setup support for such feature - will try to add another child tuner and set it up to control only second separate channel. But it seems that I cannot get two screens for two tuners/zones in one zone, but as child devices they need to be in same zone (as I was advised from LinuxMCE guys or am I missing something). &lt;br /&gt;
&lt;br /&gt;
=== Cannot add device to Entertainment areas in same room ===&lt;br /&gt;
I have SR5600 assigned to room. Assigning it to separate entertainment area in one of the rooms didn&#039;t work (menus didn&#039;t appear on Orbiters). Also I should put two child devices (tuners) into separate audio entities, but that would probably not work at this time... &lt;br /&gt;
&lt;br /&gt;
I&#039;m not sure what is the real problem and what is proper solution. I&#039;ll kindly ask LinuxMCE guys to guide me here....&lt;br /&gt;
&lt;br /&gt;
=== Pipes can be connected only to one device === &lt;br /&gt;
It seems logical, but in case of such devices it&#039;s also restriction. I have Hybrid and MD output connected to one input on receiver (although have virtually two devices and would like to have an option to be able to connect two audio pipes from one source). There is also Y connection splitting line audio signal from MD to TV and receiver. Also pipes feature of automatic handling of routing (if you for instance press play on MD, then receiver will be automatically switched to proper input, so you can hear music) can sometimes become restriction. For instance if I use two separate inputs, then hybrid is assigned to one of them and volume control will change main volume and play/stop will reroute always to hard-coded route, regardless of current state, where it might be better rerouted to second device output, cause first one is occupied with Movie....&lt;br /&gt;
&lt;br /&gt;
=== Pipes and automatic routing is not always a good thing === &lt;br /&gt;
For instance, user is listening to audio, then he decides to switch manually receiver to FM station. MD or hybrid keeps playing its music and shuts receiver off when it finishes... If we want to properly deal with this situation, we should have two way communication and a lot of code to sense user actions and set everything according to that - but that&#039;s a lot more of work to do....&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is schema for my setup and I&#039;d kindly ask for further guidance. There are quite few potential problems with more sophisticated setups, but I feel that this will be common practical situation in deploying LinuxMCE system...&lt;br /&gt;
&lt;br /&gt;
[[Image:Shema audio.png]]&lt;br /&gt;
&lt;br /&gt;
== Discussion on how to properly implement template for such device ? ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Currently, I&#039;ve implemented such template using child Zone devices and it seems like a step in proper direction. But we will see. I&#039;m also presenting discussion below that describes where the problem lies...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After a year or so, it is not clear to me how to properly implement template for such device that includes all sorts of &amp;quot;embedded devices&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Let me start with basic description of capabilities :&lt;br /&gt;
&lt;br /&gt;
1. Outputs&lt;br /&gt;
&lt;br /&gt;
A. device as single audio output &lt;br /&gt;
  A.1 7+1 channel amplified output&lt;br /&gt;
  A.2 Line out that has same music as A.1, but can be swithced on/off and volume controlled separately with serial commands&lt;br /&gt;
&lt;br /&gt;
B. device as multiroom audio output (two separate and controlable outputs) - this is how I use it at the moment to feed 2 audio zones)&lt;br /&gt;
  A.1 5+1 channel amplified output&lt;br /&gt;
  A.1 2 channel amplified output on last two speakers terminals with own commands for volume,source and other control...&lt;br /&gt;
  A.3 Line out that has same music as A.1, but can be swithced on/off and volume controlled separately with serial commands &lt;br /&gt;
&lt;br /&gt;
So basically to cover both cases I have 3 possible outputs :&lt;br /&gt;
  O.1 normal main audio output (either 7+1 if A and 5+1 if B)&lt;br /&gt;
  O.2 secondary stereo amplified output (last two outputs from A.1 are made as separate amplified stereo output with its own serial commands, volume and source control..)&lt;br /&gt;
  O.3 Line out that has same music as O.1, but can be switched on/off and volume controlled separately with own serial commands, so could be used for externally amplified replication of main output...&lt;br /&gt;
&lt;br /&gt;
Basic distinction is that all 3 possible outputs have separate serial commands for volume and source control(not O3) etc... &lt;br /&gt;
&lt;br /&gt;
2. Inputs&lt;br /&gt;
&lt;br /&gt;
Outputs O.1 and O.2 can select one of possible sources independently - (I&#039;m not sure if they can select separate FM stations on Tuner input) - so basically this is true multi channel audio feature. If they select same source, then same music is heard on each... But again serial commands for selecting inputs differ for each output....&lt;br /&gt;
&lt;br /&gt;
LMCE has already prepared FM and AM Tuner devices templates (which I don&#039;t understand quite well, but no docs available), but I&#039;m not sure if they are usable in such situation.&lt;br /&gt;
&lt;br /&gt;
3. How to make usable template out of this ?&lt;br /&gt;
&lt;br /&gt;
What I&#039;m currently thinking is :&lt;br /&gt;
- Marantz receiver being parent device&lt;br /&gt;
- have child devices for each output (O.1-O.3), each from different template, cause they have separate commands for each&lt;br /&gt;
&lt;br /&gt;
But questions arise :&lt;br /&gt;
- each output could be placed into separate audio zone - but I&#039;m not sure if this can be done with children of same parent ?&lt;br /&gt;
- how to dispatch commands to each child ?&lt;br /&gt;
- is it convenient to use tuner devices as well ?&lt;br /&gt;
&lt;br /&gt;
And probably there are some more problems to be solved.&lt;br /&gt;
&lt;br /&gt;
Any opinion ?&lt;br /&gt;
&lt;br /&gt;
(to be expanded)&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=D-Link_DCS-5300G&amp;diff=36824</id>
		<title>D-Link DCS-5300G</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=D-Link_DCS-5300G&amp;diff=36824"/>
		<updated>2016-07-11T14:48:27Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
{{Versioninfo|810Status=Working|810UpdatedDate=28 February 2012|810UpdatedBy=gadgetlmce}}&lt;br /&gt;
[[Category: Cameras]]&lt;br /&gt;
[[Category: IP Cameras]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&lt;br /&gt;
[[Image:D-link-dcs-5300g.jpg|right]]&lt;br /&gt;
[[Image:DCS-70.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
= Status =&lt;br /&gt;
The D-Link DCS-5300G device template can be derived from the Panasonic IP Camera. A initial version can be found in the testing sqlCVS repository. It is fully plug and play and supports pan and tilt.&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* Browser based&lt;br /&gt;
* PAN Range +/- 135°, TILT Range +90°/ -45°&lt;br /&gt;
* 802.11g WLAN (2 antennas with RP-SMA connector)&lt;br /&gt;
* 10/100mbit LAN&lt;br /&gt;
* 2x I/O Port, 1x Sensor Input, 1x Relay Output&lt;br /&gt;
* 1x mic input, 1x A/V Connector&lt;br /&gt;
* 30fps max&lt;br /&gt;
* active motion detector&lt;br /&gt;
* MPEG4 compression&lt;br /&gt;
* UPnP, DynDNS&lt;br /&gt;
* Real-Time Live Video &amp;amp; Audio Streaming&lt;br /&gt;
* compatible with DCS-70 outdoor mount&lt;br /&gt;
&lt;br /&gt;
= Ruby Code =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RCODE:&lt;br /&gt;
   0:require &#039;Ruby_Generic_Serial_Device&#039;&lt;br /&gt;
   1:class Command &amp;lt; Ruby_Generic_Serial_Device::RubyCommandWrapper&lt;br /&gt;
   2:end&lt;br /&gt;
   3:class Device_95 &amp;lt; Ruby_Generic_Serial_Device::RubySerialIOWrapper&lt;br /&gt;
   4:#### 84 ####################################################################&lt;br /&gt;
   5:def cmd_84(data, format, disable_aspect_lock, streamid, width, height, cmd=nil)&lt;br /&gt;
   6:@returnParamArray.clear&lt;br /&gt;
   7:conn_.Reconnect()&lt;br /&gt;
   8:auth_s=device_.devdata_[114]+&amp;quot;:&amp;quot;+device_.devdata_[115]&lt;br /&gt;
   9:auth_a=Array.new;&lt;br /&gt;
  10:auth_s.each{|c| auth_a.push(c)}&lt;br /&gt;
  11:&lt;br /&gt;
  12:fix_path=device_.devdata_[2]&lt;br /&gt;
  13:fix_path=&#039;/&#039;+fix_path if fix_path[0]!=&#039;/&#039;[0]&lt;br /&gt;
  14:&lt;br /&gt;
  15:s = &amp;quot;GET &amp;quot;+fix_path+&amp;quot; HTTP/1.0\r\n&amp;quot;&lt;br /&gt;
  16:s+= &amp;quot;Accept: */*\r\n&amp;quot;&lt;br /&gt;
  17:s+= &amp;quot;Authorization: Basic &amp;quot;+auth_a.pack(&amp;quot;m&amp;quot;).chop+&amp;quot;\r\n&amp;quot;&lt;br /&gt;
  18:s+= &amp;quot;\r\n&amp;quot;&lt;br /&gt;
  19:&lt;br /&gt;
  20:conn_.Send(s)&lt;br /&gt;
  21:recv=&amp;quot;&amp;quot;&lt;br /&gt;
  22:loop do&lt;br /&gt;
  23:  buff=conn_.Recv(16384, 5000)&lt;br /&gt;
  24:  if buff.empty?&lt;br /&gt;
  25:    break&lt;br /&gt;
  26:  end&lt;br /&gt;
  27:  recv += buff&lt;br /&gt;
  28:end&lt;br /&gt;
  29:if recv=~ /^HTTP[^\r\n]+200\sOK.+?\r\n\r\n(.+)$/m&lt;br /&gt;
  30:  fileName=&amp;quot;/tmp/ip_camera_img&amp;quot;+device_.devid_.to_s&lt;br /&gt;
  31:  imageFile=File.new(fileName+&amp;quot;.jpg&amp;quot;,&#039;w&#039;)&lt;br /&gt;
  32:  imageFile.print $1&lt;br /&gt;
  33:  imageFile.close()&lt;br /&gt;
  34:  system(&amp;quot;/usr/bin/convert &amp;quot;+fileName+&amp;quot;.jpg &amp;quot;+fileName+&amp;quot;.png&amp;quot;);&lt;br /&gt;
  35:  size=File.stat(fileName+&amp;quot;.png&amp;quot;).size &lt;br /&gt;
  36:  imageFile=File.new(fileName+&amp;quot;.png&amp;quot;,&#039;r&#039;)&lt;br /&gt;
  37:  img = imageFile.read(size);&lt;br /&gt;
  38:  imageFile.close()&lt;br /&gt;
  39:  data_set(img)&lt;br /&gt;
  40:  format_set(&#039;png&#039;)&lt;br /&gt;
  41:end&lt;br /&gt;
  42:return @returnParamArray&lt;br /&gt;
  43:end&lt;br /&gt;
  44:#### 200 ####################################################################&lt;br /&gt;
  45:def cmd_200(cmd=nil)&lt;br /&gt;
  46:@returnParamArray.clear&lt;br /&gt;
  47:conn_.Reconnect()&lt;br /&gt;
  48:auth_s=device_.devdata_[114]+&amp;quot;:&amp;quot;+device_.devdata_[115]&lt;br /&gt;
  49:auth_a=Array.new;&lt;br /&gt;
  50:auth_s.each{|c| auth_a.push(c)}&lt;br /&gt;
  51:s = &amp;quot;GET /cgi-bin/camctrl.cgi?move=up HTTP/1.0\r\n&amp;quot;&lt;br /&gt;
  52:s+= &amp;quot;Accept: */*\r\n&amp;quot;&lt;br /&gt;
  53:s+= &amp;quot;Authorization: Basic &amp;quot;+auth_a.pack(&amp;quot;m&amp;quot;).chop+&amp;quot;\r\n&amp;quot;&lt;br /&gt;
  54:s+= &amp;quot;\r\n&amp;quot;&lt;br /&gt;
  55:&lt;br /&gt;
  56:conn_.Send(s)&lt;br /&gt;
  57:recv=&amp;quot;&amp;quot;&lt;br /&gt;
  58:loop do&lt;br /&gt;
  59:buff=conn_.Recv(256, 5000)&lt;br /&gt;
  60:if buff.empty?&lt;br /&gt;
  61:break&lt;br /&gt;
  62:end&lt;br /&gt;
  63:recv += buff&lt;br /&gt;
  64:end&lt;br /&gt;
  65:return @returnParamArray&lt;br /&gt;
  66:end&lt;br /&gt;
  67:#### 201 ####################################################################&lt;br /&gt;
  68:def cmd_201(cmd=nil)&lt;br /&gt;
  69:@returnParamArray.clear&lt;br /&gt;
  70:conn_.Reconnect()&lt;br /&gt;
  71:auth_s=device_.devdata_[114]+&amp;quot;:&amp;quot;+device_.devdata_[115]&lt;br /&gt;
  72:auth_a=Array.new;&lt;br /&gt;
  73:auth_s.each{|c| auth_a.push(c)}&lt;br /&gt;
  74:s = &amp;quot;GET /cgi-bin/camctrl.cgi?move=down HTTP/1.0\r\n&amp;quot;&lt;br /&gt;
  75:s+= &amp;quot;Accept: */*\r\n&amp;quot;&lt;br /&gt;
  76:s+= &amp;quot;Authorization: Basic &amp;quot;+auth_a.pack(&amp;quot;m&amp;quot;).chop+&amp;quot;\r\n&amp;quot;&lt;br /&gt;
  77:s+= &amp;quot;\r\n&amp;quot;&lt;br /&gt;
  78:&lt;br /&gt;
  79:conn_.Send(s)&lt;br /&gt;
  80:recv=&amp;quot;&amp;quot;&lt;br /&gt;
  81:loop do&lt;br /&gt;
  82:buff=conn_.Recv(256, 5000)&lt;br /&gt;
  83:if buff.empty?&lt;br /&gt;
  84:break&lt;br /&gt;
  85:end&lt;br /&gt;
  86:recv += buff&lt;br /&gt;
  87:end&lt;br /&gt;
  88:return @returnParamArray&lt;br /&gt;
  89:end&lt;br /&gt;
  90:#### 202 ####################################################################&lt;br /&gt;
  91:def cmd_202(cmd=nil)&lt;br /&gt;
  92:@returnParamArray.clear&lt;br /&gt;
  93:conn_.Reconnect()&lt;br /&gt;
  94:auth_s=device_.devdata_[114]+&amp;quot;:&amp;quot;+device_.devdata_[115]&lt;br /&gt;
  95:auth_a=Array.new;&lt;br /&gt;
  96:auth_s.each{|c| auth_a.push(c)}&lt;br /&gt;
  97:s = &amp;quot;GET /cgi-bin/camctrl.cgi?move=left HTTP/1.0\r\n&amp;quot;&lt;br /&gt;
  98:s+= &amp;quot;Accept: */*\r\n&amp;quot;&lt;br /&gt;
  99:s+= &amp;quot;Authorization: Basic &amp;quot;+auth_a.pack(&amp;quot;m&amp;quot;).chop+&amp;quot;\r\n&amp;quot;&lt;br /&gt;
 100:s+= &amp;quot;\r\n&amp;quot;&lt;br /&gt;
 101:&lt;br /&gt;
 102:conn_.Send(s)&lt;br /&gt;
 103:recv=&amp;quot;&amp;quot;&lt;br /&gt;
 104:loop do&lt;br /&gt;
 105:buff=conn_.Recv(256, 5000)&lt;br /&gt;
 106:if buff.empty?&lt;br /&gt;
 107:break&lt;br /&gt;
 108:end&lt;br /&gt;
 109:recv += buff&lt;br /&gt;
 110:end&lt;br /&gt;
 111:return @returnParamArray&lt;br /&gt;
 112:end&lt;br /&gt;
 113:#### 203 ####################################################################&lt;br /&gt;
 114:def cmd_203(cmd=nil)&lt;br /&gt;
 115:@returnParamArray.clear&lt;br /&gt;
 116:conn_.Reconnect()&lt;br /&gt;
 117:auth_s=device_.devdata_[114]+&amp;quot;:&amp;quot;+device_.devdata_[115]&lt;br /&gt;
 118:auth_a=Array.new;&lt;br /&gt;
 119:auth_s.each{|c| auth_a.push(c)}&lt;br /&gt;
 120:s = &amp;quot;GET /cgi-bin/camctrl.cgi?move=right HTTP/1.0\r\n&amp;quot;&lt;br /&gt;
 121:s+= &amp;quot;Accept: */*\r\n&amp;quot;&lt;br /&gt;
 122:s+= &amp;quot;Authorization: Basic &amp;quot;+auth_a.pack(&amp;quot;m&amp;quot;).chop+&amp;quot;\r\n&amp;quot;&lt;br /&gt;
 123:s+= &amp;quot;\r\n&amp;quot;&lt;br /&gt;
 124:&lt;br /&gt;
 125:conn_.Send(s)&lt;br /&gt;
 126:recv=&amp;quot;&amp;quot;&lt;br /&gt;
 127:loop do&lt;br /&gt;
 128:  buff=conn_.Recv(256, 5000)&lt;br /&gt;
 129:  if buff.empty?&lt;br /&gt;
 130:    break&lt;br /&gt;
 131:  end&lt;br /&gt;
 132:  recv += buff&lt;br /&gt;
 133:end&lt;br /&gt;
 134:return @returnParamArray&lt;br /&gt;
 135:end&lt;br /&gt;
 136:#### START SETTERS ####################################################################&lt;br /&gt;
 137:def initialize()&lt;br /&gt;
 138:super&lt;br /&gt;
 139:@returnParamArray=Array.new&lt;br /&gt;
 140:end&lt;br /&gt;
 141:def data_set(value)&lt;br /&gt;
 142:@returnParamArray[19]=value&lt;br /&gt;
 143:end&lt;br /&gt;
 144:def format_set(value)&lt;br /&gt;
 145:@returnParamArray[20]=value&lt;br /&gt;
 146:end&lt;br /&gt;
 147:####  END  SETTERS ####################################################################&lt;br /&gt;
 148:end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 8.10 Template Fixes =&lt;br /&gt;
I have managed to get a DCS-5300 camera to work on 8.10 but have had to manually fix the template (#1919 for the DCS5300G which is the wireless version). These are the steps that I had to do.&lt;br /&gt;
&lt;br /&gt;
1. Add &amp;quot;Core&amp;quot; under &amp;quot;Device is controlled via category&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Add &amp;quot;Ruby Internal Commands&amp;quot; under section &#039;Commands&#039; and make sure &#039;Commands&#039; and &#039;Pan/Tilt/Zoom&#039; are checked.&lt;br /&gt;
&lt;br /&gt;
3. Click on Edit Ruby commands and hit update button. This will add the missing ruby commands.&lt;br /&gt;
&lt;br /&gt;
4. In #350 process incoming Data put the following ruby code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
conn_.Close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Do a reload router and everything should be OK.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Olevia_700_Series_LCDs&amp;diff=36823</id>
		<title>Olevia 700 Series LCDs</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Olevia_700_Series_LCDs&amp;diff=36823"/>
		<updated>2016-07-11T14:46:54Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
{{Versioninfo}}&lt;br /&gt;
[[Category: Video]]&lt;br /&gt;
[[Category: Displays]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&lt;br /&gt;
 {| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
==Features==&lt;br /&gt;
===Basics===&lt;br /&gt;
* 42-47&amp;quot; (diagonal) [[16:9|widescreen]] [[LCD]] television&lt;br /&gt;
* Fantastic quality at an even better price&lt;br /&gt;
* RS-232 control port&lt;br /&gt;
* A variety of standard inputs&lt;br /&gt;
* Full 1080P&lt;br /&gt;
&lt;br /&gt;
===Detailed Specifications===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PANEL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Screen Size 42-47&amp;quot;&lt;br /&gt;
*Aspect Ratio 16:9&lt;br /&gt;
*HDTV HDTV Built-In&lt;br /&gt;
*Native Resolution 1920 x 1080&lt;br /&gt;
*Response Time 8 ms&lt;br /&gt;
*Video Processor Silicon Optix HQV&lt;br /&gt;
*Viewing Angle 178°/178°&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VIDEO&#039;&#039;&#039;&lt;br /&gt;
*1080p&lt;br /&gt;
*2:2/3:2 Pull Down&lt;br /&gt;
*Color Temperature Adjust&lt;br /&gt;
*Digital 3D Comb Filter&lt;br /&gt;
*Progressive Scan&lt;br /&gt;
*Supported Resolutions NTSC &amp;amp; ATSC with High Definition (480i, 480p, 720p, 1080i, 1080p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AUDIO&#039;&#039;&#039;&lt;br /&gt;
*Audio Output 1 R/L RCA Audio&lt;br /&gt;
*Earphone Output 1 Stereo Mini Jack&lt;br /&gt;
*Speakers 2 x 25W&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;I/O PORTS&#039;&#039;&#039;&lt;br /&gt;
*Component Input 3 (1 VGA) + R/L RCA Audio&lt;br /&gt;
*Composite Input 2 + R/L RCA Audio&lt;br /&gt;
*S-Video Input&lt;br /&gt;
*Digital Input 2 HDMI w/HDCP&lt;br /&gt;
*VGA Input 1 15-Pin D-sub + R/L RCA Audio&lt;br /&gt;
*Optical Audio Output&lt;br /&gt;
*Service Port DB-9 (labelled as service port, but works as control port on my model. 747i)&lt;br /&gt;
*TV System Support up to 1080p&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FUNCTION&#039;&#039;&#039;&lt;br /&gt;
*Channel Return&lt;br /&gt;
*Clock/Alarm&lt;br /&gt;
*Closed Caption&lt;br /&gt;
*Favorite Channel&lt;br /&gt;
*Languages: English, French and Spanish&lt;br /&gt;
*MTS&lt;br /&gt;
*PIP/Split Screen&lt;br /&gt;
*Sleep Timer&lt;br /&gt;
*V-Chip Parental Control&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WARRANTY&#039;&#039;&#039;&lt;br /&gt;
*Warranty Type One year on-site warranty&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OTHER (47&amp;quot; model)&#039;&#039;&#039;&lt;br /&gt;
*Dimensions 46.4&amp;quot; x 38.1&amp;quot; x 13.8&amp;quot;&lt;br /&gt;
*Gross Weight 164 lbs&lt;br /&gt;
*Net Weight 132.3 lbs&lt;br /&gt;
*PC Resolution Support Up to 1920 x 1080 at 60 Hz&lt;br /&gt;
*Power Consumption 240W&lt;br /&gt;
*Regulatory Approval FCC-B, UL, cUL, ICES-003, CSA, Energy Star&lt;br /&gt;
*Shipping Dimensions 50.9&amp;quot; x 38.9&amp;quot; x 14.7&amp;quot;&lt;br /&gt;
*Universal Remote included&lt;br /&gt;
&lt;br /&gt;
== Adding new template ==&lt;br /&gt;
Here are all the RS-232 control codes for Olevia 700 series TVs. When these models were first produced Olevia provided a chart with all of the control codes. However in newer manuals they labeled the RS-232 ports as &amp;quot;Service Ports&amp;quot; and stopped circulating the chart. Despite my port being labeled as a service port, all of the control commands worked perfectly. The commands are different for other models, so I would not expect this template to work for anything but a 700 series.&lt;br /&gt;
&lt;br /&gt;
I have the 747i and have personally tested these codes.&lt;br /&gt;
&lt;br /&gt;
=== Specify device data and parameters ===&lt;br /&gt;
&lt;br /&gt;
On the LinuxMCE admin website go to: Advanced &amp;gt; Configuration &amp;gt; Device Templates&lt;br /&gt;
&lt;br /&gt;
Select: Add manufacturer. Type: Olevia. Click add.&lt;br /&gt;
&lt;br /&gt;
Select: Manufacturer &#039;Olevia&#039;, Device Category &#039;TVs/Plasmas/LCD&#039;s/Projectors&#039; and press &#039;Add device template&#039;&lt;br /&gt;
&lt;br /&gt;
 Description : 700 Series&lt;br /&gt;
 Implements DCE : yes&lt;br /&gt;
 Command line : Generic_Serial_Device&lt;br /&gt;
 Device Category  AV TVs/Plasmas/Projection... #77&lt;br /&gt;
 Manufacturer Olevia&lt;br /&gt;
&lt;br /&gt;
Add the follow parameters under device data:&lt;br /&gt;
&lt;br /&gt;
 Device data&lt;br /&gt;
 Current Data 	                                    Comments 	                    Default Value&lt;br /&gt;
 #37 COM Port on PC(string) 	              The serial port 						&lt;br /&gt;
 #76 COM Port ParityBit/Stop(string) 	      Parity/Stop bits (factory defaults) 	N81 		&lt;br /&gt;
 #78 COM Port BaudRate(string)                Baud rate (factory default) 	        B115200&lt;br /&gt;
 #157 Discrete Volume(bool) 	              Indicates if the volume on...             1 &lt;br /&gt;
&lt;br /&gt;
Make sure that the check box for Allowed to Modify is checked for COM Port on PC. This is important and will cause you to go bald like me if you miss it.&lt;br /&gt;
&lt;br /&gt;
=== &#039;Edit Ruby code&#039; (on A/V properties page)  ===&lt;br /&gt;
&lt;br /&gt;
==== &#039;Make command group&#039; ====&lt;br /&gt;
Click the &amp;quot;Help me choose&amp;quot; button. Type &amp;quot;Olevia 700 Series RS232 LCD TV&amp;quot; into the box. Click &amp;quot;Add i/r group&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
==== &#039;Add/remove inputs&#039; ====&lt;br /&gt;
Click the &amp;quot;change/explain&amp;quot; link after inputs heading. Select all inputs on your TV. I selected: Component 1, Component 2, Composite, Composite 2, HDMI, HDMI 2, SVideo/YC 1, SVideo/YC 2, Tuner, Tuner 2, VGA.&lt;br /&gt;
&lt;br /&gt;
Note: VGA was not a standard item, I had to add it to the list. &lt;br /&gt;
&lt;br /&gt;
==== &#039;Add/remove commands&#039; ====&lt;br /&gt;
Select the follow command groups for your TV:&lt;br /&gt;
&lt;br /&gt;
* Ruby Internal Commands&lt;br /&gt;
* Standard TV&lt;br /&gt;
&lt;br /&gt;
Click update.&lt;br /&gt;
&lt;br /&gt;
==== &#039;Add Ruby Commands&#039; ==== &lt;br /&gt;
Add the following codes to each command. &lt;br /&gt;
&#039;&#039;&#039;Note: These will be updated to include scripts that will make everything play nicely. The Olevia 700&#039;s have a nice feature that will report the current input. Utilizing this in the input select commands will prevent selecting already active inputs. Which is kind of annoying as the scripts are right now.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 #193 Off &amp;lt;$&amp;quot;\xBE\x05\x27\x00\xEA&amp;quot;$&amp;gt; 	&lt;br /&gt;
 #192 On &amp;lt;$&amp;quot;\xBE\x05\x27\x01\xEB&amp;quot;$&amp;gt; 	&lt;br /&gt;
 #712 Component 1 &amp;lt;$&amp;quot;\xBE\x05\x26\x08\xF1&amp;quot;$&amp;gt; 	&lt;br /&gt;
 #713 Component 2 &amp;lt;$&amp;quot;\xBE\x05\x26\x09\xF2&amp;quot;$&amp;gt; 	&lt;br /&gt;
 #181 Composite &amp;lt;$&amp;quot;\xBE\x05\x25\x02\xEB&amp;quot;$&amp;gt; 	&lt;br /&gt;
 #766 Composite 2 &amp;lt;$&amp;quot;\xBE\x05\X26\x03\xEC&amp;quot;$&amp;gt; 	&lt;br /&gt;
 #361 HDMI &amp;lt;$&amp;quot;\xBE\x05\x26\x0C\xF5&amp;quot;$&amp;gt; 	&lt;br /&gt;
 #767 HDMI 2 &amp;lt;$&amp;quot;\xBE\x05\x26\x0E\xF7&amp;quot;$&amp;gt; 	&lt;br /&gt;
 #319 SVideo/YC 1 &amp;lt;$&amp;quot;\xBE\x05\x26\x05\xEE&amp;quot;$&amp;gt; 	&lt;br /&gt;
 #320 SVideo/YC 2 &amp;lt;$&amp;quot;\xBE\x05\x26\x03\xEC&amp;quot;$&amp;gt; 	&lt;br /&gt;
 #166 Tuner &amp;lt;$&amp;quot;\xBE\x05\x26\x00\xE9&amp;quot;$&amp;gt; 	&lt;br /&gt;
 #175 Tuner 2 &amp;lt;$&amp;quot;\xBE\x05\x26\x01\xEA&amp;quot;$&amp;gt; 	&lt;br /&gt;
 #953 VGA &amp;lt;$&amp;quot;\xBE\x05\x26\x0A\xF3&amp;quot;$&amp;gt; 	&lt;br /&gt;
 #190 Enter/Go &amp;lt;$&amp;quot;\xBE\x05\25\1B\03&amp;quot;$&amp;gt;&lt;br /&gt;
 #204 0 &amp;lt;$&amp;quot;\xBE\x05\x25\x10\xF8&amp;quot;$&amp;gt;&lt;br /&gt;
 #205 1 &amp;lt;$&amp;quot;\xBE\x05\x25\x11\xF9&amp;quot;$&amp;gt;&lt;br /&gt;
 #206 2 &amp;lt;$&amp;quot;\xBE\x05\x25\x12\xFA&amp;quot;$&amp;gt;&lt;br /&gt;
 #207 3 &amp;lt;$&amp;quot;\xBE\x05\x25\x13\xFB&amp;quot;$&amp;gt;&lt;br /&gt;
 #208 4 &amp;lt;$&amp;quot;\xBE\x05\x25\x14\xFC&amp;quot;$&amp;gt;&lt;br /&gt;
 #209 5 &amp;lt;$&amp;quot;\xBE\x05\x25\x15\xFD&amp;quot;$&amp;gt;&lt;br /&gt;
 #210 6 &amp;lt;$&amp;quot;\xBE\x05\x25\x16\xFE&amp;quot;$&amp;gt;&lt;br /&gt;
 #211 7 &amp;lt;$&amp;quot;\xBE\x05\x25\x17\xFF&amp;quot;$&amp;gt;&lt;br /&gt;
 #212 8 &amp;lt;$&amp;quot;\xBE\x05\x25\x18\x00&amp;quot;$&amp;gt;&lt;br /&gt;
 #213 9 &amp;lt;$&amp;quot;\xBE\x05\x25\x19\x01&amp;quot;$&amp;gt;&lt;br /&gt;
 #64 Skip Back - Channel/Track Lower &amp;lt;$&amp;quot;\xBE\x05\x25\x01\xE9&amp;quot;$&amp;gt; 	&lt;br /&gt;
 #63 Skip Fwd - Channel/Track Greater &amp;lt;$&amp;quot;\xBE\x05\x25\x00\xE8&amp;quot;$&amp;gt; 	&lt;br /&gt;
 #97 Mute &amp;lt;$&amp;quot;\xBE\x05\x25\x09\xF1&amp;quot;$&amp;gt;&lt;br /&gt;
 #90 Vol Down &amp;lt;$&amp;quot;\xBE\x05\x25\x03\xEB&amp;quot;$&amp;gt;&lt;br /&gt;
 #89 Vol Up &amp;lt;$&amp;quot;\xBE\x05\x25\x02\xEA&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Adding device ==&lt;br /&gt;
You can now add the device via the [[LinuxMCE Admin Website]] at &#039;&#039;&#039;Wizard &amp;gt; [[AV Devices|A/V Equipment]]&#039;&#039;&#039;&lt;br /&gt;
=== Add device based on created template ===&lt;br /&gt;
Just search for the device template that you created and select it from the list.&lt;br /&gt;
=== Specify COM port for it ===&lt;br /&gt;
Tell LinuxMCE which com port to use.&lt;br /&gt;
=== Assing it to new room ===&lt;br /&gt;
Tell LinuxMCE which room to assign this device.&lt;br /&gt;
=== Specifiy Audio pipe connections to inputs on receiver ===&lt;br /&gt;
Tell LinuxMCE how you have thing attached to the LG TV and how the LG TV is attached to the computer.&lt;br /&gt;
&lt;br /&gt;
==Making Plug&amp;amp;Play==&lt;br /&gt;
I have not been able to get PnP to work properly, despite the script detecting the TV correctly. If you want to play with it, here is the PnP script. You will have to change the 1931 parameter to the DeviceTamplate ID of your new template.&lt;br /&gt;
&lt;br /&gt;
Copy to (on Core&#039;s and MD&#039;s): /usr/pluto/pnp/20_OleviaTV.sh&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #Plug and Play script for Olevia 700 series LCDs&lt;br /&gt;
 echo &amp;quot;Olevia 700 series TV Detection script queue $2&amp;quot;&lt;br /&gt;
 response=`/usr/pluto/bin/TestSerialPort -p $3 -P N81 -b 115200 -t &amp;quot;\\BE\\05\\90\\00\\53&amp;quot; -i 1`&lt;br /&gt;
 &lt;br /&gt;
 if [ &amp;quot;$response&amp;quot; = &amp;quot;\06\05\90\01\9c&amp;quot; ] || [ &amp;quot;$response&amp;quot; = &amp;quot;\06\05\90\00\9b&amp;quot; ]; then&lt;br /&gt;
 echo &amp;quot;Its an Olevia 7xx TV&amp;quot;&lt;br /&gt;
 /usr/pluto/bin/MessageSend dcerouter -r 0 $1 1 806 224 $2 13 &amp;quot;$4&amp;quot; 44 1931&lt;br /&gt;
 else&lt;br /&gt;
 echo &amp;quot;It&#039;s not an Olevia 7xx TV&amp;quot;&lt;br /&gt;
 /usr/pluto/bin/MessageSend dcerouter -r 0 $1 1 806 224 $2 13 &amp;quot;$4&amp;quot; 44 0&lt;br /&gt;
 fi&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Zavio_M510E&amp;diff=36822</id>
		<title>Zavio M510E</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Zavio_M510E&amp;diff=36822"/>
		<updated>2016-07-11T14:45:06Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
{{Versioninfo}}&lt;br /&gt;
[[Category: Cameras]]&lt;br /&gt;
[[Category: IP Cameras]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&lt;br /&gt;
[[Image:M511EWeb_180_opt.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
= Status =&lt;br /&gt;
The Zavio M510E device template can be derived from the D-Link DCS-5300G Template. It is fully plug and play and supports pan and tilt.&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* Browser based&lt;br /&gt;
* PAN Range +/- 135°, TILT Range +90°/ -45°&lt;br /&gt;
* 10/100mbit LAN&lt;br /&gt;
* 2x I/O Port, 1x Sensor Input, 1x Relay Output&lt;br /&gt;
* 1x mic input, 1x A/V Connector&lt;br /&gt;
* 30fps max&lt;br /&gt;
* active motion detector&lt;br /&gt;
* MPEG4 compression&lt;br /&gt;
* UPnP, DynDNS&lt;br /&gt;
* Real-Time Live Video &amp;amp; Audio Streaming&lt;br /&gt;
&lt;br /&gt;
= Ruby Code =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RCODE:&lt;br /&gt;
   0:require &#039;Ruby_Generic_Serial_Device&#039;&lt;br /&gt;
   1:class Command &amp;lt; Ruby_Generic_Serial_Device::RubyCommandWrapper&lt;br /&gt;
   2:end&lt;br /&gt;
   3:class Device_95 &amp;lt; Ruby_Generic_Serial_Device::RubySerialIOWrapper&lt;br /&gt;
   4:#### 84 ####################################################################&lt;br /&gt;
   5:def cmd_84(data, format, disable_aspect_lock, streamid, width, height, cmd=nil)&lt;br /&gt;
   6:@returnParamArray.clear&lt;br /&gt;
   7:conn_.Reconnect()&lt;br /&gt;
   8:auth_s=device_.devdata_[114]+&amp;quot;:&amp;quot;+device_.devdata_[115]&lt;br /&gt;
   9:auth_a=Array.new;&lt;br /&gt;
  10:auth_s.each{|c| auth_a.push(c)}&lt;br /&gt;
  11:&lt;br /&gt;
  12:fix_path=device_.devdata_[2];&lt;br /&gt;
  13:fix_path=&#039;/&#039;+fix_path if(fix_path[0]!=&#039;/&#039;[0]);&lt;br /&gt;
  14:&lt;br /&gt;
  15:s = &amp;quot;GET &amp;quot;+fix_path+&amp;quot; HTTP/1.0\r\n&amp;quot;&lt;br /&gt;
  16:s+= &amp;quot;Accept: */*\r\n&amp;quot;&lt;br /&gt;
  17:s+= &amp;quot;Authorization: Basic &amp;quot;+auth_a.pack(&amp;quot;m&amp;quot;).chop+&amp;quot;\r\n&amp;quot;&lt;br /&gt;
  18:s+= &amp;quot;\r\n&amp;quot;&lt;br /&gt;
  19:&lt;br /&gt;
  20:conn_.Send(s)&lt;br /&gt;
  21:recv=&amp;quot;&amp;quot;&lt;br /&gt;
  22:while(true)&lt;br /&gt;
  23:  buff=conn_.Recv(16384, 5000)&lt;br /&gt;
  24:  if(buff.length() == 0)&lt;br /&gt;
  25:     break&lt;br /&gt;
  26:   end&lt;br /&gt;
  27:   recv = recv +  buff&lt;br /&gt;
  28:end&lt;br /&gt;
  29:if (recv=~ /^HTTP[^\r\n]+200\sOK.+?\r\n\r\n(.+)$/m)&lt;br /&gt;
  30:  fileName=&amp;quot;/tmp/ip_camera_img&amp;quot;+device_.devid_.to_s&lt;br /&gt;
  31:  imageFile=File.new(fileName+&amp;quot;.jpg&amp;quot;,&#039;w&#039;)&lt;br /&gt;
  32:  imageFile.print $1&lt;br /&gt;
  33:  imageFile.close()&lt;br /&gt;
  34:  system(&amp;quot;/usr/bin/convert &amp;quot;+fileName+&amp;quot;.jpg &amp;quot;+fileName+&amp;quot;.png&amp;quot;);&lt;br /&gt;
  35:  size=File.stat(fileName+&amp;quot;.png&amp;quot;).size &lt;br /&gt;
  36:  imageFile=File.new(fileName+&amp;quot;.png&amp;quot;,&#039;r&#039;)&lt;br /&gt;
  37:  img = imageFile.read(size);&lt;br /&gt;
  38:  imageFile.close()&lt;br /&gt;
  39:  data_set(img)&lt;br /&gt;
  40:  format_set(&#039;png&#039;)&lt;br /&gt;
  41:end&lt;br /&gt;
  42:return @returnParamArray&lt;br /&gt;
  43:end&lt;br /&gt;
  44:#### 200 ####################################################################&lt;br /&gt;
  45:def cmd_200(cmd=nil)&lt;br /&gt;
  46:@returnParamArray.clear&lt;br /&gt;
  47:conn_.Reconnect()&lt;br /&gt;
  48:auth_s=device_.devdata_[114]+&amp;quot;:&amp;quot;+device_.devdata_[115]&lt;br /&gt;
  49:auth_a=Array.new;&lt;br /&gt;
  50:auth_s.each{|c| auth_a.push(c)}&lt;br /&gt;
  51:s = &amp;quot;GET /cgi-bin/camctrl.cgi?move=up HTTP/1.0\r\n&amp;quot;&lt;br /&gt;
  52:s+= &amp;quot;Accept: */*\r\n&amp;quot;&lt;br /&gt;
  53:s+= &amp;quot;Authorization: Basic &amp;quot;+auth_a.pack(&amp;quot;m&amp;quot;).chop+&amp;quot;\r\n&amp;quot;&lt;br /&gt;
  54:s+= &amp;quot;\r\n&amp;quot;&lt;br /&gt;
  55:&lt;br /&gt;
  56:conn_.Send(s)&lt;br /&gt;
  57:recv=&amp;quot;&amp;quot;&lt;br /&gt;
  58:while(true)&lt;br /&gt;
  59:buff=conn_.Recv(256, 5000)&lt;br /&gt;
  60:if(buff.length() == 0)&lt;br /&gt;
  61:break&lt;br /&gt;
  62:end&lt;br /&gt;
  63:recv = recv + buff&lt;br /&gt;
  64:end&lt;br /&gt;
  65:return @returnParamArray&lt;br /&gt;
  66:end&lt;br /&gt;
  67:#### 201 ####################################################################&lt;br /&gt;
  68:def cmd_201(cmd=nil)&lt;br /&gt;
  69:@returnParamArray.clear&lt;br /&gt;
  70:conn_.Reconnect()&lt;br /&gt;
  71:auth_s=device_.devdata_[114]+&amp;quot;:&amp;quot;+device_.devdata_[115]&lt;br /&gt;
  72:auth_a=Array.new;&lt;br /&gt;
  73:auth_s.each{|c| auth_a.push(c)}&lt;br /&gt;
  74:s = &amp;quot;GET /cgi-bin/operator/ptzset?move=down HTTP/1.0\r\n&amp;quot;&lt;br /&gt;
  75:s+= &amp;quot;Accept: */*\r\n&amp;quot;&lt;br /&gt;
  76:s+= &amp;quot;Authorization: Basic &amp;quot;+auth_a.pack(&amp;quot;m&amp;quot;).chop+&amp;quot;\r\n&amp;quot;&lt;br /&gt;
  77:s+= &amp;quot;\r\n&amp;quot;&lt;br /&gt;
  78:&lt;br /&gt;
  79:conn_.Send(s)&lt;br /&gt;
  80:recv=&amp;quot;&amp;quot;&lt;br /&gt;
  81:while(true)&lt;br /&gt;
  82:buff=conn_.Recv(256, 5000)&lt;br /&gt;
  83:if(buff.length() == 0)&lt;br /&gt;
  84:break&lt;br /&gt;
  85:end&lt;br /&gt;
  86:recv = recv + buff&lt;br /&gt;
  87:end&lt;br /&gt;
  88:return @returnParamArray&lt;br /&gt;
  89:end&lt;br /&gt;
  90:#### 202 ####################################################################&lt;br /&gt;
  91:def cmd_202(cmd=nil)&lt;br /&gt;
  92:@returnParamArray.clear&lt;br /&gt;
  93:conn_.Reconnect()&lt;br /&gt;
  94:auth_s=device_.devdata_[114]+&amp;quot;:&amp;quot;+device_.devdata_[115]&lt;br /&gt;
  95:auth_a=Array.new;&lt;br /&gt;
  96:auth_s.each{|c| auth_a.push(c)}&lt;br /&gt;
  97:s = &amp;quot;GET /cgi-bin/operator/ptzset?move=left HTTP/1.0\r\n&amp;quot;&lt;br /&gt;
  98:s+= &amp;quot;Accept: */*\r\n&amp;quot;&lt;br /&gt;
  99:s+= &amp;quot;Authorization: Basic &amp;quot;+auth_a.pack(&amp;quot;m&amp;quot;).chop+&amp;quot;\r\n&amp;quot;&lt;br /&gt;
 100:s+= &amp;quot;\r\n&amp;quot;&lt;br /&gt;
 101:&lt;br /&gt;
 102:conn_.Send(s)&lt;br /&gt;
 103:recv=&amp;quot;&amp;quot;&lt;br /&gt;
 104:while(true)&lt;br /&gt;
 105:buff=conn_.Recv(256, 5000)&lt;br /&gt;
 106:if(buff.length() == 0)&lt;br /&gt;
 107:break&lt;br /&gt;
 108:end&lt;br /&gt;
 109:recv = recv + buff&lt;br /&gt;
 110:end&lt;br /&gt;
 111:return @returnParamArray&lt;br /&gt;
 112:end&lt;br /&gt;
 113:#### 203 ####################################################################&lt;br /&gt;
 114:def cmd_203(cmd=nil)&lt;br /&gt;
 115:@returnParamArray.clear&lt;br /&gt;
 116:conn_.Reconnect()&lt;br /&gt;
 117:auth_s=device_.devdata_[114]+&amp;quot;:&amp;quot;+device_.devdata_[115]&lt;br /&gt;
 118:auth_a=Array.new;&lt;br /&gt;
 119:auth_s.each{|c| auth_a.push(c)}&lt;br /&gt;
 120:s = &amp;quot;GET /cgi-bin/operator/ptzset?move=down HTTP/1.0\r\n&amp;quot;&lt;br /&gt;
 121:s+= &amp;quot;Accept: */*\r\n&amp;quot;&lt;br /&gt;
 122:s+= &amp;quot;Authorization: Basic &amp;quot;+auth_a.pack(&amp;quot;m&amp;quot;).chop+&amp;quot;\r\n&amp;quot;&lt;br /&gt;
 123:s+= &amp;quot;\r\n&amp;quot;&lt;br /&gt;
 124:&lt;br /&gt;
 125:conn_.Send(s)&lt;br /&gt;
 126:recv=&amp;quot;&amp;quot;&lt;br /&gt;
 127:while(true)&lt;br /&gt;
 128:  buff=conn_.Recv(256, 5000)&lt;br /&gt;
 129:  if(buff.length() == 0)&lt;br /&gt;
 130:     break&lt;br /&gt;
 131:   end&lt;br /&gt;
 132:   recv = recv +  buff&lt;br /&gt;
 133:end&lt;br /&gt;
 134:return @returnParamArray&lt;br /&gt;
 135:end&lt;br /&gt;
 136:#### START SETTERS ####################################################################&lt;br /&gt;
 137:def initialize()&lt;br /&gt;
 138:super&lt;br /&gt;
 139:@returnParamArray=Array.new&lt;br /&gt;
 140:end&lt;br /&gt;
 141:def data_set(value)&lt;br /&gt;
 142:@returnParamArray[19]=value&lt;br /&gt;
 143:end&lt;br /&gt;
 144:def format_set(value)&lt;br /&gt;
 145:@returnParamArray[20]=value&lt;br /&gt;
 146:end&lt;br /&gt;
 147:####  END  SETTERS ####################################################################&lt;br /&gt;
 148:end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Path has to be changed to /jpg/image.jpg&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=IPC-1002&amp;diff=36821</id>
		<title>IPC-1002</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=IPC-1002&amp;diff=36821"/>
		<updated>2016-07-11T14:44:11Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
{{Versioninfo}}&lt;br /&gt;
[[Category: Cameras]]&lt;br /&gt;
[[Category: IP Cameras]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&lt;br /&gt;
[[Image:ipc-1002.small.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Status =&lt;br /&gt;
The IPC-1002 device template can be derived from the Panasonic IP Camera. &lt;br /&gt;
A template for this Camera has been submitted (Plug and Play doesn&#039;t quiet work however).&lt;br /&gt;
Pan and Tilt support.&lt;br /&gt;
This camera is a cheap camera and can be found at http://www.dealextreme.com/details.dx/sku.14272&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* Browser based&lt;br /&gt;
* PAN Range +/- 180°, TILT Range 120°&lt;br /&gt;
* 10/100mbit LAN&lt;br /&gt;
* LCD display the IP address /Network mask/gateway IP etc&lt;br /&gt;
* 6 infrared LED, automatic operate in dark environment &lt;br /&gt;
* 30fps max&lt;br /&gt;
* External sensor &amp;amp; alarm interface&lt;br /&gt;
* MPEG4 compression&lt;br /&gt;
* UPnP, DynDNS&lt;br /&gt;
&lt;br /&gt;
More features can be found at the above link.&lt;br /&gt;
&lt;br /&gt;
= Ruby Code =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RCODE:&lt;br /&gt;
   0:require &#039;Ruby_Generic_Serial_Device&#039;&lt;br /&gt;
   1:class Command &amp;lt; Ruby_Generic_Serial_Device::RubyCommandWrapper&lt;br /&gt;
   2:end&lt;br /&gt;
   3:class Device_64 &amp;lt; Ruby_Generic_Serial_Device::RubySerialIOWrapper&lt;br /&gt;
   4:#### 84 ####################################################################&lt;br /&gt;
   5:def cmd_84(data, format, disable_aspect_lock, streamid, width, height, cmd=nil)&lt;br /&gt;
   6:@returnParamArray.clear&lt;br /&gt;
   7:conn_.Reconnect()&lt;br /&gt;
   8:auth_s=device_.devdata_[114]+&amp;quot;:&amp;quot;+device_.devdata_[115]&lt;br /&gt;
   9:auth_a=Array.new;&lt;br /&gt;
  10:auth_s.each{|c| auth_a.push(c)}&lt;br /&gt;
  11:&lt;br /&gt;
  12:s = &amp;quot;GET &amp;quot;+device_.devdata_[2]+&amp;quot; HTTP/1.0\r\n&amp;quot;&lt;br /&gt;
  13:s+= &amp;quot;Accept: */*\r\n&amp;quot;&lt;br /&gt;
  14:s+= &amp;quot;Authorization: Basic &amp;quot;+auth_a.pack(&amp;quot;m&amp;quot;).chop+&amp;quot;\r\n&amp;quot;&lt;br /&gt;
  15:s+= &amp;quot;\r\n&amp;quot;&lt;br /&gt;
  16:&lt;br /&gt;
  17:conn_.Send(s)&lt;br /&gt;
  18:recv=&amp;quot;&amp;quot;&lt;br /&gt;
  19:while(true)&lt;br /&gt;
  20:  buff=conn_.Recv(16384, 5000)&lt;br /&gt;
  21:  if(buff.length() == 0)&lt;br /&gt;
  22:     break&lt;br /&gt;
  23:   end&lt;br /&gt;
  24:   recv = recv +  buff&lt;br /&gt;
  25:end&lt;br /&gt;
  26:if (recv=~ /^HTTP[^\r\n]+200\sOK.+?\r\n\r\n(.+)$/m)&lt;br /&gt;
  27:  fileName=&amp;quot;/tmp/ip_camera_img&amp;quot;+device_.devid_.to_s&lt;br /&gt;
  28:  imageFile=File.new(fileName+&amp;quot;.jpg&amp;quot;,&#039;w&#039;)&lt;br /&gt;
  29:  imageFile.print $1&lt;br /&gt;
  30:  imageFile.close()&lt;br /&gt;
  31:  system(&amp;quot;/usr/bin/convert &amp;quot;+fileName+&amp;quot;.jpg &amp;quot;+fileName+&amp;quot;.png&amp;quot;);&lt;br /&gt;
  32:  size=File.stat(fileName+&amp;quot;.png&amp;quot;).size &lt;br /&gt;
  33:  imageFile=File.new(fileName+&amp;quot;.png&amp;quot;,&#039;r&#039;)&lt;br /&gt;
  34:  img = imageFile.read(size);&lt;br /&gt;
  35:  imageFile.close()&lt;br /&gt;
  36:  data_set(img)&lt;br /&gt;
  37:  format_set(&#039;png&#039;)&lt;br /&gt;
  38:end&lt;br /&gt;
  39:return @returnParamArray&lt;br /&gt;
  40:end&lt;br /&gt;
  41:#### 200 ####################################################################&lt;br /&gt;
  42:def cmd_200(streamid, cmd=nil)&lt;br /&gt;
  43:@returnParamArray.clear&lt;br /&gt;
  44:conn_.Reconnect()&lt;br /&gt;
  45:auth_s=device_.devdata_[114]+&amp;quot;:&amp;quot;+device_.devdata_[115]&lt;br /&gt;
  46:auth_a=Array.new;&lt;br /&gt;
  47:auth_s.each{|c| auth_a.push(c)}&lt;br /&gt;
  48:s = &amp;quot;GET /cgi-bin/action?action=cam_mv&amp;amp;diretion=cam_up HTTP/1.0\r\n&amp;quot;&lt;br /&gt;
  49:s+= &amp;quot;Accept: */*\r\n&amp;quot;&lt;br /&gt;
  50:s+= &amp;quot;Authorization: Basic &amp;quot;+auth_a.pack(&amp;quot;m&amp;quot;).chop+&amp;quot;\r\n&amp;quot;&lt;br /&gt;
  51:s+= &amp;quot;\r\n&amp;quot;&lt;br /&gt;
  52:&lt;br /&gt;
  53:conn_.Send(s)&lt;br /&gt;
  54:recv=&amp;quot;&amp;quot;&lt;br /&gt;
  55:while(true)&lt;br /&gt;
  56:buff=conn_.Recv(256, 5000)&lt;br /&gt;
  57:if(buff.length() == 0)&lt;br /&gt;
  58:break&lt;br /&gt;
  59:end&lt;br /&gt;
  60:recv = recv + buff&lt;br /&gt;
  61:end&lt;br /&gt;
  62:return @returnParamArray&lt;br /&gt;
  63:end&lt;br /&gt;
  64:#### 201 ####################################################################&lt;br /&gt;
  65:def cmd_201(streamid, cmd=nil)&lt;br /&gt;
  66:@returnParamArray.clear&lt;br /&gt;
  67:conn_.Reconnect()&lt;br /&gt;
  68:auth_s=device_.devdata_[114]+&amp;quot;:&amp;quot;+device_.devdata_[115]&lt;br /&gt;
  69:auth_a=Array.new;&lt;br /&gt;
  70:auth_s.each{|c| auth_a.push(c)}&lt;br /&gt;
  71:s = &amp;quot;GET /cgi-bin/action?action=cam_mv&amp;amp;diretion=cam_down HTTP/1.0\r\n&amp;quot;&lt;br /&gt;
  72:s+= &amp;quot;Accept: */*\r\n&amp;quot;&lt;br /&gt;
  73:s+= &amp;quot;Authorization: Basic &amp;quot;+auth_a.pack(&amp;quot;m&amp;quot;).chop+&amp;quot;\r\n&amp;quot;&lt;br /&gt;
  74:s+= &amp;quot;\r\n&amp;quot;&lt;br /&gt;
  75:&lt;br /&gt;
  76:conn_.Send(s)&lt;br /&gt;
  77:recv=&amp;quot;&amp;quot;&lt;br /&gt;
  78:while(true)&lt;br /&gt;
  79:buff=conn_.Recv(256, 5000)&lt;br /&gt;
  80:if(buff.length() == 0)&lt;br /&gt;
  81:break&lt;br /&gt;
  82:end&lt;br /&gt;
  83:recv = recv + buff&lt;br /&gt;
  84:end&lt;br /&gt;
  85:return @returnParamArray&lt;br /&gt;
  86:end&lt;br /&gt;
  87:#### 202 ####################################################################&lt;br /&gt;
  88:def cmd_202(streamid, cmd=nil)&lt;br /&gt;
  89:@returnParamArray.clear&lt;br /&gt;
  90:conn_.Reconnect()&lt;br /&gt;
  91:auth_s=device_.devdata_[114]+&amp;quot;:&amp;quot;+device_.devdata_[115]&lt;br /&gt;
  92:auth_a=Array.new;&lt;br /&gt;
  93:auth_s.each{|c| auth_a.push(c)}&lt;br /&gt;
  94:s = &amp;quot;GET /cgi-bin/action?action=cam_mv&amp;amp;diretion=cam_left HTTP/1.0\r\n&amp;quot;&lt;br /&gt;
  95:s+= &amp;quot;Accept: */*\r\n&amp;quot;&lt;br /&gt;
  96:s+= &amp;quot;Authorization: Basic &amp;quot;+auth_a.pack(&amp;quot;m&amp;quot;).chop+&amp;quot;\r\n&amp;quot;&lt;br /&gt;
  97:s+= &amp;quot;\r\n&amp;quot;&lt;br /&gt;
  98:&lt;br /&gt;
  99:conn_.Send(s)&lt;br /&gt;
 100:recv=&amp;quot;&amp;quot;&lt;br /&gt;
 101:while(true)&lt;br /&gt;
 102:buff=conn_.Recv(256, 5000)&lt;br /&gt;
 103:if(buff.length() == 0)&lt;br /&gt;
 104:break&lt;br /&gt;
 105:end&lt;br /&gt;
 106:recv = recv + buff&lt;br /&gt;
 107:end&lt;br /&gt;
 108:return @returnParamArray&lt;br /&gt;
 109:end&lt;br /&gt;
 110:#### 203 ####################################################################&lt;br /&gt;
 111:def cmd_203(streamid, cmd=nil)&lt;br /&gt;
 112:@returnParamArray.clear&lt;br /&gt;
 113:conn_.Reconnect()&lt;br /&gt;
 114:auth_s=device_.devdata_[114]+&amp;quot;:&amp;quot;+device_.devdata_[115]&lt;br /&gt;
 115:auth_a=Array.new;&lt;br /&gt;
 116:auth_s.each{|c| auth_a.push(c)}&lt;br /&gt;
 117:s = &amp;quot;GET /cgi-bin/action?action=cam_mv&amp;amp;diretion=cam_right HTTP/1.0\r\n&amp;quot;&lt;br /&gt;
 118:s+= &amp;quot;Accept: */*\r\n&amp;quot;&lt;br /&gt;
 119:s+= &amp;quot;Authorization: Basic &amp;quot;+auth_a.pack(&amp;quot;m&amp;quot;).chop+&amp;quot;\r\n&amp;quot;&lt;br /&gt;
 120:s+= &amp;quot;\r\n&amp;quot;&lt;br /&gt;
 121:&lt;br /&gt;
 122:conn_.Send(s)&lt;br /&gt;
 123:recv=&amp;quot;&amp;quot;&lt;br /&gt;
 124:while(true)&lt;br /&gt;
 125:buff=conn_.Recv(256, 5000)&lt;br /&gt;
 126:if(buff.length() == 0)&lt;br /&gt;
 127:break&lt;br /&gt;
 128:end&lt;br /&gt;
 129:recv = recv + buff&lt;br /&gt;
 130:end&lt;br /&gt;
 131:return @returnParamArray&lt;br /&gt;
 132:end&lt;br /&gt;
 133:#### 350 ####################################################################&lt;br /&gt;
 134:def cmd_350(cmd=nil)&lt;br /&gt;
 135:@returnParamArray.clear&lt;br /&gt;
 136:conn_.Close()&lt;br /&gt;
 137:return @returnParamArray&lt;br /&gt;
 138:end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_350&amp;diff=36820</id>
		<title>Insteon PLM Ruby Code 350</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_350&amp;diff=36820"/>
		<updated>2016-07-07T14:30:34Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; {{Versioninfo}}&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#### #350 Process Incoming Data ####&lt;br /&gt;
buff = &#039;&#039;&lt;br /&gt;
#$recvbuff = &amp;quot;&amp;quot;&lt;br /&gt;
while(true)&lt;br /&gt;
buff=conn_.Recv(128,50)&lt;br /&gt;
if(buff.length() == 0)&lt;br /&gt;
break&lt;br /&gt;
end&lt;br /&gt;
$recvbuff = $recvbuff + buff&lt;br /&gt;
end&lt;br /&gt;
debugin($recvbuff)&lt;br /&gt;
$recvbuff = plmparse($recvbuff)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category: GSD]]&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_788&amp;diff=36819</id>
		<title>Insteon PLM Ruby Code 788</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_788&amp;diff=36819"/>
		<updated>2016-07-07T14:29:45Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#788&lt;br /&gt;
#First, Let&#039;s see if we actually &#039;get this command&#039;&lt;br /&gt;
log($yellow+ &#039;*#*#*#*#*#*#*#*# GOT #788 Status Report! *#*#*#*#*#*#*#*#*&#039;+ $grey)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_776&amp;diff=36818</id>
		<title>Insteon PLM Ruby Code 776</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_776&amp;diff=36818"/>
		<updated>2016-07-07T14:29:04Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
### #776 Reset&lt;br /&gt;
#First, Lets see if we actually &#039;get this command&#039;&lt;br /&gt;
log($yellow+ &#039;*#*#*#*#*#*#*#*# GOT #776 Reset! *#*#*#*#*#*#*#*#*&#039;+ $grey)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
myDevFrom = device_.devid_&lt;br /&gt;
myDevTo = -1001&lt;br /&gt;
myDevPriority = 1&lt;br /&gt;
myDevType = 2 #event&lt;br /&gt;
myDevID = 65 # Device Detected&lt;br /&gt;
#create command&lt;br /&gt;
cmd = Command.new(myDevFrom, myDevTo, myDevPriority, myDevType, myDevID)&lt;br /&gt;
#Add params...&lt;br /&gt;
cmd.params_[28] = &#039;&#039; #IP Address&lt;br /&gt;
cmd.params_[5] = &#039;&#039; #MAC Address&lt;br /&gt;
cmd.params_[56] = &amp;quot;73&amp;quot; # environment - Lighting Device&lt;br /&gt;
cmd.params_[49] = &amp;quot;38&amp;quot; # Light (dimmable) PK_DeviceTemplate&lt;br /&gt;
#PK_FloorplanObjectType of 10 is Table Lamp, 9 is ceiling light&lt;br /&gt;
#PK_FloorplanObjectType is devicedata #11&lt;br /&gt;
#0a.97.0b is test lamp&lt;br /&gt;
#0b.71.ab is Office Light&lt;br /&gt;
cmd.params_[55] = &amp;quot;11|10|12|0A.97.0B&amp;quot; # test lamp module PK_DeviceData&lt;br /&gt;
cmd.params_[13] = &amp;quot;SwitchLinc V2&amp;quot; # text to display&lt;br /&gt;
cmd.params_[51] = &amp;quot;0A.97.0B&amp;quot; # VendorModelID&lt;br /&gt;
cmd.params_[52] = &amp;quot;11&amp;quot; # PK_CommMethod&lt;br /&gt;
cmd.params_[53] = &amp;quot;2&amp;quot; #PK_PnpProtocol&lt;br /&gt;
cmd.params_[54] = &amp;quot;0A.97.0B[54]&amp;quot; #PNP_Serial_Number&lt;br /&gt;
cmd.params_[59] = &amp;quot;Insteon PLM&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
##device # 2&lt;br /&gt;
#cmd = Command.new(myDevFrom, myDevTo, myDevPriority, myDevType, myDevID)&lt;br /&gt;
##Add params...&lt;br /&gt;
#cmd.params_[56] = &amp;quot;73&amp;quot; # environment - Lighting Device&lt;br /&gt;
#cmd.params_[49] = &amp;quot;38&amp;quot; # Light (dimmable)&lt;br /&gt;
#cmd.params_[55] = &amp;quot;12\t11.22.33\n59\tConfiguration\n&amp;quot; # test lamp module&lt;br /&gt;
#cmd.params_[13] = &amp;quot;TEST LampLinc V2&amp;quot; # text to display&lt;br /&gt;
#cmd.params_[52] = &amp;quot;11&amp;quot;&lt;br /&gt;
#cmd.params_[53] = &amp;quot;2&amp;quot;&lt;br /&gt;
#cmd.params_[54] = &amp;quot;11.22.33&amp;quot;&lt;br /&gt;
#cmd.params_[59] = &amp;quot;Insteon PLM&amp;quot;&lt;br /&gt;
#SendCommand(cmd)&lt;br /&gt;
  &lt;br /&gt;
#Now, Fire the Done Detecting event...&lt;br /&gt;
cmd = Command.new(myDevFrom, myDevTo, myDevPriority, myDevType, 74) #Done detecting...&lt;br /&gt;
cmd.params_[59] = &amp;quot;Insteon PLM&amp;quot;&lt;br /&gt;
SendCommand(cmd)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Radio_Thermostat&amp;diff=36817</id>
		<title>Radio Thermostat</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Radio_Thermostat&amp;diff=36817"/>
		<updated>2016-07-07T13:58:41Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]] &lt;br /&gt;
[[Category: Thermostats]] &lt;br /&gt;
[[Category: ZWave]] &lt;br /&gt;
[[Category: Wi-Fi]] &lt;br /&gt;
[[Category: Zigbee]] &lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Radio Thermostat makes several thermostats that can communicate via various wireless protocols using USNAP modules. This is an attempt to bring some of the information for these thermostats into one place.&lt;br /&gt;
&lt;br /&gt;
Current Models are:&lt;br /&gt;
  CT-22 (Beginning to be depreciated)&lt;br /&gt;
  CT-30 (Also known as Filtrete 3M-50 sold in [http://www.homedepot.com/h_d1/N-5yc1v/R-202352449/h_d2/ProductDisplay?storeId=10051&amp;amp;catalogId=10053| Home Depot] in the U.S. with a slightly different case)&lt;br /&gt;
  CT-80&lt;br /&gt;
&lt;br /&gt;
The [http://radiothermostat.com/radios.html| USNAP communication modules] include Wi-Fi, Zigbee and Z-Wave. [http://shop.radiothermostat.com/| Store Front]&lt;br /&gt;
&lt;br /&gt;
There is a [http://www.setyourthermostat.com/| Windows program] to control it via Wi-Fi&lt;br /&gt;
&lt;br /&gt;
These thermostats will connect on their own via a Wi-Fi Access Point back to their hosted control service and allow you to control your thermostat from any browser.&lt;br /&gt;
&lt;br /&gt;
The documentation for the [http://radiothermostat.com/documents/RTCOA%20WiFI%20API%20V1_0R3.pdf| Wi-Fi communication API] was [http://radiothermostat.com/latestnews.html#advanced|recently released].&lt;br /&gt;
&lt;br /&gt;
I also found this [http://central.isaroach.com/wiki/index.php/Cloud_APIs| unofficial Cloud API documentation].&lt;br /&gt;
&lt;br /&gt;
Driver is complete and waiting for sqlCVS approval. -Aviator&lt;br /&gt;
&lt;br /&gt;
[http://forum.linuxmce.org/index.php/topic,11706.0.html]&lt;br /&gt;
&lt;br /&gt;
The template is in process but is #2235.  The code below is under development:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;#193 off:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
	data = &amp;quot;{\&amp;quot;tmode\&amp;quot;:&amp;quot; # Current mode of HVAC operation&amp;lt;br /&amp;gt;&lt;br /&gt;
	data+=&amp;quot;0}&amp;quot; # Off&amp;lt;br /&amp;gt;&lt;br /&gt;
	log(&amp;quot;tmode set data: &amp;quot; + data)&amp;lt;br /&amp;gt;&lt;br /&gt;
	tstat_set(data)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
#192 on:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
	data+=&amp;quot;3}&amp;quot; # Auto&amp;lt;br /&amp;gt;&lt;br /&gt;
	log(&amp;quot;tmode set data: &amp;quot; + data)&amp;lt;br /&amp;gt;&lt;br /&gt;
	tstat_set(data)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
#279 set fan:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
	data = &amp;quot;{\&amp;quot;fmode\&amp;quot;:&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	if onoff == &amp;quot;1&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	  data+=&amp;quot;2}&amp;quot; # Fan is always on&amp;lt;br /&amp;gt;&lt;br /&gt;
	else&amp;lt;br /&amp;gt;&lt;br /&gt;
	  data+=&amp;quot;0}&amp;quot; # Auto&amp;lt;br /&amp;gt;&lt;br /&gt;
	end&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	log(&amp;quot;fmode set data: &amp;quot; + data)&amp;lt;br /&amp;gt;&lt;br /&gt;
	tstat_set(data)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
#280 set heat/cool:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
	data = &amp;quot;{\&amp;quot;tmode\&amp;quot;:&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	if onoff == &amp;quot;H&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	  data+=&amp;quot;1&amp;quot; # Heat only&amp;lt;br /&amp;gt;&lt;br /&gt;
	elsif onoff == &amp;quot;C&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	  data+=&amp;quot;2&amp;quot; # Cool only&amp;lt;br /&amp;gt;&lt;br /&gt;
	else&amp;lt;br /&amp;gt;&lt;br /&gt;
	  data+=&amp;quot;3&amp;quot; # Auto&amp;lt;br /&amp;gt;&lt;br /&gt;
	end&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	data+=&amp;quot;}&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	log(&amp;quot;tmode set data: &amp;quot; + data)&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	tstat_set(data)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
# 278 set temperature:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
	if ((value_to_assign[0,1]==&amp;quot;+&amp;quot;) || (value_to_assign[0,1]==&amp;quot;-&amp;quot;))&amp;lt;br /&amp;gt;&lt;br /&gt;
	  # The new setpoint is relative to the current setpoint&amp;lt;br /&amp;gt;&lt;br /&gt;
	  new_temp = celcius_to_farhenheit(Float(@setpoint)).round + value_to_assign.to_i&amp;lt;br /&amp;gt;&lt;br /&gt;
	else&amp;lt;br /&amp;gt;&lt;br /&gt;
	  # The new setpoint is absolute&amp;lt;br /&amp;gt;&lt;br /&gt;
	  new_temp = celcius_to_farhenheit(Float(value_to_assign.to_i)).round&amp;lt;br /&amp;gt;&lt;br /&gt;
	end&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	# to set the temp, we must know the mode&amp;lt;br /&amp;gt;&lt;br /&gt;
	case $tstathash[&amp;quot;tmode&amp;quot;].to_s&amp;lt;br /&amp;gt;&lt;br /&gt;
	  when &amp;quot;1&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	    data = &amp;quot;{\&amp;quot;t_heat\&amp;quot;:&amp;quot; + new_temp.to_s  + &amp;quot;}&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	  when &amp;quot;2&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	    data = &amp;quot;{\&amp;quot;t_cool\&amp;quot;:&amp;quot; + new_temp.to_s  + &amp;quot;}&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	end&amp;lt;br /&amp;gt;&lt;br /&gt;
	log(&amp;quot;Set temp data: &amp;quot; + data)&amp;lt;br /&amp;gt;&lt;br /&gt;
	tstat_set(data)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
#373 Private method listing:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
	# Helper function for logging&amp;lt;br /&amp;gt;&lt;br /&gt;
	def log(word)&amp;lt;br /&amp;gt;&lt;br /&gt;
	   $logFile.print(word + &amp;quot;\n&amp;quot;)&amp;lt;br /&amp;gt;&lt;br /&gt;
	   $logFile.flush()&amp;lt;br /&amp;gt;&lt;br /&gt;
	end&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	def get()&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	  # Reconnect to the device&amp;lt;br /&amp;gt;&lt;br /&gt;
	  conn_.Reconnect()&amp;lt;br /&amp;gt;&lt;br /&gt;
	 &amp;lt;br /&amp;gt;&lt;br /&gt;
	  # Send the request&amp;lt;br /&amp;gt;&lt;br /&gt;
	  s = &amp;quot;GET /tstat HTTP/1.1\r\n&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	  s += &amp;quot;\r\n&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	  conn_.Send(s)&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	  # Wait for a reply&amp;lt;br /&amp;gt;&lt;br /&gt;
	  recv = &amp;quot;&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	  while(true)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    buff=conn_.Recv(256, 5000)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    if(buff.length() == 0)&amp;lt;br /&amp;gt;&lt;br /&gt;
	       break&amp;lt;br /&amp;gt;&lt;br /&gt;
	    end&amp;lt;br /&amp;gt;&lt;br /&gt;
	     recv = recv +  buff&amp;lt;br /&amp;gt;&lt;br /&gt;
	  end&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	  # Check that we got a response and try to parse through it&amp;lt;br /&amp;gt;&lt;br /&gt;
	  if (recv=~ /^HTTP[^\r\n]+200\sOK.+?\r\n\r\n(.+)$/m)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    #parse temp&amp;lt;br /&amp;gt;&lt;br /&gt;
	    $tstathash[&amp;quot;temp&amp;quot;] = recv.to_s.scan(/\{\&amp;quot;temp\&amp;quot;Sad.*?),/)&amp;lt;br /&amp;gt;&lt;br /&gt;
	   &amp;lt;br /&amp;gt;&lt;br /&gt;
	    #parse tmode&amp;lt;br /&amp;gt;&lt;br /&gt;
	    $tstathash[&amp;quot;tmode&amp;quot;] = recv.to_s.scan(/\&amp;quot;tmode\&amp;quot;Sad.*?),/)   &amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	    #parse fmode&amp;lt;br /&amp;gt;&lt;br /&gt;
	    $tstathash[&amp;quot;fmode&amp;quot;] = recv.to_s.scan(/\&amp;quot;fmode\&amp;quot;Sad.*?),/)&amp;lt;br /&amp;gt;&lt;br /&gt;
	   &amp;lt;br /&amp;gt;&lt;br /&gt;
	    #parse override&amp;lt;br /&amp;gt;&lt;br /&gt;
	    $tstathash[&amp;quot;override&amp;quot;] = recv.to_s.scan(/\&amp;quot;override\&amp;quot;Sad.*?),/)&amp;lt;br /&amp;gt;&lt;br /&gt;
	   &amp;lt;br /&amp;gt;&lt;br /&gt;
	    #parse hold&amp;lt;br /&amp;gt;&lt;br /&gt;
	    $tstathash[&amp;quot;hold&amp;quot;] = recv.to_s.scan(/\&amp;quot;hold\&amp;quot;Sad.*?),/)&amp;lt;br /&amp;gt;&lt;br /&gt;
	   &amp;lt;br /&amp;gt;&lt;br /&gt;
	    #parse t_heat&amp;lt;br /&amp;gt;&lt;br /&gt;
	    $tstathash[&amp;quot;t_heat&amp;quot;] = recv.to_s.scan(/\&amp;quot;t_heat\&amp;quot;Sad.*?),/)&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	    #parse t_cool&amp;lt;br /&amp;gt;&lt;br /&gt;
	    $tstathash[&amp;quot;t_cool&amp;quot;] = recv.to_s.scan(/\&amp;quot;t_cool\&amp;quot;Sad.*?),/)&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	    #parse time&amp;lt;br /&amp;gt;&lt;br /&gt;
	    $tstathash[&amp;quot;day&amp;quot;] = recv.to_s.scan(/\&amp;quot;day\&amp;quot;Sad.*?),/)   &amp;lt;br /&amp;gt;&lt;br /&gt;
	    $tstathash[&amp;quot;hour&amp;quot;] = recv.to_s.scan(/\&amp;quot;hour\&amp;quot;Sad.*?),/)   &amp;lt;br /&amp;gt;&lt;br /&gt;
	    $tstathash[&amp;quot;minute&amp;quot;] = recv.to_s.scan(/\&amp;quot;minute\&amp;quot;Sad.*?)\}/)&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	    case $tstathash[&amp;quot;tmode&amp;quot;].to_s&amp;lt;br /&amp;gt;&lt;br /&gt;
	      when &amp;quot;1&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	        $tstathash[&amp;quot;setpoint&amp;quot;] = recv.to_s.scan(/\&amp;quot;t_heat\&amp;quot;Sad.*?),/)&amp;lt;br /&amp;gt;&lt;br /&gt;
	      when &amp;quot;2&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	        $tstathash[&amp;quot;setpoint&amp;quot;] = recv.to_s.scan(/\&amp;quot;t_cool\&amp;quot;Sad.*?),/)&amp;lt;br /&amp;gt;&lt;br /&gt;
	      when &amp;quot;3&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	        $tstathash[&amp;quot;setpoint&amp;quot;] = 32.0  #no setpoint for auto ??&amp;lt;br /&amp;gt;&lt;br /&gt;
	      else&amp;lt;br /&amp;gt;&lt;br /&gt;
	        log(&amp;quot;Error getting setpoint! mode:&amp;quot; + $tstathash[&amp;quot;tmode&amp;quot;].to_s + &amp;quot; 0 is OFF&amp;quot;)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    end&amp;lt;br /&amp;gt;&lt;br /&gt;
	  end&amp;lt;br /&amp;gt;&lt;br /&gt;
	end&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	def tstat_set(data, update=true)&amp;lt;br /&amp;gt;&lt;br /&gt;
	  # Reconnect to the device&amp;lt;br /&amp;gt;&lt;br /&gt;
	 &amp;lt;br /&amp;gt;&lt;br /&gt;
	  conn_.Reconnect()&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	  s = &amp;quot;POST /tstat HTTP/1.1\r\n&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	  s += &amp;quot;Content-type: application/x-www-form-urlencoded\r\n&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	  s += &amp;quot;Content-Length: &amp;quot; + (data.length).to_s() + &amp;quot;\r\n&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	  s += &amp;quot;\r\n&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	  s += data&amp;lt;br /&amp;gt;&lt;br /&gt;
	  s += &amp;quot;\r\n&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	  conn_.Send(s)&amp;lt;br /&amp;gt;&lt;br /&gt;
	log(&amp;quot;Update: &amp;quot; + data)&amp;lt;br /&amp;gt;&lt;br /&gt;
	# Wait for a reply&amp;lt;br /&amp;gt;&lt;br /&gt;
	  recv = &amp;quot;&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
	  while(true)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    buff=conn_.Recv(256, 5000)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    if(buff.length() == 0)&amp;lt;br /&amp;gt;&lt;br /&gt;
	       break&amp;lt;br /&amp;gt;&lt;br /&gt;
	    end&amp;lt;br /&amp;gt;&lt;br /&gt;
	     recv = recv +  buff&amp;lt;br /&amp;gt;&lt;br /&gt;
	  end&amp;lt;br /&amp;gt;&lt;br /&gt;
	log(recv.to_s)&amp;lt;br /&amp;gt;&lt;br /&gt;
	  # Update the state to reflect the new situation&amp;lt;br /&amp;gt;&lt;br /&gt;
	  if (update)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    update_state()&amp;lt;br /&amp;gt;&lt;br /&gt;
	 &amp;lt;br /&amp;gt;&lt;br /&gt;
	 &amp;lt;br /&amp;gt;&lt;br /&gt;
	  end&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	end&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	def update_state()&amp;lt;br /&amp;gt;&lt;br /&gt;
	  # This function queries the thermostat to get the most recent state&amp;lt;br /&amp;gt;&lt;br /&gt;
	 &amp;lt;br /&amp;gt;&lt;br /&gt;
	  log(&amp;quot;Polling thermostat for updates at: &amp;quot; + Time.now.to_s)&amp;lt;br /&amp;gt;&lt;br /&gt;
	  get()&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	  # Get the new states&amp;lt;br /&amp;gt;&lt;br /&gt;
	  new_tmode = $tstathash[&amp;quot;tmode&amp;quot;]  # 0-Off, 1-Heat, 2-Cool, 3-Auto&amp;lt;br /&amp;gt;&lt;br /&gt;
	  #if ($tstathash[&amp;quot;fmode&amp;quot;] == 2)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    # Always on&amp;lt;br /&amp;gt;&lt;br /&gt;
	    #new_fmode = 2 # On&amp;lt;br /&amp;gt;&lt;br /&gt;
	  #else&amp;lt;br /&amp;gt;&lt;br /&gt;
	    # Auto/Schedule&amp;lt;br /&amp;gt;&lt;br /&gt;
	    #new_fmode = 1 # Auto&amp;lt;br /&amp;gt;&lt;br /&gt;
	  #end&amp;lt;br /&amp;gt;&lt;br /&gt;
	  new_fmode = $tstathash[&amp;quot;fmode&amp;quot;]&amp;lt;br /&amp;gt;&lt;br /&gt;
	  new_setpoint = farhenheit_to_celcius(Float($tstathash[&amp;quot;setpoint&amp;quot;].to_s))&amp;lt;br /&amp;gt;&lt;br /&gt;
	 &amp;lt;br /&amp;gt;&lt;br /&gt;
	  new_temp = farhenheit_to_celcius(Float($tstathash[&amp;quot;temp&amp;quot;].to_s))&amp;lt;br /&amp;gt;&lt;br /&gt;
	  #new_time = Time.at(results[4].to_i - Time.now.utc_offset) # Time.at creates a UTC time, wheras the thermostat reports the time in the local time zone&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;	&lt;br /&gt;
	  # Update the state and send events when necessary&amp;lt;br /&amp;gt;&lt;br /&gt;
	  if (new_tmode != @tmode)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    log(&amp;quot;  New mode detected : &amp;quot; + new_tmode.to_s)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    if (@tmode == 0)&amp;lt;br /&amp;gt;&lt;br /&gt;
	      # The old mode was &amp;quot;Off&amp;quot;, so now the thermostat is on&amp;lt;br /&amp;gt;&lt;br /&gt;
	      cmd = Command.new(device_.devid_, -1001, 1, 2, 28) # On&amp;lt;br /&amp;gt;&lt;br /&gt;
	      SendCommand(cmd)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    end&amp;lt;br /&amp;gt;&lt;br /&gt;
	    if (new_tmode == 0)&amp;lt;br /&amp;gt;&lt;br /&gt;
	      # The new mode is &amp;quot;Off&amp;quot;, so we send the Off event:&amp;lt;br /&amp;gt;&lt;br /&gt;
	      cmd = Command.new(device_.devid_, -1001, 1, 2, 29) # Off&amp;lt;br /&amp;gt;&lt;br /&gt;
	      SendCommand(cmd)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    else&amp;lt;br /&amp;gt;&lt;br /&gt;
	      # We send the Thermostat mode changed event:&amp;lt;br /&amp;gt;&lt;br /&gt;
	      cmd = Command.new(device_.devid_, -1001, 1, 2, 78)&amp;lt;br /&amp;gt;&lt;br /&gt;
	      cmd.params_[30] =  new_tmode.to_s #(new_tmode - 1).to_s&amp;lt;br /&amp;gt;&lt;br /&gt;
	      SendCommand(cmd)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    end&amp;lt;br /&amp;gt;&lt;br /&gt;
	    @tmode = new_tmode&amp;lt;br /&amp;gt;&lt;br /&gt;
	  end&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	  if (new_fmode != @fmode)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    @fmode = new_fmode&amp;lt;br /&amp;gt;&lt;br /&gt;
	    log(&amp;quot;  New fan mode detected : &amp;quot; + new_fmode.to_s)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    cmd = Command.new(device_.devid_, -1001, 1, 2, 79) # Fan Mode Changed&amp;lt;br /&amp;gt;&lt;br /&gt;
	    cmd.params_[30] = new_fmode.to_s                   # Fan mode value&amp;lt;br /&amp;gt;&lt;br /&gt;
	    SendCommand(cmd)&amp;lt;br /&amp;gt;&lt;br /&gt;
	  end&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	  if (new_setpoint != @setpoint)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    @setpoint = new_setpoint&amp;lt;br /&amp;gt;&lt;br /&gt;
	    log(&amp;quot;  New temperature setpoint detected : &amp;quot; + new_setpoint.to_s)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    cmd = Command.new(device_.devid_, -1001, 1, 2, 27) # Thermostat Set Point Chan&amp;lt;br /&amp;gt;&lt;br /&gt;
	    cmd.params_[30] = new_setpoint.to_s                   # The new set point&amp;lt;br /&amp;gt;&lt;br /&gt;
	    SendCommand(cmd)&amp;lt;br /&amp;gt;&lt;br /&gt;
	  end&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	  if (new_temp != @temp)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    @temp = new_temp&amp;lt;br /&amp;gt;&lt;br /&gt;
	    log(&amp;quot;  New temperature measurement detected : &amp;quot; + new_temp.to_s)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    cmd = Command.new(device_.devid_, -1001, 1, 2, 25) # Temperature changed event&amp;lt;br /&amp;gt;&lt;br /&gt;
	    cmd.params_[30] = new_temp.to_s         # The ambient temperature&amp;lt;br /&amp;gt;&lt;br /&gt;
	    SendCommand(cmd)&amp;lt;br /&amp;gt;&lt;br /&gt;
	  end&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	  # Check the latest system time&amp;lt;br /&amp;gt;&lt;br /&gt;
	  #@time = new_time&amp;lt;br /&amp;gt;&lt;br /&gt;
	  #if ((@time-Time.now).abs &amp;gt; 600)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    # Time is out of sync for more than 10 minutes&amp;lt;br /&amp;gt;&lt;br /&gt;
	    #log(&amp;quot;Thermostat&#039;s time (&amp;quot;+@time.to_s+&amp;quot;) is out of sync with system time (&amp;quot;+Time.now.to_s+&amp;quot;), resynchronizing&amp;quot;)&amp;lt;br /&amp;gt;&lt;br /&gt;
	    #data=&amp;quot;OID2.5.1=&amp;quot; # Current system time in seconds since Jan 1, 1970&amp;lt;br /&amp;gt;&lt;br /&gt;
	    #data+=(Time.now + Time.now.utc_offset).to_i.to_s # Time.to_i returns seconds since epoch in UTC, wheras the thermostat expects the time 	in seconds since epoch in the local time zone&amp;lt;br /&amp;gt;&lt;br /&gt;
	    #pdp_set(data, false)&amp;lt;br /&amp;gt;&lt;br /&gt;
	  #end&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	  # Record the last time the state was checked&amp;lt;br /&amp;gt;&lt;br /&gt;
	  @last_check = Time.now&amp;lt;br /&amp;gt;&lt;br /&gt;
	end&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	def farhenheit_to_celcius(cf)&amp;lt;br /&amp;gt;&lt;br /&gt;
	  # Converts a temperatue in deci-Farhenheit into deci-degrees Celcius&amp;lt;br /&amp;gt;&lt;br /&gt;
	  power = 10.00&amp;lt;br /&amp;gt;&lt;br /&gt;
	  return ((((cf - 32.0)*5.0)/9.0) * power).round / power&amp;lt;br /&amp;gt;&lt;br /&gt;
	end&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	def celcius_to_farhenheit(c)&amp;lt;br /&amp;gt;&lt;br /&gt;
	  # Converts a temperatue in degrees Celcius into deci-Farhenheit&amp;lt;br /&amp;gt;&lt;br /&gt;
	  power = 10.00&amp;lt;br /&amp;gt;&lt;br /&gt;
	  return ((((c*9.0)/5.0)+32.0) * power).round / power&amp;lt;br /&amp;gt;&lt;br /&gt;
	end&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
# 351 process idle:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
	# Check how long it has been since we queried the thermostat&amp;lt;br /&amp;gt;&lt;br /&gt;
	now = Time.now&amp;lt;br /&amp;gt;&lt;br /&gt;
	if ((@last_check + 300) &amp;lt; now)&amp;lt;br /&amp;gt;&lt;br /&gt;
	  # The last check was more than 5 minutes ago&amp;lt;br /&amp;gt;&lt;br /&gt;
	  update_state()&amp;lt;br /&amp;gt;&lt;br /&gt;
	end&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
# 350 process incoming data:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
	conn_.Close()&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
# 355 process init:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
	# Create Log File&amp;lt;br /&amp;gt;&lt;br /&gt;
	$logFile = File.new(&amp;quot;/var/log/pluto/RadioThermostatWiFi.log&amp;quot;, &amp;quot;w&amp;quot;)&amp;lt;br /&amp;gt;&lt;br /&gt;
	log(&amp;quot;Starting RadioThermostatWiFi&amp;quot; + &amp;quot;\n&amp;quot;)&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	@tmode = 0&amp;lt;br /&amp;gt;&lt;br /&gt;
	@fmode = 0&amp;lt;br /&amp;gt;&lt;br /&gt;
	@temp = 0.0&amp;lt;br /&amp;gt;&lt;br /&gt;
	@setpoint = 0.0&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	# Define Hashes to store our data&amp;lt;br /&amp;gt;&lt;br /&gt;
	$tstathash = Hash.new&amp;lt;br /&amp;gt;&lt;br /&gt;
	$tstathash[&amp;quot;hour&amp;quot;] = 0&amp;lt;br /&amp;gt;&lt;br /&gt;
	$tstathash[&amp;quot;minute&amp;quot;] = 0&amp;lt;br /&amp;gt;&lt;br /&gt;
	$tstathash[&amp;quot;day&amp;quot;] = 0&amp;lt;br /&amp;gt;&lt;br /&gt;
	$tstathash[&amp;quot;temp&amp;quot;] = 0.00&amp;lt;br /&amp;gt;&lt;br /&gt;
	$tstathash[&amp;quot;setpoint&amp;quot;] = 0.00&amp;lt;br /&amp;gt;&lt;br /&gt;
	$tstathash[&amp;quot;tmode&amp;quot;] = 0&amp;lt;br /&amp;gt;&lt;br /&gt;
	$tstathash[&amp;quot;fmode&amp;quot;] = 0&amp;lt;br /&amp;gt;&lt;br /&gt;
	$tstathash[&amp;quot;override&amp;quot;] = 0&amp;lt;br /&amp;gt;&lt;br /&gt;
	$tstathash[&amp;quot;hold&amp;quot;] = 0&amp;lt;br /&amp;gt;&lt;br /&gt;
	$tstathash[&amp;quot;t_heat&amp;quot;] = 0.00&amp;lt;br /&amp;gt;&lt;br /&gt;
	$tstathash[&amp;quot;t_cool&amp;quot;] = 0.00&amp;lt;br /&amp;gt;&lt;br /&gt;
	$tstathash[&amp;quot;tstate&amp;quot;] = 0&amp;lt;br /&amp;gt;&lt;br /&gt;
	$tstathash[&amp;quot;fstate&amp;quot;] = 0&amp;lt;br /&amp;gt;&lt;br /&gt;
	$tstathash[&amp;quot;t_type_post&amp;quot;] = 0&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	# Update the state&amp;lt;br /&amp;gt;&lt;br /&gt;
	get()&amp;lt;br /&amp;gt;&lt;br /&gt;
	@tmode = $tstathash[&amp;quot;tmode&amp;quot;]&amp;lt;br /&amp;gt;&lt;br /&gt;
	@fmode = $tstathash[&amp;quot;fmode&amp;quot;]&amp;lt;br /&amp;gt;&lt;br /&gt;
	@temp = $tstathash[&amp;quot;temp&amp;quot;]&amp;lt;br /&amp;gt;&lt;br /&gt;
	@setpoint = $tstathash[&amp;quot;setpoint&amp;quot;]&amp;lt;br /&amp;gt;&lt;br /&gt;
	@last_check = Time.now&amp;lt;br /&amp;gt;&lt;br /&gt;
	update_state()&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
#356 process release:&amp;lt;br /&amp;gt;&lt;br /&gt;
	&amp;lt;br /&amp;gt;&lt;br /&gt;
	# Close the Log File&amp;lt;br /&amp;gt;&lt;br /&gt;
	if ($logFile != nil) then&amp;lt;br /&amp;gt;&lt;br /&gt;
	  $logFile.close&amp;lt;br /&amp;gt;&lt;br /&gt;
	end&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Kenwood_Sovereign_Receivers&amp;diff=36816</id>
		<title>Kenwood Sovereign Receivers</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Kenwood_Sovereign_Receivers&amp;diff=36816"/>
		<updated>2016-07-07T13:56:08Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[category: Audio]]&lt;br /&gt;
[[Category:Amps_Receivers]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
{{versioninfo|810Status=relevant|810UpdatedDate=24 Jan 2011|810UpdatedBy=Dennis G}}&lt;br /&gt;
{{stub}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Using the Kenwood Sovereign Receivers with RS232 Control ==&lt;br /&gt;
&lt;br /&gt;
                                                         [[Image:Sovereign.jpg]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;THIS CODE IS STILL BEING DEVELOPED&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Models are VR 5900, VR 5700, VR 5090 and VR 5080 and maybe other models.&lt;br /&gt;
Use a null-modem cable DB9 Female at each end.&lt;br /&gt;
Com settings: 9600,N81&lt;br /&gt;
&lt;br /&gt;
{{p}}&lt;br /&gt;
&lt;br /&gt;
== Operational Status ==&lt;br /&gt;
&lt;br /&gt;
* On/Off works&lt;br /&gt;
* Volume &amp;amp; Mute work&lt;br /&gt;
* Defined but not tested:&lt;br /&gt;
** Listen Modes (Stereo/Dolby Digital/DTS/DTS-ES/DSP ...) &lt;br /&gt;
** Input Select (CDR/AV1/DVD/TUNER ...)&lt;br /&gt;
** Surround Mode (THX/THX EX)&lt;br /&gt;
* OTARadio (AM/FM) not working yet&lt;br /&gt;
&lt;br /&gt;
{{p}}&lt;br /&gt;
&lt;br /&gt;
== Ruby Codes ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;INTERNAL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#350 Process Initialize&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
$logFile = File.new(&amp;quot;/var/log/pluto/VR5x00.log&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for iRetry in 0...4&lt;br /&gt;
    print &amp;quot;Initializing unit\n&amp;quot;&lt;br /&gt;
    conn_.Send(&amp;quot;\x01PWR?\x02\x0D\x0D\x0A&amp;quot;)&lt;br /&gt;
    buf = conn_.RecvDelimited(&amp;quot;\x04&amp;quot;, 2000)&lt;br /&gt;
    if( !buf.nil? &amp;amp;&amp;amp; !buf.index(&amp;quot;PWR&amp;quot;).nil? )&lt;br /&gt;
        log(&amp;quot;Data from Receiver: &amp;quot; + buf + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        # see if any more data from receiver&lt;br /&gt;
        buf = conn_.Recv(1000,1000)&lt;br /&gt;
        log(&amp;quot;is this data trash? &amp;quot; + buf + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        log(&amp;quot;Initialized ok\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
    log(&amp;quot;Failed to initialize.  Wait 1 secs and try again\n&amp;quot;)&lt;br /&gt;
    sleep(1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
DisableDevice( device_.devid_, true )&lt;br /&gt;
&lt;br /&gt;
log(&amp;quot;The device wouldn&#039;t respond. Disabling it.\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#350 Process Incoming Data&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
buf = conn_.Recv(1000,1000)&lt;br /&gt;
&lt;br /&gt;
log(&amp;quot;Received &#039;&amp;quot; + buf + &amp;quot;&#039; data from Receiver&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#373 Private Method Listing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def SendIrCommand(command)&lt;br /&gt;
    for i in 0...1&lt;br /&gt;
        conn_.Send(&amp;quot;\x01&amp;quot; + command + &amp;quot;\x02\x0D\x0D\x0A&amp;quot;)&lt;br /&gt;
        reply = conn_.RecvDelimited(&amp;quot;\x04&amp;quot;, 2000)&lt;br /&gt;
        if( !reply.nil? &amp;amp;&amp;amp; reply.length()&amp;gt;4 )&lt;br /&gt;
            log(&amp;quot;Received good reply: &amp;quot; + reply + &amp;quot;\n&amp;quot;)&lt;br /&gt;
            return reply&lt;br /&gt;
        else&lt;br /&gt;
            buf = conn_.Recv(1000,1000);&lt;br /&gt;
            log(&amp;quot;Flushed buffer: &amp;quot; + buf + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;quot;Invalid&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def log(word)&lt;br /&gt;
    $logFile.print( word + &amp;quot;\n&amp;quot; )&lt;br /&gt;
    $logFile.flush()&lt;br /&gt;
    print(word + &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def GetRadioStations()&lt;br /&gt;
    # would like to implement reading from a table in pluto_media that&lt;br /&gt;
    # is populated from a screen in web admin... that queries a website for&lt;br /&gt;
    # local radio stations based on latitude &amp;amp; longitude or zip code.&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;POWER&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#192 On&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;PWR1&amp;quot;)&lt;br /&gt;
sleep(2)&lt;br /&gt;
SendIrCommand(&amp;quot;MUTE0&amp;quot;)&lt;br /&gt;
@mute=false&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#193 Off&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;PWR0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SOUND &amp;amp; VOLUME&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#89 Vol Up&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
volume_level = (SendIrCommand(&amp;quot;VOL?&amp;quot;)[-3,2]).hex&lt;br /&gt;
&lt;br /&gt;
if volume_level &amp;lt; 255 &lt;br /&gt;
    volume_level += 1&lt;br /&gt;
    newvol = (&amp;quot;VOL&amp;quot; + &amp;quot;%02x&amp;quot; % volume_level.to_s).upcase&lt;br /&gt;
    SendIrCommand(newvol)&lt;br /&gt;
    log(&amp;quot;Volume increase to : &amp;quot; + newvol)&lt;br /&gt;
else&lt;br /&gt;
    log(&amp;quot;Volume at Maximum&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#90 Vol Down&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
volume_level = (SendIrCommand(&amp;quot;VOL?&amp;quot;)[-3,2]).hex&lt;br /&gt;
&lt;br /&gt;
if volume_level &amp;gt; 0 &lt;br /&gt;
    volume_level -= 1&lt;br /&gt;
    newvol = (&amp;quot;VOL&amp;quot; + &amp;quot;%02x&amp;quot; % volume_level.to_s).upcase&lt;br /&gt;
    SendIrCommand(newvol)&lt;br /&gt;
    log(&amp;quot;Volume decreased to : &amp;quot; + newvol)&lt;br /&gt;
else&lt;br /&gt;
    log(&amp;quot;Volume at Minimum&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#97 Mute&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
mute_state = SendIrCommand(&amp;quot;MUTE?&amp;quot;)[-6,5]&lt;br /&gt;
&lt;br /&gt;
case mute_state&lt;br /&gt;
    when &amp;quot;MUTE0&amp;quot;&lt;br /&gt;
        SendIrCommand(&amp;quot;MUTE1&amp;quot;)&lt;br /&gt;
    when &amp;quot;MUTE1&amp;quot;&lt;br /&gt;
        SendIrCommand(&amp;quot;MUTE0&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;INPUTS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#163 Phono&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;SEL00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#873 Tuner - Digital&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;SEL01&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#162 CD&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;SEL02&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#160 Tape / Tape1&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;SEL03&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#420 CDR&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;SEL04&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#155 Video1&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;SEL05&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#156 Video2&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;SEL06&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#157 Video3&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;SEL07&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#158 Video4&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;SEL08&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#165 DVD&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;SEL09&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#316 AV 1&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;SEL0A&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DSP MODES&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#311 Stereo&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;LSTN00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#1006 PRO LOGIC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;LSTN01&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#292 Dolby Digital&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;LSTN02&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Modes LSTN03 and LSTN04 are unknown still&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#1089 Arena&#039;&#039;   (new definition)&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;LSTN05&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#312 Stadium&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;LSTN06&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#149 Jazz Club&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;LSTN07&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#1087 Cathedral&#039;&#039;   (new definition)&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;LSTN08&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#1090  Theater&#039;&#039;  (new definition)&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;LSTN09&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#1088 Concert Hall&#039;&#039;  (new definition)&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;LSTN0A&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#1089 Stadium2&#039;&#039;    (new definition)&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;LSTN0B&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#1090 Theater2&#039;&#039;   (new definition)&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;LSTN0C&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#1000 PRO LOGIC2 MOVIE&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;LSTN0D&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#1002 PRO LOGIC2 MUSIC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;LSTN0E&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#1007 Neo6 CINEMA&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;LSTN0F&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#1008 Neo6 MUSIC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;LSTN10&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#1092 Multi-Channel Music&#039;&#039;   (new definition)&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;LSTN11&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RECEIVER&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* These are Input Modes the receivers support for digital or analog input jacks&lt;br /&gt;
* These were also defined by myself&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#1094 Analog&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;INPUTM2&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#1095 DGTL Manual&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;INPUTM1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#1096 Full Auto&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;INPUTM0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;#1098 6-ch Input&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SendIrCommand(&amp;quot;INPUTM3&amp;quot;)&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Olevia_2xxT_5xxT_series_lcdtv&amp;diff=36815</id>
		<title>Olevia 2xxT 5xxT series lcdtv</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Olevia_2xxT_5xxT_series_lcdtv&amp;diff=36815"/>
		<updated>2016-07-07T13:55:13Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
{{Versioninfo}}&lt;br /&gt;
[[Category: Video]]&lt;br /&gt;
[[Category: Displays]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&lt;br /&gt;
 {| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
Olevia has several TV&#039;s with rs232 serial control ports.  These TV&#039;s can be controlled by LMCE with some tweaking.  Some of them use the standard DB-9 plug, while others require a unique cable made by olevia.  A template has been created as well as a plug an play script (included with the 0810 beta 2 release.&lt;br /&gt;
&lt;br /&gt;
The Template (2030) supports Olevia LCD TVs with an ATI Image Processor (2XXT and 5XXT) as well as possibly others.  This was developed and tested on a 232T.&lt;br /&gt;
&lt;br /&gt;
==Inputs==&lt;br /&gt;
The model used for development (232T) has:&amp;lt;br&amp;gt;&lt;br /&gt;
1 HDMI (w/HDCP)&amp;lt;br&amp;gt;&lt;br /&gt;
1 VGA&amp;lt;br&amp;gt;&lt;br /&gt;
1 Component&amp;lt;br&amp;gt;&lt;br /&gt;
1 S-Video&amp;lt;br&amp;gt;&lt;br /&gt;
1 Composite&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ruby Codes==&lt;br /&gt;
&lt;br /&gt;
Here are the official codes from olevia for the 2xxT series.  Olevia emailed me and told me that these codes should work for the 227V, 232V, and the 232T.  Perhaps others as well, but those three for certain.  [http://64.168.125.216/jsp/rs232/files/ATI_240_RS232_27_&amp;amp;_32_Inch.pdf pdf]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Power&lt;br /&gt;
#193 OFF&lt;br /&gt;
     log(&#039;Turning Off&#039;)&amp;lt;br&amp;gt;&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x27\x00\xEA&amp;quot;$&amp;gt;&lt;br /&gt;
#192 ON&lt;br /&gt;
     log(&#039;Turning On&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x27\x01\xEB&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inputs&lt;br /&gt;
#712 Component 1&lt;br /&gt;
     log(&#039;Switching Input to Component 1&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x26\x08\xF1&amp;quot;$&amp;gt;&lt;br /&gt;
#361 HDMI&lt;br /&gt;
     log(&#039;Switching Input to HDMI&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x26\x0C\xF5&amp;quot;$&amp;gt;&lt;br /&gt;
#769 PC&lt;br /&gt;
     log(&#039;Switching Input to PC&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x26\x0A\xF3&amp;quot;$&amp;gt;&lt;br /&gt;
#180 Svideo&lt;br /&gt;
     log(&#039;Switching Input to Svideo&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x26\x05\xEE&amp;quot;$&amp;gt;&lt;br /&gt;
#166 Tuner&lt;br /&gt;
     log(&#039;Switching Input to Tuner&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x26\x00\xE9&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aspect Ratios&lt;br /&gt;
#953 Toggle Aspect Ratio&lt;br /&gt;
     log(&#039;Toggling Aspect Ratio&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x56\x3E&amp;quot;$&amp;gt; &lt;br /&gt;
&lt;br /&gt;
General    &lt;br /&gt;
#190 Enter/Go&lt;br /&gt;
     log(&#039;Enter Key&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x1B\x03&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Internal&lt;br /&gt;
#373 Private Method Listing&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;
&lt;br /&gt;
Numbers&lt;br /&gt;
#204 0&lt;br /&gt;
     log(&#039;Sending 0&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x10\xF8&amp;quot;$&amp;gt;&lt;br /&gt;
#205 1&lt;br /&gt;
     log(&#039;Sending 1&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x11\xF9&amp;quot;$&lt;br /&gt;
#206 2&lt;br /&gt;
     log(&#039;Sending 2&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x12\xFA&amp;quot;$&amp;gt;&lt;br /&gt;
#207 3&lt;br /&gt;
     log(&#039;Sending 3&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x13\xFB&amp;quot;$&amp;gt;&lt;br /&gt;
#208 4&lt;br /&gt;
     log(&#039;Sending 4&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x14\xFC&amp;quot;$&amp;gt;&lt;br /&gt;
#209 5&lt;br /&gt;
     log(&#039;Sending 5&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x15\xFD&amp;quot;$&amp;gt;&lt;br /&gt;
#210 6&lt;br /&gt;
     log(&#039;Sending 6&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x16\xFE&amp;quot;$&amp;gt;&lt;br /&gt;
#211 7&lt;br /&gt;
     log(&#039;Sending 7&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x17\xFF&amp;quot;$&amp;gt;&lt;br /&gt;
#212 8&lt;br /&gt;
     log(&#039;Sending 8&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x18\x00&amp;quot;$&amp;gt;&lt;br /&gt;
#213 9&lt;br /&gt;
     log(&#039;Sending 9&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x19\x01&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On-Screen Menu Navig&lt;br /&gt;
#225 Display&lt;br /&gt;
     log(&#039;Selecting Display &#039;) &lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x1E\x06&amp;quot;$&amp;gt;&lt;br /&gt;
#86  Menu (Show Menu&lt;br /&gt;
     log(&#039;Seleting Menu&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x04\xEC&amp;quot;$&amp;gt;&lt;br /&gt;
#201 Move Down&lt;br /&gt;
     log(&#039;Move Down&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x4A\x32&amp;quot;$&amp;gt;&lt;br /&gt;
#202 Move Left&lt;br /&gt;
     log(&#039;Move Left&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x0A\xF2&amp;quot;$&amp;gt;&lt;br /&gt;
#203 Move Right&lt;br /&gt;
     log(&#039;Move Right&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x07\xEF&amp;quot;$&amp;gt;&lt;br /&gt;
#200 Move Up&lt;br /&gt;
     log(&#039;Move Up&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x45\x2D&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Simple Control&lt;br /&gt;
#64  Skip Back - Channel/Track Lower&lt;br /&gt;
     log(&#039;Channel Down&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x01\xE9&amp;quot;$&amp;gt;&lt;br /&gt;
#63  Skip Fwd - Channel/Track Greater&lt;br /&gt;
     log(&#039;Channel Up&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x00\xE8&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volume&lt;br /&gt;
#97  Mute&lt;br /&gt;
     log(&#039;Mute&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x09\xF1&amp;quot;$&amp;gt;&lt;br /&gt;
#90  Vol Down&lt;br /&gt;
     log(&#039;Volume Down&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x03\xEB&amp;quot;$&amp;gt;&lt;br /&gt;
#89  Vol Up&lt;br /&gt;
     log(&#039;Volume Up&#039;)&lt;br /&gt;
     &amp;lt;$&amp;quot;\xBE\x05\x25\x03\xEA&amp;quot;$&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PNP Script==&lt;br /&gt;
&lt;br /&gt;
The following script will automatically detect this TV.  Note that after a firmware upgrade, the TV used to test this implementation gives an intermittent response when querried by the PNP script.  This sometimes causes the script to miss this TV in configuration and require a manual addition of this device.&lt;br /&gt;
&lt;br /&gt;
The script is 20_OleviaTV_ATI.sh&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#Play and Play script for Olevia TV&#039;s Models Numbers:2XXT/5XXT Possibly more&lt;br /&gt;
#Power Up is very slow so it requires several seconds to get feedback&lt;br /&gt;
#Device Template Number:2030 on my local Machine.&lt;br /&gt;
&lt;br /&gt;
#The TV only responds to the &amp;quot;Power Status Query&amp;quot; command when the power is on, so we&#039;ll send the Power On command first, then sent the Query command.&lt;br /&gt;
#We give it a delay to allow the TV to power up&lt;br /&gt;
echo &amp;quot;Olevia TV (ATI) Detection script queue $2&amp;quot;&lt;br /&gt;
/usr/pluto/bin/TestSerialPort -p $3 -P N81 -b 115200 -t &amp;quot;\BE\05\27\01\EB&amp;quot; -i 8&lt;br /&gt;
echo &amp;quot;Waiting for powerup&amp;quot;&lt;br /&gt;
#Now query to check for the TV power status reply&lt;br /&gt;
/usr/pluto/bin/TestSerialPort -p $3 -P N81 -b 115200 -t &amp;quot;\BE\05\90\00\53&amp;quot; -i 1 -s &amp;quot;\06\05\90\01\9C&amp;quot;&lt;br /&gt;
if [[ &amp;quot;$?&amp;quot; -ne 0 ]]; then&lt;br /&gt;
echo &amp;quot;It&#039;s not an Olevia TV (ATI)&amp;quot;&lt;br /&gt;
/usr/pluto/bin/MessageSend dcerouter -r 0 $1 1 806 224 $2 13 &amp;quot;$4&amp;quot; 44 0&lt;br /&gt;
else&lt;br /&gt;
echo &amp;quot;It is an Olevia TV (ATI) Template #2030&amp;quot;&lt;br /&gt;
/usr/pluto/bin/MessageSend dcerouter -r 0 $1 1 806 224 $2 13 &amp;quot;$4&amp;quot; 44 2030&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Onkyo_TXSR805&amp;diff=36814</id>
		<title>Onkyo TXSR805</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Onkyo_TXSR805&amp;diff=36814"/>
		<updated>2016-07-07T13:54:45Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[Category:Amps_Receivers]]&lt;br /&gt;
[[category: Audio]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
{{versioninfo}}&lt;br /&gt;
{{stub}}&lt;br /&gt;
[[category: Tutorials]]&lt;br /&gt;
== Using the Onkyo TX-SR805 with RS232 Control ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;THIS CODE IS STILL BEING DEVELOPED&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Future home of the howto for setting up a Onkyo TX-SR805 with RS232 support.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
May widen howto to all Onkyo RS232 Receivers.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This device does currently work with limited functionality.  A writeup for how to add this device to a Linux MCE system will be done soon.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
** If you use this device and have any problems or suggestions to the code here, please switch over to the discussion tab and bring it to my attention **&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Current features supported:&amp;lt;br&amp;gt;&lt;br /&gt;
-On/Off&amp;lt;br&amp;gt;&lt;br /&gt;
-Change inputs&amp;lt;br&amp;gt;&lt;br /&gt;
-Volume control (Up/Down in set increments.  cmd_313 Set Volume still needs work)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Being worked on:&amp;lt;br&amp;gt;&lt;br /&gt;
-Precise Volume Control (cmd_313)&amp;lt;br&amp;gt;&lt;br /&gt;
-Listening Modes&amp;lt;br&amp;gt;&lt;br /&gt;
-Zone 2/3&amp;lt;br&amp;gt;&lt;br /&gt;
-FM Tuner&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;&#039;Ruby Code:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Section: 193 Off&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;$&amp;quot;!1PWR00\r&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 192 On&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;$&amp;quot;!1PWR01\r&amp;quot;$&amp;gt;&lt;br /&gt;
 sleep(2)&lt;br /&gt;
 &amp;lt;$&amp;quot;!AMT00\r&amp;quot;$&amp;gt;&lt;br /&gt;
 @mute = false&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 169 AM&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;$&amp;quot;!1SLI25\r&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 164 Aux&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;$&amp;quot;!1SLI03\r&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 172 Aux 2&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;$&amp;quot;!1SLI04\r&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 162 CD&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;$&amp;quot;!1SLI23\r&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 165 DVD&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;$&amp;quot;!1SLI10\r&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 170 FM&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;$&amp;quot;!1SLI24\r&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 163 Phono&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;$&amp;quot;!1SLI22\r&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 160 Tape / Tape 1&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;$&amp;quot;!1SLI20\r&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 173 Tape 2&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;$&amp;quot;!1SLI21\r&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 166 Tuner&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;$&amp;quot;!1SLI26\r&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 909 XM&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;$&amp;quot;!1SLI31\r&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 373 Private Method Listing&amp;lt;br&amp;gt;&lt;br /&gt;
 # Written by Jason Bennett&lt;br /&gt;
 #&lt;br /&gt;
 # Process 373 - Methods&lt;br /&gt;
 def receiveMsg&lt;br /&gt;
  buff = conn_.Recv(7, 1000) &lt;br /&gt;
  log(&amp;quot;Message Received: #{buff}&amp;quot;)&lt;br /&gt;
  trash = conn_.Recv(1, 100)&lt;br /&gt;
  if buff.length() &amp;lt; 7&lt;br /&gt;
    parsed1 = &amp;quot;ERR&amp;quot;&lt;br /&gt;
    parsed2 = &amp;quot;00&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    parsed2 = buff[5..6]&lt;br /&gt;
    parsed1 = buff[2..4]&lt;br /&gt;
    return [parsed1, parsed2]&lt;br /&gt;
  end&lt;br /&gt;
 end&lt;br /&gt;
 #-------------------------------------------- Parsing -----------------------------------------------------------------------------------&lt;br /&gt;
 def chkMsg(cat, opt)&lt;br /&gt;
    case cat&lt;br /&gt;
      # Power&lt;br /&gt;
      when &amp;quot;PWR&amp;quot;&lt;br /&gt;
          cmd = Command.new(device_.devid_, -1001, 1, 2, 48)  # 48 = Power State&lt;br /&gt;
          case opt&lt;br /&gt;
            when &amp;quot;01&amp;quot;&lt;br /&gt;
              cmd.params_[10] = &amp;quot;1&amp;quot;   # Command 48, Param 10: 1 = On&lt;br /&gt;
            when &amp;quot;00&amp;quot;&lt;br /&gt;
              cmd.params_[10] = &amp;quot;0&amp;quot;   # Command 48, Param 10: 2 = Off&lt;br /&gt;
          end&lt;br /&gt;
          SendCommand(cmd)&lt;br /&gt;
      # Master Volume Level&lt;br /&gt;
      when &amp;quot;MVL&amp;quot;&lt;br /&gt;
        cmd = Command.new(device_.devid_, -1001, 1, 2, 71)   # 71 = Volume&lt;br /&gt;
        cmd.params_[30] = opt.hex.to_s # Command 71, Param 16 = Volume Level in Decimal&lt;br /&gt;
        log(&amp;quot;volume reported as: #{opt.hex}&amp;quot;)&lt;br /&gt;
        SendCommand(cmd)&lt;br /&gt;
      # Input Selection&lt;br /&gt;
      when &amp;quot;SLI&amp;quot;&lt;br /&gt;
        cmd = Command.new(device_.devid_, -1001, 1, 2, 49)    # 49 = Input Selection&lt;br /&gt;
        case opt&lt;br /&gt;
          when &amp;quot;00&amp;quot;&lt;br /&gt;
            input_param = 316&lt;br /&gt;
          when &amp;quot;01&amp;quot;&lt;br /&gt;
            input_param = 317&lt;br /&gt;
          when &amp;quot;02&amp;quot;&lt;br /&gt;
            input_param = 318&lt;br /&gt;
          when &amp;quot;03&amp;quot;&lt;br /&gt;
            input_param = 164&lt;br /&gt;
          when &amp;quot;04&amp;quot;&lt;br /&gt;
            input_param = 172&lt;br /&gt;
          when &amp;quot;10&amp;quot;&lt;br /&gt;
            input_param = 165&lt;br /&gt;
          when &amp;quot;20&amp;quot;&lt;br /&gt;
            input_param = 160&lt;br /&gt;
          when &amp;quot;22&amp;quot;&lt;br /&gt;
            input_param = 163&lt;br /&gt;
          when &amp;quot;23&amp;quot;&lt;br /&gt;
            input_param = 162&lt;br /&gt;
          when &amp;quot;24&amp;quot;&lt;br /&gt;
            input_param = 170&lt;br /&gt;
          when &amp;quot;25&amp;quot;&lt;br /&gt;
            input_param = 169&lt;br /&gt;
          when &amp;quot;26&amp;quot;&lt;br /&gt;
            input_param = 166&lt;br /&gt;
          when &amp;quot;31&amp;quot;&lt;br /&gt;
            input_param = 909&lt;br /&gt;
        end&lt;br /&gt;
        cmd.params_[41] = input_param.to_s  # Command 49, Param 41 = Input&lt;br /&gt;
        SendCommand(cmd)&lt;br /&gt;
    end&lt;br /&gt;
 end&lt;br /&gt;
 #-------------------------------------------- Logging -----------------------------------------------------------------------------------&lt;br /&gt;
 def log(line)&lt;br /&gt;
  $log = File.open(&amp;quot;/var/log/pluto/#{device_.devid_}_Generic_Serial_Device.log&amp;quot;, &amp;quot;a&amp;quot;)&lt;br /&gt;
  $log.puts &amp;quot;(***):#{line}&amp;quot;&lt;br /&gt;
  $log.close&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 350 Process Incoming Data&amp;lt;br&amp;gt;&lt;br /&gt;
 # Written by Jason Bennett&lt;br /&gt;
 #&lt;br /&gt;
 # Process 350 - Incoming&lt;br /&gt;
 incMsg = receiveMsg()&lt;br /&gt;
 log(&amp;quot;New Msg: #{incMsg[0]}:#{incMsg[1]}&amp;quot;)&lt;br /&gt;
 chkMsg(incMsg[0], incMsg[1])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 355 Process Initialize&amp;lt;br&amp;gt;&lt;br /&gt;
 #31-May-06 14:13 init  Onkyo Receiver&lt;br /&gt;
 initok=false&lt;br /&gt;
 for iRetry in 0...4&lt;br /&gt;
    print &amp;quot;Initializing unit\n&amp;quot;&lt;br /&gt;
      conn_.Send(&amp;quot;!1PWRQSTN\r&amp;quot;)&lt;br /&gt;
    buf = conn_.Recv(200, 1000)&lt;br /&gt;
    if !buf.nil? &amp;amp;&amp;amp; buf.include?(&amp;quot;PWR0&amp;quot;)&lt;br /&gt;
        print &amp;quot;Initialized ok\n&amp;quot;&lt;br /&gt;
                initok=true&lt;br /&gt;
                break&lt;br /&gt;
        else&lt;br /&gt;
                print &amp;quot;Didn&#039;t respond to command\n&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
 end&lt;br /&gt;
 if initok==false&lt;br /&gt;
        DisableDevice( device_.devid_, true )&lt;br /&gt;
        print &amp;quot;The device wouldn&#039;t respond. Disabling it.\n&amp;quot;&lt;br /&gt;
        return&lt;br /&gt;
 end&lt;br /&gt;
 print &amp;quot;Initialized ok, doing log\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 97 Mute&amp;lt;br&amp;gt;&lt;br /&gt;
 if(@mute)&lt;br /&gt;
  &amp;lt;$&amp;quot;!1AMT00\r&amp;quot;$&amp;gt;&lt;br /&gt;
 else&lt;br /&gt;
  &amp;lt;$&amp;quot;!1AMT01\r&amp;quot;$&amp;gt;&lt;br /&gt;
 end&lt;br /&gt;
 @mute=!@mute&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 313 Set Volume&amp;lt;br&amp;gt;&lt;br /&gt;
 slevel = &amp;quot;%x&amp;quot; % level.to_i&lt;br /&gt;
 &amp;lt;$&amp;quot;!1MVL&amp;quot; + slevel + &amp;quot;\r&amp;quot;$&amp;gt;&lt;br /&gt;
 SetDeviceDataInDB( device_.devid_, 158, level ) # 158 = DEVICEDATA_Volume_Level_CONST&lt;br /&gt;
 print &amp;quot;volume and corresponding device data set\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 90 Vol Down&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;$&amp;quot;!1MVLDOWN\r&amp;quot;$&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Section: 89 Vol Up&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;$&amp;quot;!1MVLUP\r&amp;quot;$&amp;gt;&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_355&amp;diff=36813</id>
		<title>Insteon PLM Ruby Code 355</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_355&amp;diff=36813"/>
		<updated>2016-07-07T13:53:13Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#### #355 Process Initialize ####&lt;br /&gt;
$red = 0x1b.chr + &#039;[31m&#039;&lt;br /&gt;
$green = 0x1b.chr + &#039;[32m&#039;&lt;br /&gt;
$yellow = 0x1b.chr + &#039;[33m&#039;&lt;br /&gt;
$blue = 0x1b.chr + &#039;[34m&#039;&lt;br /&gt;
$purple = 0x1b.chr + &#039;[35m&#039;&lt;br /&gt;
$aqua = 0x1b.chr + &#039;[36m&#039;&lt;br /&gt;
$grey = 0x1b.chr + &#039;[37m&#039;&lt;br /&gt;
$redBack = 0x1b.chr + &#039;[41m&#039;&lt;br /&gt;
$greenBack = 0x1b.chr + &#039;[42m&#039;&lt;br /&gt;
$yellowBack = 0x1b.chr + &#039;[43m&#039;&lt;br /&gt;
$blueBack = 0x1b.chr + &#039;[44m&#039;&lt;br /&gt;
$purpleBack = 0x1b.chr + &#039;[45m&#039;&lt;br /&gt;
$aquaBack = 0x1b.chr + &#039;[46m&#039;&lt;br /&gt;
$greyBack = 0x1b.chr + &#039;[47m&#039;&lt;br /&gt;
$blackBack = 0x1b.chr + &#039;[48m&#039;&lt;br /&gt;
$remoteLinkRecord = &#039;&#039;&lt;br /&gt;
#$remoteRecordReady = 0&lt;br /&gt;
$configstring = &#039;&#039;&lt;br /&gt;
$configparams = []&lt;br /&gt;
$childdatabases = {}&lt;br /&gt;
$newdevices = {}&lt;br /&gt;
$state = {}&lt;br /&gt;
$devicetemplate = {}&lt;br /&gt;
$plmdatabase = []&lt;br /&gt;
$plmlastrecord = true&lt;br /&gt;
$log = &#039;&#039;&lt;br /&gt;
$cmdTo = &#039;&#039;&lt;br /&gt;
$cmdFrom = &#039;&#039;&lt;br /&gt;
$cmdPriority = &#039;&#039;&lt;br /&gt;
$cmdType = &#039;&#039;&lt;br /&gt;
$cmdID = &#039;&#039;&lt;br /&gt;
$cmdParams = {}&lt;br /&gt;
$children = {}&lt;br /&gt;
$recvbuff = &#039;&#039;&lt;br /&gt;
$wAIT = false&lt;br /&gt;
$currentCmd = {}&lt;br /&gt;
$flagsBroadcastMessage = 128&lt;br /&gt;
$flagsDirectMessage = 0&lt;br /&gt;
$flagsAckDirectMessage = 32&lt;br /&gt;
$flagsNackDirectMessage = 160&lt;br /&gt;
$flagsGroupBroadcaseMessage = 192&lt;br /&gt;
$flagsGroupCleanupDirectMessage = 64&lt;br /&gt;
$flagsGroupAckDirectMessage =96&lt;br /&gt;
$flagsGroupNackDirectMessage = 224&lt;br /&gt;
$cmdqueue = []&lt;br /&gt;
$currentcmd = 0 # to save state of command when receiving more data.&lt;br /&gt;
$resetNext = 0 # used in Process IDLE to trap stalled responses.&lt;br /&gt;
$savedstate = nil&lt;br /&gt;
$dcequeue = []&lt;br /&gt;
$rerun = false&lt;br /&gt;
$reported = false&lt;br /&gt;
$X10HouseCodes = {&lt;br /&gt;
  &#039;6&#039;, &#039;A&#039;,&lt;br /&gt;
  &#039;E&#039;, &#039;B&#039;, &lt;br /&gt;
  &#039;2&#039;, &#039;C&#039;, &lt;br /&gt;
  &#039;A&#039;, &#039;D&#039;, &lt;br /&gt;
  &#039;1&#039;, &#039;E&#039;, &lt;br /&gt;
  &#039;9&#039;, &#039;F&#039;, &lt;br /&gt;
  &#039;5&#039;, &#039;G&#039;, &lt;br /&gt;
  &#039;D&#039;, &#039;H&#039;, &lt;br /&gt;
  &#039;7&#039;, &#039;I&#039;, &lt;br /&gt;
  &#039;F&#039;, &#039;J&#039;, &lt;br /&gt;
  &#039;3&#039;, &#039;K&#039;, &lt;br /&gt;
  &#039;B&#039;, &#039;L&#039;, &lt;br /&gt;
  &#039;0&#039;, &#039;M&#039;, &lt;br /&gt;
  &#039;8&#039;, &#039;N&#039;, &lt;br /&gt;
  &#039;4&#039;, &#039;O&#039;, &lt;br /&gt;
  &#039;C&#039;, &#039;P&#039;}&lt;br /&gt;
$X10UnitCodes = {&lt;br /&gt;
  &#039;6&#039;, &#039;1&#039;, &lt;br /&gt;
  &#039;E&#039;, &#039;2&#039;, &lt;br /&gt;
  &#039;2&#039;, &#039;3&#039;, &lt;br /&gt;
  &#039;A&#039;, &#039;4&#039;, &lt;br /&gt;
  &#039;1&#039;, &#039;5&#039;, &lt;br /&gt;
  &#039;9&#039;, &#039;6&#039;, &lt;br /&gt;
  &#039;5&#039;, &#039;7&#039;, &lt;br /&gt;
  &#039;D&#039;, &#039;8&#039;, &lt;br /&gt;
  &#039;7&#039;, &#039;9&#039;, &lt;br /&gt;
  &#039;F&#039;, &#039;10&#039;, &lt;br /&gt;
  &#039;3&#039;, &#039;11&#039;, &lt;br /&gt;
  &#039;B&#039;, &#039;12&#039;, &lt;br /&gt;
  &#039;0&#039;, &#039;13&#039;, &lt;br /&gt;
  &#039;8&#039;, &#039;14&#039;, &lt;br /&gt;
  &#039;4&#039;, &#039;15&#039;, &lt;br /&gt;
  &#039;C&#039;, &#039;16&#039;}&lt;br /&gt;
$X10CommandCodes = {&lt;br /&gt;
  &#039;6&#039;, &#039;All Lights Off&#039;, &lt;br /&gt;
  &#039;E&#039;, &#039;Status = off&#039;,&lt;br /&gt;
  &#039;2&#039;, &#039;On&#039;, &lt;br /&gt;
  &#039;A&#039;, &#039;Pre-Set Dim&#039;,&lt;br /&gt;
  &#039;1&#039;, &#039;All Lights On&#039;, &lt;br /&gt;
  &#039;9&#039;, &#039;Hail Ack&#039;,&lt;br /&gt;
  &#039;5&#039;, &#039;Bright&#039;, &lt;br /&gt;
  &#039;D&#039;, &#039;Status=on&#039;,&lt;br /&gt;
  &#039;7&#039;, &#039;Extended Code&#039;,&lt;br /&gt;
  &#039;F&#039;, &#039;Status Request&#039;,&lt;br /&gt;
  &#039;3&#039;, &#039;Off&#039;, &lt;br /&gt;
  &#039;B&#039;, &#039;Pre-set Dim&#039;, &lt;br /&gt;
  &#039;0&#039;, &#039;All Units Off&#039;, &lt;br /&gt;
  &#039;8&#039;, &#039;Hail Request&#039;, &lt;br /&gt;
  &#039;4&#039;, &#039;Dim&#039;, &lt;br /&gt;
  &#039;C&#039;, &#039;Extended Data(analog)&#039;}&lt;br /&gt;
$responseString = &#039;&amp;lt;&#039; + &#039;/&#039; + &#039;Response&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
############################## TEST Code below #################################&lt;br /&gt;
# testing Reading a devices Database&lt;br /&gt;
#	Common Insteon Device Memory Locations:&lt;br /&gt;
#	0x0001 EESize - MSB of size of EEPROM chip in device&lt;br /&gt;
#	0x0002 EEVersion - Firmware Revision number&lt;br /&gt;
#	0x0020 EEOnLevel - Preset On-Level for lighting control&lt;br /&gt;
#	0x0021 EERampRate - Ramp Rate for Lighting Control&lt;br /&gt;
#	0x0030 EEX10BaseHouse - Base X10 House Code for device&lt;br /&gt;
#	0x0031 EEX10BaseUnit - Base X10 Unit Code for device&lt;br /&gt;
#	&lt;br /&gt;
#	ALDB/L&lt;br /&gt;
#	Starts at the top of external serial eeprom and grows downward.&lt;br /&gt;
#	most limited-memory INSTEON devices, top of memory is 0x0FFF&lt;br /&gt;
#	Each Record is 8 bytes long, so the first record starts at&lt;br /&gt;
#	0x0FF8, the second record starts at 0x0FF0&lt;br /&gt;
#&lt;br /&gt;
#	ALDB/L Record Format:&lt;br /&gt;
#	Record Control:	1 byte&lt;br /&gt;
#	Group:		1 Byte&lt;br /&gt;
#	ID:		3 Bytes HB MB LB&lt;br /&gt;
#	Data1:		1 Byte Link-specific data (eg. On-Level)&lt;br /&gt;
#	Data2:		1 Byte Link specific data (eg. Ramp Rates)&lt;br /&gt;
#	Data3:		1 Byte Link specific data (normally unused)&lt;br /&gt;
#&lt;br /&gt;
#	Record Control Byte Bitmap:&lt;br /&gt;
#	7: 1=Record in use, 0=Record is available&lt;br /&gt;
#	6: 1=Controller of ID, 0=Responder of ID&lt;br /&gt;
#	5: Product Dependant&lt;br /&gt;
#	4: Product Dependant&lt;br /&gt;
#	3: Product Dependant&lt;br /&gt;
#	2: Product Dependant&lt;br /&gt;
#	1: 1=Record has been used before, 0=High water mark (last record)&lt;br /&gt;
#	0: Reserved&lt;br /&gt;
#PLM cat 03 subcat 05&lt;br /&gt;
# param = {&#039;Command&#039; =&amp;gt; &#039;StLnk&#039;,&lt;br /&gt;
#&#039;Parameter1&#039; =&amp;gt; &#039;01&#039;, #Link code 0x01=controller&lt;br /&gt;
#&#039;Parameter2&#039; =&amp;gt; &#039;8F&#039; #All Link Group&lt;br /&gt;
#}&lt;br /&gt;
#$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
# param = {&#039;Command&#039; =&amp;gt; &#039;CancelLnk&#039;}&lt;br /&gt;
#$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
#SndIns()&lt;br /&gt;
#&lt;br /&gt;
#Lets try the Assign to ALL-Link Group ### SUCCESS!!!&lt;br /&gt;
#param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
#&#039;Parameter1&#039; =&amp;gt; &#039;0A&#039;, #HB&lt;br /&gt;
#&#039;Parameter2&#039; =&amp;gt; &#039;8F&#039;, #MB&lt;br /&gt;
#&#039;Parameter3&#039; =&amp;gt; &#039;5A&#039;, #LB&lt;br /&gt;
#&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;, #Flags&lt;br /&gt;
#&#039;Parameter5&#039; =&amp;gt; &#039;01&#039;, #Cmd1&lt;br /&gt;
#&#039;Parameter6&#039; =&amp;gt; &#039;8F&#039; #Cmd2&lt;br /&gt;
#}&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
#param = {&#039;Command&#039; =&amp;gt; &#039;MngLnk&#039;,&lt;br /&gt;
#&#039;Parameter1&#039; =&amp;gt; &#039;00&#039;, # Control Code &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; &#039;0A&#039;, #HB&lt;br /&gt;
#&#039;Parameter5&#039; =&amp;gt; &#039;97&#039;, #MB&lt;br /&gt;
#&#039;Parameter6&#039; =&amp;gt; &#039;0B&#039;, #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;00&#039;} #Link Data 3 not used&lt;br /&gt;
#$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
## Test Device: LampLinc ID:0A.97.0B&lt;br /&gt;
# Assign Test device to Group&lt;br /&gt;
#param = {&#039;Command&#039; =&amp;gt; &#039;SndIns&#039;,&lt;br /&gt;
#&#039;Parameter1&#039; =&amp;gt; &#039;0A&#039;, #HB&lt;br /&gt;
#&#039;Parameter2&#039; =&amp;gt; &#039;97&#039;, #MB&lt;br /&gt;
#&#039;Parameter3&#039; =&amp;gt; &#039;0B&#039;, #LB&lt;br /&gt;
#&#039;Parameter4&#039; =&amp;gt; &#039;0F&#039;, #Flags&lt;br /&gt;
#&#039;Parameter5&#039; =&amp;gt; &#039;01&#039;, #Cmd1&lt;br /&gt;
#&#039;Parameter6&#039; =&amp;gt; &#039;01&#039; #Cmd2&lt;br /&gt;
#}&lt;br /&gt;
#$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
############################## Real Code below #################################&lt;br /&gt;
log(&#039;MY DEVICE:&#039; + device_.devid_.to_s)&lt;br /&gt;
&lt;br /&gt;
#################################################&lt;br /&gt;
#What I need to do and the order I need to do it.&lt;br /&gt;
#done	read PLM database&lt;br /&gt;
#done	get child devices&lt;br /&gt;
#done	read child devices configuration&lt;br /&gt;
#done1	all child devices in the PLM database?&lt;br /&gt;
#done	if not, add their ID to the PLM database (new group numbers?)&lt;br /&gt;
#	get the status of each (child) device&lt;br /&gt;
#	compare the Database delta with the value stored in the configuration&lt;br /&gt;
#		Different?&lt;br /&gt;
#			read the child database &lt;br /&gt;
#			update configuration&lt;br /&gt;
#			check devices links to see if any are new&lt;br /&gt;
#			new link found, what to do?? send a message?&lt;br /&gt;
#				create new child device?&lt;br /&gt;
#				PING the new device and back to 1&lt;br /&gt;
###&lt;br /&gt;
# easiest way?.. create hash for PLM records&lt;br /&gt;
# 		create hash for child devices is needed &lt;br /&gt;
#		(not needed if DBDelta is same)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#reset the PLM&lt;br /&gt;
$timeout = 3&lt;br /&gt;
#param = {&#039;Command&#039; =&amp;gt; &#039;RstPLM&#039;}&lt;br /&gt;
#$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
#SndIns()&lt;br /&gt;
&lt;br /&gt;
#put IM in monitor mode..&lt;br /&gt;
param = {&#039;Command&#039; =&amp;gt; &#039;SetCfg&#039;, &#039;Parameter1&#039; =&amp;gt; &#039;40&#039;}&lt;br /&gt;
$cmdqueue &amp;lt;&amp;lt; param&lt;br /&gt;
SndIns()&lt;br /&gt;
mainStart()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
##children found... get the status of each child...&lt;br /&gt;
#$children.each_key{|c|&lt;br /&gt;
#	if c.length &amp;gt; 2 #filter out X10 for now&lt;br /&gt;
#	  	#pack insteon message here, and send it out!&lt;br /&gt;
#		# receive message in parsemessage and relay commands back in it.&lt;br /&gt;
#		insteonID = c.chomp.split(&#039;.&#039;)&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;, #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;
## below gets the device Cat/SubCat/Firmware&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;, #flags&lt;br /&gt;
#		&#039;Parameter5&#039; =&amp;gt; &#039;10&#039;, #PING&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;
#&lt;br /&gt;
#	end&lt;br /&gt;
#	}&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_351&amp;diff=36812</id>
		<title>Insteon PLM Ruby Code 351</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_351&amp;diff=36812"/>
		<updated>2016-07-07T13:52:24Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&amp;lt;pre&amp;gt;#### Written by Dan Damron&lt;br /&gt;
#### #351 Process IDLE ####&lt;br /&gt;
############################ RECEIVE Error Trap ###########################&lt;br /&gt;
if  $cmdqueue.length != 0&lt;br /&gt;
  if $resetNext != 0&lt;br /&gt;
    log($red + &#039;receive timeout=&#039;+$resetNext.to_s + $grey)&lt;br /&gt;
  end&lt;br /&gt;
  if $cmdqueue.to_s == $savedstate&lt;br /&gt;
    if $resetNext == $timeout&lt;br /&gt;
	if $attempts == 2 then&lt;br /&gt;
		#Third attempt.. fail the command.&lt;br /&gt;
		log(&#039;Third attempt, Failing Command!&#039;)&lt;br /&gt;
		$recvbuff = &#039;&#039;&lt;br /&gt;
		$currentcmd = 0&lt;br /&gt;
		$attempts = 0&lt;br /&gt;
                #Here, I should remove the child&lt;br /&gt;
                removecurrentcommand&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	else&lt;br /&gt;
	      #Command has stalled. Reset wait flag and resend command.&lt;br /&gt;
	      log(&#039;Command Stalled!  resetting and retrying&#039;)&lt;br /&gt;
&lt;br /&gt;
	      log(&#039;Current Command:&#039; + $currentcmd.to_s)&lt;br /&gt;
	      $recvbuff = &#039;&#039;&lt;br /&gt;
	      $currentcmd = 0&lt;br /&gt;
	      $attempts += 1&lt;br /&gt;
	      #hack to reset the command&lt;br /&gt;
	      if $cmdqueue[0][&#039;Command&#039;] == &#039;InsStdMsg&#039;&lt;br /&gt;
	        $cmdqueue[0][&#039;Command&#039;] = &#039;SndIns&#039;&lt;br /&gt;
	      end&lt;br /&gt;
	end&lt;br /&gt;
      $wAIT = false&lt;br /&gt;
      $resetNext = 0&lt;br /&gt;
      SndIns()&lt;br /&gt;
    else&lt;br /&gt;
      $resetNext +=1&lt;br /&gt;
    end&lt;br /&gt;
  else&lt;br /&gt;
    $resetNext = 0&lt;br /&gt;
    $savedstate = $cmdqueue.to_s&lt;br /&gt;
    $attempts = 0&lt;br /&gt;
  end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[category: Insteon]]&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=LG_42LB5D&amp;diff=36811</id>
		<title>LG 42LB5D</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=LG_42LB5D&amp;diff=36811"/>
		<updated>2016-07-07T13:51:45Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
{{Versioninfo}}&lt;br /&gt;
[[Category: Video]]&lt;br /&gt;
[[Category: Displays]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
&lt;br /&gt;
 {| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
==Features==&lt;br /&gt;
===Basics===&lt;br /&gt;
* 42&amp;quot; (diagonal) [[16:9|widescreen]] [[LCD]] television&lt;br /&gt;
* Good build quality on the whole, though some edges on the plastic casing were left &amp;quot;sharp&amp;quot; (I&#039;m OCD about fit and finish)&lt;br /&gt;
* Not that heavy for its size (one person can lift it, in or out of packing carton)&lt;br /&gt;
Special features and nice touches:&lt;br /&gt;
* [[RS232 port]] at the back to allow external control (by LinuxMCE for example)&lt;br /&gt;
* Power LED is red on standby, and switches to green when set is on (thank goodness, blue-LED fever is abating! :-)&lt;br /&gt;
* Brightness can be instantly adjusted via two remote buttons -- the only thing better would be a photosensor that adjusts things automatically for ambient light (but that&#039;s what hacking is all about ;-)&lt;br /&gt;
===Picture fidelity===&lt;br /&gt;
* Crisp picture when provided with full quality source (e.g. true HD)&lt;br /&gt;
* Crisp picture with some ghosting when using the RGB-PC input with a standard (though longer than average) VGA video cable -- I will try to add a photo of the effect; the lowest-tech connections ([[S-Video]], RF, and the like) for PC video are NOT recommended!&lt;br /&gt;
* A touch blurry with low-end sources ([[S-Video]], RF) like older game systems, but still a fairly good overall picture; I have yet to test other signal methods with my game systems (requires special cables I don&#039;t yet have).&lt;br /&gt;
===Usability===&lt;br /&gt;
* The [[OSD]] UI and remote are excellent.  Both the menus and the buttons are laid out sensibly, and the system incorporates a great idea for settings that are cyclic (most are): the first time you press a button (e.g. [[aspect ratio]]), it brings up an [[OSD]] reminder of the current setting; subsequent presses will cycle through the available options.  It&#039;s simple, and effective at preventing accidental setting changes by a single inadvertent button press on the remote.&lt;br /&gt;
Resolutions:&lt;br /&gt;
* 1024x768&lt;br /&gt;
* 1280x768&lt;br /&gt;
* 1360x768&lt;br /&gt;
 &lt;br /&gt;
== Adding new template ==&lt;br /&gt;
Here is a description of adding a Template for LG LCD TV with serial connections for control.  According to the manual the following models should work:&lt;br /&gt;
LCD TV MODELS 37LB5D / 42LB5D / 47LB5D 52LB5D/ 32LB4D / 37LB4D / 42LB4D&lt;br /&gt;
I have the 42LB5D, so I know that this one works. &lt;br /&gt;
&lt;br /&gt;
=== Specify device data and parameters ===&lt;br /&gt;
&lt;br /&gt;
On the LinuxMCE admin website go to: Advanced &amp;gt; Configuration &amp;gt; Device Templates&lt;br /&gt;
&lt;br /&gt;
Select: Manufacturer &#039;LG&#039;, Device Category &#039;TVs/Plasmas/LCD&#039;s/Projectors&#039; and press &#039;Add device template&#039;&lt;br /&gt;
&lt;br /&gt;
 Description : XXLB4/5D&lt;br /&gt;
 Implements DCE : yes&lt;br /&gt;
 Command line : Generic_Serial_Device&lt;br /&gt;
 Device Category  AV TVs/Plasmas/Projection... #77&lt;br /&gt;
 Manufacturer LG&lt;br /&gt;
&lt;br /&gt;
Also have added following parameters (You need to add them one by one under the header &#039;Device data&#039;):&lt;br /&gt;
&lt;br /&gt;
 Device data&lt;br /&gt;
 Current Data 	                                    Comments 	                    Default Value&lt;br /&gt;
 #37 COM Port on PC(string) 	              The serial port 						&lt;br /&gt;
 #76 COM Port ParityBit/Stop(string) 	      Parity/Stop bits (factory defaults) 	N81 		&lt;br /&gt;
 #78 COM Port BaudRate(string)                Baud rate (factory default) 	        B9600 		&lt;br /&gt;
 #157 Discrete Volume(bool) 	              Indicates if the volume on...             1 &lt;br /&gt;
&lt;br /&gt;
Settings are factory defaults and shouldn&#039;t be changed (9600 baud rate, 8 bits, 1 stop bit).  Make sure that the check box for Allowed to Modify is checked, so that you can change to the appropriate COM port later.&lt;br /&gt;
&lt;br /&gt;
=== &#039;Edit Ruby code&#039; (on template page)  ===&lt;br /&gt;
&lt;br /&gt;
==== &#039;Add/remove commands&#039; ====&lt;br /&gt;
First, I clicked on &#039;Add/remove commands&#039; and clicked on commands that are supported by device...&lt;br /&gt;
&lt;br /&gt;
* Ruby Internal Commands&lt;br /&gt;
* Standard TV&lt;br /&gt;
&lt;br /&gt;
==== &#039;Add Ruby snippets to commands&#039;==== &lt;br /&gt;
Edited corresponding Ruby snippets for each command. Basically those are just simple strings that get send on rs232 to take proper action on device according to received command from LinuxMCE... Use the extended editor for the multiline entries (otherwise ruby won&#039;t understand it and gives lot&#039;s of errors)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#193 Off&lt;br /&gt;
	log(&#039;Sending OFF Command&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;ka 01 00\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#192 On&lt;br /&gt;
	log(&#039;Sending ON Command&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;ka 01 01\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
Inputs&lt;br /&gt;
#419 Antenna&lt;br /&gt;
		&lt;br /&gt;
#316 AV 1&lt;br /&gt;
	log(&#039;Switching Input to AV1&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;kb 01 02\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#317 AV 2&lt;br /&gt;
	log(&#039;Switching Input to AV2&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;kb 01 03\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#712 Component 1&lt;br /&gt;
	log(&#039;Switching Input to Component 1&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;kb 01 04\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#713 Component 2&lt;br /&gt;
	log(&#039;Switching Input to Component 2&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;kb 01 05\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#426 External 3&lt;br /&gt;
	log(&#039;Switching Input to HDMI 3&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;kb 01 09\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#361 HDMI&lt;br /&gt;
	log(&#039;Switching Input to HDMI 1&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;kb 01 07\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#767 HDMI 2&lt;br /&gt;
	log(&#039;Switching Input to HDMI 2&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;kb 01 08\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#376 Input 3&lt;br /&gt;
	log(&#039;Switching Input to HDMI 3&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;kb 01 09\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#154 RGB&lt;br /&gt;
	log(&#039;Switching Input to RGB/PC&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;kb 01 06\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#166 Tuner&lt;br /&gt;
	log(&#039;Switching Input to Analog Tuner&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;kb 01 01\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#873 Tuner - Digital&lt;br /&gt;
	log(&#039;Switching Input to Digital Tuner&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;kb 01 00\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
Aspect Ratios&lt;br /&gt;
#879 16:9&lt;br /&gt;
	log(&#039;Switching Aspect Ratio to 16:9&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;kc 01 02\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#877 4:3&lt;br /&gt;
	log(&#039;Switching Aspect Ratio to 4:3&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;kc 01 01\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
Disk Handle&lt;br /&gt;
#48 Eject Disk&lt;br /&gt;
		&lt;br /&gt;
DSP Modes&lt;br /&gt;
#116 DSP Mode&lt;br /&gt;
	log(&#039;Switching DSP Modes: Toggled Only&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 52\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
General&lt;br /&gt;
#190 Enter/Go&lt;br /&gt;
	log(&#039;Sending Enter/Go Command&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 44\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
Internal&lt;br /&gt;
#373 Private Method Listing&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;
#351 Process IDLE&lt;br /&gt;
		&lt;br /&gt;
#350 Process Incoming Data&lt;br /&gt;
	buff = &#039;&#039;&lt;br /&gt;
        loop do&lt;br /&gt;
          buff=conn_.Recv(30,200)&lt;br /&gt;
          if buff.empty?&lt;br /&gt;
            log(&#039;Nothing Received&#039;)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
          log(&#039;Received: &#039; + Regexp.escape(buff.to_s))&lt;br /&gt;
          if buff.include?(&amp;quot;OK&amp;quot;)&lt;br /&gt;
            log(Regexp.escape(buff.to_s) + &#039;: Command Processed Successfully&#039;)&lt;br /&gt;
          elsif buff.include?(&amp;quot;NG&amp;quot;)&lt;br /&gt;
            log(Regexp.escape(buff.to_s) +&#039;: Command Processed Unsuccessfully&#039;)&lt;br /&gt;
          end&lt;br /&gt;
        end 	&lt;br /&gt;
#355 Process Initialize&lt;br /&gt;
	for iRetry in 0...4&lt;br /&gt;
          print &amp;quot;Initializing unit\n&amp;quot;&lt;br /&gt;
          conn_.Send(&amp;quot;ke 01 01\r&amp;quot;) # Send UnMute Command&lt;br /&gt;
          buf = conn_.Recv(30,200) # Expected Return # ke 01 01\r\ne 00 OK01x\r\n&lt;br /&gt;
          if !buf.nil? &amp;amp;&amp;amp; buf.include?(&amp;quot;OK&amp;quot;)&lt;br /&gt;
            print &amp;quot;Initialized ok\n&amp;quot;&lt;br /&gt;
            print &amp;quot;Setting volume to 30%\n&amp;quot;&lt;br /&gt;
            cmd_313(15)&lt;br /&gt;
            SetDeviceDataInDB( device_.devid_, 158, &amp;quot;15&amp;quot; )&lt;br /&gt;
            # 158 = DEVICEDATA_Volume_Level_CONST&lt;br /&gt;
            return&lt;br /&gt;
          end&lt;br /&gt;
          print &amp;quot;Failed to initialize. Wait 1 secs and try again\n&amp;quot;&lt;br /&gt;
          sleep(1)&lt;br /&gt;
        end&lt;br /&gt;
#DisableDevice( device_.devid_, true )&lt;br /&gt;
#print &amp;quot;The device would not respond. Disabling it.\n&amp;quot; 	&lt;br /&gt;
#384 Process Receive Command For Child&lt;br /&gt;
		&lt;br /&gt;
#356 Process Release&lt;br /&gt;
		&lt;br /&gt;
Misc&lt;br /&gt;
#548 Menu&lt;br /&gt;
	log(&#039;Sending Menu Command&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 43\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#676 Video Mute&lt;br /&gt;
	log(&#039;Sending Video Mute Command&#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;kd 01 00\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
Numbers&lt;br /&gt;
#364 -/--/---&lt;br /&gt;
		&lt;br /&gt;
#204 0&lt;br /&gt;
	log(&#039;Sending 0 &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 10\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#205 1&lt;br /&gt;
	log(&#039;Sending 1 &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 11\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#206 2&lt;br /&gt;
	log(&#039;Sending 2 &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 12\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#207 3&lt;br /&gt;
	log(&#039;Sending 3 &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 13\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#208 4&lt;br /&gt;
	log(&#039;Sending 4 &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 14\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#209 5&lt;br /&gt;
	log(&#039;Sending 5 &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 15\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#210 6&lt;br /&gt;
	log(&#039;Sending 6 &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 16\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#211 7&lt;br /&gt;
	log(&#039;Sending 7 &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 17\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#212 8&lt;br /&gt;
	log(&#039;Sending 8 &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 18\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#213 9&lt;br /&gt;
	log(&#039;Sending 9 &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 19\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#363 Back / Clear Entry&lt;br /&gt;
	log(&#039;Sending Back/Clear Command &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 1A\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
On-Screen Menu Navig&lt;br /&gt;
#240 Back / Prior Menu&lt;br /&gt;
	log(&#039;Sending Exit Command &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 5B\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#225 Display&lt;br /&gt;
		&lt;br /&gt;
#368 Help&lt;br /&gt;
		&lt;br /&gt;
#86 Menu (Show Menu)&lt;br /&gt;
	log(&#039;Sending Menu Command &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 43\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#201 Move Down&lt;br /&gt;
	log(&#039;Sending Move Down Command &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 41\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#202 Move Left&lt;br /&gt;
	log(&#039;Sending Move Left Command &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 07\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#203 Move Right&lt;br /&gt;
	log(&#039;Sending Move RighCommand &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 06\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#200 Move Up&lt;br /&gt;
	log(&#039;Sending Move Up Command &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 40\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
Simple Control&lt;br /&gt;
#92 Pause&lt;br /&gt;
	log(&#039;Sending Pause Command &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 BA\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#139 Play&lt;br /&gt;
	log(&#039;Sending Play Command &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 B0\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#102 Record&lt;br /&gt;
	#log(&#039;Sending Record Command &#039;) &lt;br /&gt;
        #&amp;lt;$&amp;quot;mc 01 BD\r&amp;quot;$&amp;gt; &lt;br /&gt;
#64 Skip Back - Channel/Track Lower&lt;br /&gt;
	log(&#039;Sending Channel Down Command &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 01\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#63 Skip Fwd - Channel/Track Greater&lt;br /&gt;
	log(&#039;Sending Channel Up Command &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 00\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#95 Stop&lt;br /&gt;
	log(&#039;Sending Stop Command &#039;) &lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 B1\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
Sound &amp;amp; Volume&lt;br /&gt;
#97 Mute&lt;br /&gt;
	if @mute&lt;br /&gt;
          &amp;lt;$&amp;quot;ke 01 00\r&amp;quot;$&amp;gt;&lt;br /&gt;
        else&lt;br /&gt;
          &amp;lt;$&amp;quot;ke 01 01\r&amp;quot;$&amp;gt;&lt;br /&gt;
        end&lt;br /&gt;
        @mute=!@mute 	&lt;br /&gt;
#313 Set Volume&lt;br /&gt;
	@volume=level.to_i()&lt;br /&gt;
        ilevel = @volume.to_i&lt;br /&gt;
        log( &#039;setting volume to &#039;+ ilevel.to_s)&lt;br /&gt;
        log(&#039;Sending the Following Command: kf 01 &#039;+ilevel.to_s(16)+&#039;\r&#039;)&lt;br /&gt;
        &amp;lt;$&amp;quot;kf 01 &amp;quot;+ilevel.to_s(16)+&amp;quot;\r&amp;quot;$&amp;gt;&lt;br /&gt;
        SetDeviceDataInDB( device_.devid_, 158, ilevel.to_s)&lt;br /&gt;
        # 158 = DEVICEDATA_Volume_Level_CONST # &amp;quot;volume and corresponding device data set\n&amp;quot; 	&lt;br /&gt;
#90 Vol Down&lt;br /&gt;
	log(&#039;lowering volume from &#039; + @volume.to_s)&lt;br /&gt;
        cmd_313(@volume-1) 	&lt;br /&gt;
#89 Vol Up&lt;br /&gt;
	log(&#039;Increasing volume from &#039; + @volume.to_s)&lt;br /&gt;
        cmd_313(@volume+1) 	&lt;br /&gt;
Speed Ctrl&lt;br /&gt;
#125 Scan Back/Rewind&lt;br /&gt;
	log(&#039;Sending Rewind Command &#039;)&lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 8F\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#93 Scan Fwd/Fast Fwd&lt;br /&gt;
	log(&#039;Sending Fast Fwd Command &#039;)&lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 8E\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
#98 Slow Scan Back&lt;br /&gt;
		&lt;br /&gt;
#99 Slow Scan Forward&lt;br /&gt;
		&lt;br /&gt;
TV&lt;br /&gt;
#136 Previous Channel&lt;br /&gt;
	log(&#039;Sending Previous Channel Command &#039;)&lt;br /&gt;
        &amp;lt;$&amp;quot;mc 01 B2\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
	&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Adding device ==&lt;br /&gt;
&lt;br /&gt;
This is a simple process that you can now add via the [[LinuxMCE Admin Website]] at &#039;&#039;&#039;Wizard &amp;gt; [[AV Devices|A/V Equipment]]&#039;&#039;&#039;&lt;br /&gt;
=== Add device based on created template ===&lt;br /&gt;
Just search for the device template that you created and select it from the list&lt;br /&gt;
=== Specify COM port for it ===&lt;br /&gt;
Just tell LinuxMCE which com port to use.&lt;br /&gt;
=== Assing it to new room ===&lt;br /&gt;
Tell LinuxMCE which room to assign this device&lt;br /&gt;
=== Specifiy Audio pipe connections to inputs on receiver ===&lt;br /&gt;
Tell LinuxMCE how you have thing attached to the LG TV and how the LG TV is attached to the computer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I have it attached via RGB port and I have my cable box attached to AV1 and my HDTV connected to Tuner-Digital input.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Making Plug&amp;amp;Play==&lt;br /&gt;
This is not needed to use the TV, but I post as an option.&lt;br /&gt;
Location: /usr/pluto/pnp&lt;br /&gt;
&lt;br /&gt;
    vi /usr/pluto/pnp/20_LGLCD.sh&lt;br /&gt;
add the following and then make the file executable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; #!/bin/bash&lt;br /&gt;
#Play and Play script for LG TV&#039;s Models Numbers:LGXXLB4/5D&lt;br /&gt;
#Set ID needs to be set to 01&lt;br /&gt;
#Serial feedback is very slow so it requires several seconds to get feedback&lt;br /&gt;
#Device Template Number:1905 on my local Machine.&lt;br /&gt;
#Serail Command for Power On ka 01 01 &lt;br /&gt;
#Serial Command for Power OFF ka 01 00&lt;br /&gt;
#Returns two different strings depending on whether or not the TV is On or Off, so we will try to turn it ON then resend the ON command as it returns proper string (ka 01 01\r\na 00 OK01x\r\n)&lt;br /&gt;
echo &amp;quot;LG TV Detection script queue $2&amp;quot;&lt;br /&gt;
/usr/pluto/bin/TestSerialPort -p $3 -P N81 -b 9600 -t &amp;quot;ka 01 01\r&amp;quot;&lt;br /&gt;
sleep 5s&lt;br /&gt;
/usr/pluto/bin/TestSerialPort -p $3 -P N81 -b 9600 -t &amp;quot;ka 01 01\r&amp;quot; -i 5 -s &amp;quot;OK01x\r&amp;quot;&lt;br /&gt;
if [[ &amp;quot;$?&amp;quot; -ne 0 ]]; then&lt;br /&gt;
echo &amp;quot;It&#039;s not a LG TV&amp;quot;&lt;br /&gt;
/usr/pluto/bin/MessageSend dcerouter -r 0 $1 1 806 224 $2 13 &amp;quot;$4&amp;quot; 44 0&lt;br /&gt;
else&lt;br /&gt;
echo &amp;quot;It is a LG TV&amp;quot;&lt;br /&gt;
/usr/pluto/bin/MessageSend dcerouter -r 0 $1 1 806 224 $2 13 &amp;quot;$4&amp;quot; 44 1905&lt;br /&gt;
fi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the plugin will run the script with 4 parameters: the device id of the plugin, the unique id for this event (the PK_PnpQueue), a path where the device is located (ip address for ethernet devices, serial port for rs232 devices, etc.), and the name of the pnp detection script.&lt;br /&gt;
&lt;br /&gt;
The detection script should attempt to determine what device template is on the path using any appropriate means. If it finds a match, it should fire a message using the paramters it received, such as this:&lt;br /&gt;
&lt;br /&gt;
/usr/pluto/bin/MessageSend dcerouter -r 0 $1 806 224 $2 13 &amp;quot;$4&amp;quot; 44 1905(this is the template id for the devicetemplate you created above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &lt;br /&gt;
&#039;&#039;&#039;== Adapting these instructions for other LG rs232 TVs == ==&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This seems to be a good template for LG TVs with serial ports. Some of the command need to be changed for later models &amp;lt;$xb 01 90\r$&amp;gt; instead of &amp;lt;$kb 01 07\r$&amp;gt; for inputing HDMI 1 for example, but generally a good guide for adapting it to your TV.&lt;br /&gt;
&lt;br /&gt;
The major problem is undocumented above but is critical to making this work: You need to look up the device id number of your LG TV from the Wizard \ Devices \ AV Equipment in the upper left hand corner and replace the number &amp;quot;158&amp;quot; in all the scripts above with this number (for example, in my case 310). This allows the script to process successfully.&lt;br /&gt;
&lt;br /&gt;
Otherwise it will cause a compile error in 7.10 in the &amp;quot;follow log&amp;quot; on the &amp;quot;advanced&amp;quot; link of the A/V device and will not allow your template to run. The compile error will state that it found a &amp;quot;kend&amp;quot; and was expecting &amp;quot;$end&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The code that breaks it is:&lt;br /&gt;
&lt;br /&gt;
----------------------------&lt;br /&gt;
#355 Process Initialize&lt;br /&gt;
   for iRetry in 0...4&lt;br /&gt;
          print &amp;quot;Initializing unit\n&amp;quot;&lt;br /&gt;
          conn_.Send(&amp;quot;ke 01 01\r&amp;quot;) # Send UnMute Command&lt;br /&gt;
          buf = conn_.Recv(30,200) # Expected Return # ke 01 01\r\ne 00 OK01x\r\n&lt;br /&gt;
          if !buf.nil? &amp;amp;&amp;amp; buf.include?(&amp;quot;OK&amp;quot;)&lt;br /&gt;
            print &amp;quot;Initialized ok\n&amp;quot;&lt;br /&gt;
            print &amp;quot;Setting volume to 30%\n&amp;quot;&lt;br /&gt;
            cmd_313(15)&lt;br /&gt;
            SetDeviceDataInDB( device_.devid_, 158, &amp;quot;15&amp;quot; )&lt;br /&gt;
            # 158 = DEVICEDATA_Volume_Level_CONST&lt;br /&gt;
            return&lt;br /&gt;
          end&lt;br /&gt;
          print &amp;quot;Failed to initialize. Wait 1 secs and try again\n&amp;quot;&lt;br /&gt;
          sleep(1)&lt;br /&gt;
        end&lt;br /&gt;
 &lt;br /&gt;
-------------------------------&lt;br /&gt;
which is also necessary for the volume set,  volume up and volume down commands the way they are written.&lt;br /&gt;
Carefully replacing &amp;quot;158&amp;quot; with the LG TV device ID number on your setup in the extended editor will make all these commands functional. &lt;br /&gt;
&lt;br /&gt;
Please note that  the description for the plug and play implementation discussed above has not been tested with this fix.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Tips_And_Tricks&amp;diff=36810</id>
		<title>Tips And Tricks</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Tips_And_Tricks&amp;diff=36810"/>
		<updated>2016-07-07T13:50:32Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
[[category: Tutorials]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
== How to run X application ==&lt;br /&gt;
1. start firefox on the machine from &amp;quot;computing&amp;quot; (you don&#039;t need firefox, but you need the state it sets while its running)&amp;lt;br&amp;gt;&lt;br /&gt;
2. from the console, &amp;quot;export DISPLAY=:0&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
3. run your application, which should then be displayed over firefox&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to transfer media to other Core or linux PC ==&lt;br /&gt;
&lt;br /&gt;
I have scenario with one main Core (Core1-internal ip 192.168.0.1) with dual network cards and another Core (Core2 - 192.168.0.253) I&#039;m setting up for my new house. I&#039;d like to transfer media from Core1 to Core2. Core2 has only one network card and gets ip from dhcp of Core1.&lt;br /&gt;
&lt;br /&gt;
1. Set Internal network on Core2 to 192.168.1.0 (in contrast to internal network 192.168.0.1 of Core1) and set Firewall off temporarily &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
2. Add share to /etc/smb.conf on Core1 (this is probably needed only in my special case, cause have symlink &amp;lt;br&amp;gt;&lt;br /&gt;
 ls -l /home/public&lt;br /&gt;
 lrwxrwxrwx  1 root public 17 2006-09-16 15:25 /home/public -&amp;gt; /home/data/public&lt;br /&gt;
&lt;br /&gt;
     create mask = 0777&lt;br /&gt;
      directory mask = 0777&lt;br /&gt;
      path = /home/data&lt;br /&gt;
       public = no&lt;br /&gt;
 &amp;lt;br&amp;gt; &lt;br /&gt;
3. Mount samba share from Core2 :&amp;lt;br&amp;gt;&lt;br /&gt;
 mount.cifs  //192.168.0.1/media /mnt/data -o user=xxxxx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to get live logs (unchecked yet)==&lt;br /&gt;
On recent releases logs are updated with some time delay. To get them more in real time :&lt;br /&gt;
&lt;br /&gt;
1. &#039;export ImmediatelyFlushLog=1&#039;&lt;br /&gt;
2. then &lt;br /&gt;
 /usr/pluto/bin/MessageSend localhost 0 -1000 7 11&lt;br /&gt;
or use 22 instead of -1000 (to be just for XinePlayer)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to workaround &#039;playlists won&#039;t show on Orbiter bug&#039; Bug Nr. 3409 ==&lt;br /&gt;
1. Execute this SQL statement&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 update Playlist SET EK_User = null;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; It will make all your playlists public and they will appear on Orbiter. You can also change one by one if don&#039;t want all playlists to be public.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to dump database and do sqlcvs manually (incomplete!)==&lt;br /&gt;
1.To see diff first -- screen session name sqlCVS &lt;br /&gt;
&lt;br /&gt;
 /usr/pluto/bin/sqlCVS -H sqlcvs.plutohome.com -R 3999 -r dce diff &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. To save database content to file&lt;br /&gt;
&lt;br /&gt;
 mysqldump pluto_main &amp;gt; pluto_main.dump &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Useful hooks for adding Ruby code to GSD device==&lt;br /&gt;
&lt;br /&gt;
Actually, there are following hooks where you can put your code:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 1. Private Method Listing - you can put there common methods which can be used in the others hooks.&lt;br /&gt;
&lt;br /&gt;
 2. Process IDLE - run every couple of seconds when device is not active.&lt;br /&gt;
&lt;br /&gt;
 3. Process Incoming Data - receive all data which comes from the device.&lt;br /&gt;
&lt;br /&gt;
 4. Process Initialize - call when device is starting (not real device, Pluto device).&lt;br /&gt;
&lt;br /&gt;
 5. Process Receive Command For Child - when device or its child receive a command from Pluto it comes here.&lt;br /&gt;
&lt;br /&gt;
 6. Process Release - call when device is shutdown.&lt;br /&gt;
_________________&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Implementing_Clipsal_Interface_using_Generic_Serial_Device&amp;diff=36806</id>
		<title>Implementing Clipsal Interface using Generic Serial Device</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Implementing_Clipsal_Interface_using_Generic_Serial_Device&amp;diff=36806"/>
		<updated>2016-07-05T02:40:09Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:hardware]]&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;
&lt;br /&gt;
Clipsal CBus Switches are used for controlling lights, curtains and temperature controls. They can be connected to the Serial Port and can be controlled via a PC. In the following tutorial, we will add Clipsal Switches using Generic Serial Device and implement Lights and Shutter control through the Linux MCE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Steps to Add Clipsal Interface ==&lt;br /&gt;
&lt;br /&gt;
* Create a Device Template &#039;Clipsal Interface&#039; in Device Category: &amp;quot;Interfaces - Lighting Interface #81&amp;quot;&lt;br /&gt;
* Check Implements DCE - Command Line - Generic Serial Device&lt;br /&gt;
* In the packages, add &amp;quot;Pluto Generic Serial Device&amp;quot;&lt;br /&gt;
* In Device Data, add &amp;quot;#37 COM Port on PC(string)&amp;quot;&lt;br /&gt;
* In Commands Section, create and select &amp;quot;Ruby Internal Commands&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This Clipsal Interface will act as a parent device to all the child devices (eg. Lights, Curtains) that are controlled via the serial port to which Clipsal Switch is connected. Now create a device from the device template Clipsal Interface.&lt;br /&gt;
&lt;br /&gt;
{{p}}&lt;br /&gt;
&lt;br /&gt;
== Ruby Commands for Lighting ==&lt;br /&gt;
&lt;br /&gt;
The Clipsal Interface will have all the lighting and curtains as its child devices. The commands from child devices will be directed to Clipsal Interface and this interface will send these commands to the serial port to which clipsal switch is connected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For the Clipsal Interface, following ruby commands will be implemented:&lt;br /&gt;
&lt;br /&gt;
* #Private Method Listing #373&lt;br /&gt;
* #Process IDLE #351&lt;br /&gt;
* #Process Incoming Data #350&lt;br /&gt;
* #Process Initialize #355&lt;br /&gt;
* #Process Receive Command For Child #384&lt;br /&gt;
* #Process Release #356&lt;br /&gt;
&lt;br /&gt;
The most important of this command is #Process Receive Command For Child #384, which is process incoming data from child devices. When we receive any command from child device such as Light or Shutter, the ruby commands in this section are invoked and we need to send relevant commands to the serial port to carry out the action on lights or shutters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To edit the Ruby Commands for #384 Process Receive Command For Child, Edit the Clipsal Interface and click on &#039;Edit Ruby Codes&#039; besides Implements DCE on the top.&lt;br /&gt;
&lt;br /&gt;
{{p}}&lt;br /&gt;
&lt;br /&gt;
== Ruby Code ==&lt;br /&gt;
&lt;br /&gt;
   group_no = device_.childdevices_[cmd.devidto_].devdata_[12]&lt;br /&gt;
   &lt;br /&gt;
   if cmd.id_ == 192&lt;br /&gt;
      serial_on = &amp;quot;\\05380079&amp;quot;+group_no+&amp;quot;\r&amp;quot;&lt;br /&gt;
      log( &amp;quot;Sending &amp;quot; + serial_on + &amp;quot; \n&amp;quot; )&lt;br /&gt;
      sendCmd(serial_on)&lt;br /&gt;
   end&lt;br /&gt;
   &lt;br /&gt;
   if cmd.id_ == 193&lt;br /&gt;
      serial_off = &amp;quot;\\05380001&amp;quot;+group_no+&amp;quot;\r&amp;quot;&lt;br /&gt;
      log( &amp;quot;Sending &amp;quot; + serial_off + &amp;quot; \n&amp;quot; )&lt;br /&gt;
      sendCmd(serial_off)&lt;br /&gt;
   end&lt;br /&gt;
   &lt;br /&gt;
   log(&amp;quot;We got cmd : &amp;quot; + cmd.id.to_s)&lt;br /&gt;
   &lt;br /&gt;
   if cmd.id_ == 184&lt;br /&gt;
      dim_level = cmd.params_[76]&lt;br /&gt;
      serial_dim = &amp;quot;\\05380002&amp;quot;+group_no+&amp;quot;&amp;quot;+dim_level+&amp;quot;\r&amp;quot;&lt;br /&gt;
      log( &amp;quot;Sending &amp;quot; + serial_dim + &amp;quot; \n&amp;quot;)&lt;br /&gt;
      sendCmd(serial_dim)&lt;br /&gt;
   end&lt;br /&gt;
{{p}}&lt;br /&gt;
&lt;br /&gt;
== Explanation ==&lt;br /&gt;
&lt;br /&gt;
In the ruby code, what is happening is when we receive a command from any of the child devices (such as lights, curtains), we also get its port number. Then, using that port number we make a binary string to be sent to the serial port. That binary string is sent to the serial port defined in the Clipsal Interface Device Data.&lt;br /&gt;
&lt;br /&gt;
eg. Command # 192 is the command to switch light ON. The binary string to switch a light ON to be sent to the serial port is:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
\05380079 + Port Number + \r&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So, we receive the port number from child device (group_no), concatenate it in the binary string and send it to the serial port defined in the Clipsal Interface.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Implementing_Arduino_using_Generic_Serial_Device&amp;diff=36805</id>
		<title>Implementing Arduino using Generic Serial Device</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Implementing_Arduino_using_Generic_Serial_Device&amp;diff=36805"/>
		<updated>2016-07-03T10:40:44Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Hardware]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
{{versioninfo|810Status=Working|810UpdatedDate=14th November 2012|810UpdatedBy=Daballiemo|1004Status=Working|1004UpdatedDate=3th September 2012|1004UpdatedBy=Daballiemo}}&lt;br /&gt;
&lt;br /&gt;
== General Info ==&lt;br /&gt;
&lt;br /&gt;
Arduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software. It&#039;s intended for artists, designers, hobbyists, and anyone interested in creating interactive objects or environments.&lt;br /&gt;
&lt;br /&gt;
Arduino can sense the environment by receiving input from a variety of sensors and can affect its surroundings by controlling lights, motors, and other actuators. The microcontroller on the board is programmed using the Arduino programming language (based on Wiring) and the Arduino development environment (based on Processing). Arduino projects can be stand-alone or they can communicate with software running on a computer (e.g. Flash, Processing, MaxMSP). &lt;br /&gt;
&lt;br /&gt;
[[File:Arduino_uno_test.jpg]]&lt;br /&gt;
&lt;br /&gt;
In the following I want to give an overview what needs to be done to have LinuxMCE control a RGB LED (string) through an Arduino. The string is within brackets as the only added to the Arduino to be able to control a ledstring is some mosfets and a powerblock.&lt;br /&gt;
&lt;br /&gt;
== Setting up Linuxmce ==&lt;br /&gt;
&lt;br /&gt;
For now define Arduino as a vendor via Advanced -&amp;gt; Device Templates. Select the &amp;quot;Add Manufacturer&amp;quot; button and provide &amp;quot;Arduino&amp;quot; as manufacturer followed by save and close.&lt;br /&gt;
&lt;br /&gt;
Define a new template for the Arduino Uno (which I am using atm)&lt;br /&gt;
&lt;br /&gt;
Advanced -&amp;gt; Device Templates, selected &amp;quot;Add device template&amp;quot;. Name the template &amp;quot;Arduino Uno&amp;quot;, select Implements DCE, Device Category is &amp;quot;Interfaces - Specialized #97&amp;quot;. Specify that your device is controlled via category &amp;quot;Device Category:Core&amp;quot; (&amp;quot;Computers - Core&amp;quot;). Otherwise the driver will not be started on the core.&lt;br /&gt;
As I am using an Ethernet shield select &amp;quot;Is IP based&amp;quot;, set &amp;quot;Comm Method&amp;quot; to Ethernet and under &amp;quot;Device data&amp;quot; add #69 TCP Port (int). Give the TCP Port the value &amp;quot;69&amp;quot;, set it to required and allowed to modify.&lt;br /&gt;
&lt;br /&gt;
Now set up the rest of the template according to http://wiki.linuxmce.org/index.php/How_to_add_your_own_GSD_device.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Example 1 Arduino, LinuxMCE &amp;amp; RGB LED ==&lt;br /&gt;
&lt;br /&gt;
In this example we will use the Arduino Uno with an Ethernet shield to be able to control a RGB LED from within LinuxMCE. The RGB switch (Device Template #: 1993) has to be made a child of the Arduino GSD. Make sure in the auto generated scenario for this device that the &amp;quot;ON&amp;quot; command is really &amp;quot;ON&amp;quot; and not level &amp;quot;100&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note: RGB setting can only be done via a scenario!!&lt;br /&gt;
&lt;br /&gt;
One nice feature is that whatever color code the LED (string) has been set to, when using the dim function or switched on or off, it will hold the same color schema. All dim levels are being treated as relative to the orginal value. This means 50% is 50% of the current value and not 50% of the maximum !!!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Change the following processes under ruby code of your Arduino GSD to the following:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;#384 Process Receive Command For Child&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##################################################################################################################&lt;br /&gt;
# Use below with care. The commands used will interact with the sketch on the Arduino. There is however no way LMCE&lt;br /&gt;
# can retrieve what you have connected to the pins, so make sure the combination LMCE, Arduino and physical connections&lt;br /&gt;
# are in line with eachother.&lt;br /&gt;
# One example: if you define an RGB switch with port 3, it will also take up port 5 &amp;amp; 6 on the Arduino. &lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
# Commandstructure&lt;br /&gt;
#&lt;br /&gt;
#       A           -          BBB      -         CCC       -      DDD     -      EEE&lt;br /&gt;
#                              &lt;br /&gt;
#       P(ower)             pin number (8 or 9)   0 (OFF             0              0&lt;br /&gt;
#                                                 1 (ON)&lt;br /&gt;
#       D(im)               pin number (3 or 9)   0-100 (Level)      0              0&lt;br /&gt;
#&lt;br /&gt;
#       C(olor)             pin number (3)        0-255 (Red)       0-255 (Green)  0-255 (Blue)&lt;br /&gt;
#     &lt;br /&gt;
#       R(elative)          pin number (3)        0-100 (Level)&lt;br /&gt;
#&lt;br /&gt;
#  RedPin = 3;        ------&amp;gt; LinuxMCE RGB switch port number has to be 3 !!!!&lt;br /&gt;
#  GreenPin = 5;      &lt;br /&gt;
#  BluePin = 6;       &lt;br /&gt;
#  OnOffPin = 8;      ------&amp;gt; LinuxMCE On/Off switch port number has to be 8 !!!!&lt;br /&gt;
#  WhitePin = 9;      ------&amp;gt; LinuxMCE Dimmer switch port number has to be 9 !!!!&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
# DaBalliemo september 2012&lt;br /&gt;
##################################################################################################################&lt;br /&gt;
cmdId = cmd.id_                                                          # Command ID: ON, OFF, SET LEVEL&lt;br /&gt;
cmdTo = cmd.devidto_ # Device ID in LinuxMCE&lt;br /&gt;
deviceID = device_.childdevices_[cmd.devidto_].devdata_[12]              # 12 contains a port/channel&lt;br /&gt;
childType = device_.childdevices_[cmdTo].devtemplid_                     # Template ID to know type of device: switch or dimmer&lt;br /&gt;
&lt;br /&gt;
command = [&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;] # define command array&lt;br /&gt;
&lt;br /&gt;
log (&#039;logging from #384&#039;);&lt;br /&gt;
log (&#039;Device ID&#039;);&lt;br /&gt;
log deviceID;&lt;br /&gt;
log (&#039;Command given&#039;);                             # orginal command from LMCE&lt;br /&gt;
log cmdId;&lt;br /&gt;
log (&#039;Device Template&#039;);                           # Template ID ie switch, dimmer or RGB&lt;br /&gt;
log childType;&lt;br /&gt;
log (&#039;Level&#039;);&lt;br /&gt;
log cmd.params_[76];                               # The level to set, as a value between 0 (off) and 100 (full).&lt;br /&gt;
                                                   # It can be preceeded with a - or + indicating a relative value.  +20 means up 20%.&lt;br /&gt;
log (&#039;RGB&#039;);&lt;br /&gt;
log cmd.params_[279];&lt;br /&gt;
log cmd.params_[280];&lt;br /&gt;
log cmd.params_[281];&lt;br /&gt;
&lt;br /&gt;
command [1] = deviceID                             # Port number defined in LMCE and pin number in Arduino Uno&lt;br /&gt;
command [2] = &#039;-&#039;&lt;br /&gt;
   &lt;br /&gt;
case cmdId&lt;br /&gt;
&lt;br /&gt;
when 192                                           # 192 is the &#039;ON&#039; command&lt;br /&gt;
  case childType&lt;br /&gt;
   when 37, 38                                     # device type is &amp;quot;on/off switch&amp;quot; template 37 or dimmable switch template 38&lt;br /&gt;
    command [0] = &#039;P&#039;                              # Start indication is P (Power)&lt;br /&gt;
    command [3] = &#039;1&#039;                              # &#039;1&#039; indicating &#039;ON&#039;  &lt;br /&gt;
   when 1993                                       # device type is &amp;quot;RGB switch&amp;quot; template 1993&lt;br /&gt;
                                                   # by using a dim level of &amp;quot;100&amp;quot; we make sure the Arduino can use the previous levels&lt;br /&gt;
    command [0] = &#039;R&#039;                              # start indicator is relative dimming&lt;br /&gt;
    command [3] = 100                              # relative dim level&lt;br /&gt;
  end&lt;br /&gt;
   &lt;br /&gt;
when 193                                           # 193 is the &#039;OFF&#039; command&lt;br /&gt;
  command [3] = &#039;0&#039;&lt;br /&gt;
  case childType&lt;br /&gt;
   when 37, 38                                     # device type is &amp;quot;on/off switch&amp;quot; template 37 or dimmable switch template 38&lt;br /&gt;
    command [0] = &#039;P&#039;                              # Start indication is P (Power)&lt;br /&gt;
   when 1993                                       # device type is &amp;quot;RGB switch&amp;quot; template 1993&lt;br /&gt;
                                                   # by using a dim level of &amp;quot;0&amp;quot; we make sure the Arduino will remember the settings&lt;br /&gt;
    command [0] = &#039;R&#039;                              # start indicator is relative dimming&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
when 184                                           # 184 is Level of dimmer&lt;br /&gt;
  case childType&lt;br /&gt;
   when 38&lt;br /&gt;
    command [0] = &#039;D&#039;&lt;br /&gt;
    command [3] = cmd.params_[76]                  # dim level&lt;br /&gt;
   when 1993&lt;br /&gt;
    command [0] = &#039;R&#039;&lt;br /&gt;
    command [3] = cmd.params_[76]                  # relative dim level&lt;br /&gt;
  end &lt;br /&gt;
     &lt;br /&gt;
when 980                                           # 980 is color scenario command (template 1993)&lt;br /&gt;
 command [0] = &#039;C&#039;                                 # start indicator is C (Color)&lt;br /&gt;
 command [4] = cmd.params_[279]                    # red level&lt;br /&gt;
 command [5] = &#039;-&#039;&lt;br /&gt;
 command [6] = cmd.params_[280]                    # green level&lt;br /&gt;
 command [7] = &#039;-&#039;&lt;br /&gt;
 command [8] = cmd.params_[281]                    # blue level&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
commandstring = command.to_s                       # wrap the command array into a string&lt;br /&gt;
log (&#039;Sending&#039;);                                   # log that we are sending&lt;br /&gt;
log commandstring;                                 # put in logfile what we send&lt;br /&gt;
conn_.Send commandstring                           # send if off&lt;br /&gt;
&lt;br /&gt;
# The Arduino will replay with exactly the same command as it has been given. It can be captured via #350 Process Incoming Data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;#350 Process Incoming Data&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
buffer = conn_.Recv(100,500);&lt;br /&gt;
log (&#039;Receiving&#039;);&lt;br /&gt;
log buffer;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;#373 Private Method Listing &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def log(line)&lt;br /&gt;
  # This function logs a line to the log file of the device&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 Time.now.to_s + &amp;quot; (Ruby script):&amp;quot; + line.to_s&lt;br /&gt;
  log.close&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arduino Uno shopping list&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Shopping list:&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno&lt;br /&gt;
* Ethernet Shield&lt;br /&gt;
* LED&lt;br /&gt;
* Resistors&lt;br /&gt;
* Breadboard and some wires&lt;br /&gt;
* IDE installed on computer&lt;br /&gt;
&lt;br /&gt;
There are numerous examples on the internet how to hook up a LED to the Arduino. Because there is no way of knowing what LED exactly is being used please find your own setup between all the examples.&lt;br /&gt;
&lt;br /&gt;
The following sketch assumes you are using pin 3 for Red, 5 for Green and 6 for Blue. (PWM: 3, 5, 6, 9, 10, and 11. Provide 8-bit PWM output with the analogWrite() function.).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
----------------                 &lt;br /&gt;
-              - GND ----------RGBLED (This can be a RGB string when using MOSFET&#039;s)&lt;br /&gt;
-              -                 |||&lt;br /&gt;
-              - 3 ---- 300 Ohm--|||               -&lt;br /&gt;
-              - 5 ---- 300 Ohm --||&lt;br /&gt;
-   Arduino    - 6 ---- 300 Ohm ---|&lt;br /&gt;
-              -&lt;br /&gt;
-              - 8 ----- On/Off&lt;br /&gt;
-              - 9 --------------LED (Dimmable)&lt;br /&gt;
-              -                  |&lt;br /&gt;
---------------- GND --- 300 Ohm --&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sketch for Arduino&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
  arduino_control_by_lmce.ino:&lt;br /&gt;
&lt;br /&gt;
This sketch sends and receive TCP message strings to LinuxMCE.&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
//*****************************************************************&lt;br /&gt;
&lt;br /&gt;
// * with ethernet shield DON&#039;T USE this pin: 10, 11, 12, 13 *&lt;br /&gt;
&lt;br /&gt;
// * (PWM: 3, 5, 6, 9, 10, and 11. Provide 8-bit PWM output with the analogWrite() function *&lt;br /&gt;
&lt;br /&gt;
//*****************************************************************&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;         // needed for Arduino versions later than 0018&lt;br /&gt;
#include &amp;lt;Ethernet.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
boolean debug = true; //debug over serial?&lt;br /&gt;
int RedMemory = 255;&lt;br /&gt;
int GreenMemory = 255;&lt;br /&gt;
int BlueMemory = 255;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Enter a MAC address and IP address for your controller below.&lt;br /&gt;
// The IP address will be dependent on your local network:&lt;br /&gt;
&lt;br /&gt;
byte mac[] = {&lt;br /&gt;
  0x90, 0xA2, 0xDA, 0x00, 0x58, 0x27 };&lt;br /&gt;
byte ip[] = {&lt;br /&gt;
  192,168,80,129};&lt;br /&gt;
byte gateway[] = {&lt;br /&gt;
  192,168,80,1 };&lt;br /&gt;
byte subnet[] = {&lt;br /&gt;
  255,255,255,0 };&lt;br /&gt;
&lt;br /&gt;
unsigned int localPort = 69;      // local port to listen on&lt;br /&gt;
&lt;br /&gt;
// buffers for receiving and sending data&lt;br /&gt;
&lt;br /&gt;
char packetBuffer[1024]; //buffer to hold incoming commandpacket,&lt;br /&gt;
EthernetServer server(69);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  if (debug) Serial.begin(9600);&lt;br /&gt;
  if (debug) Serial.println(&amp;quot;Starting LinuxMCE sketch...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // start the Ethernet&lt;br /&gt;
&lt;br /&gt;
  Ethernet.begin(mac, ip,gateway, subnet);&lt;br /&gt;
  server.begin();&lt;br /&gt;
&lt;br /&gt;
  //port setting:&lt;br /&gt;
  pinMode (9, OUTPUT);&lt;br /&gt;
  pinMode (8, OUTPUT);&lt;br /&gt;
  pinMode (6, OUTPUT);&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (3, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//********************************************************************************************************************************&lt;br /&gt;
//&lt;br /&gt;
// Commandstructure&lt;br /&gt;
//&lt;br /&gt;
//       A           -          BBB      -         CCC       -      DDD     -      EEE&lt;br /&gt;
//                              &lt;br /&gt;
//       P(ower)             pin number (8 or 9)   0 (OFF             0              0&lt;br /&gt;
//                                                 1 (ON)&lt;br /&gt;
//       D(im)               pin number (3 or 9)   0-100 (Level)      0              0&lt;br /&gt;
//&lt;br /&gt;
//       C(olor)             pin number (3)        0-255 (Red)       0-255 (Green)  0-255 (Blue)&lt;br /&gt;
//&lt;br /&gt;
//       R(elative)          pin number (3)        0-100&lt;br /&gt;
//&lt;br /&gt;
//  RedPin = 3;        ------&amp;gt; LinuxMCE RGB switch port number has to be 3 !!!!&lt;br /&gt;
//  GreenPin = 5;      &lt;br /&gt;
//  BluePin = 6;       &lt;br /&gt;
//  OnOffPin = 8;      ------&amp;gt; LinuxMCE On/Off switch port number has to be 8 !!!!&lt;br /&gt;
//  WhitePin = 9;      ------&amp;gt; LinuxMCE Dimmer switch port number has to be 9 !!!!&lt;br /&gt;
//&lt;br /&gt;
// DaBalliemo september 2012&lt;br /&gt;
//&lt;br /&gt;
//*********************************************************************************************************************************&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// variables uses to change the value of analogWrite function.&lt;br /&gt;
&lt;br /&gt;
int dim = 0;&lt;br /&gt;
int dim_pin = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  bool send_cmd = false;                                                                           //is true when i send a command.&lt;br /&gt;
&lt;br /&gt;
  // if there&#039;s commanddata available, read a packet&lt;br /&gt;
&lt;br /&gt;
  EthernetClient client = server.available();&lt;br /&gt;
  int packetSize = 0;&lt;br /&gt;
  if (client)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    if (client.connected()) {&lt;br /&gt;
      while (client.available()) {&lt;br /&gt;
        packetBuffer[packetSize] = client.read();&lt;br /&gt;
        packetSize++;&lt;br /&gt;
        packetBuffer[packetSize] = &#039;\0&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (debug) {&lt;br /&gt;
        Serial.println(&amp;quot;***************************************&amp;quot;);&lt;br /&gt;
        Serial.print(&amp;quot;Command given: &amp;quot;);&lt;br /&gt;
        Serial.println(packetBuffer);&lt;br /&gt;
        Serial.print(&amp;quot;Buffersize: &amp;quot;);&lt;br /&gt;
        Serial.println(packetSize);&lt;br /&gt;
        Serial.println(&amp;quot;***************************************&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
//############################## Power Section #################################################################################&lt;br /&gt;
//if you receive a command that start with &#039;P&#039; it means that you received a boolean value:&lt;br /&gt;
//LinuxMCE sends &amp;quot;Px-0&amp;quot; or &amp;quot;Px-1&amp;quot;. The first turn on a pin&lt;br /&gt;
//(in this case: pin x). The second just turn off the pin x.&lt;br /&gt;
&lt;br /&gt;
      if (packetBuffer[0] == &#039;P&#039; ) {                                                                 // Px-1 or Px-0&lt;br /&gt;
        char led_state_char[4];                                                                      //contains &#039;on&#039; or &#039;off&#039;&lt;br /&gt;
        char pin_char[4];                                                                            // the pin number&lt;br /&gt;
        int inCount = 0;&lt;br /&gt;
        int var = 0;&lt;br /&gt;
        int inCount_led_state_char;&lt;br /&gt;
        int inCount_pin_char;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 1; i &amp;lt;  packetSize; i++)&lt;br /&gt;
        {&lt;br /&gt;
          if (packetBuffer[i] == &#039;-&#039;) {&lt;br /&gt;
            var++;&lt;br /&gt;
            inCount = 0;       &lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (var == 0 &amp;amp;&amp;amp; packetBuffer[i] != &#039;-&#039;) {&lt;br /&gt;
            pin_char[inCount] = packetBuffer[i];&lt;br /&gt;
            inCount++;&lt;br /&gt;
            inCount_pin_char = inCount;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (var == 1 &amp;amp;&amp;amp; packetBuffer[i] != &#039;-&#039;) {&lt;br /&gt;
            led_state_char[inCount] = packetBuffer[i];&lt;br /&gt;
            inCount++;&lt;br /&gt;
            inCount_led_state_char = inCount;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          led_state_char[inCount_led_state_char] = &#039;\0&#039;;&lt;br /&gt;
          pin_char[inCount_pin_char] = &#039;\0&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (debug) {&lt;br /&gt;
          Serial.println(&amp;quot;***************************************&amp;quot;);&lt;br /&gt;
          Serial.println(&amp;quot;Power command given&amp;quot;);&lt;br /&gt;
          Serial.println(&amp;quot;&amp;quot;);&lt;br /&gt;
          Serial.print(&amp;quot;Pin number is: &amp;quot;);&lt;br /&gt;
          Serial.println(pin_char);&lt;br /&gt;
          Serial.print(&amp;quot;   Command given is: &amp;quot;);&lt;br /&gt;
          Serial.println(led_state_char);&lt;br /&gt;
          Serial.println(&amp;quot;***************************************&amp;quot;);&lt;br /&gt;
        } &lt;br /&gt;
&lt;br /&gt;
        int pin = atoi(pin_char);                                                                  //our pin number&lt;br /&gt;
&lt;br /&gt;
        if (atoi(led_state_char) == 1) {                                                           //if we send &#039;Px-1&#039;&lt;br /&gt;
          char led_state_send[10] = &amp;quot;P&amp;quot;;&lt;br /&gt;
          strcat(led_state_send, pin_char);&lt;br /&gt;
          strcat(led_state_send, &amp;quot;-&amp;quot;);&lt;br /&gt;
          strcat(led_state_send, led_state_char);&lt;br /&gt;
          client.print(led_state_send);                                                            //send a string to LMCE: &amp;quot;Px-1&amp;quot;&lt;br /&gt;
          digitalWrite(pin, HIGH);                                                                 //turn on the pin x&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (atoi(led_state_char) == 0) {                                                           //if we send &#039;Px-0&#039;&lt;br /&gt;
          char led_state_send[10] = &amp;quot;P&amp;quot;;&lt;br /&gt;
          strcat(led_state_send, pin_char);&lt;br /&gt;
          strcat(led_state_send, &amp;quot;-&amp;quot;);&lt;br /&gt;
          strcat(led_state_send, led_state_char);&lt;br /&gt;
          client.print(led_state_send);                                                            //send a string to LMCE: &amp;quot;Px-0&amp;quot;;&lt;br /&gt;
          digitalWrite(pin, LOW);&lt;br /&gt;
        }&lt;br /&gt;
        send_cmd = true;                                                                           //we have read a command&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//############################## Dim Section #################################################################################&lt;br /&gt;
 //if we receive a command that start with &#039;D&#039; it means that you have chosen a dim level in LMCE&lt;br /&gt;
 //the string that we send is like : &amp;quot;D9-55&amp;quot; and it&#039;s means: &#039;d&#039; is use for &amp;quot;dim&amp;quot;, &amp;quot;9&amp;quot; is the pin that&lt;br /&gt;
 //we want change dim, &amp;quot;55&amp;quot; is the dim value. LMCE range is from &amp;quot;0&amp;quot; to &amp;quot;100&amp;quot;. The conversion 0-100 into 0-255 is done in this sketch&lt;br /&gt;
 //we can use this dim to change directly the value to use in AnalogWrite,&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
      if (packetBuffer[0] == &#039;D&#039;) {&lt;br /&gt;
        char dim_char[10];&lt;br /&gt;
        char dim_pin_char[10];&lt;br /&gt;
        int inCount = 0;&lt;br /&gt;
        int var = 0;&lt;br /&gt;
        int inCount_dim_pin_char;&lt;br /&gt;
        int inCount_dim_char;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 1; i &amp;lt;  packetSize; i++)&lt;br /&gt;
        {&lt;br /&gt;
          //Serial.println(packetBuffer[i]);&lt;br /&gt;
          if (packetBuffer[i] == &#039;-&#039;) {&lt;br /&gt;
            var++;&lt;br /&gt;
            inCount = 0;       &lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (var == 0 &amp;amp;&amp;amp; packetBuffer[i] != &#039;-&#039;) {&lt;br /&gt;
            dim_pin_char[inCount] = packetBuffer[i];&lt;br /&gt;
            inCount++;&lt;br /&gt;
            inCount_dim_pin_char = inCount;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (var == 1 &amp;amp;&amp;amp; packetBuffer[i] != &#039;-&#039;) {&lt;br /&gt;
            dim_char[inCount] = packetBuffer[i];&lt;br /&gt;
            inCount++;&lt;br /&gt;
            inCount_dim_char = inCount;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          dim_pin_char[inCount_dim_pin_char] = &#039;\0&#039;;&lt;br /&gt;
          dim_char[inCount_dim_char] = &#039;\0&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //Serial.println(dim_char);&lt;br /&gt;
&lt;br /&gt;
        dim = atoi(dim_char);                                                              //here we have the dim number: 0-100&lt;br /&gt;
        dim = dim * 2.55;                                                                  // Translate 0-100 into 0-255, gets trunked&lt;br /&gt;
        dim_pin = atoi(dim_pin_char);                                                      //and here the pin number&lt;br /&gt;
        &lt;br /&gt;
        if (debug) {&lt;br /&gt;
          Serial.println(&amp;quot;***************************************&amp;quot;);&lt;br /&gt;
          Serial.println(&amp;quot;Dim command given&amp;quot;);&lt;br /&gt;
          Serial.print(&amp;quot;dim pin: &amp;quot;);&lt;br /&gt;
          Serial.println(dim_pin);&lt;br /&gt;
          Serial.print(&amp;quot;dim level: &amp;quot;);&lt;br /&gt;
          Serial.println(dim);&lt;br /&gt;
          Serial.println(&amp;quot;***************************************&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        char dim_state_send[10] = &amp;quot;D&amp;quot;;&lt;br /&gt;
        strcat(dim_state_send, dim_pin_char);&lt;br /&gt;
        strcat(dim_state_send, &amp;quot;-&amp;quot;);&lt;br /&gt;
        strcat(dim_state_send, dim_char);&lt;br /&gt;
        client.print( dim_state_send);                                                     //here return the made action.&lt;br /&gt;
        send_cmd = true;&lt;br /&gt;
        analogWrite(dim_pin, dim);                                                         //here we change the dim of the selected pin&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
//############################## Relative Dim Section #################################################################################&lt;br /&gt;
//if we receive a command that start with &#039;R&#039; it means that you have chosen a relative dim level in LMCE for a RGB LED or String&lt;br /&gt;
//the string that we send is like : &amp;quot;R3-55&amp;quot; and it&#039;s means: &#039;R&#039; is use for &amp;quot;relative dim&amp;quot;, &amp;quot;3&amp;quot; is the first pin that&lt;br /&gt;
//we want change dim, &amp;quot;55&amp;quot; is the dim value. LMCE range is from &amp;quot;0&amp;quot; to &amp;quot;100&amp;quot;. The conversion 0-100 into 0-255 is done in this sketch&lt;br /&gt;
//we can use this dim to change directly the value to use in AnalogWrite,&lt;br /&gt;
&lt;br /&gt;
      if (packetBuffer[0] == &#039;R&#039;) {&lt;br /&gt;
        char dim_char[10];&lt;br /&gt;
        char dim_pin_char[10];&lt;br /&gt;
        int inCount = 0;&lt;br /&gt;
        int var = 0;&lt;br /&gt;
        int inCount_dim_pin_char;&lt;br /&gt;
        int inCount_dim_char;&lt;br /&gt;
        int DimRed;&lt;br /&gt;
        int DimGreen;&lt;br /&gt;
        int DimBlue;&lt;br /&gt;
        float f;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 1; i &amp;lt;  packetSize; i++)&lt;br /&gt;
        {&lt;br /&gt;
          //Serial.println(packetBuffer[i]);&lt;br /&gt;
          if (packetBuffer[i] == &#039;-&#039;) {&lt;br /&gt;
            var++;&lt;br /&gt;
            inCount = 0;       &lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (var == 0 &amp;amp;&amp;amp; packetBuffer[i] != &#039;-&#039;) {&lt;br /&gt;
            dim_pin_char[inCount] = packetBuffer[i];&lt;br /&gt;
            inCount++;&lt;br /&gt;
            inCount_dim_pin_char = inCount;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (var == 1 &amp;amp;&amp;amp; packetBuffer[i] != &#039;-&#039;) {&lt;br /&gt;
            dim_char[inCount] = packetBuffer[i];&lt;br /&gt;
            inCount++;&lt;br /&gt;
            inCount_dim_char = inCount;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          dim_pin_char[inCount_dim_pin_char] = &#039;\0&#039;;&lt;br /&gt;
          dim_char[inCount_dim_char] = &#039;\0&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //Serial.println(dim_char);&lt;br /&gt;
&lt;br /&gt;
        dim = atoi(dim_char);                                                              //here we have the dim number: 0-100&lt;br /&gt;
        dim_pin = atoi(dim_pin_char);                                                      //and here the pin number&lt;br /&gt;
&lt;br /&gt;
        if (debug) Serial.print(&amp;quot;dim pin: &amp;quot;);&lt;br /&gt;
        if (debug) Serial.println(dim_pin);&lt;br /&gt;
        if (debug) Serial.print(&amp;quot;dim level: &amp;quot;);&lt;br /&gt;
        if (debug) Serial.println(dim);&lt;br /&gt;
&lt;br /&gt;
        char dim_state_send[10] = &amp;quot;R&amp;quot;;&lt;br /&gt;
        strcat(dim_state_send, dim_pin_char);&lt;br /&gt;
        strcat(dim_state_send, &amp;quot;-&amp;quot;);&lt;br /&gt;
        strcat(dim_state_send, dim_char);&lt;br /&gt;
&lt;br /&gt;
        if (debug) Serial.println(dim_state_send);&lt;br /&gt;
        client.print( dim_state_send);                                                     //here return the made action.&lt;br /&gt;
        send_cmd = true;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        DimRed = int(RedMemory*float(dim)/100);                                           //here we have the dim number: &lt;br /&gt;
        dim_pin = atoi(dim_pin_char);                                                     //and here the pin number&lt;br /&gt;
        dim_pin = dim_pin;&lt;br /&gt;
        analogWrite(dim_pin, DimRed);&lt;br /&gt;
 &lt;br /&gt;
        if (debug) {&lt;br /&gt;
          Serial.println(&amp;quot;***************************************&amp;quot;);&lt;br /&gt;
          Serial.println(&amp;quot;Relative Dim command given&amp;quot;);&lt;br /&gt;
          Serial.print(&amp;quot;Red pin: &amp;quot;);&lt;br /&gt;
          Serial.print(dim_pin);&lt;br /&gt;
          Serial.print(&amp;quot;  Memory level: &amp;quot;);&lt;br /&gt;
          Serial.print(RedMemory);&lt;br /&gt;
          Serial.print(&amp;quot; New level: &amp;quot;);&lt;br /&gt;
          Serial.println(DimRed);&lt;br /&gt;
         }          &lt;br /&gt;
 &lt;br /&gt;
        DimGreen = int(GreenMemory*float(dim)/100);                                                              //here we have the dim number: 0-255&lt;br /&gt;
        dim_pin = atoi(dim_pin_char);                                                             //and here the pin number&lt;br /&gt;
        dim_pin = dim_pin + 2;&lt;br /&gt;
        analogWrite(dim_pin, DimGreen);&lt;br /&gt;
  &lt;br /&gt;
         if (debug) {&lt;br /&gt;
          Serial.print(&amp;quot;Green pin: &amp;quot;);&lt;br /&gt;
          Serial.print(dim_pin);&lt;br /&gt;
          Serial.print(&amp;quot;  Memory level: &amp;quot;);&lt;br /&gt;
          Serial.print(GreenMemory);&lt;br /&gt;
          Serial.print(&amp;quot; New level: &amp;quot;);&lt;br /&gt;
          Serial.println(DimGreen);&lt;br /&gt;
         } &lt;br /&gt;
&lt;br /&gt;
        DimBlue = int(BlueMemory*float(dim)/100);                                                             //here we have the dim number: 0-255&lt;br /&gt;
        dim_pin = atoi(dim_pin_char);                                                             //and here the pin number&lt;br /&gt;
        dim_pin = dim_pin + 3;&lt;br /&gt;
        analogWrite(dim_pin, DimBlue);&lt;br /&gt;
&lt;br /&gt;
        if (debug) {&lt;br /&gt;
          Serial.print(&amp;quot;Blue pin: &amp;quot;);&lt;br /&gt;
          Serial.print(dim_pin);&lt;br /&gt;
          Serial.print(&amp;quot;  Memory level: &amp;quot;);&lt;br /&gt;
          Serial.print(BlueMemory);&lt;br /&gt;
          Serial.print(&amp;quot; New level: &amp;quot;);&lt;br /&gt;
          Serial.println(DimBlue); &lt;br /&gt;
          Serial.println(&amp;quot;***************************************&amp;quot;);&lt;br /&gt;
        }          &lt;br /&gt;
        &lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//############################## RGB Section #################################################################################&lt;br /&gt;
      //if we receive a command that start with &#039;C&#039; it means that you have chosen a RGB scenario level in LMCE.&lt;br /&gt;
      //the string that we send is like : &amp;quot;C9-55/155/255&amp;quot; and it&#039;s means: &#039;C&#039; is color i.e. &amp;quot;RGB&amp;quot;, &amp;quot;9&amp;quot; is the 1st pin of the RGB LED you have&lt;br /&gt;
      //connected to the Arduino, pin 10 is Green and pin 11 is Blue.LMCE range is from &amp;quot;0&amp;quot; to &amp;quot;255&amp;quot; for each channel so no adjustment is necessary.&lt;br /&gt;
&lt;br /&gt;
      if (packetBuffer[0] == &#039;C&#039;) {                                                        // Received a command string for RGB&lt;br /&gt;
        char Red_char[10];&lt;br /&gt;
        char Red_pin_char[10];&lt;br /&gt;
        char Green_char[10];&lt;br /&gt;
        char Green_pin_char[10];&lt;br /&gt;
        char Blue_char[10];&lt;br /&gt;
        char Blue_pin_char[10];        &lt;br /&gt;
        int inCount = 0;&lt;br /&gt;
        int var = 0;&lt;br /&gt;
        int inCount_RGB_pin_char;&lt;br /&gt;
        int inCount_Red_char;&lt;br /&gt;
        int inCount_Green_char;&lt;br /&gt;
        int inCount_Blue_char;        &lt;br /&gt;
&lt;br /&gt;
        for (int i = 1; i &amp;lt;  packetSize; i++)&lt;br /&gt;
        {&lt;br /&gt;
          //Serial.println(packetBuffer[i]);&lt;br /&gt;
          if (packetBuffer[i] == &#039;-&#039;) {&lt;br /&gt;
            var++;&lt;br /&gt;
            inCount = 0;       &lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (var == 0 &amp;amp;&amp;amp; packetBuffer[i] != &#039;-&#039;) {&lt;br /&gt;
            Red_pin_char[inCount] = packetBuffer[i];&lt;br /&gt;
            inCount++;&lt;br /&gt;
            inCount_RGB_pin_char = inCount;&lt;br /&gt;
          }&lt;br /&gt;
          if (var == 1 &amp;amp;&amp;amp;packetBuffer[i] != &#039;-&#039;) {&lt;br /&gt;
            Red_char[inCount] = packetBuffer[i];&lt;br /&gt;
            inCount++;&lt;br /&gt;
            inCount_Red_char = inCount;&lt;br /&gt;
          }&lt;br /&gt;
           &lt;br /&gt;
          if (var == 2 &amp;amp;&amp;amp; packetBuffer[i] != &#039;-&#039;) {&lt;br /&gt;
            Green_char[inCount] = packetBuffer[i];&lt;br /&gt;
            inCount++;&lt;br /&gt;
            inCount_Green_char = inCount;&lt;br /&gt;
          } &lt;br /&gt;
&lt;br /&gt;
          if (var == 3  &amp;amp;&amp;amp; packetBuffer[i] != &#039;-&#039;) {                                    // Reading Blue value&lt;br /&gt;
             Blue_char[inCount] = packetBuffer[i];&lt;br /&gt;
             inCount++;&lt;br /&gt;
             inCount_Blue_char = inCount;&lt;br /&gt;
          } &lt;br /&gt;
    &lt;br /&gt;
         }&lt;br /&gt;
          Red_pin_char[inCount_RGB_pin_char] = &#039;\0&#039;;&lt;br /&gt;
          Red_char[inCount_Red_char] = &#039;\0&#039;;&lt;br /&gt;
          Green_char[inCount_Green_char] = &#039;\0&#039;;&lt;br /&gt;
          Blue_char[inCount_Blue_char] = &#039;\0&#039;;          &lt;br /&gt;
          &lt;br /&gt;
         if (debug) {&lt;br /&gt;
            Serial.println(&amp;quot;***************************************&amp;quot;); &lt;br /&gt;
            Serial.println(&amp;quot;RGB command given&amp;quot;);&lt;br /&gt;
            Serial.print(&amp;quot;Redpin: &amp;quot;); &lt;br /&gt;
            Serial.println(Red_pin_char);&lt;br /&gt;
            Serial.print(&amp;quot;Red:&amp;quot;); &lt;br /&gt;
            Serial.print(Red_char); &lt;br /&gt;
            Serial.print(&amp;quot; Green:&amp;quot;); &lt;br /&gt;
            Serial.print(Green_char); &lt;br /&gt;
            Serial.print(&amp;quot; Blue:&amp;quot;); &lt;br /&gt;
            Serial.println(Blue_char);&lt;br /&gt;
          }   &lt;br /&gt;
&lt;br /&gt;
        dim = atoi(Red_char);                                                              //here we have the dim number: 0-255&lt;br /&gt;
        dim_pin = atoi(Red_pin_char);                                                      //and here the pin number&lt;br /&gt;
        analogWrite(dim_pin, dim);&lt;br /&gt;
        RedMemory = dim;                                                                   // Make sure we remember&lt;br /&gt;
        &lt;br /&gt;
        dim = atoi(Green_char);                                                              //here we have the dim number: 0-255&lt;br /&gt;
        dim_pin = atoi(Red_pin_char);                                                             //and here the pin number&lt;br /&gt;
        dim_pin = dim_pin + 2;&lt;br /&gt;
        analogWrite(dim_pin, dim);&lt;br /&gt;
        GreenMemory = dim;&lt;br /&gt;
 &lt;br /&gt;
        dim = atoi(Blue_char);                                                              //here we have the dim number: 0-255&lt;br /&gt;
        dim_pin = atoi(Red_pin_char);                                                      //and here the pin number&lt;br /&gt;
        dim_pin = dim_pin + 3;&lt;br /&gt;
        analogWrite(dim_pin, dim);&lt;br /&gt;
        BlueMemory = dim;&lt;br /&gt;
       &lt;br /&gt;
        char dim_state_send[16] = &amp;quot;C&amp;quot;;&lt;br /&gt;
        strcat(dim_state_send, Red_pin_char);&lt;br /&gt;
        strcat(dim_state_send, &amp;quot;-&amp;quot;);&lt;br /&gt;
        strcat(dim_state_send, Red_char);&lt;br /&gt;
        strcat(dim_state_send, &amp;quot;-&amp;quot;);&lt;br /&gt;
        strcat(dim_state_send, Green_char);&lt;br /&gt;
        strcat(dim_state_send, &amp;quot;-&amp;quot;);&lt;br /&gt;
        strcat(dim_state_send, Blue_char);&lt;br /&gt;
        client.print( dim_state_send);                                                     //here return the made action.&lt;br /&gt;
        send_cmd = true;&lt;br /&gt;
&lt;br /&gt;
                                                                 //here we change the dim of the selected pin&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Generic_Serial_Device&amp;diff=36804</id>
		<title>Generic Serial Device</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Generic_Serial_Device&amp;diff=36804"/>
		<updated>2016-07-03T10:40:10Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
Generic_Serial_Device (also known as &#039;&#039;&#039;GSD&#039;&#039;&#039;) is a LinuxMCE device that allows end-user to do simple programming for RS232, serial USB (See [[Serial Hack]] for details on getting USB to serial adapters identified properly in the admin panel!) or network connected devices.&lt;br /&gt;
:Note : The information is not quite complete because I&#039;m not the original author.&lt;br /&gt;
&lt;br /&gt;
== Short description ==&lt;br /&gt;
It&#039;s a standard DCE device, it only can execute commands and send events .&lt;br /&gt;
The main idea is instead of programming a device in C++, compile, link with proper libraries you can edit (in a webpage) few lines of code in ruby which will be executed when device receives that command. It exports several objects into ruby so you&#039;ll have access to devicedata, device hierarchy, established connection and so on.&lt;br /&gt;
&lt;br /&gt;
The ruby code for each device template is stored somewhere in &#039;&#039;InfraredGroup_Command&#039;&#039; table. To edit the code go to Wizard&amp;gt; Devices &amp;gt; Generic_Serial_Devices on [[LinuxMCE-admin]] website. You have to add a device from a device template in order to see anything in that page.&lt;br /&gt;
&lt;br /&gt;
Select the device, and click &amp;quot;RubyCodes&amp;quot; button to be able to edit code that will be executed. &lt;br /&gt;
You should be able to see commands that are specified in device template (like ON/OFF/WhateverElse) and a group of &#039;&#039;Internal Commands&#039;&#039; which are used to perform certain actions are to add helper functions.&lt;br /&gt;
&lt;br /&gt;
If the command you are trying to add doesn&#039;t show on first page, go to &#039;&#039;Add/Remove commands&#039;&#039; and add more commands for your device.&lt;br /&gt;
&lt;br /&gt;
=== Ruby source code ===&lt;br /&gt;
&lt;br /&gt;
There are 2 forms of ruby code you can write :&lt;br /&gt;
* standard ruby code (check [http://www.ruby-lang.org/en/] and [http://poignantguide.net/ruby/] for syntax, references and programming guides)&lt;br /&gt;
* short form for &#039;&#039;&#039;conn_.Send&#039;&#039;&#039;&lt;br /&gt;
 &amp;lt;$&amp;quot;PWON\r&amp;quot;$&amp;gt;&lt;br /&gt;
:which simply will send the string &#039;&#039;&amp;quot;PWON\r&amp;quot;&#039;&#039; to device.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll have to quick reload router to get new code. Restarting GSD only will keep old code because the code is supplied by [[Infrared_Plugin]] which caches pluto_main and won&#039;t update it&#039;s cache without full restart of [[DCERouter]]. With this code it creates a ruby source which will be interpreted by embedded ruby.&lt;br /&gt;
&lt;br /&gt;
It will create methods called &amp;quot;cmd_CmdIDx&amp;quot; for each command(x) defined in web interface except &#039;&#039;Private_Method_Listing&#039;&#039; which will be inserted in the body of the class directly without wrapping.&lt;br /&gt;
&lt;br /&gt;
The source usually looks like (&#039;&#039;DevID&#039;&#039; is iPK_Device of specific device, &#039;&#039;CmdIDx&#039;&#039; is iPK_Command ) :&lt;br /&gt;
&lt;br /&gt;
 require &#039;Ruby_Generic_Serial_Device&#039;&lt;br /&gt;
 class Command &amp;lt; Ruby_Generic_Serial_Device::RubyCommandWrapper&lt;br /&gt;
 end&lt;br /&gt;
 class Device_DevID &amp;lt; Ruby_Generic_Serial_Device::RubySerialWrapper&lt;br /&gt;
 def cmd_CmdID1(paramlist)&lt;br /&gt;
     @returnParamArray.clear&lt;br /&gt;
     ### WEB CODE for CmdID1 GOES HERE ###&lt;br /&gt;
     return @returnParamArray&lt;br /&gt;
 end&lt;br /&gt;
 def cmd_CmdID2(paramlist)&lt;br /&gt;
     @returnParamArray.clear&lt;br /&gt;
     ### WEB CODE for CmdID2 GOES HERE ###&lt;br /&gt;
     return @returnParamArray&lt;br /&gt;
 end&lt;br /&gt;
 ...&lt;br /&gt;
 def cmd_ReceiveCommandForChild(cmd)&lt;br /&gt;
     ### Process_Receive Command_For_Child GOES HERE ###&lt;br /&gt;
 end&lt;br /&gt;
 ...&lt;br /&gt;
 ### Private_Method_Listing GOES HERE ###&lt;br /&gt;
 ...&lt;br /&gt;
 def initialize()&lt;br /&gt;
     super&lt;br /&gt;
     @returnParamArray=Array.new&lt;br /&gt;
 end&lt;br /&gt;
 ### Generated Setters/Getters goes here (may be empty, but usually looks like below) ###&lt;br /&gt;
 def data_set(value)&lt;br /&gt;
     @returnParamArray[19]=value&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
There might be more then one class definition in that source. This may happen when child device is itself a GSD device.&lt;br /&gt;
&lt;br /&gt;
=== Command details ===&lt;br /&gt;
When the command from DCE arrives it is routed to specific device and &#039;&#039;cmd_XXX&#039;&#039; is run. The commands are run one by one, meaning that you cannot run 2 commands simultaneously. This limitation is implied by embedded ruby interpretor which fails if run from multiple threads.&lt;br /&gt;
DCE commands may have return parameters (well known GetVideoFrame), as ruby can return only 1 parameter the &#039;&#039;@returnParamArray&#039;&#039; was added. You can see that in each method we insert &#039;&#039;&#039;@returnParamArray.clear&#039;&#039;&#039; then the real code and then &#039;&#039;&#039;return @returnParamArray&#039;&#039;&#039;. Also some setters are generated (like the one from above) for code readability.&lt;br /&gt;
&lt;br /&gt;
Beside usual DCE command you&#039;ll see some &#039;&#039;Internal Commands&#039;&#039;. Here goes a small list and what they do:&lt;br /&gt;
* &#039;&#039;&#039;Private Method Listing&#039;&#039;&#039; - used to insert all kind of helpers&lt;br /&gt;
* &#039;&#039;&#039;Process IDLE&#039;&#039;&#039; - method executed once in a while (may be used to keep connection alive, scan for new devices on serial bus)&lt;br /&gt;
* &#039;&#039;&#039;Process Incoming Data&#039;&#039;&#039; - called when some data is available &lt;br /&gt;
* &#039;&#039;&#039;Process Receive Command For Child&#039;&#039;&#039; - called if the device has children and those are pretty dummy (like Lights under CM11), so practically the parent will do the job. As a parameter you have &#039;&#039;cmd&#039;&#039; which is a wrapper for DCEMessage, so you&#039;ll have access to deviceId, senderId, commandID and so on.&lt;br /&gt;
* &#039;&#039;&#039;Process Initialize&#039;&#039;&#039; - called when device is starting (to perform handshake with device or some other initialisation required by protocol)&lt;br /&gt;
* &#039;&#039;&#039;Process Release&#039;&#039;&#039; - to close gracefully connection with device (say &amp;quot;good bye&amp;quot; or something)&lt;br /&gt;
&lt;br /&gt;
== Implementation notes ==&lt;br /&gt;
There are several classes that actually need to be touched. Most of the other classes are just for wrapping DCE objects (like Device, Message, Connection and so on) and exporting them into ruby.&lt;br /&gt;
&lt;br /&gt;
Most important classes :&lt;br /&gt;
* &#039;&#039;&#039;RubyDCEDeviceNode&#039;&#039;&#039; is actually the Device, responsable with initialisation and partially a message handler.&lt;br /&gt;
* &#039;&#039;&#039;RubyDCEEmbededClass&#039;&#039;&#039; is bridge between DeviceNode and ruby, it has &#039;&#039;CallCmdHandler&#039;&#039; which does the real call to ruby and sends back result.&lt;br /&gt;
* &#039;&#039;&#039;RubyIOManager&#039;&#039;&#039; is the one responsible for instantiating RubyDCEDeviceNodes, code retrieval, command handler and serializing ruby calls.&lt;br /&gt;
* &#039;&#039;&#039;RubyDCECodeSupplier&#039;&#039;&#039; gives you the ruby code&lt;br /&gt;
* &#039;&#039;&#039;RubyCommandWrapper&#039;&#039;&#039; a wrapper for Message&lt;br /&gt;
* &#039;&#039;&#039;GSDMessageProcessing&#039;&#039;&#039; is [[Message_Translation|message translator]] which will try to run command if it&#039;s implemented without translation.&lt;br /&gt;
* &#039;&#039;&#039;RubySerialIOConnectionWrapper&#039;&#039;&#039; helps to wrap Serial and TCP/IP based connection under same interface, see down the hierarchy the connection you need.&lt;br /&gt;
&lt;br /&gt;
There are also some files needed for building a library for ruby with SWIG, let them alone, it should work.&lt;br /&gt;
&lt;br /&gt;
The compilation will give you &#039;&#039;&#039;Generic_Serial_Device&#039;&#039;&#039; and &#039;&#039;&#039;Ruby_Generic_Serial_Device.so&#039;&#039;&#039;, first file is the binary itself, second file is the bridge library and it will be included by ruby (the request for it is in the first line of the generated source)&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
* Only &#039;&#039;&#039;ONE&#039;&#039;&#039; command can be executed at a time. This is a limitation of embedded ruby, which should be run from one thread only.&lt;br /&gt;
* If command expected an answer, it would wait about 20 seconds for the ruby command to complete, and if the command haven&#039;t completed yet, it would send an empty response.&lt;br /&gt;
* Most of the data are pretty cryptic (like &#039;&#039;device_.devdata_[114]&#039;&#039;), you have to look that that number represents (device data id, command id, command parameter id, event id, event parameter id, some other id)&lt;br /&gt;
&lt;br /&gt;
== Short example ==&lt;br /&gt;
For more details about exported classes and available methods check [[GSD_Ruby_Interface]]&lt;br /&gt;
&lt;br /&gt;
Here is a short example from &#039;&#039;Panasonic IP Camera&#039;&#039;:&lt;br /&gt;
   0:require &#039;Ruby_Generic_Serial_Device&#039;&lt;br /&gt;
   1:class Command &amp;lt; Ruby_Generic_Serial_Device::RubyCommandWrapper&lt;br /&gt;
   2:end&lt;br /&gt;
   3:class Device_47 &amp;lt; Ruby_Generic_Serial_Device::RubySerialWrapper&lt;br /&gt;
   4:#### 84 ####################################################################&lt;br /&gt;
   5:def cmd_84(data, format, disable_aspect_lock, streamid, width, height)&lt;br /&gt;
   6:@returnParamArray.clear&lt;br /&gt;
   7:conn_.Reconnect()&lt;br /&gt;
   8:auth_s=device_.devdata_[114]+&amp;quot;:&amp;quot;+device_.devdata_[115]&lt;br /&gt;
   9:auth_a=Array.new;&lt;br /&gt;
  10:auth_s.each{|c| auth_a.push(c)}&lt;br /&gt;
  11:&lt;br /&gt;
  12:fix_path=device_.devdata_[2];&lt;br /&gt;
  13:fix_path=&#039;/&#039;+fix_path if fix_path[0]!=&#039;/&#039;[0];&lt;br /&gt;
  14:&lt;br /&gt;
  15:s = &amp;quot;GET &amp;quot;+fix_path+&amp;quot; HTTP/1.0\r\n&amp;quot;&lt;br /&gt;
  16:s+= &amp;quot;Accept: */*\r\n&amp;quot;&lt;br /&gt;
  17:s+= &amp;quot;Authorization: Basic &amp;quot;+auth_a.pack(&amp;quot;m&amp;quot;).chop+&amp;quot;\r\n&amp;quot;&lt;br /&gt;
  18:s+= &amp;quot;\r\n&amp;quot;&lt;br /&gt;
  19:&lt;br /&gt;
  20:conn_.Send(s)&lt;br /&gt;
  21:recv=&amp;quot;&amp;quot;&lt;br /&gt;
  22:loop {&lt;br /&gt;
  23:  buff=conn_.Recv(16384, 5000)&lt;br /&gt;
  24:  if buff.empty?&lt;br /&gt;
  25:    break&lt;br /&gt;
  26:  end&lt;br /&gt;
  27:  recv += buff&lt;br /&gt;
  28:}&lt;br /&gt;
  29:if recv=~ /^HTTP[^\r\n]+200\sOK.+?\r\n\r\n(.+)$/m&lt;br /&gt;
  30:  data_set($1)&lt;br /&gt;
  31:  format_set(&#039;jpg&#039;)&lt;br /&gt;
  32:end&lt;br /&gt;
  33:return @returnParamArray&lt;br /&gt;
  34:end&lt;br /&gt;
 ...&lt;br /&gt;
 194:#### START SETTERS ####################################################################&lt;br /&gt;
 195:def initialize()&lt;br /&gt;
 196:super&lt;br /&gt;
 197:@returnParamArray=Array.new&lt;br /&gt;
 198:end&lt;br /&gt;
 199:def data_set(value)&lt;br /&gt;
 200:@returnParamArray[19]=value&lt;br /&gt;
 201:end&lt;br /&gt;
 202:def format_set(value)&lt;br /&gt;
 203:@returnParamArray[20]=value&lt;br /&gt;
 204:end&lt;br /&gt;
 205:####  END  SETTERS ####################################################################&lt;br /&gt;
 206:end&lt;br /&gt;
You can see how command 84 (GetVideoFrame) is implemented:&lt;br /&gt;
* it has 6 parameters &#039;&#039;cmd_84(data, format, disable_aspect_lock, streamid, width, height)&#039;&#039;, parameters &#039;&#039;data&#039;&#039; and &#039;&#039;format&#039;&#039; are also output parameters&lt;br /&gt;
* to set output parameters methods like &#039;&#039;data_set&#039;&#039; and &#039;&#039;format_set&#039;&#039; are automatically generated&lt;br /&gt;
* &#039;&#039;device_.devdata_[114]&#039;&#039;, &#039;&#039;device_.devdata_[115]&#039;&#039; are the username and password to login into camera &lt;br /&gt;
* then it creates HTTP header with basic authorization&lt;br /&gt;
* &#039;&#039;device_.devdata_[2]&#039;&#039; is the path to the snapshot (it is configurable because it can change between models)&lt;br /&gt;
* it sends the request and waits for the answer&lt;br /&gt;
* reads the answer, regexp parse it and gets JPEG content&lt;br /&gt;
* sets output parameters&lt;br /&gt;
* returns @returnParamArray (the return statement is added automatically)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Example - Adding Clipsal Interface ==&lt;br /&gt;
&lt;br /&gt;
We can control lights, curtains and climate controls using Clipsal Interface that connects through Serial Port.&lt;br /&gt;
&lt;br /&gt;
[[Here is a detailed example of how to add Clipsal Interface using Generic Serial Device.|Adding Clipsal Interface using Generic Serial Device]]&lt;br /&gt;
&lt;br /&gt;
== Useful Pages ==&lt;br /&gt;
* [[Serial Hack]] - A quick and dirty hack to fix the USB to Serial adapter problem! (Device not showing the correct block device on the admin panel)&lt;br /&gt;
* [[How to add your own GSD device]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Programmer&#039;s Guide]]&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_384&amp;diff=36803</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=36803"/>
		<updated>2016-07-03T09:30:55Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category: GSD]]&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>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_373&amp;diff=36802</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=36802"/>
		<updated>2016-07-03T09:30:27Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category: GSD]]&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>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_760&amp;diff=36801</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=36801"/>
		<updated>2016-07-03T09:30:02Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category: GSD]]&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>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Insteon_PLM_Ruby_Code_756&amp;diff=36800</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=36800"/>
		<updated>2016-07-03T09:29:30Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Versioninfo}}&lt;br /&gt;
[[category: Insteon]]&lt;br /&gt;
[[Category: GSD]]&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>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=ESS_Expandable_Speaker_Selector_Switch&amp;diff=36799</id>
		<title>ESS Expandable Speaker Selector Switch</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=ESS_Expandable_Speaker_Selector_Switch&amp;diff=36799"/>
		<updated>2016-07-03T09:25:45Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added category: GSD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[Category: Audio]]&lt;br /&gt;
[[Category: GSD]]&lt;br /&gt;
{{versioninfo}}&lt;br /&gt;
{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Ess2468.gif]]&lt;br /&gt;
&lt;br /&gt;
More info about [http://hacs.com/essall.php device ] :&lt;br /&gt;
&lt;br /&gt;
This is nice multizone expandable speaker selector swithc, that can be IR or RS232 controlled. Each zone can also have separate control for 11 volume levels. Although recently it&#039;s price went significantly up, I still think it&#039;s quite usable (I&#039;m yet about to try it in real life). I&#039;ll use it for connecting several speakers pairs to Multiroom secondary stereo amplified output on my Marantz SR5600. In this way I&#039;ll get nice configurable family home audio system with two audio channels distributed around house and fully controlled by LMCE (I produce second channel also on LMCE Hybrid, by using squeezeslave and another USB sound card)...&lt;br /&gt;
&lt;br /&gt;
Device includes &amp;quot;base&amp;quot; module, to whom you simply attach different modules (they differ on volume control features) for each zone up to 31. Each zone is simply numbered, zone 0 is special zone - sending commands to that zone will have effect on all zones at once.&lt;br /&gt;
&lt;br /&gt;
There is simple RS232 protocol for this device, described [http://hacs.com/ess_commands.php?PHPSESSID=5849f9d4952a3863fd68a4d2a507123c here] It&#039;s pretty simple and ASCII based..&lt;br /&gt;
&lt;br /&gt;
The whole idea of implementation is to have each zone represented by &amp;quot;Zone&amp;quot; child devices (template #1867), adding as much as you have them in your device. By default zone &amp;quot;0&amp;quot; will be represented by device it self - so sending commands to parent device will have effect on all zones. Sending commands only to Zone child devices, will have effect only in target zone. At the start, 1 child zone is added to parent device - I assume there will be at least one zone in system. Then you add more zones to suit your system.&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Description of needed templates ==&lt;br /&gt;
&lt;br /&gt;
I hope that this template will be available with stock LMCE distribution, so you won&#039;t have to create that template from scratch. Template is called &amp;quot;ESS Speaker Selector RS232&amp;quot; and was created from scratch but inspired by my work on &amp;quot;SR Marantz Multiroom RS232&amp;quot; template described on wiki.&lt;br /&gt;
&lt;br /&gt;
For template to be functional I&#039;ve made certain extensions to existing template for &amp;quot;Zone&amp;quot; that I hope will be usefull also to others. Extensions are described here [Marantz_SR5600]&lt;br /&gt;
&lt;br /&gt;
=== Important device data and parameters for &amp;quot;ESS Speaker Selector RS232&amp;quot; template ===&lt;br /&gt;
 Description : ESS Speaker Selector RS232&lt;br /&gt;
 Implements DCE : yes&lt;br /&gt;
 Command line : Generic_Serial_Device&lt;br /&gt;
 Device Category  AV/preamps/... #103&lt;br /&gt;
 Manufacturer HACS - Home Automation Control Systems&lt;br /&gt;
&lt;br /&gt;
Also have added following parameters :&lt;br /&gt;
&lt;br /&gt;
 Device data&lt;br /&gt;
 Current Data 	                                    Comments 	                                Default Value&lt;br /&gt;
 #37 COM Port on PC                                                                              /dev/ttyS0 	&lt;br /&gt;
 #76 COM Port ParityBit/Stop 	                                                                 N81&lt;br /&gt;
 #78 COM Port BaudRate 	                                                                         B9600&lt;br /&gt;
 #220 Process Child Commands In Pare                                                              1 (needed to have ability to send all commands to parent) 	&lt;br /&gt;
 #157 Discrete Volume(bool)  	                                                                 1 					&lt;br /&gt;
&lt;br /&gt;
Settings are factory defaults and should&#039;t be changed (9600 baud rate, 8 bits, 1 stop bit)...&lt;br /&gt;
&lt;br /&gt;
=== &#039;Edit Ruby code&#039; (on template page)  ===&lt;br /&gt;
==== &#039;Determining proper set of inputs&#039; ====&lt;br /&gt;
&lt;br /&gt;
Device has two inputs for amplified stereo signals (A,B). Then each zone or all together can be switched on/off and set to input A or B. Zone modules can have no volume control, manual control or 11-level volume control controlled from RS232 interface. Each zone has two inputs for amplified signalI&#039;ve added all inputs that are present on device. There is also a special input called &amp;quot;FM&amp;quot; where I connected Live TV embedded device to be able to control tuner functions (tuning/searching up/down, go to preset stations, etc...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;Set proper set of commands&#039; ====&lt;br /&gt;
&lt;br /&gt;
Basically I&#039;ve added command groups : &lt;br /&gt;
 Ruby Internal Commands&lt;br /&gt;
 Simple IO commands (on,off)&lt;br /&gt;
 Volume Commands (vol+,vol-,set volume)&lt;br /&gt;
 Inputs  (A,B)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;Add Ruby snippets to commands&#039;==== &lt;br /&gt;
&lt;br /&gt;
I&#039;ve created new IR/Codeset group called &amp;quot;ESS Speaker Selector RS232&amp;quot;, although I&#039;m not sure how to handle it. Have also edited corresponding Ruby snippets for each command. Basically those are just simple strings that get sent on rs232 (they differ mainly on target zone) to take proper action on device according to received command from LinuxMCE... &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More important parts with more Ruby code :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
 Power&lt;br /&gt;
#193 Off&lt;br /&gt;
	SendZoneCommand(cmd) 	&lt;br /&gt;
&lt;br /&gt;
#192 On&lt;br /&gt;
	SendZoneCommand(cmd) 	&lt;br /&gt;
&lt;br /&gt;
Inputs&lt;br /&gt;
#953 A&lt;br /&gt;
	SendZoneCommand(cmd) 	&lt;br /&gt;
&lt;br /&gt;
#954 B&lt;br /&gt;
	SendZoneCommand(cmd) 	&lt;br /&gt;
&lt;br /&gt;
Internal&lt;br /&gt;
#373 Private Method Listing&lt;br /&gt;
  ###########################################################3 Internal Methods&lt;br /&gt;
  # To do list :&lt;br /&gt;
  # - ???&lt;br /&gt;
  #&lt;br /&gt;
  #&lt;br /&gt;
  # RS232 protocol, ZN=Zone Number (00 is all, 01-31 separate zones)&lt;br /&gt;
  # ZN 01 ON&lt;br /&gt;
  # ZN 02 OFF&lt;br /&gt;
  # ZN 03 A AMP&lt;br /&gt;
  # ZN 04 B AMP&lt;br /&gt;
  # ZN 07 VOLUME UP&lt;br /&gt;
  # ZN 08 VOLUME DOWN&lt;br /&gt;
  # ZN 09 SET LEVEL 0&lt;br /&gt;
  # ZN 10 SET LEVEL 1&lt;br /&gt;
  # ZN 11 SET LEVEL 2&lt;br /&gt;
  # ZN 12 SET LEVEL 3&lt;br /&gt;
  # ZN 13 SET LEVEL 4&lt;br /&gt;
  # ZN 14 SET LEVEL 5&lt;br /&gt;
  # ZN 15 SET LEVEL 6&lt;br /&gt;
  # ZN 16 SET LEVEL 7&lt;br /&gt;
  # ZN 17 SET LEVEL 8&lt;br /&gt;
  # ZN 18 SET LEVEL 9&lt;br /&gt;
  # ZN 19 SET LEVEL 10&lt;br /&gt;
  # ZN 20 SET LEVEL 11&lt;br /&gt;
  # ZN 32 ? STATUS&lt;br /&gt;
  # ZN 33 ? LEVEL&lt;br /&gt;
  # ZN 34 ? ON/OFF&lt;br /&gt;
  # ZN 35 ? A/B &lt;br /&gt;
  &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 = File.open(&amp;quot;/var/log/pluto/ESS.log&amp;quot;, &amp;quot;a&amp;quot;)&lt;br /&gt;
  	  logTime = Time.now&lt;br /&gt;
  	  timeStr = logTime.strftime(&amp;quot;%d-%m-%Y  %H:%M:%S  &amp;quot;)&lt;br /&gt;
  &lt;br /&gt;
  	  $log.puts timeStr + &amp;quot;(***):&amp;quot; + line.to_s&lt;br /&gt;
            $log.close&lt;br /&gt;
  end 	&lt;br /&gt;
  &lt;br /&gt;
  def Send_RS232_Command(command)&lt;br /&gt;
          log(&amp;quot;Send_RS232_Command: [&amp;quot; + command+ &amp;quot;]\n&amp;quot;)&lt;br /&gt;
  #	conn_.Send(&amp;quot;[&amp;quot; + command+ &amp;quot;]&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  def SendZoneCommand(cmd)&lt;br /&gt;
  &lt;br /&gt;
    log(&amp;quot;Got Command with ID: &amp;quot; + cmd.id_.to_s + &amp;quot; from: &amp;quot; + cmd.devidfrom_.to_s + &amp;quot; to: &amp;quot; + cmd.devidto_.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
    zone = GetZone(cmd.devidto_)&lt;br /&gt;
    if( zone &amp;gt;= 0 )&lt;br /&gt;
  	        zone_desc=device_.childdevices_[cmd.devidto_].devdata_[186]&lt;br /&gt;
  		log(&amp;quot;SendZoneCommand: Child Zone &amp;quot; + zone_desc + &amp;quot;[&amp;quot; + zone.to_s + &amp;quot;]\n&amp;quot;)&lt;br /&gt;
    elsif (cmd.devidto_ == device_.devid_)&lt;br /&gt;
  		log(&amp;quot;SendZoneCommand: All Zones &amp;quot; + zone.to_s + &amp;quot;. Sending command to all zones !!!&amp;quot;)&lt;br /&gt;
  		zone=0&lt;br /&gt;
  		zone_desc=&amp;quot;All Zones&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
  		log(&amp;quot;SendZoneCommand: Invalid zone &amp;quot; + zone.to_s + &amp;quot;. Send commands only to valid devices!!!&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
     &lt;br /&gt;
    serial_command = &amp;quot;&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    case cmd.id_&lt;br /&gt;
       	when 192 #192 is ON &lt;br /&gt;
       		serial_command = sprintf(&amp;quot;%02d&amp;quot;,zone)+sprintf(&amp;quot;%02d&amp;quot;,1);&lt;br /&gt;
       		Send_RS232_Command(serial_command);&lt;br /&gt;
       		temp_cmd = Command.new(cmd.id_, -1001, 1, 2, 48);&lt;br /&gt;
       		temp_cmd.params_[10] = &amp;quot;1&amp;quot;;&lt;br /&gt;
       		SendCommand(temp_cmd);&lt;br /&gt;
       		$ZoneStatus[zone.to_s] = &amp;quot;ON&amp;quot;;&lt;br /&gt;
       		if (zone==0)&lt;br /&gt;
       			SetZones(&amp;quot;ON&amp;quot;)&lt;br /&gt;
       		end&lt;br /&gt;
       	when 193 #193 is OFF&lt;br /&gt;
       		serial_command = sprintf(&amp;quot;%02d&amp;quot;,zone)+sprintf(&amp;quot;%02d&amp;quot;,2);&lt;br /&gt;
       		Send_RS232_Command(serial_command);&lt;br /&gt;
       		temp_cmd = Command.new(cmd.id_, -1001, 1, 2, 48);&lt;br /&gt;
       		temp_cmd.params_[10] = &amp;quot;0&amp;quot;;&lt;br /&gt;
       		SendCommand(temp_cmd);&lt;br /&gt;
       		$ZoneStatus[zone.to_s] = &amp;quot;OFF&amp;quot;;&lt;br /&gt;
       		if (zone==0)&lt;br /&gt;
       			SetZones(&amp;quot;OFF&amp;quot;)&lt;br /&gt;
       		end&lt;br /&gt;
  &lt;br /&gt;
       	when 90 #90 is Volume Down&lt;br /&gt;
       		serial_command = sprintf(&amp;quot;%02d&amp;quot;,zone)+sprintf(&amp;quot;%02d&amp;quot;,8);&lt;br /&gt;
       		Send_RS232_Command(serial_command);&lt;br /&gt;
       		$ZoneVolumes[zone.to_s] = $ZoneVolumes[zone.to_s] - 10&lt;br /&gt;
       		if ($ZoneVolumes[zone.to_s]&amp;lt;0)&lt;br /&gt;
       			$ZoneVolumes[zone.to_s]=0&lt;br /&gt;
  		end&lt;br /&gt;
       		SetDeviceDataInDB( cmd.devidto_, 158, ($ZoneVolumes[zone.to_s]).to_s ) # 158 = DEVICEDATA_Volume_Level_CONST&lt;br /&gt;
       		temp_cmd = Command.new(cmd.devidto_, -1001, 1, 2, 71);&lt;br /&gt;
       		temp_cmd.params_[30] = ($ZoneVolumes[zone.to_s]).to_s&lt;br /&gt;
       		SendCommand(temp_cmd);&lt;br /&gt;
  		&lt;br /&gt;
       	when 89 #90 is Volume Up&lt;br /&gt;
       		serial_command = sprintf(&amp;quot;%02d&amp;quot;,zone)+sprintf(&amp;quot;%02d&amp;quot;,7);&lt;br /&gt;
       		Send_RS232_Command(serial_command);&lt;br /&gt;
       		$ZoneVolumes[zone.to_s] = $ZoneVolumes[zone.to_s] + 10&lt;br /&gt;
       		if ($ZoneVolumes[zone.to_s]&amp;gt;=120)&lt;br /&gt;
       			$ZoneVolumes[zone.to_s]=110&lt;br /&gt;
  		end&lt;br /&gt;
       		SetDeviceDataInDB( cmd.devidto_, 158, ($ZoneVolumes[zone.to_s]).to_s ) # 158 = DEVICEDATA_Volume_Level_CONST&lt;br /&gt;
       		temp_cmd = Command.new(cmd.devidto_, -1001, 1, 2, 71);&lt;br /&gt;
       		temp_cmd.params_[30] = ($ZoneVolumes[zone.to_s]).to_s&lt;br /&gt;
       		SendCommand(temp_cmd);&lt;br /&gt;
       	when 313 #313 is Set Volume with Level as Param #76&lt;br /&gt;
  		log(&amp;quot;313:Set Volume Command: Got Cmd with ID: &amp;quot; + cmd.id_.to_s + &amp;quot; from: &amp;quot; + cmd.devidfrom_.to_s + &amp;quot; to: &amp;quot; + cmd.devidto_.to_s + &amp;quot; | Zone : &amp;quot; + zone.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
       		level=(cmd.params_[76]).to_i&lt;br /&gt;
       		if level &amp;gt;110 &lt;br /&gt;
       			level=110&lt;br /&gt;
  			log(&amp;quot;313:Set Volume Command: Volume too high - truncated to max level of 110\n&amp;quot;)&lt;br /&gt;
       		elsif level &amp;lt;0&lt;br /&gt;
       			level=0&lt;br /&gt;
  			log(&amp;quot;313:Set Volume Command: Volume too low - truncated to min level of 0\n&amp;quot;)&lt;br /&gt;
       		end&lt;br /&gt;
  		level = (level/10.0).round&lt;br /&gt;
       		serial_command = sprintf(&amp;quot;%02d&amp;quot;,zone)+sprintf(&amp;quot;%02d&amp;quot;,level+9);&lt;br /&gt;
       		Send_RS232_Command(serial_command);&lt;br /&gt;
       		$ZoneVolumes[zone.to_s] = (cmd.params_[76]).to_i&lt;br /&gt;
       		SetDeviceDataInDB( cmd.devidto_, 158, ($ZoneVolumes[zone.to_s]).to_s ) # 158 = DEVICEDATA_Volume_Level_CONST&lt;br /&gt;
       		temp_cmd = Command.new(cmd.devidto_, -1001, 1, 2, 71);&lt;br /&gt;
       		temp_cmd.params_[30] = ($ZoneVolumes[zone.to_s]).to_s&lt;br /&gt;
       		SendCommand(temp_cmd);&lt;br /&gt;
       		if (zone==0)&lt;br /&gt;
       			SetVolumes($ZoneVolumes[zone.to_s])&lt;br /&gt;
       		end&lt;br /&gt;
  &lt;br /&gt;
       	when 616 #616 is Select A&lt;br /&gt;
       		serial_command = sprintf(&amp;quot;%02d&amp;quot;,zone)+sprintf(&amp;quot;%02d&amp;quot;,3);&lt;br /&gt;
       		Send_RS232_Command(serial_command);&lt;br /&gt;
       	when 617 #617 is Select B&lt;br /&gt;
       		serial_command = sprintf(&amp;quot;%02d&amp;quot;,zone)+sprintf(&amp;quot;%02d&amp;quot;,4);&lt;br /&gt;
       		Send_RS232_Command(serial_command);&lt;br /&gt;
       	else&lt;br /&gt;
       		log(&amp;quot;Yet not implemented: Handler for command: ID &amp;quot; + cmd.id.to_s)&lt;br /&gt;
       end&lt;br /&gt;
  	&lt;br /&gt;
  &lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  def GetZone(deviceDestination)&lt;br /&gt;
  	if( device_.mapDevice_PortChannel_.has_key?(deviceDestination) and&lt;br /&gt;
  		device_.mapDevice_PortChannel_[deviceDestination] != nil and&lt;br /&gt;
  		!device_.mapDevice_PortChannel_[deviceDestination].empty? )&lt;br /&gt;
  		return device_.mapDevice_PortChannel_[deviceDestination].to_i&lt;br /&gt;
  	end&lt;br /&gt;
  	&lt;br /&gt;
  	return -1&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  def ReceiveReport()&lt;br /&gt;
  	@buff = conn_.RecvDelimited(&amp;quot;]&amp;quot;, 1000) &lt;br /&gt;
  	log(&amp;quot;Response from ESS: &amp;quot; + @buff + &amp;quot;\n&amp;quot;)&lt;br /&gt;
  #	log(&amp;quot;Calling DecodeReceivedInfo: &amp;quot; + @buff + &amp;quot;\n&amp;quot;)&lt;br /&gt;
  #	temp_resp=@buff;&lt;br /&gt;
  #	DecodeReceivedInfo(temp_resp)&lt;br /&gt;
  #	log(&amp;quot;End of DecodeReceivedInfo: &amp;quot; + temp_resp + &amp;quot;\n&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  def SetVolumeInZone(level,zone)&lt;br /&gt;
  # Sets Normalized Volume Level (0..100) in certain zone &lt;br /&gt;
    normlevel = (level.to_i/10.0).round&lt;br /&gt;
    log(&amp;quot;SetVolumeInZone: volume: &amp;quot; + level.to_s + &amp;quot; [&amp;quot;+ normlevel.to_s + &amp;quot;] =&amp;gt; Zone: &amp;quot; + zone + &amp;quot;\n&amp;quot;)&lt;br /&gt;
  &lt;br /&gt;
    serial_command = sprintf(&amp;quot;%02d&amp;quot;,zone)+sprintf(&amp;quot;%02d&amp;quot;,normlevel+9);&lt;br /&gt;
    Send_RS232_Command(serial_command);&lt;br /&gt;
  #  log(&amp;quot;313:Set Volume Command: Got Cmd with ID: &amp;quot; + cmd.id_.to_s + &amp;quot; from: &amp;quot; + cmd.devidfrom_.to_s + &amp;quot; to: &amp;quot; + cmd.devidto_.to_s + &amp;quot; | Zone : &amp;quot; + zone.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
    $ZoneVolumes[zone.to_s] = level.to_i&lt;br /&gt;
  &lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  def SetZonesInitialVolumes()&lt;br /&gt;
  	log(&amp;quot;####### Set Initial Volume Levels for zones\n&amp;quot;)&lt;br /&gt;
  	device_.mapDevice_PortChannel_.each do |key, value|&lt;br /&gt;
  		volume = device_.childdevices_[key].devdata_[208]&lt;br /&gt;
  		log(&amp;quot;Zone &amp;quot; + value.to_s + &amp;quot; =&amp;gt; &amp;quot; + volume.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
                sleep 1.0&lt;br /&gt;
  		SetVolumeInZone(volume.to_i,value)&lt;br /&gt;
    		SetDeviceDataInDB( device_.childdevices_[key].devid_, 158, ($ZoneVolumes[value.to_s]).to_s ) # 158 = DEVICEDATA_Volume_Level_CONST&lt;br /&gt;
    	end&lt;br /&gt;
  	&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  def SetZones(state)&lt;br /&gt;
  	log(&amp;quot;####### Setting all zones to &amp;quot; + state + &amp;quot;\n&amp;quot;)&lt;br /&gt;
  	device_.mapDevice_PortChannel_.each do |key, value|&lt;br /&gt;
  		$ZoneStatus[value] = state&lt;br /&gt;
  		log(&amp;quot;Zone &amp;quot; + value.to_s + &amp;quot; =&amp;gt; &amp;quot; + state + &amp;quot;\n&amp;quot;)&lt;br /&gt;
   	end&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  def SetVolumes(level_int)&lt;br /&gt;
  	log(&amp;quot;####### Set Volume Levels for all zones\n&amp;quot;)&lt;br /&gt;
  	device_.mapDevice_PortChannel_.each do |key, value|&lt;br /&gt;
  		log(&amp;quot;Zone &amp;quot; + value.to_s + &amp;quot; =&amp;gt; &amp;quot; + level_int.to_s + &amp;quot;\n&amp;quot;)&lt;br /&gt;
  		$ZoneVolumes[value.to_s] = level_int&lt;br /&gt;
    		SetDeviceDataInDB( device_.childdevices_[key].devid_, 158, ($ZoneVolumes[value.to_s]).to_s ) # 158 = DEVICEDATA_Volume_Level_CONST&lt;br /&gt;
    	end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#351 Process IDLE&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
#350 Process Incoming Data&lt;br /&gt;
	ReceiveReport() 	&lt;br /&gt;
&lt;br /&gt;
#355 Process Initialize&lt;br /&gt;
&lt;br /&gt;
 log(&amp;quot;Initializing ESS GSD Device\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 sleep 1.0&lt;br /&gt;
 Send_RS232_Command(&amp;quot;0002&amp;quot;);  #All Zones OFF&lt;br /&gt;
 sleep 1.0&lt;br /&gt;
 Send_RS232_Command(&amp;quot;0020&amp;quot;);  #All Zones Max Volume&lt;br /&gt;
 sleep 1.0&lt;br /&gt;
 Send_RS232_Command(&amp;quot;0003&amp;quot;);  #All Zones Select A&lt;br /&gt;
 sleep 1.0&lt;br /&gt;
 $ZoneVolumes = Hash.new()&lt;br /&gt;
 $ZoneStatus  = Hash.new()&lt;br /&gt;
&lt;br /&gt;
 SetZones(&amp;quot;OFF&amp;quot;)&lt;br /&gt;
 SetZonesInitialVolumes()&lt;br /&gt;
&lt;br /&gt;
 log(&amp;quot;Initialization of ESS GSD Device finished !!!!\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#384 Process Receive Command For Child&lt;br /&gt;
	SendZoneCommand(cmd) 	&lt;br /&gt;
&lt;br /&gt;
#356 Process Release&lt;br /&gt;
 Send_RS232_Command(&amp;quot;0002&amp;quot;);  #All Zones OFF&lt;br /&gt;
&lt;br /&gt;
 Send_RS232_Command(&amp;quot;0020&amp;quot;);  #All Zones Max Volume&lt;br /&gt;
&lt;br /&gt;
 Send_RS232_Command(&amp;quot;0003&amp;quot;);  #All Zones Select A&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 log(&amp;quot;Shutting Down ESS GSD Device finished !!!!\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
#616 Select A&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
#617 Select B&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
Sound &amp;amp; Volume&lt;br /&gt;
#97 Mute&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
#313 Set Volume&lt;br /&gt;
	SendZoneCommand(cmd) 	&lt;br /&gt;
&lt;br /&gt;
#90 Vol Down&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
#89 Vol Up&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Express_Controls_EZmotion_(HSM_100)&amp;diff=36714</id>
		<title>Express Controls EZmotion (HSM 100)</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Express_Controls_EZmotion_(HSM_100)&amp;diff=36714"/>
		<updated>2016-04-07T14:14:03Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Added necessary reload info and check for association&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
{{Versioninfo|810Status=Working,PnP as 3 multilevel sensors|810UpdatedDate=4th May 2010|810UpdatedBy=sambuca|1204Status=Working,PnP with editing as 3 multilevel sensors|1204UpdatedDate=22th Feb 2014|1204UpdatedBy=RayBe}}&lt;br /&gt;
[[Category: RF Control]]&lt;br /&gt;
[[Category: ZWave]]&lt;br /&gt;
[[Category: ZWave_security]]&lt;br /&gt;
[[Category: ZWave_motion_sensor]]&lt;br /&gt;
[[Category: ZWave_light_sensor]]&lt;br /&gt;
[[Category: ZWave_temperature_sensor]]&lt;br /&gt;
[[Category: Security]]&lt;br /&gt;
&lt;br /&gt;
= About = &lt;br /&gt;
The EZMotion is a 3-in-1 Z-Wave sensor. This is also sold by Innovus and Homeseer (HSM100)&lt;br /&gt;
&lt;br /&gt;
Manuf ID1: 0x0 ID2: 0x1e, Prod Typ1: 0x0 Typ2: 0x2, Prod ID1: 0x0 ID2: 0x1&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* Motion detection&lt;br /&gt;
* Light sensor&lt;br /&gt;
* Temperature sensor.&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
== 1004 ==&lt;br /&gt;
If you use SIS mode in your ZWave setup, this device should automatically be added as three multilevel sensors.&lt;br /&gt;
If not, it is possible to set it up manually. If you are running SIS mode, you can delete the main device and re-add it as a motion detector, see below for details.&lt;br /&gt;
&lt;br /&gt;
You will have one multilevel sensor added for the EZMotion. Find and open this from the device tree.&lt;br /&gt;
We will change this to be the thermometer instance. Find the Port/Channel number. This is the node ID.&lt;br /&gt;
Change the Port/Channel number to &amp;lt;node id&amp;gt;/3 (for instance 4/3 if your node id is 4), type to Thermometer, insert 49 in Capabilities, and save.&lt;br /&gt;
&lt;br /&gt;
Add a new device below the ZWave Embedded Climate Interface using the same device template (Multilevel sensor).&lt;br /&gt;
Insert &amp;lt;node id&amp;gt;/2 in Port/Channel number, insert 49 in Capabilities and save.&lt;br /&gt;
This will be the brightness sensor.&lt;br /&gt;
Please notice that the values returned from this sensor ranges from 0 to 100% and is relative to the light measured since X (see the manual).&lt;br /&gt;
&lt;br /&gt;
Then we add the Motion detector. This will not be added automatically even when running the SIS mode.&lt;br /&gt;
Open the ZWave Embedded Security Interface and click Create New Child. Select the Motion Detector template.&lt;br /&gt;
Insert &amp;lt;node id&amp;gt; in Port/Channel number, Motion Detector in type, 133,96,49,112,132,128,114,119,134 in Capabilities, and save.&lt;br /&gt;
&lt;br /&gt;
Reload router and you should receive events from all three sensors.&lt;br /&gt;
The motion detector will also report a values(which is not sent to LMCE atm.). This value if the number of minutes since last motion was detected, and 0 if no motion was detected. See the manual for more information.&lt;br /&gt;
&lt;br /&gt;
Note: when using Homepro ZCU010 USB computer interface you will have to send a &amp;quot;Set Association&amp;quot; command hooking up the controller and the HSM 100. If not done the HSM100 will not report back to LinuxMCE.&lt;br /&gt;
Node ID of controller can be found in the Zwave log file; &#039;&#039;Home id: 0x0000e95d, our node id: 239 &amp;lt;0xb6d59b70&amp;gt;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== 1204 and later(OpenZwave)==&lt;br /&gt;
If you use SIS mode in your ZWave setup, this device should automatically be added as three sensors. &lt;br /&gt;
For example:&lt;br /&gt;
* Port/Channel Number = 7, dt = 1946 (Multilevel Sensor)&lt;br /&gt;
* Port/Channel Number = 7/1, dt = 1745 (Brightness Sensor)&lt;br /&gt;
* Port/Channel Number = 7/2, dt = 1744 (Temperature Sensor)&lt;br /&gt;
(The Port/Channel Number 7 in the above example may vary in your setup, but for explanation use, we will use it here)&lt;br /&gt;
&lt;br /&gt;
To get the motion sensor setup, you must do the following:&lt;br /&gt;
* In webadmin, click on Advanced -&amp;gt; Configuration -&amp;gt; Devices, which shows your device tree on the left&lt;br /&gt;
* In this tree find your Zwave device and expand it completely&lt;br /&gt;
* Delete the Multilevel Sensor with Port/Channel Number 7&lt;br /&gt;
* Click on ZWave Embedded Security Interface&lt;br /&gt;
* On the right pane, click on Create Child Device&lt;br /&gt;
* Add Device Template #54, Motion Detector&lt;br /&gt;
* In the Port/Channel Number field of this DT, fill in 7, corresponding with the Port/Channel Number you deleted above&lt;br /&gt;
* Do a router reload&lt;br /&gt;
* Open a terminal and login to your core, give the command: sudo killall ZWave&lt;br /&gt;
Let your Zwave device startup (you can follow its progress in the follow log of your main Zwave device) &lt;br /&gt;
On a active Orbiter you should get asked to regen, do it and the new motion sensor gets added to the security section&lt;br /&gt;
* Go to the advanced ZWave page in webadmin, click on node 7 and check in the Associations tab if Motion is associated with node 1 (the controller). Only when set, the controller gets motion events from this node.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
To change the interval temperature and light is reported go to Home &amp;gt; My Devices &amp;gt; CORE &amp;gt; ZWave and chose &amp;quot;Send command to device&amp;quot;. Select &amp;quot;SetWakeUp&amp;quot; and set parameters as follows:&lt;br /&gt;
For 1204, you should instead use the [[Advanced ZWave]] page to set configuration options.&lt;br /&gt;
&lt;br /&gt;
48 Value (int) : &amp;lt;the time in minutes can only be 6 or any increment of 6&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
239 NodeID (int) : &amp;lt;the zwave nodeid&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Send Message&lt;br /&gt;
&lt;br /&gt;
Then push the button on the EZmotion (HSM 100)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By default it seems that the HSM 100 has a motion timeout of 20 minutes. That means that it will not send any motion detection events for 20 minutes after it is first tripped. This is a useful setting for saving batteries but not a useful setting for an occupancy sensor controlling lights. To set the motion timeout of the HSM 100:&lt;br /&gt;
&lt;br /&gt;
#Select the ZWave device in the advanced web config devices section. &lt;br /&gt;
#Select send command to device. &lt;br /&gt;
#Select &amp;quot;Set Config Param&amp;quot; as the command to send. &lt;br /&gt;
#48 Value (int) = Your desired timeout in minutes&lt;br /&gt;
#239 NodeID (int) = The ZWave node ID of the HSM 100 to configure&lt;br /&gt;
#248 Parameter ID (int) = 2&lt;br /&gt;
#Press the blue button on the side of the HSM 100 you are trying to configure&lt;br /&gt;
#Click &amp;quot;Send Message&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Command classes =&lt;br /&gt;
0x4 0x21 0x1 &lt;br /&gt;
* COMMAND_CLASS_MULTI_INSTANCE  &lt;br /&gt;
* COMMAND_CLASS_SENSOR_MULTILEVEL &lt;br /&gt;
* COMMAND_CLASS_CONFIGURATION  &lt;br /&gt;
* COMMAND_CLASS_WAKE_UP  &lt;br /&gt;
* COMMAND_CLASS_ASSOCIATION  &lt;br /&gt;
* COMMAND_CLASS_BATTERY  &lt;br /&gt;
* COMMAND_CLASS_MANUFACTURER_SPECIFIC &lt;br /&gt;
* COMMAND_CLASS_NODE_NAMING  &lt;br /&gt;
* COMMAND_CLASS_VERSION&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
http://www.expresscontrols.com&lt;br /&gt;
&lt;br /&gt;
http://www.expresscontrols.com/pdf/EZMotionOwnerManual.pdf&lt;br /&gt;
&lt;br /&gt;
[http://www.expresscontrols.com/ideas.htm Which type of AAA battery to use in EZMotion?]&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=RaspberryPi&amp;diff=36447</id>
		<title>RaspberryPi</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=RaspberryPi&amp;diff=36447"/>
		<updated>2016-02-21T09:56:20Z</updated>

		<summary type="html">&lt;p&gt;RayBe: /* Manual Settings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[Category: Media Directors]]&lt;br /&gt;
[[Category: Barebones]]&lt;br /&gt;
qMDs are still a thing of myth, although seen occasionally in the wild they are elusive and not easily tamed. ;)&lt;br /&gt;
&lt;br /&gt;
=Device Specification=&lt;br /&gt;
*The Raspberry Pi 2 B is an ARM based computer the size of a credit card.  4x900Mhz Cores, 1GB RAM, FastEthernet, 4xUSB, 40xGPIO&lt;br /&gt;
*The Raspberry Pi B is an ARM based computer the size of a credit card.  1x700Mhz Core, 256MB or 512MB RAM, FastEthernet, 2xUSB, GPIO&lt;br /&gt;
&lt;br /&gt;
=RPi Disked Media Director=&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* Your core must be LinuxMCE 1204 or higher.&lt;br /&gt;
* The recommended device is the RPi2.  The RPi2 runs at a reasonable speed and can support all the functions of a LinuxMCE MediaDirector.  &lt;br /&gt;
* The following Raspbian based SD cards are bootable on anything that is a Raspberry Pi Model B or higher.  RPi1 performance is very, very, very slow.&lt;br /&gt;
&lt;br /&gt;
==Setup Steps==&lt;br /&gt;
*Download the rpi uSD card image ([http://download.linuxmce.org/lmce-disked-md-rpi2-jessie.tar.xz raspbian jessie (recommended)] (Updated: 2016-02-11)&lt;br /&gt;
*Download the rpi uSD card image ([http://download.linuxmce.org/lmce-disked-md-rpi2-wheezy.tar.xz raspbian wheezy (deprecated)]&lt;br /&gt;
*Download the rpi uSD card image ([http://download.linuxmce.org/lmce-disked-md-rpi2-trusty.tar.xz ubuntu trusty(RPi2 only and you&#039;re on your own here)])&lt;br /&gt;
*untar the compressed file (e.g. tar -xvJf lmce-disked-md-rpi2-jessie.tar.xz)&lt;br /&gt;
*Install the resulting image onto an SD card, using dd on linux ( e.g. sudo dd bs=4M if=2015-12-23-raspbian-jessie.img of=/dev/sdb [make sure device name is correct!]) or win32diskimage on windows&lt;br /&gt;
*Ensure the RPi is connected to the internal lan of your core and boot the RPi.&lt;br /&gt;
*You may be prompted on existing orbiters to choose a device type MD/qMD/SqueezeOnly, do so. (qMD is not working yet)&lt;br /&gt;
*The device will automatically be created, you will need to reload your router.&lt;br /&gt;
*The MD will resize the filesystem to fit the SDCard and then reboot.&lt;br /&gt;
*AVWizard will not appear.&lt;br /&gt;
*You should see the setup wizard and be asked to configure your new MD.&lt;br /&gt;
*The new RPi moonpi should continue installing and eventually present you with a UI1 OnScreen Orbiter.&lt;br /&gt;
*Please report any bugs with *very* specific (package date/svn, etc) information in a ticket.&lt;br /&gt;
&lt;br /&gt;
If you have any issues you can ssh to the rpi with:  ssh moonXX -c aes128-ctr (replace the XX with the device number. you currently have to specify the cipher https://git.linuxmce.org/linuxmce/linuxmce/issues/2451 )&lt;br /&gt;
&lt;br /&gt;
==HDMI-CEC Control==&lt;br /&gt;
Please see [[Pulse-Eight]] for HDMI-CEC setup information&lt;br /&gt;
&lt;br /&gt;
==Manual Settings==&lt;br /&gt;
*Overscan - currently only able to change by manually editing the config.txt file on the sdcard. (See [http://elinux.org/RPiconfig http://elinux.org/RPiconfig])&lt;br /&gt;
*Overscan compensation - currently only able to change by manually editing the config.txt file on the sdcard.  In /sdcard/config.txt from a booted moonpi. (See [http://elinux.org/RPiconfig http://elinux.org/RPiconfig])&lt;br /&gt;
*Orbiter will automatically regenerate following a reboot and detecting a new display resolution.&lt;br /&gt;
*Audio settings are adjusted in webadmin. Go to Wizard - Devices - Media Directors, scroll to the Media Director you want to alter and select Advanced on the right side. In the Device Data section, set one of the following parameters in the Audio settings field:&lt;br /&gt;
 S = Stereo &lt;br /&gt;
 H = HDMI&lt;br /&gt;
 H3 = HDMI with passthrough capability for AC3 &amp;amp; DTS&lt;br /&gt;
&lt;br /&gt;
==What works==&lt;br /&gt;
*Orbiter UI1&lt;br /&gt;
*Photo Screen Saver (need to disable on RPi1)&lt;br /&gt;
*AppServer&lt;br /&gt;
*HAL&lt;br /&gt;
*Embedded phone&lt;br /&gt;
*OMX_Player will play audio and video.  You must have the appropriate codecs to play MPG and VC1 media.  The codecs can be purchased from the Raspberry Pi foundation.&lt;br /&gt;
*squeezelite can play audio&lt;br /&gt;
*USB-UIRT&lt;br /&gt;
*HDMI-CEC control&lt;br /&gt;
*Generic Serial Devices (only on RPi2)&lt;br /&gt;
&lt;br /&gt;
==What does not work==&lt;br /&gt;
*Video Overlays&lt;br /&gt;
&lt;br /&gt;
= RPi2 Core =&lt;br /&gt;
This section is meant for informational purposes only and is not intended to suggest that the RaspberryPi2 would make a good core.  There is NO support for this.&lt;br /&gt;
&lt;br /&gt;
*Download an Ubuntu Trusty Tahr 14.04 image for the RPi2 from [http://www.finnie.org/software/raspberrypi/2015-04-06-ubuntu-trusty.zip http://www.finnie.org/software/raspberrypi/2015-04-06-ubuntu-trusty.zip].&lt;br /&gt;
*Unzip it and write it to an sdcard.&lt;br /&gt;
*Boot and resize the filesystem to fill the sdcard:&lt;br /&gt;
**There are no Raspbian-specific utilities included, specifically no automatic root resizer. However, it&#039;s not hard to do manually. Once booted:&lt;br /&gt;
 $ sudo fdisk /dev/mmcblk0&lt;br /&gt;
**Delete the second partition (d, 2), then re-create it using the defaults (n, p, 2, enter, enter), then write and exit (w). Reboot the system, then:&lt;br /&gt;
 $ sudo resize2fs /dev/mmcblk0p2&lt;br /&gt;
*Add the following linuxmce repo&#039;s to your /etc/apt/sources.list:&lt;br /&gt;
 deb http://deb.linuxmce.org/ubuntu/ trusty main&lt;br /&gt;
 deb http://deb.linuxmce.org/ trusty main&lt;br /&gt;
*Run:&lt;br /&gt;
 apt-get update &amp;amp;&amp;amp; DEBIAN_FRONTEND=&amp;quot;noninteractive&amp;quot; apt-get install -y --allow-unauthenticated lmce-core&lt;br /&gt;
*reboot&lt;br /&gt;
*Feel free to play.  This is not, and will never be, supported.&lt;br /&gt;
&lt;br /&gt;
=RPi1 (obsolete) =&lt;br /&gt;
 NOTE: The RPi1 is no longer supported as a LinuxMCE Diskless style device.  If you wish to continue working on RPi1 support please contact us.&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi v1 B/B+ will not be supported for much longer, but can be used as a minimal diskless Media Director within LinuxMCE.  The following instructions will show how to create a diskless MD.  The Raspberry Pi 2 is not compatible with the PXE method of booting.&lt;br /&gt;
&lt;br /&gt;
When using the sdcard below the RPi will be overclocked using the standard Raspberry Pi foundation overclock settings.  These are throttled automatically as thermally required.  You are free to overclock the device further by editing the config.txt file on the sdcard.&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* Your core must be LinuxMCE 1204 or higher.&lt;br /&gt;
* The Raspberry Pi must be a 512MB Model B (or B+).  The Model A and the 256MB Model B do not have enough RAM to boot into Orbiter.&lt;br /&gt;
* The Raspberry Pi must be plugged into the internal side of your LinuxMCE core&#039;s network to act as a media director.&lt;br /&gt;
* The Raspberry Pi must be plugged in using the HDMI connector&amp;lt;del&amp;gt; and using HDMI sound&amp;lt;/del&amp;gt;.  Set an S (for Stereo) or H (for HDMI) for the Audio Settings for the MD in webadmin.&lt;br /&gt;
** The Raspberry Pi will detect the boot resolution of your television and adjust itself accordingly.&lt;br /&gt;
** If resolution has changed since the last boot the orbiter will be regenerated.&lt;br /&gt;
* You may wish to have a usb keyboard or mouse for orbiter interaction.  USB-UIRT/MCE Remote is also possible but must be installed using the webadmin (device detection is working but the device is not added currently).&lt;br /&gt;
&lt;br /&gt;
==Setup Steps==&lt;br /&gt;
*On the Core:&lt;br /&gt;
**Install the [http://www.linuxmce.org/linux-image-default-raspbian-wheezy_3.10-3-rpi-lmce1_all.deb default PXE kernel package (lmce1)] for a Raspberry Pi MD. This image will create an RPi MD (DT#2216) only.&lt;br /&gt;
**-- To be able to choose betwen an RPi MD and an RPi qMD (as well as other possible rpi Device Templates) at MD creation use [http://www.linuxmce.org/linux-image-default-raspbian-wheezy_3.10-3-rpi-lmce2_all.deb this (lmce2)] as the default image instead.  This image will allow you to choose from multiple RPi based image including RPi MD (DT#2216), RPi qMD (DT#2281) and others.&lt;br /&gt;
**edit /usr/pluto/bin/Diskless_CreateTBZ.sh and enable &amp;quot;raspbian_armhf&amp;quot; as the only TARGET_TYPE, be sure to comment (use a #) any other TARGET_TYPE lines so that only this one is enabled.&lt;br /&gt;
**run /usr/pluto/bin/Diskless_CreateTBZ.sh to create a raspbian tarball&amp;lt;del&amp;gt;, and sdcard.zip file on your core&amp;lt;/del&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Get the LinuxMCE Raspberry Pi MD SD card contents.&lt;br /&gt;
**Download the [http://www.linuxmce.org/sdcard.zip zip] &lt;br /&gt;
***Format the SD card for VFAT using the SD card formatter for Mac or Windows https://www.sdcard.org/downloads/formatter_4, or using mkfs.vfat on linux.&lt;br /&gt;
***Copy the entire contents of the sdcard zip to the newly formatted SD card, all files should be in the root directory of the card with no sub-directories.&lt;br /&gt;
*Insert the SD card into the Raspberry Pi.&lt;br /&gt;
*Power up the Raspberry Pi.&lt;br /&gt;
*On first boot the u-boot bootloader will start, it will try to grab various different pxe files until it finally finds the default PXE kernel and initrd.&lt;br /&gt;
*The kernel will boot, there is a 10 second delay when activating the ethernet drivers to allow for the hardware to respond properly, this delay only occurs during the default kernel/initrd boot.&lt;br /&gt;
*Raspberry Pi will display &amp;quot;Announced ourselves to the router&amp;quot;.&lt;br /&gt;
**If you have the lmce1 default image installed (see above,) the core will run Diskless_Setup to prepare an RPi MD.&lt;br /&gt;
**If you have the lmce2 default image installed (see above,) you will be prompted on existing orbiters to select the type of RPi device you would like installed.  Once you have made your selection the core will run Diskless_Setup to prepare the device.&lt;br /&gt;
*The Raspberry Pi will reboot automatically once Diskless_Setup completes properly.&lt;br /&gt;
*You should go to an existing orbiter and &#039;Reload the Router&#039; after this point.  You will be prompted to do so eventually on the moonPi, if you have not already done so.&lt;br /&gt;
*On the second boot (called the &#039;FIRSTRUN&#039;) the bootloader on the sdcard will be updated to the version on the diskless image.&lt;br /&gt;
*The Raspberry Pi will reboot again.&lt;br /&gt;
*On the third boot LinuxMCE will slowly come to life.  Please be patient, this can take up to 45 minutes.  You will be presented with the Setup Wizard after ConfirmDependencies has finished installing all ancillary packages.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Odroid_XU4&amp;diff=36443</id>
		<title>Odroid XU4</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Odroid_XU4&amp;diff=36443"/>
		<updated>2016-02-15T20:43:23Z</updated>

		<summary type="html">&lt;p&gt;RayBe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[Category: Core]]&lt;br /&gt;
[[Category: Barebones]]&lt;br /&gt;
= General =&lt;br /&gt;
The ODROID-XU4 is powered by ARM® big.LITTLE™ technology, the Heterogeneous Multi-Processing (HMP) solution. &lt;br /&gt;
It offers open source support, the board can run various flavors of Linux, including the latest Ubuntu 15.04 and Android 4.4 KitKat and 5.0 Lollipop. &lt;br /&gt;
The XU4 is fully software compatible with XU3.&lt;br /&gt;
== Hardware ==&lt;br /&gt;
* Samsung Exynos5422 Cortex™-A15 2Ghz and Cortex™-A7 Octa core CPUs&lt;br /&gt;
* Mali-T628 MP6(OpenGL ES 3.0/2.0/1.1 and OpenCL 1.1 Full profile)&lt;br /&gt;
* 2Gbyte LPDDR3 RAM PoP stacked&lt;br /&gt;
* eMMC5.0 HS400 Flash Storage&lt;br /&gt;
* 2 x USB 3.0 Host, 1 x USB 2.0 Host&lt;br /&gt;
* Gigabit Ethernet port&lt;br /&gt;
* HDMI 1.4a for display&lt;br /&gt;
* Size : 82 x 58 x 22 mm approx.(including cooling fan)&lt;br /&gt;
&lt;br /&gt;
= Installing a LinuxMCE Core on the Odroid XU4 on a eMMC module=&lt;br /&gt;
*Connect a USB NIC to your XU4.&lt;br /&gt;
*Download the latest Ubuntu 14.04 Server image for XU4/XU3 here: - http://odroid.in/ubuntu_14.04lts/&lt;br /&gt;
*Install the Ubuntu 14.04 Server image onto your Odroid XU4 device.&lt;br /&gt;
*Use the odroid-utility to resize the eMMC card you are booting from so all space is available:&lt;br /&gt;
 odroid-utility.sh &lt;br /&gt;
*Add the following linuxmce repository definitions to /etc/apt/sources.list:&lt;br /&gt;
 deb http://deb.linuxmce.org/ubuntu/ trusty  main&lt;br /&gt;
 deb http://deb.linuxmce.org/ trusty  main&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-updates  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-backports  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-security  main restricted universe multiverse&lt;br /&gt;
*Retrieve the updated package lists:&lt;br /&gt;
 apt-get update&lt;br /&gt;
*Install LinuxMCE as a Core only:&lt;br /&gt;
 DEBIAN_FRONTEND=non-interactive apt-get install lmce-core -y --allow-unauthenticated&lt;br /&gt;
*Reboot to allow setup and firstboot to occur.&lt;br /&gt;
*Update and upgrade to the latest:&lt;br /&gt;
 apt-get update &amp;amp;&amp;amp; apt-get dist-upgrade&lt;br /&gt;
*Reboot.&lt;br /&gt;
*This will not install any graphical interfaces so initial setup will need to be done through the webadmin.&lt;br /&gt;
*At minimum create:&lt;br /&gt;
**A Master-User by pointing a browser to 192.168.80.1&lt;br /&gt;
**A Web Orbiter 2.0 set to the room the Core is in (Otherwise you will not get all the messages).&lt;br /&gt;
*Now you will need to add a MD to make use of any on-screen controls or media functionality.&lt;br /&gt;
*Be very patient and have fun.&lt;br /&gt;
&lt;br /&gt;
= Installing a LinuxMCE Core on the Odroid XU4 using a micro SD-Card and SSD combo in the Cloudshell=&lt;br /&gt;
&lt;br /&gt;
* Install the ssd in your cloudshell.&lt;br /&gt;
* Download the latest Ubuntu 14.04 Server image for XU4/XU3 here: - http://odroid.in/ubuntu_14.04lts/&lt;br /&gt;
* Install the Ubuntu 14.04 Server image onto your sd-card.&lt;br /&gt;
* Boot your XU4.&lt;br /&gt;
* Determine the device name of your SSD with (for this example its: /dev/sda).&lt;br /&gt;
 sudo fdisk -l &lt;br /&gt;
* Write the image from step 2, remotely, to the SSD by going to the path your image is in and give the following command: &lt;br /&gt;
 dd if=ubuntu-14.04lts-server-odroid-xu3-20150725.img | ssh root@192.168.1.75 &amp;quot;dd of=/dev/sda&amp;quot;&lt;br /&gt;
* Reboot.&lt;br /&gt;
* To make sure that the UUID’s of the first partitions (mmcblk0p1 and sda1) of both drives and the second partitions (mmcblk0p2 and sda2) of both drives are the same, use: &lt;br /&gt;
 blkid -o list &lt;br /&gt;
The output should look something like the example below:&lt;br /&gt;
&lt;br /&gt;
 device                                          fs_type         label            mount point                                         UUID&lt;br /&gt;
 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 /dev/mmcblk0p1                                  vfat            boot             (not mounted)                                       1E66-94B1&lt;br /&gt;
 /dev/mmcblk0p2                                  ext4            rootfs           /                                                   e139ce78-9841-40fe-8823-96a304a09859&lt;br /&gt;
 /dev/sda1                                       vfat            boot             /media/boot                                         1E66-94B1&lt;br /&gt;
 /dev/sda2                                       ext4            rootfs           (not mounted)                                       e139ce78-9841-40fe-8823-96a304a09859&lt;br /&gt;
&lt;br /&gt;
* Delete the second partition on the SD-Card by giving the following commands:&lt;br /&gt;
 sudo fdisk /dev/mmcblk0  &lt;br /&gt;
 d (delete a partition) &lt;br /&gt;
 2 (the second partition)&lt;br /&gt;
 w (write table to disk and exit)&lt;br /&gt;
* Reboot.&lt;br /&gt;
* Delete the first partition on the SSD by giving the following commands:&lt;br /&gt;
 sudo fdisk /dev/sda &lt;br /&gt;
 d (delete a partition) &lt;br /&gt;
 1 (the first partition)&lt;br /&gt;
 w (write table to disk and exit)&lt;br /&gt;
* Reboot.&lt;br /&gt;
 blkid -o list &lt;br /&gt;
should now show you something like: &lt;br /&gt;
&lt;br /&gt;
 device                                          fs_type         label            mount point                                         UUID&lt;br /&gt;
 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 /dev/mmcblk0p1                                  vfat            boot             /media/boot                                         1E66-94B1&lt;br /&gt;
 /dev/sda2                                       ext4            rootfs           /                                                   e139ce78-9841-40fe-8823-96a304a09859&lt;br /&gt;
&lt;br /&gt;
This means that it boots from device /dev/mmcblk0p1 and then hands it over to device /dev/sda2 (the SSD).&lt;br /&gt;
&lt;br /&gt;
At the moment the partition sda2 is not using the entire disk space, to use the entire disk space we have to expand that partition. &lt;br /&gt;
To do so we first delete it and create a new one at the starting point of the old one, by doing so no data will be lost.&lt;br /&gt;
* Delete and recreate the partition sda2 on device /dev/sda with the following commands/entry’s:&lt;br /&gt;
 fdisk /dev/sda &lt;br /&gt;
 p (print the partition table) to find out the Startpoint (208896 in this example)&lt;br /&gt;
 d (delete a partition)&lt;br /&gt;
 n (add a new partition)&lt;br /&gt;
 p (primary)&lt;br /&gt;
 2 (Partition number (1-4, default 1)) - we want to recreate the sda2 partition.&lt;br /&gt;
 208896 (First sector (2048-234441631, default 2048)) - this is the earlier noted start point.&lt;br /&gt;
 use default value for the Last sector entry (the max) to use the entire disk space.&lt;br /&gt;
 w (write table to disk and exit).&lt;br /&gt;
* Reboot.&lt;br /&gt;
* Resize the filesystem to the entire partition.&lt;br /&gt;
 resize2fs /dev/sda2&lt;br /&gt;
* Upgrade to the latest.&lt;br /&gt;
 apt-get update&lt;br /&gt;
 apt-get dist-upgrade&lt;br /&gt;
&lt;br /&gt;
The Cloudshell USB 3.0 to SATA3 uses a Genesys Logic chip that is not supported on Ubuntu 14.04 or 15.04 smartmontools package.&lt;br /&gt;
You need smartmoontools 6.5 revision 4132 or greater. To install it do the following:&lt;br /&gt;
 sudo -s&lt;br /&gt;
 apt-get install libcap-ng0 (needed otherwise when you install the smartmontools package you get: „dependency problems prevent configuration of smartmontools”)&lt;br /&gt;
 wget http://deb.odroid.in/manual/5422/smartmontools/14.04/smartmontools_6.5%2bsvn4132-1_armhf.deb&lt;br /&gt;
 dpkg -i smartmontools_6.5+svn4132-1_armhf.deb&lt;br /&gt;
* Reboot.&lt;br /&gt;
*Add the following linuxmce repository definitions to /etc/apt/sources.list:&lt;br /&gt;
 deb http://deb.linuxmce.org/ubuntu/ trusty  main&lt;br /&gt;
 deb http://deb.linuxmce.org/ trusty  main&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-updates  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-backports  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-security  main restricted universe multiverse&lt;br /&gt;
*Retrieve the updated package lists:&lt;br /&gt;
 apt-get update&lt;br /&gt;
*Install LinuxMCE as a Core only:&lt;br /&gt;
 DEBIAN_FRONTEND=non-interactive apt-get install lmce-core -y --allow-unauthenticated&lt;br /&gt;
*Reboot to allow setup and firstboot to occur.&lt;br /&gt;
*Update and upgrade to the latest:&lt;br /&gt;
 apt-get update &amp;amp;&amp;amp; apt-get dist-upgrade&lt;br /&gt;
*Reboot.&lt;br /&gt;
*This will not install any graphical interfaces so initial setup will need to be done through the webadmin.&lt;br /&gt;
*At minimum create:&lt;br /&gt;
**A Master-User by pointing a browser to 192.168.80.1&lt;br /&gt;
**A Web Orbiter 2.0 set to the room the Core is in (Otherwise you will not get all the messages).&lt;br /&gt;
*Now you will need to add a MD to make use of any on-screen controls or media functionality.&lt;br /&gt;
*Be very patient and have fun.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Odroid_XU4&amp;diff=36442</id>
		<title>Odroid XU4</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Odroid_XU4&amp;diff=36442"/>
		<updated>2016-02-15T20:13:27Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Installing a LinuxMCE Core on the Odroid XU4 using a micro SD-Card and SSD combo in the Cloudshell&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[Category: Core]]&lt;br /&gt;
[[Category: Barebones]]&lt;br /&gt;
= General =&lt;br /&gt;
The ODROID-XU4 is powered by ARM® big.LITTLE™ technology, the Heterogeneous Multi-Processing (HMP) solution. &lt;br /&gt;
It offers open source support, the board can run various flavors of Linux, including the latest Ubuntu 15.04 and Android 4.4 KitKat and 5.0 Lollipop. &lt;br /&gt;
The XU4 is fully software compatible with XU3.&lt;br /&gt;
== Hardware ==&lt;br /&gt;
* Samsung Exynos5422 Cortex™-A15 2Ghz and Cortex™-A7 Octa core CPUs&lt;br /&gt;
* Mali-T628 MP6(OpenGL ES 3.0/2.0/1.1 and OpenCL 1.1 Full profile)&lt;br /&gt;
* 2Gbyte LPDDR3 RAM PoP stacked&lt;br /&gt;
* eMMC5.0 HS400 Flash Storage&lt;br /&gt;
* 2 x USB 3.0 Host, 1 x USB 2.0 Host&lt;br /&gt;
* Gigabit Ethernet port&lt;br /&gt;
* HDMI 1.4a for display&lt;br /&gt;
* Size : 82 x 58 x 22 mm approx.(including cooling fan)&lt;br /&gt;
&lt;br /&gt;
= Installing a LinuxMCE Core on the Odroid XU4 using a micro SD-Card and SSD combo in the Cloudshell=&lt;br /&gt;
&lt;br /&gt;
* Install the ssd in your cloudshell.&lt;br /&gt;
* Download the latest Ubuntu 14.04 Server image for XU4/XU3 here: - http://odroid.in/ubuntu_14.04lts/&lt;br /&gt;
* Install the Ubuntu 14.04 Server image onto your sd-card.&lt;br /&gt;
* Boot your XU4.&lt;br /&gt;
* Determine the device name of your SSD with (for this example its: /dev/sda).&lt;br /&gt;
 sudo fdisk -l &lt;br /&gt;
* Write the image from step 2, remotely, to the SSD by going to the path your image is in and give the following command: &lt;br /&gt;
 dd if=ubuntu-14.04lts-server-odroid-xu3-20150725.img | ssh root@192.168.1.75 &amp;quot;dd of=/dev/sda&amp;quot;&lt;br /&gt;
* Reboot.&lt;br /&gt;
* To make sure that the UUID’s of the first partitions (mmcblk0p1 and sda1) of both drives and the second partitions (mmcblk0p2 and sda2) of both drives are the same, use: &lt;br /&gt;
 blkid -o list &lt;br /&gt;
The output should look something like the example below:&lt;br /&gt;
&lt;br /&gt;
 device                                          fs_type         label            mount point                                         UUID&lt;br /&gt;
 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 /dev/mmcblk0p1                                  vfat            boot             (not mounted)                                       1E66-94B1&lt;br /&gt;
 /dev/mmcblk0p2                                  ext4            rootfs           /                                                   e139ce78-9841-40fe-8823-96a304a09859&lt;br /&gt;
 /dev/sda1                                       vfat            boot             /media/boot                                         1E66-94B1&lt;br /&gt;
 /dev/sda2                                       ext4            rootfs           (not mounted)                                       e139ce78-9841-40fe-8823-96a304a09859&lt;br /&gt;
&lt;br /&gt;
* Delete the second partition on the SD-Card by giving the following commands:&lt;br /&gt;
 sudo fdisk /dev/mmcblk0  &lt;br /&gt;
 d (delete a partition) &lt;br /&gt;
 2 (the second partition)&lt;br /&gt;
 w (write table to disk and exit)&lt;br /&gt;
* Reboot.&lt;br /&gt;
* Delete the first partition on the SSD by giving the following commands:&lt;br /&gt;
 sudo fdisk /dev/sda &lt;br /&gt;
 d (delete a partition) &lt;br /&gt;
 1 (the first partition)&lt;br /&gt;
 w (write table to disk and exit)&lt;br /&gt;
* Reboot.&lt;br /&gt;
 blkid -o list &lt;br /&gt;
should now show you something like: &lt;br /&gt;
&lt;br /&gt;
 device                                          fs_type         label            mount point                                         UUID&lt;br /&gt;
 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
 /dev/mmcblk0p1                                  vfat            boot             /media/boot                                         1E66-94B1&lt;br /&gt;
 /dev/sda2                                       ext4            rootfs           /                                                   e139ce78-9841-40fe-8823-96a304a09859&lt;br /&gt;
&lt;br /&gt;
This means that it boots from device /dev/mmcblk0p1 and then hands it over to device /dev/sda2 (the SSD).&lt;br /&gt;
&lt;br /&gt;
At the moment the partition sda2 is not using the entire disk space, to use the entire disk space we have to expand that partition. &lt;br /&gt;
To do so we first delete it and create a new one at the starting point of the old one, by doing so no data will be lost.&lt;br /&gt;
* Delete and recreate the partition sda2 on device /dev/sda with the following commands/entry’s:&lt;br /&gt;
 fdisk /dev/sda &lt;br /&gt;
 p (print the partition table) to find out the Startpoint (208896 in this example)&lt;br /&gt;
 d (delete a partition)&lt;br /&gt;
 n (add a new partition)&lt;br /&gt;
 p (primary)&lt;br /&gt;
 2 (Partition number (1-4, default 1)) - we want to recreate the sda2 partition.&lt;br /&gt;
 208896 (First sector (2048-234441631, default 2048)) - this is the earlier noted start point.&lt;br /&gt;
 use default value for the Last sector entry (the max) to use the entire disk space.&lt;br /&gt;
 w (write table to disk and exit).&lt;br /&gt;
* Reboot.&lt;br /&gt;
* Resize the filesystem to the entire partition.&lt;br /&gt;
 resize2fs /dev/sda2&lt;br /&gt;
* Upgrade to the latest.&lt;br /&gt;
 apt-get update&lt;br /&gt;
 apt-get dist-upgrade&lt;br /&gt;
&lt;br /&gt;
The Cloudshell USB 3.0 to SATA3 uses a Genesys Logic chip that is not supported on Ubuntu 14.04 or 15.04 smartmontools package.&lt;br /&gt;
You need smartmoontools 6.5 revision 4132 or greater. To install it do the following:&lt;br /&gt;
 sudo -s&lt;br /&gt;
 apt-get install libcap-ng0 (needed otherwise when you install the smartmontools package you get: „dependency problems prevent configuration of smartmontools”)&lt;br /&gt;
 wget http://deb.odroid.in/manual/5422/smartmontools/14.04/smartmontools_6.5%2bsvn4132-1_armhf.deb&lt;br /&gt;
 dpkg -i smartmontools_6.5+svn4132-1_armhf.deb&lt;br /&gt;
* Reboot.&lt;br /&gt;
*Add the following linuxmce repository definitions to /etc/apt/sources.list:&lt;br /&gt;
 deb http://deb.linuxmce.org/ubuntu/ trusty  main&lt;br /&gt;
 deb http://deb.linuxmce.org/ trusty  main&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-updates  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-backports  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-security  main restricted universe multiverse&lt;br /&gt;
*Retrieve the updated package lists:&lt;br /&gt;
 apt-get update&lt;br /&gt;
*Install LinuxMCE as a Core only:&lt;br /&gt;
 DEBIAN_FRONTEND=non-interactive apt-get install lmce-core -y --allow-unauthenticated&lt;br /&gt;
*Reboot to allow setup and firstboot to occur.&lt;br /&gt;
*Update and upgrade to the latest:&lt;br /&gt;
 apt-get update &amp;amp;&amp;amp; apt-get dist-upgrade&lt;br /&gt;
*Reboot.&lt;br /&gt;
*This will not install any graphical interfaces so initial setup will need to be done through the webadmin.&lt;br /&gt;
*At minimum create:&lt;br /&gt;
**A Master-User by pointing a browser to 192.168.80.1&lt;br /&gt;
**A Web Orbiter 2.0 set to the room the Core is in (Otherwise you will not get all the messages).&lt;br /&gt;
*Now you will need to add a MD to make use of any on-screen controls or media functionality.&lt;br /&gt;
*Be very patient and have fun.&lt;br /&gt;
&lt;br /&gt;
= Installing a LinuxMCE Core on the Odroid XU4 on a micro SD-Card or eMMC module=&lt;br /&gt;
*Connect a USB NIC to your XU4.&lt;br /&gt;
*Download the latest Ubuntu 14.04 Server image for XU4/XU3 here: - http://odroid.in/ubuntu_14.04lts/&lt;br /&gt;
*Install the Ubuntu 14.04 Server image onto your Odroid XU4 device.&lt;br /&gt;
*Use the odroid-utility to resize the sdcard or eMMC card you are booting from so all space is available:&lt;br /&gt;
 odroid-utility.sh &lt;br /&gt;
*Add the following linuxmce repository definitions to /etc/apt/sources.list:&lt;br /&gt;
 deb http://deb.linuxmce.org/ubuntu/ trusty  main&lt;br /&gt;
 deb http://deb.linuxmce.org/ trusty  main&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-updates  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-backports  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-security  main restricted universe multiverse&lt;br /&gt;
*Retrieve the updated package lists:&lt;br /&gt;
 apt-get update&lt;br /&gt;
*Install LinuxMCE as a Core only:&lt;br /&gt;
 DEBIAN_FRONTEND=non-interactive apt-get install lmce-core -y --allow-unauthenticated&lt;br /&gt;
*Reboot to allow setup and firstboot to occur.&lt;br /&gt;
*Update and upgrade to the latest:&lt;br /&gt;
 apt-get update &amp;amp;&amp;amp; apt-get dist-upgrade&lt;br /&gt;
*Reboot.&lt;br /&gt;
*This will not install any graphical interfaces so initial setup will need to be done through the webadmin.&lt;br /&gt;
*At minimum create:&lt;br /&gt;
**A Master-User by pointing a browser to 192.168.80.1&lt;br /&gt;
**A Web Orbiter 2.0 set to the room the Core is in (Otherwise you will not get all the messages).&lt;br /&gt;
*Now you will need to add a MD to make use of any on-screen controls or media functionality.&lt;br /&gt;
*Be very patient and have fun.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Install_on_armhf&amp;diff=36270</id>
		<title>Install on armhf</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Install_on_armhf&amp;diff=36270"/>
		<updated>2015-12-01T19:10:58Z</updated>

		<summary type="html">&lt;p&gt;RayBe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;# For RPi installation please see: [[RaspberryPi]]&lt;br /&gt;
# For Odroid XU4 installation please see: [[Install_on_Odroid_XU4]]&lt;br /&gt;
# Installing LinuxMCE&lt;br /&gt;
*Install Ubuntu Trusty armhf onto your armhf device&lt;br /&gt;
 apt-get update &amp;amp;&amp;amp; apt-get dist-upgrade&lt;br /&gt;
*Reboot if a new kernel was installed&lt;br /&gt;
*Make sure you resize the sdcard you are booting from so all space is available&lt;br /&gt;
*Add the following linuxmce repository definitions to sources.list&lt;br /&gt;
 deb http://deb.linuxmce.org/ubuntu/ trusty main&lt;br /&gt;
 deb http://deb.linuxmce.org/ trusty main&lt;br /&gt;
*Install LinuxMCE&lt;br /&gt;
 apt-get update&lt;br /&gt;
*Install MediaDirector only&lt;br /&gt;
 DEBIAN_FRONTEND=non-interactive apt-get install lmce-disked-md -y --allow-unauthenticated&lt;br /&gt;
*Install a Core only&lt;br /&gt;
 DEBIAN_FRONTEND=non-interactive apt-get install lmce-core -y --allow-unauthenticated&lt;br /&gt;
*Reboot to allow setup and firstboot to occur.&lt;br /&gt;
*Be very patient.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Odroid_XU4&amp;diff=36269</id>
		<title>Odroid XU4</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Odroid_XU4&amp;diff=36269"/>
		<updated>2015-12-01T19:07:48Z</updated>

		<summary type="html">&lt;p&gt;RayBe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== General ===&lt;br /&gt;
The ODROID-XU4 is powered by ARM® big.LITTLE™ technology, the Heterogeneous Multi-Processing (HMP) solution. &lt;br /&gt;
It offers open source support, the board can run various flavors of Linux, including the latest Ubuntu 15.04 and Android 4.4 KitKat and 5.0 Lollipop. &lt;br /&gt;
The XU4 is fully software compatible with XU3.&lt;br /&gt;
The hardware specifications:&lt;br /&gt;
* Samsung Exynos5422 Cortex™-A15 2Ghz and Cortex™-A7 Octa core CPUs&lt;br /&gt;
* Mali-T628 MP6(OpenGL ES 3.0/2.0/1.1 and OpenCL 1.1 Full profile)&lt;br /&gt;
* 2Gbyte LPDDR3 RAM PoP stacked&lt;br /&gt;
* eMMC5.0 HS400 Flash Storage&lt;br /&gt;
* 2 x USB 3.0 Host, 1 x USB 2.0 Host&lt;br /&gt;
* Gigabit Ethernet port&lt;br /&gt;
* HDMI 1.4a for display&lt;br /&gt;
* Size : 82 x 58 x 22 mm approx.(including cooling fan)&lt;br /&gt;
&lt;br /&gt;
=== Installing a LinuxMCE Core on the Odroid XU4 ===&lt;br /&gt;
*Connect a USB NIC to your XU4.&lt;br /&gt;
*Download the latest Ubuntu 14.04 Server image for XU4/XU3 here: - http://odroid.in/ubuntu_14.04lts/&lt;br /&gt;
*Install the Ubuntu 14.04 Server image onto your Odroid XU4 device.&lt;br /&gt;
*Use the odroid-utility to resize the sdcard or eMMC card you are booting from so all space is available:&lt;br /&gt;
 odroid-utility.sh &lt;br /&gt;
*Add the following linuxmce repository definitions to /etc/apt/sources.list:&lt;br /&gt;
 deb http://deb.linuxmce.org/ubuntu/ trusty  main&lt;br /&gt;
 deb http://deb.linuxmce.org/ trusty  main&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-updates  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-backports  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-security  main restricted universe multiverse&lt;br /&gt;
*Retrieve the updated package lists:&lt;br /&gt;
 apt-get update&lt;br /&gt;
*Install LinuxMCE as a Core only:&lt;br /&gt;
 DEBIAN_FRONTEND=non-interactive apt-get install lmce-core -y --allow-unauthenticated&lt;br /&gt;
*Reboot to allow setup and firstboot to occur.&lt;br /&gt;
*Update and upgrade to the latest:&lt;br /&gt;
 apt-get update &amp;amp;&amp;amp; apt-get dist-upgrade&lt;br /&gt;
*Reboot:&lt;br /&gt;
*At minimum create a user, a room and choose a PVR system&lt;br /&gt;
*Be very patient and have fun&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Odroid_XU4&amp;diff=36268</id>
		<title>Odroid XU4</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Odroid_XU4&amp;diff=36268"/>
		<updated>2015-12-01T19:05:10Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Created page with &amp;quot;=== General === The ODROID-XU4 is powered by ARM® big.LITTLE™ technology, the Heterogeneous Multi-Processing (HMP) solution.  It offers open source support, the board can r...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== General ===&lt;br /&gt;
The ODROID-XU4 is powered by ARM® big.LITTLE™ technology, the Heterogeneous Multi-Processing (HMP) solution. &lt;br /&gt;
It offers open source support, the board can run various flavors of Linux, including the latest Ubuntu 15.04 and Android 4.4 KitKat and 5.0 Lollipop. &lt;br /&gt;
The XU4 is fully software compatible with XU3.&lt;br /&gt;
The hardware specifications:&lt;br /&gt;
* Samsung Exynos5422 Cortex™-A15 2Ghz and Cortex™-A7 Octa core CPUs&lt;br /&gt;
* Mali-T628 MP6(OpenGL ES 3.0/2.0/1.1 and OpenCL 1.1 Full profile)&lt;br /&gt;
* 2Gbyte LPDDR3 RAM PoP stacked&lt;br /&gt;
* eMMC5.0 HS400 Flash Storage&lt;br /&gt;
* 2 x USB 3.0 Host, 1 x USB 2.0 Host&lt;br /&gt;
* Gigabit Ethernet port&lt;br /&gt;
* HDMI 1.4a for display&lt;br /&gt;
* Size : 82 x 58 x 22 mm approx.(including cooling fan)&lt;br /&gt;
&lt;br /&gt;
=== Installing a LinuxMCE Core on the Odroid XU4 ===&lt;br /&gt;
*Connect a USB NIC to your XU4.&lt;br /&gt;
*Download the latest Ubuntu 14.04 Server image for XU4/XU3 here: - http://odroid.in/ubuntu_14.04lts/&lt;br /&gt;
*Install the Ubuntu 14.04 Server image onto your Odroid XU4 device.&lt;br /&gt;
*Use the odroid-utility to resize the sdcard or eMMC card you are booting from so all space is available:&lt;br /&gt;
 odroid-utility.sh &lt;br /&gt;
*Add the following linuxmce repository definitions to sources.list:&lt;br /&gt;
 deb http://deb.linuxmce.org/ubuntu/ trusty  main&lt;br /&gt;
 deb http://deb.linuxmce.org/ trusty  main&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-updates  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-backports  main restricted universe multiverse&lt;br /&gt;
 deb http://ports.ubuntu.com/ trusty-security  main restricted universe multiverse&lt;br /&gt;
*Retrieve the updated package lists:&lt;br /&gt;
 apt-get update&lt;br /&gt;
*Install LinuxMCE as a Core only:&lt;br /&gt;
 DEBIAN_FRONTEND=non-interactive apt-get install lmce-core -y --allow-unauthenticated&lt;br /&gt;
*Reboot to allow setup and firstboot to occur.&lt;br /&gt;
*Update and upgrade to the latest:&lt;br /&gt;
 apt-get update &amp;amp;&amp;amp; apt-get dist-upgrade&lt;br /&gt;
*Reboot:&lt;br /&gt;
*At minimum create a user, a room and choose a PVR system&lt;br /&gt;
*Be very patient and have fun&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=RaspberryPi&amp;diff=36044</id>
		<title>RaspberryPi</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=RaspberryPi&amp;diff=36044"/>
		<updated>2015-10-02T21:45:03Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Correct install syntax&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[Category: Media Directors]]&lt;br /&gt;
[[Category: Barebones]]&lt;br /&gt;
qMDs are still a thing of myth, although seen occasionally in the wild they are elusive and not easily tamed. ;)&lt;br /&gt;
&lt;br /&gt;
=Device Specification=&lt;br /&gt;
*The Raspberry Pi 2 B is an ARM based computer the size of a credit card.  4x900Mhz Cores, 1GB RAM, FastEthernet, 4xUSB, 40xGPIO&lt;br /&gt;
*The Raspberry Pi B is an ARM based computer the size of a credit card.  1x700Mhz Core, 256MB or 512MB RAM, FastEthernet, 2xUSB, GPIO&lt;br /&gt;
&lt;br /&gt;
=RPi Disked Media Director=&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* Your core must be LinuxMCE 1204 or higher.&lt;br /&gt;
* The recommended device is the RPi2.  The RPi2 runs at a reasonable speed and can support all the functions of a LinuxMCE MediaDirector.  &lt;br /&gt;
* The following Raspbian based SD cards are bootable on anything that is a Raspberry Pi Model B or higher.  RPi1 performance is very, very, very slow.&lt;br /&gt;
&lt;br /&gt;
==Setup Steps==&lt;br /&gt;
*Download the rpi uSD card image ([http://download.linuxmce.org/lmce-disked-md-rpi2-jessie.tar.xz raspbian jessie (recommended)] (Updated: 2015-09-23)&lt;br /&gt;
*Download the rpi uSD card image ([http://download.linuxmce.org/lmce-disked-md-rpi2-wheezy.tar.xz raspbian wheezy (deprecated)]&lt;br /&gt;
*Download the rpi uSD card image ([http://download.linuxmce.org/lmce-disked-md-rpi2-trusty.tar.xz ubuntu trusty(RPi2 only and you&#039;re on your own here)])&lt;br /&gt;
*untar the compressed file&lt;br /&gt;
*Install the resulting image onto an SD card, using dd on linux or win32diskimage on windows&lt;br /&gt;
*Ensure the RPi is connected to the internal lan of your core and boot the RPi.&lt;br /&gt;
*You may be prompted on existing orbiters to choose a device type MD/qMD/SqueezeOnly, do so.&lt;br /&gt;
*The device will automatically be created, you will need to reload your router.&lt;br /&gt;
*The MD will resize the filesystem to fit the SDCard and then reboot.&lt;br /&gt;
*AVWizard will not appear.&lt;br /&gt;
*You should see the setup wizard and be asked to configure your new MD.&lt;br /&gt;
*The new RPi moonpi should continue installing and eventually present you with a UI1 OnScreen Orbiter.&lt;br /&gt;
*Please report any bugs with *very* specific (package date/svn, etc) information in a ticket.&lt;br /&gt;
&lt;br /&gt;
==HDMI-CEC Control==&lt;br /&gt;
Please see [[Pulse-Eight]] for HDMI-CEC setup information&lt;br /&gt;
&lt;br /&gt;
==Manual Settings==&lt;br /&gt;
*Overscan - currently only able to change by manually editing the config.txt file on the sdcard. (See [http://elinux.org/RPiconfig http://elinux.org/RPiconfig])&lt;br /&gt;
*Overscan compensation - currently only able to change by manually editing the config.txt file on the sdcard.  In /sdcard/config.txt from a booted moonpi. (See [http://elinux.org/RPiconfig http://elinux.org/RPiconfig])&lt;br /&gt;
*Orbiter will automatically regenerate following a reboot and detecting a new display resolution.&lt;br /&gt;
*Audio settings are adjusted in webadmin: S = Stereo, H = HDMI, H3 = HDMI with passthrough capability for AC3 &amp;amp; DTS&lt;br /&gt;
&lt;br /&gt;
==What works==&lt;br /&gt;
*Orbiter UI1&lt;br /&gt;
*Photo Screen Saver (need to disable on RPi1)&lt;br /&gt;
*AppServer&lt;br /&gt;
*HAL&lt;br /&gt;
*Embedded phone&lt;br /&gt;
*OMX_Player will play audio and video.  You must have the appropriate codecs to play MPG and VC1 media.  The codecs can be purchased from the Raspberry Pi foundation.&lt;br /&gt;
*squeezelite can play audio&lt;br /&gt;
*USB-UIRT&lt;br /&gt;
*HDMI-CEC control&lt;br /&gt;
*Generic Serial Devices (only on RPi2)&lt;br /&gt;
&lt;br /&gt;
==What does not work==&lt;br /&gt;
*Video Overlays&lt;br /&gt;
&lt;br /&gt;
= RPi2 Core =&lt;br /&gt;
This section is meant for informational purposes only and is not intended to suggest that the RaspberryPi2 would make a good core.  There is NO support for this.&lt;br /&gt;
&lt;br /&gt;
*Download an Ubuntu Trusty Tahr 14.04 image for the RPi2 from [http://www.finnie.org/software/raspberrypi/2015-04-06-ubuntu-trusty.zip http://www.finnie.org/software/raspberrypi/2015-04-06-ubuntu-trusty.zip].&lt;br /&gt;
*Unzip it and write it to an sdcard.&lt;br /&gt;
*Boot and resize the filesystem to fill the sdcard:&lt;br /&gt;
**There are no Raspbian-specific utilities included, specifically no automatic root resizer. However, it&#039;s not hard to do manually. Once booted:&lt;br /&gt;
&lt;br /&gt;
 $ sudo fdisk /dev/mmcblk0&lt;br /&gt;
&lt;br /&gt;
**Delete the second partition (d, 2), then re-create it using the defaults (n, p, 2, enter, enter), then write and exit (w). Reboot the system, then:&lt;br /&gt;
&lt;br /&gt;
 $ sudo resize2fs /dev/mmcblk0p2&lt;br /&gt;
&lt;br /&gt;
*Add the following linuxmce repo&#039;s to your /etc/apt/sources.list:&lt;br /&gt;
 deb http://deb.linuxmce.org/ubuntu/ trusty main&lt;br /&gt;
 deb http://deb.linuxmce.org/ trusty main&lt;br /&gt;
*Run:&lt;br /&gt;
 apt-get update &amp;amp;&amp;amp; DEBIAN_FRONTEND=&amp;quot;non interactive&amp;quot; apt-get install -y lmce-core&lt;br /&gt;
*reboot&lt;br /&gt;
*No idea what happens now, feel free to play.  This is not, and will never be, supported.&lt;br /&gt;
&lt;br /&gt;
=RPi1 (obsolete) =&lt;br /&gt;
 NOTE: The RPi1 is no longer supported as a LinuxMCE Diskless style device.  If you wish to continue working on RPi1 support please contact us.&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi v1 B/B+ will not be supported for much longer, but can be used as a minimal diskless Media Director within LinuxMCE.  The following instructions will show how to create a diskless MD.  The Raspberry Pi 2 is not compatible with the PXE method of booting.&lt;br /&gt;
&lt;br /&gt;
When using the sdcard below the RPi will be overclocked using the standard Raspberry Pi foundation overclock settings.  These are throttled automatically as thermally required.  You are free to overclock the device further by editing the config.txt file on the sdcard.&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* Your core must be LinuxMCE 1204 or higher.&lt;br /&gt;
* The Raspberry Pi must be a 512MB Model B (or B+).  The Model A and the 256MB Model B do not have enough RAM to boot into Orbiter.&lt;br /&gt;
* The Raspberry Pi must be plugged into the internal side of your LinuxMCE core&#039;s network to act as a media director.&lt;br /&gt;
* The Raspberry Pi must be plugged in using the HDMI connector&amp;lt;del&amp;gt; and using HDMI sound&amp;lt;/del&amp;gt;.  Set an S (for Stereo) or H (for HDMI) for the Audio Settings for the MD in webadmin.&lt;br /&gt;
** The Raspberry Pi will detect the boot resolution of your television and adjust itself accordingly.&lt;br /&gt;
** If resolution has changed since the last boot the orbiter will be regenerated.&lt;br /&gt;
* You may wish to have a usb keyboard or mouse for orbiter interaction.  USB-UIRT/MCE Remote is also possible but must be installed using the webadmin (device detection is working but the device is not added currently).&lt;br /&gt;
&lt;br /&gt;
==Setup Steps==&lt;br /&gt;
*On the Core:&lt;br /&gt;
**Install the [http://www.linuxmce.org/linux-image-default-raspbian-wheezy_3.10-3-rpi-lmce1_all.deb default PXE kernel package (lmce1)] for a Raspberry Pi MD. This image will create an RPi MD (DT#2216) only.&lt;br /&gt;
**-- To be able to choose betwen an RPi MD and an RPi qMD (as well as other possible rpi Device Templates) at MD creation use [http://www.linuxmce.org/linux-image-default-raspbian-wheezy_3.10-3-rpi-lmce2_all.deb this (lmce2)] as the default image instead.  This image will allow you to choose from multiple RPi based image including RPi MD (DT#2216), RPi qMD (DT#2281) and others.&lt;br /&gt;
**edit /usr/pluto/bin/Diskless_CreateTBZ.sh and enable &amp;quot;raspbian_armhf&amp;quot; as the only TARGET_TYPE, be sure to comment (use a #) any other TARGET_TYPE lines so that only this one is enabled.&lt;br /&gt;
**run /usr/pluto/bin/Diskless_CreateTBZ.sh to create a raspbian tarball&amp;lt;del&amp;gt;, and sdcard.zip file on your core&amp;lt;/del&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Get the LinuxMCE Raspberry Pi MD SD card contents.&lt;br /&gt;
**Download the [http://www.linuxmce.org/sdcard.zip zip] &lt;br /&gt;
***Format the SD card for VFAT using the SD card formatter for Mac or Windows https://www.sdcard.org/downloads/formatter_4, or using mkfs.vfat on linux.&lt;br /&gt;
***Copy the entire contents of the sdcard zip to the newly formatted SD card, all files should be in the root directory of the card with no sub-directories.&lt;br /&gt;
*Insert the SD card into the Raspberry Pi.&lt;br /&gt;
*Power up the Raspberry Pi.&lt;br /&gt;
*On first boot the u-boot bootloader will start, it will try to grab various different pxe files until it finally finds the default PXE kernel and initrd.&lt;br /&gt;
*The kernel will boot, there is a 10 second delay when activating the ethernet drivers to allow for the hardware to respond properly, this delay only occurs during the default kernel/initrd boot.&lt;br /&gt;
*Raspberry Pi will display &amp;quot;Announced ourselves to the router&amp;quot;.&lt;br /&gt;
**If you have the lmce1 default image installed (see above,) the core will run Diskless_Setup to prepare an RPi MD.&lt;br /&gt;
**If you have the lmce2 default image installed (see above,) you will be prompted on existing orbiters to select the type of RPi device you would like installed.  Once you have made your selection the core will run Diskless_Setup to prepare the device.&lt;br /&gt;
*The Raspberry Pi will reboot automatically once Diskless_Setup completes properly.&lt;br /&gt;
*You should go to an existing orbiter and &#039;Reload the Router&#039; after this point.  You will be prompted to do so eventually on the moonPi, if you have not already done so.&lt;br /&gt;
*On the second boot (called the &#039;FIRSTRUN&#039;) the bootloader on the sdcard will be updated to the version on the diskless image.&lt;br /&gt;
*The Raspberry Pi will reboot again.&lt;br /&gt;
*On the third boot LinuxMCE will slowly come to life.  Please be patient, this can take up to 45 minutes.  You will be presented with the Setup Wizard after ConfirmDependencies has finished installing all ancillary packages.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=RaspberryPi&amp;diff=36042</id>
		<title>RaspberryPi</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=RaspberryPi&amp;diff=36042"/>
		<updated>2015-09-30T12:21:20Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Adding LMCE-repo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[Category: Media Directors]]&lt;br /&gt;
[[Category: Barebones]]&lt;br /&gt;
qMDs are still a thing of myth, although seen occasionally in the wild they are elusive and not easily tamed. ;)&lt;br /&gt;
&lt;br /&gt;
=Device Specification=&lt;br /&gt;
*The Raspberry Pi 2 B is an ARM based computer the size of a credit card.  4x900Mhz Cores, 1GB RAM, FastEthernet, 4xUSB, 40xGPIO&lt;br /&gt;
*The Raspberry Pi B is an ARM based computer the size of a credit card.  1x700Mhz Core, 256MB or 512MB RAM, FastEthernet, 2xUSB, GPIO&lt;br /&gt;
&lt;br /&gt;
=RPi Disked Media Director=&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* Your core must be LinuxMCE 1204 or higher.&lt;br /&gt;
* The recommended device is the RPi2.  The RPi2 runs at a reasonable speed and can support all the functions of a LinuxMCE MediaDirector.  &lt;br /&gt;
* The following Raspbian based SD cards are bootable on anything that is a Raspberry Pi Model B or higher.  RPi1 performance is very, very, very slow.&lt;br /&gt;
&lt;br /&gt;
==Setup Steps==&lt;br /&gt;
*Download the rpi uSD card image ([http://download.linuxmce.org/lmce-disked-md-rpi2-jessie.tar.xz raspbian jessie (recommended)] (Updated: 2015-09-23)&lt;br /&gt;
*Download the rpi uSD card image ([http://download.linuxmce.org/lmce-disked-md-rpi2-wheezy.tar.xz raspbian wheezy (deprecated)]&lt;br /&gt;
*Download the rpi uSD card image ([http://download.linuxmce.org/lmce-disked-md-rpi2-trusty.tar.xz ubuntu trusty(RPi2 only and you&#039;re on your own here)])&lt;br /&gt;
*untar the compressed file&lt;br /&gt;
*Install the resulting image onto an SD card, using dd on linux or win32diskimage on windows&lt;br /&gt;
*Ensure the RPi is connected to the internal lan of your core and boot the RPi.&lt;br /&gt;
*You may be prompted on existing orbiters to choose a device type MD/qMD/SqueezeOnly, do so.&lt;br /&gt;
*The device will automatically be created, you will need to reload your router.&lt;br /&gt;
*The MD will resize the filesystem to fit the SDCard and then reboot.&lt;br /&gt;
*AVWizard will not appear.&lt;br /&gt;
*You should see the setup wizard and be asked to configure your new MD.&lt;br /&gt;
*The new RPi moonpi should continue installing and eventually present you with a UI1 OnScreen Orbiter.&lt;br /&gt;
*Please report any bugs with *very* specific (package date/svn, etc) information in a ticket.&lt;br /&gt;
&lt;br /&gt;
==HDMI-CEC Control==&lt;br /&gt;
Please see [[Pulse-Eight]] for HDMI-CEC setup information&lt;br /&gt;
&lt;br /&gt;
==Manual Settings==&lt;br /&gt;
*Overscan - currently only able to change by manually editing the config.txt file on the sdcard. (See [http://elinux.org/RPiconfig http://elinux.org/RPiconfig])&lt;br /&gt;
*Overscan compensation - currently only able to change by manually editing the config.txt file on the sdcard.  In /sdcard/config.txt from a booted moonpi. (See [http://elinux.org/RPiconfig http://elinux.org/RPiconfig])&lt;br /&gt;
*Orbiter will automatically regenerate following a reboot and detecting a new display resolution.&lt;br /&gt;
*Audio settings are adjusted in webadmin: S = Stereo, H = HDMI, H3 = HDMI with passthrough capability for AC3 &amp;amp; DTS&lt;br /&gt;
&lt;br /&gt;
==What works==&lt;br /&gt;
*Orbiter UI1&lt;br /&gt;
*Photo Screen Saver (need to disable on RPi1)&lt;br /&gt;
*AppServer&lt;br /&gt;
*HAL&lt;br /&gt;
*Embedded phone&lt;br /&gt;
*OMX_Player will play audio and video.  You must have the appropriate codecs to play MPG and VC1 media.  The codecs can be purchased from the Raspberry Pi foundation.&lt;br /&gt;
*squeezelite can play audio&lt;br /&gt;
*USB-UIRT&lt;br /&gt;
*HDMI-CEC control&lt;br /&gt;
*Generic Serial Devices (only on RPi2)&lt;br /&gt;
&lt;br /&gt;
==What does not work==&lt;br /&gt;
*Video Overlays&lt;br /&gt;
&lt;br /&gt;
= RPi2 Core =&lt;br /&gt;
This section is meant for informational purposes only and is not intended to suggest that the RaspberryPi2 would make a good core.  There is NO support for this.&lt;br /&gt;
&lt;br /&gt;
*Download an Ubuntu Trusty Tahr 14.04 image for the RPi2 from [http://www.finnie.org/software/raspberrypi/2015-04-06-ubuntu-trusty.zip http://www.finnie.org/software/raspberrypi/2015-04-06-ubuntu-trusty.zip].&lt;br /&gt;
*Unzip it and write it to an sdcard.&lt;br /&gt;
*Boot and resize the filesystem to fill the sdcard:&lt;br /&gt;
**There are no Raspbian-specific utilities included, specifically no automatic root resizer. However, it&#039;s not hard to do manually. Once booted:&lt;br /&gt;
&lt;br /&gt;
 $ sudo fdisk /dev/mmcblk0&lt;br /&gt;
&lt;br /&gt;
**Delete the second partition (d, 2), then re-create it using the defaults (n, p, 2, enter, enter), then write and exit (w). Reboot the system, then:&lt;br /&gt;
&lt;br /&gt;
 $ sudo resize2fs /dev/mmcblk0p2&lt;br /&gt;
&lt;br /&gt;
*Add the following linuxmce repo&#039;s to your /etc/apt/sources.list:&lt;br /&gt;
 deb http://deb.linuxmce.org/ubuntu/ trusty main&lt;br /&gt;
 deb http://deb.linuxmce.org/ trusty main&lt;br /&gt;
*Run:&lt;br /&gt;
 DEBIAN_FRONTEND=&amp;quot;noninteractive&amp;quot; apt-get update &amp;amp;&amp;amp; apt-get install -y lmce-core&lt;br /&gt;
*reboot&lt;br /&gt;
*No idea what happens now, feel free to play.  This is not, and will never be, supported.&lt;br /&gt;
&lt;br /&gt;
=RPi1 (obsolete) =&lt;br /&gt;
 NOTE: The RPi1 is no longer supported as a LinuxMCE Diskless style device.  If you wish to continue working on RPi1 support please contact us.&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi v1 B/B+ will not be supported for much longer, but can be used as a minimal diskless Media Director within LinuxMCE.  The following instructions will show how to create a diskless MD.  The Raspberry Pi 2 is not compatible with the PXE method of booting.&lt;br /&gt;
&lt;br /&gt;
When using the sdcard below the RPi will be overclocked using the standard Raspberry Pi foundation overclock settings.  These are throttled automatically as thermally required.  You are free to overclock the device further by editing the config.txt file on the sdcard.&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* Your core must be LinuxMCE 1204 or higher.&lt;br /&gt;
* The Raspberry Pi must be a 512MB Model B (or B+).  The Model A and the 256MB Model B do not have enough RAM to boot into Orbiter.&lt;br /&gt;
* The Raspberry Pi must be plugged into the internal side of your LinuxMCE core&#039;s network to act as a media director.&lt;br /&gt;
* The Raspberry Pi must be plugged in using the HDMI connector&amp;lt;del&amp;gt; and using HDMI sound&amp;lt;/del&amp;gt;.  Set an S (for Stereo) or H (for HDMI) for the Audio Settings for the MD in webadmin.&lt;br /&gt;
** The Raspberry Pi will detect the boot resolution of your television and adjust itself accordingly.&lt;br /&gt;
** If resolution has changed since the last boot the orbiter will be regenerated.&lt;br /&gt;
* You may wish to have a usb keyboard or mouse for orbiter interaction.  USB-UIRT/MCE Remote is also possible but must be installed using the webadmin (device detection is working but the device is not added currently).&lt;br /&gt;
&lt;br /&gt;
==Setup Steps==&lt;br /&gt;
*On the Core:&lt;br /&gt;
**Install the [http://www.linuxmce.org/linux-image-default-raspbian-wheezy_3.10-3-rpi-lmce1_all.deb default PXE kernel package (lmce1)] for a Raspberry Pi MD. This image will create an RPi MD (DT#2216) only.&lt;br /&gt;
**-- To be able to choose betwen an RPi MD and an RPi qMD (as well as other possible rpi Device Templates) at MD creation use [http://www.linuxmce.org/linux-image-default-raspbian-wheezy_3.10-3-rpi-lmce2_all.deb this (lmce2)] as the default image instead.  This image will allow you to choose from multiple RPi based image including RPi MD (DT#2216), RPi qMD (DT#2281) and others.&lt;br /&gt;
**edit /usr/pluto/bin/Diskless_CreateTBZ.sh and enable &amp;quot;raspbian_armhf&amp;quot; as the only TARGET_TYPE, be sure to comment (use a #) any other TARGET_TYPE lines so that only this one is enabled.&lt;br /&gt;
**run /usr/pluto/bin/Diskless_CreateTBZ.sh to create a raspbian tarball&amp;lt;del&amp;gt;, and sdcard.zip file on your core&amp;lt;/del&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Get the LinuxMCE Raspberry Pi MD SD card contents.&lt;br /&gt;
**Download the [http://www.linuxmce.org/sdcard.zip zip] &lt;br /&gt;
***Format the SD card for VFAT using the SD card formatter for Mac or Windows https://www.sdcard.org/downloads/formatter_4, or using mkfs.vfat on linux.&lt;br /&gt;
***Copy the entire contents of the sdcard zip to the newly formatted SD card, all files should be in the root directory of the card with no sub-directories.&lt;br /&gt;
*Insert the SD card into the Raspberry Pi.&lt;br /&gt;
*Power up the Raspberry Pi.&lt;br /&gt;
*On first boot the u-boot bootloader will start, it will try to grab various different pxe files until it finally finds the default PXE kernel and initrd.&lt;br /&gt;
*The kernel will boot, there is a 10 second delay when activating the ethernet drivers to allow for the hardware to respond properly, this delay only occurs during the default kernel/initrd boot.&lt;br /&gt;
*Raspberry Pi will display &amp;quot;Announced ourselves to the router&amp;quot;.&lt;br /&gt;
**If you have the lmce1 default image installed (see above,) the core will run Diskless_Setup to prepare an RPi MD.&lt;br /&gt;
**If you have the lmce2 default image installed (see above,) you will be prompted on existing orbiters to select the type of RPi device you would like installed.  Once you have made your selection the core will run Diskless_Setup to prepare the device.&lt;br /&gt;
*The Raspberry Pi will reboot automatically once Diskless_Setup completes properly.&lt;br /&gt;
*You should go to an existing orbiter and &#039;Reload the Router&#039; after this point.  You will be prompted to do so eventually on the moonPi, if you have not already done so.&lt;br /&gt;
*On the second boot (called the &#039;FIRSTRUN&#039;) the bootloader on the sdcard will be updated to the version on the diskless image.&lt;br /&gt;
*The Raspberry Pi will reboot again.&lt;br /&gt;
*On the third boot LinuxMCE will slowly come to life.  Please be patient, this can take up to 45 minutes.  You will be presented with the Setup Wizard after ConfirmDependencies has finished installing all ancillary packages.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=RaspberryPi&amp;diff=36041</id>
		<title>RaspberryPi</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=RaspberryPi&amp;diff=36041"/>
		<updated>2015-09-30T08:31:56Z</updated>

		<summary type="html">&lt;p&gt;RayBe: How to resize the filesystem to use the entire SD-Card&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[Category: Media Directors]]&lt;br /&gt;
[[Category: Barebones]]&lt;br /&gt;
qMDs are still a thing of myth, although seen occasionally in the wild they are elusive and not easily tamed. ;)&lt;br /&gt;
&lt;br /&gt;
=Device Specification=&lt;br /&gt;
*The Raspberry Pi 2 B is an ARM based computer the size of a credit card.  4x900Mhz Cores, 1GB RAM, FastEthernet, 4xUSB, 40xGPIO&lt;br /&gt;
*The Raspberry Pi B is an ARM based computer the size of a credit card.  1x700Mhz Core, 256MB or 512MB RAM, FastEthernet, 2xUSB, GPIO&lt;br /&gt;
&lt;br /&gt;
=RPi Disked Media Director=&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* Your core must be LinuxMCE 1204 or higher.&lt;br /&gt;
* The recommended device is the RPi2.  The RPi2 runs at a reasonable speed and can support all the functions of a LinuxMCE MediaDirector.  &lt;br /&gt;
* The following Raspbian based SD cards are bootable on anything that is a Raspberry Pi Model B or higher.  RPi1 performance is very, very, very slow.&lt;br /&gt;
&lt;br /&gt;
==Setup Steps==&lt;br /&gt;
*Download the rpi uSD card image ([http://download.linuxmce.org/lmce-disked-md-rpi2-jessie.tar.xz raspbian jessie (recommended)] (Updated: 2015-09-23)&lt;br /&gt;
*Download the rpi uSD card image ([http://download.linuxmce.org/lmce-disked-md-rpi2-wheezy.tar.xz raspbian wheezy (deprecated)]&lt;br /&gt;
*Download the rpi uSD card image ([http://download.linuxmce.org/lmce-disked-md-rpi2-trusty.tar.xz ubuntu trusty(RPi2 only and you&#039;re on your own here)])&lt;br /&gt;
*untar the compressed file&lt;br /&gt;
*Install the resulting image onto an SD card, using dd on linux or win32diskimage on windows&lt;br /&gt;
*Ensure the RPi is connected to the internal lan of your core and boot the RPi.&lt;br /&gt;
*You may be prompted on existing orbiters to choose a device type MD/qMD/SqueezeOnly, do so.&lt;br /&gt;
*The device will automatically be created, you will need to reload your router.&lt;br /&gt;
*The MD will resize the filesystem to fit the SDCard and then reboot.&lt;br /&gt;
*AVWizard will not appear.&lt;br /&gt;
*You should see the setup wizard and be asked to configure your new MD.&lt;br /&gt;
*The new RPi moonpi should continue installing and eventually present you with a UI1 OnScreen Orbiter.&lt;br /&gt;
*Please report any bugs with *very* specific (package date/svn, etc) information in a ticket.&lt;br /&gt;
&lt;br /&gt;
==HDMI-CEC Control==&lt;br /&gt;
Please see [[Pulse-Eight]] for HDMI-CEC setup information&lt;br /&gt;
&lt;br /&gt;
==Manual Settings==&lt;br /&gt;
*Overscan - currently only able to change by manually editing the config.txt file on the sdcard. (See [http://elinux.org/RPiconfig http://elinux.org/RPiconfig])&lt;br /&gt;
*Overscan compensation - currently only able to change by manually editing the config.txt file on the sdcard.  In /sdcard/config.txt from a booted moonpi. (See [http://elinux.org/RPiconfig http://elinux.org/RPiconfig])&lt;br /&gt;
*Orbiter will automatically regenerate following a reboot and detecting a new display resolution.&lt;br /&gt;
*Audio settings are adjusted in webadmin: S = Stereo, H = HDMI, H3 = HDMI with passthrough capability for AC3 &amp;amp; DTS&lt;br /&gt;
&lt;br /&gt;
==What works==&lt;br /&gt;
*Orbiter UI1&lt;br /&gt;
*Photo Screen Saver (need to disable on RPi1)&lt;br /&gt;
*AppServer&lt;br /&gt;
*HAL&lt;br /&gt;
*Embedded phone&lt;br /&gt;
*OMX_Player will play audio and video.  You must have the appropriate codecs to play MPG and VC1 media.  The codecs can be purchased from the Raspberry Pi foundation.&lt;br /&gt;
*squeezelite can play audio&lt;br /&gt;
*USB-UIRT&lt;br /&gt;
*HDMI-CEC control&lt;br /&gt;
*Generic Serial Devices (only on RPi2)&lt;br /&gt;
&lt;br /&gt;
==What does not work==&lt;br /&gt;
*Video Overlays&lt;br /&gt;
&lt;br /&gt;
= RPi2 Core =&lt;br /&gt;
This section is meant for informational purposes only and is not intended to suggest that the RaspberryPi2 would make a good core.  There is NO support for this.&lt;br /&gt;
&lt;br /&gt;
*Download an Ubuntu Trusty Tahr 14.04 image for the RPi2 from [http://www.finnie.org/software/raspberrypi/2015-04-06-ubuntu-trusty.zip http://www.finnie.org/software/raspberrypi/2015-04-06-ubuntu-trusty.zip].&lt;br /&gt;
*Unzip it and write it to an sdcard.&lt;br /&gt;
*Boot and resize the filesystem to fill the sdcard:&lt;br /&gt;
**There are no Raspbian-specific utilities included, specifically no automatic root resizer. However, it&#039;s not hard to do manually. Once booted:&lt;br /&gt;
&lt;br /&gt;
 $ sudo fdisk /dev/mmcblk0&lt;br /&gt;
&lt;br /&gt;
**Delete the second partition (d, 2), then re-create it using the defaults (n, p, 2, enter, enter), then write and exit (w). Reboot the system, then:&lt;br /&gt;
&lt;br /&gt;
 $ sudo resize2fs /dev/mmcblk0p2&lt;br /&gt;
&lt;br /&gt;
*Add the linuxmce repo &amp;quot;deb http://deb.linuxmce.org/ubuntu/ trusty main&amp;quot; to /etc/apt/sources.list&lt;br /&gt;
 DEBIAN_FRONTEND=&amp;quot;noninteractive&amp;quot; apt-get update &amp;amp;&amp;amp; apt-get install -y lmce-core&lt;br /&gt;
*reboot&lt;br /&gt;
*No idea what happens now, feel free to play.  This is not, and will never be, supported.&lt;br /&gt;
&lt;br /&gt;
=RPi1 (obsolete) =&lt;br /&gt;
 NOTE: The RPi1 is no longer supported as a LinuxMCE Diskless style device.  If you wish to continue working on RPi1 support please contact us.&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi v1 B/B+ will not be supported for much longer, but can be used as a minimal diskless Media Director within LinuxMCE.  The following instructions will show how to create a diskless MD.  The Raspberry Pi 2 is not compatible with the PXE method of booting.&lt;br /&gt;
&lt;br /&gt;
When using the sdcard below the RPi will be overclocked using the standard Raspberry Pi foundation overclock settings.  These are throttled automatically as thermally required.  You are free to overclock the device further by editing the config.txt file on the sdcard.&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* Your core must be LinuxMCE 1204 or higher.&lt;br /&gt;
* The Raspberry Pi must be a 512MB Model B (or B+).  The Model A and the 256MB Model B do not have enough RAM to boot into Orbiter.&lt;br /&gt;
* The Raspberry Pi must be plugged into the internal side of your LinuxMCE core&#039;s network to act as a media director.&lt;br /&gt;
* The Raspberry Pi must be plugged in using the HDMI connector&amp;lt;del&amp;gt; and using HDMI sound&amp;lt;/del&amp;gt;.  Set an S (for Stereo) or H (for HDMI) for the Audio Settings for the MD in webadmin.&lt;br /&gt;
** The Raspberry Pi will detect the boot resolution of your television and adjust itself accordingly.&lt;br /&gt;
** If resolution has changed since the last boot the orbiter will be regenerated.&lt;br /&gt;
* You may wish to have a usb keyboard or mouse for orbiter interaction.  USB-UIRT/MCE Remote is also possible but must be installed using the webadmin (device detection is working but the device is not added currently).&lt;br /&gt;
&lt;br /&gt;
==Setup Steps==&lt;br /&gt;
*On the Core:&lt;br /&gt;
**Install the [http://www.linuxmce.org/linux-image-default-raspbian-wheezy_3.10-3-rpi-lmce1_all.deb default PXE kernel package (lmce1)] for a Raspberry Pi MD. This image will create an RPi MD (DT#2216) only.&lt;br /&gt;
**-- To be able to choose betwen an RPi MD and an RPi qMD (as well as other possible rpi Device Templates) at MD creation use [http://www.linuxmce.org/linux-image-default-raspbian-wheezy_3.10-3-rpi-lmce2_all.deb this (lmce2)] as the default image instead.  This image will allow you to choose from multiple RPi based image including RPi MD (DT#2216), RPi qMD (DT#2281) and others.&lt;br /&gt;
**edit /usr/pluto/bin/Diskless_CreateTBZ.sh and enable &amp;quot;raspbian_armhf&amp;quot; as the only TARGET_TYPE, be sure to comment (use a #) any other TARGET_TYPE lines so that only this one is enabled.&lt;br /&gt;
**run /usr/pluto/bin/Diskless_CreateTBZ.sh to create a raspbian tarball&amp;lt;del&amp;gt;, and sdcard.zip file on your core&amp;lt;/del&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Get the LinuxMCE Raspberry Pi MD SD card contents.&lt;br /&gt;
**Download the [http://www.linuxmce.org/sdcard.zip zip] &lt;br /&gt;
***Format the SD card for VFAT using the SD card formatter for Mac or Windows https://www.sdcard.org/downloads/formatter_4, or using mkfs.vfat on linux.&lt;br /&gt;
***Copy the entire contents of the sdcard zip to the newly formatted SD card, all files should be in the root directory of the card with no sub-directories.&lt;br /&gt;
*Insert the SD card into the Raspberry Pi.&lt;br /&gt;
*Power up the Raspberry Pi.&lt;br /&gt;
*On first boot the u-boot bootloader will start, it will try to grab various different pxe files until it finally finds the default PXE kernel and initrd.&lt;br /&gt;
*The kernel will boot, there is a 10 second delay when activating the ethernet drivers to allow for the hardware to respond properly, this delay only occurs during the default kernel/initrd boot.&lt;br /&gt;
*Raspberry Pi will display &amp;quot;Announced ourselves to the router&amp;quot;.&lt;br /&gt;
**If you have the lmce1 default image installed (see above,) the core will run Diskless_Setup to prepare an RPi MD.&lt;br /&gt;
**If you have the lmce2 default image installed (see above,) you will be prompted on existing orbiters to select the type of RPi device you would like installed.  Once you have made your selection the core will run Diskless_Setup to prepare the device.&lt;br /&gt;
*The Raspberry Pi will reboot automatically once Diskless_Setup completes properly.&lt;br /&gt;
*You should go to an existing orbiter and &#039;Reload the Router&#039; after this point.  You will be prompted to do so eventually on the moonPi, if you have not already done so.&lt;br /&gt;
*On the second boot (called the &#039;FIRSTRUN&#039;) the bootloader on the sdcard will be updated to the version on the diskless image.&lt;br /&gt;
*The Raspberry Pi will reboot again.&lt;br /&gt;
*On the third boot LinuxMCE will slowly come to life.  Please be patient, this can take up to 45 minutes.  You will be presented with the Setup Wizard after ConfirmDependencies has finished installing all ancillary packages.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=RaspberryPi&amp;diff=36040</id>
		<title>RaspberryPi</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=RaspberryPi&amp;diff=36040"/>
		<updated>2015-09-30T08:13:29Z</updated>

		<summary type="html">&lt;p&gt;RayBe: The sources.list seems to be in a different path on ARMHF distro&amp;#039;s&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[Category: Media Directors]]&lt;br /&gt;
[[Category: Barebones]]&lt;br /&gt;
qMDs are still a thing of myth, although seen occasionally in the wild they are elusive and not easily tamed. ;)&lt;br /&gt;
&lt;br /&gt;
=Device Specification=&lt;br /&gt;
*The Raspberry Pi 2 B is an ARM based computer the size of a credit card.  4x900Mhz Cores, 1GB RAM, FastEthernet, 4xUSB, 40xGPIO&lt;br /&gt;
*The Raspberry Pi B is an ARM based computer the size of a credit card.  1x700Mhz Core, 256MB or 512MB RAM, FastEthernet, 2xUSB, GPIO&lt;br /&gt;
&lt;br /&gt;
=RPi Disked Media Director=&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* Your core must be LinuxMCE 1204 or higher.&lt;br /&gt;
* The recommended device is the RPi2.  The RPi2 runs at a reasonable speed and can support all the functions of a LinuxMCE MediaDirector.  &lt;br /&gt;
* The following Raspbian based SD cards are bootable on anything that is a Raspberry Pi Model B or higher.  RPi1 performance is very, very, very slow.&lt;br /&gt;
&lt;br /&gt;
==Setup Steps==&lt;br /&gt;
*Download the rpi uSD card image ([http://download.linuxmce.org/lmce-disked-md-rpi2-jessie.tar.xz raspbian jessie (recommended)] (Updated: 2015-09-23)&lt;br /&gt;
*Download the rpi uSD card image ([http://download.linuxmce.org/lmce-disked-md-rpi2-wheezy.tar.xz raspbian wheezy (deprecated)]&lt;br /&gt;
*Download the rpi uSD card image ([http://download.linuxmce.org/lmce-disked-md-rpi2-trusty.tar.xz ubuntu trusty(RPi2 only and you&#039;re on your own here)])&lt;br /&gt;
*untar the compressed file&lt;br /&gt;
*Install the resulting image onto an SD card, using dd on linux or win32diskimage on windows&lt;br /&gt;
*Ensure the RPi is connected to the internal lan of your core and boot the RPi.&lt;br /&gt;
*You may be prompted on existing orbiters to choose a device type MD/qMD/SqueezeOnly, do so.&lt;br /&gt;
*The device will automatically be created, you will need to reload your router.&lt;br /&gt;
*The MD will resize the filesystem to fit the SDCard and then reboot.&lt;br /&gt;
*AVWizard will not appear.&lt;br /&gt;
*You should see the setup wizard and be asked to configure your new MD.&lt;br /&gt;
*The new RPi moonpi should continue installing and eventually present you with a UI1 OnScreen Orbiter.&lt;br /&gt;
*Please report any bugs with *very* specific (package date/svn, etc) information in a ticket.&lt;br /&gt;
&lt;br /&gt;
==HDMI-CEC Control==&lt;br /&gt;
Please see [[Pulse-Eight]] for HDMI-CEC setup information&lt;br /&gt;
&lt;br /&gt;
==Manual Settings==&lt;br /&gt;
*Overscan - currently only able to change by manually editing the config.txt file on the sdcard. (See [http://elinux.org/RPiconfig http://elinux.org/RPiconfig])&lt;br /&gt;
*Overscan compensation - currently only able to change by manually editing the config.txt file on the sdcard.  In /sdcard/config.txt from a booted moonpi. (See [http://elinux.org/RPiconfig http://elinux.org/RPiconfig])&lt;br /&gt;
*Orbiter will automatically regenerate following a reboot and detecting a new display resolution.&lt;br /&gt;
*Audio settings are adjusted in webadmin: S = Stereo, H = HDMI, H3 = HDMI with passthrough capability for AC3 &amp;amp; DTS&lt;br /&gt;
&lt;br /&gt;
==What works==&lt;br /&gt;
*Orbiter UI1&lt;br /&gt;
*Photo Screen Saver (need to disable on RPi1)&lt;br /&gt;
*AppServer&lt;br /&gt;
*HAL&lt;br /&gt;
*Embedded phone&lt;br /&gt;
*OMX_Player will play audio and video.  You must have the appropriate codecs to play MPG and VC1 media.  The codecs can be purchased from the Raspberry Pi foundation.&lt;br /&gt;
*squeezelite can play audio&lt;br /&gt;
*USB-UIRT&lt;br /&gt;
*HDMI-CEC control&lt;br /&gt;
*Generic Serial Devices (only on RPi2)&lt;br /&gt;
&lt;br /&gt;
==What does not work==&lt;br /&gt;
*Video Overlays&lt;br /&gt;
&lt;br /&gt;
= RPi2 Core =&lt;br /&gt;
This section is meant for informational purposes only and is not intended to suggest that the RaspberryPi2 would make a good core.  There is NO support for this.&lt;br /&gt;
&lt;br /&gt;
*Download an Ubuntu Trusty Tahr 14.04 image for the RPi2 from [http://www.finnie.org/software/raspberrypi/2015-04-06-ubuntu-trusty.zip http://www.finnie.org/software/raspberrypi/2015-04-06-ubuntu-trusty.zip].&lt;br /&gt;
*Unzip it and write it to an sdcard.&lt;br /&gt;
*Boot and resize the filesystem to fill the sdcard (raspi-config in librasbperrypi-bin iirc)&lt;br /&gt;
*Add the linuxmce repo &amp;quot;deb http://deb.linuxmce.org/ubuntu/ trusty main&amp;quot; to /etc/apt/sources.list&lt;br /&gt;
 DEBIAN_FRONTEND=&amp;quot;noninteractive&amp;quot; apt-get update &amp;amp;&amp;amp; apt-get install -y lmce-core&lt;br /&gt;
*reboot&lt;br /&gt;
*No idea what happens now, feel free to play.  This is not, and will never be, supported.&lt;br /&gt;
&lt;br /&gt;
=RPi1 (obsolete) =&lt;br /&gt;
 NOTE: The RPi1 is no longer supported as a LinuxMCE Diskless style device.  If you wish to continue working on RPi1 support please contact us.&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi v1 B/B+ will not be supported for much longer, but can be used as a minimal diskless Media Director within LinuxMCE.  The following instructions will show how to create a diskless MD.  The Raspberry Pi 2 is not compatible with the PXE method of booting.&lt;br /&gt;
&lt;br /&gt;
When using the sdcard below the RPi will be overclocked using the standard Raspberry Pi foundation overclock settings.  These are throttled automatically as thermally required.  You are free to overclock the device further by editing the config.txt file on the sdcard.&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* Your core must be LinuxMCE 1204 or higher.&lt;br /&gt;
* The Raspberry Pi must be a 512MB Model B (or B+).  The Model A and the 256MB Model B do not have enough RAM to boot into Orbiter.&lt;br /&gt;
* The Raspberry Pi must be plugged into the internal side of your LinuxMCE core&#039;s network to act as a media director.&lt;br /&gt;
* The Raspberry Pi must be plugged in using the HDMI connector&amp;lt;del&amp;gt; and using HDMI sound&amp;lt;/del&amp;gt;.  Set an S (for Stereo) or H (for HDMI) for the Audio Settings for the MD in webadmin.&lt;br /&gt;
** The Raspberry Pi will detect the boot resolution of your television and adjust itself accordingly.&lt;br /&gt;
** If resolution has changed since the last boot the orbiter will be regenerated.&lt;br /&gt;
* You may wish to have a usb keyboard or mouse for orbiter interaction.  USB-UIRT/MCE Remote is also possible but must be installed using the webadmin (device detection is working but the device is not added currently).&lt;br /&gt;
&lt;br /&gt;
==Setup Steps==&lt;br /&gt;
*On the Core:&lt;br /&gt;
**Install the [http://www.linuxmce.org/linux-image-default-raspbian-wheezy_3.10-3-rpi-lmce1_all.deb default PXE kernel package (lmce1)] for a Raspberry Pi MD. This image will create an RPi MD (DT#2216) only.&lt;br /&gt;
**-- To be able to choose betwen an RPi MD and an RPi qMD (as well as other possible rpi Device Templates) at MD creation use [http://www.linuxmce.org/linux-image-default-raspbian-wheezy_3.10-3-rpi-lmce2_all.deb this (lmce2)] as the default image instead.  This image will allow you to choose from multiple RPi based image including RPi MD (DT#2216), RPi qMD (DT#2281) and others.&lt;br /&gt;
**edit /usr/pluto/bin/Diskless_CreateTBZ.sh and enable &amp;quot;raspbian_armhf&amp;quot; as the only TARGET_TYPE, be sure to comment (use a #) any other TARGET_TYPE lines so that only this one is enabled.&lt;br /&gt;
**run /usr/pluto/bin/Diskless_CreateTBZ.sh to create a raspbian tarball&amp;lt;del&amp;gt;, and sdcard.zip file on your core&amp;lt;/del&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Get the LinuxMCE Raspberry Pi MD SD card contents.&lt;br /&gt;
**Download the [http://www.linuxmce.org/sdcard.zip zip] &lt;br /&gt;
***Format the SD card for VFAT using the SD card formatter for Mac or Windows https://www.sdcard.org/downloads/formatter_4, or using mkfs.vfat on linux.&lt;br /&gt;
***Copy the entire contents of the sdcard zip to the newly formatted SD card, all files should be in the root directory of the card with no sub-directories.&lt;br /&gt;
*Insert the SD card into the Raspberry Pi.&lt;br /&gt;
*Power up the Raspberry Pi.&lt;br /&gt;
*On first boot the u-boot bootloader will start, it will try to grab various different pxe files until it finally finds the default PXE kernel and initrd.&lt;br /&gt;
*The kernel will boot, there is a 10 second delay when activating the ethernet drivers to allow for the hardware to respond properly, this delay only occurs during the default kernel/initrd boot.&lt;br /&gt;
*Raspberry Pi will display &amp;quot;Announced ourselves to the router&amp;quot;.&lt;br /&gt;
**If you have the lmce1 default image installed (see above,) the core will run Diskless_Setup to prepare an RPi MD.&lt;br /&gt;
**If you have the lmce2 default image installed (see above,) you will be prompted on existing orbiters to select the type of RPi device you would like installed.  Once you have made your selection the core will run Diskless_Setup to prepare the device.&lt;br /&gt;
*The Raspberry Pi will reboot automatically once Diskless_Setup completes properly.&lt;br /&gt;
*You should go to an existing orbiter and &#039;Reload the Router&#039; after this point.  You will be prompted to do so eventually on the moonPi, if you have not already done so.&lt;br /&gt;
*On the second boot (called the &#039;FIRSTRUN&#039;) the bootloader on the sdcard will be updated to the version on the diskless image.&lt;br /&gt;
*The Raspberry Pi will reboot again.&lt;br /&gt;
*On the third boot LinuxMCE will slowly come to life.  Please be patient, this can take up to 45 minutes.  You will be presented with the Setup Wizard after ConfirmDependencies has finished installing all ancillary packages.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=RaspberryPi&amp;diff=35286</id>
		<title>RaspberryPi</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=RaspberryPi&amp;diff=35286"/>
		<updated>2014-11-14T10:08:53Z</updated>

		<summary type="html">&lt;p&gt;RayBe: Add HDMI-CEC control&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[Category: Media Directors]]&lt;br /&gt;
[[Category: Barebones]]&lt;br /&gt;
Please be aware that this is in flux as a transition is made to qOrbiter.  RaspberryPi diskless creation has stabilized somewhat.&lt;br /&gt;
&lt;br /&gt;
==Device Specification==&lt;br /&gt;
The Raspberry Pi is an ARM based computer the size of a credit card.  700Mhz, 256MB or 512MB RAM, FastEthernet, 2xUSB, GPIO&lt;br /&gt;
&lt;br /&gt;
When using the sdcard below the RPi will be overclocked using the standard Raspberry Pi foundation overclock settings.  These are throttled automatically as thermally required.  You are free to overclock the device further by editing the config.txt file on the sdcard.&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
See [[Porting_Raspbian]] for the current development status of LinuxMCE on Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
==Media Director==&lt;br /&gt;
The Raspberry Pi can be used as a minimal Media Director within LinuxMCE.  The following instructions will show how to create a MD.&lt;br /&gt;
&lt;br /&gt;
===Requirements===&lt;br /&gt;
* Your core must be LinuxMCE 1204 or higher.&lt;br /&gt;
* The Raspberry Pi must be plugged into the internal side of your LinuxMCE core&#039;s network to act as a media director.&lt;br /&gt;
* The Raspberry Pi must be a 512MB Model B (or B+).  The Model A and the 256MB Model B do not have enough RAM to boot into Orbiter.&lt;br /&gt;
* The Raspberry Pi must be plugged in using the HDMI connector&amp;lt;del&amp;gt; and using HDMI sound&amp;lt;/del&amp;gt;.  Set an S (for Stereo) or H (for HDMI) for the Audio Settings for the MD in webadmin.&lt;br /&gt;
** The Raspberry Pi will detect the boot resolution of your television and adjust itself accordingly.&lt;br /&gt;
** If resolution has changed since the last boot the orbiter will be regenerated.&lt;br /&gt;
* You may wish to have a usb keyboard or mouse for orbiter interaction.  USB-UIRT/MCE Remote is also possible but must be installed using the webadmin (device detection is working but the device is not added currently).&lt;br /&gt;
&lt;br /&gt;
===Setup Steps===&lt;br /&gt;
*On the Core:&lt;br /&gt;
**Install the default pxe kernel package for a Raspberry Pi MD.   (https://dl.dropboxusercontent.com/u/118201886/linux-image-default-raspbian-wheezy_3.10-3-rpi-lmce1_all.deb)  This image will create an RPi MD (DT#2216) only.&lt;br /&gt;
**-- To be able to choose betwen an RPi MD and an RPi qMD (as well as other possible rpi Device Templates) at MD creation use this (https://dl.dropboxusercontent.com/u/118201886/linux-image-default-raspbian-wheezy_3.10-3-rpi-lmce2_all.deb) as the default image instead.  This image will allow you to choose from multiple RPi based image including RPi MD (DT#2216), RPi qMD (DT#2281) and others.&lt;br /&gt;
**edit /usr/pluto/bin/Diskless_CreateTBZ.sh and enable &amp;quot;raspbian_armhf&amp;quot; as the only TARGET_TYPE, be sure to comment (use a #) any other TARGET_TYPE lines so that only this one is enabled.&lt;br /&gt;
**run /usr/pluto/bin/Diskless_CreateTBZ.sh to create a raspbian tarball&amp;lt;del&amp;gt;, and sdcard.zip file on your core&amp;lt;/del&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Get the LinuxMCE Raspberry Pi MD sdcard contents.&lt;br /&gt;
**Download - https://dl.dropboxusercontent.com/u/118201886/sdcard.zip&lt;br /&gt;
***Format the sdcard for VFAT using the sd card formatter for Mac or Windows https://www.sdcard.org/downloads/formatter_4, or using mkfs.vfat on linux.&lt;br /&gt;
***Copy the entire contents of the sdcard zip to the newly formatted sdcard, all files should be in the root directory of the card with no sub-directories.&lt;br /&gt;
*Insert the sdcard into the Raspberry Pi.&lt;br /&gt;
*Power up the Raspberry Pi.&lt;br /&gt;
*On first boot the u-boot bootloader will start, it will try to grab various different pxe files until it finally finds the default pxe kernel and initrd.&lt;br /&gt;
*The kernel will boot, there is a 10second delay when activating the ethernet drivers to allow for the hardware to respond properly, this delay only occurs during the default kernel/initrd boot.&lt;br /&gt;
*Raspberry Pi will display &amp;quot;Announced ourselves to the router&amp;quot;.&lt;br /&gt;
**If you have the lmce1 default image installed (see above,) the core will run Diskless_Setup to prepare an RPi MD.&lt;br /&gt;
**If you have the lmce2 default image installed (see above,) you will be prompted on existing orbiters to select the type of RPi device you would like installed.  Once you have made your selection the core will run Diskless_Setup to prepare the device.&lt;br /&gt;
*The Raspberry Pi will reboot automatically once Diskless_Setup completes properly.&lt;br /&gt;
*You should go to an existing orbiter and &#039;Reload the Router&#039; after this point.  You will be prompted to do so eventually on the moonPi, if you have not already done so.&lt;br /&gt;
*On the second boot (called the &#039;FIRSTRUN&#039;) the bootloader on the sdcard will be updated to the version on the diskless image.&lt;br /&gt;
*The Raspberry Pi will reboot again.&lt;br /&gt;
*On the third boot LinuxMCE will slowly come to life.  Please be patient, this can take up to 45 minutes.  You will be presented with the Setup Wizard after ConfirmDependencies has finished installing all ancilliary packages.&lt;br /&gt;
&lt;br /&gt;
===Setup Steps for CEC HDMI Control===&lt;br /&gt;
The RaspberryPi supports CEC HDMI control.&amp;lt;br /&amp;gt;&lt;br /&gt;
Your standard TV-remote can be used to control LMCE and LMCE can control your A/V equipment.&amp;lt;br /&amp;gt;&lt;br /&gt;
At the moment CEC HDMI control is under development and can only be setup manual. In the future this will be a automatic process. &lt;br /&gt;
Not all commands are implemented yet.&amp;lt;br /&amp;gt;&lt;br /&gt;
To be able to use CEC HDMI Control:&lt;br /&gt;
*Install the CEC Adaptor (DT#2284) as a child of your main RaspberryPi MD (DT#2216), this will also install the devices:&lt;br /&gt;
**CEC Embedded Transmit (DT#2303) as a child to the CEC Adaptor)&lt;br /&gt;
**HDMI-CEC Remote (DT#2285) as a child to your main RaspberryPi MD (DT#2216)&lt;br /&gt;
At this point you can control LMCE with your standard TV-remote.&amp;lt;br /&amp;gt;&lt;br /&gt;
(note: as vendors tend to make different implementation of the CEC-protocol, not all commands may be supported by your tv)&amp;lt;br /&amp;gt;&lt;br /&gt;
If you want LMCE to be able to control your A/V equipment you can install child devices to your CEC Embedded Transmit device (note: at the moment only power on/off is supported, this will be extended in the future):&lt;br /&gt;
*Generic HDMI-CEC TV (#2304) to control your CEC enabled tv.&lt;br /&gt;
*Generic HDMI-CEC Player (DT#2305)to control your CEC enabled DVD/BLU-Ray players.&lt;br /&gt;
*Generic HDMI-CEC Audio (AVR) (DT#2306) to control your CEC enabled A/V Receiver.&lt;br /&gt;
Right after you install one of the above DT&#039;s, the Setup-Wizard will appear.&amp;lt;br /&amp;gt;&lt;br /&gt;
In the Setup-Wizard set the appropriate settings to your setup and finish it.&amp;lt;br /&amp;gt;&lt;br /&gt;
Check in Webadmin -&amp;gt; Devices -&amp;gt; A/V Equipment -&amp;gt; Connection Wizard if the right settings are being made.  &lt;br /&gt;
&lt;br /&gt;
===Manual Settings===&lt;br /&gt;
*Overscan - currently only able to change by manually editing the config.txt file on the sdcard.&lt;br /&gt;
*Overscan compensation - currently only able to change by manually editing the config.txt file on the sdcard.&lt;br /&gt;
**Orbiter will automatically regenerate after rebooting and detecting a new resolution display resolution.&lt;br /&gt;
*Audio settings are adjusted in webadmin: S = Stereo, H = HDMI, H3 = HDMI with passthrough capability for AC3 &amp;amp; DTS&lt;br /&gt;
&lt;br /&gt;
===What works===&lt;br /&gt;
*Orbiter UI1&lt;br /&gt;
*Photo Screen Saver&lt;br /&gt;
*AppServer&lt;br /&gt;
*HAL&lt;br /&gt;
*Embedded phone.&lt;br /&gt;
*OMX_Player (alpha) will play audio and video.  You must have the appropriate codecs to play MPG and VC1 media.  The codecs can be purchased from the Raspberry Pi foundation.&lt;br /&gt;
*USB-UIRT&lt;br /&gt;
*HDMI-CEC control, currently you can control LMCE with a standard TV-remote and the power on/off commands are implemented.&lt;br /&gt;
*Others? Please add additional, known to be working, devices here.&lt;br /&gt;
&lt;br /&gt;
===What does not work===&lt;br /&gt;
* Video Overlays&lt;br /&gt;
* MythTV&lt;br /&gt;
* Everything else... ;)&lt;br /&gt;
* Serial GSD, it works... but it kills the CPU and causes media stuttering.  Ethernet GSD should be doable.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=LinuxMCE-1204/1404_Updates&amp;diff=34932</id>
		<title>LinuxMCE-1204/1404 Updates</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=LinuxMCE-1204/1404_Updates&amp;diff=34932"/>
		<updated>2014-04-16T08:16:00Z</updated>

		<summary type="html">&lt;p&gt;RayBe: /* Upcoming fixes... */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
This page outlines some information about the 1204 changes, as well as outlining any changes and bugfixes we are applying.&lt;br /&gt;
&lt;br /&gt;
If a package needs to be built, put it under Upcoming fixes... As soon as a set of package is built, those packages move into a section called Update XXXXX where XXXXX is the svn revision at the time of build.&lt;br /&gt;
&lt;br /&gt;
== Upcoming fixes... ==&lt;br /&gt;
&#039;&#039;&#039;Note: Please put the name of the package file and the source and bin package number in this list, followed by a small description of what has changed! Hulu Player is not the name of the package, but lmce-hulu-player. It makes the life of the person, who needs to update the repo a lot easier. Thank you!&#039;&#039;&#039;&lt;br /&gt;
* lmce-hue-controller (862,863) - fixes for hue controller run-time errors&lt;br /&gt;
* lmce-diskless-tools (627,628) - fix mountnfs.sh script on MDs.&lt;br /&gt;
* pluto-storage-devices (533) - don&#039;t cat to /etc/mtab if it is already a symlink to /proc/mounts&lt;br /&gt;
&lt;br /&gt;
== Update 28947 ==&lt;br /&gt;
* pluto-system-database (211) - revert TSCHAK&#039;s font, again.&lt;br /&gt;
* pluto-website-admin (220) - advanced ZWave page, now possible to set config parameters, some esthetic cleanups&lt;br /&gt;
* lmce-zwave-ozw(505,506) - provide network data for the advanced ZWave page&lt;br /&gt;
* pluto-powerfile-c200 (492,493) - builds, not currently in repo&lt;br /&gt;
* pluto-sql2cpp (202,203) - builds, not currently in repo&lt;br /&gt;
* pluto-tribunetv (598,599) - builds, not currently in repo&lt;br /&gt;
* lmce-qmediaplayer-plugin (856,857) - builds, not currently in repo&lt;br /&gt;
* lmce-mame-snaps (681) - builds, not currently in repo - not part of current build due to size, single build with release-pkg.sh perhaps.&lt;br /&gt;
&lt;br /&gt;
== Update 28939 ==&lt;br /&gt;
* pluto-system-database (211) - removes precise compatibility from lshwd&lt;br /&gt;
* pluto-boot-scripts (234) - remove lshwd from bootscripts, restore ConfirmDependencies on reboot/rebuild.&lt;br /&gt;
* pluto-text-to-speech (283,284) - change from nitech to cmu voice to get ivr menu generation working again&lt;br /&gt;
* pluto-asterisk (270) - Fix ownership of asterisk/pluto sound files&lt;br /&gt;
* pluto-website-admin (220) - fix webadmin display of serial ports on MDs, use existing scripts to consolide the function, new advanced ZWave page&lt;br /&gt;
* lmce-zwave-ozw(505,506) - provide network data for the advanced ZWave page&lt;br /&gt;
&lt;br /&gt;
== Update 28891 ==&lt;br /&gt;
* lmce-zwave-ozw(505,506) - only send state changed events when value has actually changed&lt;br /&gt;
&lt;br /&gt;
== Update 28831 ==&lt;br /&gt;
* libopenzwave1.0(824, 825) - new upstream version&lt;br /&gt;
* lmce-zwave-ozw(505,506) - adjust timeout for retries from 40 to 2 seconds&lt;br /&gt;
&lt;br /&gt;
== Update 28821 ==&lt;br /&gt;
* lmce-diskless-tools (627,628) - stop waiting up to 3 mins for working network&lt;br /&gt;
* pluto-x-scripts (520,523) - fix avwiz having a hissy fit without video drivers.&lt;br /&gt;
* pluto-updatemedia (405,406) - unstripped bin for debugging.&lt;br /&gt;
* lmce-zwave-ozw(505,506) - add notification of level changes&lt;br /&gt;
&lt;br /&gt;
== Update 28803 ==&lt;br /&gt;
* pluto-website-admin - GSD code editor now fills the window &amp;amp; fix to find omx player or xine player in webadmin, prevents update error&lt;br /&gt;
* lmce-diskless-tools (627,628) - removes plymouth theme&lt;br /&gt;
* pluto-boot-scripts (234) - WakeMD fix for certain nvidia nics.&lt;br /&gt;
&lt;br /&gt;
== Update 28792 ==&lt;br /&gt;
* pluto-website-admin - Final refresh fix for weborbiter - thx Uplink and cfernandez&lt;br /&gt;
== Update 28788 ==&lt;br /&gt;
* lmce-qorbiter (858,859) - include qmldir in skins&lt;br /&gt;
* lmce-qorbiter-skins-android (849) - include qmldir in skins&lt;br /&gt;
* lmce-qorbiter-skins-common (847) - include qmldir in skins&lt;br /&gt;
* lmce-qorbiter-skins-desktop (850) - include qmldir in skins&lt;br /&gt;
* lmce-qorbiter-skins-qt4libs (846) - include qmldir in skins&lt;br /&gt;
* lmce-qorbiter-skins-qt5libs (845) - include qmldir in skins&lt;br /&gt;
* lmce-qorbiter-skins-rpi (848) - include qmldir in skins&lt;br /&gt;
* pluto-boot-scripts (234) - Firewall fix to permit user firewall rules again.&lt;br /&gt;
&lt;br /&gt;
== Update 28786 ==&lt;br /&gt;
*lmce-diskless-tools (627,628) - fix setting of /etc/defaultdomain on MDs so networking/dns lookups and more do not have a hissy fit.  Thanks Dap_P!&lt;br /&gt;
&lt;br /&gt;
== Update 28755 ==&lt;br /&gt;
*lmce-diskless-tools (627,628) - fix error in for loop of postinst&lt;br /&gt;
&lt;br /&gt;
== Update 28741 ==&lt;br /&gt;
*pluto-motion-wrapper (455,456) - upgrade dependency to libavcodec53&lt;br /&gt;
*pluto-system-database (211) - InstallWizard &amp;amp; InstallWizard_Distro changes for rpi.&lt;br /&gt;
*lmce-diskless-tools (627,628)&lt;br /&gt;
** add lsb-release data to diskless images for Raspbian Wheezy, fixes ConfirmDependencies on raspbian.&lt;br /&gt;
** fixups for rpi diskless image creation and additions for multiarch deb-cache support&lt;br /&gt;
&lt;br /&gt;
== Update 28706 ==&lt;br /&gt;
* pluto-boot-scripts (234) - Refs #1769 - DDNS fixes, thanks mkbrown69!&lt;br /&gt;
* mce-diskless-tools (627,628) - fix Diskless_CreateTBZ.sh for Raspbian Wheezy&lt;br /&gt;
&lt;br /&gt;
Updated lmce-diskless-tools - hope that is correct.&lt;br /&gt;
&lt;br /&gt;
== Update 28696 ==&lt;br /&gt;
* pluto-app-server (126,145) - Properly power off system, as &#039;shutdown&#039; no longer does this due to semantics change. use &#039;poweroff&#039; instead. *shakes-fist-at-ubuntu-people*&lt;br /&gt;
&lt;br /&gt;
== Update 28686 ==&lt;br /&gt;
* pluto-vdr - Add a custom no signal image with some notes&lt;br /&gt;
&lt;br /&gt;
== Update 28682 ==&lt;br /&gt;
* pluto-web-admin - Refs #2057 - Add button to wizardorbiters to update qOrbiter skins.&lt;br /&gt;
* pluto-usb-uirt-0038 (525,526) - Refs #2051, Refs #1355 - fixes a small strcpy 4-bit offset copy (on i386) that mangled uuirt send/receive data.  Thank you sambuca for finding a needle in a haystack!&lt;br /&gt;
* pluto-system-database (211) - XBOX 360 IR changes, Denon IP template changes.&lt;br /&gt;
* pluto-orbiter (118,139) - Screen Types should now be propagated to IR transceivers in the same room, fixing edge case with multiple IR transcievers on same hybrid (e.g. UIRT and a USB Game Pad)&lt;br /&gt;
&lt;br /&gt;
== Update 28637 ==&lt;br /&gt;
* pluto-boot-scripts (234) - Fixes #2015 setup firewall properly or dous nothing for the webfilter or proxy.&lt;br /&gt;
&lt;br /&gt;
== Update 28609 ==&lt;br /&gt;
* pluto-boot-scripts (234) - Fixes #2043 domainname inconsistencies, should fix some DNS and samba issues.&lt;br /&gt;
* lmce-hue-controller - initial device package&lt;br /&gt;
&lt;br /&gt;
== Update 28603 ==&lt;br /&gt;
* pluto-website-admin - refs #2015 change place of the scripts.&lt;br /&gt;
* lmce-webfilter - dedicated package for webfilter and proxy.&lt;br /&gt;
&lt;br /&gt;
== Update 28591 ==&lt;br /&gt;
* lmce-agocontrol-bridge (827,826) - refs #1505 - support settemperature and setthermostatmode in bridge&lt;br /&gt;
&lt;br /&gt;
== Update 28570 ==&lt;br /&gt;
* pluto-system-database (211) - Revert the clock changes, as they seem to have just fucked up everybody&#039;s day. (TSCHAK)&lt;br /&gt;
* pluto-skins-* and lmce-skins-* - Skin changes all over&lt;br /&gt;
&lt;br /&gt;
== Update 28538 ==&lt;br /&gt;
* pluto-boot-scripts (234) - Refs #2034 cannot do math with letters. Audio device will write now.&lt;br /&gt;
&lt;br /&gt;
== Update 28514 ==&lt;br /&gt;
* pluto-boot-scripts (234) - Refs #2026 Typo in nvidia-install.sh broke everything.&lt;br /&gt;
* pluto-avwizard (556,555) - Refs #2026 a0start_avwizard script did not get correct change.&lt;br /&gt;
&lt;br /&gt;
== Update 28506 ==&lt;br /&gt;
* pluto-boot-scripts (234) - Refs #2026 Change audio and video detection and setup. Addition of VideoDetectSetup file to handle both detection and setup. Changes to how we write asound.conf to comply with what Xine_Streamfactory is wanting to see. Changes to nvidia-install.sh to make 1204 specific, removal of a lot of unneeded logic to get new hw working on 1004.&lt;br /&gt;
* pluto-avwizard (556,555) - Refs #2026 Changes to init script and AVWizard_Run.sh to better handle video and audio setup.&lt;br /&gt;
* pluto-vdr (468,469) - change to service invocation&lt;br /&gt;
* pluto-usb-uirt-0038 (525,526) - update i386 uirt driver, rebuild for precise.&lt;br /&gt;
* lmce-diskless-tools (627,628) - lmce-diskless-network.conf upstart script to alleviate waiting for network configuration on MD boot.&lt;br /&gt;
&lt;br /&gt;
== Update 28488 ==&lt;br /&gt;
* pluto-website-admin (220) - SimplePhones attached to Joggler should now be able to select their appropriate sound card/usb microphone. (TSCHAK)&lt;br /&gt;
* pluto-storage-devices (533) - service invocation updates&lt;br /&gt;
* lmce-qorbiter (858,859) - remote load change&lt;br /&gt;
* lmce-qorbiter-skins-android (849) - remote load change&lt;br /&gt;
* lmce-qorbiter-skins-common (847) - remote load change&lt;br /&gt;
* lmce-qorbiter-skins-desktop (850) - remote load change&lt;br /&gt;
* lmce-qorbiter-skins-qt4libs (846) - remote load change&lt;br /&gt;
* lmce-qorbiter-skins-qt5libs (845) - remote load change&lt;br /&gt;
* lmce-qorbiter-skins-rpi (848) - remote load change&lt;br /&gt;
&lt;br /&gt;
== Update 28461 ==&lt;br /&gt;
* lmce-agocontrol-bridge (827,826) - Refs #1505 - change key from inventory to devices, add sanity checks for map conversion&lt;br /&gt;
* lmce-qorbiter (858,859) - full packaging of qOrbiter for precise&lt;br /&gt;
&lt;br /&gt;
== Update 28459 ==&lt;br /&gt;
* pluto-system-database (211) - database updates for dynamic repository naming/resolving&lt;br /&gt;
* pluto-add-software (572,573) - removes deprecated script instcheck.sh from boot process&lt;br /&gt;
* lmce-zwave-ozw(505,506) - fix node events (sensor reports and more)&lt;br /&gt;
* pluto-disk-drive (122,141) - needs a rebuild to work - probably changes in some library&lt;br /&gt;
* pluto-disc-drive-functions (496,497) - needs a rebuild to work - probably changes in some library&lt;br /&gt;
&lt;br /&gt;
== Update 28441 ==&lt;br /&gt;
* pluto-avwizard (556,555) - init scripts&lt;br /&gt;
* pluto-boot-scripts (234) - init scripts&lt;br /&gt;
* lmce-update-system (651) - init scripts&lt;br /&gt;
* lmce-launch-manager (298,299) - init scripts&lt;br /&gt;
* lmce-diskless-tools (627,628) - init scripts&lt;br /&gt;
* pluto-confirm-dependencies (281,272)&lt;br /&gt;
** fixups for sources.list checking/verifying&lt;br /&gt;
** dynamic repository naming/resolving&lt;br /&gt;
* pluto-install-scripts (391) - fixups for sources.list checking/verifying with confirmdeps&lt;br /&gt;
* pluto-system-database (211) - database updates for dynamic repository naming/resolving&lt;br /&gt;
* lmce-qorbiter (858,859) - initial package of qorbiter for qt 4.8.1 on precise&lt;br /&gt;
* pluto-std-plugins (116,135) - A Fix for the current play all bug. (TSCHAK)&lt;br /&gt;
&lt;br /&gt;
== Update 28438 ==&lt;br /&gt;
* lmce-zwave-ozw(505,506) - code restructuring, fixes to avoid depending on the order the values passed from OZW&lt;br /&gt;
&lt;br /&gt;
== Update 28436 ==&lt;br /&gt;
* libopenzwave1.0(824, 825) - fix to enable proper SUC/SIS mode&lt;br /&gt;
* lmce-zwave-ozw(505,506) - some fixes and logging to iron out the last device mapping problems&lt;br /&gt;
&lt;br /&gt;
== Update 28426 ==&lt;br /&gt;
* pluto-std-plugins (116,135) - Fix for wrong playlist entries showing up in all instances of Play All. (tschak)&lt;br /&gt;
&lt;br /&gt;
== Update 28407 ==&lt;br /&gt;
* libopenzwave1.0(824, 825) - fix to enable proper SUC/SIS mode&lt;br /&gt;
&lt;br /&gt;
== Update 28399 ==&lt;br /&gt;
* pluto-std-plugins - general info plugin updated.&lt;br /&gt;
* pluto-createdevice - fixes for taking repos et al into account when autodetecting devices.&lt;br /&gt;
&lt;br /&gt;
== Update 28398 ==&lt;br /&gt;
* libopenzwave1.0(824, 825) - fix to enable proper SUC/SIS mode&lt;br /&gt;
* lmce-zwave-ozw(505,506) - major rework of how zwave nodes are mapped to lmce devices - this will improve the amount of nodes that are automatically added to lmce, but might cause some backward compability problems. Problems include dupliacte devices being added to lmce. Just delete the old device and you will be fine. This will only happen in cases where you manually added lmce devices.&lt;br /&gt;
&lt;br /&gt;
== Update 28360 ==&lt;br /&gt;
* lmce-zwave-ozw(505,506) - major rework of how zwave nodes are mapped to lmce devices - this will improve the amount of nodes that are automatically added to lmce, but might cause some backward compability problems. Problems include dupliacte devices being added to lmce. Just delete the old device and you will be fine. This will only happen in cases where you manually added lmce devices.&lt;br /&gt;
* libopenzwave1.0(824, 825) - fix to enable proper SUC/SIS mode&lt;br /&gt;
&lt;br /&gt;
== Update 28341 ==&lt;br /&gt;
* pluto-avwizard (556,555) - fix (hopefully) AVWizard not running on second boot after DVD install&lt;br /&gt;
* pluto-boot-scripts (234)&lt;br /&gt;
** fix (hopefully) AVWizard not running on second boot after DVD install&lt;br /&gt;
** re-store Update_StartupScrips.sh script functionality&lt;br /&gt;
* lmce-diskless-tools (627,628) - ensure /tftpboot/default/vmlinuz is readable by MDs during PXE boot.&lt;br /&gt;
* pluto-generic-serial-device - big bug smash.&lt;br /&gt;
&lt;br /&gt;
== Update 28308 ==&lt;br /&gt;
* lmce-autotagger - segfault fix&lt;br /&gt;
* pluto-avwizard (556,555) - detect video changes only when AVWiz is selected to run.&lt;br /&gt;
* lmce-diskless-tools (627,628)&lt;br /&gt;
** replaces medibuntu repo with videolan repo for libdvdcss2&lt;br /&gt;
** other bug fixes for 1204&lt;br /&gt;
&lt;br /&gt;
== Update 28300 ==&lt;br /&gt;
* pluto-plutoutils (196,197) - Add StringUtils for new clock variables in Orbiter&lt;br /&gt;
* pluto-orbiter (119,138) - add support for new clock variables in Orbiter&lt;br /&gt;
* pluto-proxy-orbiter - add support for new clock variables in Orbiter&lt;br /&gt;
* pluto-system-database (211) Designer changes for clock screen in Orbiter.&lt;br /&gt;
* lmce-autotagger - segfault fix&lt;br /&gt;
&lt;br /&gt;
== Update 28296 ==&lt;br /&gt;
* pluto-website-admin (220) more improvements to picture tagging/screensaver&lt;br /&gt;
* pluto-boot-scripts (234) - wrapper script to set exif orientation tag&lt;br /&gt;
* pluto-updatemedia (405,406) - support for picture tagging&lt;br /&gt;
* pluto-dhcpd-plugin - ignore DHCP INFOs.&lt;br /&gt;
&lt;br /&gt;
== Update 28255 ==&lt;br /&gt;
* pluto-website-admin (220) improvement to picture tagging/screensaver - screensaver and keyword editing now available directly in screen saver page (and screen saver page should probably be renamed now as well...)&lt;br /&gt;
&lt;br /&gt;
== Update 28232 ==&lt;br /&gt;
* pluto-boot-scripts (234) - enables vboxvideo driver detection&lt;br /&gt;
* lmce-zwave-ozw(505,506) - avoid bad conversion of int-&amp;gt;float for brightness values&lt;br /&gt;
* *qorbiter* - various fixes.&lt;br /&gt;
&lt;br /&gt;
== Update 28214 ==&lt;br /&gt;
* pluto-system-database(211) - change attribute sort order for picture attributes&lt;br /&gt;
* pluto-std-plugins (116,135) - Add Playlist delete capability to CMD_Delete_File for Orbiter File Details page. (TSCHAK).&lt;br /&gt;
* *plugins* - to make sure the new version of libplutomain works with the plugins.&lt;br /&gt;
&lt;br /&gt;
== Update 28210 ==&lt;br /&gt;
* lmce-roku (833,834) - Fixes #1949 - Stupid deadlock caused by recursive functions both pulling same mutex. (TSCHAK)&lt;br /&gt;
*lmce-qorbiter-skins-qt5libs (845) - Incremental updates&lt;br /&gt;
*lmce-qorbiter-skins-qt4libs (846) - Incremental updates&lt;br /&gt;
*pluto-website-admin (220) - Fixes for tvdb admin use, updates regex, cleaning attributes&lt;br /&gt;
*pluto-media-database - slight change to add a subtitle to games for variants.&lt;br /&gt;
* pluto-system-database(211) - device data for ZWave, battery level event&lt;br /&gt;
&lt;br /&gt;
== Update 28202 ==&lt;br /&gt;
* pluto-pluto-main-db (201,237) - New event and device data for ZWave/Battery reporting&lt;br /&gt;
* lmce-zwave-ozw(505,506) - battery level event, support for setting up polling of individual values&lt;br /&gt;
&lt;br /&gt;
== Update 28198 ==&lt;br /&gt;
* pluto-storage-devices (533) - Change to automounter script so NFS will properly be mounted in 1204+&lt;br /&gt;
* lmce-game-db (675,676) - Schema changes have forced a rebuild of this shared lib, to match changes in GAMEROM (which have already been pushed) oops! -tschak&lt;br /&gt;
* lmce-zwave-ozw(505,506)&lt;br /&gt;
** map nodes to devices (add devices in LMCE) whenever a node/value is added in ZWave (should remove need for double reload after adding devices)&lt;br /&gt;
** fix battery reporting (I hope)&lt;br /&gt;
** configurable polling&lt;br /&gt;
* lmce-game-player (673,674) - ConfigurationWriter should now create the config file path, if it does not exist. (tschak)&lt;br /&gt;
&lt;br /&gt;
== Update 28173 ==&lt;br /&gt;
* lmce-game-player (673,674) - provide media director screen resolution to the game player models, make MAME and MESS emulator models use it. Effect is, MAME and MESS now always automatically size the window to display, to prevent odd race conditions with Orbiter (TSCHAK).&lt;br /&gt;
* pluto-plutoutils (196,197) Fixes [http://svn.linuxmce.org/trac.cgi/ticket/1936 ut8 problem]&lt;br /&gt;
&lt;br /&gt;
== Update 28171 ==&lt;br /&gt;
* libopenzwave1.0(824, 825) - fix to enable proper SUC/SIS mode&lt;br /&gt;
&lt;br /&gt;
== Update 28169 ==&lt;br /&gt;
* pluto-website-admin (220)&lt;br /&gt;
** handle accumulated data in datalogger graph&lt;br /&gt;
&lt;br /&gt;
== Update 28167 ==&lt;br /&gt;
* pluto-website-admin (220)&lt;br /&gt;
** Add &amp;quot;Queue instead of Instant Play&amp;quot; option to Wizard &amp;gt; Orbiters page (TSCHAK)&lt;br /&gt;
* pluto-std-plugins (116,135) - Add status message when &amp;quot;Queue Instead of Instant Play&amp;quot; is selected above, show on Orbiter when Play is selected. (TSCHAK)&lt;br /&gt;
* lmce-zwave-ozw(505,506) - possibility to reset controller&lt;br /&gt;
&lt;br /&gt;
== Update 28162 ==&lt;br /&gt;
* lmce-zwave-ozw(505,506) - improvements to energy reporting&lt;br /&gt;
* lmce-datalog-plugin(686,687) - also log cumulated energy usage&lt;br /&gt;
&lt;br /&gt;
== Update 28148 ==&lt;br /&gt;
* lmce-transmission-client (852) - fixes installation issues&lt;br /&gt;
* pluto-system-database(211) - fixes to lmce-transmission-client&lt;br /&gt;
* pluto-std-plugins (116,135) - Start of optimizations to StartMedia in Media_Plugin, and MediaFile, MH_Play_Media, etc. to make Play All work faster, be more responsive. Still so much more investigation to do.&lt;br /&gt;
* lmce-diskless-tools (627,628)&lt;br /&gt;
** fixes &amp;quot;Waiting for Network Configuration&amp;quot; deadtime on MD boots.&lt;br /&gt;
** adds Replaces and Conflicts entries to package&lt;br /&gt;
* lmce-diskless-debootstrap-image (844) - adds Replaces and Conflicts entries to package to prevent errors on upgrades&lt;br /&gt;
* lmce-zwave-ozw(505,506) - adds Replaces and Conflicts entries to package to prevent errors on upgrades&lt;br /&gt;
* pluto-boot-scripts (234) - use a proper analog alsa device in SetupAudioVideo.sh&lt;br /&gt;
* lmce-zwave-ozw(505,506) fix bug in add node, improvements to reduce unnecessary polling, implement thermostat support&lt;br /&gt;
*Orbiter needs rebuilding (I fixed the previous fix, a bit more.) ;)&lt;br /&gt;
**pluto-orbiter (119,138)&lt;br /&gt;
**pluto-proxy-orbiter (487,488)&lt;br /&gt;
**pluto-bluetooth-dongle (124,143)&lt;br /&gt;
**pluto-orbitergen (226,227)&lt;br /&gt;
&lt;br /&gt;
== Update 28105 ==&lt;br /&gt;
*Orbiter needs rebuilding (I fixed the stupid bogging down of large sets of files under an attribute in the MediaBrowser - caused by superfluous calls to get media attributes.&lt;br /&gt;
**pluto-orbiter (119,138)&lt;br /&gt;
**pluto-proxy-orbiter (487,488)&lt;br /&gt;
**pluto-bluetooth-dongle (124,143)&lt;br /&gt;
**pluto-orbitergen (226,227)&lt;br /&gt;
&lt;br /&gt;
== Update 28083 ==&lt;br /&gt;
* lmce-game-database (679) - Schema changes.&lt;br /&gt;
* pluto-website-admin - Amazon attribute search re-enabled&lt;br /&gt;
&lt;br /&gt;
== Update 28061 ==&lt;br /&gt;
* pluto-website-admin (220) - Adds transmission pages to webadmin&lt;br /&gt;
* lmce-transmission-client (852) - new package for transmission daemon integration&lt;br /&gt;
* pluto-system-database(211)&lt;br /&gt;
** new package definitions (transmission, lmce-transmission-client, unrar)&lt;br /&gt;
** new website configuration menu for transmission&lt;br /&gt;
** revert orbiter clock font until bugs can be squashed&lt;br /&gt;
&lt;br /&gt;
== Update 28040 ==&lt;br /&gt;
* pluto-pluto-media-db - just for giggles to see if it fixes issues related to the game player changes to mediafile.h&lt;br /&gt;
&lt;br /&gt;
== Update 28039 ==&lt;br /&gt;
* pluto-dcerouter (154,155) - name change of dependent package to lmce-diskless-tools&lt;br /&gt;
* lmce-diskless-tools (627,628) - re-branded diskless tools (md creation scripts, etc)&lt;br /&gt;
* lmce-diskless-debootstrap-image (844) - contains the original debootstrapped md image&lt;br /&gt;
* lmce-qorbiter-skins-qt5libs (845) - initial qOrbiter skin packaging &lt;br /&gt;
* lmce-qorbiter-skins-qt4libs (846) - initial qOrbiter skin packaging&lt;br /&gt;
* lmce-qorbiter-skins-common (847) - initial qOrbiter skin packaging (fonts)&lt;br /&gt;
* lmce-qorbiter-skins-rpi (848) - initial qOrbiter skin packaging&lt;br /&gt;
* lmce-qorbiter-skins-android (849) - initial qOrbiter skin packaging&lt;br /&gt;
* lmce-qorbiter-skins-desktop (850) - initial qOrbiter skin packaging&lt;br /&gt;
* pluto-system-database(211) - packaging change updates for ConfirmDependencies&lt;br /&gt;
&lt;br /&gt;
== Update 28014 ==&lt;br /&gt;
* lmce-zwave-ozw(505,506) - improvements to on/off/set level handling to better match device support, try to honor on/off for dimmers before using set level&lt;br /&gt;
&lt;br /&gt;
== Update 27986 ==&lt;br /&gt;
*  rebuild for MediaFile.h changes (System now added for Game Player) (TSCHAK)&lt;br /&gt;
** pluto-std-plugins (116,135) &amp;amp; CreateDevice honours InstallWizard_Distro table on Core &amp;amp; MD creation (phenigma)&lt;br /&gt;
** lmce-airplay-plugin (791,792)&lt;br /&gt;
** lmce-game-plugin (671,672)&lt;br /&gt;
** lmce-hulu-plugin (742,743)&lt;br /&gt;
** pluto-mythtv-plugin (134,153)&lt;br /&gt;
** lmce-omx-plugin (831,832) &amp;amp; not currently in repo (phenigma)&lt;br /&gt;
** lmce-picture-plugin (756,757)&lt;br /&gt;
** lmce-shoutcast-radio-plugin (703,704)&lt;br /&gt;
** pluto-slimserver-plugin (424,425)&lt;br /&gt;
** pluto-xine-plugin (118,137)&lt;br /&gt;
&lt;br /&gt;
* pluto-system-database (211) - fixes for the Intellivision game remote, baby monitor additions (TSCHAK)&lt;br /&gt;
* mce-diskless-tools (627,628) - adds lmce-picture-viewer to all MD tarballs, firstrun for rpi, resolv.conf fixes for all MDs (phenigma)&lt;br /&gt;
* pluto-createdevice (303,304) - CreateDevice honours InstallWizard_Distro table on Core &amp;amp; MD creation (phenigma)&lt;br /&gt;
* pluto-vdr - make sure VDR listens on port 2001&lt;br /&gt;
&lt;br /&gt;
== Update 27946 ==&lt;br /&gt;
* pluto-updatemedia (405,406) - RomFileHandler fixes. Prevent array underflow caused by GAMEROM returning weird data.&lt;br /&gt;
* pluto-boot-scripts - logrotate takes care of the UpdateMedia log as well.&lt;br /&gt;
&lt;br /&gt;
== Update 27943 ==&lt;br /&gt;
* lmce-dlna(842,843) - second version of dlna device, should fix a big fubar wrt. files included&lt;br /&gt;
&lt;br /&gt;
== Update 27942 ==&lt;br /&gt;
* lmce-dlna(842,843) - first version of dlna device&lt;br /&gt;
&lt;br /&gt;
== Update 27929 == &lt;br /&gt;
* pluto-boot-scripts (234) - fix post install script error&lt;br /&gt;
&lt;br /&gt;
== Update 27913 ==&lt;br /&gt;
* pluto-std-plugins (116,135) - Add in Telecom Plugin fix for blindly trying to process every single playback started event. Whoops. (TSCHAK)&lt;br /&gt;
&lt;br /&gt;
== Update 27902 ==&lt;br /&gt;
* lmce-zwave-ozw(505,506) - updates the open-zwave library, some changes to what library calls are used to improve compatibility with different devices&lt;br /&gt;
* libopenzwave1.0(824, 825) - new version&lt;br /&gt;
* mce-diskless-tools (627,628) - fix Diskless_CreateTBZ.sh on precise&lt;br /&gt;
* pluto-system-database(211) - InstallWizard_Distro changes for MD creation&lt;br /&gt;
* pluto-install-scripts (391) - fix ConfirmDependencies not adding entries to sources.list&lt;br /&gt;
* pluto-boot-scripts (234) &lt;br /&gt;
** fix persistent &#039;ignoring 30pluto.pbackup&#039; error from apt.&lt;br /&gt;
** update nvidia package names than have changed from lucid-&amp;gt;precise&lt;br /&gt;
* pluto-storage-devices (533) - fix display of errors during postinst.&lt;br /&gt;
* pluto-website-admin (220) &lt;br /&gt;
** makes checkbox sticky for &#039;Show only items without&#039; &lt;br /&gt;
** Move qOrbiter logic from MediaImage.php to imdbImage.php. Adds required qorbitergenerator updates for beta.&lt;br /&gt;
* pluto-std-plugins (116,135) - add &#039;From&#039; field to send e-mail command.  Thanks Hackit2Me!&lt;br /&gt;
** also some telecom plugin fixes in here for voicemail. (tschak)&lt;br /&gt;
* Orbiter needs rebuilding (can I just put this here in the future as an analog for the bottom packages?) - New screens, and screen handlers. (TSCHAK)&lt;br /&gt;
** pluto-orbiter (119,138)&lt;br /&gt;
** pluto-proxy-orbiter (487,488)&lt;br /&gt;
** pluto-bluetooth-dongle (124,143)&lt;br /&gt;
** pluto-orbitergen (226,227)&lt;br /&gt;
* pluto-updateentarea (341,342) - Add support to add Weather button if Weather Plugin is available&lt;br /&gt;
* possy: Another skin addition, https://96.226.245.101/work/Voicemail_Changes.zip&lt;br /&gt;
* pluto-plutoutils (196,197) - TranslateSoundCard routines. Somehow this hasn&#039;t gotten built lately... whoops (tschak)&lt;br /&gt;
&lt;br /&gt;
== Update 27859 ==&lt;br /&gt;
* lmce-game-player (673,674) - Fixes #1866 - where if user selected a game bookmark from the media browser, and started the media with this bookmark, it would not work, due to the save state path being incorrectly derived from the ROM name, rather than the emulated system name. (TSCHAK)&lt;br /&gt;
*pluto-website-admin (220) - #1858 added no-ip.com to dyndns mechanism (foxi352)&lt;br /&gt;
*lmce-asterisk - #1856 Added qualify=5000 instead of qualify=yes to orbiter embedded phones (foxi352)&lt;br /&gt;
*pluto-dynamic-dns (576 - #1858 added no-ip.com to dyndns mechanism (foxi352)&lt;br /&gt;
&lt;br /&gt;
--- some time passed&lt;br /&gt;
&lt;br /&gt;
* Weather Plugin stuff (TSCHAK)&lt;br /&gt;
**lmce-weather-plugin(836,837) - Initial build of Weather Plugin&lt;br /&gt;
**lmce-weather(838,839) - Initial build of Weather device&lt;br /&gt;
**pluto-system-database(211) - lots of stuff crammed in for the weather plugin&lt;br /&gt;
**pluto-orbiter(119,138) - Orbiter screenhandlers changed&lt;br /&gt;
**pluto-proxy-orbiter(487,488) - Orbiter screenhandlers changed&lt;br /&gt;
**pluto-skins-basic (204) - graphic changes (POSSY! tag me, so I can give you the updated bitmaps!)&lt;br /&gt;
**lmce-skins-titanium(718) - Graphic changes (see above!)&lt;br /&gt;
**lmce-skins-bluecrystal(804) - Graphic changes (see above!)&lt;br /&gt;
* SimplePhone (498,499) - Better sound card selection logic if Sound Card device data is specified.&lt;br /&gt;
* lmce-roku (833,834) - Implement CMD_Change_Playback_Speed() so phone call pauses will work.&lt;br /&gt;
&lt;br /&gt;
== Update 27799 ==&lt;br /&gt;
*mce-diskless-tools (627,628) - Diskless_Create &amp;amp; Diskless_Setup updates for Raspberry Pi (phenigma)&lt;br /&gt;
&lt;br /&gt;
== Update 27783 ==&lt;br /&gt;
*pluto-website-admin (220) - #1860: Fixes voicemail problems (foxi352)&lt;br /&gt;
*pluto-asterisk (270) - #1860: Fixes voicemail problems (foxi352)&lt;br /&gt;
* pluto-std-plugins (116,135) - #1862: fixes long standing problem of the dreaded &amp;quot;Play All audio&amp;quot; will quit at some point, by checking for valid files at deque insertion. Made a note to find more efficient fix in long term (TSCHAK)&lt;br /&gt;
&lt;br /&gt;
== Update 27777 ==&lt;br /&gt;
*lmce-asterisk - Try to fix problem where embedded phones lose connection to asterisk&lt;br /&gt;
*mce-diskless-tools (628) - mountnfs.sh updates for precise&lt;br /&gt;
*pluto-website-admin (220) - Add No-IP dynamic dns service to webadmin&lt;br /&gt;
&lt;br /&gt;
== Update 27762 ==&lt;br /&gt;
* pluto-website-admin (220) - Fixes #1847 - First phoneline added did not save, Fixes #1848 - Delete routing informations on phoneline delete (foxi352)&lt;br /&gt;
* lmce-asterisk - Fixes a lot of simplephone problems due to local channel optimizations&lt;br /&gt;
&lt;br /&gt;
== Update 27744 ==&lt;br /&gt;
* pluto-system-database (211) - Added device data to SimplePhone to allow sound card selection for Ringing and Calls (TSCHAK)&lt;br /&gt;
** Also add changes to Phoenix Solo USB device for configuration after detection. Remove useless device data (TSCHAK)&lt;br /&gt;
* pluto-boot-scripts (234) - Made sure TranslateSoundCard and TranslateRemoteSoundCard shell scripts get copied into /usr/pluto/bin (TSCHAK)&lt;br /&gt;
* pluto-simplephone (498,499) - SimplePhone can now use Sound Card device data attached to template to explicitly set a sound card. If one isn&#039;t provided, the original heuristics are used to find one (TSCHAK)&lt;br /&gt;
* pluto-sound-card-scripts (579) - Add configuration script for Phoenix Solo USB device. (TSCHAK)&lt;br /&gt;
&lt;br /&gt;
== Update 27724 ==&lt;br /&gt;
* pluto-asterisk (270,271) - Asterisk has changed its tokens slightly, fix various bits of bit rot and breakage so Telecom integration is tight again. (TSCHAK)&lt;br /&gt;
* pluto-orbiter (119,138) - Screen Handler fixes for Telecom (TSCHAK)&lt;br /&gt;
* pluto-zwave-lighting (505,506) - Fixes #1451 - Smoke Detectors are properly detected again. (TSCHAK)&lt;br /&gt;
* pluto-system-database (211) - Fix launch path for new Roku device, so that it will actually start correctly. (TSCHAK)&lt;br /&gt;
* lmce-game-player (673,674) - Fix Famicom Disk System support, again, in light of the new ConfigurationManager class. (TSCHAK)&lt;br /&gt;
&lt;br /&gt;
== Update 27701 ==&lt;br /&gt;
* pluto-orbiter (119, 138) - Changes to screen handler for Move File (final refinements)&lt;br /&gt;
* pluto-system-database (211) - sqlCVS designer changes for Move File&lt;br /&gt;
* pluto-proxy-orbiter (487,488) - synchronize proxy orbiter to match screen handler changes for move file&lt;br /&gt;
* pluto-bluetooth-dongle (124,243) - synchronize bluetooth dongle to match screen handler changes for move file&lt;br /&gt;
* pluto-std-plugins (116, 135) - Changes to telecom to disallow concurrent access to sound card if HDMI, and to fix the toggle effect of media unpausing if paused when phone rings. (#1710 and #1834)&lt;br /&gt;
* pluto-website-admin (220) - Changes webadmin to access MediaTomb on new port&lt;br /&gt;
* lmce-game-player (673,674) - make sure all changes are up to date.&lt;br /&gt;
&lt;br /&gt;
== Update 27694 ==&lt;br /&gt;
* lshwd - postrm fixes.&lt;br /&gt;
* pluto-std-plugins (116, 135)  &lt;br /&gt;
** File List button in Games remote works correctly (TSCHAK)&lt;br /&gt;
** You can now add games to an already in progress playlist (TSCHAK)&lt;br /&gt;
&lt;br /&gt;
== Update 27688 ==&lt;br /&gt;
* pluto-simplephone - Changes to allow for audio pipe only.&lt;br /&gt;
&lt;br /&gt;
== Update 27686 ==&lt;br /&gt;
Move button in Media Details page should now work. (TSCHAK)&lt;br /&gt;
* pluto-orbiter (119, 138) - Changes to Screen Handler for Move File (TSCHAK)&lt;br /&gt;
* pluto-std-plugins (116, 135) &lt;br /&gt;
** Changes to Media Plugin MoveJob, MoveTask, and CMD_Move_File for Move File; (TSCHAK)&lt;br /&gt;
** Make Firefox window swallow correctly in Computing. (TSCHAK)&lt;br /&gt;
** Telecom Plugin now switches on MD&#039;s for SimplePhone (bug #1709) (TSCHAK)&lt;br /&gt;
* pluto-boot-scripts (234) - addition of moveWrapper.sh for Move File; Fix Keyboard Layout bug (#1776) (TSCHAK)&lt;br /&gt;
* pluto-system-database (211) - Designer changes for Move File (TSCHAK)&lt;br /&gt;
&lt;br /&gt;
== Update 27659 ==&lt;br /&gt;
* pluto-mythtv-plugin (134,153) - bump MYTH_PROTO_VERSION source (#1821) (tschak)&lt;br /&gt;
&lt;br /&gt;
== Update 27649 ==&lt;br /&gt;
* sqlCVS (212,213) - mySQL reconnect bug preventing 1204 install from completing first time, fixed (tschak)&lt;br /&gt;
* plutoUtils (196,197) - Related PlutoUtils MySQLHelper change.&lt;br /&gt;
&lt;br /&gt;
== Update 27636 ==&lt;br /&gt;
* ubuntu/lshwd (n/a) - adds lsb tags&lt;br /&gt;
* lmce-update-system (650,651) - adds lsb tags&lt;br /&gt;
* mce-diskless-tools (627,628) - adds lsb tags to mountnfs.sh script&lt;br /&gt;
* lmce-picture-viewer (754,755) - picture viewer window now minimizes properly, when not in use. (tschak)&lt;br /&gt;
&lt;br /&gt;
== Update 27542 ==&lt;br /&gt;
* sdlmame and sdlmess have had the initialization and codec patch reapplied as per ticket #1560.&lt;br /&gt;
* pluto-website-admin (220) - Correct display of static DHCP clients in webadmin -&amp;gt; DHCP leases&lt;br /&gt;
&lt;br /&gt;
== Update 27533 ==&lt;br /&gt;
* lmce-roku (833,834) - a new C++ replacement for the GSD based driver for Roku players.&lt;br /&gt;
* pluto-system-database (211) (needs to be rebuilt because of package defs changes.)&lt;br /&gt;
** Add orbiter to rpi_b device template&lt;br /&gt;
** Add omxplayer Player/Plugin and associated data&lt;br /&gt;
** Add lmce-roku, and lmce-src-roku packages.&lt;br /&gt;
* lmce-mediatomb (702) - Convert config.xml to v2, add mkv and mka, convert to UTF-8, change port to 49155&lt;br /&gt;
* pluto-xine-player (117,136) - should now build against libxine2 rather than libxine1&lt;br /&gt;
&lt;br /&gt;
== Update 27515 ==&lt;br /&gt;
* lmce-game-player - Turn on bookmarks for MESS based emulators, so I can see which ones reliably save state.&lt;br /&gt;
* lmce-asterisk - Fixes #1766 - * in username / password now possible, add Cisco 7941 config script&lt;br /&gt;
* pluto-website-admin (220) - Add possibility to change Room and FloorPlanObjectType in KNX wizard&lt;br /&gt;
* pluto-pluto-main-db (201,237) - Add Cisco 7941 DT&lt;br /&gt;
* pluto-dhcpd-plugin (302) - Removed old 7941 config script&lt;br /&gt;
* mce-diskless-tools (627,628) - Add raspbian lmce packages to pi md diskless image&lt;br /&gt;
* chan-sccp_v4.1 - Upgraded asterisk SCCP channel driver to newest version&lt;br /&gt;
&lt;br /&gt;
== Update 27469 ==&lt;br /&gt;
* lmce-airplay-plugin - more refinements and changes.&lt;br /&gt;
* lmce-airplay-streamer - more refinements and changes.&lt;br /&gt;
&lt;br /&gt;
== Update 27457 ==&lt;br /&gt;
*pluto-boot-scripts (234) : Fixes #1758 - Modified Bootscripts postinst to reflect AVAHI services directory structure changes&lt;br /&gt;
*pluto-pluto-main-db (201,237) - Fixes #1758 - Remove dependency for netatalk for now. Avahi announces the samba shares as xserve.&lt;br /&gt;
&lt;br /&gt;
== Update 27448 ==&lt;br /&gt;
* pluto-boot-scripts (234)&lt;br /&gt;
** adds serial port support on rpi&lt;br /&gt;
** adds bootscript conditionals for rpi&lt;br /&gt;
* pluto-libserial (190,191) - fixes bug in SerialPort.cpp&lt;br /&gt;
* lmce-agocontrol-bridge (826,827) - new agocontrol Bridge packages&lt;br /&gt;
* pluto-system-database (211) - new agocontrol Bridge packages&lt;br /&gt;
&lt;br /&gt;
== Update 27414 ==&lt;br /&gt;
* lmce-asterisk - Added option to choose DTMF mode in phonelines setup&lt;br /&gt;
* pluto-website-admin (220) - Added option to choose DTMF mode in phonelines setup&lt;br /&gt;
&lt;br /&gt;
== Update 27403 ==&lt;br /&gt;
* pluto-vdr-plugin - removal of the vdr-plugin-control dependency&lt;br /&gt;
* pluto-vdr - removal of the vdr-plugin-control dependency&lt;br /&gt;
&lt;br /&gt;
== Update 27397 ==&lt;br /&gt;
* lmce-plymouth-theme (770) - source file compatibility changes to build on precise&lt;br /&gt;
&lt;br /&gt;
== Update 27392 ==&lt;br /&gt;
* pluto-boot-scripts (234) - Add option 150 to dhcp server template for cisco firmware tftp&lt;br /&gt;
* lmce-asterisk - Change db_phone_config.sh to call configure scripts for sccp phones again&lt;br /&gt;
* pluto-dhcpd-plugin (302) - Modified 7970 configuration script to include firmware to download if in device&#039;s devicedata&lt;br /&gt;
* mce-diskless-tools (628) - latest create-diskless ran.&lt;br /&gt;
&lt;br /&gt;
== Update 27385 ==&lt;br /&gt;
* pluto-pluto-main-db (201,237) - removes pluto-system-database dependency&lt;br /&gt;
* pluto-pluto-telecom-db (470,471) - removes pluto-telecom-database dependency&lt;br /&gt;
* pluto-pluto-media-db (254,255) - removes pluto-media-database dependency&lt;br /&gt;
* pluto-pluto-security-db (277,278) - removes pluto-security-database dependency&lt;br /&gt;
* lmce-datalog-db (688,689) - removes lmce-datalog-database dependency&lt;br /&gt;
* lmce-game-db (675,676) - removes lmce-game-database dependency&lt;br /&gt;
&lt;br /&gt;
== Update 27384 ==&lt;br /&gt;
* lmce-sdlmame (682,683) - mame/mess source updated and combined into single tree&lt;br /&gt;
* lmce-game-player (673,674)&lt;br /&gt;
** change mame/mess binary locations&lt;br /&gt;
** remove lmce-sdlmess as a depends for precise&lt;br /&gt;
* mce-diskless-tools (628) - Diskless_CreateTBZ.sh updates for precise&lt;br /&gt;
* pluto-pluto-main-db (201,237) - adds pluto-system-database dependency&lt;br /&gt;
* pluto-pluto-telecom-db (470,471) - adds pluto-telecom-database dependency&lt;br /&gt;
* pluto-pluto-media-db (254,255) - adds pluto-media-database dependency&lt;br /&gt;
* pluto-pluto-security-db (277,278) - adds pluto-security-database dependency&lt;br /&gt;
* lmce-game-db (675,676) - adds lmce-game-database dependency&lt;br /&gt;
&lt;br /&gt;
== Update 27373 ==&lt;br /&gt;
* pluto-dcerouter (154,155) - dhcp fixes&lt;br /&gt;
* pluto-boot-scripts (234) - dhcp fixes&lt;br /&gt;
* pluto-plutodhcp (330,491) - dhcp fixes&lt;br /&gt;
* mce-launcher - dhcp fixes&lt;br /&gt;
* lmce-asterisk - removes asterisk-sounds-extra from depends, package no longer exists&lt;br /&gt;
* mce-diskless-tools (627,628) - repairs to md creation&lt;br /&gt;
&lt;br /&gt;
== Update 27366 ==&lt;br /&gt;
* pluto-avwizard-sounds - missing from repo&lt;br /&gt;
* pluto-convert-mac - missing from repo&lt;br /&gt;
&lt;br /&gt;
== Update 27365 == &lt;br /&gt;
* pluto-confirm-dependencies - improves displayed information about command arguments and adds -f, skips installed checking&lt;br /&gt;
* pluto-makerelease - dependencies are added to packages again.&lt;br /&gt;
* all packages built by MakeRelease - (/var/lmce-build/out/tmp/*.deb) dependencies added to packages again.&lt;br /&gt;
* mce-diskless-tools - Diskless_CreateTBZ.sh updates for precise&lt;br /&gt;
* video-wizard-videos - missing from repo&lt;br /&gt;
* pluto-avwizard-sounds - missing from repo&lt;br /&gt;
* pluto-mcr-remote - missing from repo&lt;br /&gt;
&lt;br /&gt;
== Update 27343 ==&lt;br /&gt;
* pluto-simplephone builds for 1204&lt;br /&gt;
&lt;br /&gt;
== Update 27340 ==&lt;br /&gt;
* many, many lmce packages are affected by change to AllCommandsRequests.h.  so many, too many to list. (all lmce-* and pluto-* packages) :) - phenigma&lt;br /&gt;
* pluto-disk-drive - removed pre-built bin from svn that we are building&lt;br /&gt;
* lmce-insteon - removed pre-built bin from svn that we are building&lt;br /&gt;
* pluto-dcerouter - adds BlueCrystal skin to depends&lt;br /&gt;
&lt;br /&gt;
== Update 27323 ==&lt;br /&gt;
* lmce-EnOcean builds for 1204&lt;br /&gt;
* pluto-proxy-orbiter builds for 1204&lt;br /&gt;
* pluto-hal-device-finder builds for 1204&lt;br /&gt;
* *-skin* packages build for 1204&lt;br /&gt;
* pluto-orbiter builds for 1204&lt;br /&gt;
&lt;br /&gt;
== Update 27294 ==&lt;br /&gt;
* pluto-boot-scripts - changes for postinst to ignore returnvalue for service restart&lt;br /&gt;
* pluto-database-settings &lt;br /&gt;
** changes for postinst to ignore returnvalue for service restart&lt;br /&gt;
** changes to postinst to reflect my.cnf changes.&lt;br /&gt;
&lt;br /&gt;
== Update 28428 ==&lt;br /&gt;
*lmce-admin - dead link changed to other page.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=LinuxMCE-1204/1404_Updates&amp;diff=34931</id>
		<title>LinuxMCE-1204/1404 Updates</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=LinuxMCE-1204/1404_Updates&amp;diff=34931"/>
		<updated>2014-04-16T08:11:05Z</updated>

		<summary type="html">&lt;p&gt;RayBe: /* Upcoming fixes... */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
This page outlines some information about the 1204 changes, as well as outlining any changes and bugfixes we are applying.&lt;br /&gt;
&lt;br /&gt;
If a package needs to be built, put it under Upcoming fixes... As soon as a set of package is built, those packages move into a section called Update XXXXX where XXXXX is the svn revision at the time of build.&lt;br /&gt;
&lt;br /&gt;
== Upcoming fixes... ==&lt;br /&gt;
&#039;&#039;&#039;Note: Please put the name of the package file and the source and bin package number in this list, followed by a small description of what has changed! Hulu Player is not the name of the package, but lmce-hulu-player. It makes the life of the person, who needs to update the repo a lot easier. Thank you!&#039;&#039;&#039;&lt;br /&gt;
* LinuxMCE Hue Controller (862,863) - fixes for hue controller run-time errors&lt;br /&gt;
* lmce-diskless-tools (627,628) - fix mountnfs.sh script on MDs.&lt;br /&gt;
* pluto-storage-devices (533) - don&#039;t cat to /etc/mtab if it is already a symlink to /proc/mounts&lt;br /&gt;
&lt;br /&gt;
== Update 28947 ==&lt;br /&gt;
* pluto-system-database (211) - revert TSCHAK&#039;s font, again.&lt;br /&gt;
* pluto-website-admin (220) - advanced ZWave page, now possible to set config parameters, some esthetic cleanups&lt;br /&gt;
* lmce-zwave-ozw(505,506) - provide network data for the advanced ZWave page&lt;br /&gt;
* pluto-powerfile-c200 (492,493) - builds, not currently in repo&lt;br /&gt;
* pluto-sql2cpp (202,203) - builds, not currently in repo&lt;br /&gt;
* pluto-tribunetv (598,599) - builds, not currently in repo&lt;br /&gt;
* lmce-qmediaplayer-plugin (856,857) - builds, not currently in repo&lt;br /&gt;
* lmce-mame-snaps (681) - builds, not currently in repo - not part of current build due to size, single build with release-pkg.sh perhaps.&lt;br /&gt;
&lt;br /&gt;
== Update 28939 ==&lt;br /&gt;
* pluto-system-database (211) - removes precise compatibility from lshwd&lt;br /&gt;
* pluto-boot-scripts (234) - remove lshwd from bootscripts, restore ConfirmDependencies on reboot/rebuild.&lt;br /&gt;
* pluto-text-to-speech (283,284) - change from nitech to cmu voice to get ivr menu generation working again&lt;br /&gt;
* pluto-asterisk (270) - Fix ownership of asterisk/pluto sound files&lt;br /&gt;
* pluto-website-admin (220) - fix webadmin display of serial ports on MDs, use existing scripts to consolide the function, new advanced ZWave page&lt;br /&gt;
* lmce-zwave-ozw(505,506) - provide network data for the advanced ZWave page&lt;br /&gt;
&lt;br /&gt;
== Update 28891 ==&lt;br /&gt;
* lmce-zwave-ozw(505,506) - only send state changed events when value has actually changed&lt;br /&gt;
&lt;br /&gt;
== Update 28831 ==&lt;br /&gt;
* libopenzwave1.0(824, 825) - new upstream version&lt;br /&gt;
* lmce-zwave-ozw(505,506) - adjust timeout for retries from 40 to 2 seconds&lt;br /&gt;
&lt;br /&gt;
== Update 28821 ==&lt;br /&gt;
* lmce-diskless-tools (627,628) - stop waiting up to 3 mins for working network&lt;br /&gt;
* pluto-x-scripts (520,523) - fix avwiz having a hissy fit without video drivers.&lt;br /&gt;
* pluto-updatemedia (405,406) - unstripped bin for debugging.&lt;br /&gt;
* lmce-zwave-ozw(505,506) - add notification of level changes&lt;br /&gt;
&lt;br /&gt;
== Update 28803 ==&lt;br /&gt;
* pluto-website-admin - GSD code editor now fills the window &amp;amp; fix to find omx player or xine player in webadmin, prevents update error&lt;br /&gt;
* lmce-diskless-tools (627,628) - removes plymouth theme&lt;br /&gt;
* pluto-boot-scripts (234) - WakeMD fix for certain nvidia nics.&lt;br /&gt;
&lt;br /&gt;
== Update 28792 ==&lt;br /&gt;
* pluto-website-admin - Final refresh fix for weborbiter - thx Uplink and cfernandez&lt;br /&gt;
== Update 28788 ==&lt;br /&gt;
* lmce-qorbiter (858,859) - include qmldir in skins&lt;br /&gt;
* lmce-qorbiter-skins-android (849) - include qmldir in skins&lt;br /&gt;
* lmce-qorbiter-skins-common (847) - include qmldir in skins&lt;br /&gt;
* lmce-qorbiter-skins-desktop (850) - include qmldir in skins&lt;br /&gt;
* lmce-qorbiter-skins-qt4libs (846) - include qmldir in skins&lt;br /&gt;
* lmce-qorbiter-skins-qt5libs (845) - include qmldir in skins&lt;br /&gt;
* lmce-qorbiter-skins-rpi (848) - include qmldir in skins&lt;br /&gt;
* pluto-boot-scripts (234) - Firewall fix to permit user firewall rules again.&lt;br /&gt;
&lt;br /&gt;
== Update 28786 ==&lt;br /&gt;
*lmce-diskless-tools (627,628) - fix setting of /etc/defaultdomain on MDs so networking/dns lookups and more do not have a hissy fit.  Thanks Dap_P!&lt;br /&gt;
&lt;br /&gt;
== Update 28755 ==&lt;br /&gt;
*lmce-diskless-tools (627,628) - fix error in for loop of postinst&lt;br /&gt;
&lt;br /&gt;
== Update 28741 ==&lt;br /&gt;
*pluto-motion-wrapper (455,456) - upgrade dependency to libavcodec53&lt;br /&gt;
*pluto-system-database (211) - InstallWizard &amp;amp; InstallWizard_Distro changes for rpi.&lt;br /&gt;
*lmce-diskless-tools (627,628)&lt;br /&gt;
** add lsb-release data to diskless images for Raspbian Wheezy, fixes ConfirmDependencies on raspbian.&lt;br /&gt;
** fixups for rpi diskless image creation and additions for multiarch deb-cache support&lt;br /&gt;
&lt;br /&gt;
== Update 28706 ==&lt;br /&gt;
* pluto-boot-scripts (234) - Refs #1769 - DDNS fixes, thanks mkbrown69!&lt;br /&gt;
* mce-diskless-tools (627,628) - fix Diskless_CreateTBZ.sh for Raspbian Wheezy&lt;br /&gt;
&lt;br /&gt;
Updated lmce-diskless-tools - hope that is correct.&lt;br /&gt;
&lt;br /&gt;
== Update 28696 ==&lt;br /&gt;
* pluto-app-server (126,145) - Properly power off system, as &#039;shutdown&#039; no longer does this due to semantics change. use &#039;poweroff&#039; instead. *shakes-fist-at-ubuntu-people*&lt;br /&gt;
&lt;br /&gt;
== Update 28686 ==&lt;br /&gt;
* pluto-vdr - Add a custom no signal image with some notes&lt;br /&gt;
&lt;br /&gt;
== Update 28682 ==&lt;br /&gt;
* pluto-web-admin - Refs #2057 - Add button to wizardorbiters to update qOrbiter skins.&lt;br /&gt;
* pluto-usb-uirt-0038 (525,526) - Refs #2051, Refs #1355 - fixes a small strcpy 4-bit offset copy (on i386) that mangled uuirt send/receive data.  Thank you sambuca for finding a needle in a haystack!&lt;br /&gt;
* pluto-system-database (211) - XBOX 360 IR changes, Denon IP template changes.&lt;br /&gt;
* pluto-orbiter (118,139) - Screen Types should now be propagated to IR transceivers in the same room, fixing edge case with multiple IR transcievers on same hybrid (e.g. UIRT and a USB Game Pad)&lt;br /&gt;
&lt;br /&gt;
== Update 28637 ==&lt;br /&gt;
* pluto-boot-scripts (234) - Fixes #2015 setup firewall properly or dous nothing for the webfilter or proxy.&lt;br /&gt;
&lt;br /&gt;
== Update 28609 ==&lt;br /&gt;
* pluto-boot-scripts (234) - Fixes #2043 domainname inconsistencies, should fix some DNS and samba issues.&lt;br /&gt;
* lmce-hue-controller - initial device package&lt;br /&gt;
&lt;br /&gt;
== Update 28603 ==&lt;br /&gt;
* pluto-website-admin - refs #2015 change place of the scripts.&lt;br /&gt;
* lmce-webfilter - dedicated package for webfilter and proxy.&lt;br /&gt;
&lt;br /&gt;
== Update 28591 ==&lt;br /&gt;
* lmce-agocontrol-bridge (827,826) - refs #1505 - support settemperature and setthermostatmode in bridge&lt;br /&gt;
&lt;br /&gt;
== Update 28570 ==&lt;br /&gt;
* pluto-system-database (211) - Revert the clock changes, as they seem to have just fucked up everybody&#039;s day. (TSCHAK)&lt;br /&gt;
* pluto-skins-* and lmce-skins-* - Skin changes all over&lt;br /&gt;
&lt;br /&gt;
== Update 28538 ==&lt;br /&gt;
* pluto-boot-scripts (234) - Refs #2034 cannot do math with letters. Audio device will write now.&lt;br /&gt;
&lt;br /&gt;
== Update 28514 ==&lt;br /&gt;
* pluto-boot-scripts (234) - Refs #2026 Typo in nvidia-install.sh broke everything.&lt;br /&gt;
* pluto-avwizard (556,555) - Refs #2026 a0start_avwizard script did not get correct change.&lt;br /&gt;
&lt;br /&gt;
== Update 28506 ==&lt;br /&gt;
* pluto-boot-scripts (234) - Refs #2026 Change audio and video detection and setup. Addition of VideoDetectSetup file to handle both detection and setup. Changes to how we write asound.conf to comply with what Xine_Streamfactory is wanting to see. Changes to nvidia-install.sh to make 1204 specific, removal of a lot of unneeded logic to get new hw working on 1004.&lt;br /&gt;
* pluto-avwizard (556,555) - Refs #2026 Changes to init script and AVWizard_Run.sh to better handle video and audio setup.&lt;br /&gt;
* pluto-vdr (468,469) - change to service invocation&lt;br /&gt;
* pluto-usb-uirt-0038 (525,526) - update i386 uirt driver, rebuild for precise.&lt;br /&gt;
* lmce-diskless-tools (627,628) - lmce-diskless-network.conf upstart script to alleviate waiting for network configuration on MD boot.&lt;br /&gt;
&lt;br /&gt;
== Update 28488 ==&lt;br /&gt;
* pluto-website-admin (220) - SimplePhones attached to Joggler should now be able to select their appropriate sound card/usb microphone. (TSCHAK)&lt;br /&gt;
* pluto-storage-devices (533) - service invocation updates&lt;br /&gt;
* lmce-qorbiter (858,859) - remote load change&lt;br /&gt;
* lmce-qorbiter-skins-android (849) - remote load change&lt;br /&gt;
* lmce-qorbiter-skins-common (847) - remote load change&lt;br /&gt;
* lmce-qorbiter-skins-desktop (850) - remote load change&lt;br /&gt;
* lmce-qorbiter-skins-qt4libs (846) - remote load change&lt;br /&gt;
* lmce-qorbiter-skins-qt5libs (845) - remote load change&lt;br /&gt;
* lmce-qorbiter-skins-rpi (848) - remote load change&lt;br /&gt;
&lt;br /&gt;
== Update 28461 ==&lt;br /&gt;
* lmce-agocontrol-bridge (827,826) - Refs #1505 - change key from inventory to devices, add sanity checks for map conversion&lt;br /&gt;
* lmce-qorbiter (858,859) - full packaging of qOrbiter for precise&lt;br /&gt;
&lt;br /&gt;
== Update 28459 ==&lt;br /&gt;
* pluto-system-database (211) - database updates for dynamic repository naming/resolving&lt;br /&gt;
* pluto-add-software (572,573) - removes deprecated script instcheck.sh from boot process&lt;br /&gt;
* lmce-zwave-ozw(505,506) - fix node events (sensor reports and more)&lt;br /&gt;
* pluto-disk-drive (122,141) - needs a rebuild to work - probably changes in some library&lt;br /&gt;
* pluto-disc-drive-functions (496,497) - needs a rebuild to work - probably changes in some library&lt;br /&gt;
&lt;br /&gt;
== Update 28441 ==&lt;br /&gt;
* pluto-avwizard (556,555) - init scripts&lt;br /&gt;
* pluto-boot-scripts (234) - init scripts&lt;br /&gt;
* lmce-update-system (651) - init scripts&lt;br /&gt;
* lmce-launch-manager (298,299) - init scripts&lt;br /&gt;
* lmce-diskless-tools (627,628) - init scripts&lt;br /&gt;
* pluto-confirm-dependencies (281,272)&lt;br /&gt;
** fixups for sources.list checking/verifying&lt;br /&gt;
** dynamic repository naming/resolving&lt;br /&gt;
* pluto-install-scripts (391) - fixups for sources.list checking/verifying with confirmdeps&lt;br /&gt;
* pluto-system-database (211) - database updates for dynamic repository naming/resolving&lt;br /&gt;
* lmce-qorbiter (858,859) - initial package of qorbiter for qt 4.8.1 on precise&lt;br /&gt;
* pluto-std-plugins (116,135) - A Fix for the current play all bug. (TSCHAK)&lt;br /&gt;
&lt;br /&gt;
== Update 28438 ==&lt;br /&gt;
* lmce-zwave-ozw(505,506) - code restructuring, fixes to avoid depending on the order the values passed from OZW&lt;br /&gt;
&lt;br /&gt;
== Update 28436 ==&lt;br /&gt;
* libopenzwave1.0(824, 825) - fix to enable proper SUC/SIS mode&lt;br /&gt;
* lmce-zwave-ozw(505,506) - some fixes and logging to iron out the last device mapping problems&lt;br /&gt;
&lt;br /&gt;
== Update 28426 ==&lt;br /&gt;
* pluto-std-plugins (116,135) - Fix for wrong playlist entries showing up in all instances of Play All. (tschak)&lt;br /&gt;
&lt;br /&gt;
== Update 28407 ==&lt;br /&gt;
* libopenzwave1.0(824, 825) - fix to enable proper SUC/SIS mode&lt;br /&gt;
&lt;br /&gt;
== Update 28399 ==&lt;br /&gt;
* pluto-std-plugins - general info plugin updated.&lt;br /&gt;
* pluto-createdevice - fixes for taking repos et al into account when autodetecting devices.&lt;br /&gt;
&lt;br /&gt;
== Update 28398 ==&lt;br /&gt;
* libopenzwave1.0(824, 825) - fix to enable proper SUC/SIS mode&lt;br /&gt;
* lmce-zwave-ozw(505,506) - major rework of how zwave nodes are mapped to lmce devices - this will improve the amount of nodes that are automatically added to lmce, but might cause some backward compability problems. Problems include dupliacte devices being added to lmce. Just delete the old device and you will be fine. This will only happen in cases where you manually added lmce devices.&lt;br /&gt;
&lt;br /&gt;
== Update 28360 ==&lt;br /&gt;
* lmce-zwave-ozw(505,506) - major rework of how zwave nodes are mapped to lmce devices - this will improve the amount of nodes that are automatically added to lmce, but might cause some backward compability problems. Problems include dupliacte devices being added to lmce. Just delete the old device and you will be fine. This will only happen in cases where you manually added lmce devices.&lt;br /&gt;
* libopenzwave1.0(824, 825) - fix to enable proper SUC/SIS mode&lt;br /&gt;
&lt;br /&gt;
== Update 28341 ==&lt;br /&gt;
* pluto-avwizard (556,555) - fix (hopefully) AVWizard not running on second boot after DVD install&lt;br /&gt;
* pluto-boot-scripts (234)&lt;br /&gt;
** fix (hopefully) AVWizard not running on second boot after DVD install&lt;br /&gt;
** re-store Update_StartupScrips.sh script functionality&lt;br /&gt;
* lmce-diskless-tools (627,628) - ensure /tftpboot/default/vmlinuz is readable by MDs during PXE boot.&lt;br /&gt;
* pluto-generic-serial-device - big bug smash.&lt;br /&gt;
&lt;br /&gt;
== Update 28308 ==&lt;br /&gt;
* lmce-autotagger - segfault fix&lt;br /&gt;
* pluto-avwizard (556,555) - detect video changes only when AVWiz is selected to run.&lt;br /&gt;
* lmce-diskless-tools (627,628)&lt;br /&gt;
** replaces medibuntu repo with videolan repo for libdvdcss2&lt;br /&gt;
** other bug fixes for 1204&lt;br /&gt;
&lt;br /&gt;
== Update 28300 ==&lt;br /&gt;
* pluto-plutoutils (196,197) - Add StringUtils for new clock variables in Orbiter&lt;br /&gt;
* pluto-orbiter (119,138) - add support for new clock variables in Orbiter&lt;br /&gt;
* pluto-proxy-orbiter - add support for new clock variables in Orbiter&lt;br /&gt;
* pluto-system-database (211) Designer changes for clock screen in Orbiter.&lt;br /&gt;
* lmce-autotagger - segfault fix&lt;br /&gt;
&lt;br /&gt;
== Update 28296 ==&lt;br /&gt;
* pluto-website-admin (220) more improvements to picture tagging/screensaver&lt;br /&gt;
* pluto-boot-scripts (234) - wrapper script to set exif orientation tag&lt;br /&gt;
* pluto-updatemedia (405,406) - support for picture tagging&lt;br /&gt;
* pluto-dhcpd-plugin - ignore DHCP INFOs.&lt;br /&gt;
&lt;br /&gt;
== Update 28255 ==&lt;br /&gt;
* pluto-website-admin (220) improvement to picture tagging/screensaver - screensaver and keyword editing now available directly in screen saver page (and screen saver page should probably be renamed now as well...)&lt;br /&gt;
&lt;br /&gt;
== Update 28232 ==&lt;br /&gt;
* pluto-boot-scripts (234) - enables vboxvideo driver detection&lt;br /&gt;
* lmce-zwave-ozw(505,506) - avoid bad conversion of int-&amp;gt;float for brightness values&lt;br /&gt;
* *qorbiter* - various fixes.&lt;br /&gt;
&lt;br /&gt;
== Update 28214 ==&lt;br /&gt;
* pluto-system-database(211) - change attribute sort order for picture attributes&lt;br /&gt;
* pluto-std-plugins (116,135) - Add Playlist delete capability to CMD_Delete_File for Orbiter File Details page. (TSCHAK).&lt;br /&gt;
* *plugins* - to make sure the new version of libplutomain works with the plugins.&lt;br /&gt;
&lt;br /&gt;
== Update 28210 ==&lt;br /&gt;
* lmce-roku (833,834) - Fixes #1949 - Stupid deadlock caused by recursive functions both pulling same mutex. (TSCHAK)&lt;br /&gt;
*lmce-qorbiter-skins-qt5libs (845) - Incremental updates&lt;br /&gt;
*lmce-qorbiter-skins-qt4libs (846) - Incremental updates&lt;br /&gt;
*pluto-website-admin (220) - Fixes for tvdb admin use, updates regex, cleaning attributes&lt;br /&gt;
*pluto-media-database - slight change to add a subtitle to games for variants.&lt;br /&gt;
* pluto-system-database(211) - device data for ZWave, battery level event&lt;br /&gt;
&lt;br /&gt;
== Update 28202 ==&lt;br /&gt;
* pluto-pluto-main-db (201,237) - New event and device data for ZWave/Battery reporting&lt;br /&gt;
* lmce-zwave-ozw(505,506) - battery level event, support for setting up polling of individual values&lt;br /&gt;
&lt;br /&gt;
== Update 28198 ==&lt;br /&gt;
* pluto-storage-devices (533) - Change to automounter script so NFS will properly be mounted in 1204+&lt;br /&gt;
* lmce-game-db (675,676) - Schema changes have forced a rebuild of this shared lib, to match changes in GAMEROM (which have already been pushed) oops! -tschak&lt;br /&gt;
* lmce-zwave-ozw(505,506)&lt;br /&gt;
** map nodes to devices (add devices in LMCE) whenever a node/value is added in ZWave (should remove need for double reload after adding devices)&lt;br /&gt;
** fix battery reporting (I hope)&lt;br /&gt;
** configurable polling&lt;br /&gt;
* lmce-game-player (673,674) - ConfigurationWriter should now create the config file path, if it does not exist. (tschak)&lt;br /&gt;
&lt;br /&gt;
== Update 28173 ==&lt;br /&gt;
* lmce-game-player (673,674) - provide media director screen resolution to the game player models, make MAME and MESS emulator models use it. Effect is, MAME and MESS now always automatically size the window to display, to prevent odd race conditions with Orbiter (TSCHAK).&lt;br /&gt;
* pluto-plutoutils (196,197) Fixes [http://svn.linuxmce.org/trac.cgi/ticket/1936 ut8 problem]&lt;br /&gt;
&lt;br /&gt;
== Update 28171 ==&lt;br /&gt;
* libopenzwave1.0(824, 825) - fix to enable proper SUC/SIS mode&lt;br /&gt;
&lt;br /&gt;
== Update 28169 ==&lt;br /&gt;
* pluto-website-admin (220)&lt;br /&gt;
** handle accumulated data in datalogger graph&lt;br /&gt;
&lt;br /&gt;
== Update 28167 ==&lt;br /&gt;
* pluto-website-admin (220)&lt;br /&gt;
** Add &amp;quot;Queue instead of Instant Play&amp;quot; option to Wizard &amp;gt; Orbiters page (TSCHAK)&lt;br /&gt;
* pluto-std-plugins (116,135) - Add status message when &amp;quot;Queue Instead of Instant Play&amp;quot; is selected above, show on Orbiter when Play is selected. (TSCHAK)&lt;br /&gt;
* lmce-zwave-ozw(505,506) - possibility to reset controller&lt;br /&gt;
&lt;br /&gt;
== Update 28162 ==&lt;br /&gt;
* lmce-zwave-ozw(505,506) - improvements to energy reporting&lt;br /&gt;
* lmce-datalog-plugin(686,687) - also log cumulated energy usage&lt;br /&gt;
&lt;br /&gt;
== Update 28148 ==&lt;br /&gt;
* lmce-transmission-client (852) - fixes installation issues&lt;br /&gt;
* pluto-system-database(211) - fixes to lmce-transmission-client&lt;br /&gt;
* pluto-std-plugins (116,135) - Start of optimizations to StartMedia in Media_Plugin, and MediaFile, MH_Play_Media, etc. to make Play All work faster, be more responsive. Still so much more investigation to do.&lt;br /&gt;
* lmce-diskless-tools (627,628)&lt;br /&gt;
** fixes &amp;quot;Waiting for Network Configuration&amp;quot; deadtime on MD boots.&lt;br /&gt;
** adds Replaces and Conflicts entries to package&lt;br /&gt;
* lmce-diskless-debootstrap-image (844) - adds Replaces and Conflicts entries to package to prevent errors on upgrades&lt;br /&gt;
* lmce-zwave-ozw(505,506) - adds Replaces and Conflicts entries to package to prevent errors on upgrades&lt;br /&gt;
* pluto-boot-scripts (234) - use a proper analog alsa device in SetupAudioVideo.sh&lt;br /&gt;
* lmce-zwave-ozw(505,506) fix bug in add node, improvements to reduce unnecessary polling, implement thermostat support&lt;br /&gt;
*Orbiter needs rebuilding (I fixed the previous fix, a bit more.) ;)&lt;br /&gt;
**pluto-orbiter (119,138)&lt;br /&gt;
**pluto-proxy-orbiter (487,488)&lt;br /&gt;
**pluto-bluetooth-dongle (124,143)&lt;br /&gt;
**pluto-orbitergen (226,227)&lt;br /&gt;
&lt;br /&gt;
== Update 28105 ==&lt;br /&gt;
*Orbiter needs rebuilding (I fixed the stupid bogging down of large sets of files under an attribute in the MediaBrowser - caused by superfluous calls to get media attributes.&lt;br /&gt;
**pluto-orbiter (119,138)&lt;br /&gt;
**pluto-proxy-orbiter (487,488)&lt;br /&gt;
**pluto-bluetooth-dongle (124,143)&lt;br /&gt;
**pluto-orbitergen (226,227)&lt;br /&gt;
&lt;br /&gt;
== Update 28083 ==&lt;br /&gt;
* lmce-game-database (679) - Schema changes.&lt;br /&gt;
* pluto-website-admin - Amazon attribute search re-enabled&lt;br /&gt;
&lt;br /&gt;
== Update 28061 ==&lt;br /&gt;
* pluto-website-admin (220) - Adds transmission pages to webadmin&lt;br /&gt;
* lmce-transmission-client (852) - new package for transmission daemon integration&lt;br /&gt;
* pluto-system-database(211)&lt;br /&gt;
** new package definitions (transmission, lmce-transmission-client, unrar)&lt;br /&gt;
** new website configuration menu for transmission&lt;br /&gt;
** revert orbiter clock font until bugs can be squashed&lt;br /&gt;
&lt;br /&gt;
== Update 28040 ==&lt;br /&gt;
* pluto-pluto-media-db - just for giggles to see if it fixes issues related to the game player changes to mediafile.h&lt;br /&gt;
&lt;br /&gt;
== Update 28039 ==&lt;br /&gt;
* pluto-dcerouter (154,155) - name change of dependent package to lmce-diskless-tools&lt;br /&gt;
* lmce-diskless-tools (627,628) - re-branded diskless tools (md creation scripts, etc)&lt;br /&gt;
* lmce-diskless-debootstrap-image (844) - contains the original debootstrapped md image&lt;br /&gt;
* lmce-qorbiter-skins-qt5libs (845) - initial qOrbiter skin packaging &lt;br /&gt;
* lmce-qorbiter-skins-qt4libs (846) - initial qOrbiter skin packaging&lt;br /&gt;
* lmce-qorbiter-skins-common (847) - initial qOrbiter skin packaging (fonts)&lt;br /&gt;
* lmce-qorbiter-skins-rpi (848) - initial qOrbiter skin packaging&lt;br /&gt;
* lmce-qorbiter-skins-android (849) - initial qOrbiter skin packaging&lt;br /&gt;
* lmce-qorbiter-skins-desktop (850) - initial qOrbiter skin packaging&lt;br /&gt;
* pluto-system-database(211) - packaging change updates for ConfirmDependencies&lt;br /&gt;
&lt;br /&gt;
== Update 28014 ==&lt;br /&gt;
* lmce-zwave-ozw(505,506) - improvements to on/off/set level handling to better match device support, try to honor on/off for dimmers before using set level&lt;br /&gt;
&lt;br /&gt;
== Update 27986 ==&lt;br /&gt;
*  rebuild for MediaFile.h changes (System now added for Game Player) (TSCHAK)&lt;br /&gt;
** pluto-std-plugins (116,135) &amp;amp; CreateDevice honours InstallWizard_Distro table on Core &amp;amp; MD creation (phenigma)&lt;br /&gt;
** lmce-airplay-plugin (791,792)&lt;br /&gt;
** lmce-game-plugin (671,672)&lt;br /&gt;
** lmce-hulu-plugin (742,743)&lt;br /&gt;
** pluto-mythtv-plugin (134,153)&lt;br /&gt;
** lmce-omx-plugin (831,832) &amp;amp; not currently in repo (phenigma)&lt;br /&gt;
** lmce-picture-plugin (756,757)&lt;br /&gt;
** lmce-shoutcast-radio-plugin (703,704)&lt;br /&gt;
** pluto-slimserver-plugin (424,425)&lt;br /&gt;
** pluto-xine-plugin (118,137)&lt;br /&gt;
&lt;br /&gt;
* pluto-system-database (211) - fixes for the Intellivision game remote, baby monitor additions (TSCHAK)&lt;br /&gt;
* mce-diskless-tools (627,628) - adds lmce-picture-viewer to all MD tarballs, firstrun for rpi, resolv.conf fixes for all MDs (phenigma)&lt;br /&gt;
* pluto-createdevice (303,304) - CreateDevice honours InstallWizard_Distro table on Core &amp;amp; MD creation (phenigma)&lt;br /&gt;
* pluto-vdr - make sure VDR listens on port 2001&lt;br /&gt;
&lt;br /&gt;
== Update 27946 ==&lt;br /&gt;
* pluto-updatemedia (405,406) - RomFileHandler fixes. Prevent array underflow caused by GAMEROM returning weird data.&lt;br /&gt;
* pluto-boot-scripts - logrotate takes care of the UpdateMedia log as well.&lt;br /&gt;
&lt;br /&gt;
== Update 27943 ==&lt;br /&gt;
* lmce-dlna(842,843) - second version of dlna device, should fix a big fubar wrt. files included&lt;br /&gt;
&lt;br /&gt;
== Update 27942 ==&lt;br /&gt;
* lmce-dlna(842,843) - first version of dlna device&lt;br /&gt;
&lt;br /&gt;
== Update 27929 == &lt;br /&gt;
* pluto-boot-scripts (234) - fix post install script error&lt;br /&gt;
&lt;br /&gt;
== Update 27913 ==&lt;br /&gt;
* pluto-std-plugins (116,135) - Add in Telecom Plugin fix for blindly trying to process every single playback started event. Whoops. (TSCHAK)&lt;br /&gt;
&lt;br /&gt;
== Update 27902 ==&lt;br /&gt;
* lmce-zwave-ozw(505,506) - updates the open-zwave library, some changes to what library calls are used to improve compatibility with different devices&lt;br /&gt;
* libopenzwave1.0(824, 825) - new version&lt;br /&gt;
* mce-diskless-tools (627,628) - fix Diskless_CreateTBZ.sh on precise&lt;br /&gt;
* pluto-system-database(211) - InstallWizard_Distro changes for MD creation&lt;br /&gt;
* pluto-install-scripts (391) - fix ConfirmDependencies not adding entries to sources.list&lt;br /&gt;
* pluto-boot-scripts (234) &lt;br /&gt;
** fix persistent &#039;ignoring 30pluto.pbackup&#039; error from apt.&lt;br /&gt;
** update nvidia package names than have changed from lucid-&amp;gt;precise&lt;br /&gt;
* pluto-storage-devices (533) - fix display of errors during postinst.&lt;br /&gt;
* pluto-website-admin (220) &lt;br /&gt;
** makes checkbox sticky for &#039;Show only items without&#039; &lt;br /&gt;
** Move qOrbiter logic from MediaImage.php to imdbImage.php. Adds required qorbitergenerator updates for beta.&lt;br /&gt;
* pluto-std-plugins (116,135) - add &#039;From&#039; field to send e-mail command.  Thanks Hackit2Me!&lt;br /&gt;
** also some telecom plugin fixes in here for voicemail. (tschak)&lt;br /&gt;
* Orbiter needs rebuilding (can I just put this here in the future as an analog for the bottom packages?) - New screens, and screen handlers. (TSCHAK)&lt;br /&gt;
** pluto-orbiter (119,138)&lt;br /&gt;
** pluto-proxy-orbiter (487,488)&lt;br /&gt;
** pluto-bluetooth-dongle (124,143)&lt;br /&gt;
** pluto-orbitergen (226,227)&lt;br /&gt;
* pluto-updateentarea (341,342) - Add support to add Weather button if Weather Plugin is available&lt;br /&gt;
* possy: Another skin addition, https://96.226.245.101/work/Voicemail_Changes.zip&lt;br /&gt;
* pluto-plutoutils (196,197) - TranslateSoundCard routines. Somehow this hasn&#039;t gotten built lately... whoops (tschak)&lt;br /&gt;
&lt;br /&gt;
== Update 27859 ==&lt;br /&gt;
* lmce-game-player (673,674) - Fixes #1866 - where if user selected a game bookmark from the media browser, and started the media with this bookmark, it would not work, due to the save state path being incorrectly derived from the ROM name, rather than the emulated system name. (TSCHAK)&lt;br /&gt;
*pluto-website-admin (220) - #1858 added no-ip.com to dyndns mechanism (foxi352)&lt;br /&gt;
*lmce-asterisk - #1856 Added qualify=5000 instead of qualify=yes to orbiter embedded phones (foxi352)&lt;br /&gt;
*pluto-dynamic-dns (576 - #1858 added no-ip.com to dyndns mechanism (foxi352)&lt;br /&gt;
&lt;br /&gt;
--- some time passed&lt;br /&gt;
&lt;br /&gt;
* Weather Plugin stuff (TSCHAK)&lt;br /&gt;
**lmce-weather-plugin(836,837) - Initial build of Weather Plugin&lt;br /&gt;
**lmce-weather(838,839) - Initial build of Weather device&lt;br /&gt;
**pluto-system-database(211) - lots of stuff crammed in for the weather plugin&lt;br /&gt;
**pluto-orbiter(119,138) - Orbiter screenhandlers changed&lt;br /&gt;
**pluto-proxy-orbiter(487,488) - Orbiter screenhandlers changed&lt;br /&gt;
**pluto-skins-basic (204) - graphic changes (POSSY! tag me, so I can give you the updated bitmaps!)&lt;br /&gt;
**lmce-skins-titanium(718) - Graphic changes (see above!)&lt;br /&gt;
**lmce-skins-bluecrystal(804) - Graphic changes (see above!)&lt;br /&gt;
* SimplePhone (498,499) - Better sound card selection logic if Sound Card device data is specified.&lt;br /&gt;
* lmce-roku (833,834) - Implement CMD_Change_Playback_Speed() so phone call pauses will work.&lt;br /&gt;
&lt;br /&gt;
== Update 27799 ==&lt;br /&gt;
*mce-diskless-tools (627,628) - Diskless_Create &amp;amp; Diskless_Setup updates for Raspberry Pi (phenigma)&lt;br /&gt;
&lt;br /&gt;
== Update 27783 ==&lt;br /&gt;
*pluto-website-admin (220) - #1860: Fixes voicemail problems (foxi352)&lt;br /&gt;
*pluto-asterisk (270) - #1860: Fixes voicemail problems (foxi352)&lt;br /&gt;
* pluto-std-plugins (116,135) - #1862: fixes long standing problem of the dreaded &amp;quot;Play All audio&amp;quot; will quit at some point, by checking for valid files at deque insertion. Made a note to find more efficient fix in long term (TSCHAK)&lt;br /&gt;
&lt;br /&gt;
== Update 27777 ==&lt;br /&gt;
*lmce-asterisk - Try to fix problem where embedded phones lose connection to asterisk&lt;br /&gt;
*mce-diskless-tools (628) - mountnfs.sh updates for precise&lt;br /&gt;
*pluto-website-admin (220) - Add No-IP dynamic dns service to webadmin&lt;br /&gt;
&lt;br /&gt;
== Update 27762 ==&lt;br /&gt;
* pluto-website-admin (220) - Fixes #1847 - First phoneline added did not save, Fixes #1848 - Delete routing informations on phoneline delete (foxi352)&lt;br /&gt;
* lmce-asterisk - Fixes a lot of simplephone problems due to local channel optimizations&lt;br /&gt;
&lt;br /&gt;
== Update 27744 ==&lt;br /&gt;
* pluto-system-database (211) - Added device data to SimplePhone to allow sound card selection for Ringing and Calls (TSCHAK)&lt;br /&gt;
** Also add changes to Phoenix Solo USB device for configuration after detection. Remove useless device data (TSCHAK)&lt;br /&gt;
* pluto-boot-scripts (234) - Made sure TranslateSoundCard and TranslateRemoteSoundCard shell scripts get copied into /usr/pluto/bin (TSCHAK)&lt;br /&gt;
* pluto-simplephone (498,499) - SimplePhone can now use Sound Card device data attached to template to explicitly set a sound card. If one isn&#039;t provided, the original heuristics are used to find one (TSCHAK)&lt;br /&gt;
* pluto-sound-card-scripts (579) - Add configuration script for Phoenix Solo USB device. (TSCHAK)&lt;br /&gt;
&lt;br /&gt;
== Update 27724 ==&lt;br /&gt;
* pluto-asterisk (270,271) - Asterisk has changed its tokens slightly, fix various bits of bit rot and breakage so Telecom integration is tight again. (TSCHAK)&lt;br /&gt;
* pluto-orbiter (119,138) - Screen Handler fixes for Telecom (TSCHAK)&lt;br /&gt;
* pluto-zwave-lighting (505,506) - Fixes #1451 - Smoke Detectors are properly detected again. (TSCHAK)&lt;br /&gt;
* pluto-system-database (211) - Fix launch path for new Roku device, so that it will actually start correctly. (TSCHAK)&lt;br /&gt;
* lmce-game-player (673,674) - Fix Famicom Disk System support, again, in light of the new ConfigurationManager class. (TSCHAK)&lt;br /&gt;
&lt;br /&gt;
== Update 27701 ==&lt;br /&gt;
* pluto-orbiter (119, 138) - Changes to screen handler for Move File (final refinements)&lt;br /&gt;
* pluto-system-database (211) - sqlCVS designer changes for Move File&lt;br /&gt;
* pluto-proxy-orbiter (487,488) - synchronize proxy orbiter to match screen handler changes for move file&lt;br /&gt;
* pluto-bluetooth-dongle (124,243) - synchronize bluetooth dongle to match screen handler changes for move file&lt;br /&gt;
* pluto-std-plugins (116, 135) - Changes to telecom to disallow concurrent access to sound card if HDMI, and to fix the toggle effect of media unpausing if paused when phone rings. (#1710 and #1834)&lt;br /&gt;
* pluto-website-admin (220) - Changes webadmin to access MediaTomb on new port&lt;br /&gt;
* lmce-game-player (673,674) - make sure all changes are up to date.&lt;br /&gt;
&lt;br /&gt;
== Update 27694 ==&lt;br /&gt;
* lshwd - postrm fixes.&lt;br /&gt;
* pluto-std-plugins (116, 135)  &lt;br /&gt;
** File List button in Games remote works correctly (TSCHAK)&lt;br /&gt;
** You can now add games to an already in progress playlist (TSCHAK)&lt;br /&gt;
&lt;br /&gt;
== Update 27688 ==&lt;br /&gt;
* pluto-simplephone - Changes to allow for audio pipe only.&lt;br /&gt;
&lt;br /&gt;
== Update 27686 ==&lt;br /&gt;
Move button in Media Details page should now work. (TSCHAK)&lt;br /&gt;
* pluto-orbiter (119, 138) - Changes to Screen Handler for Move File (TSCHAK)&lt;br /&gt;
* pluto-std-plugins (116, 135) &lt;br /&gt;
** Changes to Media Plugin MoveJob, MoveTask, and CMD_Move_File for Move File; (TSCHAK)&lt;br /&gt;
** Make Firefox window swallow correctly in Computing. (TSCHAK)&lt;br /&gt;
** Telecom Plugin now switches on MD&#039;s for SimplePhone (bug #1709) (TSCHAK)&lt;br /&gt;
* pluto-boot-scripts (234) - addition of moveWrapper.sh for Move File; Fix Keyboard Layout bug (#1776) (TSCHAK)&lt;br /&gt;
* pluto-system-database (211) - Designer changes for Move File (TSCHAK)&lt;br /&gt;
&lt;br /&gt;
== Update 27659 ==&lt;br /&gt;
* pluto-mythtv-plugin (134,153) - bump MYTH_PROTO_VERSION source (#1821) (tschak)&lt;br /&gt;
&lt;br /&gt;
== Update 27649 ==&lt;br /&gt;
* sqlCVS (212,213) - mySQL reconnect bug preventing 1204 install from completing first time, fixed (tschak)&lt;br /&gt;
* plutoUtils (196,197) - Related PlutoUtils MySQLHelper change.&lt;br /&gt;
&lt;br /&gt;
== Update 27636 ==&lt;br /&gt;
* ubuntu/lshwd (n/a) - adds lsb tags&lt;br /&gt;
* lmce-update-system (650,651) - adds lsb tags&lt;br /&gt;
* mce-diskless-tools (627,628) - adds lsb tags to mountnfs.sh script&lt;br /&gt;
* lmce-picture-viewer (754,755) - picture viewer window now minimizes properly, when not in use. (tschak)&lt;br /&gt;
&lt;br /&gt;
== Update 27542 ==&lt;br /&gt;
* sdlmame and sdlmess have had the initialization and codec patch reapplied as per ticket #1560.&lt;br /&gt;
* pluto-website-admin (220) - Correct display of static DHCP clients in webadmin -&amp;gt; DHCP leases&lt;br /&gt;
&lt;br /&gt;
== Update 27533 ==&lt;br /&gt;
* lmce-roku (833,834) - a new C++ replacement for the GSD based driver for Roku players.&lt;br /&gt;
* pluto-system-database (211) (needs to be rebuilt because of package defs changes.)&lt;br /&gt;
** Add orbiter to rpi_b device template&lt;br /&gt;
** Add omxplayer Player/Plugin and associated data&lt;br /&gt;
** Add lmce-roku, and lmce-src-roku packages.&lt;br /&gt;
* lmce-mediatomb (702) - Convert config.xml to v2, add mkv and mka, convert to UTF-8, change port to 49155&lt;br /&gt;
* pluto-xine-player (117,136) - should now build against libxine2 rather than libxine1&lt;br /&gt;
&lt;br /&gt;
== Update 27515 ==&lt;br /&gt;
* lmce-game-player - Turn on bookmarks for MESS based emulators, so I can see which ones reliably save state.&lt;br /&gt;
* lmce-asterisk - Fixes #1766 - * in username / password now possible, add Cisco 7941 config script&lt;br /&gt;
* pluto-website-admin (220) - Add possibility to change Room and FloorPlanObjectType in KNX wizard&lt;br /&gt;
* pluto-pluto-main-db (201,237) - Add Cisco 7941 DT&lt;br /&gt;
* pluto-dhcpd-plugin (302) - Removed old 7941 config script&lt;br /&gt;
* mce-diskless-tools (627,628) - Add raspbian lmce packages to pi md diskless image&lt;br /&gt;
* chan-sccp_v4.1 - Upgraded asterisk SCCP channel driver to newest version&lt;br /&gt;
&lt;br /&gt;
== Update 27469 ==&lt;br /&gt;
* lmce-airplay-plugin - more refinements and changes.&lt;br /&gt;
* lmce-airplay-streamer - more refinements and changes.&lt;br /&gt;
&lt;br /&gt;
== Update 27457 ==&lt;br /&gt;
*pluto-boot-scripts (234) : Fixes #1758 - Modified Bootscripts postinst to reflect AVAHI services directory structure changes&lt;br /&gt;
*pluto-pluto-main-db (201,237) - Fixes #1758 - Remove dependency for netatalk for now. Avahi announces the samba shares as xserve.&lt;br /&gt;
&lt;br /&gt;
== Update 27448 ==&lt;br /&gt;
* pluto-boot-scripts (234)&lt;br /&gt;
** adds serial port support on rpi&lt;br /&gt;
** adds bootscript conditionals for rpi&lt;br /&gt;
* pluto-libserial (190,191) - fixes bug in SerialPort.cpp&lt;br /&gt;
* lmce-agocontrol-bridge (826,827) - new agocontrol Bridge packages&lt;br /&gt;
* pluto-system-database (211) - new agocontrol Bridge packages&lt;br /&gt;
&lt;br /&gt;
== Update 27414 ==&lt;br /&gt;
* lmce-asterisk - Added option to choose DTMF mode in phonelines setup&lt;br /&gt;
* pluto-website-admin (220) - Added option to choose DTMF mode in phonelines setup&lt;br /&gt;
&lt;br /&gt;
== Update 27403 ==&lt;br /&gt;
* pluto-vdr-plugin - removal of the vdr-plugin-control dependency&lt;br /&gt;
* pluto-vdr - removal of the vdr-plugin-control dependency&lt;br /&gt;
&lt;br /&gt;
== Update 27397 ==&lt;br /&gt;
* lmce-plymouth-theme (770) - source file compatibility changes to build on precise&lt;br /&gt;
&lt;br /&gt;
== Update 27392 ==&lt;br /&gt;
* pluto-boot-scripts (234) - Add option 150 to dhcp server template for cisco firmware tftp&lt;br /&gt;
* lmce-asterisk - Change db_phone_config.sh to call configure scripts for sccp phones again&lt;br /&gt;
* pluto-dhcpd-plugin (302) - Modified 7970 configuration script to include firmware to download if in device&#039;s devicedata&lt;br /&gt;
* mce-diskless-tools (628) - latest create-diskless ran.&lt;br /&gt;
&lt;br /&gt;
== Update 27385 ==&lt;br /&gt;
* pluto-pluto-main-db (201,237) - removes pluto-system-database dependency&lt;br /&gt;
* pluto-pluto-telecom-db (470,471) - removes pluto-telecom-database dependency&lt;br /&gt;
* pluto-pluto-media-db (254,255) - removes pluto-media-database dependency&lt;br /&gt;
* pluto-pluto-security-db (277,278) - removes pluto-security-database dependency&lt;br /&gt;
* lmce-datalog-db (688,689) - removes lmce-datalog-database dependency&lt;br /&gt;
* lmce-game-db (675,676) - removes lmce-game-database dependency&lt;br /&gt;
&lt;br /&gt;
== Update 27384 ==&lt;br /&gt;
* lmce-sdlmame (682,683) - mame/mess source updated and combined into single tree&lt;br /&gt;
* lmce-game-player (673,674)&lt;br /&gt;
** change mame/mess binary locations&lt;br /&gt;
** remove lmce-sdlmess as a depends for precise&lt;br /&gt;
* mce-diskless-tools (628) - Diskless_CreateTBZ.sh updates for precise&lt;br /&gt;
* pluto-pluto-main-db (201,237) - adds pluto-system-database dependency&lt;br /&gt;
* pluto-pluto-telecom-db (470,471) - adds pluto-telecom-database dependency&lt;br /&gt;
* pluto-pluto-media-db (254,255) - adds pluto-media-database dependency&lt;br /&gt;
* pluto-pluto-security-db (277,278) - adds pluto-security-database dependency&lt;br /&gt;
* lmce-game-db (675,676) - adds lmce-game-database dependency&lt;br /&gt;
&lt;br /&gt;
== Update 27373 ==&lt;br /&gt;
* pluto-dcerouter (154,155) - dhcp fixes&lt;br /&gt;
* pluto-boot-scripts (234) - dhcp fixes&lt;br /&gt;
* pluto-plutodhcp (330,491) - dhcp fixes&lt;br /&gt;
* mce-launcher - dhcp fixes&lt;br /&gt;
* lmce-asterisk - removes asterisk-sounds-extra from depends, package no longer exists&lt;br /&gt;
* mce-diskless-tools (627,628) - repairs to md creation&lt;br /&gt;
&lt;br /&gt;
== Update 27366 ==&lt;br /&gt;
* pluto-avwizard-sounds - missing from repo&lt;br /&gt;
* pluto-convert-mac - missing from repo&lt;br /&gt;
&lt;br /&gt;
== Update 27365 == &lt;br /&gt;
* pluto-confirm-dependencies - improves displayed information about command arguments and adds -f, skips installed checking&lt;br /&gt;
* pluto-makerelease - dependencies are added to packages again.&lt;br /&gt;
* all packages built by MakeRelease - (/var/lmce-build/out/tmp/*.deb) dependencies added to packages again.&lt;br /&gt;
* mce-diskless-tools - Diskless_CreateTBZ.sh updates for precise&lt;br /&gt;
* video-wizard-videos - missing from repo&lt;br /&gt;
* pluto-avwizard-sounds - missing from repo&lt;br /&gt;
* pluto-mcr-remote - missing from repo&lt;br /&gt;
&lt;br /&gt;
== Update 27343 ==&lt;br /&gt;
* pluto-simplephone builds for 1204&lt;br /&gt;
&lt;br /&gt;
== Update 27340 ==&lt;br /&gt;
* many, many lmce packages are affected by change to AllCommandsRequests.h.  so many, too many to list. (all lmce-* and pluto-* packages) :) - phenigma&lt;br /&gt;
* pluto-disk-drive - removed pre-built bin from svn that we are building&lt;br /&gt;
* lmce-insteon - removed pre-built bin from svn that we are building&lt;br /&gt;
* pluto-dcerouter - adds BlueCrystal skin to depends&lt;br /&gt;
&lt;br /&gt;
== Update 27323 ==&lt;br /&gt;
* lmce-EnOcean builds for 1204&lt;br /&gt;
* pluto-proxy-orbiter builds for 1204&lt;br /&gt;
* pluto-hal-device-finder builds for 1204&lt;br /&gt;
* *-skin* packages build for 1204&lt;br /&gt;
* pluto-orbiter builds for 1204&lt;br /&gt;
&lt;br /&gt;
== Update 27294 ==&lt;br /&gt;
* pluto-boot-scripts - changes for postinst to ignore returnvalue for service restart&lt;br /&gt;
* pluto-database-settings &lt;br /&gt;
** changes for postinst to ignore returnvalue for service restart&lt;br /&gt;
** changes to postinst to reflect my.cnf changes.&lt;br /&gt;
&lt;br /&gt;
== Update 28428 ==&lt;br /&gt;
*lmce-admin - dead link changed to other page.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Philips_Hue&amp;diff=34853</id>
		<title>Philips Hue</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Philips_Hue&amp;diff=34853"/>
		<updated>2014-03-14T11:19:14Z</updated>

		<summary type="html">&lt;p&gt;RayBe: adding category&amp;#039;s&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: RF Control]]&lt;br /&gt;
[[Category: Automation]]&lt;br /&gt;
[[Category: Lighting]]&lt;br /&gt;
[[Category: Hardware]]&lt;br /&gt;
This page is a work in progress and needs expanding (14-3-2014 RayBe)&lt;br /&gt;
[[Image:Philips_Hue.jpeg|right]]&lt;br /&gt;
To install the Philips Hue Bridge and its lights:&lt;br /&gt;
* Setup the Philips Hue controller and its lights as described in the manual&lt;br /&gt;
* Connect the Hue Bridge to the internal network of Linuxmce&lt;br /&gt;
* On a Orbiter you will get asked if Linuxmce should use the newly found Hue Device, select yes&lt;br /&gt;
* Now you get asked in which room the Hue-Controller must be setup, select any you want&lt;br /&gt;
* Log into webadmin and find the newly added Hue Controller, its under Wizard -&amp;gt; Devices -&amp;gt; Interfaces&lt;br /&gt;
* Click on &#039;Advanced&#039;&lt;br /&gt;
* Click on &#039;Follow log&#039; in the top right&lt;br /&gt;
* At this point Linuxmce is trying to add a user to your Hue-Bridge but can&#039;t because you didn&#039;t press the link-button on the bridge.&lt;br /&gt;
* Look in the log if there is a line stating: &#039;Setup command failed. Reason to follow::link button not pressed&#039;&lt;br /&gt;
* Press the link-button on the Hue-Bridge and watch a Orbiter, you will get asked to reload the router.&lt;br /&gt;
* All the lights which you did setup in the Bridge get automatically added to the Wizard -&amp;gt; Devices -&amp;gt; Lights section of the webadmin.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Philips_Hue&amp;diff=34852</id>
		<title>Philips Hue</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Philips_Hue&amp;diff=34852"/>
		<updated>2014-03-14T11:07:15Z</updated>

		<summary type="html">&lt;p&gt;RayBe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;this page is a work in progress and needs expanding (14-3-2014 RayBe)&lt;br /&gt;
[[Image:Philips_Hue.jpeg|right]]&lt;br /&gt;
To install the Philips Hue Bridge and it lights:&lt;br /&gt;
* Setup the Philips Hue controller and its lights as described in the manual&lt;br /&gt;
* Connect the Hue Bridge to the internal network of Linuxmce&lt;br /&gt;
* On a Orbiter you will get asked if Linuxmce should use the newly found Hue Device, select yes&lt;br /&gt;
* Now you get asked in which room the Hue-Controller must be setup, select any you want&lt;br /&gt;
* Log into webadmin and find the newly added Hue Controller, its under Wizard -&amp;gt; Devices -&amp;gt; Interfaces&lt;br /&gt;
* Click on &#039;Advanced&#039;&lt;br /&gt;
* Click on &#039;Follow log&#039; in the top right&lt;br /&gt;
* At this point Linuxmce is trying to add a user to your Hue-Bridge but can&#039;t because you didn&#039;t press the link-button on the bridge.&lt;br /&gt;
* Look in the log if there is a line stating: &#039;Setup command failed. Reason to follow::link button not pressed&#039;&lt;br /&gt;
* Press the link-button on the Hue-Bridge and watch a Orbiter, you will get asked to reload the router.&lt;br /&gt;
* All the lights which you did setup in the Bridge get automatically added to the Wizard -&amp;gt; Devices -&amp;gt; Lights section of the webadmin.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Philips_Hue&amp;diff=34851</id>
		<title>Philips Hue</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Philips_Hue&amp;diff=34851"/>
		<updated>2014-03-14T11:06:25Z</updated>

		<summary type="html">&lt;p&gt;RayBe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;this page is a work in progress and needs expanding (14-3-2014 RayBe)&lt;br /&gt;
[[Image:Philips_Hue.jpg|right]]&lt;br /&gt;
To install the Philips Hue Bridge and it lights:&lt;br /&gt;
* Setup the Philips Hue controller and its lights as described in the manual&lt;br /&gt;
* Connect the Hue Bridge to the internal network of Linuxmce&lt;br /&gt;
* On a Orbiter you will get asked if Linuxmce should use the newly found Hue Device, select yes&lt;br /&gt;
* Now you get asked in which room the Hue-Controller must be setup, select any you want&lt;br /&gt;
* Log into webadmin and find the newly added Hue Controller, its under Wizard -&amp;gt; Devices -&amp;gt; Interfaces&lt;br /&gt;
* Click on &#039;Advanced&#039;&lt;br /&gt;
* Click on &#039;Follow log&#039; in the top right&lt;br /&gt;
* At this point Linuxmce is trying to add a user to your Hue-Bridge but can&#039;t because you didn&#039;t press the link-button on the bridge.&lt;br /&gt;
* Look in the log if there is a line stating: &#039;Setup command failed. Reason to follow::link button not pressed&#039;&lt;br /&gt;
* Press the link-button on the Hue-Bridge and watch a Orbiter, you will get asked to reload the router.&lt;br /&gt;
* All the lights which you did setup in the Bridge get automatically added to the Wizard -&amp;gt; Devices -&amp;gt; Lights section of the webadmin.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Philips_Hue&amp;diff=34850</id>
		<title>Philips Hue</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Philips_Hue&amp;diff=34850"/>
		<updated>2014-03-14T11:05:16Z</updated>

		<summary type="html">&lt;p&gt;RayBe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;this page is a work in progress and needs expanding (14-3-2014 RayBe)&lt;br /&gt;
[[Image:Philips Hue.jpg|right]]&lt;br /&gt;
To install the Philips Hue Bridge and it lights:&lt;br /&gt;
* Setup the Philips Hue controller and its lights as described in the manual&lt;br /&gt;
* Connect the Hue Bridge to the internal network of Linuxmce&lt;br /&gt;
* On a Orbiter you will get asked if Linuxmce should use the newly found Hue Device, select yes&lt;br /&gt;
* Now you get asked in which room the Hue-Controller must be setup, select any you want&lt;br /&gt;
* Log into webadmin and find the newly added Hue Controller, its under Wizard -&amp;gt; Devices -&amp;gt; Interfaces&lt;br /&gt;
* Click on &#039;Advanced&#039;&lt;br /&gt;
* Click on &#039;Follow log&#039; in the top right&lt;br /&gt;
* At this point Linuxmce is trying to add a user to your Hue-Bridge but can&#039;t because you didn&#039;t press the link-button on the bridge.&lt;br /&gt;
* Look in the log if there is a line stating: &#039;Setup command failed. Reason to follow::link button not pressed&#039;&lt;br /&gt;
* Press the link-button on the Hue-Bridge and watch a Orbiter, you will get asked to reload the router.&lt;br /&gt;
* All the lights which you did setup in the Bridge get automatically added to the Wizard -&amp;gt; Devices -&amp;gt; Lights section of the webadmin.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=File:Philips_Hue.jpeg&amp;diff=34849</id>
		<title>File:Philips Hue.jpeg</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=File:Philips_Hue.jpeg&amp;diff=34849"/>
		<updated>2014-03-14T11:03:21Z</updated>

		<summary type="html">&lt;p&gt;RayBe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Philips_Hue&amp;diff=34848</id>
		<title>Philips Hue</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Philips_Hue&amp;diff=34848"/>
		<updated>2014-03-14T10:58:44Z</updated>

		<summary type="html">&lt;p&gt;RayBe: First draft for the Philips Hue wiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;this page is a work in progress and needs expanding (14-3-2014 RayBe)&lt;br /&gt;
&lt;br /&gt;
To install the Philips Hue Bridge and it lights:&lt;br /&gt;
* Setup the Philips Hue controller and its lights as described in the manual&lt;br /&gt;
* Connect the Hue Bridge to the internal network of Linuxmce&lt;br /&gt;
* On a Orbiter you will get asked if Linuxmce should use the newly found Hue Device, select yes&lt;br /&gt;
* Now you get asked in which room the Hue-Controller must be setup, select any you want&lt;br /&gt;
* Log into webadmin and find the newly added Hue Controller, its under Wizard -&amp;gt; Devices -&amp;gt; Interfaces&lt;br /&gt;
* Click on &#039;Advanced&#039;&lt;br /&gt;
* Click on &#039;Follow log&#039; in the top right&lt;br /&gt;
* At this point Linuxmce is trying to add a user to your Hue-Bridge but can&#039;t because you didn&#039;t press the link-button on the bridge.&lt;br /&gt;
* Look in the log if there is a line stating: &#039;Setup command failed. Reason to follow::link button not pressed&#039;&lt;br /&gt;
* Press the link-button on the Hue-Bridge and watch a Orbiter, you will get asked to reload the router.&lt;br /&gt;
* All the lights which you did setup in the Bridge get automatically added to the Wizard -&amp;gt; Devices -&amp;gt; Lights section of the webadmin.&lt;/div&gt;</summary>
		<author><name>RayBe</name></author>
	</entry>
</feed>