<?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=Bulek</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=Bulek"/>
	<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php/Special:Contributions/Bulek"/>
	<updated>2026-05-11T05:40:02Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=User_talk:Bulek&amp;diff=32154</id>
		<title>User talk:Bulek</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=User_talk:Bulek&amp;diff=32154"/>
		<updated>2012-09-12T01:31:06Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* Tricks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== How to setup FM Tuner ===&lt;br /&gt;
&lt;br /&gt;
1. Create Audio Receiver Device (Marantz SR5600 in my case)&lt;br /&gt;
&lt;br /&gt;
2. Create its child device: Tuner - Digital - OTARadio #2042 (ID of 64 in my case)&lt;br /&gt;
&lt;br /&gt;
3. Create Media Scenario :&lt;br /&gt;
&lt;br /&gt;
[[File:tuner_scenarios.png]]&lt;br /&gt;
&lt;br /&gt;
First two commands select proper input (FM Tuner) on audio receiver and tune FM Tuner to certain frequency. Device 64 is device from 2. In such configuration special screen appears for basic control of Tuner (mostly only Mute/Vol+-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Nokia N800 ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. gain root access&lt;br /&gt;
 install openssh&lt;br /&gt;
 ssh root@localhost&lt;br /&gt;
 passwd xxxx&lt;br /&gt;
&lt;br /&gt;
2. enable Red Code (address matrix in new repository)&lt;br /&gt;
&lt;br /&gt;
3. install all needed packages&lt;br /&gt;
&lt;br /&gt;
4. transfer fonts &lt;br /&gt;
From Core &lt;br /&gt;
 mkdir /usr/share/fonts/truetype/&lt;br /&gt;
 mkdir /usr/share/fonts/truetype/msttcorefonts/&lt;br /&gt;
&lt;br /&gt;
to N800 into same directory &lt;br /&gt;
 tar zxvf tts_fonts.tgz&lt;br /&gt;
&lt;br /&gt;
4. Run Orbiter :&lt;br /&gt;
Much easier from GUI, but if you have problems, starting by hand would help :&lt;br /&gt;
&lt;br /&gt;
 /usr/bin/Orbiter -r 192.168.80.1 -d 36 -l /tmp/orbiter.log&lt;br /&gt;
&lt;br /&gt;
=== Contributing/Changing templates notes ===&lt;br /&gt;
&lt;br /&gt;
I&#039;m doing this for better trace of sqlcvs contributions entered...&lt;br /&gt;
&lt;br /&gt;
12.03.2008: &lt;br /&gt;
 - added Cybrotech manufacturer&lt;br /&gt;
 - added template for Cybrotech Automation Interface&lt;br /&gt;
&lt;br /&gt;
==Request for comment==&lt;br /&gt;
Hi,&lt;br /&gt;
I&#039;ve made a request for comment with regard to a debate we&#039;re having about categorization of articles. If you could take a look here [[LinuxMCE Wiki talk:Community Portal]] when you have time and perhaps leave a comment I&#039;d be very grateful.&lt;br /&gt;
&lt;br /&gt;
[[User:Lozzo|Lozzo]] 11:40, 8 October 2007 (MST)&lt;br /&gt;
&lt;br /&gt;
=== Setting up telephony features my way... ===&lt;br /&gt;
1. call comes in and you have to somehow to reroute it to individual users&lt;br /&gt;
&lt;br /&gt;
2. if you go to users page on web-admin, you can see &amp;quot;Extension for intercom&amp;quot; - that&#039;s virtual internal number for each user...&lt;br /&gt;
&lt;br /&gt;
3. if you go to Telecom-Call Routing, there you can determine what will happen with incoming call to each user depending on whether it is normal or priority caller and depending on user&#039;s mode...&lt;br /&gt;
&lt;br /&gt;
I do it in slightly different manner, cause I think it&#039;s too much to make all those settings for all users...&lt;br /&gt;
&lt;br /&gt;
I usually setup up two adition users (hidden from Orbiters): Doorphone and Housephone&lt;br /&gt;
&lt;br /&gt;
I reroute calls from doorphone to virtual extension of user Doorphone and all incoming calls to virtual extension of Housephone&lt;br /&gt;
&lt;br /&gt;
Therefore I make all those settings in Telecom-Call Routing but only for those two &amp;quot;users&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Now for instance you can set call routing :&lt;br /&gt;
&lt;br /&gt;
 - to ring phones and then to voicemail if user is in Home mode&lt;br /&gt;
 - to go directly to voicemail or to forward call to your celullar phone when you&#039;re away&lt;br /&gt;
&lt;br /&gt;
in my case I have SIP trunk as connection to my ip provider I just set all incoming calls to go to extension of housephone (in Advanced-Configuration-Phones setup - where you get Freepbx menus)&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=File:Tuner_scenarios.png&amp;diff=32153</id>
		<title>File:Tuner scenarios.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=File:Tuner_scenarios.png&amp;diff=32153"/>
		<updated>2012-09-12T01:29:46Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Mini_installation&amp;diff=26871</id>
		<title>Mini installation</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Mini_installation&amp;diff=26871"/>
		<updated>2011-01-30T10:33:01Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* About */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= About =&lt;br /&gt;
* Standalone DCE installation (z-wave appliance)&lt;br /&gt;
* Hari&#039;s description statements from forum posts :&lt;br /&gt;
** i&#039;m running it on fedora and the guruplug&lt;br /&gt;
** used for standalone z-wave gateway and running on Guruplug with an ARM 400mhz cpu with 64mb of ram.&lt;br /&gt;
** it is the DCERouter, some plugins (like RPC, Datalogger), some devices (like Z-Wave, ...)...&lt;br /&gt;
** i use it on a guruplug as a z-wave appliance..&lt;br /&gt;
** Fedora 13 64bit binary packages are available here: http://www.linuxmce.org/standalone/f13/rpms/&lt;br /&gt;
&lt;br /&gt;
A recent database dump can be found here: http://svn.linuxmce.org/svn/people/hari/mini/dumps/pluto_main_updated.sql.bz2&lt;br /&gt;
&lt;br /&gt;
Don&#039;t forget to run the (not yet packaged) installer from http://svn.linuxmce.org/svn/people/hari/mini/installer/&lt;br /&gt;
&lt;br /&gt;
= Binaries and forum explanation : =&lt;br /&gt;
&lt;br /&gt;
    * Fedora 12&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10442.0&lt;br /&gt;
          o http://www.linuxmce.org/standalone/f12/rpms/ &lt;br /&gt;
    * Fedora 13&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10696.0&lt;br /&gt;
          o http://www.linuxmce.org/standalone/f13/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Related links =&lt;br /&gt;
&lt;br /&gt;
    * Forum&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10430.0&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10456.0&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=8333.0&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10319.0&lt;br /&gt;
    * Wiki&lt;br /&gt;
          o http://wiki.linuxmce.org/index.php/GuruPlug&lt;br /&gt;
    * SVN:&lt;br /&gt;
          o http://svn.linuxmce.org/svn/people/hari/mini/&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Mini_installation&amp;diff=26870</id>
		<title>Mini installation</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Mini_installation&amp;diff=26870"/>
		<updated>2011-01-30T10:29:54Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= About =&lt;br /&gt;
* Standalone DCE installation (z-wave appliance)&lt;br /&gt;
* Hari&#039;s Description Statements&lt;br /&gt;
** i&#039;m running it on fedora and the guruplug&lt;br /&gt;
** Used for standalone z-wave gateway and running on Guruplug with an ARM 400mhz cpu with 64mb of ram.&lt;br /&gt;
** it is the DCERouter, some plugins (like RPC, Datalogger), some devices (like Z-Wave, ...)...&lt;br /&gt;
** I use it on a guruplug as a z-wave appliance..&lt;br /&gt;
** Fedora 13 64bit binary packages are available here: http://www.linuxmce.org/standalone/f13/rpms/&lt;br /&gt;
&lt;br /&gt;
A recent database dump can be found here: http://svn.linuxmce.org/svn/people/hari/mini/dumps/pluto_main_updated.sql.bz2&lt;br /&gt;
&lt;br /&gt;
Don&#039;t forget to run the (not yet packaged) installer from http://svn.linuxmce.org/svn/people/hari/mini/installer/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Binaries and forum explanation : =&lt;br /&gt;
&lt;br /&gt;
    * Fedora 12&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10442.0&lt;br /&gt;
          o http://www.linuxmce.org/standalone/f12/rpms/ &lt;br /&gt;
    * Fedora 13&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10696.0&lt;br /&gt;
          o http://www.linuxmce.org/standalone/f13/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Related links =&lt;br /&gt;
&lt;br /&gt;
    * Forum&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10430.0&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10456.0&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=8333.0&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10319.0&lt;br /&gt;
    * Wiki&lt;br /&gt;
          o http://wiki.linuxmce.org/index.php/GuruPlug&lt;br /&gt;
    * SVN:&lt;br /&gt;
          o http://svn.linuxmce.org/svn/people/hari/mini/&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Mini_installation&amp;diff=26869</id>
		<title>Mini installation</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Mini_installation&amp;diff=26869"/>
		<updated>2011-01-30T10:29:12Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= About =&lt;br /&gt;
* Standalone DCE installation (z-wave appliance)&lt;br /&gt;
* Hari&#039;s Description Statements&lt;br /&gt;
** i&#039;m running it on fedora and the guruplug&lt;br /&gt;
** Used for standalone z-wave gateway and running on Guruplug with an ARM 400mhz cpu with 64mb of ram.&lt;br /&gt;
** it is the DCERouter, some plugins (like RPC, Datalogger), some devices (like Z-Wave, ...)...&lt;br /&gt;
** I use it on a guruplug as a z-wave appliance..&lt;br /&gt;
** Fedora 13 64bit binary packages are available here: http://www.linuxmce.org/standalone/f13/rpms/&lt;br /&gt;
&lt;br /&gt;
A recent database dump can be found here: http://svn.linuxmce.org/svn/people/hari/mini/dumps/pluto_main_updated.sql.bz2&lt;br /&gt;
&lt;br /&gt;
Don&#039;t forget to run the (not yet packaged) installer from http://svn.linuxmce.org/svn/people/hari/mini/installer/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Binaries and forum explanation : =&lt;br /&gt;
&lt;br /&gt;
    * Fedora 12&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10442.0&lt;br /&gt;
          o http://www.linuxmce.org/standalone/f12/rpms/ &lt;br /&gt;
    * Fedora 13&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10696.0&lt;br /&gt;
          o http://www.linuxmce.org/standalone/f13/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Related links =&lt;br /&gt;
&lt;br /&gt;
    * Forum&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10430.0&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10456.0&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=8333.0&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10319.0&lt;br /&gt;
    * Wiki&lt;br /&gt;
          o http://wiki.linuxmce.org/index.php/GuruPlug http://wiki.linuxmce.org/index.php/GuruPlug&lt;br /&gt;
    * SVN:&lt;br /&gt;
          o http://svn.linuxmce.org/svn/people/hari/mini/&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Mini_installation&amp;diff=26868</id>
		<title>Mini installation</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Mini_installation&amp;diff=26868"/>
		<updated>2011-01-30T10:28:35Z</updated>

		<summary type="html">&lt;p&gt;Bulek: New page: = About = * Standalone DCE installation (z-wave appliance) * Hari&amp;#039;s Description Statements ** i&amp;#039;m running it on fedora and the guruplug ** Used for standalone z-wave gateway and running on...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= About =&lt;br /&gt;
* Standalone DCE installation (z-wave appliance)&lt;br /&gt;
* Hari&#039;s Description Statements&lt;br /&gt;
** i&#039;m running it on fedora and the guruplug&lt;br /&gt;
** Used for standalone z-wave gateway and running on Guruplug with an ARM 400mhz cpu with 64mb of ram.&lt;br /&gt;
** it is the DCERouter, some plugins (like RPC, Datalogger), some devices (like Z-Wave, ...)...&lt;br /&gt;
** I use it on a guruplug as a z-wave appliance..&lt;br /&gt;
** Fedora 13 64bit binary packages are available here: http://www.linuxmce.org/standalone/f13/rpms/&lt;br /&gt;
&lt;br /&gt;
A recent database dump can be found here: http://svn.linuxmce.org/svn/people/hari/mini/dumps/pluto_main_updated.sql.bz2&lt;br /&gt;
&lt;br /&gt;
Don&#039;t forget to run the (not yet packaged) installer from http://svn.linuxmce.org/svn/people/hari/mini/installer/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Binaries and forum explanation : =&lt;br /&gt;
&lt;br /&gt;
    * Fedora 12&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10442.0&lt;br /&gt;
          o http://www.linuxmce.org/standalone/f12/rpms/ &lt;br /&gt;
    * Fedora 13&lt;br /&gt;
          o http://forum.linuxmce.org/index.php?topic=10696.0&lt;br /&gt;
          o http://www.linuxmce.org/standalone/f13/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Related links =&lt;br /&gt;
&lt;br /&gt;
    * Forum&lt;br /&gt;
          o [http://forum.linuxmce.org/index.php?topic=10430.0]&lt;br /&gt;
          o [http://forum.linuxmce.org/index.php?topic=10456.0]&lt;br /&gt;
          o [http://forum.linuxmce.org/index.php?topic=8333.0]&lt;br /&gt;
          o [http://forum.linuxmce.org/index.php?topic=10319.0]&lt;br /&gt;
    * Wiki&lt;br /&gt;
          o [http://wiki.linuxmce.org/index.php/GuruPlug http://wiki.linuxmce.org/index.php/GuruPlug]&lt;br /&gt;
    * SVN:&lt;br /&gt;
          o [http://svn.linuxmce.org/svn/people/hari/mini/]&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Climate_Plugin&amp;diff=16723</id>
		<title>Climate Plugin</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Climate_Plugin&amp;diff=16723"/>
		<updated>2008-12-15T15:48:54Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* Description of enhanced 710 plugin and ability to control displayed info on floorplans */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Climate]]&lt;br /&gt;
[[Category:LinuxMCE_Plugins]]&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
Climate plugin takes care of climate devices. Handles commands, events and sets according device states. It also gives content to Orbiter plugin when it renders Climate devices on Orbiter&#039;s floorplans.&lt;br /&gt;
&lt;br /&gt;
== Important Code snippets ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Climate_Plugin::GetFloorplanDeviceInfo ===&lt;br /&gt;
This method determines what group of commands will be shown on right column beside floorplan. In the last if, it also determines what will be displayed on floorplan (OSD string is the content that will be displayed on floorplan)... It also determines the color of object on floorplan. But since state of climate device is something like QQ/WW/XX/YY/(ZZ) where :&lt;br /&gt;
#QQ      means ON or OFF state of device&lt;br /&gt;
#WW      means mode of operation for instance Thermostat: AUTO,HEAT,COOL,FAN_ONLY&lt;br /&gt;
#XX      means Fan mode: AUTO,HIGH&lt;br /&gt;
#YY      means Set point (usually desired temperature setting): integer number&lt;br /&gt;
#ZZ      means current temperature as reported by sensor, can be decimal number&lt;br /&gt;
&lt;br /&gt;
By default in &lt;br /&gt;
 if( (OSD=pDeviceData_Router-&amp;gt;m_sState_get())==&amp;quot;OFF&amp;quot; )&lt;br /&gt;
OSD is set to show all state info on floorplan. Also I think (need some guidance?) that state will never be just &amp;quot;OFF&amp;quot;, so all devices will be drawn with whole states and cold blue color on floorplans - but I could be missing something...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code of highlighted method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Climate_Plugin::GetFloorplanDeviceInfo(DeviceData_Router *pDeviceData_Router,EntertainArea *pEntertainArea,int iFloorplanObjectType,int &amp;amp;iPK_FloorplanObjectType_Color,int &amp;amp;Color,string &amp;amp;sDescription,string &amp;amp;OSD,int &amp;amp;PK_DesignObj_Toolbar)&lt;br /&gt;
{&lt;br /&gt;
	switch(iFloorplanObjectType)&lt;br /&gt;
	{&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_THERMOSTAT_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpThermostatControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_THERMOMETER_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=0;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_WEATHER_STATION_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=0;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_DAMPER_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=0;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_POOL_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpPoolControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_SPRINKLER_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpSprinklerControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	};&lt;br /&gt;
	if( (OSD=pDeviceData_Router-&amp;gt;m_sState_get())==&amp;quot;OFF&amp;quot; )&lt;br /&gt;
		iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_CLIMATE_THERMOSTAT_OFF_CONST;&lt;br /&gt;
	else&lt;br /&gt;
		iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_CLIMATE_THERMOSTAT_COOLING_CONST;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Climate_Plugin::PreprocessClimateMessage ===&lt;br /&gt;
&lt;br /&gt;
This one processes received messages/events. It can beclearly seen that currently following commands :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Set_Level_CONST )&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_On_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_Off_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Set_HeatCool_CONST )&lt;br /&gt;
			if( sState==&amp;quot;H&amp;quot; )&lt;br /&gt;
			else if( sState==&amp;quot;C&amp;quot; )&lt;br /&gt;
			else if( sState==&amp;quot;F&amp;quot; )&lt;br /&gt;
			else&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == COMMAND_Set_Fan_CONST )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and events &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID == EVENT_Temperature_Changed_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Set_Point_Chan_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Fan_Mode_Changed_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Mode_Changed_CONST )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
are processed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code of highlighted method:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Climate_Plugin::PreprocessClimateMessage(DeviceData_Router *pDevice,Message *pMessage)&lt;br /&gt;
{&lt;br /&gt;
	if( !pDevice || !pMessage || !pDevice-&amp;gt;WithinCategory(DEVICECATEGORY_Climate_Device_CONST) )&lt;br /&gt;
		return;&lt;br /&gt;
&lt;br /&gt;
	string sOn;&lt;br /&gt;
	string sMode;&lt;br /&gt;
	string sFan;&lt;br /&gt;
	string sSetPoint;&lt;br /&gt;
	string sTemp;&lt;br /&gt;
	GetStateVar(pDevice, sOn, sMode, sFan, sSetPoint, sTemp);&lt;br /&gt;
	&lt;br /&gt;
	// The State is in the format ON|OFF/SET TEMP (CURRENT TEMP)&lt;br /&gt;
	if( pMessage-&amp;gt;m_dwMessage_Type==MESSAGETYPE_COMMAND )&lt;br /&gt;
	{&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Set_Level_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_Level_CONST];&lt;br /&gt;
			if( sLevel.size()==0 )&lt;br /&gt;
				pMessage-&amp;gt;m_dwID=COMMAND_Generic_Off_CONST;&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				int iLevel = atoi(sLevel.c_str());&lt;br /&gt;
				if( sLevel[0]==&#039;+&#039; )&lt;br /&gt;
					iLevel = min(100, GetClimateLevel(pDevice,0)+iLevel);&lt;br /&gt;
				else if( sLevel[0]==&#039;-&#039; )&lt;br /&gt;
					iLevel = max(0, GetClimateLevel(pDevice,0)+iLevel);&lt;br /&gt;
&lt;br /&gt;
				if( iLevel==0 )&lt;br /&gt;
					pMessage-&amp;gt;m_dwID=COMMAND_Generic_Off_CONST;&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					pDevice-&amp;gt;m_sState_set(&amp;quot;ON/&amp;quot; + StringUtils::itos(iLevel) + GetTemperature(pDevice));&lt;br /&gt;
					pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_Level_CONST] = StringUtils::itos(iLevel);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_On_CONST )&lt;br /&gt;
			SetStateValue(pDevice, &amp;quot;ON&amp;quot;, sMode, sFan, sSetPoint, sTemp);&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_Off_CONST )&lt;br /&gt;
			SetStateValue(pDevice, &amp;quot;OFF&amp;quot;, sMode, sFan, sSetPoint, sTemp);&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Set_HeatCool_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: COMMAND_Set_HeatCool_CONST !&amp;quot;);&lt;br /&gt;
			string sState = pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_OnOff_CONST];&lt;br /&gt;
			if( sState==&amp;quot;H&amp;quot; )&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;HEAT&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
			else if( sState==&amp;quot;C&amp;quot; )&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;COOL&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
			else if( sState==&amp;quot;F&amp;quot; )&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;FAN_ONLY&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
			else&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;AUTO&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == COMMAND_Set_Fan_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: COMMAND_Set_Fan_CONST !&amp;quot;);&lt;br /&gt;
			string sState = pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_OnOff_CONST];&lt;br /&gt;
			if( 1 == atoi(sState.c_str()) )&lt;br /&gt;
			{&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;FAN_ONLY&amp;quot;, &amp;quot;HIGH&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;AUTO&amp;quot;, &amp;quot;AUTO&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else if( pMessage-&amp;gt;m_dwMessage_Type == MESSAGETYPE_EVENT )&lt;br /&gt;
	{&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID == EVENT_Temperature_Changed_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Temperature_Changed_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
			SetStateValue(pDevice, sOn, sMode, sFan, sSetPoint, sLevel);&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Set_Point_Chan_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Thermostat_Set_Point_Chan_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
			SetStateValue(pDevice, sOn, sMode, sFan, sLevel, sTemp);&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Fan_Mode_Changed_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Thermostat_Set_Point_Chan_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
			int iMode = atoi(sLevel.c_str());&lt;br /&gt;
			switch(iMode)&lt;br /&gt;
			{&lt;br /&gt;
				default:&lt;br /&gt;
				case 0:&lt;br /&gt;
				case 1:&lt;br /&gt;
					SetStateValue(pDevice, sOn, sMode, &amp;quot;AUTO&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
					&lt;br /&gt;
				case 2:&lt;br /&gt;
				case 3:&lt;br /&gt;
					SetStateValue(pDevice, sOn, sMode, &amp;quot;HIGH&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Mode_Changed_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Thermostat_Set_Point_Chan_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
				&lt;br /&gt;
			int iMode = atoi(sLevel.c_str());&lt;br /&gt;
			switch(iMode)&lt;br /&gt;
			{&lt;br /&gt;
				default:&lt;br /&gt;
				case 10:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;AUTO&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			&lt;br /&gt;
				case 1:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;HEAT&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			&lt;br /&gt;
				case 2:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;COOL&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			&lt;br /&gt;
				case 6:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;FAN_ONLY&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to use Climate devices in Orbiter ==&lt;br /&gt;
&lt;br /&gt;
== Potential problems with current content of Climate Plugin ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;My personal comment(Bulek): &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I think that Climate_Plugin::GetFloorplanDeviceInfo seems a bit unfinished. IT also displays all devices with all state info in same coldblue color, cause state is probably never just &amp;quot;OFF&amp;quot; as if clause is checking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;IMHO this is not convenient,it&#039;s not necessary to show all that info for instance for temperature sensors. This would be fairly easy to correct.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;My plans:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;I plan to correct that behaviour, if leading developers confirm, that this won&#039;t break anything else. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;I also plan to support use of more already defined colors like:&lt;br /&gt;
 Open 	CLIMATE_DAMPER_OPEN 		-256 			yellow&lt;br /&gt;
 Closed 	CLIMATE_DAMPER_CLOSED 	-4144960  		bright gray&lt;br /&gt;
 Off 	CLIMATE_THERMOSTAT_OFF 		-16777216               black&lt;br /&gt;
 Fan 	CLIMATE_THERMOSTAT_FAN 		-4144960  		bright gray&lt;br /&gt;
 Heating CLIMATE_THERMOSTAT_HEATING 	-65536 			red&lt;br /&gt;
 Cooling CLIMATE_THERMOSTAT_COOLING 	-16744256 		cold blue&lt;br /&gt;
&lt;br /&gt;
 On 	CLIMATE_SPRINKLER_ON 		-256 			yellow&lt;br /&gt;
 Off 	CLIMATE_SPRINKLER_OFF 		-8355712 		dark gray&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;More complicated to do opinion: I think that Thermostat is too complex including Heating,Cooling and Fan control. Maybe we also need some simpler devices like only heating thermostat and separate fan (ventilation control)...&lt;br /&gt;
&lt;br /&gt;
== Description of enhanced 710 plugin and ability to control displayed info on floorplans ==&lt;br /&gt;
Currently, I&#039;ve done this to enhance Climate Plugin under 710 (with the goal that changes will be in 810 too, when stable and finished)...I&#039;ve come up with quite flexible idea of controlling what is displayed on floorplans for Climate devices (this could be easily extended to all rendering plugins)...I&#039;ll be happy to hear your opinions (please post to coresponding thread in Developers forum).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I&#039;ve done this:&lt;br /&gt;
 - by default behaviour stays the same as before&lt;br /&gt;
 - if you add Extra parameters data to certain device, then you can control info displayed on floorplan by its content:&lt;br /&gt;
&lt;br /&gt;
Explanation:&lt;br /&gt;
&lt;br /&gt;
State for Climate devices consists of following parts ($x x=1..5, represents each part of current state information):&lt;br /&gt;
 OSD display format for Orbiter floorplan ($1=ON/OFF,$2=HEAT|COOL|FAN_ONLY|AUTO,$3=HIGH|AUTO,$4=SET TEMP ($5=CURRENT TEMP))&lt;br /&gt;
&lt;br /&gt;
for instance: default string value for displaying exactly the same info as it is know is :&lt;br /&gt;
 &#039;$1/$2/$3/$4 ($5)&#039;   - omit quotes when entering into Extra parameters!&lt;br /&gt;
&lt;br /&gt;
Climate device has a state consisting of five components: Active($1), Mode($2), FanMode($3),Setpoint($4),ActualTemp($5) and by default everything is displayed on floorplan... Now by changing this string you can easily control/select and add text info to floorplan - few examples :&lt;br /&gt;
 &#039;Outside ($5)&#039;     will display text Outside and then ActualTemp&lt;br /&gt;
 &#039;$2 ($4)&#039;            this is probably the thing for actual thermostat without fan....&lt;br /&gt;
&lt;br /&gt;
OSD string is changed from default - computed :&lt;br /&gt;
 - only if Extra parameters string exists&lt;br /&gt;
 - if they exist, $1..$5 are replaced by actual values one by one&lt;br /&gt;
 - everything else is intact...&lt;br /&gt;
&lt;br /&gt;
I&#039;ve tried to do this on my 710 system and must admit that now my floorplan is getting more user friendly and informative....&lt;br /&gt;
&lt;br /&gt;
What do you think about solution ?&lt;br /&gt;
&lt;br /&gt;
I also have an idea for further possible replacement of hardcoded states that are displayed on floorplans:&lt;br /&gt;
- for instance what if you don&#039;t like HEAT/COOL/AUTO, then you could set an replacement for them -something like&lt;br /&gt;
 &#039;$1/$2/$3/$4 ($5) ?$3|HEAT|High?$3|COOL|Low&#039;   - omit quotes!&lt;br /&gt;
&lt;br /&gt;
String consists of parts, determined by &#039;?&#039; character. First part (obligatory) determines how will be values displayed on floorplan, remaining parts determine potential substitutions of predefined states to text that will be displayed on floorplan. In mentioned case, when evaluating $3, state of &#039;HEAT&#039; is replaced by custom &#039;High&#039; and &#039;COOL&#039; is replaced by custom &#039;Low&#039;... &lt;br /&gt;
&lt;br /&gt;
I&#039;ll try to code this in next few days, although will be happy if someone more c++ experienced will give a hand...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[User:Bulek|Bulek]] 15:10, 2 December 2008 (CET)&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Climate_Plugin&amp;diff=16721</id>
		<title>Climate Plugin</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Climate_Plugin&amp;diff=16721"/>
		<updated>2008-12-15T15:46:19Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Climate]]&lt;br /&gt;
[[Category:LinuxMCE_Plugins]]&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
Climate plugin takes care of climate devices. Handles commands, events and sets according device states. It also gives content to Orbiter plugin when it renders Climate devices on Orbiter&#039;s floorplans.&lt;br /&gt;
&lt;br /&gt;
== Important Code snippets ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Climate_Plugin::GetFloorplanDeviceInfo ===&lt;br /&gt;
This method determines what group of commands will be shown on right column beside floorplan. In the last if, it also determines what will be displayed on floorplan (OSD string is the content that will be displayed on floorplan)... It also determines the color of object on floorplan. But since state of climate device is something like QQ/WW/XX/YY/(ZZ) where :&lt;br /&gt;
#QQ      means ON or OFF state of device&lt;br /&gt;
#WW      means mode of operation for instance Thermostat: AUTO,HEAT,COOL,FAN_ONLY&lt;br /&gt;
#XX      means Fan mode: AUTO,HIGH&lt;br /&gt;
#YY      means Set point (usually desired temperature setting): integer number&lt;br /&gt;
#ZZ      means current temperature as reported by sensor, can be decimal number&lt;br /&gt;
&lt;br /&gt;
By default in &lt;br /&gt;
 if( (OSD=pDeviceData_Router-&amp;gt;m_sState_get())==&amp;quot;OFF&amp;quot; )&lt;br /&gt;
OSD is set to show all state info on floorplan. Also I think (need some guidance?) that state will never be just &amp;quot;OFF&amp;quot;, so all devices will be drawn with whole states and cold blue color on floorplans - but I could be missing something...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code of highlighted method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Climate_Plugin::GetFloorplanDeviceInfo(DeviceData_Router *pDeviceData_Router,EntertainArea *pEntertainArea,int iFloorplanObjectType,int &amp;amp;iPK_FloorplanObjectType_Color,int &amp;amp;Color,string &amp;amp;sDescription,string &amp;amp;OSD,int &amp;amp;PK_DesignObj_Toolbar)&lt;br /&gt;
{&lt;br /&gt;
	switch(iFloorplanObjectType)&lt;br /&gt;
	{&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_THERMOSTAT_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpThermostatControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_THERMOMETER_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=0;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_WEATHER_STATION_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=0;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_DAMPER_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=0;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_POOL_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpPoolControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_SPRINKLER_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpSprinklerControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	};&lt;br /&gt;
	if( (OSD=pDeviceData_Router-&amp;gt;m_sState_get())==&amp;quot;OFF&amp;quot; )&lt;br /&gt;
		iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_CLIMATE_THERMOSTAT_OFF_CONST;&lt;br /&gt;
	else&lt;br /&gt;
		iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_CLIMATE_THERMOSTAT_COOLING_CONST;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Climate_Plugin::PreprocessClimateMessage ===&lt;br /&gt;
&lt;br /&gt;
This one processes received messages/events. It can beclearly seen that currently following commands :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Set_Level_CONST )&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_On_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_Off_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Set_HeatCool_CONST )&lt;br /&gt;
			if( sState==&amp;quot;H&amp;quot; )&lt;br /&gt;
			else if( sState==&amp;quot;C&amp;quot; )&lt;br /&gt;
			else if( sState==&amp;quot;F&amp;quot; )&lt;br /&gt;
			else&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == COMMAND_Set_Fan_CONST )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and events &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID == EVENT_Temperature_Changed_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Set_Point_Chan_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Fan_Mode_Changed_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Mode_Changed_CONST )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
are processed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code of highlighted method:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Climate_Plugin::PreprocessClimateMessage(DeviceData_Router *pDevice,Message *pMessage)&lt;br /&gt;
{&lt;br /&gt;
	if( !pDevice || !pMessage || !pDevice-&amp;gt;WithinCategory(DEVICECATEGORY_Climate_Device_CONST) )&lt;br /&gt;
		return;&lt;br /&gt;
&lt;br /&gt;
	string sOn;&lt;br /&gt;
	string sMode;&lt;br /&gt;
	string sFan;&lt;br /&gt;
	string sSetPoint;&lt;br /&gt;
	string sTemp;&lt;br /&gt;
	GetStateVar(pDevice, sOn, sMode, sFan, sSetPoint, sTemp);&lt;br /&gt;
	&lt;br /&gt;
	// The State is in the format ON|OFF/SET TEMP (CURRENT TEMP)&lt;br /&gt;
	if( pMessage-&amp;gt;m_dwMessage_Type==MESSAGETYPE_COMMAND )&lt;br /&gt;
	{&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Set_Level_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_Level_CONST];&lt;br /&gt;
			if( sLevel.size()==0 )&lt;br /&gt;
				pMessage-&amp;gt;m_dwID=COMMAND_Generic_Off_CONST;&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				int iLevel = atoi(sLevel.c_str());&lt;br /&gt;
				if( sLevel[0]==&#039;+&#039; )&lt;br /&gt;
					iLevel = min(100, GetClimateLevel(pDevice,0)+iLevel);&lt;br /&gt;
				else if( sLevel[0]==&#039;-&#039; )&lt;br /&gt;
					iLevel = max(0, GetClimateLevel(pDevice,0)+iLevel);&lt;br /&gt;
&lt;br /&gt;
				if( iLevel==0 )&lt;br /&gt;
					pMessage-&amp;gt;m_dwID=COMMAND_Generic_Off_CONST;&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					pDevice-&amp;gt;m_sState_set(&amp;quot;ON/&amp;quot; + StringUtils::itos(iLevel) + GetTemperature(pDevice));&lt;br /&gt;
					pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_Level_CONST] = StringUtils::itos(iLevel);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_On_CONST )&lt;br /&gt;
			SetStateValue(pDevice, &amp;quot;ON&amp;quot;, sMode, sFan, sSetPoint, sTemp);&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_Off_CONST )&lt;br /&gt;
			SetStateValue(pDevice, &amp;quot;OFF&amp;quot;, sMode, sFan, sSetPoint, sTemp);&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Set_HeatCool_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: COMMAND_Set_HeatCool_CONST !&amp;quot;);&lt;br /&gt;
			string sState = pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_OnOff_CONST];&lt;br /&gt;
			if( sState==&amp;quot;H&amp;quot; )&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;HEAT&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
			else if( sState==&amp;quot;C&amp;quot; )&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;COOL&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
			else if( sState==&amp;quot;F&amp;quot; )&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;FAN_ONLY&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
			else&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;AUTO&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == COMMAND_Set_Fan_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: COMMAND_Set_Fan_CONST !&amp;quot;);&lt;br /&gt;
			string sState = pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_OnOff_CONST];&lt;br /&gt;
			if( 1 == atoi(sState.c_str()) )&lt;br /&gt;
			{&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;FAN_ONLY&amp;quot;, &amp;quot;HIGH&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;AUTO&amp;quot;, &amp;quot;AUTO&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else if( pMessage-&amp;gt;m_dwMessage_Type == MESSAGETYPE_EVENT )&lt;br /&gt;
	{&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID == EVENT_Temperature_Changed_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Temperature_Changed_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
			SetStateValue(pDevice, sOn, sMode, sFan, sSetPoint, sLevel);&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Set_Point_Chan_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Thermostat_Set_Point_Chan_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
			SetStateValue(pDevice, sOn, sMode, sFan, sLevel, sTemp);&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Fan_Mode_Changed_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Thermostat_Set_Point_Chan_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
			int iMode = atoi(sLevel.c_str());&lt;br /&gt;
			switch(iMode)&lt;br /&gt;
			{&lt;br /&gt;
				default:&lt;br /&gt;
				case 0:&lt;br /&gt;
				case 1:&lt;br /&gt;
					SetStateValue(pDevice, sOn, sMode, &amp;quot;AUTO&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
					&lt;br /&gt;
				case 2:&lt;br /&gt;
				case 3:&lt;br /&gt;
					SetStateValue(pDevice, sOn, sMode, &amp;quot;HIGH&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Mode_Changed_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Thermostat_Set_Point_Chan_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
				&lt;br /&gt;
			int iMode = atoi(sLevel.c_str());&lt;br /&gt;
			switch(iMode)&lt;br /&gt;
			{&lt;br /&gt;
				default:&lt;br /&gt;
				case 10:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;AUTO&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			&lt;br /&gt;
				case 1:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;HEAT&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			&lt;br /&gt;
				case 2:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;COOL&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			&lt;br /&gt;
				case 6:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;FAN_ONLY&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to use Climate devices in Orbiter ==&lt;br /&gt;
&lt;br /&gt;
== Potential problems with current content of Climate Plugin ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;My personal comment(Bulek): &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I think that Climate_Plugin::GetFloorplanDeviceInfo seems a bit unfinished. IT also displays all devices with all state info in same coldblue color, cause state is probably never just &amp;quot;OFF&amp;quot; as if clause is checking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;IMHO this is not convenient,it&#039;s not necessary to show all that info for instance for temperature sensors. This would be fairly easy to correct.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;My plans:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;I plan to correct that behaviour, if leading developers confirm, that this won&#039;t break anything else. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;I also plan to support use of more already defined colors like:&lt;br /&gt;
 Open 	CLIMATE_DAMPER_OPEN 		-256 			yellow&lt;br /&gt;
 Closed 	CLIMATE_DAMPER_CLOSED 	-4144960  		bright gray&lt;br /&gt;
 Off 	CLIMATE_THERMOSTAT_OFF 		-16777216               black&lt;br /&gt;
 Fan 	CLIMATE_THERMOSTAT_FAN 		-4144960  		bright gray&lt;br /&gt;
 Heating CLIMATE_THERMOSTAT_HEATING 	-65536 			red&lt;br /&gt;
 Cooling CLIMATE_THERMOSTAT_COOLING 	-16744256 		cold blue&lt;br /&gt;
&lt;br /&gt;
 On 	CLIMATE_SPRINKLER_ON 		-256 			yellow&lt;br /&gt;
 Off 	CLIMATE_SPRINKLER_OFF 		-8355712 		dark gray&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;More complicated to do opinion: I think that Thermostat is too complex including Heating,Cooling and Fan control. Maybe we also need some simpler devices like only heating thermostat and separate fan (ventilation control)...&lt;br /&gt;
&lt;br /&gt;
== Description of enhanced 710 plugin and ability to control displayed info on floorplans ==&lt;br /&gt;
Currently, I&#039;ve done this to enhance Climate Plugin under 710 (with the goal that changes will be in 810 too, when stable and finished)...I&#039;ve come up with quite flexible idea of controlling what is displayed on floorplans for Climate devices (this could be easily extended to all rendering plugins)...I&#039;ll be happy to hear your opinions (please post to coresponding thread in Developers forum).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I&#039;ve done this:&lt;br /&gt;
 - by default behaviour stays the same as before&lt;br /&gt;
 - if you add Extra parameters data to certain device, then you can control info displayed on floorplan by its content:&lt;br /&gt;
&lt;br /&gt;
Explanation:&lt;br /&gt;
&lt;br /&gt;
State for Climate devices consists of following parts ($x x=1..5, represents each part of current state information):&lt;br /&gt;
OSD display format for Orbiter floorplan ($1=ON/OFF,$2=HEAT|COOL|FAN_ONLY|AUTO,$3=HIGH|AUTO,$4=SET TEMP ($5=CURRENT TEMP))&lt;br /&gt;
&lt;br /&gt;
for instance: default string value for displaying exactly the same info as it is know is :&lt;br /&gt;
&#039;$1/$2/$3/$4 ($5)&#039;   - omit quotes when entering into Extra parameters!&lt;br /&gt;
&lt;br /&gt;
Climate device has a state consisting of five components: Active($1), Mode($2), FanMode($3),Setpoint($4),ActualTemp($5) and by default everything is displayed on floorplan... Now by changing this string you can easily control/select and add text info to floorplan - few examples :&lt;br /&gt;
&#039;Outside ($5)&#039;     will display text Outside and then ActualTemp&lt;br /&gt;
&#039;$2 ($4)&#039;            this is probably the thing for actual thermostat without fan....&lt;br /&gt;
&lt;br /&gt;
OSD string is changed from default - computed :&lt;br /&gt;
- only if Extra parameters string exists&lt;br /&gt;
- if they exist, $1..$5 are replaced by actual values one by one&lt;br /&gt;
- everything else is intact...&lt;br /&gt;
&lt;br /&gt;
I&#039;ve tried to do this on my 710 system and must admit that now my floorplan is getting more user friendly and informative....&lt;br /&gt;
&lt;br /&gt;
What do you think about solution ?&lt;br /&gt;
&lt;br /&gt;
I also have an idea for further possible replacement of hardcoded states that are displayed on floorplans:&lt;br /&gt;
- for instance what if you don&#039;t like HEAT/COOL/AUTO, then you could set an replacement for them -something like&lt;br /&gt;
&#039;$1/$2/$3/$4 ($5) ?$3|HEAT|High?$3|COOL|Low&#039;   - omit quotes!&lt;br /&gt;
&lt;br /&gt;
String consists of parts, determined by &#039;?&#039; character. First part (obligatory) determines how will be values displayed on floorplan, remaining parts determine potential substitutions of predefined states to text that will be displayed on floorplan. In mentioned case, when evaluating $3, state of &#039;HEAT&#039; is replaced by custom &#039;High&#039; and &#039;COOL&#039; is replaced by custom &#039;Low&#039;... &lt;br /&gt;
&lt;br /&gt;
I&#039;ll try to code this in next few days, although will be happy if someone more c++ experienced will give a hand...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[User:Bulek|Bulek]] 15:10, 2 December 2008 (CET)&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Misterhouse&amp;diff=16582</id>
		<title>Misterhouse</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Misterhouse&amp;diff=16582"/>
		<updated>2008-12-07T21:35:00Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* Integration with LMCE */&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:Tutorials]]&lt;br /&gt;
[[Category:Automation]]&lt;br /&gt;
[http://www.misterhouse.com Misterhouse] is a great integrated Home automation program and much more.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Template ===&lt;br /&gt;
It seems that template for Misterhouse is already in LMCE - I only needed to add Computers to &amp;quot;controlled by category&amp;quot;, so it can be added as child of Core or MD...&lt;br /&gt;
&lt;br /&gt;
In template, there is an &amp;quot;/usr/local/misterhouse/start.sh&amp;quot; entry in Command line data- that means that LMCE will start this script and therefore also misterhouse. Installation should be made regarding this fact.&lt;br /&gt;
&lt;br /&gt;
=== HowTo ===&lt;br /&gt;
Currently there are no Ubuntu packages for MH, so it has to be installed from scratch. An detailed guide can be found on Misterhouse&#039;s site, I also have found isntructions for ubuntu and MH [http://misterhouse.wikispaces.com/MisterhouseOnUbuntu MisterhouseOnUbuntu]&lt;br /&gt;
&lt;br /&gt;
== Integration with LMCE ==&lt;br /&gt;
Here&#039;s a dirty code snippet for LinuxMCE&#039;s listener script under Misterhouse. Be careful since it intercepts all messages and that could become quite greedy... &lt;br /&gt;
&lt;br /&gt;
Before using this script you have to add listener as device under LinuxMCE as explained in LinuxMCE&#039;s docs...&lt;br /&gt;
You have to follow first few steps from LinuxMCE&#039;s text message intercepting tutorial (create logic handler device) and then add this script to your Misterhouse setup :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Category=LinuxMCE&lt;br /&gt;
#&lt;br /&gt;
#@ Connection with LinuxMCE DCE Router via TCP port localhost:3450 (mh.ini -&amp;gt; pluto_DCE_router). &lt;br /&gt;
#&lt;br /&gt;
use strict;&lt;br /&gt;
&lt;br /&gt;
############################################################################## &lt;br /&gt;
$pluto_event_receiver = new  Socket_Item(undef, undef, &#039;193.77.90.224:3450&#039;,&#039;event_receiver&#039;,&#039;tcp&#039;,&#039;record&#039;);&lt;br /&gt;
&lt;br /&gt;
$pluto_command_sender = new  Socket_Item(undef, undef, &#039;193.77.90.224:3450&#039;,&#039;command_sender&#039;,&#039;tcp&#039;,&#039;record&#039;);&lt;br /&gt;
&lt;br /&gt;
if ($Startup) {&lt;br /&gt;
	start $pluto_event_receiver;&lt;br /&gt;
        set $pluto_event_receiver &amp;quot;COMMAND 6778&amp;quot;;&lt;br /&gt;
        	&lt;br /&gt;
	start $pluto_command_sender;&lt;br /&gt;
	set $pluto_command_sender &amp;quot;EVENT 6778&amp;quot;;&lt;br /&gt;
	set $pluto_command_sender &amp;quot;PLAIN_TEXT&amp;quot;;&lt;br /&gt;
# purge other interceptors on same device ID&lt;br /&gt;
#	set $pluto_command_sender &amp;quot;MESSAGET 13&amp;quot;;&lt;br /&gt;
#	set $pluto_command_sender &amp;quot;6778 -1000 13&amp;quot;;&lt;br /&gt;
	send_command_to_pluto(&amp;quot;6778 -1000 13&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# intercepts all messages, I guess it&#039;s better to be selective here !!!!	&lt;br /&gt;
#	set $pluto_command_sender &amp;quot;MESSAGET 22&amp;quot;;&lt;br /&gt;
#	set $pluto_command_sender &amp;quot;6778 -1000 8 0 0 0 0 0&amp;quot;;&lt;br /&gt;
	send_command_to_pluto(&amp;quot;6778 -1000 8 0 0 0 0 0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
     &lt;br /&gt;
sub send_command_to_pluto {&lt;br /&gt;
 my ($message) = @_;&lt;br /&gt;
	set $pluto_command_sender &amp;quot;MESSAGET &amp;quot; . length ($message);&lt;br /&gt;
	set $pluto_command_sender $message;&lt;br /&gt;
        print_log &amp;quot;Sending Command to Pluto DCE : $message\n&amp;quot;;&lt;br /&gt;
        print     &amp;quot;Sending Command to Pluto DCE : $message\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (my $msg = said $pluto_event_receiver) {&lt;br /&gt;
        print_log &amp;quot;Pluto Event received: $msg\n&amp;quot;;&lt;br /&gt;
        print      &amp;quot;Pluto Event received: $msg\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some additional work on this matter is described on forum threads here :&lt;br /&gt;
[http://forum.linuxmce.org/index.php?topic=3573.0]&lt;br /&gt;
[http://forum.linuxmce.org/index.php?topic=391.0]&lt;br /&gt;
[http://forum.linuxmce.org/index.php?topic=1884.0]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Adding some useful snippets :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (my $msg = said $pluto_device_event_receiver) {&lt;br /&gt;
        print_log &amp;quot;Pluto Device Message received: $msg\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        $msg =~ s/[\&amp;quot;\&#039;]//g;    # remove quotes before splitting on whitespace&lt;br /&gt;
&lt;br /&gt;
        if ($msg =~/(\w*)\s(\w*)\s(\w*)\s(\w*)\s(\w*)\s(\w*)\s(\w*)\s(\w*)/ ) {&lt;br /&gt;
                print_log &amp;quot;DeviceFrom: $1&amp;quot;;&lt;br /&gt;
                print_log &amp;quot;DeviceTo:: $2&amp;quot;;&lt;br /&gt;
                print_log &amp;quot;MsgType: $3 (1=Command, 2=Event)&amp;quot;;&lt;br /&gt;
                print_log &amp;quot;MsgId: $4&amp;quot;;&lt;br /&gt;
                print_log &amp;quot;param1id: $5&amp;quot;;&lt;br /&gt;
                print_log &amp;quot;param2value (X10 Device): $6&amp;quot;;&lt;br /&gt;
                print_log &amp;quot;param2id: $7&amp;quot;;&lt;br /&gt;
                print_log &amp;quot;param2value (X10 Command): $8&amp;quot;;&lt;br /&gt;
                if ($8 == &#039;192&#039;) {&lt;br /&gt;
                  print_log &amp;quot;Turn $6 ON&amp;quot;;&lt;br /&gt;
                  set $6 ON;&lt;br /&gt;
                }&lt;br /&gt;
                if ($8 == &#039;193&#039;) {&lt;br /&gt;
                  print_log &amp;quot;Turn $6 OFF&amp;quot;;&lt;br /&gt;
                  set $6 OFF;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Category=Pluto&lt;br /&gt;
#&lt;br /&gt;
#@ Connection with Pluto DCE Router via TCP port localhost:3450 (mh.ini -&amp;gt; pluto_DCE_router).&lt;br /&gt;
#&lt;br /&gt;
use strict;&lt;br /&gt;
$restartTimer = new Timer;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
##############################################################################&lt;br /&gt;
&lt;br /&gt;
sub connect_lmce {&lt;br /&gt;
        print_log &amp;quot;Configuring sockets&amp;quot;;&lt;br /&gt;
        $pluto_device_event_receiver = new  Socket_Item(undef, undef, &#039;192.168.1.1:3450&#039;,&#039;device_event_receiver&#039;,&#039;tcp&#039;,&#039;record&#039;);&lt;br /&gt;
        $pluto_device_command_sender = new  Socket_Item(undef, undef, &#039;192.168.1.1:3450&#039;,&#039;device_command_sender&#039;,&#039;tcp&#039;,&#039;record&#039;);&lt;br /&gt;
&lt;br /&gt;
        print_log &amp;quot;Closing sockets if any left open&amp;quot;;&lt;br /&gt;
        if (active_now $pluto_device_event_receiver) {stop $pluto_device_event_receiver;}&lt;br /&gt;
        if (active_now $pluto_device_command_sender) {stop $pluto_device_command_sender;}&lt;br /&gt;
&lt;br /&gt;
        print_log &amp;quot;Open and setup new sockets&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        start $pluto_device_event_receiver;&lt;br /&gt;
        set $pluto_device_event_receiver &amp;quot;COMMAND 179&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        start $pluto_device_command_sender;&lt;br /&gt;
        set $pluto_device_command_sender &amp;quot;EVENT 179&amp;quot;;&lt;br /&gt;
        set $pluto_device_command_sender &amp;quot;PLAIN_TEXT&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ($Startup) {&lt;br /&gt;
        print_log &amp;quot;Starting connection to LMCE&amp;quot;;&lt;br /&gt;
        set $restartTimer 10, sub {connect_lmce;};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (inactive_now $pluto_device_event_receiver or inactive_now $pluto_device_command_sender) {&lt;br /&gt;
        print_log &amp;quot;Connection to LMCE terminated, restarting&amp;quot;;&lt;br /&gt;
        set $restartTimer 10, sub {connect_lmce;};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (new_minute 1 and !active $pluto_device_event_receiver or new_minute 1 and !active $pluto_device_command_sender) {&lt;br /&gt;
        print_log &amp;quot;Connection to LMCE still terminated, restarting&amp;quot;;&lt;br /&gt;
        connect_lmce;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#my $motion=0;&lt;br /&gt;
&lt;br /&gt;
if (my $msg = said $pluto_device_event_receiver) {&lt;br /&gt;
        print_log &amp;quot;Pluto Device Message received: $msg\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        $msg =~ s/[\&amp;quot;\&#039;]//g;    # remove quotes before splitting on whitespace&lt;br /&gt;
&lt;br /&gt;
        if ($msg =~/(\w*)\s(\w*)\s(\w*)\s(\w*)\s(\w*)\s(\w*)\s(\w*)\s(\w*)/ or $msg =~/(\w*)\s(\w*)\s(\w*)\s(\w*)\s(\w*)\s(\w*)/) {&lt;br /&gt;
                print_log &amp;quot;DeviceFrom: $1&amp;quot;;&lt;br /&gt;
                print_log &amp;quot;DeviceTo: $2&amp;quot;;&lt;br /&gt;
                print_log &amp;quot;MsgType: $3 (1=Command, 2=Event)&amp;quot;;&lt;br /&gt;
                print_log &amp;quot;MsgId: $4&amp;quot;;&lt;br /&gt;
                print_log &amp;quot;param1id: $5&amp;quot;;&lt;br /&gt;
                print_log &amp;quot;param2value: $6&amp;quot;;&lt;br /&gt;
                if (defined $7) { print_log &amp;quot;param2id: $7&amp;quot;;}&lt;br /&gt;
                if (defined $8) { print_log &amp;quot;param2value: $8&amp;quot;;}&lt;br /&gt;
&lt;br /&gt;
                #############################################################&lt;br /&gt;
                # $1    $2      $3      $4      $5      $6      $7      $8&lt;br /&gt;
                # from  to      msgtype msgid   p1id    p1val   p2id    p2val&lt;br /&gt;
                # Example command from orbiter&lt;br /&gt;
                # 69    206     1       192     97      &amp;quot;&amp;quot;      98      &amp;quot;&amp;quot;&lt;br /&gt;
                # 69    206     1       193     97      &amp;quot;&amp;quot;&lt;br /&gt;
                # 69    205     1       184     76      &amp;quot;100&amp;quot;&lt;br /&gt;
                # Example command from admin site&lt;br /&gt;
                # 0     204     1       760     10      &amp;quot;C2&amp;quot;    154     &amp;quot;192&amp;quot;&lt;br /&gt;
                # 0     204     1       760     10      &amp;quot;C2&amp;quot;    154     &amp;quot;193&amp;quot;&lt;br /&gt;
                #############################################################&lt;br /&gt;
&lt;br /&gt;
                my $target;&lt;br /&gt;
                my $x10_id;&lt;br /&gt;
&lt;br /&gt;
                if ($2 == &#039;162&#039;) { $x10_id = &#039;A5&#039;; }&lt;br /&gt;
                if ($2 == &#039;186&#039;) { $x10_id = &#039;A3&#039;; }&lt;br /&gt;
                if ($2 == &#039;187&#039;) { $x10_id = &#039;B1&#039;; }&lt;br /&gt;
                if ($2 == &#039;188&#039;) { $x10_id = &#039;A8&#039;; }&lt;br /&gt;
                if ($2 == &#039;189&#039;) { $x10_id = &#039;B3&#039;; }&lt;br /&gt;
                if ($2 == &#039;190&#039;) { $x10_id = &#039;B4&#039;; }&lt;br /&gt;
                if ($2 == &#039;191&#039;) { $x10_id = &#039;A10&#039;; }&lt;br /&gt;
                if ($2 == &#039;192&#039;) { $x10_id = &#039;A9&#039;; }&lt;br /&gt;
                if ($2 == &#039;218&#039;) { $x10_id = &#039;A6&#039;; }&lt;br /&gt;
                if (defined $x10_id) { $target = new X10_Item(&amp;quot;$x10_id&amp;quot;);}&lt;br /&gt;
&lt;br /&gt;
                if ($4 == &#039;760&#039; ) { $target = new X10_Item(&amp;quot;$6&amp;quot;);}&lt;br /&gt;
&lt;br /&gt;
                if ($8 == &#039;192&#039; or $4 == &#039;192&#039;) {&lt;br /&gt;
                  print_log &amp;quot;Turn device $x10_id ON&amp;quot;;&lt;br /&gt;
                  set $target ON;&lt;br /&gt;
                }&lt;br /&gt;
                if ($8 == &#039;193&#039; or $4 == &#039;193&#039;) {&lt;br /&gt;
                  print_log &amp;quot;Turn device $x10_id OFF&amp;quot;;&lt;br /&gt;
                  set $target OFF;&lt;br /&gt;
                }&lt;br /&gt;
                if ($4 == &#039;184&#039;) {&lt;br /&gt;
                  print_log &amp;quot;Setting device $x10_id to $6%&amp;quot;;&lt;br /&gt;
                  set $target &amp;quot;$6%&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub send_pluto_message {&lt;br /&gt;
        my($message) = @_;&lt;br /&gt;
        set $pluto_device_command_sender &amp;quot;MESSAGET &amp;quot; . length ($message);&lt;br /&gt;
        set $pluto_device_command_sender $message;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub update_temp {&lt;br /&gt;
        # Example message@&lt;br /&gt;
        # 167=temp sensor ID, 2=event, 25=event ID (temp changed), 30=value, temperature (string)&lt;br /&gt;
        # my $message = sprintf(&amp;quot;167 -1000 2 25 30 %d.2&amp;quot;,$random_number);&lt;br /&gt;
&lt;br /&gt;
        my($sensor, $temp) = @_;&lt;br /&gt;
        my $lmce_device;&lt;br /&gt;
&lt;br /&gt;
        ### map iButtons to lmce device numbers - there are better ways of doing this! ###&lt;br /&gt;
        if ($sensor == 0) { $lmce_device = 166; }&lt;br /&gt;
        if ($sensor == 1) { $lmce_device = 167; }&lt;br /&gt;
&lt;br /&gt;
        my $message = sprintf(&amp;quot;$lmce_device -1000 2 25 30 %d.2&amp;quot;,$temp);&lt;br /&gt;
        send_pluto_message($message);&lt;br /&gt;
        print_log &amp;quot;Updating sensor $lmce_device $temp&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub lmce_motion {&lt;br /&gt;
        my($device_id) = @_;&lt;br /&gt;
        # 6780=Detector ID, 2=event, 9=event ID (tripped), 25=tripped value, 0=value (tripped OFF)&lt;br /&gt;
        my $message = &amp;quot;$device_id -1000 2 9 25 0&amp;quot;;&lt;br /&gt;
        send_pluto_message($message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub lmce_still {&lt;br /&gt;
        my($device_id) = @_;&lt;br /&gt;
        # 6780=Detector ID, 2=event, 9=event ID (tripped), 25=tripped value, 1=value (tripped ON)&lt;br /&gt;
        my $message = &amp;quot;$device_id -1000 2 9 25 1&amp;quot;;&lt;br /&gt;
        send_pluto_message($message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ($state = state_now $Kitchen_Motion) {&lt;br /&gt;
  if ($state eq MOTION) {&lt;br /&gt;
        lmce_motion(185);&lt;br /&gt;
  }&lt;br /&gt;
  if ($state eq STILL) {&lt;br /&gt;
        lmce_still(185);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ($state = state_now $Landing_Motion) {&lt;br /&gt;
  if ($state eq MOTION) {&lt;br /&gt;
        lmce_motion(184);&lt;br /&gt;
  }&lt;br /&gt;
  if ($state eq STILL) {&lt;br /&gt;
        lmce_still(184);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ($state = state_now $Hall_Motion) {&lt;br /&gt;
  if ($state eq MOTION) {&lt;br /&gt;
        lmce_motion(183);&lt;br /&gt;
  }&lt;br /&gt;
  if ($state eq STILL) {&lt;br /&gt;
        lmce_still(183);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if ($msg =~/(\w*)\s(\w*)\s(\w*)\s(\w*)\s(\w*)\s(\w*)\s(\w*)\s(\w*)/ or $msg =~/(\w*)\s(\w*)\s(\w*)\s(\w*)\s(\w*)\s(\w*)/&lt;br /&gt;
                        or $msg =~/(\w*)\s(\w*)\s(\w*)\s(\w*)/ ) {&lt;br /&gt;
                print_log &amp;quot;DeviceFrom: $1&amp;quot;;&lt;br /&gt;
                print_log &amp;quot;DeviceTo: $2&amp;quot;;&lt;br /&gt;
                print_log &amp;quot;MsgType: $3 (1=Command, 2=Event)&amp;quot;;&lt;br /&gt;
                print_log &amp;quot;MsgId: $4&amp;quot;;&lt;br /&gt;
                if (defined $5) { print_log &amp;quot;param1id: $5&amp;quot;;}&lt;br /&gt;
                if (defined $6) { print_log &amp;quot;param2value: $6&amp;quot;;}&lt;br /&gt;
                if (defined $7) { print_log &amp;quot;param2id: $7&amp;quot;;}&lt;br /&gt;
                if (defined $8) { print_log &amp;quot;param2value: $8&amp;quot;;}&lt;br /&gt;
&lt;br /&gt;
                #############################################################&lt;br /&gt;
                # $1    $2      $3      $4      $5      $6      $7      $8&lt;br /&gt;
                # from  to      msgtype msgid   p1id    p1val   p2id    p2val&lt;br /&gt;
                # Example command from orbiter&lt;br /&gt;
                # 69    206     1       192     97      &amp;quot;&amp;quot;      98      &amp;quot;&amp;quot;&lt;br /&gt;
                # 69    206     1       193     97      &amp;quot;&amp;quot;&lt;br /&gt;
                # 69    205     1       184     76      &amp;quot;100&amp;quot;&lt;br /&gt;
                # 69    218     1       193&lt;br /&gt;
                # Example command from admin site&lt;br /&gt;
                # 0     204     1       760     10      &amp;quot;C2&amp;quot;    154     &amp;quot;192&amp;quot;&lt;br /&gt;
                # 0     204     1       760     10      &amp;quot;C2&amp;quot;    154     &amp;quot;193&amp;quot;&lt;br /&gt;
                #############################################################&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It seems this is the most current version of MH connecting to LMCE:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Category=Pluto&lt;br /&gt;
#&lt;br /&gt;
#@ Connection with Pluto DCE Router via TCP port localhost:3450 (mh.ini -&amp;gt; pluto_DCE_router).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# strict Perl syntax&lt;br /&gt;
use strict;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Use timer.&lt;br /&gt;
$restartTimer = new Timer;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if($Startup)&lt;br /&gt;
{&lt;br /&gt;
        print_log &amp;quot;Starting connection to LMCE&amp;quot;;&lt;br /&gt;
        set $restartTimer 10, sub {connect_lmce;};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if&lt;br /&gt;
(&lt;br /&gt;
        inactive_now($pluto_device_event_receiver) ||&lt;br /&gt;
        inactive_now($pluto_device_command_sender)&lt;br /&gt;
)&lt;br /&gt;
{&lt;br /&gt;
        print_log &amp;quot;Connection to LMCE terminated, restarting&amp;quot;;&lt;br /&gt;
        set $restartTimer 10, sub {connect_lmce;};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Should parenthesize &amp;amp;&amp;amp;/|| expressions to make precedence explicit&lt;br /&gt;
if(new_minute 1 &amp;amp;&amp;amp; !active $pluto_device_event_receiver || new_minute 1 &amp;amp;&amp;amp; !active $pluto_device_command_sender)&lt;br /&gt;
{&lt;br /&gt;
        print_log &amp;quot;Connection to LMCE still terminated, restarting&amp;quot;;&lt;br /&gt;
        connect_lmce();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#my $motion=0;&lt;br /&gt;
&lt;br /&gt;
if(my($msg) = said($pluto_device_event_receiver))&lt;br /&gt;
{ # Process message.&lt;br /&gt;
        print_log &amp;quot;Pluto Device Message received: $msg\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        # Remove quotes before splitting on whitespace.&lt;br /&gt;
        $msg =~ s/[\&amp;quot;\&#039;]//g;&lt;br /&gt;
&lt;br /&gt;
        #############################################################&lt;br /&gt;
        # message Parameters as ordered fields&lt;br /&gt;
        #############################################################&lt;br /&gt;
        # $1    $2      $3      $4      $5      $6      $7      $8&lt;br /&gt;
        # from  to      msgtype msgid   p1id    p1val   p2id    p2val&lt;br /&gt;
        #############################################################&lt;br /&gt;
        # Example command from orbiter&lt;br /&gt;
        # 69    206     1       192     97      &amp;quot;&amp;quot;      98      &amp;quot;&amp;quot;&lt;br /&gt;
        # 69    206     1       193     97      &amp;quot;&amp;quot;&lt;br /&gt;
        # 69    205     1       184     76      &amp;quot;100&amp;quot;&lt;br /&gt;
        # Example command from admin site&lt;br /&gt;
        # 0     204     1       760     10      &amp;quot;C2&amp;quot;    154     &amp;quot;192&amp;quot;&lt;br /&gt;
        # 0     204     1       760     10      &amp;quot;C2&amp;quot;    154     &amp;quot;193&amp;quot;&lt;br /&gt;
        #############################################################&lt;br /&gt;
&lt;br /&gt;
        # Decode message into required and optional fields as validation.&lt;br /&gt;
        my&lt;br /&gt;
        (&lt;br /&gt;
                $reqFieldsPat = &#039;(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)&#039;;&lt;br /&gt;
                $optFieldsPat = &#039;\s*(\w*)\s*(\w*)&#039;;&lt;br /&gt;
        );&lt;br /&gt;
        if&lt;br /&gt;
        (&lt;br /&gt;
                my&lt;br /&gt;
                (&lt;br /&gt;
                        # required fields&lt;br /&gt;
                        $deviceFrom, $deviceTo, $msgType, $msgId,&lt;br /&gt;
                        $param1Id, $param1Value,&lt;br /&gt;
&lt;br /&gt;
                        # optional fields&lt;br /&gt;
                        $param2Id, $param2Value&lt;br /&gt;
                )&lt;br /&gt;
                = ($msg =~ /$reqFieldsPat$optFieldsPat/)&lt;br /&gt;
        )&lt;br /&gt;
        { # Process valid message.&lt;br /&gt;
                %msgTypes =&lt;br /&gt;
                {&lt;br /&gt;
                        &#039;1&#039; =&amp;gt; &#039;Command&#039;,&lt;br /&gt;
                        &#039;2&#039; =&amp;gt; &#039;Event&#039;&lt;br /&gt;
                };&lt;br /&gt;
                $msgType .=&lt;br /&gt;
                        &#039;: &#039; . defined($msgTypes{$msgType})?&lt;br /&gt;
                                        $msgTypes{$msgType} : &#039;unknown type&#039;;&lt;br /&gt;
&lt;br /&gt;
                # Log required fields.&lt;br /&gt;
                print_log &amp;lt;&amp;lt;EOT;&lt;br /&gt;
DeviceFrom: $deviceFrom&lt;br /&gt;
DeviceTo: $deviceTo&lt;br /&gt;
MsgType: $msgType&lt;br /&gt;
MsgId: $msgId&lt;br /&gt;
param1id: $param1Id&lt;br /&gt;
param2value: $param1Val&lt;br /&gt;
EOT&lt;br /&gt;
&lt;br /&gt;
                # Log optional fields.&lt;br /&gt;
                if(defined($param2Id))&lt;br /&gt;
                {&lt;br /&gt;
                        print_log &amp;quot;param2id: $$param2Id&amp;quot;;&lt;br /&gt;
                        print_log &#039;param2value: &#039; .&lt;br /&gt;
                                (defined($param2Val))? $param2Val : &#039;undefined&#039;;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                # Use X10 ID as target.&lt;br /&gt;
                my($target);&lt;br /&gt;
                my $x10_id;&lt;br /&gt;
                %dev2x10 =&lt;br /&gt;
                { # device ID to X10 ID&lt;br /&gt;
                        &#039;162&#039; =&amp;gt; &#039;A5&#039;,&lt;br /&gt;
                        &#039;186&#039; =&amp;gt; &#039;A3&#039;,&lt;br /&gt;
                        &#039;187&#039; =&amp;gt; &#039;B1&#039;,&lt;br /&gt;
                        &#039;188&#039; =&amp;gt; &#039;A8&#039;,&lt;br /&gt;
                        &#039;189&#039; =&amp;gt; &#039;B3&#039;,&lt;br /&gt;
                        &#039;190&#039; =&amp;gt; &#039;B4&#039;,&lt;br /&gt;
                        &#039;191&#039; =&amp;gt; &#039;A10&#039;,&lt;br /&gt;
                        &#039;192&#039; =&amp;gt; &#039;A9&#039;,&lt;br /&gt;
                        &#039;218&#039; =&amp;gt; &#039;A6&#039;&lt;br /&gt;
                }; # dev2x10&lt;br /&gt;
&lt;br /&gt;
                $x10_id = $dev2x10{$deviceTo};&lt;br /&gt;
                if(defined($x10_id))&lt;br /&gt;
                {&lt;br /&gt;
                        $target = new X10_Item($x10_id);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                # Probably can convert arbitrary msgID / setting rules&lt;br /&gt;
                #   to %msg2Setting if they&#039;re exclusive and regular.&lt;br /&gt;
                if($msgId eq &#039;760&#039; )&lt;br /&gt;
                { # new item in param1&lt;br /&gt;
                        $target = new X10_Item($param1Val);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                # Execute message on target.&lt;br /&gt;
                if($msgId eq &#039;192&#039; || $param2Val eq &#039;192&#039;)&lt;br /&gt;
                { # ON&lt;br /&gt;
                  print_log &amp;quot;Turn device $x10_id ON&amp;quot;;&lt;br /&gt;
                  set $target ON;&lt;br /&gt;
                }&lt;br /&gt;
                if($msgId eq &#039;193&#039; || $param2Val eq &#039;193&#039;)&lt;br /&gt;
                { # OFF&lt;br /&gt;
                  print_log &amp;quot;Turn device $x10_id OFF&amp;quot;;&lt;br /&gt;
                  set $target OFF;&lt;br /&gt;
                }&lt;br /&gt;
                if($msgId eq &#039;184&#039;)&lt;br /&gt;
                { # in param1&lt;br /&gt;
                  print_log &amp;quot;Setting device $x10_id to $param1Val%&amp;quot;;&lt;br /&gt;
                  set $target &amp;quot;$param1Val%&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
        } # Process message.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
my(%motionStates) =&lt;br /&gt;
{&lt;br /&gt;
        &#039;MOTION&#039; =&amp;gt; &#039;0&#039;,&lt;br /&gt;
        &#039;STILL&#039; =&amp;gt; &#039;1&#039;&lt;br /&gt;
};&lt;br /&gt;
my(%motionLocation2DeviceId) =&lt;br /&gt;
{&lt;br /&gt;
        $Hall_Motion =&amp;gt; &#039;183&#039;,&lt;br /&gt;
        $Landing_Motion =&amp;gt; &#039;184&#039;,&lt;br /&gt;
        $Kitchen_Motion =&amp;gt; &#039;185&#039;&lt;br /&gt;
};&lt;br /&gt;
my(@motionLocations) = keys(motionLocation2DeviceId);&lt;br /&gt;
foreach my($motionLocation) (@motionLocations)&lt;br /&gt;
{&lt;br /&gt;
        if($state = state_now($motionLocation)&lt;br /&gt;
        {&lt;br /&gt;
                lmce_motion($motionStates{$state}, $motionLocation);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# subs ########################################################################&lt;br /&gt;
&lt;br /&gt;
sub connect_lmce&lt;br /&gt;
{&lt;br /&gt;
        print_log &amp;quot;Configuring sockets&amp;quot;;&lt;br /&gt;
        $pluto_device_event_receiver =&lt;br /&gt;
                new  Socket_Item(undef, undef, &#039;192.168.1.1:3450&#039;,&#039;device_event_receiver&#039;,&#039;tcp&#039;,&#039;record&#039;);&lt;br /&gt;
        $pluto_device_command_sender =&lt;br /&gt;
                new  Socket_Item(undef, undef, &#039;192.168.1.1:3450&#039;,&#039;device_command_sender&#039;,&#039;tcp&#039;,&#039;record&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        print_log &amp;quot;Closing sockets if any left open&amp;quot;;&lt;br /&gt;
        if(active_now($pluto_device_event_receiver))&lt;br /&gt;
        {&lt;br /&gt;
                stop($pluto_device_event_receiver);&lt;br /&gt;
        }&lt;br /&gt;
        if(active_now($pluto_device_command_sender))&lt;br /&gt;
        {&lt;br /&gt;
                stop($pluto_device_command_sender);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        print_log &amp;quot;Open and setup new sockets&amp;quot;;&lt;br /&gt;
        start($pluto_device_event_receiver);&lt;br /&gt;
        set $pluto_device_event_receiver &amp;quot;COMMAND 179&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        start($pluto_device_command_sender);&lt;br /&gt;
        set $pluto_device_command_sender &amp;quot;EVENT 179&amp;quot;;&lt;br /&gt;
        set $pluto_device_command_sender &amp;quot;PLAIN_TEXT&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub send_pluto_message&lt;br /&gt;
{&lt;br /&gt;
        my($message) = @_;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        set $pluto_device_command_sender &amp;quot;MESSAGET &amp;quot; . length($message);&lt;br /&gt;
        set $pluto_device_command_sender $message;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub update_temp&lt;br /&gt;
{&lt;br /&gt;
        my($sensor, $temp) = @_;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        # Example message@&lt;br /&gt;
        # 167=temp sensor ID, 2=event, 25=event ID (temp changed), 30=value, temperature (string)&lt;br /&gt;
        # my($message) = &amp;quot;167 -1000 2 25 30 $random_number.2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        # Map iButtons to lmce device numbers.&lt;br /&gt;
        my(%sensorId2LMCEDeviceId) =&lt;br /&gt;
        {&lt;br /&gt;
                0 =&amp;gt; 166,&lt;br /&gt;
                1 =&amp;gt; 167&lt;br /&gt;
        }&lt;br /&gt;
        my($lmce_device) = $sensorId2LMCEDeviceId{$sensor};&lt;br /&gt;
&lt;br /&gt;
        my($message) = &amp;quot;$lmce_device -1000 2 25 30 $temp.2&amp;quot;;&lt;br /&gt;
        send_pluto_message($message);&lt;br /&gt;
        print_log &amp;quot;Updating sensor $lmce_device $temp&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub lmce_motion&lt;br /&gt;
{&lt;br /&gt;
        my($motionState, $device_id) = @_;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        # 6780=Detector ID, 2=event, 9=event ID (tripped), 25=tripped value, 1=value (tripped 0=OFF || 1=ON)&lt;br /&gt;
        my($message) = &amp;quot;$device_id -1000 2 9 25 $motionState&amp;quot;;&lt;br /&gt;
        send_pluto_message($message);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Adding_support_for_floorplan_devices&amp;diff=16468</id>
		<title>Adding support for floorplan devices</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Adding_support_for_floorplan_devices&amp;diff=16468"/>
		<updated>2008-12-04T16:22:22Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* Problems !!!! */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br&amp;gt;&lt;br /&gt;
I needed support for brightness sensors - particularly to display them on floorplan with current values. Since this procedure probably resembles adding support for other devices too, I&#039;m posting my notes...&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Major steps :&lt;br /&gt;
&lt;br /&gt;
1. create proper template for device (watch proper category and parent settings) &amp;lt;br&amp;gt;&lt;br /&gt;
2. create coresponding event, that will be used to report current values for floorplan device&#039; state &amp;lt;br&amp;gt;&lt;br /&gt;
3. add proper icon and other data in database &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Since steps 1.-3. were already made for brightness sensors, I did only steps that follow below. I guess Dan can describe steps 1. to 3. much better... &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
First I wanted to discover how this feature already works for temperature sensors... &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
It goes like this :&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
First there is event called &amp;quot;Temperature changed&amp;quot; that reporting device (home automation controller for instance) creates with parameter of current temperature value. Message gets through DCERouter to Climate Plugin that does this &lt;br /&gt;
       &lt;br /&gt;
 else if( pMessage-&amp;gt;m_dwMessage_Type==MESSAGETYPE_EVENT &amp;amp;&amp;amp; pMessage-&amp;gt;m_dwID==EVENT_Temperature_Changed_CONST )&lt;br /&gt;
 {&lt;br /&gt;
  // Replace the current temp&lt;br /&gt;
       string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
       string sCurrentState = pDevice-&amp;gt;m_sState_get();&lt;br /&gt;
       string::size_type pos = sCurrentState.find(&#039;(&#039;);&lt;br /&gt;
       if( pos!=string::npos )&lt;br /&gt;
              sCurrentState = sCurrentState.substr(0,pos-1); // Get rid of the current temp&lt;br /&gt;
       pDevice-&amp;gt;m_sState_set(sCurrentState + &amp;quot; (&amp;quot; + sLevel + &amp;quot;)&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
in &lt;br /&gt;
&lt;br /&gt;
 void Climate_Plugin::PreprocessClimateMessage(DeviceData_Router *pDevice,Message *pMessage)&lt;br /&gt;
&lt;br /&gt;
and sets state of device to reported value.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Then Orbiter plugin at line 1367 and procedure &lt;br /&gt;
&lt;br /&gt;
 void Orbiter_Plugin::CMD_Get_Current_Floorplan(string sID,int iPK_FloorplanType,string *sValue_To_Assign,string &amp;amp;sCMD_Result,Message *pMessage)&lt;br /&gt;
&lt;br /&gt;
does this (line 1429) :&lt;br /&gt;
 pFloorplanInfoProvider-&amp;gt;GetFloorplanDeviceInfo(pDeviceData_Router,fpObj-&amp;gt;m_pEntertainArea,fpObj-&amp;gt;Type,iPK_FloorplanObjectType_Color,iColor,sDescription,OSD,PK_DesignObj_Toolbar);&lt;br /&gt;
&lt;br /&gt;
FloorplanInfoProvider is actually coresponding plugin that provides more info about floorplan object. In Climate plugin there is this procedure :&lt;br /&gt;
&lt;br /&gt;
 void Climate_Plugin::GetFloorplanDeviceInfo(DeviceData_Router *pDeviceData_Router,EntertainArea *pEntertainArea,int iFloorplanObjectType,int &amp;amp;iPK_FloorplanObjectType_Color,int &amp;amp;Color,string &amp;amp;sDescription,string &amp;amp;OSD,int &amp;amp;PK_DesignObj_Toolbar)&lt;br /&gt;
 {&lt;br /&gt;
 switch(iFloorplanObjectType)&lt;br /&gt;
 {&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_THERMOSTAT_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=DESIGNOBJ_grpThermostatControls_CONST;&lt;br /&gt;
          break;&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_THERMOMETER_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=0;&lt;br /&gt;
          break;&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_WEATHER_STATION_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=0;&lt;br /&gt;
          break;&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_DAMPER_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=0;&lt;br /&gt;
          break;&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_POOL_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=DESIGNOBJ_grpPoolControls_CONST;&lt;br /&gt;
          break;&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_SPRINKLER_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=DESIGNOBJ_grpSprinklerControls_CONST;&lt;br /&gt;
          break;&lt;br /&gt;
 };&lt;br /&gt;
 if( (OSD=pDeviceData_Router-&amp;gt;m_sState_get())==&amp;quot;OFF&amp;quot; )&lt;br /&gt;
          iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_CLIMATE_THERMOSTAT_OFF_CONST;&lt;br /&gt;
 else&lt;br /&gt;
          iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_CLIMATE_THERMOSTAT_COOLING_CONST;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
and most important is this line (near bottom) :&lt;br /&gt;
 OSD=pDeviceData_Router-&amp;gt;m_sState_get()&lt;br /&gt;
&lt;br /&gt;
It basically reads state of device and puts it into OSD. OSD is string that will get displayed beside icon.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now I&#039;ll try to replicate everything similar to Lighting Plugin and brightness sensors :&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Lighting Plugin&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added this line &lt;br /&gt;
&lt;br /&gt;
        case FLOORPLANOBJECTTYPE_BRIGHTNESS_SENSOR_CONST:&lt;br /&gt;
                OSD = pDeviceData_Router-&amp;gt;m_sState_get();&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
 void Lighting_Plugin::GetFloorplanDeviceInfo(DeviceData_Router *pDeviceData_Router,EntertainArea *pEntertainArea,int iFloorplanObjectType,int &amp;amp;iPK_FloorplanObjectType_Color,int &amp;amp;Color,string &amp;amp;sDescription,string &amp;amp;OSD,int &amp;amp;PK_DesignObj_Toolbar)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
and adding those lines &lt;br /&gt;
&lt;br /&gt;
        else if( pMessage-&amp;gt;m_dwMessage_Type==MESSAGETYPE_EVENT &amp;amp;&amp;amp; pMessage-&amp;gt;m_dwID==EVENT_Brightness_Changed_CONST )&lt;br /&gt;
        {&lt;br /&gt;
        	// Replace the current level&lt;br /&gt;
        	string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
        	string sCurrentState = pDevice-&amp;gt;m_sState_get();&lt;br /&gt;
        	string::size_type pos = sCurrentState.find(&#039;(&#039;);&lt;br /&gt;
        	if( pos!=string::npos )&lt;br /&gt;
        		sCurrentState = sCurrentState.substr(0,pos-1); // Get rid of the current level&lt;br /&gt;
        	pDevice-&amp;gt;m_sState_set(sCurrentState + &amp;quot; (&amp;quot; + sLevel + &amp;quot;)&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
to the bottom of &lt;br /&gt;
 void Lighting_Plugin::PreprocessLightingMessage(DeviceData_Router *pDevice,Message *pMessage) &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiling Lighting and Climate plugin : ==&lt;br /&gt;
&lt;br /&gt;
SVN checkout of 710 stable release (it&#039;s more convenient to work on currently released version of LinuxMCE)...&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The minimal routine: &amp;lt;br&amp;gt;&lt;br /&gt;
1) take the latest stable branch - e.g. 710&lt;br /&gt;
  svn co http://svn.linuxmce.org/svn/branches/LinuxMCE-0710/&lt;br /&gt;
2) build it - actually you don&#039;t need to build every package- just cd to the desired folder and try to run make there. if you will get missing libs, then you should go to the corresponding library folder and build it. For Lighting and Climate plugins following is needed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
cd LinuxMCE-0710/&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_defines-&amp;gt;/-DKDE_LMCE -DDEBUG -DTHREAD_LOG -DLOG_ALL_QUERIES -I\/opt\/libxine1-pluto\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include\/SD/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_libs-&amp;gt;/-L\/opt\/libxine1-pluto\/lib -L\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/lib/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cd pluto_main&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_defines-&amp;gt;/-DKDE_LMCE -DDEBUG -DTHREAD_LOG -DLOG_ALL_QUERIES -I\/opt\/libxine1-pluto\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include\/SD/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_libs-&amp;gt;/-L\/opt\/libxine1-pluto\/lib -L\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/lib/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
make&lt;br /&gt;
&lt;br /&gt;
cd ../SerializeClass/&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_defines-&amp;gt;/-DKDE_LMCE -DDEBUG -DTHREAD_LOG -DLOG_ALL_QUERIES -I\/opt\/libxine1-pluto\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include\/SD/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_libs-&amp;gt;/-L\/opt\/libxine1-pluto\/lib -L\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/lib/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
make &lt;br /&gt;
cd ../DCE/&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_defines-&amp;gt;/-DKDE_LMCE -DDEBUG -DTHREAD_LOG -DLOG_ALL_QUERIES -I\/opt\/libxine1-pluto\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include\/SD/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_libs-&amp;gt;/-L\/opt\/libxine1-pluto\/lib -L\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/lib/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
make&lt;br /&gt;
cd ../PlutoUtils&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_defines-&amp;gt;/-DKDE_LMCE -DDEBUG -DTHREAD_LOG -DLOG_ALL_QUERIES -I\/opt\/libxine1-pluto\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include\/SD/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_libs-&amp;gt;/-L\/opt\/libxine1-pluto\/lib -L\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/lib/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
make&lt;br /&gt;
&lt;br /&gt;
cd ../Lighting_Plugin/&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_defines-&amp;gt;/-DKDE_LMCE -DDEBUG -DTHREAD_LOG -DLOG_ALL_QUERIES -I\/opt\/libxine1-pluto\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include\/SD/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_libs-&amp;gt;/-L\/opt\/libxine1-pluto\/lib -L\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/lib/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
make so&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cp  /usr/pluto/bin/Lighting_Plugin.so  /usr/pluto/bin/Lighting_Plugin.orig.so&lt;br /&gt;
cp -f ./Lighting_Plugin.so /usr/pluto/bin/Lighting_Plugin.so&lt;br /&gt;
&lt;br /&gt;
cd ../Climate_Plugin/&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_defines-&amp;gt;/-DKDE_LMCE -DDEBUG -DTHREAD_LOG -DLOG_ALL_QUERIES -I\/opt\/libxine1-pluto\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include\/SD/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_libs-&amp;gt;/-L\/opt\/libxine1-pluto\/lib -L\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/lib/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
make so&lt;br /&gt;
&lt;br /&gt;
cp  /usr/pluto/bin/Climate_Plugin.so  /usr/pluto/bin/Climate_Plugin.orig.so&lt;br /&gt;
cp -f ./Climate_Plugin.so /usr/pluto/bin/Climate_Plugin.so&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Problems !!!! ==&lt;br /&gt;
&lt;br /&gt;
If you need any new DCE Event or DCE Command added, then you have to work with developers, cause it must be entered into main database first, so you can get right inlude files to use your addition. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Programmer&#039;s Guide]]&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Adding_support_for_floorplan_devices&amp;diff=16467</id>
		<title>Adding support for floorplan devices</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Adding_support_for_floorplan_devices&amp;diff=16467"/>
		<updated>2008-12-04T16:21:00Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* Compiling Lighting and Climate plugin : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br&amp;gt;&lt;br /&gt;
I needed support for brightness sensors - particularly to display them on floorplan with current values. Since this procedure probably resembles adding support for other devices too, I&#039;m posting my notes...&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Major steps :&lt;br /&gt;
&lt;br /&gt;
1. create proper template for device (watch proper category and parent settings) &amp;lt;br&amp;gt;&lt;br /&gt;
2. create coresponding event, that will be used to report current values for floorplan device&#039; state &amp;lt;br&amp;gt;&lt;br /&gt;
3. add proper icon and other data in database &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Since steps 1.-3. were already made for brightness sensors, I did only steps that follow below. I guess Dan can describe steps 1. to 3. much better... &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
First I wanted to discover how this feature already works for temperature sensors... &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
It goes like this :&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
First there is event called &amp;quot;Temperature changed&amp;quot; that reporting device (home automation controller for instance) creates with parameter of current temperature value. Message gets through DCERouter to Climate Plugin that does this &lt;br /&gt;
       &lt;br /&gt;
 else if( pMessage-&amp;gt;m_dwMessage_Type==MESSAGETYPE_EVENT &amp;amp;&amp;amp; pMessage-&amp;gt;m_dwID==EVENT_Temperature_Changed_CONST )&lt;br /&gt;
 {&lt;br /&gt;
  // Replace the current temp&lt;br /&gt;
       string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
       string sCurrentState = pDevice-&amp;gt;m_sState_get();&lt;br /&gt;
       string::size_type pos = sCurrentState.find(&#039;(&#039;);&lt;br /&gt;
       if( pos!=string::npos )&lt;br /&gt;
              sCurrentState = sCurrentState.substr(0,pos-1); // Get rid of the current temp&lt;br /&gt;
       pDevice-&amp;gt;m_sState_set(sCurrentState + &amp;quot; (&amp;quot; + sLevel + &amp;quot;)&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
in &lt;br /&gt;
&lt;br /&gt;
 void Climate_Plugin::PreprocessClimateMessage(DeviceData_Router *pDevice,Message *pMessage)&lt;br /&gt;
&lt;br /&gt;
and sets state of device to reported value.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Then Orbiter plugin at line 1367 and procedure &lt;br /&gt;
&lt;br /&gt;
 void Orbiter_Plugin::CMD_Get_Current_Floorplan(string sID,int iPK_FloorplanType,string *sValue_To_Assign,string &amp;amp;sCMD_Result,Message *pMessage)&lt;br /&gt;
&lt;br /&gt;
does this (line 1429) :&lt;br /&gt;
 pFloorplanInfoProvider-&amp;gt;GetFloorplanDeviceInfo(pDeviceData_Router,fpObj-&amp;gt;m_pEntertainArea,fpObj-&amp;gt;Type,iPK_FloorplanObjectType_Color,iColor,sDescription,OSD,PK_DesignObj_Toolbar);&lt;br /&gt;
&lt;br /&gt;
FloorplanInfoProvider is actually coresponding plugin that provides more info about floorplan object. In Climate plugin there is this procedure :&lt;br /&gt;
&lt;br /&gt;
 void Climate_Plugin::GetFloorplanDeviceInfo(DeviceData_Router *pDeviceData_Router,EntertainArea *pEntertainArea,int iFloorplanObjectType,int &amp;amp;iPK_FloorplanObjectType_Color,int &amp;amp;Color,string &amp;amp;sDescription,string &amp;amp;OSD,int &amp;amp;PK_DesignObj_Toolbar)&lt;br /&gt;
 {&lt;br /&gt;
 switch(iFloorplanObjectType)&lt;br /&gt;
 {&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_THERMOSTAT_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=DESIGNOBJ_grpThermostatControls_CONST;&lt;br /&gt;
          break;&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_THERMOMETER_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=0;&lt;br /&gt;
          break;&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_WEATHER_STATION_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=0;&lt;br /&gt;
          break;&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_DAMPER_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=0;&lt;br /&gt;
          break;&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_POOL_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=DESIGNOBJ_grpPoolControls_CONST;&lt;br /&gt;
          break;&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_SPRINKLER_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=DESIGNOBJ_grpSprinklerControls_CONST;&lt;br /&gt;
          break;&lt;br /&gt;
 };&lt;br /&gt;
 if( (OSD=pDeviceData_Router-&amp;gt;m_sState_get())==&amp;quot;OFF&amp;quot; )&lt;br /&gt;
          iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_CLIMATE_THERMOSTAT_OFF_CONST;&lt;br /&gt;
 else&lt;br /&gt;
          iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_CLIMATE_THERMOSTAT_COOLING_CONST;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
and most important is this line (near bottom) :&lt;br /&gt;
 OSD=pDeviceData_Router-&amp;gt;m_sState_get()&lt;br /&gt;
&lt;br /&gt;
It basically reads state of device and puts it into OSD. OSD is string that will get displayed beside icon.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now I&#039;ll try to replicate everything similar to Lighting Plugin and brightness sensors :&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Lighting Plugin&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added this line &lt;br /&gt;
&lt;br /&gt;
        case FLOORPLANOBJECTTYPE_BRIGHTNESS_SENSOR_CONST:&lt;br /&gt;
                OSD = pDeviceData_Router-&amp;gt;m_sState_get();&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
 void Lighting_Plugin::GetFloorplanDeviceInfo(DeviceData_Router *pDeviceData_Router,EntertainArea *pEntertainArea,int iFloorplanObjectType,int &amp;amp;iPK_FloorplanObjectType_Color,int &amp;amp;Color,string &amp;amp;sDescription,string &amp;amp;OSD,int &amp;amp;PK_DesignObj_Toolbar)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
and adding those lines &lt;br /&gt;
&lt;br /&gt;
        else if( pMessage-&amp;gt;m_dwMessage_Type==MESSAGETYPE_EVENT &amp;amp;&amp;amp; pMessage-&amp;gt;m_dwID==EVENT_Brightness_Changed_CONST )&lt;br /&gt;
        {&lt;br /&gt;
        	// Replace the current level&lt;br /&gt;
        	string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
        	string sCurrentState = pDevice-&amp;gt;m_sState_get();&lt;br /&gt;
        	string::size_type pos = sCurrentState.find(&#039;(&#039;);&lt;br /&gt;
        	if( pos!=string::npos )&lt;br /&gt;
        		sCurrentState = sCurrentState.substr(0,pos-1); // Get rid of the current level&lt;br /&gt;
        	pDevice-&amp;gt;m_sState_set(sCurrentState + &amp;quot; (&amp;quot; + sLevel + &amp;quot;)&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
to the bottom of &lt;br /&gt;
 void Lighting_Plugin::PreprocessLightingMessage(DeviceData_Router *pDevice,Message *pMessage) &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiling Lighting and Climate plugin : ==&lt;br /&gt;
&lt;br /&gt;
SVN checkout of 710 stable release (it&#039;s more convenient to work on currently released version of LinuxMCE)...&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The minimal routine: &amp;lt;br&amp;gt;&lt;br /&gt;
1) take the latest stable branch - e.g. 710&lt;br /&gt;
  svn co http://svn.linuxmce.org/svn/branches/LinuxMCE-0710/&lt;br /&gt;
2) build it - actually you don&#039;t need to build every package- just cd to the desired folder and try to run make there. if you will get missing libs, then you should go to the corresponding library folder and build it. For Lighting and Climate plugins following is needed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
cd LinuxMCE-0710/&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_defines-&amp;gt;/-DKDE_LMCE -DDEBUG -DTHREAD_LOG -DLOG_ALL_QUERIES -I\/opt\/libxine1-pluto\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include\/SD/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_libs-&amp;gt;/-L\/opt\/libxine1-pluto\/lib -L\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/lib/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cd pluto_main&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_defines-&amp;gt;/-DKDE_LMCE -DDEBUG -DTHREAD_LOG -DLOG_ALL_QUERIES -I\/opt\/libxine1-pluto\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include\/SD/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_libs-&amp;gt;/-L\/opt\/libxine1-pluto\/lib -L\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/lib/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
make&lt;br /&gt;
&lt;br /&gt;
cd ../SerializeClass/&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_defines-&amp;gt;/-DKDE_LMCE -DDEBUG -DTHREAD_LOG -DLOG_ALL_QUERIES -I\/opt\/libxine1-pluto\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include\/SD/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_libs-&amp;gt;/-L\/opt\/libxine1-pluto\/lib -L\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/lib/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
make &lt;br /&gt;
cd ../DCE/&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_defines-&amp;gt;/-DKDE_LMCE -DDEBUG -DTHREAD_LOG -DLOG_ALL_QUERIES -I\/opt\/libxine1-pluto\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include\/SD/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_libs-&amp;gt;/-L\/opt\/libxine1-pluto\/lib -L\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/lib/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
make&lt;br /&gt;
cd ../PlutoUtils&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_defines-&amp;gt;/-DKDE_LMCE -DDEBUG -DTHREAD_LOG -DLOG_ALL_QUERIES -I\/opt\/libxine1-pluto\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include\/SD/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_libs-&amp;gt;/-L\/opt\/libxine1-pluto\/lib -L\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/lib/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
make&lt;br /&gt;
&lt;br /&gt;
cd ../Lighting_Plugin/&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_defines-&amp;gt;/-DKDE_LMCE -DDEBUG -DTHREAD_LOG -DLOG_ALL_QUERIES -I\/opt\/libxine1-pluto\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include\/SD/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_libs-&amp;gt;/-L\/opt\/libxine1-pluto\/lib -L\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/lib/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
make so&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cp  /usr/pluto/bin/Lighting_Plugin.so  /usr/pluto/bin/Lighting_Plugin.orig.so&lt;br /&gt;
cp -f ./Lighting_Plugin.so /usr/pluto/bin/Lighting_Plugin.so&lt;br /&gt;
&lt;br /&gt;
cd ../Climate_Plugin/&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_defines-&amp;gt;/-DKDE_LMCE -DDEBUG -DTHREAD_LOG -DLOG_ALL_QUERIES -I\/opt\/libxine1-pluto\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include -I\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/include\/SD/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
find . -iname Makefile -exec sed -e &#039;s/&amp;lt;-mkr_t_compile_libs-&amp;gt;/-L\/opt\/libxine1-pluto\/lib -L\/opt\/libsdl1.2-1.2.7+1.2.8cvs20041007\/lib/&#039; -i &#039;{}&#039; \;&lt;br /&gt;
make so&lt;br /&gt;
&lt;br /&gt;
cp  /usr/pluto/bin/Climate_Plugin.so  /usr/pluto/bin/Climate_Plugin.orig.so&lt;br /&gt;
cp -f ./Climate_Plugin.so /usr/pluto/bin/Climate_Plugin.so&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Problems !!!! ==&lt;br /&gt;
&lt;br /&gt;
It seems I must go through &amp;quot;adding DCE Event story&amp;quot; and I got stucked on this one. I&#039;ve added simple constant to /pluto_main/Define_Event.h and added line to Event table in pluto_main. Also web-admin doesn&#039;t allow adding Events (although it works for Commands). But this seems not proper way of doing this, cause I get errors on compiled Lighting_Plugin&lt;br /&gt;
&lt;br /&gt;
[[Category: Programmer&#039;s Guide]]&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Adding_support_for_floorplan_devices&amp;diff=16466</id>
		<title>Adding support for floorplan devices</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Adding_support_for_floorplan_devices&amp;diff=16466"/>
		<updated>2008-12-04T16:17:36Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br&amp;gt;&lt;br /&gt;
I needed support for brightness sensors - particularly to display them on floorplan with current values. Since this procedure probably resembles adding support for other devices too, I&#039;m posting my notes...&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Major steps :&lt;br /&gt;
&lt;br /&gt;
1. create proper template for device (watch proper category and parent settings) &amp;lt;br&amp;gt;&lt;br /&gt;
2. create coresponding event, that will be used to report current values for floorplan device&#039; state &amp;lt;br&amp;gt;&lt;br /&gt;
3. add proper icon and other data in database &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Since steps 1.-3. were already made for brightness sensors, I did only steps that follow below. I guess Dan can describe steps 1. to 3. much better... &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
First I wanted to discover how this feature already works for temperature sensors... &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
It goes like this :&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
First there is event called &amp;quot;Temperature changed&amp;quot; that reporting device (home automation controller for instance) creates with parameter of current temperature value. Message gets through DCERouter to Climate Plugin that does this &lt;br /&gt;
       &lt;br /&gt;
 else if( pMessage-&amp;gt;m_dwMessage_Type==MESSAGETYPE_EVENT &amp;amp;&amp;amp; pMessage-&amp;gt;m_dwID==EVENT_Temperature_Changed_CONST )&lt;br /&gt;
 {&lt;br /&gt;
  // Replace the current temp&lt;br /&gt;
       string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
       string sCurrentState = pDevice-&amp;gt;m_sState_get();&lt;br /&gt;
       string::size_type pos = sCurrentState.find(&#039;(&#039;);&lt;br /&gt;
       if( pos!=string::npos )&lt;br /&gt;
              sCurrentState = sCurrentState.substr(0,pos-1); // Get rid of the current temp&lt;br /&gt;
       pDevice-&amp;gt;m_sState_set(sCurrentState + &amp;quot; (&amp;quot; + sLevel + &amp;quot;)&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
in &lt;br /&gt;
&lt;br /&gt;
 void Climate_Plugin::PreprocessClimateMessage(DeviceData_Router *pDevice,Message *pMessage)&lt;br /&gt;
&lt;br /&gt;
and sets state of device to reported value.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Then Orbiter plugin at line 1367 and procedure &lt;br /&gt;
&lt;br /&gt;
 void Orbiter_Plugin::CMD_Get_Current_Floorplan(string sID,int iPK_FloorplanType,string *sValue_To_Assign,string &amp;amp;sCMD_Result,Message *pMessage)&lt;br /&gt;
&lt;br /&gt;
does this (line 1429) :&lt;br /&gt;
 pFloorplanInfoProvider-&amp;gt;GetFloorplanDeviceInfo(pDeviceData_Router,fpObj-&amp;gt;m_pEntertainArea,fpObj-&amp;gt;Type,iPK_FloorplanObjectType_Color,iColor,sDescription,OSD,PK_DesignObj_Toolbar);&lt;br /&gt;
&lt;br /&gt;
FloorplanInfoProvider is actually coresponding plugin that provides more info about floorplan object. In Climate plugin there is this procedure :&lt;br /&gt;
&lt;br /&gt;
 void Climate_Plugin::GetFloorplanDeviceInfo(DeviceData_Router *pDeviceData_Router,EntertainArea *pEntertainArea,int iFloorplanObjectType,int &amp;amp;iPK_FloorplanObjectType_Color,int &amp;amp;Color,string &amp;amp;sDescription,string &amp;amp;OSD,int &amp;amp;PK_DesignObj_Toolbar)&lt;br /&gt;
 {&lt;br /&gt;
 switch(iFloorplanObjectType)&lt;br /&gt;
 {&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_THERMOSTAT_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=DESIGNOBJ_grpThermostatControls_CONST;&lt;br /&gt;
          break;&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_THERMOMETER_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=0;&lt;br /&gt;
          break;&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_WEATHER_STATION_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=0;&lt;br /&gt;
          break;&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_DAMPER_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=0;&lt;br /&gt;
          break;&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_POOL_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=DESIGNOBJ_grpPoolControls_CONST;&lt;br /&gt;
          break;&lt;br /&gt;
 case FLOORPLANOBJECTTYPE_CLIMATE_SPRINKLER_CONST:&lt;br /&gt;
          PK_DesignObj_Toolbar=DESIGNOBJ_grpSprinklerControls_CONST;&lt;br /&gt;
          break;&lt;br /&gt;
 };&lt;br /&gt;
 if( (OSD=pDeviceData_Router-&amp;gt;m_sState_get())==&amp;quot;OFF&amp;quot; )&lt;br /&gt;
          iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_CLIMATE_THERMOSTAT_OFF_CONST;&lt;br /&gt;
 else&lt;br /&gt;
          iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_CLIMATE_THERMOSTAT_COOLING_CONST;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
and most important is this line (near bottom) :&lt;br /&gt;
 OSD=pDeviceData_Router-&amp;gt;m_sState_get()&lt;br /&gt;
&lt;br /&gt;
It basically reads state of device and puts it into OSD. OSD is string that will get displayed beside icon.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now I&#039;ll try to replicate everything similar to Lighting Plugin and brightness sensors :&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Lighting Plugin&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added this line &lt;br /&gt;
&lt;br /&gt;
        case FLOORPLANOBJECTTYPE_BRIGHTNESS_SENSOR_CONST:&lt;br /&gt;
                OSD = pDeviceData_Router-&amp;gt;m_sState_get();&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
 void Lighting_Plugin::GetFloorplanDeviceInfo(DeviceData_Router *pDeviceData_Router,EntertainArea *pEntertainArea,int iFloorplanObjectType,int &amp;amp;iPK_FloorplanObjectType_Color,int &amp;amp;Color,string &amp;amp;sDescription,string &amp;amp;OSD,int &amp;amp;PK_DesignObj_Toolbar)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
and adding those lines &lt;br /&gt;
&lt;br /&gt;
        else if( pMessage-&amp;gt;m_dwMessage_Type==MESSAGETYPE_EVENT &amp;amp;&amp;amp; pMessage-&amp;gt;m_dwID==EVENT_Brightness_Changed_CONST )&lt;br /&gt;
        {&lt;br /&gt;
        	// Replace the current level&lt;br /&gt;
        	string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
        	string sCurrentState = pDevice-&amp;gt;m_sState_get();&lt;br /&gt;
        	string::size_type pos = sCurrentState.find(&#039;(&#039;);&lt;br /&gt;
        	if( pos!=string::npos )&lt;br /&gt;
        		sCurrentState = sCurrentState.substr(0,pos-1); // Get rid of the current level&lt;br /&gt;
        	pDevice-&amp;gt;m_sState_set(sCurrentState + &amp;quot; (&amp;quot; + sLevel + &amp;quot;)&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
to the bottom of &lt;br /&gt;
 void Lighting_Plugin::PreprocessLightingMessage(DeviceData_Router *pDevice,Message *pMessage) &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiling Lighting and Climate plugin : ==&lt;br /&gt;
 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SVN checkout of stable release (it&#039;s more convenient to work on currently released version of LinuxMCE)...&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The minimal routine: &amp;lt;br&amp;gt;&lt;br /&gt;
1) take the latest stable branch - e.g. 2.0.42 &lt;br /&gt;
 svn co http://svn.plutohome.com/pluto/branches/2.0.0.42/src &lt;br /&gt;
2) build it - actually you don&#039;t need to build every package- just cd to the desired folder and try to run make there. if you will get missing libs like libDCECommon.so - then you should go to the corresponding library folder and build it&lt;br /&gt;
&lt;br /&gt;
 cd ../pluto_main/&lt;br /&gt;
 make &lt;br /&gt;
 cd ../SerializeClass/&lt;br /&gt;
 make &lt;br /&gt;
 cd ../DCE/&lt;br /&gt;
 make&lt;br /&gt;
 cd ../PlutoUtils&lt;br /&gt;
 make&lt;br /&gt;
 cd ../Lighting_Plugin/&lt;br /&gt;
 make so&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Problems !!!! ==&lt;br /&gt;
&lt;br /&gt;
It seems I must go through &amp;quot;adding DCE Event story&amp;quot; and I got stucked on this one. I&#039;ve added simple constant to /pluto_main/Define_Event.h and added line to Event table in pluto_main. Also web-admin doesn&#039;t allow adding Events (although it works for Commands). But this seems not proper way of doing this, cause I get errors on compiled Lighting_Plugin&lt;br /&gt;
&lt;br /&gt;
[[Category: Programmer&#039;s Guide]]&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Lighting_Plugin&amp;diff=16444</id>
		<title>Lighting Plugin</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Lighting_Plugin&amp;diff=16444"/>
		<updated>2008-12-02T14:43:30Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* Potential problems with current content of Lighting Plugin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Lighting]]&lt;br /&gt;
[[Category:LinuxMCE_Plugins]]&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
Lighting plugin takes care of lighting devices. Handles commands, events and sets according device states. It also gives content to Orbiter plugin when it renders Lighting devices on Orbiter&#039;s floorplans. Although, in 710 no info is displayed beside Lighting devices on floorplan - have yet to discover what is the cause....&lt;br /&gt;
&lt;br /&gt;
== Important Code snippets ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Lighting_Plugin::GetFloorplanDeviceInfo ===&lt;br /&gt;
This method determines what group of commands will be shown on right column beside floorplan. In the last if, it also determines what will be displayed on floorplan (OSD string is the content that will be displayed on floorplan)... It also determines the color of object on floorplan. But since state of lighting device is something like XX/NN) where :&lt;br /&gt;
#XX      means ON or OFF state of device&lt;br /&gt;
#NN      means Level (0 for OFF, up to 100 for ON)&lt;br /&gt;
&lt;br /&gt;
It seems that OSD is set to show all state info on floorplan. Don&#039;t know why this isn&#039;t so. Anyway, it can also be seen that all lights have dimmable controls, while if device is in Lighting Category and not one of predefined light types, then it gets only On/Off controls on Orbiter.&lt;br /&gt;
&lt;br /&gt;
IMHO such behaviour should be determined on base of device template, not object type. In such situation, dimmable controls are also displayed for on/off light switches, which is not correct (although we probably got used to that). But this clearly explains that you get On/Off floorplan controls for instance for brightness sensor.&lt;br /&gt;
&lt;br /&gt;
I just wonder what is the correct path out of this inconsistency. Is it adding new floorplan types for on/off lights or determine command groups by device template and not floorplan type... ???&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code of highlighted method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Lighting_Plugin::GetFloorplanDeviceInfo(DeviceData_Router *pDeviceData_Router,EntertainArea *pEntertainArea,int iFloorplanObjectType,int &amp;amp;iPK_FloorplanObjectType_Color,int &amp;amp;Color,string &amp;amp;sDescription,string &amp;amp;OSD,int &amp;amp;PK_DesignObj_Toolbar)&lt;br /&gt;
{&lt;br /&gt;
	switch(iFloorplanObjectType)&lt;br /&gt;
	{&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_LIGHT_CEILING_LIGHT_CONST:&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_LIGHT_TABLE_LAMP_CONST:&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_LIGHT_WALL_SCONCE_CONST:&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_LIGHT_FLOOR_LAMP_CONST:&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_LIGHT_CHANDALIER_CONST:&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_LIGHT_PICTURE_LIGHT_CONST:&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_LIGHT_ACCENT_LIGHT_CONST:&lt;br /&gt;
		OSD = pDeviceData_Router-&amp;gt;m_sState_get();&lt;br /&gt;
		if(OSD.find(&amp;quot;OFF&amp;quot;) != string::npos)&lt;br /&gt;
			iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_LIGHT_CEILING_LIGHT_OFF_CONST;&lt;br /&gt;
		else&lt;br /&gt;
			iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_LIGHT_CEILING_LIGHT_ON_CONST;&lt;br /&gt;
&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpLightControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	default:&lt;br /&gt;
		OSD = pDeviceData_Router-&amp;gt;m_sState_get();&lt;br /&gt;
		if(OSD.find(&amp;quot;OFF&amp;quot;) != string::npos)&lt;br /&gt;
			iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_LIGHT_CEILING_LIGHT_OFF_CONST;&lt;br /&gt;
		else&lt;br /&gt;
			iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_LIGHT_CEILING_LIGHT_ON_CONST;&lt;br /&gt;
&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpLightControlsOnOff_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lighting_Plugin:: Commands and Events ===&lt;br /&gt;
&lt;br /&gt;
This one processes received messages/events. It can beclearly seen that currently following commands :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if( pMessage-&amp;gt;m_dwID==COMMAND_Set_Level_CONST )&lt;br /&gt;
	if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_On_CONST )&lt;br /&gt;
	else if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_Off_CONST )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and events &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if( pMessage-&amp;gt;m_dwID == EVENT_Device_OnOff_CONST )&lt;br /&gt;
	else if (pMessage-&amp;gt;m_dwID == EVENT_State_Changed_CONST) &lt;br /&gt;
        Follow me events&lt;br /&gt;
        Get_Video_Frame  (probably cause of automatic lighting on cameras)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
are processed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to use Lighting devices in Orbiter ==&lt;br /&gt;
&lt;br /&gt;
== Potential problems with current content of Lighting Plugin ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;My personal comment(Bulek): &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Inconsistency of group commands with device template :&lt;br /&gt;
Either group of commands should be determined by device template or we should have separate floorplan objects for separate command groups. Don&#039;t know which one or third path is correct in here. Any opinions ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;why is not state info actually drawn on floorplans ? it seems that OSD is properly set up - the cause must be somewhere else... I guess similar problem is with Blinds, Drapes and Shutter devices...&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;My plans:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;I plan to correct that behaviour, if leading developers confirm the right way to do it. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;I also plan to support use of yet unsupported color gray (if light is dimmed) like:&lt;br /&gt;
 On 	LIGHT_CEILING_LIGHT_ON 		-256 			yellow&lt;br /&gt;
 Off 	LIGHT_CEILING_LIGHT_OFF 	-16777216               black&lt;br /&gt;
 Dim 	LIGHT_CEILING_LIGHT_DIM 	-4144960  		bright gray&lt;br /&gt;
 Same goes for :&lt;br /&gt;
 LIGHT_TABLE_LAMP,LIGHT_WALL_SCONCE,LIGHT_FLOOR_LAMP,LIGHT_CHANDALIER,LIGHT_PICTURE_LIGHT,LIGHT_ACCENT_LIGHT&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
[[User:Bulek|Bulek]] 15:37, 2 December 2008 (CET)&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Lighting_Plugin&amp;diff=16443</id>
		<title>Lighting Plugin</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Lighting_Plugin&amp;diff=16443"/>
		<updated>2008-12-02T14:37:49Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Lighting]]&lt;br /&gt;
[[Category:LinuxMCE_Plugins]]&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
Lighting plugin takes care of lighting devices. Handles commands, events and sets according device states. It also gives content to Orbiter plugin when it renders Lighting devices on Orbiter&#039;s floorplans. Although, in 710 no info is displayed beside Lighting devices on floorplan - have yet to discover what is the cause....&lt;br /&gt;
&lt;br /&gt;
== Important Code snippets ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Lighting_Plugin::GetFloorplanDeviceInfo ===&lt;br /&gt;
This method determines what group of commands will be shown on right column beside floorplan. In the last if, it also determines what will be displayed on floorplan (OSD string is the content that will be displayed on floorplan)... It also determines the color of object on floorplan. But since state of lighting device is something like XX/NN) where :&lt;br /&gt;
#XX      means ON or OFF state of device&lt;br /&gt;
#NN      means Level (0 for OFF, up to 100 for ON)&lt;br /&gt;
&lt;br /&gt;
It seems that OSD is set to show all state info on floorplan. Don&#039;t know why this isn&#039;t so. Anyway, it can also be seen that all lights have dimmable controls, while if device is in Lighting Category and not one of predefined light types, then it gets only On/Off controls on Orbiter.&lt;br /&gt;
&lt;br /&gt;
IMHO such behaviour should be determined on base of device template, not object type. In such situation, dimmable controls are also displayed for on/off light switches, which is not correct (although we probably got used to that). But this clearly explains that you get On/Off floorplan controls for instance for brightness sensor.&lt;br /&gt;
&lt;br /&gt;
I just wonder what is the correct path out of this inconsistency. Is it adding new floorplan types for on/off lights or determine command groups by device template and not floorplan type... ???&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code of highlighted method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Lighting_Plugin::GetFloorplanDeviceInfo(DeviceData_Router *pDeviceData_Router,EntertainArea *pEntertainArea,int iFloorplanObjectType,int &amp;amp;iPK_FloorplanObjectType_Color,int &amp;amp;Color,string &amp;amp;sDescription,string &amp;amp;OSD,int &amp;amp;PK_DesignObj_Toolbar)&lt;br /&gt;
{&lt;br /&gt;
	switch(iFloorplanObjectType)&lt;br /&gt;
	{&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_LIGHT_CEILING_LIGHT_CONST:&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_LIGHT_TABLE_LAMP_CONST:&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_LIGHT_WALL_SCONCE_CONST:&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_LIGHT_FLOOR_LAMP_CONST:&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_LIGHT_CHANDALIER_CONST:&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_LIGHT_PICTURE_LIGHT_CONST:&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_LIGHT_ACCENT_LIGHT_CONST:&lt;br /&gt;
		OSD = pDeviceData_Router-&amp;gt;m_sState_get();&lt;br /&gt;
		if(OSD.find(&amp;quot;OFF&amp;quot;) != string::npos)&lt;br /&gt;
			iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_LIGHT_CEILING_LIGHT_OFF_CONST;&lt;br /&gt;
		else&lt;br /&gt;
			iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_LIGHT_CEILING_LIGHT_ON_CONST;&lt;br /&gt;
&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpLightControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	default:&lt;br /&gt;
		OSD = pDeviceData_Router-&amp;gt;m_sState_get();&lt;br /&gt;
		if(OSD.find(&amp;quot;OFF&amp;quot;) != string::npos)&lt;br /&gt;
			iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_LIGHT_CEILING_LIGHT_OFF_CONST;&lt;br /&gt;
		else&lt;br /&gt;
			iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_LIGHT_CEILING_LIGHT_ON_CONST;&lt;br /&gt;
&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpLightControlsOnOff_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lighting_Plugin:: Commands and Events ===&lt;br /&gt;
&lt;br /&gt;
This one processes received messages/events. It can beclearly seen that currently following commands :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if( pMessage-&amp;gt;m_dwID==COMMAND_Set_Level_CONST )&lt;br /&gt;
	if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_On_CONST )&lt;br /&gt;
	else if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_Off_CONST )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and events &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if( pMessage-&amp;gt;m_dwID == EVENT_Device_OnOff_CONST )&lt;br /&gt;
	else if (pMessage-&amp;gt;m_dwID == EVENT_State_Changed_CONST) &lt;br /&gt;
        Follow me events&lt;br /&gt;
        Get_Video_Frame  (probably cause of automatic lighting on cameras)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
are processed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to use Lighting devices in Orbiter ==&lt;br /&gt;
&lt;br /&gt;
== Potential problems with current content of Lighting Plugin ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;My personal comment(Bulek): &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Inconsistency of group commands with device template :&lt;br /&gt;
Either group of commands should be determined by device template or we should have separate floorplan objects for separate command groups. Don&#039;t know which one or third path is correct in here. Any opinions ?&lt;br /&gt;
&#039;&#039;why is not state info actually drawn on floorplans ? it seems that OSD is properly set up - the cause must be somewhere else... I guess similar problem is with Blinds, Drapes and Shutter devices...&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;My plans:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;I plan to correct that behaviour, if leading developers confirm, that this won&#039;t break anything else. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;I also plan to support use of yet unsupported color gray (if light is dimmed) like:&lt;br /&gt;
 On 	LIGHT_CEILING_LIGHT_ON 		-256 			yellow&lt;br /&gt;
 Off 	LIGHT_CEILING_LIGHT_OFF 	-16777216               black&lt;br /&gt;
 Dim 	LIGHT_CEILING_LIGHT_DIM 	-4144960  		bright gray&lt;br /&gt;
 Same goes for :&lt;br /&gt;
 LIGHT_TABLE_LAMP,LIGHT_WALL_SCONCE,LIGHT_FLOOR_LAMP,LIGHT_CHANDALIER,LIGHT_PICTURE_LIGHT,LIGHT_ACCENT_LIGHT&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
[[User:Bulek|Bulek]] 15:37, 2 December 2008 (CET)&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Climate_Plugin&amp;diff=16442</id>
		<title>Climate Plugin</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Climate_Plugin&amp;diff=16442"/>
		<updated>2008-12-02T14:10:26Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* Potential problems with current content of Climate Plugin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Climate]]&lt;br /&gt;
[[Category:LinuxMCE_Plugins]]&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
Climate plugin takes care of climate devices. Handles commands, events and sets according device states. It also gives content to Orbiter plugin when it renders Climate devices on Orbiter&#039;s floorplans.&lt;br /&gt;
&lt;br /&gt;
== Important Code snippets ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Climate_Plugin::GetFloorplanDeviceInfo ===&lt;br /&gt;
This method determines what group of commands will be shown on right column beside floorplan. In the last if, it also determines what will be displayed on floorplan (OSD string is the content that will be displayed on floorplan)... It also determines the color of object on floorplan. But since state of climate device is something like QQ/WW/XX/YY/(ZZ) where :&lt;br /&gt;
#QQ      means ON or OFF state of device&lt;br /&gt;
#WW      means mode of operation for instance Thermostat: AUTO,HEAT,COOL,FAN_ONLY&lt;br /&gt;
#XX      means Fan mode: AUTO,HIGH&lt;br /&gt;
#YY      means Set point (usually desired temperature setting): integer number&lt;br /&gt;
#ZZ      means current temperature as reported by sensor, can be decimal number&lt;br /&gt;
&lt;br /&gt;
By default in &lt;br /&gt;
 if( (OSD=pDeviceData_Router-&amp;gt;m_sState_get())==&amp;quot;OFF&amp;quot; )&lt;br /&gt;
OSD is set to show all state info on floorplan. Also I think (need some guidance?) that state will never be just &amp;quot;OFF&amp;quot;, so all devices will be drawn with whole states and cold blue color on floorplans - but I could be missing something...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code of highlighted method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Climate_Plugin::GetFloorplanDeviceInfo(DeviceData_Router *pDeviceData_Router,EntertainArea *pEntertainArea,int iFloorplanObjectType,int &amp;amp;iPK_FloorplanObjectType_Color,int &amp;amp;Color,string &amp;amp;sDescription,string &amp;amp;OSD,int &amp;amp;PK_DesignObj_Toolbar)&lt;br /&gt;
{&lt;br /&gt;
	switch(iFloorplanObjectType)&lt;br /&gt;
	{&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_THERMOSTAT_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpThermostatControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_THERMOMETER_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=0;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_WEATHER_STATION_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=0;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_DAMPER_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=0;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_POOL_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpPoolControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_SPRINKLER_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpSprinklerControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	};&lt;br /&gt;
	if( (OSD=pDeviceData_Router-&amp;gt;m_sState_get())==&amp;quot;OFF&amp;quot; )&lt;br /&gt;
		iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_CLIMATE_THERMOSTAT_OFF_CONST;&lt;br /&gt;
	else&lt;br /&gt;
		iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_CLIMATE_THERMOSTAT_COOLING_CONST;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Climate_Plugin::PreprocessClimateMessage ===&lt;br /&gt;
&lt;br /&gt;
This one processes received messages/events. It can beclearly seen that currently following commands :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Set_Level_CONST )&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_On_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_Off_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Set_HeatCool_CONST )&lt;br /&gt;
			if( sState==&amp;quot;H&amp;quot; )&lt;br /&gt;
			else if( sState==&amp;quot;C&amp;quot; )&lt;br /&gt;
			else if( sState==&amp;quot;F&amp;quot; )&lt;br /&gt;
			else&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == COMMAND_Set_Fan_CONST )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and events &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID == EVENT_Temperature_Changed_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Set_Point_Chan_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Fan_Mode_Changed_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Mode_Changed_CONST )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
are processed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code of highlighted method:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Climate_Plugin::PreprocessClimateMessage(DeviceData_Router *pDevice,Message *pMessage)&lt;br /&gt;
{&lt;br /&gt;
	if( !pDevice || !pMessage || !pDevice-&amp;gt;WithinCategory(DEVICECATEGORY_Climate_Device_CONST) )&lt;br /&gt;
		return;&lt;br /&gt;
&lt;br /&gt;
	string sOn;&lt;br /&gt;
	string sMode;&lt;br /&gt;
	string sFan;&lt;br /&gt;
	string sSetPoint;&lt;br /&gt;
	string sTemp;&lt;br /&gt;
	GetStateVar(pDevice, sOn, sMode, sFan, sSetPoint, sTemp);&lt;br /&gt;
	&lt;br /&gt;
	// The State is in the format ON|OFF/SET TEMP (CURRENT TEMP)&lt;br /&gt;
	if( pMessage-&amp;gt;m_dwMessage_Type==MESSAGETYPE_COMMAND )&lt;br /&gt;
	{&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Set_Level_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_Level_CONST];&lt;br /&gt;
			if( sLevel.size()==0 )&lt;br /&gt;
				pMessage-&amp;gt;m_dwID=COMMAND_Generic_Off_CONST;&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				int iLevel = atoi(sLevel.c_str());&lt;br /&gt;
				if( sLevel[0]==&#039;+&#039; )&lt;br /&gt;
					iLevel = min(100, GetClimateLevel(pDevice,0)+iLevel);&lt;br /&gt;
				else if( sLevel[0]==&#039;-&#039; )&lt;br /&gt;
					iLevel = max(0, GetClimateLevel(pDevice,0)+iLevel);&lt;br /&gt;
&lt;br /&gt;
				if( iLevel==0 )&lt;br /&gt;
					pMessage-&amp;gt;m_dwID=COMMAND_Generic_Off_CONST;&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					pDevice-&amp;gt;m_sState_set(&amp;quot;ON/&amp;quot; + StringUtils::itos(iLevel) + GetTemperature(pDevice));&lt;br /&gt;
					pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_Level_CONST] = StringUtils::itos(iLevel);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_On_CONST )&lt;br /&gt;
			SetStateValue(pDevice, &amp;quot;ON&amp;quot;, sMode, sFan, sSetPoint, sTemp);&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_Off_CONST )&lt;br /&gt;
			SetStateValue(pDevice, &amp;quot;OFF&amp;quot;, sMode, sFan, sSetPoint, sTemp);&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Set_HeatCool_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: COMMAND_Set_HeatCool_CONST !&amp;quot;);&lt;br /&gt;
			string sState = pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_OnOff_CONST];&lt;br /&gt;
			if( sState==&amp;quot;H&amp;quot; )&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;HEAT&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
			else if( sState==&amp;quot;C&amp;quot; )&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;COOL&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
			else if( sState==&amp;quot;F&amp;quot; )&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;FAN_ONLY&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
			else&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;AUTO&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == COMMAND_Set_Fan_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: COMMAND_Set_Fan_CONST !&amp;quot;);&lt;br /&gt;
			string sState = pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_OnOff_CONST];&lt;br /&gt;
			if( 1 == atoi(sState.c_str()) )&lt;br /&gt;
			{&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;FAN_ONLY&amp;quot;, &amp;quot;HIGH&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;AUTO&amp;quot;, &amp;quot;AUTO&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else if( pMessage-&amp;gt;m_dwMessage_Type == MESSAGETYPE_EVENT )&lt;br /&gt;
	{&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID == EVENT_Temperature_Changed_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Temperature_Changed_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
			SetStateValue(pDevice, sOn, sMode, sFan, sSetPoint, sLevel);&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Set_Point_Chan_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Thermostat_Set_Point_Chan_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
			SetStateValue(pDevice, sOn, sMode, sFan, sLevel, sTemp);&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Fan_Mode_Changed_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Thermostat_Set_Point_Chan_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
			int iMode = atoi(sLevel.c_str());&lt;br /&gt;
			switch(iMode)&lt;br /&gt;
			{&lt;br /&gt;
				default:&lt;br /&gt;
				case 0:&lt;br /&gt;
				case 1:&lt;br /&gt;
					SetStateValue(pDevice, sOn, sMode, &amp;quot;AUTO&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
					&lt;br /&gt;
				case 2:&lt;br /&gt;
				case 3:&lt;br /&gt;
					SetStateValue(pDevice, sOn, sMode, &amp;quot;HIGH&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Mode_Changed_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Thermostat_Set_Point_Chan_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
				&lt;br /&gt;
			int iMode = atoi(sLevel.c_str());&lt;br /&gt;
			switch(iMode)&lt;br /&gt;
			{&lt;br /&gt;
				default:&lt;br /&gt;
				case 10:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;AUTO&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			&lt;br /&gt;
				case 1:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;HEAT&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			&lt;br /&gt;
				case 2:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;COOL&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			&lt;br /&gt;
				case 6:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;FAN_ONLY&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to use Climate devices in Orbiter ==&lt;br /&gt;
&lt;br /&gt;
== Potential problems with current content of Climate Plugin ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;My personal comment(Bulek): &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I think that Climate_Plugin::GetFloorplanDeviceInfo seems a bit unfinished. IT also displays all devices with all state info in same coldblue color, cause state is probably never just &amp;quot;OFF&amp;quot; as if clause is checking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;IMHO this is not convenient,it&#039;s not necessary to show all that info for instance for temperature sensors. This would be fairly easy to correct.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;My plans:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;I plan to correct that behaviour, if leading developers confirm, that this won&#039;t break anything else. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;I also plan to support use of more already defined colors like:&lt;br /&gt;
 Open 	CLIMATE_DAMPER_OPEN 		-256 			yellow&lt;br /&gt;
 Closed 	CLIMATE_DAMPER_CLOSED 	-4144960  		bright gray&lt;br /&gt;
 Off 	CLIMATE_THERMOSTAT_OFF 		-16777216               black&lt;br /&gt;
 Fan 	CLIMATE_THERMOSTAT_FAN 		-4144960  		bright gray&lt;br /&gt;
 Heating CLIMATE_THERMOSTAT_HEATING 	-65536 			red&lt;br /&gt;
 Cooling CLIMATE_THERMOSTAT_COOLING 	-16744256 		cold blue&lt;br /&gt;
&lt;br /&gt;
 On 	CLIMATE_SPRINKLER_ON 		-256 			yellow&lt;br /&gt;
 Off 	CLIMATE_SPRINKLER_OFF 		-8355712 		dark gray&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;More complicated to do opinion: I think that Thermostat is too complex including Heating,Cooling and Fan control. Maybe we also need some simpler devices like only heating thermostat and separate fan (ventilation control)...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
[[User:Bulek|Bulek]] 15:10, 2 December 2008 (CET)&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Climate_Plugin&amp;diff=16441</id>
		<title>Climate Plugin</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Climate_Plugin&amp;diff=16441"/>
		<updated>2008-12-02T13:45:37Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* Potential problems with current content of Climate Plugin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Climate]]&lt;br /&gt;
[[Category:LinuxMCE_Plugins]]&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
Climate plugin takes care of climate devices. Handles commands, events and sets according device states. It also gives content to Orbiter plugin when it renders Climate devices on Orbiter&#039;s floorplans.&lt;br /&gt;
&lt;br /&gt;
== Important Code snippets ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Climate_Plugin::GetFloorplanDeviceInfo ===&lt;br /&gt;
This method determines what group of commands will be shown on right column beside floorplan. In the last if, it also determines what will be displayed on floorplan (OSD string is the content that will be displayed on floorplan)... It also determines the color of object on floorplan. But since state of climate device is something like QQ/WW/XX/YY/(ZZ) where :&lt;br /&gt;
#QQ      means ON or OFF state of device&lt;br /&gt;
#WW      means mode of operation for instance Thermostat: AUTO,HEAT,COOL,FAN_ONLY&lt;br /&gt;
#XX      means Fan mode: AUTO,HIGH&lt;br /&gt;
#YY      means Set point (usually desired temperature setting): integer number&lt;br /&gt;
#ZZ      means current temperature as reported by sensor, can be decimal number&lt;br /&gt;
&lt;br /&gt;
By default in &lt;br /&gt;
 if( (OSD=pDeviceData_Router-&amp;gt;m_sState_get())==&amp;quot;OFF&amp;quot; )&lt;br /&gt;
OSD is set to show all state info on floorplan. Also I think (need some guidance?) that state will never be just &amp;quot;OFF&amp;quot;, so all devices will be drawn with whole states and cold blue color on floorplans - but I could be missing something...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code of highlighted method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Climate_Plugin::GetFloorplanDeviceInfo(DeviceData_Router *pDeviceData_Router,EntertainArea *pEntertainArea,int iFloorplanObjectType,int &amp;amp;iPK_FloorplanObjectType_Color,int &amp;amp;Color,string &amp;amp;sDescription,string &amp;amp;OSD,int &amp;amp;PK_DesignObj_Toolbar)&lt;br /&gt;
{&lt;br /&gt;
	switch(iFloorplanObjectType)&lt;br /&gt;
	{&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_THERMOSTAT_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpThermostatControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_THERMOMETER_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=0;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_WEATHER_STATION_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=0;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_DAMPER_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=0;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_POOL_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpPoolControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_SPRINKLER_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpSprinklerControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	};&lt;br /&gt;
	if( (OSD=pDeviceData_Router-&amp;gt;m_sState_get())==&amp;quot;OFF&amp;quot; )&lt;br /&gt;
		iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_CLIMATE_THERMOSTAT_OFF_CONST;&lt;br /&gt;
	else&lt;br /&gt;
		iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_CLIMATE_THERMOSTAT_COOLING_CONST;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Climate_Plugin::PreprocessClimateMessage ===&lt;br /&gt;
&lt;br /&gt;
This one processes received messages/events. It can beclearly seen that currently following commands :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Set_Level_CONST )&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_On_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_Off_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Set_HeatCool_CONST )&lt;br /&gt;
			if( sState==&amp;quot;H&amp;quot; )&lt;br /&gt;
			else if( sState==&amp;quot;C&amp;quot; )&lt;br /&gt;
			else if( sState==&amp;quot;F&amp;quot; )&lt;br /&gt;
			else&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == COMMAND_Set_Fan_CONST )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and events &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID == EVENT_Temperature_Changed_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Set_Point_Chan_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Fan_Mode_Changed_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Mode_Changed_CONST )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
are processed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code of highlighted method:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Climate_Plugin::PreprocessClimateMessage(DeviceData_Router *pDevice,Message *pMessage)&lt;br /&gt;
{&lt;br /&gt;
	if( !pDevice || !pMessage || !pDevice-&amp;gt;WithinCategory(DEVICECATEGORY_Climate_Device_CONST) )&lt;br /&gt;
		return;&lt;br /&gt;
&lt;br /&gt;
	string sOn;&lt;br /&gt;
	string sMode;&lt;br /&gt;
	string sFan;&lt;br /&gt;
	string sSetPoint;&lt;br /&gt;
	string sTemp;&lt;br /&gt;
	GetStateVar(pDevice, sOn, sMode, sFan, sSetPoint, sTemp);&lt;br /&gt;
	&lt;br /&gt;
	// The State is in the format ON|OFF/SET TEMP (CURRENT TEMP)&lt;br /&gt;
	if( pMessage-&amp;gt;m_dwMessage_Type==MESSAGETYPE_COMMAND )&lt;br /&gt;
	{&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Set_Level_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_Level_CONST];&lt;br /&gt;
			if( sLevel.size()==0 )&lt;br /&gt;
				pMessage-&amp;gt;m_dwID=COMMAND_Generic_Off_CONST;&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				int iLevel = atoi(sLevel.c_str());&lt;br /&gt;
				if( sLevel[0]==&#039;+&#039; )&lt;br /&gt;
					iLevel = min(100, GetClimateLevel(pDevice,0)+iLevel);&lt;br /&gt;
				else if( sLevel[0]==&#039;-&#039; )&lt;br /&gt;
					iLevel = max(0, GetClimateLevel(pDevice,0)+iLevel);&lt;br /&gt;
&lt;br /&gt;
				if( iLevel==0 )&lt;br /&gt;
					pMessage-&amp;gt;m_dwID=COMMAND_Generic_Off_CONST;&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					pDevice-&amp;gt;m_sState_set(&amp;quot;ON/&amp;quot; + StringUtils::itos(iLevel) + GetTemperature(pDevice));&lt;br /&gt;
					pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_Level_CONST] = StringUtils::itos(iLevel);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_On_CONST )&lt;br /&gt;
			SetStateValue(pDevice, &amp;quot;ON&amp;quot;, sMode, sFan, sSetPoint, sTemp);&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_Off_CONST )&lt;br /&gt;
			SetStateValue(pDevice, &amp;quot;OFF&amp;quot;, sMode, sFan, sSetPoint, sTemp);&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Set_HeatCool_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: COMMAND_Set_HeatCool_CONST !&amp;quot;);&lt;br /&gt;
			string sState = pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_OnOff_CONST];&lt;br /&gt;
			if( sState==&amp;quot;H&amp;quot; )&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;HEAT&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
			else if( sState==&amp;quot;C&amp;quot; )&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;COOL&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
			else if( sState==&amp;quot;F&amp;quot; )&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;FAN_ONLY&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
			else&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;AUTO&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == COMMAND_Set_Fan_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: COMMAND_Set_Fan_CONST !&amp;quot;);&lt;br /&gt;
			string sState = pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_OnOff_CONST];&lt;br /&gt;
			if( 1 == atoi(sState.c_str()) )&lt;br /&gt;
			{&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;FAN_ONLY&amp;quot;, &amp;quot;HIGH&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;AUTO&amp;quot;, &amp;quot;AUTO&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else if( pMessage-&amp;gt;m_dwMessage_Type == MESSAGETYPE_EVENT )&lt;br /&gt;
	{&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID == EVENT_Temperature_Changed_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Temperature_Changed_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
			SetStateValue(pDevice, sOn, sMode, sFan, sSetPoint, sLevel);&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Set_Point_Chan_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Thermostat_Set_Point_Chan_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
			SetStateValue(pDevice, sOn, sMode, sFan, sLevel, sTemp);&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Fan_Mode_Changed_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Thermostat_Set_Point_Chan_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
			int iMode = atoi(sLevel.c_str());&lt;br /&gt;
			switch(iMode)&lt;br /&gt;
			{&lt;br /&gt;
				default:&lt;br /&gt;
				case 0:&lt;br /&gt;
				case 1:&lt;br /&gt;
					SetStateValue(pDevice, sOn, sMode, &amp;quot;AUTO&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
					&lt;br /&gt;
				case 2:&lt;br /&gt;
				case 3:&lt;br /&gt;
					SetStateValue(pDevice, sOn, sMode, &amp;quot;HIGH&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Mode_Changed_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Thermostat_Set_Point_Chan_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
				&lt;br /&gt;
			int iMode = atoi(sLevel.c_str());&lt;br /&gt;
			switch(iMode)&lt;br /&gt;
			{&lt;br /&gt;
				default:&lt;br /&gt;
				case 10:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;AUTO&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			&lt;br /&gt;
				case 1:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;HEAT&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			&lt;br /&gt;
				case 2:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;COOL&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			&lt;br /&gt;
				case 6:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;FAN_ONLY&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to use Climate devices in Orbiter ==&lt;br /&gt;
&lt;br /&gt;
== Potential problems with current content of Climate Plugin ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;My personal comment(Bulek): &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I think that Climate_Plugin::GetFloorplanDeviceInfo seems a bit unfinished. IT also displays all devices with all state info in same coldblue color, cause state is probably never just &amp;quot;OFF&amp;quot; as if clause is checking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;IMHO this is not convenient,it&#039;s not necessary to show all that info for instance for temperature sensors. This would be fairly easy to correct.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;My plans:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;I plan to correct that behaviour, if leading developers confirm, that this won&#039;t break anything else. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;I also plan to support use of more already defined colors like:&lt;br /&gt;
 Open 	CLIMATE_DAMPER_OPEN 		-256 			yellow&lt;br /&gt;
 Closed 	CLIMATE_DAMPER_CLOSED 	-4144960  		bright gray&lt;br /&gt;
 Off 	CLIMATE_THERMOSTAT_OFF 		-16777216               black&lt;br /&gt;
 Fan 	CLIMATE_THERMOSTAT_FAN 		-4144960  		bright gray&lt;br /&gt;
 Heating CLIMATE_THERMOSTAT_HEATING 	-65536 			red&lt;br /&gt;
 Cooling CLIMATE_THERMOSTAT_COOLING 	-16744256 		cold blue&lt;br /&gt;
&lt;br /&gt;
 On 	CLIMATE_SPRINKLER_ON 		-256 			yellow&lt;br /&gt;
 Off 	CLIMATE_SPRINKLER_OFF 		-8355712 		dark gray&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;More complicated to do opinion: I think that Thermostat is too complex including Heating,Cooling and Fan control. Maybe we also need some simpler devices like only heating thermostat and separate fan (ventilation control)...&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Climate_Plugin&amp;diff=16440</id>
		<title>Climate Plugin</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Climate_Plugin&amp;diff=16440"/>
		<updated>2008-12-02T13:44:09Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Climate]]&lt;br /&gt;
[[Category:LinuxMCE_Plugins]]&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
Climate plugin takes care of climate devices. Handles commands, events and sets according device states. It also gives content to Orbiter plugin when it renders Climate devices on Orbiter&#039;s floorplans.&lt;br /&gt;
&lt;br /&gt;
== Important Code snippets ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Climate_Plugin::GetFloorplanDeviceInfo ===&lt;br /&gt;
This method determines what group of commands will be shown on right column beside floorplan. In the last if, it also determines what will be displayed on floorplan (OSD string is the content that will be displayed on floorplan)... It also determines the color of object on floorplan. But since state of climate device is something like QQ/WW/XX/YY/(ZZ) where :&lt;br /&gt;
#QQ      means ON or OFF state of device&lt;br /&gt;
#WW      means mode of operation for instance Thermostat: AUTO,HEAT,COOL,FAN_ONLY&lt;br /&gt;
#XX      means Fan mode: AUTO,HIGH&lt;br /&gt;
#YY      means Set point (usually desired temperature setting): integer number&lt;br /&gt;
#ZZ      means current temperature as reported by sensor, can be decimal number&lt;br /&gt;
&lt;br /&gt;
By default in &lt;br /&gt;
 if( (OSD=pDeviceData_Router-&amp;gt;m_sState_get())==&amp;quot;OFF&amp;quot; )&lt;br /&gt;
OSD is set to show all state info on floorplan. Also I think (need some guidance?) that state will never be just &amp;quot;OFF&amp;quot;, so all devices will be drawn with whole states and cold blue color on floorplans - but I could be missing something...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code of highlighted method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Climate_Plugin::GetFloorplanDeviceInfo(DeviceData_Router *pDeviceData_Router,EntertainArea *pEntertainArea,int iFloorplanObjectType,int &amp;amp;iPK_FloorplanObjectType_Color,int &amp;amp;Color,string &amp;amp;sDescription,string &amp;amp;OSD,int &amp;amp;PK_DesignObj_Toolbar)&lt;br /&gt;
{&lt;br /&gt;
	switch(iFloorplanObjectType)&lt;br /&gt;
	{&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_THERMOSTAT_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpThermostatControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_THERMOMETER_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=0;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_WEATHER_STATION_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=0;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_DAMPER_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=0;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_POOL_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpPoolControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	case FLOORPLANOBJECTTYPE_CLIMATE_SPRINKLER_CONST:&lt;br /&gt;
		PK_DesignObj_Toolbar=DESIGNOBJ_grpSprinklerControls_CONST;&lt;br /&gt;
		break;&lt;br /&gt;
	};&lt;br /&gt;
	if( (OSD=pDeviceData_Router-&amp;gt;m_sState_get())==&amp;quot;OFF&amp;quot; )&lt;br /&gt;
		iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_CLIMATE_THERMOSTAT_OFF_CONST;&lt;br /&gt;
	else&lt;br /&gt;
		iPK_FloorplanObjectType_Color = FLOORPLANOBJECTTYPE_COLOR_CLIMATE_THERMOSTAT_COOLING_CONST;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Climate_Plugin::PreprocessClimateMessage ===&lt;br /&gt;
&lt;br /&gt;
This one processes received messages/events. It can beclearly seen that currently following commands :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Set_Level_CONST )&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_On_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_Off_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Set_HeatCool_CONST )&lt;br /&gt;
			if( sState==&amp;quot;H&amp;quot; )&lt;br /&gt;
			else if( sState==&amp;quot;C&amp;quot; )&lt;br /&gt;
			else if( sState==&amp;quot;F&amp;quot; )&lt;br /&gt;
			else&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == COMMAND_Set_Fan_CONST )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
and events &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID == EVENT_Temperature_Changed_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Set_Point_Chan_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Fan_Mode_Changed_CONST )&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Mode_Changed_CONST )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
are processed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code of highlighted method:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Climate_Plugin::PreprocessClimateMessage(DeviceData_Router *pDevice,Message *pMessage)&lt;br /&gt;
{&lt;br /&gt;
	if( !pDevice || !pMessage || !pDevice-&amp;gt;WithinCategory(DEVICECATEGORY_Climate_Device_CONST) )&lt;br /&gt;
		return;&lt;br /&gt;
&lt;br /&gt;
	string sOn;&lt;br /&gt;
	string sMode;&lt;br /&gt;
	string sFan;&lt;br /&gt;
	string sSetPoint;&lt;br /&gt;
	string sTemp;&lt;br /&gt;
	GetStateVar(pDevice, sOn, sMode, sFan, sSetPoint, sTemp);&lt;br /&gt;
	&lt;br /&gt;
	// The State is in the format ON|OFF/SET TEMP (CURRENT TEMP)&lt;br /&gt;
	if( pMessage-&amp;gt;m_dwMessage_Type==MESSAGETYPE_COMMAND )&lt;br /&gt;
	{&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Set_Level_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_Level_CONST];&lt;br /&gt;
			if( sLevel.size()==0 )&lt;br /&gt;
				pMessage-&amp;gt;m_dwID=COMMAND_Generic_Off_CONST;&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				int iLevel = atoi(sLevel.c_str());&lt;br /&gt;
				if( sLevel[0]==&#039;+&#039; )&lt;br /&gt;
					iLevel = min(100, GetClimateLevel(pDevice,0)+iLevel);&lt;br /&gt;
				else if( sLevel[0]==&#039;-&#039; )&lt;br /&gt;
					iLevel = max(0, GetClimateLevel(pDevice,0)+iLevel);&lt;br /&gt;
&lt;br /&gt;
				if( iLevel==0 )&lt;br /&gt;
					pMessage-&amp;gt;m_dwID=COMMAND_Generic_Off_CONST;&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					pDevice-&amp;gt;m_sState_set(&amp;quot;ON/&amp;quot; + StringUtils::itos(iLevel) + GetTemperature(pDevice));&lt;br /&gt;
					pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_Level_CONST] = StringUtils::itos(iLevel);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_On_CONST )&lt;br /&gt;
			SetStateValue(pDevice, &amp;quot;ON&amp;quot;, sMode, sFan, sSetPoint, sTemp);&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Generic_Off_CONST )&lt;br /&gt;
			SetStateValue(pDevice, &amp;quot;OFF&amp;quot;, sMode, sFan, sSetPoint, sTemp);&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID==COMMAND_Set_HeatCool_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: COMMAND_Set_HeatCool_CONST !&amp;quot;);&lt;br /&gt;
			string sState = pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_OnOff_CONST];&lt;br /&gt;
			if( sState==&amp;quot;H&amp;quot; )&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;HEAT&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
			else if( sState==&amp;quot;C&amp;quot; )&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;COOL&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
			else if( sState==&amp;quot;F&amp;quot; )&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;FAN_ONLY&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
			else&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;AUTO&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == COMMAND_Set_Fan_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: COMMAND_Set_Fan_CONST !&amp;quot;);&lt;br /&gt;
			string sState = pMessage-&amp;gt;m_mapParameters[COMMANDPARAMETER_OnOff_CONST];&lt;br /&gt;
			if( 1 == atoi(sState.c_str()) )&lt;br /&gt;
			{&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;FAN_ONLY&amp;quot;, &amp;quot;HIGH&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				SetStateValue(pDevice, sOn, &amp;quot;AUTO&amp;quot;, &amp;quot;AUTO&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else if( pMessage-&amp;gt;m_dwMessage_Type == MESSAGETYPE_EVENT )&lt;br /&gt;
	{&lt;br /&gt;
		if( pMessage-&amp;gt;m_dwID == EVENT_Temperature_Changed_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Temperature_Changed_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
			SetStateValue(pDevice, sOn, sMode, sFan, sSetPoint, sLevel);&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Set_Point_Chan_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Thermostat_Set_Point_Chan_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
			SetStateValue(pDevice, sOn, sMode, sFan, sLevel, sTemp);&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Fan_Mode_Changed_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Thermostat_Set_Point_Chan_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
			int iMode = atoi(sLevel.c_str());&lt;br /&gt;
			switch(iMode)&lt;br /&gt;
			{&lt;br /&gt;
				default:&lt;br /&gt;
				case 0:&lt;br /&gt;
				case 1:&lt;br /&gt;
					SetStateValue(pDevice, sOn, sMode, &amp;quot;AUTO&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
					&lt;br /&gt;
				case 2:&lt;br /&gt;
				case 3:&lt;br /&gt;
					SetStateValue(pDevice, sOn, sMode, &amp;quot;HIGH&amp;quot;, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if( pMessage-&amp;gt;m_dwID == EVENT_Thermostat_Mode_Changed_CONST )&lt;br /&gt;
		{&lt;br /&gt;
			LoggerWrapper::GetInstance()-&amp;gt;Write(LV_CRITICAL,&amp;quot;Climate_Plugin: EVENT_Thermostat_Set_Point_Chan_CONST !&amp;quot;);&lt;br /&gt;
			// Replace the current temp&lt;br /&gt;
			string sLevel = pMessage-&amp;gt;m_mapParameters[EVENTPARAMETER_Value_CONST];&lt;br /&gt;
				&lt;br /&gt;
			int iMode = atoi(sLevel.c_str());&lt;br /&gt;
			switch(iMode)&lt;br /&gt;
			{&lt;br /&gt;
				default:&lt;br /&gt;
				case 10:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;AUTO&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			&lt;br /&gt;
				case 1:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;HEAT&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			&lt;br /&gt;
				case 2:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;COOL&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			&lt;br /&gt;
				case 6:&lt;br /&gt;
					SetStateValue(pDevice, sOn, &amp;quot;FAN_ONLY&amp;quot;, sFan, sSetPoint, sTemp);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to use Climate devices in Orbiter ==&lt;br /&gt;
&lt;br /&gt;
== Potential problems with current content of Climate Plugin ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;My personal comment(Bulek): &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I think that Climate_Plugin::GetFloorplanDeviceInfo seems a bit unfinished. IT also displays all devices with all state info in same coldblue color, cause state is probably never just &amp;quot;OFF&amp;quot; as if clause is checking.&lt;br /&gt;
IMHO this is not convenient,it&#039;s not necessary to show all that info for instance for temperature sensors. This would be fairly easy to achieve.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;My plans:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;I plan to correct that behaviour, if leading developers confirm, that this won&#039;t break anything else. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;I also plan to support use of more already defined colors like:&lt;br /&gt;
 Open 	CLIMATE_DAMPER_OPEN 		-256 			yellow&lt;br /&gt;
 Closed 	CLIMATE_DAMPER_CLOSED 	-4144960  		bright gray&lt;br /&gt;
 Off 	CLIMATE_THERMOSTAT_OFF 		-16777216               black&lt;br /&gt;
 Fan 	CLIMATE_THERMOSTAT_FAN 		-4144960  		bright gray&lt;br /&gt;
 Heating CLIMATE_THERMOSTAT_HEATING 	-65536 			red&lt;br /&gt;
 Cooling CLIMATE_THERMOSTAT_COOLING 	-16744256 		cold blue&lt;br /&gt;
&lt;br /&gt;
 On 	CLIMATE_SPRINKLER_ON 		-256 			yellow&lt;br /&gt;
 Off 	CLIMATE_SPRINKLER_OFF 		-8355712 		dark gray&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;More complicated to do opinion: I think that Thermostat is too complex including Heating,Cooling and Fan control. Maybe we also need some simpler devices like only heating thermostat and separate fan (ventilation control)...&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Climate_Plugin&amp;diff=16439</id>
		<title>Climate Plugin</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Climate_Plugin&amp;diff=16439"/>
		<updated>2008-12-02T12:59:20Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Climate]]&lt;br /&gt;
[[Category:LinuxMCE_Plugins]]&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
Climate plugin takes care of climate devices. Handles commands, events and sets according device states. It also gives content to Orbiter plugin when it renders Climate devices on Orbiter&#039;s floorplans.&lt;br /&gt;
&lt;br /&gt;
== How to use Climate devices in Orbiter ==&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Datagrid_Plugin&amp;diff=16438</id>
		<title>Datagrid Plugin</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Datagrid_Plugin&amp;diff=16438"/>
		<updated>2008-12-02T12:11:59Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
[[Category:LinuxMCE_Plugins]]&lt;br /&gt;
&lt;br /&gt;
Datagrid_Plugin provides an useful feature for LinuxMCE, allowing other plug-ins to create data-grids which are serialized and sent to Orbiter(s). In order to create a data-grid, you will need to create and register a data-grid generator.&lt;br /&gt;
&lt;br /&gt;
== How to create a data-grid generator ==&lt;br /&gt;
&lt;br /&gt;
# Add a new record in Datagrid table from pluto_main database.&lt;br /&gt;
# Then you&#039;ll have to use our sql2cpp tool to regenerates pluto_main database wrapper project. To confirm that it worked, go to pluto_main/Define_Database.h and scroll down, searching for the record you&#039;ve just added. A new constant should be define there for your data-grid. Then commit that header file. &#039;&#039;&#039;Note:&#039;&#039;&#039; It is recommended to add that record on our main server rather that on your local server. If you choose the second solution, you&#039;ll need to use sqlCVS in order to synchronize your database with our database.&lt;br /&gt;
# Once this step is done, you can go ahead and choose the plugin which handles better the type of data-grid you want to create. Let&#039;s say you want to display a list with files from the hard-drive; in this case you might want to choose File_Grids_Plugin. If it&#039;s related with some infrared stuff, Infrared_Plugin you&#039;ll be you choice. If the data-grid you want to create doesn&#039;t seem to match any plug-in scope, General_Info_Plugin is the best choice.&lt;br /&gt;
# Add to that plug-in a method with this signature:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&#039;&#039;class DataGridTable *My_Datagrid_Generator(string GridID, string Parms, void *ExtraData, int *iPK_Variable, string *sValue_To_Assign, class Message *pMessage);&#039;&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In that method, you have to create a DatagridTable object, create cells (DataGridCell objects) and assign them to the data-grid:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&#039;&#039;DataGridTable *pDataGrid = new DataGridTable();&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;//... some code here, maybe within a loop&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;DataGridCell *pCell = new DataGridCell(sTextToDisplay, sCellValue);&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;pDataGrid-&amp;gt;SetData(nColumn, nRow, pCell);&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;//... some code here&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;//in the end, just return the datagrid&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;//Datagrid_Plugin will un-allocate the memory for data-grid once this was serialized and sent to Orbiter&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;return pDataGrid&#039;&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== How to register a data-grid generator ==&lt;br /&gt;
This is the easiest part: go to plugin&#039;s Register method and add a line like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&#039;&#039;m_pDatagrid_Plugin-&amp;gt;RegisterDatagridGenerator(&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;    new DataGridGeneratorCallBack(this, (DCEDataGridGeneratorFn)(&amp;amp;A_Pluto_Plugin::My_Datagrid_Generator)),&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;    DATAGRID_MY_DATAGRID_NAME_CONST,&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;    PK_DeviceTemplate_get() &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;);&#039;&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Where you&#039;ll have to replace A_Pluto_Plugin with the name of the plug-in were you&#039;ve created that method, My_Datagrid_Generator with the name of your data-grid generator method and DATAGRID_MY_DATAGRID_NAME_CONST with the constant generator in pluto_main/Define_Datagrid.h&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to use a data-grid in Orbiter ==&lt;br /&gt;
&lt;br /&gt;
Now you are ready to use the data-grid. For this, you&#039;ll have to use our tool &amp;quot;Designer&amp;quot; to add a data-grid object to a screen, with the PK_Datagrid the PK of the record you&#039;ve added to Data-grid table. Most of the time, this task is accomplished by one of our guys which take care of Orbiter UI. Once the changes are made with the designer, you can just regenerate Orbiter with OrbiterGen tool, then go to that screen where the data-grid is and use it.&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Telecom_Plugin&amp;diff=16437</id>
		<title>Telecom Plugin</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Telecom_Plugin&amp;diff=16437"/>
		<updated>2008-12-02T12:11:45Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Telecom]]&lt;br /&gt;
[[Category:LinuxMCE_Devices]]&lt;br /&gt;
[[Category:LinuxMCE_Plugins]]&lt;br /&gt;
== Description ==&lt;br /&gt;
This one provides standard command interface for the PBX, theoretically it can be plugged with any PBX, not sure if it can be done.&lt;br /&gt;
&lt;br /&gt;
It has a virtual device id = -107, this way all telecom commands from orbiter are sent to Telecom_Plugin, and then it routes commands to specific devices (like from Orbiter to child Embedded Phone) or to Asterisk.&lt;br /&gt;
&lt;br /&gt;
It depends on command the sender and such parameters as device or channel_ids.&lt;br /&gt;
&lt;br /&gt;
For example PL_Originatecalled with PK_Device==EmbeddedPhone will send CMD_Phone_Initiate to the device or CMD_PBX_Originate to asterisk. The transfer when the call is already a conference call will be simple joining into the conference room instead of a blind transfer and so on.&lt;br /&gt;
&lt;br /&gt;
It also provides several DataGrids getting information from internal datastructures in case of ActiveCalls, pluto_main for SpeedDial and asteriskcdr for RecentCalls.&lt;br /&gt;
&lt;br /&gt;
== Communication with Asterisk ==&lt;br /&gt;
In most cases the Telecom_Plugin keeps almost the same list of channels as [[LinuxMCE-asterisk|Asterisk]]. The Asterisk is notifying Telecom_Plugin on all changes and they keep the list in sync.&lt;br /&gt;
&lt;br /&gt;
In most of the commands(and events) exchanged between Asterisk and Telecom_Plugin one of the parameters is CallID or ChannelID string representing channels connected into a call (something like &#039;&#039;SIP/202-9577 IAX2/teliax-out/6&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Only Asterisk is sending that channels were changed, Telecom_Plugin just acknowledges it and changes his state accordingly.&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Climate_Plugin&amp;diff=16436</id>
		<title>Climate Plugin</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Climate_Plugin&amp;diff=16436"/>
		<updated>2008-12-02T12:11:00Z</updated>

		<summary type="html">&lt;p&gt;Bulek: New page: Category:Climate Category:LinuxMCE_Plugins == Description ==   == How to use Climate devices in Orbiter ==&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Climate]]&lt;br /&gt;
[[Category:LinuxMCE_Plugins]]&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to use Climate devices in Orbiter ==&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Lighting_Plugin&amp;diff=16435</id>
		<title>Lighting Plugin</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Lighting_Plugin&amp;diff=16435"/>
		<updated>2008-12-02T12:10:55Z</updated>

		<summary type="html">&lt;p&gt;Bulek: New page: Category:Lighting Category:LinuxMCE_Plugins  == Description ==  == How to use Climate devices in Orbiter ==&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Lighting]]&lt;br /&gt;
[[Category:LinuxMCE_Plugins]]&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
== How to use Climate devices in Orbiter ==&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Cisco_7970&amp;diff=16146</id>
		<title>Cisco 7970</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Cisco_7970&amp;diff=16146"/>
		<updated>2008-11-08T13:48:02Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* Usefull links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[Category: Phones]]&lt;br /&gt;
[[Category: Orbiters]]&lt;br /&gt;
&lt;br /&gt;
== Preface ==&lt;br /&gt;
[[Image:Cisco7909.JPG]]&lt;br /&gt;
&lt;br /&gt;
LinuxMCE allows the use of many devices as [[Orbiters]]. One of them is the [http://www.cisco.com/en/US/products/hw/phones/ps379/ps5440/index.html CISCO 7970]. You can use it to control your home as well as to make calls.&lt;br /&gt;
&lt;br /&gt;
To add a new CISCO 7970 phone as an Orbiter follow these simple instructions (from information in the [http://forum.linuxmce.org/ LinuxMCE support forum]).&lt;br /&gt;
&lt;br /&gt;
== Preparation ==&lt;br /&gt;
&lt;br /&gt;
CISCO 7970 phone is plug-in-play device; LinuxMCE adds it automatically when it is plugged into the network. But first, we have to make some preparations. Run an Orbiter. Be sure that no others tasks are running.&lt;br /&gt;
Check the DHCP setting of your phone. It should be something like that: &amp;quot;get IP via DHCP and no alternative servers&amp;quot;.&lt;br /&gt;
Check the range of MAC addresses:&lt;br /&gt;
#Go to Advanced --&amp;gt; Configuration --&amp;gt; Device Template.&lt;br /&gt;
#Chose manufacturer CISCO. You should see in the right list at least two models: 7970 and 7960.&lt;br /&gt;
#Press the button &#039;Show model&#039;.&lt;br /&gt;
#On the opened window check &#039;Range MAC addresses&#039;. The range contains two big decimal digits. To get correct range for your phone first see its MAC address. A MAC address is six groups of two hexadecimal digits, separated by hyphens (&amp;lt;strong&amp;gt;-&amp;lt;/strong&amp;gt;) or colons (&amp;lt;strong&amp;gt;:&amp;lt;/strong&amp;gt;). The first three groups identify a maker. You leave them and fill the rest by 0 and F. For example, if MAC is &amp;lt;strong&amp;gt;00:16:78:CD:01:D8&amp;lt;/strong&amp;gt; its range will be &amp;lt;strong&amp;gt;00:16:78:00:00:00&amp;lt;/strong&amp;gt; - &amp;lt;strong&amp;gt;00:16:78:FF:FF:FF&amp;lt;/strong&amp;gt;. After that you should convert those two values into LinuxMCE representation. To do that run a script &amp;lt;strong&amp;gt;/usr/pluto/bin/convert_mac&amp;lt;/strong&amp;gt; and pass the hexadecimal values as parameters:&lt;br /&gt;
 /usr/pluto/bin/convert_mac 00:16:78:00:00:00&lt;br /&gt;
 /usr/pluto/bin/convert_mac 00:16:78:FF:FF:FF&lt;br /&gt;
:As result you will get two big decimal digits. Add them to the phone template and store.&lt;br /&gt;
If you have problems with phone installation, it may be related to firmware. The phone should have the latest firmware upgrade. (I didn&#039;t have any problem with existing firmware on my CISCO 7970, though).&lt;br /&gt;
&lt;br /&gt;
Note for &#039;&#039;&#039;CISCO 7960 SIP&#039;&#039;&#039; users: if your phone fails to register with asterisk then edit /tftpboot/SIPDefault.cnf and append &lt;br /&gt;
 nat_enable: 1&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
#Plug the phone power and network cable.  Note if you have two network cards on your core you should plug network cable in the right switch.&lt;br /&gt;
#During boot of the phone after 2-3 minutes you should see on the Orbiter a message about new device with your phone MAC address was detected. You should click by caption &amp;quot;Cisco 7970&amp;quot; below that.&lt;br /&gt;
#After that the phone should be registered with asterisk and you can see a normal CISCO screen. &lt;br /&gt;
#However, it&#039;ll take another 2-3 minutes to generate a new Orbiter for CISCO7970. &lt;br /&gt;
#When this operation finishes you&#039;ll see a message on the Orbiter screen. Make a quick reload of router (Wizard -- Reboot -- Quick Reload Router. I also rebooted CISCO 7970 because I didn&#039;t see anything in the menu Services).&lt;br /&gt;
#Now go to menu Services on CISCO 7970 and chose Orbiter.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
*&amp;lt;u&amp;gt;Problem:&amp;lt;/u&amp;gt; Phone boots successfully but there is no any message on the Orbiter&#039;s screen.&lt;br /&gt;
*&amp;lt;u&amp;gt;Solution:&amp;lt;/u&amp;gt; If the message doesn&#039;t appear check MAC addresses range.&lt;br /&gt;
&lt;br /&gt;
== Some useful tips ==&lt;br /&gt;
*To reset a Network configuration of CISCO79xx go to menu &#039;Network Setting&#039; and press the following sequence of buttons: &lt;br /&gt;
 **#**&lt;br /&gt;
*To check network communications between CISCO7970 and CORE run tcpdump on the CORE:&lt;br /&gt;
 tcpdump -i eth1 [CISCO7970 IP Address]&lt;br /&gt;
or to see detailed packets information:&lt;br /&gt;
 tcpdump -i -vv eth1 [CISCO7970 IP Address]&lt;br /&gt;
or change TimeZone change following line in /tftpboot/SEPDefault7970.cnf.xml (you can find proper TimeZone strings [http://www.voip-info.org/wiki/view/Asterisk+phone+cisco+7970+SIP here] ):&lt;br /&gt;
 &amp;lt;timeZone&amp;gt;W. Europe Standard/Daylight Time&amp;lt;/timeZone&amp;gt;&lt;br /&gt;
*To add the voicemail options to the message button, edit the sccp.conf file and add the following to the lines section of each phone:&lt;br /&gt;
 mailbox=&amp;lt;extension&amp;gt;&lt;br /&gt;
 vmnum=*97&lt;br /&gt;
Email suggestions to: stepanov.michael [at] gmail [dot] com or leave a comment.&lt;br /&gt;
&lt;br /&gt;
==Add Directory buttons to Cisco IP Phone==&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
Download the files here: [http://www.unit-e.cc/~tschak/Directory.zip http://www.unit-e.cc/~tschak/Directory.zip]&lt;br /&gt;
&lt;br /&gt;
=== Synopsis ===&lt;br /&gt;
&lt;br /&gt;
This set of files adds a working Directory for your Cisco IP phone. It has been tested on my Cisco 7970 phone, but does not use any additional features, so it should work on any of the other Cisco IP phones that support XML services, such as the Cisco 7960. &lt;br /&gt;
&lt;br /&gt;
It adds the following Features:&lt;br /&gt;
&lt;br /&gt;
* Directory button now works!&lt;br /&gt;
* Works with Contacts from the Pluto phone directory&lt;br /&gt;
* Paginates them based on # of entries in phone book&lt;br /&gt;
* Shows the phone type.&lt;br /&gt;
&lt;br /&gt;
=== Installing this Patch ===&lt;br /&gt;
&lt;br /&gt;
* Unpack the files to the pluto-admin directory. (/var/www/pluto-admin/)&lt;br /&gt;
* edit the file /tftpboot/SEPDefault7970.cnf.xml (it just needs to be the default xml for your cisco phone, adjust as needed.)&lt;br /&gt;
** Find the &amp;lt;directoryURL&amp;gt;&amp;lt;/directoryURL&amp;gt; tags, and place &#039;&#039;&#039;http://192.168.80.1/pluto-admin/directory.php&#039;&#039;&#039; between them.&lt;br /&gt;
* Reboot the phone by pressing the settings button, and pressing the following button sequence &#039;&#039;&#039;**#**&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Once the phone boots, try the directory by pressing the Directory button!&lt;br /&gt;
&lt;br /&gt;
If there are any problems, let me know --[[User:Tschak909|Tschak909]] ( thom.cherryhomes (at) gmail (dot) com ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Add usefull XML services beside Orbiter==&lt;br /&gt;
&lt;br /&gt;
Currently this feature doesn&#039;t make much sense if you use Orbiter on phone, cause it&#039;s constantly refreshing and you loose focus of any other menu on the phone.... I&#039;ve searched internet a bit and found few usefull applications that will let you put rss or xml feeds to your 7970.&lt;br /&gt;
&lt;br /&gt;
Basically you can try rss or xml feeds directly, but also there is usefull script that automatically converts pages to proper format - for example:&lt;br /&gt;
 http://phone-xml.berbee.com/menu.xml?opts=67&lt;br /&gt;
&lt;br /&gt;
Gives you rss feeds from CNN and BBC. You can also use this script to convert any rss feed to same shape (it&#039;s weather rss feed in my country):&lt;br /&gt;
&lt;br /&gt;
 http://phone-xml.berbee.com/rss/items.php?url=http://vreme.zurnal24.si/xml/rss/vreme.xml&lt;br /&gt;
&lt;br /&gt;
I have further modified file /var/www/pluto-admin/ServicesMenu.php - and added more entries - basically it&#039;s XML list of various URLs to follow.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usefull links==&lt;br /&gt;
&lt;br /&gt;
[http://www.asteriskpbx.de/index.php?open79xx Open 79XX XML Directory] - Gives you possibility to edit info showed/used on Phone... I&#039;ve just tried ver 1.2 and it seems really useful. Beside contacts and search capability, it allows user to organize external xml services, memos, notes together in one easy to traverse menu... Really worth of consideration...&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Cisco_7970&amp;diff=16141</id>
		<title>Cisco 7970</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Cisco_7970&amp;diff=16141"/>
		<updated>2008-11-08T01:25:46Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[Category: Phones]]&lt;br /&gt;
[[Category: Orbiters]]&lt;br /&gt;
&lt;br /&gt;
== Preface ==&lt;br /&gt;
[[Image:Cisco7909.JPG]]&lt;br /&gt;
&lt;br /&gt;
LinuxMCE allows the use of many devices as [[Orbiters]]. One of them is the [http://www.cisco.com/en/US/products/hw/phones/ps379/ps5440/index.html CISCO 7970]. You can use it to control your home as well as to make calls.&lt;br /&gt;
&lt;br /&gt;
To add a new CISCO 7970 phone as an Orbiter follow these simple instructions (from information in the [http://forum.linuxmce.org/ LinuxMCE support forum]).&lt;br /&gt;
&lt;br /&gt;
== Preparation ==&lt;br /&gt;
&lt;br /&gt;
CISCO 7970 phone is plug-in-play device; LinuxMCE adds it automatically when it is plugged into the network. But first, we have to make some preparations. Run an Orbiter. Be sure that no others tasks are running.&lt;br /&gt;
Check the DHCP setting of your phone. It should be something like that: &amp;quot;get IP via DHCP and no alternative servers&amp;quot;.&lt;br /&gt;
Check the range of MAC addresses:&lt;br /&gt;
#Go to Advanced --&amp;gt; Configuration --&amp;gt; Device Template.&lt;br /&gt;
#Chose manufacturer CISCO. You should see in the right list at least two models: 7970 and 7960.&lt;br /&gt;
#Press the button &#039;Show model&#039;.&lt;br /&gt;
#On the opened window check &#039;Range MAC addresses&#039;. The range contains two big decimal digits. To get correct range for your phone first see its MAC address. A MAC address is six groups of two hexadecimal digits, separated by hyphens (&amp;lt;strong&amp;gt;-&amp;lt;/strong&amp;gt;) or colons (&amp;lt;strong&amp;gt;:&amp;lt;/strong&amp;gt;). The first three groups identify a maker. You leave them and fill the rest by 0 and F. For example, if MAC is &amp;lt;strong&amp;gt;00:16:78:CD:01:D8&amp;lt;/strong&amp;gt; its range will be &amp;lt;strong&amp;gt;00:16:78:00:00:00&amp;lt;/strong&amp;gt; - &amp;lt;strong&amp;gt;00:16:78:FF:FF:FF&amp;lt;/strong&amp;gt;. After that you should convert those two values into LinuxMCE representation. To do that run a script &amp;lt;strong&amp;gt;/usr/pluto/bin/convert_mac&amp;lt;/strong&amp;gt; and pass the hexadecimal values as parameters:&lt;br /&gt;
 /usr/pluto/bin/convert_mac 00:16:78:00:00:00&lt;br /&gt;
 /usr/pluto/bin/convert_mac 00:16:78:FF:FF:FF&lt;br /&gt;
:As result you will get two big decimal digits. Add them to the phone template and store.&lt;br /&gt;
If you have problems with phone installation, it may be related to firmware. The phone should have the latest firmware upgrade. (I didn&#039;t have any problem with existing firmware on my CISCO 7970, though).&lt;br /&gt;
&lt;br /&gt;
Note for &#039;&#039;&#039;CISCO 7960 SIP&#039;&#039;&#039; users: if your phone fails to register with asterisk then edit /tftpboot/SIPDefault.cnf and append &lt;br /&gt;
 nat_enable: 1&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
#Plug the phone power and network cable.  Note if you have two network cards on your core you should plug network cable in the right switch.&lt;br /&gt;
#During boot of the phone after 2-3 minutes you should see on the Orbiter a message about new device with your phone MAC address was detected. You should click by caption &amp;quot;Cisco 7970&amp;quot; below that.&lt;br /&gt;
#After that the phone should be registered with asterisk and you can see a normal CISCO screen. &lt;br /&gt;
#However, it&#039;ll take another 2-3 minutes to generate a new Orbiter for CISCO7970. &lt;br /&gt;
#When this operation finishes you&#039;ll see a message on the Orbiter screen. Make a quick reload of router (Wizard -- Reboot -- Quick Reload Router. I also rebooted CISCO 7970 because I didn&#039;t see anything in the menu Services).&lt;br /&gt;
#Now go to menu Services on CISCO 7970 and chose Orbiter.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
*&amp;lt;u&amp;gt;Problem:&amp;lt;/u&amp;gt; Phone boots successfully but there is no any message on the Orbiter&#039;s screen.&lt;br /&gt;
*&amp;lt;u&amp;gt;Solution:&amp;lt;/u&amp;gt; If the message doesn&#039;t appear check MAC addresses range.&lt;br /&gt;
&lt;br /&gt;
== Some useful tips ==&lt;br /&gt;
*To reset a Network configuration of CISCO79xx go to menu &#039;Network Setting&#039; and press the following sequence of buttons: &lt;br /&gt;
 **#**&lt;br /&gt;
*To check network communications between CISCO7970 and CORE run tcpdump on the CORE:&lt;br /&gt;
 tcpdump -i eth1 [CISCO7970 IP Address]&lt;br /&gt;
or to see detailed packets information:&lt;br /&gt;
 tcpdump -i -vv eth1 [CISCO7970 IP Address]&lt;br /&gt;
or change TimeZone change following line in /tftpboot/SEPDefault7970.cnf.xml (you can find proper TimeZone strings [http://www.voip-info.org/wiki/view/Asterisk+phone+cisco+7970+SIP here] ):&lt;br /&gt;
 &amp;lt;timeZone&amp;gt;W. Europe Standard/Daylight Time&amp;lt;/timeZone&amp;gt;&lt;br /&gt;
*To add the voicemail options to the message button, edit the sccp.conf file and add the following to the lines section of each phone:&lt;br /&gt;
 mailbox=&amp;lt;extension&amp;gt;&lt;br /&gt;
 vmnum=*97&lt;br /&gt;
Email suggestions to: stepanov.michael [at] gmail [dot] com or leave a comment.&lt;br /&gt;
&lt;br /&gt;
==Add Directory buttons to Cisco IP Phone==&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
Download the files here: [http://www.unit-e.cc/~tschak/Directory.zip http://www.unit-e.cc/~tschak/Directory.zip]&lt;br /&gt;
&lt;br /&gt;
=== Synopsis ===&lt;br /&gt;
&lt;br /&gt;
This set of files adds a working Directory for your Cisco IP phone. It has been tested on my Cisco 7970 phone, but does not use any additional features, so it should work on any of the other Cisco IP phones that support XML services, such as the Cisco 7960. &lt;br /&gt;
&lt;br /&gt;
It adds the following Features:&lt;br /&gt;
&lt;br /&gt;
* Directory button now works!&lt;br /&gt;
* Works with Contacts from the Pluto phone directory&lt;br /&gt;
* Paginates them based on # of entries in phone book&lt;br /&gt;
* Shows the phone type.&lt;br /&gt;
&lt;br /&gt;
=== Installing this Patch ===&lt;br /&gt;
&lt;br /&gt;
* Unpack the files to the pluto-admin directory. (/var/www/pluto-admin/)&lt;br /&gt;
* edit the file /tftpboot/SEPDefault7970.cnf.xml (it just needs to be the default xml for your cisco phone, adjust as needed.)&lt;br /&gt;
** Find the &amp;lt;directoryURL&amp;gt;&amp;lt;/directoryURL&amp;gt; tags, and place &#039;&#039;&#039;http://192.168.80.1/pluto-admin/directory.php&#039;&#039;&#039; between them.&lt;br /&gt;
* Reboot the phone by pressing the settings button, and pressing the following button sequence &#039;&#039;&#039;**#**&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Once the phone boots, try the directory by pressing the Directory button!&lt;br /&gt;
&lt;br /&gt;
If there are any problems, let me know --[[User:Tschak909|Tschak909]] ( thom.cherryhomes (at) gmail (dot) com ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Add usefull XML services beside Orbiter==&lt;br /&gt;
&lt;br /&gt;
Currently this feature doesn&#039;t make much sense if you use Orbiter on phone, cause it&#039;s constantly refreshing and you loose focus of any other menu on the phone.... I&#039;ve searched internet a bit and found few usefull applications that will let you put rss or xml feeds to your 7970.&lt;br /&gt;
&lt;br /&gt;
Basically you can try rss or xml feeds directly, but also there is usefull script that automatically converts pages to proper format - for example:&lt;br /&gt;
 http://phone-xml.berbee.com/menu.xml?opts=67&lt;br /&gt;
&lt;br /&gt;
Gives you rss feeds from CNN and BBC. You can also use this script to convert any rss feed to same shape (it&#039;s weather rss feed in my country):&lt;br /&gt;
&lt;br /&gt;
 http://phone-xml.berbee.com/rss/items.php?url=http://vreme.zurnal24.si/xml/rss/vreme.xml&lt;br /&gt;
&lt;br /&gt;
I have further modified file /var/www/pluto-admin/ServicesMenu.php - and added more entries - basically it&#039;s XML list of various URLs to follow.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usefull links==&lt;br /&gt;
&lt;br /&gt;
[http://www.asteriskpbx.de/index.php?open79xx Open 79XX XML Directory] - Gives you possibility to edit info showed/used on Phone...&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Cisco_7970&amp;diff=16140</id>
		<title>Cisco 7970</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Cisco_7970&amp;diff=16140"/>
		<updated>2008-11-08T01:19:20Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* Add usefull XML services beside Orbiter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[Category: Phones]]&lt;br /&gt;
[[Category: Orbiters]]&lt;br /&gt;
&lt;br /&gt;
== Preface ==&lt;br /&gt;
[[Image:Cisco7909.JPG]]&lt;br /&gt;
&lt;br /&gt;
LinuxMCE allows the use of many devices as [[Orbiters]]. One of them is the [http://www.cisco.com/en/US/products/hw/phones/ps379/ps5440/index.html CISCO 7970]. You can use it to control your home as well as to make calls.&lt;br /&gt;
&lt;br /&gt;
To add a new CISCO 7970 phone as an Orbiter follow these simple instructions (from information in the [http://forum.linuxmce.org/ LinuxMCE support forum]).&lt;br /&gt;
&lt;br /&gt;
== Preparation ==&lt;br /&gt;
&lt;br /&gt;
CISCO 7970 phone is plug-in-play device; LinuxMCE adds it automatically when it is plugged into the network. But first, we have to make some preparations. Run an Orbiter. Be sure that no others tasks are running.&lt;br /&gt;
Check the DHCP setting of your phone. It should be something like that: &amp;quot;get IP via DHCP and no alternative servers&amp;quot;.&lt;br /&gt;
Check the range of MAC addresses:&lt;br /&gt;
#Go to Advanced --&amp;gt; Configuration --&amp;gt; Device Template.&lt;br /&gt;
#Chose manufacturer CISCO. You should see in the right list at least two models: 7970 and 7960.&lt;br /&gt;
#Press the button &#039;Show model&#039;.&lt;br /&gt;
#On the opened window check &#039;Range MAC addresses&#039;. The range contains two big decimal digits. To get correct range for your phone first see its MAC address. A MAC address is six groups of two hexadecimal digits, separated by hyphens (&amp;lt;strong&amp;gt;-&amp;lt;/strong&amp;gt;) or colons (&amp;lt;strong&amp;gt;:&amp;lt;/strong&amp;gt;). The first three groups identify a maker. You leave them and fill the rest by 0 and F. For example, if MAC is &amp;lt;strong&amp;gt;00:16:78:CD:01:D8&amp;lt;/strong&amp;gt; its range will be &amp;lt;strong&amp;gt;00:16:78:00:00:00&amp;lt;/strong&amp;gt; - &amp;lt;strong&amp;gt;00:16:78:FF:FF:FF&amp;lt;/strong&amp;gt;. After that you should convert those two values into LinuxMCE representation. To do that run a script &amp;lt;strong&amp;gt;/usr/pluto/bin/convert_mac&amp;lt;/strong&amp;gt; and pass the hexadecimal values as parameters:&lt;br /&gt;
 /usr/pluto/bin/convert_mac 00:16:78:00:00:00&lt;br /&gt;
 /usr/pluto/bin/convert_mac 00:16:78:FF:FF:FF&lt;br /&gt;
:As result you will get two big decimal digits. Add them to the phone template and store.&lt;br /&gt;
If you have problems with phone installation, it may be related to firmware. The phone should have the latest firmware upgrade. (I didn&#039;t have any problem with existing firmware on my CISCO 7970, though).&lt;br /&gt;
&lt;br /&gt;
Note for &#039;&#039;&#039;CISCO 7960 SIP&#039;&#039;&#039; users: if your phone fails to register with asterisk then edit /tftpboot/SIPDefault.cnf and append &lt;br /&gt;
 nat_enable: 1&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
#Plug the phone power and network cable.  Note if you have two network cards on your core you should plug network cable in the right switch.&lt;br /&gt;
#During boot of the phone after 2-3 minutes you should see on the Orbiter a message about new device with your phone MAC address was detected. You should click by caption &amp;quot;Cisco 7970&amp;quot; below that.&lt;br /&gt;
#After that the phone should be registered with asterisk and you can see a normal CISCO screen. &lt;br /&gt;
#However, it&#039;ll take another 2-3 minutes to generate a new Orbiter for CISCO7970. &lt;br /&gt;
#When this operation finishes you&#039;ll see a message on the Orbiter screen. Make a quick reload of router (Wizard -- Reboot -- Quick Reload Router. I also rebooted CISCO 7970 because I didn&#039;t see anything in the menu Services).&lt;br /&gt;
#Now go to menu Services on CISCO 7970 and chose Orbiter.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
*&amp;lt;u&amp;gt;Problem:&amp;lt;/u&amp;gt; Phone boots successfully but there is no any message on the Orbiter&#039;s screen.&lt;br /&gt;
*&amp;lt;u&amp;gt;Solution:&amp;lt;/u&amp;gt; If the message doesn&#039;t appear check MAC addresses range.&lt;br /&gt;
&lt;br /&gt;
== Some useful tips ==&lt;br /&gt;
*To reset a Network configuration of CISCO79xx go to menu &#039;Network Setting&#039; and press the following sequence of buttons: &lt;br /&gt;
 **#**&lt;br /&gt;
*To check network communications between CISCO7970 and CORE run tcpdump on the CORE:&lt;br /&gt;
 tcpdump -i eth1 [CISCO7970 IP Address]&lt;br /&gt;
or to see detailed packets information:&lt;br /&gt;
 tcpdump -i -vv eth1 [CISCO7970 IP Address]&lt;br /&gt;
or change TimeZone change following line in /tftpboot/SEPDefault7970.cnf.xml (you can find proper TimeZone strings [http://www.voip-info.org/wiki/view/Asterisk+phone+cisco+7970+SIP here] ):&lt;br /&gt;
 &amp;lt;timeZone&amp;gt;W. Europe Standard/Daylight Time&amp;lt;/timeZone&amp;gt;&lt;br /&gt;
*To add the voicemail options to the message button, edit the sccp.conf file and add the following to the lines section of each phone:&lt;br /&gt;
 mailbox=&amp;lt;extension&amp;gt;&lt;br /&gt;
 vmnum=*97&lt;br /&gt;
Email suggestions to: stepanov.michael [at] gmail [dot] com or leave a comment.&lt;br /&gt;
&lt;br /&gt;
==Add Directory buttons to Cisco IP Phone==&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
Download the files here: [http://www.unit-e.cc/~tschak/Directory.zip http://www.unit-e.cc/~tschak/Directory.zip]&lt;br /&gt;
&lt;br /&gt;
=== Synopsis ===&lt;br /&gt;
&lt;br /&gt;
This set of files adds a working Directory for your Cisco IP phone. It has been tested on my Cisco 7970 phone, but does not use any additional features, so it should work on any of the other Cisco IP phones that support XML services, such as the Cisco 7960. &lt;br /&gt;
&lt;br /&gt;
It adds the following Features:&lt;br /&gt;
&lt;br /&gt;
* Directory button now works!&lt;br /&gt;
* Works with Contacts from the Pluto phone directory&lt;br /&gt;
* Paginates them based on # of entries in phone book&lt;br /&gt;
* Shows the phone type.&lt;br /&gt;
&lt;br /&gt;
=== Installing this Patch ===&lt;br /&gt;
&lt;br /&gt;
* Unpack the files to the pluto-admin directory. (/var/www/pluto-admin/)&lt;br /&gt;
* edit the file /tftpboot/SEPDefault7970.cnf.xml (it just needs to be the default xml for your cisco phone, adjust as needed.)&lt;br /&gt;
** Find the &amp;lt;directoryURL&amp;gt;&amp;lt;/directoryURL&amp;gt; tags, and place &#039;&#039;&#039;http://192.168.80.1/pluto-admin/directory.php&#039;&#039;&#039; between them.&lt;br /&gt;
* Reboot the phone by pressing the settings button, and pressing the following button sequence &#039;&#039;&#039;**#**&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Once the phone boots, try the directory by pressing the Directory button!&lt;br /&gt;
&lt;br /&gt;
If there are any problems, let me know --[[User:Tschak909|Tschak909]] ( thom.cherryhomes (at) gmail (dot) com ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Add usefull XML services beside Orbiter==&lt;br /&gt;
&lt;br /&gt;
Currently this feature doesn&#039;t make much sense if you use Orbiter on phone, cause it&#039;s constantly refreshing and you loose focus of any other menu on the phone.... I&#039;ve searched internet a bit and found few usefull applications that will let you put rss or xml feeds to your 7970.&lt;br /&gt;
&lt;br /&gt;
Basically you can try rss or xml feeds directly, but also there is usefull script that automatically converts pages to proper format - for example:&lt;br /&gt;
 http://phone-xml.berbee.com/menu.xml?opts=67&lt;br /&gt;
&lt;br /&gt;
Gives you rss feeds from CNN and BBC. You can also use this script to convert any rss feed to same shape (it&#039;s weather rss feed in my country):&lt;br /&gt;
&lt;br /&gt;
 http://phone-xml.berbee.com/rss/items.php?url=http://vreme.zurnal24.si/xml/rss/vreme.xml&lt;br /&gt;
&lt;br /&gt;
I have further modified file /var/www/pluto-admin/ServicesMenu.php - and added more entries - basically it&#039;s XML list of various URLs to follow.&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Cisco_7970&amp;diff=16139</id>
		<title>Cisco 7970</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Cisco_7970&amp;diff=16139"/>
		<updated>2008-11-08T01:08:29Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[Category: Phones]]&lt;br /&gt;
[[Category: Orbiters]]&lt;br /&gt;
&lt;br /&gt;
== Preface ==&lt;br /&gt;
[[Image:Cisco7909.JPG]]&lt;br /&gt;
&lt;br /&gt;
LinuxMCE allows the use of many devices as [[Orbiters]]. One of them is the [http://www.cisco.com/en/US/products/hw/phones/ps379/ps5440/index.html CISCO 7970]. You can use it to control your home as well as to make calls.&lt;br /&gt;
&lt;br /&gt;
To add a new CISCO 7970 phone as an Orbiter follow these simple instructions (from information in the [http://forum.linuxmce.org/ LinuxMCE support forum]).&lt;br /&gt;
&lt;br /&gt;
== Preparation ==&lt;br /&gt;
&lt;br /&gt;
CISCO 7970 phone is plug-in-play device; LinuxMCE adds it automatically when it is plugged into the network. But first, we have to make some preparations. Run an Orbiter. Be sure that no others tasks are running.&lt;br /&gt;
Check the DHCP setting of your phone. It should be something like that: &amp;quot;get IP via DHCP and no alternative servers&amp;quot;.&lt;br /&gt;
Check the range of MAC addresses:&lt;br /&gt;
#Go to Advanced --&amp;gt; Configuration --&amp;gt; Device Template.&lt;br /&gt;
#Chose manufacturer CISCO. You should see in the right list at least two models: 7970 and 7960.&lt;br /&gt;
#Press the button &#039;Show model&#039;.&lt;br /&gt;
#On the opened window check &#039;Range MAC addresses&#039;. The range contains two big decimal digits. To get correct range for your phone first see its MAC address. A MAC address is six groups of two hexadecimal digits, separated by hyphens (&amp;lt;strong&amp;gt;-&amp;lt;/strong&amp;gt;) or colons (&amp;lt;strong&amp;gt;:&amp;lt;/strong&amp;gt;). The first three groups identify a maker. You leave them and fill the rest by 0 and F. For example, if MAC is &amp;lt;strong&amp;gt;00:16:78:CD:01:D8&amp;lt;/strong&amp;gt; its range will be &amp;lt;strong&amp;gt;00:16:78:00:00:00&amp;lt;/strong&amp;gt; - &amp;lt;strong&amp;gt;00:16:78:FF:FF:FF&amp;lt;/strong&amp;gt;. After that you should convert those two values into LinuxMCE representation. To do that run a script &amp;lt;strong&amp;gt;/usr/pluto/bin/convert_mac&amp;lt;/strong&amp;gt; and pass the hexadecimal values as parameters:&lt;br /&gt;
 /usr/pluto/bin/convert_mac 00:16:78:00:00:00&lt;br /&gt;
 /usr/pluto/bin/convert_mac 00:16:78:FF:FF:FF&lt;br /&gt;
:As result you will get two big decimal digits. Add them to the phone template and store.&lt;br /&gt;
If you have problems with phone installation, it may be related to firmware. The phone should have the latest firmware upgrade. (I didn&#039;t have any problem with existing firmware on my CISCO 7970, though).&lt;br /&gt;
&lt;br /&gt;
Note for &#039;&#039;&#039;CISCO 7960 SIP&#039;&#039;&#039; users: if your phone fails to register with asterisk then edit /tftpboot/SIPDefault.cnf and append &lt;br /&gt;
 nat_enable: 1&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
#Plug the phone power and network cable.  Note if you have two network cards on your core you should plug network cable in the right switch.&lt;br /&gt;
#During boot of the phone after 2-3 minutes you should see on the Orbiter a message about new device with your phone MAC address was detected. You should click by caption &amp;quot;Cisco 7970&amp;quot; below that.&lt;br /&gt;
#After that the phone should be registered with asterisk and you can see a normal CISCO screen. &lt;br /&gt;
#However, it&#039;ll take another 2-3 minutes to generate a new Orbiter for CISCO7970. &lt;br /&gt;
#When this operation finishes you&#039;ll see a message on the Orbiter screen. Make a quick reload of router (Wizard -- Reboot -- Quick Reload Router. I also rebooted CISCO 7970 because I didn&#039;t see anything in the menu Services).&lt;br /&gt;
#Now go to menu Services on CISCO 7970 and chose Orbiter.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
*&amp;lt;u&amp;gt;Problem:&amp;lt;/u&amp;gt; Phone boots successfully but there is no any message on the Orbiter&#039;s screen.&lt;br /&gt;
*&amp;lt;u&amp;gt;Solution:&amp;lt;/u&amp;gt; If the message doesn&#039;t appear check MAC addresses range.&lt;br /&gt;
&lt;br /&gt;
== Some useful tips ==&lt;br /&gt;
*To reset a Network configuration of CISCO79xx go to menu &#039;Network Setting&#039; and press the following sequence of buttons: &lt;br /&gt;
 **#**&lt;br /&gt;
*To check network communications between CISCO7970 and CORE run tcpdump on the CORE:&lt;br /&gt;
 tcpdump -i eth1 [CISCO7970 IP Address]&lt;br /&gt;
or to see detailed packets information:&lt;br /&gt;
 tcpdump -i -vv eth1 [CISCO7970 IP Address]&lt;br /&gt;
or change TimeZone change following line in /tftpboot/SEPDefault7970.cnf.xml (you can find proper TimeZone strings [http://www.voip-info.org/wiki/view/Asterisk+phone+cisco+7970+SIP here] ):&lt;br /&gt;
 &amp;lt;timeZone&amp;gt;W. Europe Standard/Daylight Time&amp;lt;/timeZone&amp;gt;&lt;br /&gt;
*To add the voicemail options to the message button, edit the sccp.conf file and add the following to the lines section of each phone:&lt;br /&gt;
 mailbox=&amp;lt;extension&amp;gt;&lt;br /&gt;
 vmnum=*97&lt;br /&gt;
Email suggestions to: stepanov.michael [at] gmail [dot] com or leave a comment.&lt;br /&gt;
&lt;br /&gt;
==Add Directory buttons to Cisco IP Phone==&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
Download the files here: [http://www.unit-e.cc/~tschak/Directory.zip http://www.unit-e.cc/~tschak/Directory.zip]&lt;br /&gt;
&lt;br /&gt;
=== Synopsis ===&lt;br /&gt;
&lt;br /&gt;
This set of files adds a working Directory for your Cisco IP phone. It has been tested on my Cisco 7970 phone, but does not use any additional features, so it should work on any of the other Cisco IP phones that support XML services, such as the Cisco 7960. &lt;br /&gt;
&lt;br /&gt;
It adds the following Features:&lt;br /&gt;
&lt;br /&gt;
* Directory button now works!&lt;br /&gt;
* Works with Contacts from the Pluto phone directory&lt;br /&gt;
* Paginates them based on # of entries in phone book&lt;br /&gt;
* Shows the phone type.&lt;br /&gt;
&lt;br /&gt;
=== Installing this Patch ===&lt;br /&gt;
&lt;br /&gt;
* Unpack the files to the pluto-admin directory. (/var/www/pluto-admin/)&lt;br /&gt;
* edit the file /tftpboot/SEPDefault7970.cnf.xml (it just needs to be the default xml for your cisco phone, adjust as needed.)&lt;br /&gt;
** Find the &amp;lt;directoryURL&amp;gt;&amp;lt;/directoryURL&amp;gt; tags, and place &#039;&#039;&#039;http://192.168.80.1/pluto-admin/directory.php&#039;&#039;&#039; between them.&lt;br /&gt;
* Reboot the phone by pressing the settings button, and pressing the following button sequence &#039;&#039;&#039;**#**&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Once the phone boots, try the directory by pressing the Directory button!&lt;br /&gt;
&lt;br /&gt;
If there are any problems, let me know --[[User:Tschak909|Tschak909]] ( thom.cherryhomes (at) gmail (dot) com ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Add usefull XML services beside Orbiter==&lt;br /&gt;
&lt;br /&gt;
I&#039;ve searched internet a bit and found few usefull applications that will let you put rss or xml feeds to your 7970.&lt;br /&gt;
&lt;br /&gt;
Basically you can try rss or xml feeds directly, but also there is usefull script that automatically converts pages to proper format - for example:&lt;br /&gt;
 http://phone-xml.berbee.com/menu.xml?opts=67&lt;br /&gt;
&lt;br /&gt;
Gives you rss feeds from CNN and BBC. You can also use this script to convert any rss feed to same shape (it&#039;s weather rss feed in my country):&lt;br /&gt;
&lt;br /&gt;
 http://phone-xml.berbee.com/rss/items.php?url=http://vreme.zurnal24.si/xml/rss/vreme.xml&lt;br /&gt;
&lt;br /&gt;
I have further modified file /var/www/pluto-admin/ServicesMenu.php - and added more entries - basically it&#039;s XML list of various URLs to follow.&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Marantz_SR5600&amp;diff=16116</id>
		<title>Marantz SR5600</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Marantz_SR5600&amp;diff=16116"/>
		<updated>2008-11-06T14:19:59Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* &amp;#039;Add Ruby snippets to commands&amp;#039; */&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;
&lt;br /&gt;
[[Category: Hardware]]&lt;br /&gt;
[[Category: Audio]]&lt;br /&gt;
[[Category:Tutorials]]&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>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Directory_Of_Local_Service_Numbers&amp;diff=16049</id>
		<title>Directory Of Local Service Numbers</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Directory_Of_Local_Service_Numbers&amp;diff=16049"/>
		<updated>2008-11-04T09:08:15Z</updated>

		<summary type="html">&lt;p&gt;Bulek: New page: Category:Telecom == Usable local extensions you can use ==  I entered &amp;quot;show dialplan&amp;quot; in asterisk command prompt and sniffed more important local numbers you can use in current LMCE sy...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Telecom]]&lt;br /&gt;
== Usable local extensions you can use ==&lt;br /&gt;
&lt;br /&gt;
I entered &amp;quot;show dialplan&amp;quot; in asterisk command prompt and sniffed more important local numbers you can use in current LMCE system :&lt;br /&gt;
 *98        Voicemail menu&lt;br /&gt;
 *98XXX     Voicemail menu for local extension of XXX&lt;br /&gt;
 *77        ??? about recording&lt;br /&gt;
 *99        ??? about recording&lt;br /&gt;
 *11,*12    user log on/off (???)&lt;br /&gt;
 &lt;br /&gt;
 *69        Info about last call&lt;br /&gt;
 *65        Tells you extension number&lt;br /&gt;
 *60        Speaking clock&lt;br /&gt;
 &lt;br /&gt;
 **         Call pickup (???)&lt;br /&gt;
Test numbers :&lt;br /&gt;
 *43        Echo test&lt;br /&gt;
 7777       For incoming call - doesn&#039;t work &lt;br /&gt;
&lt;br /&gt;
LMCE features :&lt;br /&gt;
 666,999    LMCE security IVR menu&lt;br /&gt;
 997        Join the conference&lt;br /&gt;
 998        pluto-console-custom context - probably &amp;quot;dial in house&amp;quot;&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Misterhouse&amp;diff=16044</id>
		<title>Misterhouse</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Misterhouse&amp;diff=16044"/>
		<updated>2008-11-02T09:17:13Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Tutorials]]&lt;br /&gt;
[[Category:Automation]]&lt;br /&gt;
[http://www.misterhouse.com Misterhouse] is a great integrated Home automation program and much more.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Template ===&lt;br /&gt;
It seems that template for Misterhouse is already in LMCE - I only needed to add Computers to &amp;quot;controlled by category&amp;quot;, so it can be added as child of Core or MD...&lt;br /&gt;
&lt;br /&gt;
In template, there is an &amp;quot;/usr/local/misterhouse/start.sh&amp;quot; entry in Command line data- that means that LMCE will start this script and therefore also misterhouse. Installation should be made regarding this fact.&lt;br /&gt;
&lt;br /&gt;
=== HowTo ===&lt;br /&gt;
Currently there are no Ubuntu packages for MH, so it has to be installed from scratch. An detailed guide can be found on Misterhouse&#039;s site, I also have found isntructions for ubuntu and MH [http://misterhouse.wikispaces.com/MisterhouseOnUbuntu MisterhouseOnUbuntu]&lt;br /&gt;
&lt;br /&gt;
== Integration with LMCE ==&lt;br /&gt;
Here&#039;s a dirty code snippet for LinuxMCE&#039;s listener script under Misterhouse. Be careful since it intercepts all messages and that could become quite greedy... &lt;br /&gt;
&lt;br /&gt;
Before using this script you have to add listener as device under LinuxMCE as explained in LinuxMCE&#039;s docs...&lt;br /&gt;
You have to follow first few steps from LinuxMCE&#039;s text message intercepting tutorial (create logic handler device) and then add this script to your Misterhouse setup :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Category=LinuxMCE&lt;br /&gt;
#&lt;br /&gt;
#@ Connection with LinuxMCE DCE Router via TCP port localhost:3450 (mh.ini -&amp;gt; pluto_DCE_router). &lt;br /&gt;
#&lt;br /&gt;
use strict;&lt;br /&gt;
&lt;br /&gt;
############################################################################## &lt;br /&gt;
$pluto_event_receiver = new  Socket_Item(undef, undef, &#039;193.77.90.224:3450&#039;,&#039;event_receiver&#039;,&#039;tcp&#039;,&#039;record&#039;);&lt;br /&gt;
&lt;br /&gt;
$pluto_command_sender = new  Socket_Item(undef, undef, &#039;193.77.90.224:3450&#039;,&#039;command_sender&#039;,&#039;tcp&#039;,&#039;record&#039;);&lt;br /&gt;
&lt;br /&gt;
if ($Startup) {&lt;br /&gt;
	start $pluto_event_receiver;&lt;br /&gt;
        set $pluto_event_receiver &amp;quot;COMMAND 6778&amp;quot;;&lt;br /&gt;
        	&lt;br /&gt;
	start $pluto_command_sender;&lt;br /&gt;
	set $pluto_command_sender &amp;quot;EVENT 6778&amp;quot;;&lt;br /&gt;
	set $pluto_command_sender &amp;quot;PLAIN_TEXT&amp;quot;;&lt;br /&gt;
# purge other interceptors on same device ID&lt;br /&gt;
#	set $pluto_command_sender &amp;quot;MESSAGET 13&amp;quot;;&lt;br /&gt;
#	set $pluto_command_sender &amp;quot;6778 -1000 13&amp;quot;;&lt;br /&gt;
	send_command_to_pluto(&amp;quot;6778 -1000 13&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# intercepts all messages, I guess it&#039;s better to be selective here !!!!	&lt;br /&gt;
#	set $pluto_command_sender &amp;quot;MESSAGET 22&amp;quot;;&lt;br /&gt;
#	set $pluto_command_sender &amp;quot;6778 -1000 8 0 0 0 0 0&amp;quot;;&lt;br /&gt;
	send_command_to_pluto(&amp;quot;6778 -1000 8 0 0 0 0 0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
     &lt;br /&gt;
sub send_command_to_pluto {&lt;br /&gt;
 my ($message) = @_;&lt;br /&gt;
	set $pluto_command_sender &amp;quot;MESSAGET &amp;quot; . length ($message);&lt;br /&gt;
	set $pluto_command_sender $message;&lt;br /&gt;
        print_log &amp;quot;Sending Command to Pluto DCE : $message\n&amp;quot;;&lt;br /&gt;
        print     &amp;quot;Sending Command to Pluto DCE : $message\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (my $msg = said $pluto_event_receiver) {&lt;br /&gt;
        print_log &amp;quot;Pluto Event received: $msg\n&amp;quot;;&lt;br /&gt;
        print      &amp;quot;Pluto Event received: $msg\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some additional work on this matter is described on forum threads here :&lt;br /&gt;
[http://forum.linuxmce.org/index.php?topic=3573.0]&lt;br /&gt;
[http://forum.linuxmce.org/index.php?topic=391.0]&lt;br /&gt;
[http://forum.linuxmce.org/index.php?topic=1884.0]&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Misterhouse&amp;diff=16043</id>
		<title>Misterhouse</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Misterhouse&amp;diff=16043"/>
		<updated>2008-11-01T22:56:43Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Tutorials]]&lt;br /&gt;
[[Category:Automation]]&lt;br /&gt;
[http://www.misterhouse.com Misterhouse] is a great integrated Home automation program and much more.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a dirty code snippet for LinuxMCE&#039;s listener script under Misterhouse. Be careful since it intercepts all messages and that could become quite greedy... &lt;br /&gt;
&lt;br /&gt;
Before using this script you have to add listener as device under LinuxMCE as explained in LinuxMCE&#039;s docs...&lt;br /&gt;
You have to follow first few steps from LinuxMCE&#039;s text message intercepting tutorial (create logic handler device) and then add this script to your Misterhouse setup :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Category=LinuxMCE&lt;br /&gt;
#&lt;br /&gt;
#@ Connection with LinuxMCE DCE Router via TCP port localhost:3450 (mh.ini -&amp;gt; pluto_DCE_router). &lt;br /&gt;
#&lt;br /&gt;
use strict;&lt;br /&gt;
&lt;br /&gt;
############################################################################## &lt;br /&gt;
$pluto_event_receiver = new  Socket_Item(undef, undef, &#039;193.77.90.224:3450&#039;,&#039;event_receiver&#039;,&#039;tcp&#039;,&#039;record&#039;);&lt;br /&gt;
&lt;br /&gt;
$pluto_command_sender = new  Socket_Item(undef, undef, &#039;193.77.90.224:3450&#039;,&#039;command_sender&#039;,&#039;tcp&#039;,&#039;record&#039;);&lt;br /&gt;
&lt;br /&gt;
if ($Startup) {&lt;br /&gt;
	start $pluto_event_receiver;&lt;br /&gt;
        set $pluto_event_receiver &amp;quot;COMMAND 6778&amp;quot;;&lt;br /&gt;
        	&lt;br /&gt;
	start $pluto_command_sender;&lt;br /&gt;
	set $pluto_command_sender &amp;quot;EVENT 6778&amp;quot;;&lt;br /&gt;
	set $pluto_command_sender &amp;quot;PLAIN_TEXT&amp;quot;;&lt;br /&gt;
# purge other interceptors on same device ID&lt;br /&gt;
#	set $pluto_command_sender &amp;quot;MESSAGET 13&amp;quot;;&lt;br /&gt;
#	set $pluto_command_sender &amp;quot;6778 -1000 13&amp;quot;;&lt;br /&gt;
	send_command_to_pluto(&amp;quot;6778 -1000 13&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# intercepts all messages, I guess it&#039;s better to be selective here !!!!	&lt;br /&gt;
#	set $pluto_command_sender &amp;quot;MESSAGET 22&amp;quot;;&lt;br /&gt;
#	set $pluto_command_sender &amp;quot;6778 -1000 8 0 0 0 0 0&amp;quot;;&lt;br /&gt;
	send_command_to_pluto(&amp;quot;6778 -1000 8 0 0 0 0 0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
     &lt;br /&gt;
sub send_command_to_pluto {&lt;br /&gt;
 my ($message) = @_;&lt;br /&gt;
	set $pluto_command_sender &amp;quot;MESSAGET &amp;quot; . length ($message);&lt;br /&gt;
	set $pluto_command_sender $message;&lt;br /&gt;
        print_log &amp;quot;Sending Command to Pluto DCE : $message\n&amp;quot;;&lt;br /&gt;
        print     &amp;quot;Sending Command to Pluto DCE : $message\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (my $msg = said $pluto_event_receiver) {&lt;br /&gt;
        print_log &amp;quot;Pluto Event received: $msg\n&amp;quot;;&lt;br /&gt;
        print      &amp;quot;Pluto Event received: $msg\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some additional work on this matter is described on forum threads here :&lt;br /&gt;
[http://forum.linuxmce.org/index.php?topic=3573.0]&lt;br /&gt;
[http://forum.linuxmce.org/index.php?topic=391.0]&lt;br /&gt;
[http://forum.linuxmce.org/index.php?topic=1884.0]&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=User_talk:Bulek&amp;diff=15707</id>
		<title>User talk:Bulek</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=User_talk:Bulek&amp;diff=15707"/>
		<updated>2008-09-24T12:42:28Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tricks ==&lt;br /&gt;
=== Nokia N800 ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. gain root access&lt;br /&gt;
 install openssh&lt;br /&gt;
 ssh root@localhost&lt;br /&gt;
 passwd xxxx&lt;br /&gt;
&lt;br /&gt;
2. enable Red Code (address matrix in new repository)&lt;br /&gt;
&lt;br /&gt;
3. install all needed packages&lt;br /&gt;
&lt;br /&gt;
4. transfer fonts &lt;br /&gt;
From Core &lt;br /&gt;
 mkdir /usr/share/fonts/truetype/&lt;br /&gt;
 mkdir /usr/share/fonts/truetype/msttcorefonts/&lt;br /&gt;
&lt;br /&gt;
to N800 into same directory &lt;br /&gt;
 tar zxvf tts_fonts.tgz&lt;br /&gt;
&lt;br /&gt;
4. Run Orbiter :&lt;br /&gt;
Much easier from GUI, but if you have problems, starting by hand would help :&lt;br /&gt;
&lt;br /&gt;
 /usr/bin/Orbiter -r 192.168.80.1 -d 36 -l /tmp/orbiter.log&lt;br /&gt;
&lt;br /&gt;
=== Contributing/Changing templates notes ===&lt;br /&gt;
&lt;br /&gt;
I&#039;m doing this for better trace of sqlcvs contributions entered...&lt;br /&gt;
&lt;br /&gt;
12.03.2008: &lt;br /&gt;
 - added Cybrotech manufacturer&lt;br /&gt;
 - added template for Cybrotech Automation Interface&lt;br /&gt;
&lt;br /&gt;
==Request for comment==&lt;br /&gt;
Hi,&lt;br /&gt;
I&#039;ve made a request for comment with regard to a debate we&#039;re having about categorization of articles. If you could take a look here [[LinuxMCE Wiki talk:Community Portal]] when you have time and perhaps leave a comment I&#039;d be very grateful.&lt;br /&gt;
&lt;br /&gt;
[[User:Lozzo|Lozzo]] 11:40, 8 October 2007 (MST)&lt;br /&gt;
&lt;br /&gt;
=== Setting up telephony features my way... ===&lt;br /&gt;
1. call comes in and you have to somehow to reroute it to individual users&lt;br /&gt;
&lt;br /&gt;
2. if you go to users page on web-admin, you can see &amp;quot;Extension for intercom&amp;quot; - that&#039;s virtual internal number for each user...&lt;br /&gt;
&lt;br /&gt;
3. if you go to Telecom-Call Routing, there you can determine what will happen with incoming call to each user depending on whether it is normal or priority caller and depending on user&#039;s mode...&lt;br /&gt;
&lt;br /&gt;
I do it in slightly different manner, cause I think it&#039;s too much to make all those settings for all users...&lt;br /&gt;
&lt;br /&gt;
I usually setup up two adition users (hidden from Orbiters): Doorphone and Housephone&lt;br /&gt;
&lt;br /&gt;
I reroute calls from doorphone to virtual extension of user Doorphone and all incoming calls to virtual extension of Housephone&lt;br /&gt;
&lt;br /&gt;
Therefore I make all those settings in Telecom-Call Routing but only for those two &amp;quot;users&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Now for instance you can set call routing :&lt;br /&gt;
&lt;br /&gt;
 - to ring phones and then to voicemail if user is in Home mode&lt;br /&gt;
 - to go directly to voicemail or to forward call to your celullar phone when you&#039;re away&lt;br /&gt;
&lt;br /&gt;
in my case I have SIP trunk as connection to my ip provider I just set all incoming calls to go to extension of housephone (in Advanced-Configuration-Phones setup - where you get Freepbx menus)&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=User_talk:Bulek&amp;diff=15706</id>
		<title>User talk:Bulek</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=User_talk:Bulek&amp;diff=15706"/>
		<updated>2008-09-24T12:41:37Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tricks ==&lt;br /&gt;
=== Nokia N800 ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. gain root access&lt;br /&gt;
 install openssh&lt;br /&gt;
 ssh root@localhost&lt;br /&gt;
 passwd xxxx&lt;br /&gt;
&lt;br /&gt;
2. enable Red Code (address matrix in new repository)&lt;br /&gt;
&lt;br /&gt;
3. install all needed packages&lt;br /&gt;
&lt;br /&gt;
4. transfer fonts &lt;br /&gt;
From Core &lt;br /&gt;
 mkdir /usr/share/fonts/truetype/&lt;br /&gt;
 mkdir /usr/share/fonts/truetype/msttcorefonts/&lt;br /&gt;
&lt;br /&gt;
to N800 into same directory &lt;br /&gt;
 tar zxvf tts_fonts.tgz&lt;br /&gt;
&lt;br /&gt;
4. Run Orbiter :&lt;br /&gt;
Much easier from GUI, but if you have problems, starting by hand would help :&lt;br /&gt;
&lt;br /&gt;
 /usr/bin/Orbiter -r 192.168.80.1 -d 36 -l /tmp/orbiter.log&lt;br /&gt;
&lt;br /&gt;
=== Contributing/Changing templates notes ===&lt;br /&gt;
&lt;br /&gt;
I&#039;m doing this for better trace of sqlcvs contributions entered...&lt;br /&gt;
&lt;br /&gt;
12.03.2008: &lt;br /&gt;
 - added Cybrotech manufacturer&lt;br /&gt;
 - added template for Cybrotech Automation Interface&lt;br /&gt;
&lt;br /&gt;
==Request for comment==&lt;br /&gt;
Hi,&lt;br /&gt;
I&#039;ve made a request for comment with regard to a debate we&#039;re having about categorization of articles. If you could take a look here [[LinuxMCE Wiki talk:Community Portal]] when you have time and perhaps leave a comment I&#039;d be very grateful.&lt;br /&gt;
&lt;br /&gt;
[[User:Lozzo|Lozzo]] 11:40, 8 October 2007 (MST)&lt;br /&gt;
&lt;br /&gt;
=== Setting up telephony features my way... ===&lt;br /&gt;
1. call comes in and you have to somehow to reroute it to individual users&lt;br /&gt;
2. if you go to users page on web-admin, you can see &amp;quot;Extension for intercom&amp;quot; - that&#039;s virtual internal number for each user...&lt;br /&gt;
3. if you go to Telecom-Call Routing, there you can determine what will happen with incoming call to each user depending on whether it is normal or priority caller and depending on user&#039;s mode...&lt;br /&gt;
&lt;br /&gt;
I do it in slightly different manner, cause I think it&#039;s too much to make all those settings for all users...&lt;br /&gt;
I usually setup up two adition users (hidden from Orbiters): Doorphone and Housephone&lt;br /&gt;
I reroute calls from doorphone to virtual extension of user Doorphone and all incoming calls to virtual extension of Housephone&lt;br /&gt;
Therefore I make all those settings in Telecom-Call Routing but only for those two &amp;quot;users&amp;quot;.&lt;br /&gt;
Now for instance you can set call routing :&lt;br /&gt;
 - to ring phones and then to voicemail if user is in Home mode&lt;br /&gt;
 - to go directly to voicemail or to forward call to your celullar phone when you&#039;re away&lt;br /&gt;
&lt;br /&gt;
in my case I have SIP trunk as connection to my ip provider I just set all incoming calls to go to extension of housephone (in Advanced-Configuration-Phones setup - where you get Freepbx menus)&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=MessageSend&amp;diff=15492</id>
		<title>MessageSend</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=MessageSend&amp;diff=15492"/>
		<updated>2008-09-04T15:22:56Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* Other messages */&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;
==Command==&lt;br /&gt;
MessageSend server [-targetType [device|category|template]] [-r | -o] [-p path] [-bl BroadcastLevel] [-retry value] DeviceFrom DeviceTo MsgType(1=Command, 2=Event) MsgID [parm1id param1value] [parm2id parm2value] ...&lt;br /&gt;
==Parameters==&lt;br /&gt;
This are derived from the help text of the above command,  Please add any additional information that will be useful for helping understand this very important command.&lt;br /&gt;
===server=== &lt;br /&gt;
is the name/ip of the router, such as localhost or dcerouter&lt;br /&gt;
===targetType===&lt;br /&gt;
the default target type is the device, category, or template&lt;br /&gt;
===-r===&lt;br /&gt;
means the message will be sent with a response request&lt;br /&gt;
===-o===&lt;br /&gt;
means the message will expect out parameters which will be echoed to the screen as resp: [response]&lt;br /&gt;
===-p=== &lt;br /&gt;
specifies the path for output parameters&lt;br /&gt;
===-bl===&lt;br /&gt;
means the broadcast level if the message is sent to category or template;&lt;br /&gt;
:;values :&lt;br /&gt;
::;#none&lt;br /&gt;
::;#direct_siblings&lt;br /&gt;
::;#same_computer&lt;br /&gt;
::;#same_room&lt;br /&gt;
::;#same_house*&lt;br /&gt;
::;#all_houses&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*needs valid device ID for this to be useful&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===-retry===&lt;br /&gt;
means what to do if the message cannot be delivered;&lt;br /&gt;
:;values:&lt;br /&gt;
::;#none (don&#039;t retry)&lt;br /&gt;
::;#retry (send it when the device registers)&lt;br /&gt;
::;#persist (retry, but survive a reload router)&lt;br /&gt;
===DeviceFrom===&lt;br /&gt;
Device number the messages is coming from.&lt;br /&gt;
&lt;br /&gt;
===DeviceTo===&lt;br /&gt;
Device number the message is going to&#039;&lt;br /&gt;
&lt;br /&gt;
===MsgType===&lt;br /&gt;
     1= Command&lt;br /&gt;
     2= Event&lt;br /&gt;
===MsgID===&lt;br /&gt;
format is as follows: MsgID [parm1id param1value] [parm2id parm2value] ...      &lt;br /&gt;
          the parm ID can be prefixed with a letter:&lt;br /&gt;
                D send as a data parameter, rather than text&lt;br /&gt;
                U send as a data parameter, rather than text, parameter is UU-encoded&lt;br /&gt;
                B the value is a filename, the contents sent as a data parameter&lt;br /&gt;
                T the value is a filename, the contents sent as a text parameter&lt;br /&gt;
&lt;br /&gt;
Alternatively: MessageSend uuencode file_in [file_out] (writes to stdout no file_out)&lt;br /&gt;
or MessageSend uudecode file_out [uuencodeddata | file_in]&lt;br /&gt;
&lt;br /&gt;
==System Devices Hard Coded==&lt;br /&gt;
from src/DCE/Message.h&lt;br /&gt;
&amp;lt;pre&amp;gt;// Some system devices&lt;br /&gt;
30 	#define DEVICEID_DCEROUTER      -1000   // System commands for the router itself&lt;br /&gt;
31 	#define DEVICEID_EVENTMANAGER   -1001   // Not a real device, just the destination of events&lt;br /&gt;
32 	#define DEVICEID_LOGGER                 -1002&lt;br /&gt;
33 	#define DEVICEID_MESSAGESEND    -1003   // The message send utility&lt;br /&gt;
34 	&lt;br /&gt;
35 	// Virtual devices&lt;br /&gt;
36 	#define DEVICEID_MASTERDEVICE   -2000&lt;br /&gt;
37 	#define DEVICEID_CATEGORY       -2001&lt;br /&gt;
38 	#define DEVICEID_LIST           -2002&lt;br /&gt;
39 	#define DEVICEID_GROUP          -2003&lt;br /&gt;
40 	&lt;br /&gt;
41 	// Other&lt;br /&gt;
42 	#define DEVICEID_HANDLED_INTERNALLY -300&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Detailed Breakdown of MessageSend for a Command==&lt;br /&gt;
    /usr/pluto/bin/MessageSend localhost 0 13 1 19 5 6 17 7 99 5678 100 0 101 R&lt;br /&gt;
Parameters in this command line are :&lt;br /&gt;
    localhost server&lt;br /&gt;
    0 DeviceFrom&lt;br /&gt;
    13 DeviceTo (Security plugin)&lt;br /&gt;
    1 MsgType: Command&lt;br /&gt;
    19-Command &amp;quot;Set house mode&amp;quot;&lt;br /&gt;
    The rest are MsgID blocks which require [parmid paramvalue]&lt;br /&gt;
    parmid 5(Value To Assign): paramvalue 6&lt;br /&gt;
    parmid 17(PK_Users): paramvalue 7&lt;br /&gt;
    parmid 99(Password): paramvalue 5678&lt;br /&gt;
    parmid 100(PK_DeviceGroup): paramvalue 0&lt;br /&gt;
    parmid 101(Handling Instructions): paramvalue R&lt;br /&gt;
Additional Commands on the [[LinuxMCE Admin Website]] under Advance|DCE|Commands&lt;br /&gt;
Open a command to see valid parameters available for each command&lt;br /&gt;
==Detailed Breakdown of MessageSend for an Event==&lt;br /&gt;
Tripping security sensor with ID of 195 to ON :&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter 195 -1000 2 9 25 1&lt;br /&gt;
Parameters in this command line are :&lt;br /&gt;
    dcerouter server&lt;br /&gt;
    195 DeviceFrom&lt;br /&gt;
    -1000 DeviceTo (DCERouter)&lt;br /&gt;
    2 MsgType: Event&lt;br /&gt;
    9 Event &amp;quot;Sensor Tripped&amp;quot;&lt;br /&gt;
    The rest are MsgID blocks which require [parmid paramvalue]&lt;br /&gt;
    paramid 25(Tripped) : 1 &lt;br /&gt;
&lt;br /&gt;
Additional Events on the [[LinuxMCE Admin Website]] under Advance|DCE|Events&lt;br /&gt;
Open a event to see valid parameters available for each event&lt;br /&gt;
==Detaild Breakdown of MessageSend to Display Alert on Orbiters==&lt;br /&gt;
 /usr/pluto/bin/MessageSend dcerouter -targetType category -bl 5 1 5 1 809 251 0 9 &amp;quot;TESTING DISPLAY ALERT&amp;quot; 182 15 70 &amp;quot;test&amp;quot;&lt;br /&gt;
Parameters in this command line are :&lt;br /&gt;
    dcerouter server&lt;br /&gt;
    category targetType(device category found on template page)&lt;br /&gt;
    5 -bl broadcast level 5 or whole house&lt;br /&gt;
    1 DeviceFrom (Core)&lt;br /&gt;
    5 DeviceCategory (actually device category 5 orbiters)&lt;br /&gt;
    1 MsgType: Command&lt;br /&gt;
    809 Command &amp;quot;DISPLAY ALERT&amp;quot;&lt;br /&gt;
    The rest are MsgID blocks which require [parmid paramvalue]&lt;br /&gt;
    251 (Interruption : 0&lt;br /&gt;
    9 (Text) : &amp;quot;TESTING DISPLAY ALERT&amp;quot;&lt;br /&gt;
    182 (Timeout) : 15 seconds&lt;br /&gt;
    70 (Tokens) : &amp;quot;test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
For additional information regarding the MessageSend command take a look at the following pages:&lt;br /&gt;
*[[DCE from commandline]]&lt;br /&gt;
*[[Sensors]]&lt;br /&gt;
&lt;br /&gt;
==Samples with MessageSend==&lt;br /&gt;
Here are some sample messages you can send with the MessageSend utility. &lt;br /&gt;
===Detection Commands===&lt;br /&gt;
* Detected a new device on the network&lt;br /&gt;
    ./MessageSend dcerouter $PK_Device -1001 2 65 28 &amp;quot;192.168.80.99&amp;quot; 5 &amp;quot;00:10:75:00:D2:22&amp;quot; 52 3 53 2&lt;br /&gt;
* and when the device is no longer on the network&lt;br /&gt;
    ./MessageSend dcerouter $PK_Device -1001 2 66 28 &amp;quot;192.168.80.99&amp;quot; 5 &amp;quot;00:10:75:00:D2:22&amp;quot; 52 3 53 2&lt;br /&gt;
* A USB device is detected&lt;br /&gt;
    ./MessageSend dcerouter $PK_Device -1001 2 65 55 &amp;quot;37|usb2/2-2/2-2:1.7&amp;quot; 52 4 51 &amp;quot;0403f850&amp;quot;&lt;br /&gt;
Note that the vendor/model id is specified, which will be looked up in the DHCP Device database.  And parameter 55 is specified so that when the device is created it will have a device data 37 (com port on pc) of &amp;quot;usb2/2-2/2-2:1.7&amp;quot;.  The usb detection device should automatically determine that the device connected appears as a usb com port, and therefore pass in that com port as a parameter to the event.&lt;br /&gt;
* Some RS232 device is detected, probably because a generic USB-&amp;gt;RS232 dongle was attached&lt;br /&gt;
    ./MessageSend dcerouter $PK_Device -1001 2 65 55 &amp;quot;37|usb2/2-2/2-2:1.8&amp;quot; 52 2&lt;br /&gt;
Note the comm method is RS232, and the port &amp;quot;usb2/2-2/2-2:1.8&amp;quot; is specified.  The plugin will run every detection script in DHCPDevice for all RS232 devices until one detection script reports a match.&lt;br /&gt;
* An internal hard drive is detected&lt;br /&gt;
    ./MessageSend dcerouter $PK_Device -1001 2 65 55 &amp;quot;152|/dev/hdb1&amp;quot; 52 8 49 1790&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;
    /usr/pluto/bin/MessageSend dcerouter -r 0 $1 806 224 $2 13 &amp;quot;$4&amp;quot; 44 1752&lt;br /&gt;
which means the device is template 1752.&lt;br /&gt;
* If the device template is not something that it can determine, send the message leaving off parameter 44 (ie leave off the 44 1752). If there is some error condition you want logged, add parameter 18, as this:&lt;br /&gt;
    /usr/pluto/bin/MessageSend localhost -r 0 $1 806 224 $2 13 &amp;quot;$4&amp;quot; 18 &amp;quot;the com port doesn&#039;t exist&amp;quot; &lt;br /&gt;
* For a NAS this comes from dhcp monitor and has the ip/mac and plug and play plugin figures out what it is, like this:&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter 0 -1001 2 65 52 3 53 2 5 &amp;quot;00:0D:0B:99:10:43&amp;quot; 28 &amp;quot;192.168.80.7&amp;quot;&lt;br /&gt;
* For the “scan the network for windows shares” utility that always runs in the background, it explicitly sends a device detected event with the device template Generic File Server 1837, like this:&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter 0 -1001 2 65 52 3 53 2 49 1837 &lt;br /&gt;
* Once the device is created, the configure script will be ran, for example: Configure_1794.sh for the [[Buffalo Terastation]]. This script should lookup the username and password for the device from the database and fire a &#039;device detected&#039; for each network share, as follows:&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter X -1001 2 65 52 3 53 2 49 1768 55 &amp;quot;182|1&amp;quot;&lt;br /&gt;
That that the X must be the device number of the fileserver, since the file share will be a child of that. 1768 is the template for a samba share, 1769 for nfs. If the share does not require a password, leave off the 55 &amp;quot;182|1&amp;quot;. If the username and password already specified in the database are valid for the share, then instead of 55 &amp;quot;182|1&amp;quot; do 55 &amp;quot;127|username|128|password&amp;quot;. &lt;br /&gt;
===Events===&lt;br /&gt;
* Tripping security sensor with ID of 195 to ON :&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter 195 -1000 2 9 25 1&lt;br /&gt;
* Tripping security sensor with ID of 195 to OFF :&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter 195 -1000 2 9 25 0&lt;br /&gt;
* Report that light with ID of 210 is ON :&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter 210 -1000 2 48 10 1&lt;br /&gt;
* Report that light with ID of 210 is OFF :&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter 210 -1000 2 48 10 0&lt;br /&gt;
* Send a new temperature to thermastat with ID of 121&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter 121 -1000 2 25 30 temperature_value&lt;br /&gt;
replace temperature_value with a actual temperature in degrees&lt;br /&gt;
* Event &amp;quot;output on&amp;quot;&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter ID  -1000 2 28&lt;br /&gt;
* Event &amp;quot;output off&amp;quot;&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter ID  -1000 2 29&lt;br /&gt;
===Sending Commands===&lt;br /&gt;
* Play media (/home/public/data/tts/0.wav) on Xine player with ID of 44 :&lt;br /&gt;
    /usr/pluto/bin/MessageSend localhost 0 44 1 37 29 &amp;quot;&amp;quot; 41 &amp;quot;&amp;quot; 42 &amp;quot;&amp;quot; 59 &amp;quot;/home/public/data/tts/0.wav&amp;quot;&lt;br /&gt;
* Execute scenario with PK_CommandGroup = 157 from device with ID :&lt;br /&gt;
    /usr/pluto/bin/MessageSend localhost ID -1000 1 370 28 &amp;quot;157&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Other messages===&lt;br /&gt;
&#039;&#039;Work in Progress&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Will parse the meaning of DCE messages below in future. Just wrote it here to remember....&lt;br /&gt;
&lt;br /&gt;
* It seems like &amp;quot;Goto Screen&amp;quot; command for Popup screen.&lt;br /&gt;
It switches Orbiter #64 to screen with &amp;quot;A message&amp;quot; and two buttons (&amp;quot;Ok&amp;quot; and &amp;quot;Remind me later&amp;quot;) with separate actions for each one. Have no clue on meaning of parameters for buttons - anyone knows? &lt;br /&gt;
    /usr/pluto/bin/MessageSend localhost 0 64 1 741 10 &amp;quot;Whatever&amp;quot; 159 53 9 &#039;A message|Ok|Remind me later&#039; 137 &#039;-targetType device &amp;lt;%=!%&amp;gt; 15 1 67 13 &amp;quot;/root/Something.sh&amp;quot; 51 &amp;quot;--answer yes&amp;quot;|-targetType device &amp;lt;%=!%&amp;gt; 15 1 67 13 &amp;quot;/root/Something.sh&amp;quot; 51 &amp;quot;--answer no&amp;quot;&#039;&lt;br /&gt;
&lt;br /&gt;
* To display Text Alert on Orbiter :&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;
&lt;br /&gt;
Also interesting command is #397 &amp;quot;Show popup&amp;quot;, but I have yet to discover how to use it...&lt;br /&gt;
&lt;br /&gt;
Does anyone know how to display popup with question and few answer buttons (yes/no for example) ? Can this be done without Designer to create screen - just to specify question, texts on buttons and actions on click ?&lt;br /&gt;
&lt;br /&gt;
==Additional Resources==&lt;br /&gt;
* [[Message Interceptors]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Programmer&#039;s Guide]]&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=MessageSend&amp;diff=15491</id>
		<title>MessageSend</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=MessageSend&amp;diff=15491"/>
		<updated>2008-09-04T15:22:00Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* Other messages */&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;
==Command==&lt;br /&gt;
MessageSend server [-targetType [device|category|template]] [-r | -o] [-p path] [-bl BroadcastLevel] [-retry value] DeviceFrom DeviceTo MsgType(1=Command, 2=Event) MsgID [parm1id param1value] [parm2id parm2value] ...&lt;br /&gt;
==Parameters==&lt;br /&gt;
This are derived from the help text of the above command,  Please add any additional information that will be useful for helping understand this very important command.&lt;br /&gt;
===server=== &lt;br /&gt;
is the name/ip of the router, such as localhost or dcerouter&lt;br /&gt;
===targetType===&lt;br /&gt;
the default target type is the device, category, or template&lt;br /&gt;
===-r===&lt;br /&gt;
means the message will be sent with a response request&lt;br /&gt;
===-o===&lt;br /&gt;
means the message will expect out parameters which will be echoed to the screen as resp: [response]&lt;br /&gt;
===-p=== &lt;br /&gt;
specifies the path for output parameters&lt;br /&gt;
===-bl===&lt;br /&gt;
means the broadcast level if the message is sent to category or template;&lt;br /&gt;
:;values :&lt;br /&gt;
::;#none&lt;br /&gt;
::;#direct_siblings&lt;br /&gt;
::;#same_computer&lt;br /&gt;
::;#same_room&lt;br /&gt;
::;#same_house*&lt;br /&gt;
::;#all_houses&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*needs valid device ID for this to be useful&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===-retry===&lt;br /&gt;
means what to do if the message cannot be delivered;&lt;br /&gt;
:;values:&lt;br /&gt;
::;#none (don&#039;t retry)&lt;br /&gt;
::;#retry (send it when the device registers)&lt;br /&gt;
::;#persist (retry, but survive a reload router)&lt;br /&gt;
===DeviceFrom===&lt;br /&gt;
Device number the messages is coming from.&lt;br /&gt;
&lt;br /&gt;
===DeviceTo===&lt;br /&gt;
Device number the message is going to&#039;&lt;br /&gt;
&lt;br /&gt;
===MsgType===&lt;br /&gt;
     1= Command&lt;br /&gt;
     2= Event&lt;br /&gt;
===MsgID===&lt;br /&gt;
format is as follows: MsgID [parm1id param1value] [parm2id parm2value] ...      &lt;br /&gt;
          the parm ID can be prefixed with a letter:&lt;br /&gt;
                D send as a data parameter, rather than text&lt;br /&gt;
                U send as a data parameter, rather than text, parameter is UU-encoded&lt;br /&gt;
                B the value is a filename, the contents sent as a data parameter&lt;br /&gt;
                T the value is a filename, the contents sent as a text parameter&lt;br /&gt;
&lt;br /&gt;
Alternatively: MessageSend uuencode file_in [file_out] (writes to stdout no file_out)&lt;br /&gt;
or MessageSend uudecode file_out [uuencodeddata | file_in]&lt;br /&gt;
&lt;br /&gt;
==System Devices Hard Coded==&lt;br /&gt;
from src/DCE/Message.h&lt;br /&gt;
&amp;lt;pre&amp;gt;// Some system devices&lt;br /&gt;
30 	#define DEVICEID_DCEROUTER      -1000   // System commands for the router itself&lt;br /&gt;
31 	#define DEVICEID_EVENTMANAGER   -1001   // Not a real device, just the destination of events&lt;br /&gt;
32 	#define DEVICEID_LOGGER                 -1002&lt;br /&gt;
33 	#define DEVICEID_MESSAGESEND    -1003   // The message send utility&lt;br /&gt;
34 	&lt;br /&gt;
35 	// Virtual devices&lt;br /&gt;
36 	#define DEVICEID_MASTERDEVICE   -2000&lt;br /&gt;
37 	#define DEVICEID_CATEGORY       -2001&lt;br /&gt;
38 	#define DEVICEID_LIST           -2002&lt;br /&gt;
39 	#define DEVICEID_GROUP          -2003&lt;br /&gt;
40 	&lt;br /&gt;
41 	// Other&lt;br /&gt;
42 	#define DEVICEID_HANDLED_INTERNALLY -300&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Detailed Breakdown of MessageSend for a Command==&lt;br /&gt;
    /usr/pluto/bin/MessageSend localhost 0 13 1 19 5 6 17 7 99 5678 100 0 101 R&lt;br /&gt;
Parameters in this command line are :&lt;br /&gt;
    localhost server&lt;br /&gt;
    0 DeviceFrom&lt;br /&gt;
    13 DeviceTo (Security plugin)&lt;br /&gt;
    1 MsgType: Command&lt;br /&gt;
    19-Command &amp;quot;Set house mode&amp;quot;&lt;br /&gt;
    The rest are MsgID blocks which require [parmid paramvalue]&lt;br /&gt;
    parmid 5(Value To Assign): paramvalue 6&lt;br /&gt;
    parmid 17(PK_Users): paramvalue 7&lt;br /&gt;
    parmid 99(Password): paramvalue 5678&lt;br /&gt;
    parmid 100(PK_DeviceGroup): paramvalue 0&lt;br /&gt;
    parmid 101(Handling Instructions): paramvalue R&lt;br /&gt;
Additional Commands on the [[LinuxMCE Admin Website]] under Advance|DCE|Commands&lt;br /&gt;
Open a command to see valid parameters available for each command&lt;br /&gt;
==Detailed Breakdown of MessageSend for an Event==&lt;br /&gt;
Tripping security sensor with ID of 195 to ON :&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter 195 -1000 2 9 25 1&lt;br /&gt;
Parameters in this command line are :&lt;br /&gt;
    dcerouter server&lt;br /&gt;
    195 DeviceFrom&lt;br /&gt;
    -1000 DeviceTo (DCERouter)&lt;br /&gt;
    2 MsgType: Event&lt;br /&gt;
    9 Event &amp;quot;Sensor Tripped&amp;quot;&lt;br /&gt;
    The rest are MsgID blocks which require [parmid paramvalue]&lt;br /&gt;
    paramid 25(Tripped) : 1 &lt;br /&gt;
&lt;br /&gt;
Additional Events on the [[LinuxMCE Admin Website]] under Advance|DCE|Events&lt;br /&gt;
Open a event to see valid parameters available for each event&lt;br /&gt;
==Detaild Breakdown of MessageSend to Display Alert on Orbiters==&lt;br /&gt;
 /usr/pluto/bin/MessageSend dcerouter -targetType category -bl 5 1 5 1 809 251 0 9 &amp;quot;TESTING DISPLAY ALERT&amp;quot; 182 15 70 &amp;quot;test&amp;quot;&lt;br /&gt;
Parameters in this command line are :&lt;br /&gt;
    dcerouter server&lt;br /&gt;
    category targetType(device category found on template page)&lt;br /&gt;
    5 -bl broadcast level 5 or whole house&lt;br /&gt;
    1 DeviceFrom (Core)&lt;br /&gt;
    5 DeviceCategory (actually device category 5 orbiters)&lt;br /&gt;
    1 MsgType: Command&lt;br /&gt;
    809 Command &amp;quot;DISPLAY ALERT&amp;quot;&lt;br /&gt;
    The rest are MsgID blocks which require [parmid paramvalue]&lt;br /&gt;
    251 (Interruption : 0&lt;br /&gt;
    9 (Text) : &amp;quot;TESTING DISPLAY ALERT&amp;quot;&lt;br /&gt;
    182 (Timeout) : 15 seconds&lt;br /&gt;
    70 (Tokens) : &amp;quot;test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
For additional information regarding the MessageSend command take a look at the following pages:&lt;br /&gt;
*[[DCE from commandline]]&lt;br /&gt;
*[[Sensors]]&lt;br /&gt;
&lt;br /&gt;
==Samples with MessageSend==&lt;br /&gt;
Here are some sample messages you can send with the MessageSend utility. &lt;br /&gt;
===Detection Commands===&lt;br /&gt;
* Detected a new device on the network&lt;br /&gt;
    ./MessageSend dcerouter $PK_Device -1001 2 65 28 &amp;quot;192.168.80.99&amp;quot; 5 &amp;quot;00:10:75:00:D2:22&amp;quot; 52 3 53 2&lt;br /&gt;
* and when the device is no longer on the network&lt;br /&gt;
    ./MessageSend dcerouter $PK_Device -1001 2 66 28 &amp;quot;192.168.80.99&amp;quot; 5 &amp;quot;00:10:75:00:D2:22&amp;quot; 52 3 53 2&lt;br /&gt;
* A USB device is detected&lt;br /&gt;
    ./MessageSend dcerouter $PK_Device -1001 2 65 55 &amp;quot;37|usb2/2-2/2-2:1.7&amp;quot; 52 4 51 &amp;quot;0403f850&amp;quot;&lt;br /&gt;
Note that the vendor/model id is specified, which will be looked up in the DHCP Device database.  And parameter 55 is specified so that when the device is created it will have a device data 37 (com port on pc) of &amp;quot;usb2/2-2/2-2:1.7&amp;quot;.  The usb detection device should automatically determine that the device connected appears as a usb com port, and therefore pass in that com port as a parameter to the event.&lt;br /&gt;
* Some RS232 device is detected, probably because a generic USB-&amp;gt;RS232 dongle was attached&lt;br /&gt;
    ./MessageSend dcerouter $PK_Device -1001 2 65 55 &amp;quot;37|usb2/2-2/2-2:1.8&amp;quot; 52 2&lt;br /&gt;
Note the comm method is RS232, and the port &amp;quot;usb2/2-2/2-2:1.8&amp;quot; is specified.  The plugin will run every detection script in DHCPDevice for all RS232 devices until one detection script reports a match.&lt;br /&gt;
* An internal hard drive is detected&lt;br /&gt;
    ./MessageSend dcerouter $PK_Device -1001 2 65 55 &amp;quot;152|/dev/hdb1&amp;quot; 52 8 49 1790&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;
    /usr/pluto/bin/MessageSend dcerouter -r 0 $1 806 224 $2 13 &amp;quot;$4&amp;quot; 44 1752&lt;br /&gt;
which means the device is template 1752.&lt;br /&gt;
* If the device template is not something that it can determine, send the message leaving off parameter 44 (ie leave off the 44 1752). If there is some error condition you want logged, add parameter 18, as this:&lt;br /&gt;
    /usr/pluto/bin/MessageSend localhost -r 0 $1 806 224 $2 13 &amp;quot;$4&amp;quot; 18 &amp;quot;the com port doesn&#039;t exist&amp;quot; &lt;br /&gt;
* For a NAS this comes from dhcp monitor and has the ip/mac and plug and play plugin figures out what it is, like this:&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter 0 -1001 2 65 52 3 53 2 5 &amp;quot;00:0D:0B:99:10:43&amp;quot; 28 &amp;quot;192.168.80.7&amp;quot;&lt;br /&gt;
* For the “scan the network for windows shares” utility that always runs in the background, it explicitly sends a device detected event with the device template Generic File Server 1837, like this:&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter 0 -1001 2 65 52 3 53 2 49 1837 &lt;br /&gt;
* Once the device is created, the configure script will be ran, for example: Configure_1794.sh for the [[Buffalo Terastation]]. This script should lookup the username and password for the device from the database and fire a &#039;device detected&#039; for each network share, as follows:&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter X -1001 2 65 52 3 53 2 49 1768 55 &amp;quot;182|1&amp;quot;&lt;br /&gt;
That that the X must be the device number of the fileserver, since the file share will be a child of that. 1768 is the template for a samba share, 1769 for nfs. If the share does not require a password, leave off the 55 &amp;quot;182|1&amp;quot;. If the username and password already specified in the database are valid for the share, then instead of 55 &amp;quot;182|1&amp;quot; do 55 &amp;quot;127|username|128|password&amp;quot;. &lt;br /&gt;
===Events===&lt;br /&gt;
* Tripping security sensor with ID of 195 to ON :&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter 195 -1000 2 9 25 1&lt;br /&gt;
* Tripping security sensor with ID of 195 to OFF :&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter 195 -1000 2 9 25 0&lt;br /&gt;
* Report that light with ID of 210 is ON :&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter 210 -1000 2 48 10 1&lt;br /&gt;
* Report that light with ID of 210 is OFF :&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter 210 -1000 2 48 10 0&lt;br /&gt;
* Send a new temperature to thermastat with ID of 121&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter 121 -1000 2 25 30 temperature_value&lt;br /&gt;
replace temperature_value with a actual temperature in degrees&lt;br /&gt;
* Event &amp;quot;output on&amp;quot;&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter ID  -1000 2 28&lt;br /&gt;
* Event &amp;quot;output off&amp;quot;&lt;br /&gt;
    /usr/pluto/bin/MessageSend dcerouter ID  -1000 2 29&lt;br /&gt;
===Sending Commands===&lt;br /&gt;
* Play media (/home/public/data/tts/0.wav) on Xine player with ID of 44 :&lt;br /&gt;
    /usr/pluto/bin/MessageSend localhost 0 44 1 37 29 &amp;quot;&amp;quot; 41 &amp;quot;&amp;quot; 42 &amp;quot;&amp;quot; 59 &amp;quot;/home/public/data/tts/0.wav&amp;quot;&lt;br /&gt;
* Execute scenario with PK_CommandGroup = 157 from device with ID :&lt;br /&gt;
    /usr/pluto/bin/MessageSend localhost ID -1000 1 370 28 &amp;quot;157&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Other messages===&lt;br /&gt;
&#039;&#039;Work in Progress&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Will parse the meaning of DCE messages below in future. Just wrote it here to remember....&lt;br /&gt;
&lt;br /&gt;
* It seems like &amp;quot;Goto Screen&amp;quot; command for Popup screen (It switches Orbiter #64 to screen with &amp;quot;A message&amp;quot; and two buttons (&amp;quot;Ok&amp;quot; and &amp;quot;Remind me later&amp;quot;) with separate actions for each one&lt;br /&gt;
    /usr/pluto/bin/MessageSend localhost 0 64 1 741 10 &amp;quot;Whatever&amp;quot; 159 53 9 &#039;A message|Ok|Remind me later&#039; 137 &#039;-targetType device &amp;lt;%=!%&amp;gt; 15 1 67 13 &amp;quot;/root/Something.sh&amp;quot; 51 &amp;quot;--answer yes&amp;quot;|-targetType device &amp;lt;%=!%&amp;gt; 15 1 67 13 &amp;quot;/root/Something.sh&amp;quot; 51 &amp;quot;--answer no&amp;quot;&#039;&lt;br /&gt;
&lt;br /&gt;
* To display Text Alert on Orbiter :&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;
&lt;br /&gt;
Also interesting command is #397 &amp;quot;Show popup&amp;quot;, but I have yet to discover how to use it...&lt;br /&gt;
&lt;br /&gt;
Does anyone know how to display popup with question and few answer buttons (yes/no for example) ? Can this be done without Designer to create screen - just to specify question, texts on buttons and actions on click ?&lt;br /&gt;
&lt;br /&gt;
==Additional Resources==&lt;br /&gt;
* [[Message Interceptors]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Programmer&#039;s Guide]]&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Cisco_7970&amp;diff=15382</id>
		<title>Cisco 7970</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Cisco_7970&amp;diff=15382"/>
		<updated>2008-08-27T08:10:33Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* Some useful tips */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Hardware]]&lt;br /&gt;
[[Category: Phones]]&lt;br /&gt;
[[Category: Orbiters]]&lt;br /&gt;
&lt;br /&gt;
== Preface ==&lt;br /&gt;
[[Image:Cisco7909.JPG]]&lt;br /&gt;
&lt;br /&gt;
LinuxMCE allows the use of many devices as [[Orbiters]]. One of them is the [http://www.cisco.com/en/US/products/hw/phones/ps379/ps5440/index.html CISCO 7970]. You can use it to control your home as well as to make calls.&lt;br /&gt;
&lt;br /&gt;
To add a new CISCO 7970 phone as an Orbiter follow these simple instructions (from information in the [http://forum.linuxmce.org/ LinuxMCE support forum]).&lt;br /&gt;
&lt;br /&gt;
== Preparation ==&lt;br /&gt;
&lt;br /&gt;
CISCO 7970 phone is plug-in-play device; LinuxMCE adds it automatically when it is plugged into the network. But first, we have to make some preparations. Run an Orbiter. Be sure that no others tasks are running.&lt;br /&gt;
Check the DHCP setting of your phone. It should be something like that: &amp;quot;get IP via DHCP and no alternative servers&amp;quot;.&lt;br /&gt;
Check the range of MAC addresses:&lt;br /&gt;
#Go to Advanced --&amp;gt; Configuration --&amp;gt; Device Template.&lt;br /&gt;
#Chose manufacturer CISCO. You should see in the right list at least two models: 7970 and 7960.&lt;br /&gt;
#Press the button &#039;Show model&#039;.&lt;br /&gt;
#On the opened window check &#039;Range MAC addresses&#039;. The range contains two big decimal digits. To get correct range for your phone first see its MAC address. A MAC address is six groups of two hexadecimal digits, separated by hyphens (&amp;lt;strong&amp;gt;-&amp;lt;/strong&amp;gt;) or colons (&amp;lt;strong&amp;gt;:&amp;lt;/strong&amp;gt;). The first three groups identify a maker. You leave them and fill the rest by 0 and F. For example, if MAC is &amp;lt;strong&amp;gt;00:16:78:CD:01:D8&amp;lt;/strong&amp;gt; its range will be &amp;lt;strong&amp;gt;00:16:78:00:00:00&amp;lt;/strong&amp;gt; - &amp;lt;strong&amp;gt;00:16:78:FF:FF:FF&amp;lt;/strong&amp;gt;. After that you should convert those two values into LinuxMCE representation. To do that run a script &amp;lt;strong&amp;gt;/usr/pluto/bin/convert_mac&amp;lt;/strong&amp;gt; and pass the hexadecimal values as parameters:&lt;br /&gt;
 /usr/pluto/bin/convert_mac 00:16:78:00:00:00&lt;br /&gt;
 /usr/pluto/bin/convert_mac 00:16:78:FF:FF:FF&lt;br /&gt;
:As result you will get two big decimal digits. Add them to the phone template and store.&lt;br /&gt;
If you have problems with phone installation, it may be related to firmware. The phone should have the latest firmware upgrade. (I didn&#039;t have any problem with existing firmware on my CISCO 7970, though).&lt;br /&gt;
&lt;br /&gt;
Note for &#039;&#039;&#039;CISCO 7960 SIP&#039;&#039;&#039; users: if your phone fails to register with asterisk then edit /tftpboot/SIPDefault.cnf and append &lt;br /&gt;
 nat_enable: 1&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
#Plug the phone power and network cable.  Note if you have two network cards on your core you should plug network cable in the right switch.&lt;br /&gt;
#During boot of the phone after 2-3 minutes you should see on the Orbiter a message about new device with your phone MAC address was detected. You should click by caption &amp;quot;Cisco 7970&amp;quot; below that.&lt;br /&gt;
#After that the phone should be registered with asterisk and you can see a normal CISCO screen. &lt;br /&gt;
#However, it&#039;ll take another 2-3 minutes to generate a new Orbiter for CISCO7970. &lt;br /&gt;
#When this operation finishes you&#039;ll see a message on the Orbiter screen. Make a quick reload of router (Wizard -- Reboot -- Quick Reload Router. I also rebooted CISCO 7970 because I didn&#039;t see anything in the menu Services).&lt;br /&gt;
#Now go to menu Services on CISCO 7970 and chose Orbiter.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
*&amp;lt;u&amp;gt;Problem:&amp;lt;/u&amp;gt; Phone boots successfully but there is no any message on the Orbiter&#039;s screen.&lt;br /&gt;
*&amp;lt;u&amp;gt;Solution:&amp;lt;/u&amp;gt; If the message doesn&#039;t appear check MAC addresses range.&lt;br /&gt;
&lt;br /&gt;
== Some useful tips ==&lt;br /&gt;
*To reset a Network configuration of CISCO79xx go to menu &#039;Network Setting&#039; and press the following sequence of buttons: &lt;br /&gt;
 **#**&lt;br /&gt;
*To check network communications between CISCO7970 and CORE run tcpdump on the CORE:&lt;br /&gt;
 tcpdump -i eth1 [CISCO7970 IP Address]&lt;br /&gt;
or to see detailed packets information:&lt;br /&gt;
 tcpdump -i -vv eth1 [CISCO7970 IP Address]&lt;br /&gt;
or change TimeZone change following line in /tftpboot/SEPDefault7970.cnf.xml (you can find proper TimeZone strings [http://www.voip-info.org/wiki/view/Asterisk+phone+cisco+7970+SIP here] ):&lt;br /&gt;
 &amp;lt;timeZone&amp;gt;W. Europe Standard/Daylight Time&amp;lt;/timeZone&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Email suggestions to: stepanov.michael [at] gmail [dot] com or leave a comment.&lt;br /&gt;
&lt;br /&gt;
==Add Directory buttons to Cisco IP Phone==&lt;br /&gt;
&lt;br /&gt;
=== Download ===&lt;br /&gt;
Download the files here: [http://www.unit-e.cc/~tschak/Directory.zip http://www.unit-e.cc/~tschak/Directory.zip]&lt;br /&gt;
&lt;br /&gt;
=== Synopsis ===&lt;br /&gt;
&lt;br /&gt;
This set of files adds a working Directory for your Cisco IP phone. It has been tested on my Cisco 7970 phone, but does not use any additional features, so it should work on any of the other Cisco IP phones that support XML services, such as the Cisco 7960. &lt;br /&gt;
&lt;br /&gt;
It adds the following Features:&lt;br /&gt;
&lt;br /&gt;
* Directory button now works!&lt;br /&gt;
* Works with Contacts from the Pluto phone directory&lt;br /&gt;
* Paginates them based on # of entries in phone book&lt;br /&gt;
* Shows the phone type.&lt;br /&gt;
&lt;br /&gt;
=== Installing this Patch ===&lt;br /&gt;
&lt;br /&gt;
* Unpack the files to the pluto-admin directory. (/var/www/pluto-admin/)&lt;br /&gt;
* edit the file /tftpboot/SEPDefault7970.cnf.xml (it just needs to be the default xml for your cisco phone, adjust as needed.)&lt;br /&gt;
** Find the &amp;lt;directoryURL&amp;gt;&amp;lt;/directoryURL&amp;gt; tags, and place &#039;&#039;&#039;http://192.168.80.1/pluto-admin/directory.php&#039;&#039;&#039; between them.&lt;br /&gt;
* Reboot the phone by pressing the settings button, and pressing the following button sequence &#039;&#039;&#039;**#**&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Once the phone boots, try the directory by pressing the Directory button!&lt;br /&gt;
&lt;br /&gt;
If there are any problems, let me know --[[User:Tschak909|Tschak909]] ( thom.cherryhomes (at) gmail (dot) com ).&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Common_Events_Examples&amp;diff=14976</id>
		<title>Common Events Examples</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Common_Events_Examples&amp;diff=14976"/>
		<updated>2008-07-17T01:35:56Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Admin Website]]&lt;br /&gt;
[[Category: Automation]]&lt;br /&gt;
&lt;br /&gt;
I&#039;ve begun dealing with Events and Events handler and I&#039;m describing few common events I&#039;ve added to my setup. Please contribute yours as well...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=House Mode Change Based Events=&lt;br /&gt;
I need those events, so I can do certain things - for instance switch user modes for call routing. In this way, whenever House Mode is changed, also appropriate User modes are set. To be precise, only Going To Sleep event actually works, don&#039;t have a clue why other two are not working. I&#039;d be glad to hear your experiences...&lt;br /&gt;
&lt;br /&gt;
==Going To Sleep==&lt;br /&gt;
Basically switches Users #5 and #6 to Sleep mode when house mode changes from other modes. As an example, I&#039;m also showing actions that are triggered when Event Criteria is met...&lt;br /&gt;
[[Image:Sleep_criteria.png|thumb|200px|Common Events Examples Page]]&lt;br /&gt;
[[Image:Sleep_actions.png|thumb|200px|Common Events Examples Page]]&lt;br /&gt;
==Coming Home==&lt;br /&gt;
Basically switches Users #5 and #6 to Home mode when house mode changes from one of Away modes to Home Unarmed. [[Image:Coming_home_criteria.png|thumb|200px|Common Events Examples Page]]&lt;br /&gt;
&lt;br /&gt;
==Waking Up==&lt;br /&gt;
Basically switches Users #5 and #6 to Home mode when house mode changes from one of Home modes (Sleeping, Home Armed). [[Image:Waking_up_criteria.png|thumb|200px|Common Events Examples Page]]&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Common_Events_Examples&amp;diff=14975</id>
		<title>Common Events Examples</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Common_Events_Examples&amp;diff=14975"/>
		<updated>2008-07-17T01:35:15Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Admin Website]]&lt;br /&gt;
[[Category: Automation]]&lt;br /&gt;
&lt;br /&gt;
I&#039;ve begun dealing with Events and Events handler and I&#039;m describing few common events I&#039;ve added to my setup. Please contribute yours as well...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==House Mode Change Based Events==&lt;br /&gt;
I need those events, so I can do certain things - for instance switch user modes for call routing. In this way, whenever House Mode is changed, also appropriate User modes are set. To be precise, only Going To Sleep event actually works, don&#039;t have a clue why other two are not working. I&#039;d be glad to hear your experiences...&lt;br /&gt;
&lt;br /&gt;
===Going To Sleep===&lt;br /&gt;
Basically switches Users #5 and #6 to Sleep mode when house mode changes from other modes. As an example, I&#039;m also showing actions that are triggered when Event Criteria is met...&lt;br /&gt;
[[Image:Sleep_criteria.png|thumb|200px|Common Events Examples Page]]&lt;br /&gt;
[[Image:Sleep_actions.png|thumb|200px|Common Events Examples Page]]&lt;br /&gt;
===Coming Home===&lt;br /&gt;
Basically switches Users #5 and #6 to Home mode when house mode changes from one of Away modes to Home Unarmed. [[Image:Coming_home_criteria.png|thumb|200px|Common Events Examples Page]]&lt;br /&gt;
&lt;br /&gt;
===Waking Up===&lt;br /&gt;
Basically switches Users #5 and #6 to Home mode when house mode changes from one of Home modes (Sleeping, Home Armed). [[Image:Waking_up_criteria.png|thumb|200px|Common Events Examples Page]]&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Common_Events_Examples&amp;diff=14974</id>
		<title>Common Events Examples</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Common_Events_Examples&amp;diff=14974"/>
		<updated>2008-07-17T01:32:56Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Admin Website]]&lt;br /&gt;
[[Category: Automation]]&lt;br /&gt;
&lt;br /&gt;
I&#039;ve begun dealing with Events and Events handler and I&#039;m describing few common events I&#039;ve added to my setup. Please contribute yours as well...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Coming_home_criteria.png.jpg|thumb|200px|Timed Events Admin Page]]&lt;br /&gt;
This is how you tell LinuxMCE to do certain tasks at specific times or at regular intervals.  For example, you may want to do something every hour, or at 9:00am on Sundays. &lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===House Mode Based Events===&lt;br /&gt;
I need those events, so Ican do certain things - for instance switch user modes for call routing. In this way, whenever House Mode is changed, also appropriate User modes are set. To be precise, only Going To Sleep event actually works, don&#039;t have a clue why other two are not working. I&#039;d be glad to hear your experiences...&lt;br /&gt;
&lt;br /&gt;
==Going To Sleep==&lt;br /&gt;
Basically switches Users #5 and #6 to Sleep mode when house mode changes from other modes&lt;br /&gt;
[[Image:Sleep_criteria.png|thumb|200px|Common Events Examples Page]]&lt;br /&gt;
[[Image:Sleep_actions.png|thumb|200px|Common Events Examples Page]]&lt;br /&gt;
==Coming Home==&lt;br /&gt;
Basically switches Users #5 and #6 to Home mode when house mode changes from one of Away modes to Home Unarmed. [[Image:Coming_home_criteria.png|thumb|200px|Common Events Examples Page]]&lt;br /&gt;
&lt;br /&gt;
==Waking Up==&lt;br /&gt;
Basically switches Users #5 and #6 to Home mode when house mode changes from one of Home modes (Sleeping, Home Armed). [[Image:Waking_up_criteria.png|thumb|200px|Common Events Examples Page]]&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Common_Events_Examples&amp;diff=14973</id>
		<title>Common Events Examples</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Common_Events_Examples&amp;diff=14973"/>
		<updated>2008-07-17T01:27:44Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Admin Website]]&lt;br /&gt;
[[Category: Automation]]&lt;br /&gt;
&lt;br /&gt;
I&#039;ve begun dealing with Events and Events handler and I&#039;m describing few common events I&#039;ve added to my setup. Please contribute yours as well...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Coming_home_criteria.png.jpg|thumb|200px|Timed Events Admin Page]]&lt;br /&gt;
This is how you tell LinuxMCE to do certain tasks at specific times or at regular intervals.  For example, you may want to do something every hour, or at 9:00am on Sundays. &lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===House Mode Based Events===&lt;br /&gt;
==Coming Home==&lt;br /&gt;
[[Image:Coming_home_criteria.png|thumb|200px|Timed Events Admin Page]]&lt;br /&gt;
&lt;br /&gt;
==Going To Sleep==&lt;br /&gt;
[[Image:Sleep_criteria.png|thumb|200px|Timed Events Admin Page]]&lt;br /&gt;
[[Image:Sleep_actions.png|thumb|200px|Timed Events Admin Page]]&lt;br /&gt;
==Waking Up==&lt;br /&gt;
[[Image:Waking_up_criteria.png|thumb|200px|Timed Events Admin Page]]&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=File:Waking_up_criteria.png&amp;diff=14972</id>
		<title>File:Waking up criteria.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=File:Waking_up_criteria.png&amp;diff=14972"/>
		<updated>2008-07-17T01:26:58Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=File:Sleep_actions.png&amp;diff=14971</id>
		<title>File:Sleep actions.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=File:Sleep_actions.png&amp;diff=14971"/>
		<updated>2008-07-17T01:26:23Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=File:Sleep_criteria.png&amp;diff=14970</id>
		<title>File:Sleep criteria.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=File:Sleep_criteria.png&amp;diff=14970"/>
		<updated>2008-07-17T01:25:41Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=File:Coming_home_criteria.png&amp;diff=14969</id>
		<title>File:Coming home criteria.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=File:Coming_home_criteria.png&amp;diff=14969"/>
		<updated>2008-07-17T01:24:18Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Common_Events_Examples&amp;diff=14968</id>
		<title>Common Events Examples</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Common_Events_Examples&amp;diff=14968"/>
		<updated>2008-07-17T01:17:51Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Admin Website]]&lt;br /&gt;
[[Category: Automation]]&lt;br /&gt;
&lt;br /&gt;
I&#039;ve begun dealing with Events and Events handler and I&#039;m describing few common events I&#039;ve added to my setup. Please contribute yours as well...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:TimedEvents.jpg|thumb|200px|Timed Events Admin Page]]&lt;br /&gt;
This is how you tell LinuxMCE to do certain tasks at specific times or at regular intervals.  For example, you may want to do something every hour, or at 9:00am on Sundays. &lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===House Mode Based Events===&lt;br /&gt;
==Coming Home==&lt;br /&gt;
&lt;br /&gt;
==Going To Sleep==&lt;br /&gt;
&lt;br /&gt;
==Waking Up==&lt;br /&gt;
&lt;br /&gt;
==Editing a Time Event==&lt;br /&gt;
[[Image:EditTimedEvents.jpg|thumb|200px|Edit Timed Events Admin Page]]&lt;br /&gt;
Simply choose the room for which you would like this Timed Event associated and at the bottom of the page you will see a drop down menu of all of the device in your system.  Choose the device you want to activate and then chose the command you would like to issue that device.  After adding this event, click Update to save the information.&lt;br /&gt;
&lt;br /&gt;
If you would like to use this event as an alarm clock, choose what rooms this event should act as an alarm clock in. It will appear on the Orbiters&#039; sleeping menu and you can turn the alarm on or off. Please note that currently, this function is only available via UI1 as there is no sleeping menu accessible on UI2.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Advanced Menu==&lt;br /&gt;
[[Image:AdvancedTimedEvents.jpg|thumb|200px|Advanced Timed Events Admin Page]]&lt;br /&gt;
&lt;br /&gt;
This menu becomes available only after you have added the first Timed Event, but it does give you access to some predefined events that you can edit.&lt;br /&gt;
Take the example of Sunset.  By clicking the commands text, you can now associate any device with this Timed Event.  After adding the device, you will receive a drop down menu with commands to issue this device.  This allows you to customize your system to your liking.&lt;br /&gt;
&lt;br /&gt;
Please note that testing any advanced event will likely result in their deletion. This is a bug currently.&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Common_Events_Examples&amp;diff=14967</id>
		<title>Common Events Examples</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Common_Events_Examples&amp;diff=14967"/>
		<updated>2008-07-17T01:13:51Z</updated>

		<summary type="html">&lt;p&gt;Bulek: New page: I&amp;#039;ve begun dealing with Events and Events handler and I&amp;#039;m describing few common events I&amp;#039;ve added to my setup. Please contribute yours as well...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I&#039;ve begun dealing with Events and Events handler and I&#039;m describing few common events I&#039;ve added to my setup. Please contribute yours as well...&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=ESS_Expandable_Speaker_Selector_Switch&amp;diff=14626</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=14626"/>
		<updated>2008-07-03T09:58:49Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &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;
&lt;br /&gt;
[[Category: Hardware]]&lt;br /&gt;
[[Category: Audio]]&lt;br /&gt;
[[Category:Tutorials]]&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>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=ESS_Expandable_Speaker_Selector_Switch&amp;diff=14625</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=14625"/>
		<updated>2008-07-03T09:55:28Z</updated>

		<summary type="html">&lt;p&gt;Bulek: /* &amp;#039;Add Ruby snippets to commands&amp;#039; */&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;
&lt;br /&gt;
[[Category: Hardware]]&lt;br /&gt;
[[Category: Audio]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
&lt;br /&gt;
In editing phase !!! - working copy !!!&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>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=User:Bulek&amp;diff=14585</id>
		<title>User:Bulek</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=User:Bulek&amp;diff=14585"/>
		<updated>2008-06-29T21:34:57Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Temporary copy of LG LCD TV template (based on existing LG_42LB5D template)&lt;br /&gt;
&lt;br /&gt;
==== &#039;Add Ruby snippets to commands&#039;==== &lt;br /&gt;
&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;
 Power&lt;br /&gt;
#193 Off&lt;br /&gt;
	log(&#039;Sending OFF Command&#039;) &amp;lt;$&amp;quot;ka 01 00\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#192 On&lt;br /&gt;
	log(&#039;Sending ON Command&#039;) &amp;lt;$&amp;quot;ka 01 01\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
InputsInput commands not implemented: Antenna, Tuner - Digital (Click to add)&lt;br /&gt;
#316 AV 1&lt;br /&gt;
	log(&#039;Switching Input to AV1&#039;) &amp;lt;$&amp;quot;kb 01 02\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#317 AV 2&lt;br /&gt;
	log(&#039;Switching Input to AV2&#039;) &amp;lt;$&amp;quot;kb 01 03\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#712 Component 1&lt;br /&gt;
	log(&#039;Switching Input to Component 1&#039;) &amp;lt;$&amp;quot;kb 01 04\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#361 HDMI&lt;br /&gt;
	log(&#039;Switching Input to HDMI 1&#039;) &amp;lt;$&amp;quot;kb 01 07\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#154 RGB&lt;br /&gt;
	log(&#039;Switching Input to RGB/PC&#039;) &amp;lt;$&amp;quot;kb 01 06\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
Aspect Ratios&lt;br /&gt;
#879 16:9&lt;br /&gt;
	log(&#039;Aspect Ratio 16:9&#039;) &amp;lt;$&amp;quot;kc 01 02\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#877 4:3&lt;br /&gt;
	log(&#039;Aspect Ratio 4:3&#039;) &amp;lt;$&amp;quot;kc 01 01\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
DSP Modes&lt;br /&gt;
#116 DSP Mode&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
General&lt;br /&gt;
#190 Enter/Go&lt;br /&gt;
	log(&#039;Sending Enter/Go Command&#039;) &amp;lt;$&amp;quot;mc 01 44\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
Internal&lt;br /&gt;
#373 Private Method Listing&lt;br /&gt;
	def log(line) $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;) $log.puts &amp;quot;(***):&amp;quot; + line.to_s $log.close end 	&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;
	buff = &#039;&#039; while(true) buff=conn_.Recv(30,200) if(buff.length() == 0) log(&#039;Nothing Received&#039;) break end log(&#039;Received: &#039; + Regexp.escape(buff.to_s)) if !buff.index(&amp;quot;OK&amp;quot;).nil? log(Regexp.escape(buff.to_s) + &#039;: Command Processed Successfully&#039;) elsif !buff.index(&amp;quot;NG&amp;quot;).nil? log(Regexp.escape(buff.to_s) +&#039;: Command Processed Unsuccessfully&#039;) end end 	&lt;br /&gt;
&lt;br /&gt;
#355 Process Initialize&lt;br /&gt;
	for iRetry in 0...4 print &amp;quot;Initializing unit\n&amp;quot; conn_.Send(&amp;quot;ke 01 01\r&amp;quot;) # Send UnMute Command buf = conn_.Recv(30,200) # Expected Return # ke 01 01\r\ne 00 OK01x\r\n if !buf.nil? &amp;amp;&amp;amp; !buf.index(&amp;quot;OK&amp;quot;).nil? print &amp;quot;Initialized ok\n&amp;quot; print &amp;quot;Setting volume to 30%\n&amp;quot; cmd_313(15) SetDeviceDataInDB( device_.devid_, 158, &amp;quot;15&amp;quot; ) # 158 = DEVICEDATA_Volume_Level_CONST return end print &amp;quot;Failed to initialize. Wait 1 secs and try again\n&amp;quot; sleep(1) end #DisableDevice( device_.devid_, true ) #print &amp;quot;The device would not respond. Disabling it.\n&amp;quot; 	&lt;br /&gt;
&lt;br /&gt;
#384 Process Receive Command For Child&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
#356 Process Release&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
#587 Preset/Prog/Freq&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
#676 Video Mute&lt;br /&gt;
	log(&#039;Sending Video Mute Command&#039;) &amp;lt;$&amp;quot;kd 01 00\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#683 Zoom&lt;br /&gt;
	log(&#039;Aspect Ratio 16:9&#039;) &amp;lt;$&amp;quot;kc 01 05\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
Numbers&lt;br /&gt;
#204 0&lt;br /&gt;
	log(&#039;Sending 0 &#039;) &amp;lt;$&amp;quot;mc 01 10\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#205 1&lt;br /&gt;
	log(&#039;Sending 1 &#039;) &amp;lt;$&amp;quot;mc 01 11\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#206 2&lt;br /&gt;
	log(&#039;Sending 2 &#039;) &amp;lt;$&amp;quot;mc 01 12r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#207 3&lt;br /&gt;
	log(&#039;Sending 3 &#039;) &amp;lt;$&amp;quot;mc 01 13\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#208 4&lt;br /&gt;
	log(&#039;Sending 4 &#039;) &amp;lt;$&amp;quot;mc 01 14\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#209 5&lt;br /&gt;
	log(&#039;Sending 5 &#039;) &amp;lt;$&amp;quot;mc 01 15\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#210 6&lt;br /&gt;
	log(&#039;Sending 6 &#039;) &amp;lt;$&amp;quot;mc 01 16\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#211 7&lt;br /&gt;
	log(&#039;Sending 7 &#039;) &amp;lt;$&amp;quot;mc 01 17\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#212 8&lt;br /&gt;
	log(&#039;Sending 8 &#039;) &amp;lt;$&amp;quot;mc 01 18\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#213 9&lt;br /&gt;
	log(&#039;Sending 9 &#039;) &amp;lt;$&amp;quot;mc 01 19\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
On-Screen Menu Navig&lt;br /&gt;
#86 Menu (Show Menu)&lt;br /&gt;
	log(&#039;Sending Menu Command&#039;) &amp;lt;$&amp;quot;mc 01 43\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#201 Move Down&lt;br /&gt;
	log(&#039;Menu Down&#039;) &amp;lt;$&amp;quot;mc 01 41\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#202 Move Left&lt;br /&gt;
	log(&#039;Menu Left&#039;) &amp;lt;$&amp;quot;mc 01 07\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#203 Move Right&lt;br /&gt;
	log(&#039;Menu Right&#039;) &amp;lt;$&amp;quot;mc 01 06\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#200 Move Up&lt;br /&gt;
	log(&#039;Menu Up&#039;) &amp;lt;$&amp;quot;mc 01 40\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
Picture Control&lt;br /&gt;
#224 Brightness Down&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
#223 Brightness Up&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
#221 Contrast Down&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
#220 Contrast Up&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
Simple Control&lt;br /&gt;
#64 Skip Back - Channel/Track Lower&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
#63 Skip Fwd - Channel/Track Greater&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
Sound &amp;amp; Volume&lt;br /&gt;
#97 Mute&lt;br /&gt;
	if(@mute) &amp;lt;$&amp;quot;ke 01 00\r&amp;quot;$&amp;gt; else &amp;lt;$&amp;quot;ke 01 01\r&amp;quot;$&amp;gt; end @mute=!@mute 	&lt;br /&gt;
&lt;br /&gt;
#313 Set Volume&lt;br /&gt;
	@volume=level.to_i() ilevel = @volume.to_i log( &#039;setting volume to &#039;+ ilevel.to_s) log(&#039;Sending the Following Command: kf 01 &#039;+ilevel.to_s(16)+&#039;\r&#039;) &amp;lt;$&amp;quot;kf 01 &amp;quot;+ilevel.to_s(16)+&amp;quot;\r&amp;quot;$&amp;gt; SetDeviceDataInDB( device_.devid_, 158, ilevel .to_s) # 158DEVICEDATA_Volume_Level_CONST # &amp;quot;volume and corresponding device data set\n&amp;quot; 	&lt;br /&gt;
&lt;br /&gt;
#90 Vol Down&lt;br /&gt;
	log(&#039;lowering volume from &#039; + @volume.to_s) cmd_313(@volume-1) 	&lt;br /&gt;
&lt;br /&gt;
#89 Vol Up&lt;br /&gt;
	log(&#039;Increasing volume from &#039; + @volume.to_s) cmd_313(@volume+1) 	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=User:Bulek&amp;diff=14584</id>
		<title>User:Bulek</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=User:Bulek&amp;diff=14584"/>
		<updated>2008-06-29T21:33:26Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Temporary copy of LG LCD TV template (based on existing LG_42LB5D template)&lt;br /&gt;
&lt;br /&gt;
==== &#039;Add Ruby snippets to commands&#039;==== &lt;br /&gt;
&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;
 Power&lt;br /&gt;
#193 Off&lt;br /&gt;
	log(&#039;Sending OFF Command&#039;) &amp;lt;$&amp;quot;ka 01 00\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#192 On&lt;br /&gt;
	log(&#039;Sending ON Command&#039;) &amp;lt;$&amp;quot;ka 01 01\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
InputsInput commands not implemented: Antenna, Tuner - Digital (Click to add)&lt;br /&gt;
#316 AV 1&lt;br /&gt;
	log(&#039;Switching Input to AV1&#039;) &amp;lt;$&amp;quot;kb 01 02\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#317 AV 2&lt;br /&gt;
	log(&#039;Switching Input to AV2&#039;) &amp;lt;$&amp;quot;kb 01 03\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#712 Component 1&lt;br /&gt;
	log(&#039;Switching Input to Component 1&#039;) &amp;lt;$&amp;quot;kb 01 04\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#361 HDMI&lt;br /&gt;
	log(&#039;Switching Input to HDMI 1&#039;) &amp;lt;$&amp;quot;kb 01 07\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#154 RGB&lt;br /&gt;
	log(&#039;Switching Input to RGB/PC&#039;) &amp;lt;$&amp;quot;kb 01 06\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
Aspect Ratios&lt;br /&gt;
#879 16:9&lt;br /&gt;
	log(&#039;Aspect Ratio 16:9&#039;) &amp;lt;$&amp;quot;kc 01 02\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#877 4:3&lt;br /&gt;
	log(&#039;Aspect Ratio 4:3&#039;) &amp;lt;$&amp;quot;kc 01 01\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
DSP Modes&lt;br /&gt;
#116 DSP Mode&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
General&lt;br /&gt;
#190 Enter/Go&lt;br /&gt;
	log(&#039;Sending Enter/Go Command&#039;) &amp;lt;$&amp;quot;mc 01 44\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
Internal&lt;br /&gt;
#373 Private Method Listing&lt;br /&gt;
	def log(line) $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;) $log.puts &amp;quot;(***):&amp;quot; + line.to_s $log.close end 	&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;
	buff = &#039;&#039; while(true) buff=conn_.Recv(30,200) if(buff.length() == 0) log(&#039;Nothing Received&#039;) break end log(&#039;Received: &#039; + Regexp.escape(buff.to_s)) if !buff.index(&amp;quot;OK&amp;quot;).nil? log(Regexp.escape(buff.to_s) + &#039;: Command Processed Successfully&#039;) elsif !buff.index(&amp;quot;NG&amp;quot;).nil? log(Regexp.escape(buff.to_s) +&#039;: Command Processed Unsuccessfully&#039;) end end 	&lt;br /&gt;
&lt;br /&gt;
#355 Process Initialize&lt;br /&gt;
	for iRetry in 0...4 print &amp;quot;Initializing unit\n&amp;quot; conn_.Send(&amp;quot;ke 01 01\r&amp;quot;) # Send UnMute Command buf = conn_.Recv(30,200) # Expected Return # ke 01 01\r\ne 00 OK01x\r\n if !buf.nil? &amp;amp;&amp;amp; !buf.index(&amp;quot;OK&amp;quot;).nil? print &amp;quot;Initialized ok\n&amp;quot; print &amp;quot;Setting volume to 30%\n&amp;quot; cmd_313(15) SetDeviceDataInDB( device_.devid_, 158, &amp;quot;15&amp;quot; ) # 158 = DEVICEDATA_Volume_Level_CONST return end print &amp;quot;Failed to initialize. Wait 1 secs and try again\n&amp;quot; sleep(1) end #DisableDevice( device_.devid_, true ) #print &amp;quot;The device would not respond. Disabling it.\n&amp;quot; 	&lt;br /&gt;
&lt;br /&gt;
#384 Process Receive Command For Child&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
#356 Process Release&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
#587 Preset/Prog/Freq&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
#676 Video Mute&lt;br /&gt;
	log(&#039;Sending Video Mute Command&#039;) &amp;lt;$&amp;quot;kd 01 00\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#683 Zoom&lt;br /&gt;
	log(&#039;Aspect Ratio 16:9&#039;) &amp;lt;$&amp;quot;kc 01 05\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
Numbers&lt;br /&gt;
#204 0&lt;br /&gt;
	log(&#039;Sending 0 &#039;) &amp;lt;$&amp;quot;mc 01 10\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#205 1&lt;br /&gt;
	log(&#039;Sending 1 &#039;) &amp;lt;$&amp;quot;mc 01 11\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#206 2&lt;br /&gt;
	log(&#039;Sending 2 &#039;) &amp;lt;$&amp;quot;mc 01 12r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#207 3&lt;br /&gt;
	log(&#039;Sending 3 &#039;) &amp;lt;$&amp;quot;mc 01 13\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#208 4&lt;br /&gt;
	log(&#039;Sending 4 &#039;) &amp;lt;$&amp;quot;mc 01 14\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#209 5&lt;br /&gt;
	log(&#039;Sending 5 &#039;) &amp;lt;$&amp;quot;mc 01 15\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#210 6&lt;br /&gt;
	log(&#039;Sending 6 &#039;) &amp;lt;$&amp;quot;mc 01 16\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#211 7&lt;br /&gt;
	log(&#039;Sending 7 &#039;) &amp;lt;$&amp;quot;mc 01 17\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#212 8&lt;br /&gt;
	log(&#039;Sending 8 &#039;) &amp;lt;$&amp;quot;mc 01 18\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#213 9&lt;br /&gt;
	log(&#039;Sending 9 &#039;) &amp;lt;$&amp;quot;mc 01 19\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
On-Screen Menu Navig&lt;br /&gt;
#86 Menu (Show Menu)&lt;br /&gt;
	log(&#039;Sending Menu Command&#039;) &amp;lt;$&amp;quot;mc 01 43\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#201 Move Down&lt;br /&gt;
	log(&#039;Menu Down&#039;) &amp;lt;$&amp;quot;mc 01 41\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#202 Move Left&lt;br /&gt;
	log(&#039;Menu Left&#039;) &amp;lt;$&amp;quot;mc 01 07\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#203 Move Right&lt;br /&gt;
	log(&#039;Menu Right&#039;) &amp;lt;$&amp;quot;mc 01 06\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
#200 Move Up&lt;br /&gt;
	log(&#039;Menu Up&#039;) &amp;lt;$&amp;quot;mc 01 40\r&amp;quot;$&amp;gt; 	&lt;br /&gt;
&lt;br /&gt;
Picture Control&lt;br /&gt;
#224 Brightness Down&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
#223 Brightness Up&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
#221 Contrast Down&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
#220 Contrast Up&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
Simple Control&lt;br /&gt;
#64 Skip Back - Channel/Track Lower&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
#63 Skip Fwd - Channel/Track Greater&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
Sound &amp;amp; Volume&lt;br /&gt;
#97 Mute&lt;br /&gt;
	if(@mute) &amp;lt;$&amp;quot;ke 01 00\r&amp;quot;$&amp;gt; else &amp;lt;$&amp;quot;ke 01 01\r&amp;quot;$&amp;gt; end @mute=!@mute 	&lt;br /&gt;
&lt;br /&gt;
#313 Set Volume&lt;br /&gt;
	@volume=level.to_i() ilevel = @volume.to_i log( &#039;setting volume to &#039;+ ilevel.to_s) log(&#039;Sending the Following Command: kf 01 &#039;+ilevel.to_s(16)+&#039;\r&#039;) &amp;lt;$&amp;quot;kf 01 &amp;quot;+ilevel.to_s(16)+&amp;quot;\r&amp;quot;$&amp;gt; SetDeviceDataInDB( device_.devid_, 158, ilevel .to_s) # 158DEVICEDATA_Volume_Level_CONST # &amp;quot;volume and corresponding device data set\n&amp;quot; 	&lt;br /&gt;
&lt;br /&gt;
#90 Vol Down&lt;br /&gt;
	log(&#039;lowering volume from &#039; + @volume.to_s) cmd_313(@volume-1) 	&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>Bulek</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=ESS_Expandable_Speaker_Selector_Switch&amp;diff=14573</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=14573"/>
		<updated>2008-06-29T15:45:03Z</updated>

		<summary type="html">&lt;p&gt;Bulek: &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;
&lt;br /&gt;
[[Category: Hardware]]&lt;br /&gt;
[[Category: Audio]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
&lt;br /&gt;
In editing phase !!! - working copy !!!&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;
  		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;
&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;
 $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>Bulek</name></author>
	</entry>
</feed>