<?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=Chrisbirkinshaw</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=Chrisbirkinshaw"/>
	<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php/Special:Contributions/Chrisbirkinshaw"/>
	<updated>2026-10-27T23:28:38Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=User:Chrisbirkinshaw&amp;diff=17705</id>
		<title>User:Chrisbirkinshaw</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=User:Chrisbirkinshaw&amp;diff=17705"/>
		<updated>2009-02-20T17:22:15Z</updated>

		<summary type="html">&lt;p&gt;Chrisbirkinshaw: /* The Ruby Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== My System ==&lt;br /&gt;
&lt;br /&gt;
Things which might be interesting:&lt;br /&gt;
&lt;br /&gt;
=== Motion controlled lighting ===&lt;br /&gt;
&lt;br /&gt;
Turn on lights when presence is detected in a room, taking into account day/night and also having a way of overriding (for those dark English afternoons!)&lt;br /&gt;
&lt;br /&gt;
=== Automatic Computer Desk Lamp ===&lt;br /&gt;
&lt;br /&gt;
Turn on desk lamp when I&#039;m using my Mac and turn it off after XX idle mins (i.e. no mouse or keyboard input)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Motion Controlled Lighting ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Reasons this can&#039;t be done in LMCE natively at the moment ===&lt;br /&gt;
&lt;br /&gt;
1. It is not possible to set a timer and then reset that timer. This means your lights will be constantly going on and off, as the old timers expire and then movement is picked up again.&lt;br /&gt;
&lt;br /&gt;
2. It is not possible to say &amp;quot;Turn on X if motion detected in R and Y is on&amp;quot;, so you cannot have override buttons for your auto lights (Y, in this example)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
In this example we imagine a room called &amp;quot;hall&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Security sensor in the hall&lt;br /&gt;
* A light in the hall controlled by LMCE&lt;br /&gt;
* Dummy On/Off Light Switch &amp;quot;Night/Day&amp;quot; (place on floorplan inside a box with a label drawn on)&lt;br /&gt;
* Dummy On/Off Light Switch &amp;quot;Hall Auto&amp;quot; (place on floorplan inside a box with a label drawn on)&lt;br /&gt;
* Event responder configured to switch &amp;quot;Night/Day&amp;quot; on and &amp;quot;Hall Auto&amp;quot; off at sunrise&lt;br /&gt;
* Event responder configured to switch &amp;quot;Night/Day&amp;quot; off and &amp;quot;Hall Auto&amp;quot; on at sunset&lt;br /&gt;
* Lighting scenario &amp;quot;Lights Auto&amp;quot; to switch &amp;quot;Hall Auto&amp;quot; on from the home screen&lt;br /&gt;
* Lighting scenario &amp;quot;Lights Manual&amp;quot; to switch &amp;quot;Hall Auto&amp;quot; off from the home screen &lt;br /&gt;
* Code below saved as interceptor.rb or similar (name is not important)&lt;br /&gt;
* Device configured for the interceptor (see [[Plain Text DCE Messages]]) and the id inserted into the code below at the top&lt;br /&gt;
&lt;br /&gt;
=== Procedure ===&lt;br /&gt;
&lt;br /&gt;
Run the code below in a loop:&lt;br /&gt;
&lt;br /&gt;
while true ; do ruby interceptor.rb ; done&lt;br /&gt;
&lt;br /&gt;
You should see it connect and register intercepts for Lighting and Security messages. You can now configure the interceptor by triggering events, looking at the output of the interceptor for where it says for example:&lt;br /&gt;
&lt;br /&gt;
Correlating message: (165 -108 2 9 25 &amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
You can take the part from within the brackets and use it in the rules.&lt;br /&gt;
&lt;br /&gt;
You can see a few rules defined in my example, and will notice that you can have rules for automatic lighting zones, and also straightforward rules for triggering events. The latter scenario is not really very useful as LMCE is pretty good at doing this anyway. I mostly used that stuff for testing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;I am not a programmer, so this code was written as I scoured the net for Ruby examples and tried to make sense of it. I know it is messy and very there is a lot of garbage in there, but I did not think it was worth spending the time on. Once LMCE has developed a little more this code is useless, so it should remain a simple hack to get along in the meantime.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== The Ruby Code ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Known issues:&lt;br /&gt;
#&lt;br /&gt;
# Doesn&#039;t cope with messages like this: 0 162 9 0 &amp;quot;&amp;amp;&amp;quot; 173 175,176,177, 1 192 97 &amp;quot;&amp;quot; 98 &amp;quot;&amp;quot;&lt;br /&gt;
# i.e. where a message is to multiple destinations &lt;br /&gt;
#&lt;br /&gt;
# Disclaimer: This code is seriously messy and VERY limited! It&#039;s just a quick hack to get things working until &lt;br /&gt;
# Linux MCE can support resettable timers and device state can be used as a condition for advanced event responders&lt;br /&gt;
#  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
require &#039;socket&#039;&lt;br /&gt;
include Socket::Constants  &lt;br /&gt;
&lt;br /&gt;
device_id=162&lt;br /&gt;
&lt;br /&gt;
# note that a trigger is in a different format to an enable/disable message, as for the enable/disable message we ignore the source id&lt;br /&gt;
 &lt;br /&gt;
ruleconfig = [&lt;br /&gt;
{ :trigger =&amp;gt; &#039;164 -108 2 9 25 &amp;quot;1&amp;quot;&#039;, :on =&amp;gt; &amp;quot;162 103 1 192&amp;quot;, :off =&amp;gt; &amp;quot;162 103 1 193&amp;quot;, :name =&amp;gt; &amp;quot;entrance&amp;quot;, :zoneid =&amp;gt; 1, :roomid =&amp;gt; 3, &lt;br /&gt;
        :timeout =&amp;gt; 90, :enable =&amp;gt; &#039;175 1 192&#039;, :disable =&amp;gt; &#039;175 1 193&#039; },&lt;br /&gt;
{ :trigger =&amp;gt; &#039;166 -108 2 9 25 &amp;quot;1&amp;quot;&#039;, :on =&amp;gt; &amp;quot;162 104 1 192&amp;quot;, :off =&amp;gt; &amp;quot;162 104 1 193&amp;quot;, :name =&amp;gt; &amp;quot;kitchen&amp;quot;, :zoneid =&amp;gt; 2, :roomid =&amp;gt; 5, &lt;br /&gt;
        :timeout =&amp;gt; 90, :enable =&amp;gt; &#039;176 1 192&#039;, :disable =&amp;gt; &#039;176 1 193&#039; },&lt;br /&gt;
{ :trigger =&amp;gt; &#039;165 -108 2 9 25 &amp;quot;1&amp;quot;&#039;, :on =&amp;gt; &amp;quot;162 105 1 192&amp;quot;, :off =&amp;gt; &amp;quot;162 105 1 193&amp;quot;, :name =&amp;gt; &amp;quot;landing&amp;quot;, :zoneid =&amp;gt; 3, :roomid =&amp;gt; 4, &lt;br /&gt;
        :timeout =&amp;gt; 90, :enable =&amp;gt; &#039;177 1 192&#039;, :disable =&amp;gt; &#039;177 1 193&#039; },&lt;br /&gt;
{ :trigger =&amp;gt; &#039;82 9 1 694 2 5 9 48&#039;, :response =&amp;gt; &amp;quot;162 102 1 192&amp;quot;, :name =&amp;gt; &amp;quot;bedroom orbiter registered&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 102 1 192&amp;quot;, :name =&amp;gt; &amp;quot;bedroom md shutdown&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 102 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 1 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 102 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 1 off&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 102 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 2 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 102 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 2 off&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 154 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 154 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 off&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 99 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 99 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 off&amp;quot;}&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
def configure(ruleconfig)&lt;br /&gt;
  @rules = []&lt;br /&gt;
  @zones = [] &lt;br /&gt;
  ruleconfig.each do |rc|&lt;br /&gt;
    if rc[:zoneid]&lt;br /&gt;
    	zone = {:id =&amp;gt; rc[:zoneid], :roomid =&amp;gt; rc[:roomid], :trigger =&amp;gt; rc[:trigger], :name =&amp;gt; rc[:name], :on =&amp;gt; rc[:on], :off =&amp;gt; rc[:off], &lt;br /&gt;
			:timeout =&amp;gt; rc[:timeout], :watching_media =&amp;gt; 0, :listening_media =&amp;gt; 0, :auto =&amp;gt; 1, :enable =&amp;gt; rc[:enable], :disable =&amp;gt; rc[:disable] }&lt;br /&gt;
p zone&lt;br /&gt;
@zones &amp;lt;&amp;lt; zone&lt;br /&gt;
    else&lt;br /&gt;
        @rules &amp;lt;&amp;lt; rc&lt;br /&gt;
	p rc&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
    puts &amp;quot;Configured #{@zones.size} zones and #{@rules.size} rules&amp;quot;&lt;br /&gt;
end   &lt;br /&gt;
  &lt;br /&gt;
def connect_lmce(device_id)&lt;br /&gt;
  @in_socket = Socket.new( AF_INET, SOCK_STREAM, 0 )&lt;br /&gt;
  in_sockaddr = Socket.pack_sockaddr_in( 3450, &#039;localhost&#039; )&lt;br /&gt;
  @in_socket.connect( in_sockaddr )&lt;br /&gt;
&lt;br /&gt;
  @out_socket = Socket.new( AF_INET, SOCK_STREAM, 0 )&lt;br /&gt;
  out_sockaddr = Socket.pack_sockaddr_in( 3450, &#039;localhost&#039; )&lt;br /&gt;
  @out_socket.connect( out_sockaddr )&lt;br /&gt;
&lt;br /&gt;
  puts &amp;quot;Setting receiving connection&amp;quot;&lt;br /&gt;
  @in_socket.send(&amp;quot;COMMAND #{device_id}\n&amp;quot;,0)&lt;br /&gt;
  puts @in_socket.recv( 100 )&lt;br /&gt;
    &lt;br /&gt;
  puts &amp;quot;Setting up sending connection&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;EVENT #{device_id}\n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv( 100 )&lt;br /&gt;
     &lt;br /&gt;
  sleep 1&lt;br /&gt;
&lt;br /&gt;
  puts &amp;quot;Registering for plain text messages&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;PLAIN_TEXT\n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv( 100 )&lt;br /&gt;
  &lt;br /&gt;
  puts &amp;quot;Finished initialising&amp;quot;&lt;br /&gt;
  return @in_socket, @out_socket&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
def register_messages(device_id)&lt;br /&gt;
  puts &amp;quot;Registering for message intercepts (lighting devices)&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;MESSAGET 24 \n #{device_id} -1000 8 0 5 2 4 84\n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv(100)&lt;br /&gt;
   &lt;br /&gt;
  puts &amp;quot;Registering for message intercepts (security devices)&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;MESSAGET 24 \n #{device_id} -1000 8 0 5 1 4 73 \n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv(100)&lt;br /&gt;
   &lt;br /&gt;
  puts &amp;quot;Finished registration&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def process_msg(msg)&lt;br /&gt;
  puts &amp;quot;Received message #{msg}&amp;quot;&lt;br /&gt;
  msg_type_1 = /(\w*)\s(-?\w*),?\s(\w*)\s(\w*)\s(\w*)\s(\&amp;quot;\w*\&amp;quot;)\s(\w*)\s(\&amp;quot;\w*\&amp;quot;)/ # 2 param&lt;br /&gt;
  msg_type_2 = /(\w*)\s(-?\w*),?\s(\w*)\s(\w*)\s(\w*)\s(\&amp;quot;\w*\&amp;quot;)/ # 1 param&lt;br /&gt;
  msg_type_3 = /(\w*)\s(-?\w*),?\s(\w*)\s(\w*)/ # no params&lt;br /&gt;
  msg = msg.gsub(/.*\&amp;amp;\&amp;quot;\s/, &amp;quot;&amp;quot;).gsub(&amp;quot;\n&amp;quot;, &amp;quot;&amp;quot;) &lt;br /&gt;
  puts &amp;quot;Processing message #{msg}&amp;quot;&lt;br /&gt;
  case msg&lt;br /&gt;
	when msg_type_1&lt;br /&gt;
	  msg_type_1.match(msg)&lt;br /&gt;
 	  puts &amp;quot;Type 1: From=#{$1} To=#{$2} Type=#{$3} MsgId=#{$4} P1Id=#{$5} P1Val=#{$6} P2Id=#{$7} P2Val=#{$8}&amp;quot; &lt;br /&gt;
   	  correlate_msg(&amp;quot;#{$1} #{$2} #{$3} #{$4} #{$5} #{$6} #{$7} #{$8}&amp;quot;)&lt;br /&gt;
	when msg_type_2&lt;br /&gt;
          msg_type_2.match(msg)&lt;br /&gt;
          puts &amp;quot;Type 2: From=#{$1} To=#{$2} Type=#{$3} MsgId=#{$4} P1Id=#{$5} P1Val=#{$6}&amp;quot;&lt;br /&gt;
          correlate_msg(&amp;quot;#{$1} #{$2} #{$3} #{$4} #{$5} #{$6}&amp;quot;)&lt;br /&gt;
	when msg_type_3&lt;br /&gt;
          msg_type_3.match(msg)&lt;br /&gt;
          puts &amp;quot;Type 3: From=#{$1} To=#{$2} Type=#{$3} MsgId=#{$4}&amp;quot;&lt;br /&gt;
          correlate_msg(&amp;quot;#{$1} #{$2} #{$3} #{$4}&amp;quot;)&lt;br /&gt;
	else puts &amp;quot;Unknown message &#039;#{msg}&#039;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
     &lt;br /&gt;
def correlate_msg(msg)&lt;br /&gt;
puts &amp;quot;Correlating message: (#{msg})&amp;quot;&lt;br /&gt;
msg_without_from_address = msg.gsub(/^[0-9]*\s/, &#039;&#039;)&lt;br /&gt;
@rules.each do |rule|&lt;br /&gt;
if msg == rule[:trigger]&lt;br /&gt;
 puts &amp;quot;Rule #{rule[:name]} Matched&amp;quot;&lt;br /&gt;
 puts &amp;quot;Sending Message #{rule[:response]}, length #{rule[:response].length}&amp;quot;&lt;br /&gt;
 @out_socket.send(&amp;quot;MESSAGET #{rule[:response].length + 1} \n #{rule[:response]} \n&amp;quot;, 0)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
@zones.each do |zone|&lt;br /&gt;
if msg == zone[:trigger] &amp;amp;&amp;amp; zone[:auto] == 1&lt;br /&gt;
 puts &amp;quot;Zone #{zone[:name]} matched - setting timer for #{zone[:timeout]} secs&amp;quot;&lt;br /&gt;
 if zone[:timer] and zone[:timer].alive?&lt;br /&gt;
   zone[:timer].kill&lt;br /&gt;
 else&lt;br /&gt;
   puts &amp;quot;Switching on light!&amp;quot;&lt;br /&gt;
   @out_socket.send(&amp;quot;MESSAGET #{zone[:on].length + 1} \n #{zone[:on]} \n&amp;quot;, 0)&lt;br /&gt;
 end&lt;br /&gt;
 zone[:timer] = Thread.new do &lt;br /&gt;
   puts &amp;quot;starting new thread&amp;quot;&lt;br /&gt;
   counter = 0&lt;br /&gt;
   while counter &amp;lt; zone[:timeout]&lt;br /&gt;
	counter += 1&lt;br /&gt;
	sleep 1&lt;br /&gt;
   end&lt;br /&gt;
   puts &amp;quot;Switching off light!&amp;quot;&lt;br /&gt;
   @out_socket.send(&amp;quot;MESSAGET #{zone[:off].length + 1} \n #{zone[:off]} \n&amp;quot;, 0)&lt;br /&gt;
 end	&lt;br /&gt;
end&lt;br /&gt;
if msg_without_from_address == zone[:enable]&lt;br /&gt;
  puts &amp;quot;Enabling auto lights for #{zone[:name]}&amp;quot;&lt;br /&gt;
  zone[:auto] = 1&lt;br /&gt;
end&lt;br /&gt;
if msg_without_from_address == zone[:disable]&lt;br /&gt;
  puts &amp;quot;Disabling auto lights for #{zone[:name]}&amp;quot;&lt;br /&gt;
  zone[:auto] = 0&lt;br /&gt;
end &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
configure(ruleconfig) &lt;br /&gt;
@in_socket, @out_socket = connect_lmce(device_id)&lt;br /&gt;
register_messages(device_id)&lt;br /&gt;
&lt;br /&gt;
loop {&lt;br /&gt;
    #puts &amp;quot;Start Loop&amp;quot;&lt;br /&gt;
    if data = @in_socket.read( 11 )&lt;br /&gt;
    #puts &amp;quot;Received data: #{ data }&amp;quot;&lt;br /&gt;
    if (/MESSAGET\ (..)/.match(data))&lt;br /&gt;
      #puts &amp;quot;Message size: #{$1}&amp;quot;&lt;br /&gt;
      len = $1.to_i + 2&lt;br /&gt;
      msg = @in_socket.read( len )&lt;br /&gt;
      @in_socket.send(&amp;quot;OK \n&amp;quot;, 0)&lt;br /&gt;
      process_msg(msg)&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
      @in_socket.close&lt;br /&gt;
      @out_socket.close&lt;br /&gt;
      sleep 3&lt;br /&gt;
      @in_socket, @out_socket = connect_lmce(device_id)&lt;br /&gt;
      register_messages(device_id)&lt;br /&gt;
    end&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Automatic Computer Desk Lamp ==&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
* SSH access to the core from your Mac without using passwords (Google will help)&lt;br /&gt;
* A lamp at your desk, controlled by LMCE&lt;br /&gt;
&lt;br /&gt;
=== The Script ===&lt;br /&gt;
&lt;br /&gt;
Save this as CheckIdle.command or similar and run by double clicking.&lt;br /&gt;
&lt;br /&gt;
You might want to change &amp;quot;root@$dcerouter&amp;quot; to something more secure in the code below!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
dcerouter=&amp;quot;192.168.1.1&amp;quot;&lt;br /&gt;
lamp=&amp;quot;108&amp;quot;&lt;br /&gt;
timeout=&amp;quot;300&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## Do not change anything below here ##&lt;br /&gt;
&lt;br /&gt;
status=0 &lt;br /&gt;
while true ; do &lt;br /&gt;
&lt;br /&gt;
idle=`ioreg -c IOHIDSystem | perl -ane &#039;if (/Idle/) {$idle=(pop @F)/1000000000; print $idle;last}&#039; | sed &#039;s/\..*//&#039;` &lt;br /&gt;
if [ $idle -gt $timeout ] ; then&lt;br /&gt;
 if [ $status -eq 1 ] ; then&lt;br /&gt;
  ssh root@$dcerouter &amp;quot;/usr/pluto/bin/MessageSend localhost $lamp $lamp 1 193&amp;quot; &amp;amp;&amp;amp; status=0 &amp;amp;&amp;amp; echo &amp;quot;Lamp turned off&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
else&lt;br /&gt;
  if [ $status -eq 0 ] ; then&lt;br /&gt;
    ssh root@$dcerouter &amp;quot;/usr/pluto/bin/MessageSend localhost $lamp $lamp 1 192&amp;quot; &amp;amp;&amp;amp; status=1 &amp;amp;&amp;amp; echo &amp;quot;Lamp turned on&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
fi&lt;br /&gt;
  &lt;br /&gt;
sleep 2&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chrisbirkinshaw</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=User:Chrisbirkinshaw&amp;diff=17485</id>
		<title>User:Chrisbirkinshaw</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=User:Chrisbirkinshaw&amp;diff=17485"/>
		<updated>2009-01-30T17:49:31Z</updated>

		<summary type="html">&lt;p&gt;Chrisbirkinshaw: /* Requirements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== My System ==&lt;br /&gt;
&lt;br /&gt;
Things which might be interesting:&lt;br /&gt;
&lt;br /&gt;
=== Motion controlled lighting ===&lt;br /&gt;
&lt;br /&gt;
Turn on lights when presence is detected in a room, taking into account day/night and also having a way of overriding (for those dark English afternoons!)&lt;br /&gt;
&lt;br /&gt;
=== Automatic Computer Desk Lamp ===&lt;br /&gt;
&lt;br /&gt;
Turn on desk lamp when I&#039;m using my Mac and turn it off after XX idle mins (i.e. no mouse or keyboard input)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Motion Controlled Lighting ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Reasons this can&#039;t be done in LMCE natively at the moment ===&lt;br /&gt;
&lt;br /&gt;
1. It is not possible to set a timer and then reset that timer. This means your lights will be constantly going on and off, as the old timers expire and then movement is picked up again.&lt;br /&gt;
&lt;br /&gt;
2. It is not possible to say &amp;quot;Turn on X if motion detected in R and Y is on&amp;quot;, so you cannot have override buttons for your auto lights (Y, in this example)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
In this example we imagine a room called &amp;quot;hall&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Security sensor in the hall&lt;br /&gt;
* A light in the hall controlled by LMCE&lt;br /&gt;
* Dummy On/Off Light Switch &amp;quot;Night/Day&amp;quot; (place on floorplan inside a box with a label drawn on)&lt;br /&gt;
* Dummy On/Off Light Switch &amp;quot;Hall Auto&amp;quot; (place on floorplan inside a box with a label drawn on)&lt;br /&gt;
* Event responder configured to switch &amp;quot;Night/Day&amp;quot; on and &amp;quot;Hall Auto&amp;quot; off at sunrise&lt;br /&gt;
* Event responder configured to switch &amp;quot;Night/Day&amp;quot; off and &amp;quot;Hall Auto&amp;quot; on at sunset&lt;br /&gt;
* Lighting scenario &amp;quot;Lights Auto&amp;quot; to switch &amp;quot;Hall Auto&amp;quot; on from the home screen&lt;br /&gt;
* Lighting scenario &amp;quot;Lights Manual&amp;quot; to switch &amp;quot;Hall Auto&amp;quot; off from the home screen &lt;br /&gt;
* Code below saved as interceptor.rb or similar (name is not important)&lt;br /&gt;
* Device configured for the interceptor (see [[Plain Text DCE Messages]]) and the id inserted into the code below at the top&lt;br /&gt;
&lt;br /&gt;
=== Procedure ===&lt;br /&gt;
&lt;br /&gt;
Run the code below in a loop:&lt;br /&gt;
&lt;br /&gt;
while true ; do ruby interceptor.rb ; done&lt;br /&gt;
&lt;br /&gt;
You should see it connect and register intercepts for Lighting and Security messages. You can now configure the interceptor by triggering events, looking at the output of the interceptor for where it says for example:&lt;br /&gt;
&lt;br /&gt;
Correlating message: (165 -108 2 9 25 &amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
You can take the part from within the brackets and use it in the rules.&lt;br /&gt;
&lt;br /&gt;
You can see a few rules defined in my example, and will notice that you can have rules for automatic lighting zones, and also straightforward rules for triggering events. The latter scenario is not really very useful as LMCE is pretty good at doing this anyway. I mostly used that stuff for testing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;I am not a programmer, so this code was written as I scoured the net for Ruby examples and tried to make sense of it. I know it is messy and very there is a lot of garbage in there, but I did not think it was worth spending the time on. Once LMCE has developed a little more this code is useless, so it should remain a simple hack to get along in the meantime.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== The Ruby Code ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Known issues:&lt;br /&gt;
#&lt;br /&gt;
# Doesn&#039;t cope with messages like this: 0 162 9 0 &amp;quot;&amp;amp;&amp;quot; 173 175,176,177, 1 192 97 &amp;quot;&amp;quot; 98 &amp;quot;&amp;quot;&lt;br /&gt;
# i.e. where a message is to multiple destinations &lt;br /&gt;
#&lt;br /&gt;
# Should ignore the source of a message when correlating (triggers etc should be setup as classes not just strings to allow&lt;br /&gt;
# more flexibility)&lt;br /&gt;
#&lt;br /&gt;
# Disclaimer: This code is seriously messy and VERY limited! It&#039;s just a quick hack to get things working until &lt;br /&gt;
# Linux MCE can support resettable timers and device state can be used as a condition for advanced event responders&lt;br /&gt;
#  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
require &#039;socket&#039;&lt;br /&gt;
include Socket::Constants  &lt;br /&gt;
&lt;br /&gt;
device_id=162&lt;br /&gt;
&lt;br /&gt;
ruleconfig = [&lt;br /&gt;
{ :trigger =&amp;gt; &#039;164 -108 2 9 25 &amp;quot;1&amp;quot;&#039;, :on =&amp;gt; &amp;quot;162 103 1 192&amp;quot;, :off =&amp;gt; &amp;quot;162 103 1 193&amp;quot;, :name =&amp;gt; &amp;quot;entrance&amp;quot;, :zoneid =&amp;gt; 1, :roomid =&amp;gt; 3, &lt;br /&gt;
        :timeout =&amp;gt; 90, :enable =&amp;gt; &#039;145 175 1 192&#039;, :disable =&amp;gt; &#039;145 175 1 193&#039; },&lt;br /&gt;
{ :trigger =&amp;gt; &#039;166 -108 2 9 25 &amp;quot;1&amp;quot;&#039;, :on =&amp;gt; &amp;quot;162 104 1 192&amp;quot;, :off =&amp;gt; &amp;quot;162 104 1 193&amp;quot;, :name =&amp;gt; &amp;quot;kitchen&amp;quot;, :zoneid =&amp;gt; 2, :roomid =&amp;gt; 5, &lt;br /&gt;
        :timeout =&amp;gt; 90, :enable =&amp;gt; &#039;145 176 1 192&#039;, :disable =&amp;gt; &#039;145 176 1 193&#039; },&lt;br /&gt;
{ :trigger =&amp;gt; &#039;165 -108 2 9 25 &amp;quot;1&amp;quot;&#039;, :on =&amp;gt; &amp;quot;162 105 1 192&amp;quot;, :off =&amp;gt; &amp;quot;162 105 1 193&amp;quot;, :name =&amp;gt; &amp;quot;landing&amp;quot;, :zoneid =&amp;gt; 3, :roomid =&amp;gt; 4, &lt;br /&gt;
        :timeout =&amp;gt; 90, :enable =&amp;gt; &#039;145 177 1 192&#039;, :disable =&amp;gt; &#039;145 177 1 193&#039; },&lt;br /&gt;
{ :trigger =&amp;gt; &#039;78 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 102 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 1 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;78 162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 102 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 1 off&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;82 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 102 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 2 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;82 162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 102 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 2 off&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;83 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 154 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;83 162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 154 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 off&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;83 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 99 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;83 162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 99 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 off&amp;quot;}&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
def configure(ruleconfig)&lt;br /&gt;
  @rules = []&lt;br /&gt;
  @zones = [] &lt;br /&gt;
  ruleconfig.each do |rc|&lt;br /&gt;
    if rc[:zoneid]&lt;br /&gt;
    	zone = {:id =&amp;gt; rc[:zoneid], :roomid =&amp;gt; rc[:roomid], :trigger =&amp;gt; rc[:trigger], :name =&amp;gt; rc[:name], :on =&amp;gt; rc[:on], :off =&amp;gt; rc[:off], &lt;br /&gt;
			:timeout =&amp;gt; rc[:timeout], :watching_media =&amp;gt; 0, :listening_media =&amp;gt; 0, :auto =&amp;gt; 1, :enable =&amp;gt; rc[:enable], :disable =&amp;gt; rc[:disable] }&lt;br /&gt;
p zone&lt;br /&gt;
@zones &amp;lt;&amp;lt; zone&lt;br /&gt;
    else&lt;br /&gt;
        @rules &amp;lt;&amp;lt; rc&lt;br /&gt;
	p rc&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
    puts &amp;quot;Configured #{@zones.size} zones and #{@rules.size} rules&amp;quot;&lt;br /&gt;
end   &lt;br /&gt;
  &lt;br /&gt;
def connect_lmce(device_id)&lt;br /&gt;
  @in_socket = Socket.new( AF_INET, SOCK_STREAM, 0 )&lt;br /&gt;
  in_sockaddr = Socket.pack_sockaddr_in( 3450, &#039;localhost&#039; )&lt;br /&gt;
  @in_socket.connect( in_sockaddr )&lt;br /&gt;
&lt;br /&gt;
  @out_socket = Socket.new( AF_INET, SOCK_STREAM, 0 )&lt;br /&gt;
  out_sockaddr = Socket.pack_sockaddr_in( 3450, &#039;localhost&#039; )&lt;br /&gt;
  @out_socket.connect( out_sockaddr )&lt;br /&gt;
&lt;br /&gt;
  puts &amp;quot;Setting receiving connection&amp;quot;&lt;br /&gt;
  @in_socket.send(&amp;quot;COMMAND #{device_id}\n&amp;quot;,0)&lt;br /&gt;
  puts @in_socket.recv( 100 )&lt;br /&gt;
    &lt;br /&gt;
  puts &amp;quot;Setting up sending connection&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;EVENT #{device_id}\n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv( 100 )&lt;br /&gt;
     &lt;br /&gt;
  sleep 1&lt;br /&gt;
&lt;br /&gt;
  puts &amp;quot;Registering for plain text messages&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;PLAIN_TEXT\n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv( 100 )&lt;br /&gt;
  &lt;br /&gt;
  puts &amp;quot;Finished initialising&amp;quot;&lt;br /&gt;
  return @in_socket, @out_socket&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
def register_messages(device_id)&lt;br /&gt;
  puts &amp;quot;Registering for message intercepts (lighting devices)&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;MESSAGET 24 \n #{device_id} -1000 8 0 5 2 4 84\n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv(100)&lt;br /&gt;
   &lt;br /&gt;
  puts &amp;quot;Registering for message intercepts (security devices)&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;MESSAGET 24 \n #{device_id} -1000 8 0 5 1 4 73 \n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv(100)&lt;br /&gt;
   &lt;br /&gt;
  puts &amp;quot;Finished registration&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def process_msg(msg)&lt;br /&gt;
  puts &amp;quot;Received message #{msg}&amp;quot;&lt;br /&gt;
  msg_type_1 = /(\w*)\s(-?\w*),?\s(\w*)\s(\w*)\s(\w*)\s(\&amp;quot;\w*\&amp;quot;)\s(\w*)\s(\&amp;quot;\w*\&amp;quot;)/ # 2 param&lt;br /&gt;
  msg_type_2 = /(\w*)\s(-?\w*),?\s(\w*)\s(\w*)\s(\w*)\s(\&amp;quot;\w*\&amp;quot;)/ # 1 param&lt;br /&gt;
  msg_type_3 = /(\w*)\s(-?\w*),?\s(\w*)\s(\w*)/ # no params&lt;br /&gt;
  msg = msg.gsub(/.*\&amp;amp;\&amp;quot;\s/, &amp;quot;&amp;quot;).gsub(&amp;quot;\n&amp;quot;, &amp;quot;&amp;quot;) &lt;br /&gt;
  puts &amp;quot;Processing message #{msg}&amp;quot;&lt;br /&gt;
  case msg&lt;br /&gt;
	when msg_type_1&lt;br /&gt;
	  msg_type_1.match(msg)&lt;br /&gt;
 	  puts &amp;quot;Type 1: From=#{$1} To=#{$2} Type=#{$3} MsgId=#{$4} P1Id=#{$5} P1Val=#{$6} P2Id=#{$7} P2Val=#{$8}&amp;quot; &lt;br /&gt;
   	  correlate_msg(&amp;quot;#{$1} #{$2} #{$3} #{$4} #{$5} #{$6} #{$7} #{$8}&amp;quot;)&lt;br /&gt;
	when msg_type_2&lt;br /&gt;
          msg_type_2.match(msg)&lt;br /&gt;
          puts &amp;quot;Type 2: From=#{$1} To=#{$2} Type=#{$3} MsgId=#{$4} P1Id=#{$5} P1Val=#{$6}&amp;quot;&lt;br /&gt;
          correlate_msg(&amp;quot;#{$1} #{$2} #{$3} #{$4} #{$5} #{$6}&amp;quot;)&lt;br /&gt;
	when msg_type_3&lt;br /&gt;
          msg_type_3.match(msg)&lt;br /&gt;
          puts &amp;quot;Type 3: From=#{$1} To=#{$2} Type=#{$3} MsgId=#{$4}&amp;quot;&lt;br /&gt;
          correlate_msg(&amp;quot;#{$1} #{$2} #{$3} #{$4}&amp;quot;)&lt;br /&gt;
	else puts &amp;quot;Unknown message &#039;#{msg}&#039;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
     &lt;br /&gt;
def correlate_msg(msg)&lt;br /&gt;
puts &amp;quot;Correlating message: (#{msg})&amp;quot;&lt;br /&gt;
@rules.each do |rule|&lt;br /&gt;
if msg == rule[:trigger]&lt;br /&gt;
 puts &amp;quot;Rule #{rule[:name]} Matched&amp;quot;&lt;br /&gt;
 puts &amp;quot;Sending Message #{rule[:response]}, length #{rule[:response].length}&amp;quot;&lt;br /&gt;
 @out_socket.send(&amp;quot;MESSAGET #{rule[:response].length + 1} \n #{rule[:response]} \n&amp;quot;, 0)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
@zones.each do |zone|&lt;br /&gt;
if msg == zone[:trigger] &amp;amp;&amp;amp; zone[:auto] == 1&lt;br /&gt;
 puts &amp;quot;Zone #{zone[:name]} matched - setting timer for #{zone[:timeout]} secs&amp;quot;&lt;br /&gt;
 if zone[:timer] and zone[:timer].alive?&lt;br /&gt;
   zone[:timer].kill&lt;br /&gt;
 else&lt;br /&gt;
   puts &amp;quot;Switching on light!&amp;quot;&lt;br /&gt;
   @out_socket.send(&amp;quot;MESSAGET #{zone[:on].length + 1} \n #{zone[:on]} \n&amp;quot;, 0)&lt;br /&gt;
 end&lt;br /&gt;
 zone[:timer] = Thread.new do &lt;br /&gt;
   puts &amp;quot;starting new thread&amp;quot;&lt;br /&gt;
   counter = 0&lt;br /&gt;
   while counter &amp;lt; zone[:timeout]&lt;br /&gt;
	counter += 1&lt;br /&gt;
	sleep 1&lt;br /&gt;
   end&lt;br /&gt;
   puts &amp;quot;Switching off light!&amp;quot;&lt;br /&gt;
   @out_socket.send(&amp;quot;MESSAGET #{zone[:off].length + 1} \n #{zone[:off]} \n&amp;quot;, 0)&lt;br /&gt;
 end	&lt;br /&gt;
end&lt;br /&gt;
if msg == zone[:enable]&lt;br /&gt;
  puts &amp;quot;Enabling auto lights for #{zone[:name]}&amp;quot;&lt;br /&gt;
  zone[:auto] = 1&lt;br /&gt;
end&lt;br /&gt;
if msg == zone[:disable]&lt;br /&gt;
  puts &amp;quot;Disabling auto lights for #{zone[:name]}&amp;quot;&lt;br /&gt;
  zone[:auto] = 0&lt;br /&gt;
end &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
configure(ruleconfig) &lt;br /&gt;
@in_socket, @out_socket = connect_lmce(device_id)&lt;br /&gt;
register_messages(device_id)&lt;br /&gt;
&lt;br /&gt;
loop {&lt;br /&gt;
    #puts &amp;quot;Start Loop&amp;quot;&lt;br /&gt;
    if data = @in_socket.read( 11 )&lt;br /&gt;
    #puts &amp;quot;Received data: #{ data }&amp;quot;&lt;br /&gt;
    if (/MESSAGET\ (..)/.match(data))&lt;br /&gt;
      #puts &amp;quot;Message size: #{$1}&amp;quot;&lt;br /&gt;
      len = $1.to_i + 2&lt;br /&gt;
      msg = @in_socket.read( len )&lt;br /&gt;
      @in_socket.send(&amp;quot;OK \n&amp;quot;, 0)&lt;br /&gt;
      process_msg(msg)&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
      @in_socket.close&lt;br /&gt;
      @out_socket.close&lt;br /&gt;
      sleep 3&lt;br /&gt;
      @in_socket, @out_socket = connect_lmce(device_id)&lt;br /&gt;
      register_messages(device_id)&lt;br /&gt;
    end&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Automatic Computer Desk Lamp ==&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
* SSH access to the core from your Mac without using passwords (Google will help)&lt;br /&gt;
* A lamp at your desk, controlled by LMCE&lt;br /&gt;
&lt;br /&gt;
=== The Script ===&lt;br /&gt;
&lt;br /&gt;
Save this as CheckIdle.command or similar and run by double clicking.&lt;br /&gt;
&lt;br /&gt;
You might want to change &amp;quot;root@$dcerouter&amp;quot; to something more secure in the code below!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
dcerouter=&amp;quot;192.168.1.1&amp;quot;&lt;br /&gt;
lamp=&amp;quot;108&amp;quot;&lt;br /&gt;
timeout=&amp;quot;300&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## Do not change anything below here ##&lt;br /&gt;
&lt;br /&gt;
status=0 &lt;br /&gt;
while true ; do &lt;br /&gt;
&lt;br /&gt;
idle=`ioreg -c IOHIDSystem | perl -ane &#039;if (/Idle/) {$idle=(pop @F)/1000000000; print $idle;last}&#039; | sed &#039;s/\..*//&#039;` &lt;br /&gt;
if [ $idle -gt $timeout ] ; then&lt;br /&gt;
 if [ $status -eq 1 ] ; then&lt;br /&gt;
  ssh root@$dcerouter &amp;quot;/usr/pluto/bin/MessageSend localhost $lamp $lamp 1 193&amp;quot; &amp;amp;&amp;amp; status=0 &amp;amp;&amp;amp; echo &amp;quot;Lamp turned off&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
else&lt;br /&gt;
  if [ $status -eq 0 ] ; then&lt;br /&gt;
    ssh root@$dcerouter &amp;quot;/usr/pluto/bin/MessageSend localhost $lamp $lamp 1 192&amp;quot; &amp;amp;&amp;amp; status=1 &amp;amp;&amp;amp; echo &amp;quot;Lamp turned on&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
fi&lt;br /&gt;
  &lt;br /&gt;
sleep 2&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chrisbirkinshaw</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=User:Chrisbirkinshaw&amp;diff=17484</id>
		<title>User:Chrisbirkinshaw</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=User:Chrisbirkinshaw&amp;diff=17484"/>
		<updated>2009-01-30T17:49:10Z</updated>

		<summary type="html">&lt;p&gt;Chrisbirkinshaw: /* Requirements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== My System ==&lt;br /&gt;
&lt;br /&gt;
Things which might be interesting:&lt;br /&gt;
&lt;br /&gt;
=== Motion controlled lighting ===&lt;br /&gt;
&lt;br /&gt;
Turn on lights when presence is detected in a room, taking into account day/night and also having a way of overriding (for those dark English afternoons!)&lt;br /&gt;
&lt;br /&gt;
=== Automatic Computer Desk Lamp ===&lt;br /&gt;
&lt;br /&gt;
Turn on desk lamp when I&#039;m using my Mac and turn it off after XX idle mins (i.e. no mouse or keyboard input)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Motion Controlled Lighting ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Reasons this can&#039;t be done in LMCE natively at the moment ===&lt;br /&gt;
&lt;br /&gt;
1. It is not possible to set a timer and then reset that timer. This means your lights will be constantly going on and off, as the old timers expire and then movement is picked up again.&lt;br /&gt;
&lt;br /&gt;
2. It is not possible to say &amp;quot;Turn on X if motion detected in R and Y is on&amp;quot;, so you cannot have override buttons for your auto lights (Y, in this example)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
In this example we imagine a room called &amp;quot;hall&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Security sensor in the hall&lt;br /&gt;
* A light in the hall controlled by LMCE&lt;br /&gt;
* Dummy On/Off Light Switch &amp;quot;Night/Day&amp;quot; (place on floorplan inside a box with a label drawn on)&lt;br /&gt;
* Dummy On/Off Light Switch &amp;quot;Hall Auto&amp;quot; (place on floorplan inside a box with a label drawn on)&lt;br /&gt;
* Event responder configured to switch &amp;quot;Night/Day&amp;quot; on and &amp;quot;Hall Auto&amp;quot; off at sunrise&lt;br /&gt;
* Event responder configured to switch &amp;quot;Night/Day&amp;quot; off and &amp;quot;Hall Auto&amp;quot; on at sunset&lt;br /&gt;
* Lighting scenario &amp;quot;Lights Auto&amp;quot; to switch &amp;quot;Hall Auto&amp;quot; on from the home screen&lt;br /&gt;
* Lighting scenario &amp;quot;Lights Manual&amp;quot; to switch &amp;quot;Hall Auto&amp;quot; off from the home screen &lt;br /&gt;
* Code below saved as interceptor.rb or similar (name is not important)&lt;br /&gt;
* Device configured for the interceptor (see [[Plain Text DCE Messages]]) and the id inserted into the code below at the top&lt;br /&gt;
&lt;br /&gt;
=== Procedure ===&lt;br /&gt;
&lt;br /&gt;
Run the code below in a loop:&lt;br /&gt;
&lt;br /&gt;
while true ; do ruby interceptor.rb ; done&lt;br /&gt;
&lt;br /&gt;
You should see it connect and register intercepts for Lighting and Security messages. You can now configure the interceptor by triggering events, looking at the output of the interceptor for where it says for example:&lt;br /&gt;
&lt;br /&gt;
Correlating message: (165 -108 2 9 25 &amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
You can take the part from within the brackets and use it in the rules.&lt;br /&gt;
&lt;br /&gt;
You can see a few rules defined in my example, and will notice that you can have rules for automatic lighting zones, and also straightforward rules for triggering events. The latter scenario is not really very useful as LMCE is pretty good at doing this anyway. I mostly used that stuff for testing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;I am not a programmer, so this code was written as I scoured the net for Ruby examples and tried to make sense of it. I know it is messy and very there is a lot of garbage in there, but I did not think it was worth spending the time on. Once LMCE has developed a little more this code is useless, so it should remain a simple hack to get along in the meantime.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== The Ruby Code ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Known issues:&lt;br /&gt;
#&lt;br /&gt;
# Doesn&#039;t cope with messages like this: 0 162 9 0 &amp;quot;&amp;amp;&amp;quot; 173 175,176,177, 1 192 97 &amp;quot;&amp;quot; 98 &amp;quot;&amp;quot;&lt;br /&gt;
# i.e. where a message is to multiple destinations &lt;br /&gt;
#&lt;br /&gt;
# Should ignore the source of a message when correlating (triggers etc should be setup as classes not just strings to allow&lt;br /&gt;
# more flexibility)&lt;br /&gt;
#&lt;br /&gt;
# Disclaimer: This code is seriously messy and VERY limited! It&#039;s just a quick hack to get things working until &lt;br /&gt;
# Linux MCE can support resettable timers and device state can be used as a condition for advanced event responders&lt;br /&gt;
#  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
require &#039;socket&#039;&lt;br /&gt;
include Socket::Constants  &lt;br /&gt;
&lt;br /&gt;
device_id=162&lt;br /&gt;
&lt;br /&gt;
ruleconfig = [&lt;br /&gt;
{ :trigger =&amp;gt; &#039;164 -108 2 9 25 &amp;quot;1&amp;quot;&#039;, :on =&amp;gt; &amp;quot;162 103 1 192&amp;quot;, :off =&amp;gt; &amp;quot;162 103 1 193&amp;quot;, :name =&amp;gt; &amp;quot;entrance&amp;quot;, :zoneid =&amp;gt; 1, :roomid =&amp;gt; 3, &lt;br /&gt;
        :timeout =&amp;gt; 90, :enable =&amp;gt; &#039;145 175 1 192&#039;, :disable =&amp;gt; &#039;145 175 1 193&#039; },&lt;br /&gt;
{ :trigger =&amp;gt; &#039;166 -108 2 9 25 &amp;quot;1&amp;quot;&#039;, :on =&amp;gt; &amp;quot;162 104 1 192&amp;quot;, :off =&amp;gt; &amp;quot;162 104 1 193&amp;quot;, :name =&amp;gt; &amp;quot;kitchen&amp;quot;, :zoneid =&amp;gt; 2, :roomid =&amp;gt; 5, &lt;br /&gt;
        :timeout =&amp;gt; 90, :enable =&amp;gt; &#039;145 176 1 192&#039;, :disable =&amp;gt; &#039;145 176 1 193&#039; },&lt;br /&gt;
{ :trigger =&amp;gt; &#039;165 -108 2 9 25 &amp;quot;1&amp;quot;&#039;, :on =&amp;gt; &amp;quot;162 105 1 192&amp;quot;, :off =&amp;gt; &amp;quot;162 105 1 193&amp;quot;, :name =&amp;gt; &amp;quot;landing&amp;quot;, :zoneid =&amp;gt; 3, :roomid =&amp;gt; 4, &lt;br /&gt;
        :timeout =&amp;gt; 90, :enable =&amp;gt; &#039;145 177 1 192&#039;, :disable =&amp;gt; &#039;145 177 1 193&#039; },&lt;br /&gt;
{ :trigger =&amp;gt; &#039;78 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 102 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 1 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;78 162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 102 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 1 off&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;82 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 102 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 2 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;82 162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 102 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 2 off&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;83 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 154 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;83 162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 154 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 off&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;83 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 99 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;83 162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 99 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 off&amp;quot;}&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
def configure(ruleconfig)&lt;br /&gt;
  @rules = []&lt;br /&gt;
  @zones = [] &lt;br /&gt;
  ruleconfig.each do |rc|&lt;br /&gt;
    if rc[:zoneid]&lt;br /&gt;
    	zone = {:id =&amp;gt; rc[:zoneid], :roomid =&amp;gt; rc[:roomid], :trigger =&amp;gt; rc[:trigger], :name =&amp;gt; rc[:name], :on =&amp;gt; rc[:on], :off =&amp;gt; rc[:off], &lt;br /&gt;
			:timeout =&amp;gt; rc[:timeout], :watching_media =&amp;gt; 0, :listening_media =&amp;gt; 0, :auto =&amp;gt; 1, :enable =&amp;gt; rc[:enable], :disable =&amp;gt; rc[:disable] }&lt;br /&gt;
p zone&lt;br /&gt;
@zones &amp;lt;&amp;lt; zone&lt;br /&gt;
    else&lt;br /&gt;
        @rules &amp;lt;&amp;lt; rc&lt;br /&gt;
	p rc&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
    puts &amp;quot;Configured #{@zones.size} zones and #{@rules.size} rules&amp;quot;&lt;br /&gt;
end   &lt;br /&gt;
  &lt;br /&gt;
def connect_lmce(device_id)&lt;br /&gt;
  @in_socket = Socket.new( AF_INET, SOCK_STREAM, 0 )&lt;br /&gt;
  in_sockaddr = Socket.pack_sockaddr_in( 3450, &#039;localhost&#039; )&lt;br /&gt;
  @in_socket.connect( in_sockaddr )&lt;br /&gt;
&lt;br /&gt;
  @out_socket = Socket.new( AF_INET, SOCK_STREAM, 0 )&lt;br /&gt;
  out_sockaddr = Socket.pack_sockaddr_in( 3450, &#039;localhost&#039; )&lt;br /&gt;
  @out_socket.connect( out_sockaddr )&lt;br /&gt;
&lt;br /&gt;
  puts &amp;quot;Setting receiving connection&amp;quot;&lt;br /&gt;
  @in_socket.send(&amp;quot;COMMAND #{device_id}\n&amp;quot;,0)&lt;br /&gt;
  puts @in_socket.recv( 100 )&lt;br /&gt;
    &lt;br /&gt;
  puts &amp;quot;Setting up sending connection&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;EVENT #{device_id}\n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv( 100 )&lt;br /&gt;
     &lt;br /&gt;
  sleep 1&lt;br /&gt;
&lt;br /&gt;
  puts &amp;quot;Registering for plain text messages&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;PLAIN_TEXT\n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv( 100 )&lt;br /&gt;
  &lt;br /&gt;
  puts &amp;quot;Finished initialising&amp;quot;&lt;br /&gt;
  return @in_socket, @out_socket&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
def register_messages(device_id)&lt;br /&gt;
  puts &amp;quot;Registering for message intercepts (lighting devices)&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;MESSAGET 24 \n #{device_id} -1000 8 0 5 2 4 84\n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv(100)&lt;br /&gt;
   &lt;br /&gt;
  puts &amp;quot;Registering for message intercepts (security devices)&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;MESSAGET 24 \n #{device_id} -1000 8 0 5 1 4 73 \n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv(100)&lt;br /&gt;
   &lt;br /&gt;
  puts &amp;quot;Finished registration&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def process_msg(msg)&lt;br /&gt;
  puts &amp;quot;Received message #{msg}&amp;quot;&lt;br /&gt;
  msg_type_1 = /(\w*)\s(-?\w*),?\s(\w*)\s(\w*)\s(\w*)\s(\&amp;quot;\w*\&amp;quot;)\s(\w*)\s(\&amp;quot;\w*\&amp;quot;)/ # 2 param&lt;br /&gt;
  msg_type_2 = /(\w*)\s(-?\w*),?\s(\w*)\s(\w*)\s(\w*)\s(\&amp;quot;\w*\&amp;quot;)/ # 1 param&lt;br /&gt;
  msg_type_3 = /(\w*)\s(-?\w*),?\s(\w*)\s(\w*)/ # no params&lt;br /&gt;
  msg = msg.gsub(/.*\&amp;amp;\&amp;quot;\s/, &amp;quot;&amp;quot;).gsub(&amp;quot;\n&amp;quot;, &amp;quot;&amp;quot;) &lt;br /&gt;
  puts &amp;quot;Processing message #{msg}&amp;quot;&lt;br /&gt;
  case msg&lt;br /&gt;
	when msg_type_1&lt;br /&gt;
	  msg_type_1.match(msg)&lt;br /&gt;
 	  puts &amp;quot;Type 1: From=#{$1} To=#{$2} Type=#{$3} MsgId=#{$4} P1Id=#{$5} P1Val=#{$6} P2Id=#{$7} P2Val=#{$8}&amp;quot; &lt;br /&gt;
   	  correlate_msg(&amp;quot;#{$1} #{$2} #{$3} #{$4} #{$5} #{$6} #{$7} #{$8}&amp;quot;)&lt;br /&gt;
	when msg_type_2&lt;br /&gt;
          msg_type_2.match(msg)&lt;br /&gt;
          puts &amp;quot;Type 2: From=#{$1} To=#{$2} Type=#{$3} MsgId=#{$4} P1Id=#{$5} P1Val=#{$6}&amp;quot;&lt;br /&gt;
          correlate_msg(&amp;quot;#{$1} #{$2} #{$3} #{$4} #{$5} #{$6}&amp;quot;)&lt;br /&gt;
	when msg_type_3&lt;br /&gt;
          msg_type_3.match(msg)&lt;br /&gt;
          puts &amp;quot;Type 3: From=#{$1} To=#{$2} Type=#{$3} MsgId=#{$4}&amp;quot;&lt;br /&gt;
          correlate_msg(&amp;quot;#{$1} #{$2} #{$3} #{$4}&amp;quot;)&lt;br /&gt;
	else puts &amp;quot;Unknown message &#039;#{msg}&#039;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
     &lt;br /&gt;
def correlate_msg(msg)&lt;br /&gt;
puts &amp;quot;Correlating message: (#{msg})&amp;quot;&lt;br /&gt;
@rules.each do |rule|&lt;br /&gt;
if msg == rule[:trigger]&lt;br /&gt;
 puts &amp;quot;Rule #{rule[:name]} Matched&amp;quot;&lt;br /&gt;
 puts &amp;quot;Sending Message #{rule[:response]}, length #{rule[:response].length}&amp;quot;&lt;br /&gt;
 @out_socket.send(&amp;quot;MESSAGET #{rule[:response].length + 1} \n #{rule[:response]} \n&amp;quot;, 0)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
@zones.each do |zone|&lt;br /&gt;
if msg == zone[:trigger] &amp;amp;&amp;amp; zone[:auto] == 1&lt;br /&gt;
 puts &amp;quot;Zone #{zone[:name]} matched - setting timer for #{zone[:timeout]} secs&amp;quot;&lt;br /&gt;
 if zone[:timer] and zone[:timer].alive?&lt;br /&gt;
   zone[:timer].kill&lt;br /&gt;
 else&lt;br /&gt;
   puts &amp;quot;Switching on light!&amp;quot;&lt;br /&gt;
   @out_socket.send(&amp;quot;MESSAGET #{zone[:on].length + 1} \n #{zone[:on]} \n&amp;quot;, 0)&lt;br /&gt;
 end&lt;br /&gt;
 zone[:timer] = Thread.new do &lt;br /&gt;
   puts &amp;quot;starting new thread&amp;quot;&lt;br /&gt;
   counter = 0&lt;br /&gt;
   while counter &amp;lt; zone[:timeout]&lt;br /&gt;
	counter += 1&lt;br /&gt;
	sleep 1&lt;br /&gt;
   end&lt;br /&gt;
   puts &amp;quot;Switching off light!&amp;quot;&lt;br /&gt;
   @out_socket.send(&amp;quot;MESSAGET #{zone[:off].length + 1} \n #{zone[:off]} \n&amp;quot;, 0)&lt;br /&gt;
 end	&lt;br /&gt;
end&lt;br /&gt;
if msg == zone[:enable]&lt;br /&gt;
  puts &amp;quot;Enabling auto lights for #{zone[:name]}&amp;quot;&lt;br /&gt;
  zone[:auto] = 1&lt;br /&gt;
end&lt;br /&gt;
if msg == zone[:disable]&lt;br /&gt;
  puts &amp;quot;Disabling auto lights for #{zone[:name]}&amp;quot;&lt;br /&gt;
  zone[:auto] = 0&lt;br /&gt;
end &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
configure(ruleconfig) &lt;br /&gt;
@in_socket, @out_socket = connect_lmce(device_id)&lt;br /&gt;
register_messages(device_id)&lt;br /&gt;
&lt;br /&gt;
loop {&lt;br /&gt;
    #puts &amp;quot;Start Loop&amp;quot;&lt;br /&gt;
    if data = @in_socket.read( 11 )&lt;br /&gt;
    #puts &amp;quot;Received data: #{ data }&amp;quot;&lt;br /&gt;
    if (/MESSAGET\ (..)/.match(data))&lt;br /&gt;
      #puts &amp;quot;Message size: #{$1}&amp;quot;&lt;br /&gt;
      len = $1.to_i + 2&lt;br /&gt;
      msg = @in_socket.read( len )&lt;br /&gt;
      @in_socket.send(&amp;quot;OK \n&amp;quot;, 0)&lt;br /&gt;
      process_msg(msg)&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
      @in_socket.close&lt;br /&gt;
      @out_socket.close&lt;br /&gt;
      sleep 3&lt;br /&gt;
      @in_socket, @out_socket = connect_lmce(device_id)&lt;br /&gt;
      register_messages(device_id)&lt;br /&gt;
    end&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Automatic Computer Desk Lamp ==&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
1. SSH access to the core from your Mac without using passwords (Google will help)&lt;br /&gt;
2. A lamp at your desk, controlled by LMCE&lt;br /&gt;
&lt;br /&gt;
=== The Script ===&lt;br /&gt;
&lt;br /&gt;
Save this as CheckIdle.command or similar and run by double clicking.&lt;br /&gt;
&lt;br /&gt;
You might want to change &amp;quot;root@$dcerouter&amp;quot; to something more secure in the code below!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
dcerouter=&amp;quot;192.168.1.1&amp;quot;&lt;br /&gt;
lamp=&amp;quot;108&amp;quot;&lt;br /&gt;
timeout=&amp;quot;300&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## Do not change anything below here ##&lt;br /&gt;
&lt;br /&gt;
status=0 &lt;br /&gt;
while true ; do &lt;br /&gt;
&lt;br /&gt;
idle=`ioreg -c IOHIDSystem | perl -ane &#039;if (/Idle/) {$idle=(pop @F)/1000000000; print $idle;last}&#039; | sed &#039;s/\..*//&#039;` &lt;br /&gt;
if [ $idle -gt $timeout ] ; then&lt;br /&gt;
 if [ $status -eq 1 ] ; then&lt;br /&gt;
  ssh root@$dcerouter &amp;quot;/usr/pluto/bin/MessageSend localhost $lamp $lamp 1 193&amp;quot; &amp;amp;&amp;amp; status=0 &amp;amp;&amp;amp; echo &amp;quot;Lamp turned off&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
else&lt;br /&gt;
  if [ $status -eq 0 ] ; then&lt;br /&gt;
    ssh root@$dcerouter &amp;quot;/usr/pluto/bin/MessageSend localhost $lamp $lamp 1 192&amp;quot; &amp;amp;&amp;amp; status=1 &amp;amp;&amp;amp; echo &amp;quot;Lamp turned on&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
fi&lt;br /&gt;
  &lt;br /&gt;
sleep 2&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chrisbirkinshaw</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=User:Chrisbirkinshaw&amp;diff=17483</id>
		<title>User:Chrisbirkinshaw</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=User:Chrisbirkinshaw&amp;diff=17483"/>
		<updated>2009-01-30T17:48:08Z</updated>

		<summary type="html">&lt;p&gt;Chrisbirkinshaw: /* The Ruby Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== My System ==&lt;br /&gt;
&lt;br /&gt;
Things which might be interesting:&lt;br /&gt;
&lt;br /&gt;
=== Motion controlled lighting ===&lt;br /&gt;
&lt;br /&gt;
Turn on lights when presence is detected in a room, taking into account day/night and also having a way of overriding (for those dark English afternoons!)&lt;br /&gt;
&lt;br /&gt;
=== Automatic Computer Desk Lamp ===&lt;br /&gt;
&lt;br /&gt;
Turn on desk lamp when I&#039;m using my Mac and turn it off after XX idle mins (i.e. no mouse or keyboard input)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Motion Controlled Lighting ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Reasons this can&#039;t be done in LMCE natively at the moment ===&lt;br /&gt;
&lt;br /&gt;
1. It is not possible to set a timer and then reset that timer. This means your lights will be constantly going on and off, as the old timers expire and then movement is picked up again.&lt;br /&gt;
&lt;br /&gt;
2. It is not possible to say &amp;quot;Turn on X if motion detected in R and Y is on&amp;quot;, so you cannot have override buttons for your auto lights (Y, in this example)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
In this example we imagine a room called &amp;quot;hall&amp;quot;&lt;br /&gt;
&lt;br /&gt;
1. Security sensor in the hall&lt;br /&gt;
2. A light in the hall controlled by LMCE&lt;br /&gt;
3. Dummy On/Off Light Switch &amp;quot;Night/Day&amp;quot; (place on floorplan inside a box with a label drawn on)&lt;br /&gt;
4. Dummy On/Off Light Switch &amp;quot;Hall Auto&amp;quot; (place on floorplan inside a box with a label drawn on)&lt;br /&gt;
5. Event responder configured to switch &amp;quot;Night/Day&amp;quot; on and &amp;quot;Hall Auto&amp;quot; off at sunrise&lt;br /&gt;
6. Event responder configured to switch &amp;quot;Night/Day&amp;quot; off and &amp;quot;Hall Auto&amp;quot; on at sunset&lt;br /&gt;
7. Lighting scenario &amp;quot;Lights Auto&amp;quot; to switch &amp;quot;Hall Auto&amp;quot; on from the home screen&lt;br /&gt;
8. Lighting scenario &amp;quot;Lights Manual&amp;quot; to switch &amp;quot;Hall Auto&amp;quot; off from the home screen &lt;br /&gt;
9. Code below saved as interceptor.rb or similar (name is not important)&lt;br /&gt;
10. Device configured for the interceptor (see [[Plain Text DCE Messages]]) and the id inserted into the code below at the top&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Procedure ===&lt;br /&gt;
&lt;br /&gt;
Run the code below in a loop:&lt;br /&gt;
&lt;br /&gt;
while true ; do ruby interceptor.rb ; done&lt;br /&gt;
&lt;br /&gt;
You should see it connect and register intercepts for Lighting and Security messages. You can now configure the interceptor by triggering events, looking at the output of the interceptor for where it says for example:&lt;br /&gt;
&lt;br /&gt;
Correlating message: (165 -108 2 9 25 &amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
You can take the part from within the brackets and use it in the rules.&lt;br /&gt;
&lt;br /&gt;
You can see a few rules defined in my example, and will notice that you can have rules for automatic lighting zones, and also straightforward rules for triggering events. The latter scenario is not really very useful as LMCE is pretty good at doing this anyway. I mostly used that stuff for testing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;I am not a programmer, so this code was written as I scoured the net for Ruby examples and tried to make sense of it. I know it is messy and very there is a lot of garbage in there, but I did not think it was worth spending the time on. Once LMCE has developed a little more this code is useless, so it should remain a simple hack to get along in the meantime.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== The Ruby Code ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Known issues:&lt;br /&gt;
#&lt;br /&gt;
# Doesn&#039;t cope with messages like this: 0 162 9 0 &amp;quot;&amp;amp;&amp;quot; 173 175,176,177, 1 192 97 &amp;quot;&amp;quot; 98 &amp;quot;&amp;quot;&lt;br /&gt;
# i.e. where a message is to multiple destinations &lt;br /&gt;
#&lt;br /&gt;
# Should ignore the source of a message when correlating (triggers etc should be setup as classes not just strings to allow&lt;br /&gt;
# more flexibility)&lt;br /&gt;
#&lt;br /&gt;
# Disclaimer: This code is seriously messy and VERY limited! It&#039;s just a quick hack to get things working until &lt;br /&gt;
# Linux MCE can support resettable timers and device state can be used as a condition for advanced event responders&lt;br /&gt;
#  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
require &#039;socket&#039;&lt;br /&gt;
include Socket::Constants  &lt;br /&gt;
&lt;br /&gt;
device_id=162&lt;br /&gt;
&lt;br /&gt;
ruleconfig = [&lt;br /&gt;
{ :trigger =&amp;gt; &#039;164 -108 2 9 25 &amp;quot;1&amp;quot;&#039;, :on =&amp;gt; &amp;quot;162 103 1 192&amp;quot;, :off =&amp;gt; &amp;quot;162 103 1 193&amp;quot;, :name =&amp;gt; &amp;quot;entrance&amp;quot;, :zoneid =&amp;gt; 1, :roomid =&amp;gt; 3, &lt;br /&gt;
        :timeout =&amp;gt; 90, :enable =&amp;gt; &#039;145 175 1 192&#039;, :disable =&amp;gt; &#039;145 175 1 193&#039; },&lt;br /&gt;
{ :trigger =&amp;gt; &#039;166 -108 2 9 25 &amp;quot;1&amp;quot;&#039;, :on =&amp;gt; &amp;quot;162 104 1 192&amp;quot;, :off =&amp;gt; &amp;quot;162 104 1 193&amp;quot;, :name =&amp;gt; &amp;quot;kitchen&amp;quot;, :zoneid =&amp;gt; 2, :roomid =&amp;gt; 5, &lt;br /&gt;
        :timeout =&amp;gt; 90, :enable =&amp;gt; &#039;145 176 1 192&#039;, :disable =&amp;gt; &#039;145 176 1 193&#039; },&lt;br /&gt;
{ :trigger =&amp;gt; &#039;165 -108 2 9 25 &amp;quot;1&amp;quot;&#039;, :on =&amp;gt; &amp;quot;162 105 1 192&amp;quot;, :off =&amp;gt; &amp;quot;162 105 1 193&amp;quot;, :name =&amp;gt; &amp;quot;landing&amp;quot;, :zoneid =&amp;gt; 3, :roomid =&amp;gt; 4, &lt;br /&gt;
        :timeout =&amp;gt; 90, :enable =&amp;gt; &#039;145 177 1 192&#039;, :disable =&amp;gt; &#039;145 177 1 193&#039; },&lt;br /&gt;
{ :trigger =&amp;gt; &#039;78 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 102 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 1 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;78 162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 102 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 1 off&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;82 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 102 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 2 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;82 162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 102 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 2 off&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;83 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 154 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;83 162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 154 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 off&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;83 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 99 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;83 162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 99 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 off&amp;quot;}&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
def configure(ruleconfig)&lt;br /&gt;
  @rules = []&lt;br /&gt;
  @zones = [] &lt;br /&gt;
  ruleconfig.each do |rc|&lt;br /&gt;
    if rc[:zoneid]&lt;br /&gt;
    	zone = {:id =&amp;gt; rc[:zoneid], :roomid =&amp;gt; rc[:roomid], :trigger =&amp;gt; rc[:trigger], :name =&amp;gt; rc[:name], :on =&amp;gt; rc[:on], :off =&amp;gt; rc[:off], &lt;br /&gt;
			:timeout =&amp;gt; rc[:timeout], :watching_media =&amp;gt; 0, :listening_media =&amp;gt; 0, :auto =&amp;gt; 1, :enable =&amp;gt; rc[:enable], :disable =&amp;gt; rc[:disable] }&lt;br /&gt;
p zone&lt;br /&gt;
@zones &amp;lt;&amp;lt; zone&lt;br /&gt;
    else&lt;br /&gt;
        @rules &amp;lt;&amp;lt; rc&lt;br /&gt;
	p rc&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
    puts &amp;quot;Configured #{@zones.size} zones and #{@rules.size} rules&amp;quot;&lt;br /&gt;
end   &lt;br /&gt;
  &lt;br /&gt;
def connect_lmce(device_id)&lt;br /&gt;
  @in_socket = Socket.new( AF_INET, SOCK_STREAM, 0 )&lt;br /&gt;
  in_sockaddr = Socket.pack_sockaddr_in( 3450, &#039;localhost&#039; )&lt;br /&gt;
  @in_socket.connect( in_sockaddr )&lt;br /&gt;
&lt;br /&gt;
  @out_socket = Socket.new( AF_INET, SOCK_STREAM, 0 )&lt;br /&gt;
  out_sockaddr = Socket.pack_sockaddr_in( 3450, &#039;localhost&#039; )&lt;br /&gt;
  @out_socket.connect( out_sockaddr )&lt;br /&gt;
&lt;br /&gt;
  puts &amp;quot;Setting receiving connection&amp;quot;&lt;br /&gt;
  @in_socket.send(&amp;quot;COMMAND #{device_id}\n&amp;quot;,0)&lt;br /&gt;
  puts @in_socket.recv( 100 )&lt;br /&gt;
    &lt;br /&gt;
  puts &amp;quot;Setting up sending connection&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;EVENT #{device_id}\n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv( 100 )&lt;br /&gt;
     &lt;br /&gt;
  sleep 1&lt;br /&gt;
&lt;br /&gt;
  puts &amp;quot;Registering for plain text messages&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;PLAIN_TEXT\n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv( 100 )&lt;br /&gt;
  &lt;br /&gt;
  puts &amp;quot;Finished initialising&amp;quot;&lt;br /&gt;
  return @in_socket, @out_socket&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
def register_messages(device_id)&lt;br /&gt;
  puts &amp;quot;Registering for message intercepts (lighting devices)&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;MESSAGET 24 \n #{device_id} -1000 8 0 5 2 4 84\n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv(100)&lt;br /&gt;
   &lt;br /&gt;
  puts &amp;quot;Registering for message intercepts (security devices)&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;MESSAGET 24 \n #{device_id} -1000 8 0 5 1 4 73 \n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv(100)&lt;br /&gt;
   &lt;br /&gt;
  puts &amp;quot;Finished registration&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def process_msg(msg)&lt;br /&gt;
  puts &amp;quot;Received message #{msg}&amp;quot;&lt;br /&gt;
  msg_type_1 = /(\w*)\s(-?\w*),?\s(\w*)\s(\w*)\s(\w*)\s(\&amp;quot;\w*\&amp;quot;)\s(\w*)\s(\&amp;quot;\w*\&amp;quot;)/ # 2 param&lt;br /&gt;
  msg_type_2 = /(\w*)\s(-?\w*),?\s(\w*)\s(\w*)\s(\w*)\s(\&amp;quot;\w*\&amp;quot;)/ # 1 param&lt;br /&gt;
  msg_type_3 = /(\w*)\s(-?\w*),?\s(\w*)\s(\w*)/ # no params&lt;br /&gt;
  msg = msg.gsub(/.*\&amp;amp;\&amp;quot;\s/, &amp;quot;&amp;quot;).gsub(&amp;quot;\n&amp;quot;, &amp;quot;&amp;quot;) &lt;br /&gt;
  puts &amp;quot;Processing message #{msg}&amp;quot;&lt;br /&gt;
  case msg&lt;br /&gt;
	when msg_type_1&lt;br /&gt;
	  msg_type_1.match(msg)&lt;br /&gt;
 	  puts &amp;quot;Type 1: From=#{$1} To=#{$2} Type=#{$3} MsgId=#{$4} P1Id=#{$5} P1Val=#{$6} P2Id=#{$7} P2Val=#{$8}&amp;quot; &lt;br /&gt;
   	  correlate_msg(&amp;quot;#{$1} #{$2} #{$3} #{$4} #{$5} #{$6} #{$7} #{$8}&amp;quot;)&lt;br /&gt;
	when msg_type_2&lt;br /&gt;
          msg_type_2.match(msg)&lt;br /&gt;
          puts &amp;quot;Type 2: From=#{$1} To=#{$2} Type=#{$3} MsgId=#{$4} P1Id=#{$5} P1Val=#{$6}&amp;quot;&lt;br /&gt;
          correlate_msg(&amp;quot;#{$1} #{$2} #{$3} #{$4} #{$5} #{$6}&amp;quot;)&lt;br /&gt;
	when msg_type_3&lt;br /&gt;
          msg_type_3.match(msg)&lt;br /&gt;
          puts &amp;quot;Type 3: From=#{$1} To=#{$2} Type=#{$3} MsgId=#{$4}&amp;quot;&lt;br /&gt;
          correlate_msg(&amp;quot;#{$1} #{$2} #{$3} #{$4}&amp;quot;)&lt;br /&gt;
	else puts &amp;quot;Unknown message &#039;#{msg}&#039;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
     &lt;br /&gt;
def correlate_msg(msg)&lt;br /&gt;
puts &amp;quot;Correlating message: (#{msg})&amp;quot;&lt;br /&gt;
@rules.each do |rule|&lt;br /&gt;
if msg == rule[:trigger]&lt;br /&gt;
 puts &amp;quot;Rule #{rule[:name]} Matched&amp;quot;&lt;br /&gt;
 puts &amp;quot;Sending Message #{rule[:response]}, length #{rule[:response].length}&amp;quot;&lt;br /&gt;
 @out_socket.send(&amp;quot;MESSAGET #{rule[:response].length + 1} \n #{rule[:response]} \n&amp;quot;, 0)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
@zones.each do |zone|&lt;br /&gt;
if msg == zone[:trigger] &amp;amp;&amp;amp; zone[:auto] == 1&lt;br /&gt;
 puts &amp;quot;Zone #{zone[:name]} matched - setting timer for #{zone[:timeout]} secs&amp;quot;&lt;br /&gt;
 if zone[:timer] and zone[:timer].alive?&lt;br /&gt;
   zone[:timer].kill&lt;br /&gt;
 else&lt;br /&gt;
   puts &amp;quot;Switching on light!&amp;quot;&lt;br /&gt;
   @out_socket.send(&amp;quot;MESSAGET #{zone[:on].length + 1} \n #{zone[:on]} \n&amp;quot;, 0)&lt;br /&gt;
 end&lt;br /&gt;
 zone[:timer] = Thread.new do &lt;br /&gt;
   puts &amp;quot;starting new thread&amp;quot;&lt;br /&gt;
   counter = 0&lt;br /&gt;
   while counter &amp;lt; zone[:timeout]&lt;br /&gt;
	counter += 1&lt;br /&gt;
	sleep 1&lt;br /&gt;
   end&lt;br /&gt;
   puts &amp;quot;Switching off light!&amp;quot;&lt;br /&gt;
   @out_socket.send(&amp;quot;MESSAGET #{zone[:off].length + 1} \n #{zone[:off]} \n&amp;quot;, 0)&lt;br /&gt;
 end	&lt;br /&gt;
end&lt;br /&gt;
if msg == zone[:enable]&lt;br /&gt;
  puts &amp;quot;Enabling auto lights for #{zone[:name]}&amp;quot;&lt;br /&gt;
  zone[:auto] = 1&lt;br /&gt;
end&lt;br /&gt;
if msg == zone[:disable]&lt;br /&gt;
  puts &amp;quot;Disabling auto lights for #{zone[:name]}&amp;quot;&lt;br /&gt;
  zone[:auto] = 0&lt;br /&gt;
end &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
configure(ruleconfig) &lt;br /&gt;
@in_socket, @out_socket = connect_lmce(device_id)&lt;br /&gt;
register_messages(device_id)&lt;br /&gt;
&lt;br /&gt;
loop {&lt;br /&gt;
    #puts &amp;quot;Start Loop&amp;quot;&lt;br /&gt;
    if data = @in_socket.read( 11 )&lt;br /&gt;
    #puts &amp;quot;Received data: #{ data }&amp;quot;&lt;br /&gt;
    if (/MESSAGET\ (..)/.match(data))&lt;br /&gt;
      #puts &amp;quot;Message size: #{$1}&amp;quot;&lt;br /&gt;
      len = $1.to_i + 2&lt;br /&gt;
      msg = @in_socket.read( len )&lt;br /&gt;
      @in_socket.send(&amp;quot;OK \n&amp;quot;, 0)&lt;br /&gt;
      process_msg(msg)&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
      @in_socket.close&lt;br /&gt;
      @out_socket.close&lt;br /&gt;
      sleep 3&lt;br /&gt;
      @in_socket, @out_socket = connect_lmce(device_id)&lt;br /&gt;
      register_messages(device_id)&lt;br /&gt;
    end&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Automatic Computer Desk Lamp ==&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
1. SSH access to the core from your Mac without using passwords (Google will help)&lt;br /&gt;
2. A lamp at your desk, controlled by LMCE&lt;br /&gt;
&lt;br /&gt;
=== The Script ===&lt;br /&gt;
&lt;br /&gt;
Save this as CheckIdle.command or similar and run by double clicking.&lt;br /&gt;
&lt;br /&gt;
You might want to change &amp;quot;root@$dcerouter&amp;quot; to something more secure in the code below!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
dcerouter=&amp;quot;192.168.1.1&amp;quot;&lt;br /&gt;
lamp=&amp;quot;108&amp;quot;&lt;br /&gt;
timeout=&amp;quot;300&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## Do not change anything below here ##&lt;br /&gt;
&lt;br /&gt;
status=0 &lt;br /&gt;
while true ; do &lt;br /&gt;
&lt;br /&gt;
idle=`ioreg -c IOHIDSystem | perl -ane &#039;if (/Idle/) {$idle=(pop @F)/1000000000; print $idle;last}&#039; | sed &#039;s/\..*//&#039;` &lt;br /&gt;
if [ $idle -gt $timeout ] ; then&lt;br /&gt;
 if [ $status -eq 1 ] ; then&lt;br /&gt;
  ssh root@$dcerouter &amp;quot;/usr/pluto/bin/MessageSend localhost $lamp $lamp 1 193&amp;quot; &amp;amp;&amp;amp; status=0 &amp;amp;&amp;amp; echo &amp;quot;Lamp turned off&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
else&lt;br /&gt;
  if [ $status -eq 0 ] ; then&lt;br /&gt;
    ssh root@$dcerouter &amp;quot;/usr/pluto/bin/MessageSend localhost $lamp $lamp 1 192&amp;quot; &amp;amp;&amp;amp; status=1 &amp;amp;&amp;amp; echo &amp;quot;Lamp turned on&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
fi&lt;br /&gt;
  &lt;br /&gt;
sleep 2&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chrisbirkinshaw</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=User:Chrisbirkinshaw&amp;diff=17482</id>
		<title>User:Chrisbirkinshaw</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=User:Chrisbirkinshaw&amp;diff=17482"/>
		<updated>2009-01-30T17:47:12Z</updated>

		<summary type="html">&lt;p&gt;Chrisbirkinshaw: New page:  == My System ==  Things which might be interesting:  === Motion controlled lighting ===  Turn on lights when presence is detected in a room, taking into account day/night and also having ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== My System ==&lt;br /&gt;
&lt;br /&gt;
Things which might be interesting:&lt;br /&gt;
&lt;br /&gt;
=== Motion controlled lighting ===&lt;br /&gt;
&lt;br /&gt;
Turn on lights when presence is detected in a room, taking into account day/night and also having a way of overriding (for those dark English afternoons!)&lt;br /&gt;
&lt;br /&gt;
=== Automatic Computer Desk Lamp ===&lt;br /&gt;
&lt;br /&gt;
Turn on desk lamp when I&#039;m using my Mac and turn it off after XX idle mins (i.e. no mouse or keyboard input)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Motion Controlled Lighting ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Reasons this can&#039;t be done in LMCE natively at the moment ===&lt;br /&gt;
&lt;br /&gt;
1. It is not possible to set a timer and then reset that timer. This means your lights will be constantly going on and off, as the old timers expire and then movement is picked up again.&lt;br /&gt;
&lt;br /&gt;
2. It is not possible to say &amp;quot;Turn on X if motion detected in R and Y is on&amp;quot;, so you cannot have override buttons for your auto lights (Y, in this example)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
In this example we imagine a room called &amp;quot;hall&amp;quot;&lt;br /&gt;
&lt;br /&gt;
1. Security sensor in the hall&lt;br /&gt;
2. A light in the hall controlled by LMCE&lt;br /&gt;
3. Dummy On/Off Light Switch &amp;quot;Night/Day&amp;quot; (place on floorplan inside a box with a label drawn on)&lt;br /&gt;
4. Dummy On/Off Light Switch &amp;quot;Hall Auto&amp;quot; (place on floorplan inside a box with a label drawn on)&lt;br /&gt;
5. Event responder configured to switch &amp;quot;Night/Day&amp;quot; on and &amp;quot;Hall Auto&amp;quot; off at sunrise&lt;br /&gt;
6. Event responder configured to switch &amp;quot;Night/Day&amp;quot; off and &amp;quot;Hall Auto&amp;quot; on at sunset&lt;br /&gt;
7. Lighting scenario &amp;quot;Lights Auto&amp;quot; to switch &amp;quot;Hall Auto&amp;quot; on from the home screen&lt;br /&gt;
8. Lighting scenario &amp;quot;Lights Manual&amp;quot; to switch &amp;quot;Hall Auto&amp;quot; off from the home screen &lt;br /&gt;
9. Code below saved as interceptor.rb or similar (name is not important)&lt;br /&gt;
10. Device configured for the interceptor (see [[Plain Text DCE Messages]]) and the id inserted into the code below at the top&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Procedure ===&lt;br /&gt;
&lt;br /&gt;
Run the code below in a loop:&lt;br /&gt;
&lt;br /&gt;
while true ; do ruby interceptor.rb ; done&lt;br /&gt;
&lt;br /&gt;
You should see it connect and register intercepts for Lighting and Security messages. You can now configure the interceptor by triggering events, looking at the output of the interceptor for where it says for example:&lt;br /&gt;
&lt;br /&gt;
Correlating message: (165 -108 2 9 25 &amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
You can take the part from within the brackets and use it in the rules.&lt;br /&gt;
&lt;br /&gt;
You can see a few rules defined in my example, and will notice that you can have rules for automatic lighting zones, and also straightforward rules for triggering events. The latter scenario is not really very useful as LMCE is pretty good at doing this anyway. I mostly used that stuff for testing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;I am not a programmer, so this code was written as I scoured the net for Ruby examples and tried to make sense of it. I know it is messy and very there is a lot of garbage in there, but I did not think it was worth spending the time on. Once LMCE has developed a little more this code is useless, so it should remain a simple hack to get along in the meantime.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== The Ruby Code ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Known issues:&lt;br /&gt;
#&lt;br /&gt;
# Doesn&#039;t cope with messages like this: 0 162 9 0 &amp;quot;&amp;amp;&amp;quot; 173 175,176,177, 1 192 97 &amp;quot;&amp;quot; 98 &amp;quot;&amp;quot;&lt;br /&gt;
# i.e. where a message is to multiple destinations &lt;br /&gt;
#&lt;br /&gt;
# Should ignore the source of a message when correlating (triggers etc should be setup as classes not just strings to allow&lt;br /&gt;
# more flexibility)&lt;br /&gt;
#&lt;br /&gt;
# Disclaimer: This code is seriously messy and VERY limited! It&#039;s just a quick hack to get things working until &lt;br /&gt;
# Linux MCE can support resettable timers and device state can be used as a condition for advanced event responders&lt;br /&gt;
#  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
require &#039;socket&#039;&lt;br /&gt;
include Socket::Constants  &lt;br /&gt;
&lt;br /&gt;
device_id=162&lt;br /&gt;
&lt;br /&gt;
ruleconfig = [&lt;br /&gt;
{ :trigger =&amp;gt; &#039;164 -108 2 9 25 &amp;quot;1&amp;quot;&#039;, :on =&amp;gt; &amp;quot;162 103 1 192&amp;quot;, :off =&amp;gt; &amp;quot;162 103 1 193&amp;quot;, :name =&amp;gt; &amp;quot;entrance&amp;quot;, :zoneid =&amp;gt; 1, :roomid =&amp;gt; 3, &lt;br /&gt;
        :timeout =&amp;gt; 90, :enable =&amp;gt; &#039;145 175 1 192&#039;, :disable =&amp;gt; &#039;145 175 1 193&#039; },&lt;br /&gt;
{ :trigger =&amp;gt; &#039;166 -108 2 9 25 &amp;quot;1&amp;quot;&#039;, :on =&amp;gt; &amp;quot;162 104 1 192&amp;quot;, :off =&amp;gt; &amp;quot;162 104 1 193&amp;quot;, :name =&amp;gt; &amp;quot;kitchen&amp;quot;, :zoneid =&amp;gt; 2, :roomid =&amp;gt; 5, &lt;br /&gt;
        :timeout =&amp;gt; 90, :enable =&amp;gt; &#039;145 176 1 192&#039;, :disable =&amp;gt; &#039;145 176 1 193&#039; },&lt;br /&gt;
{ :trigger =&amp;gt; &#039;165 -108 2 9 25 &amp;quot;1&amp;quot;&#039;, :on =&amp;gt; &amp;quot;162 105 1 192&amp;quot;, :off =&amp;gt; &amp;quot;162 105 1 193&amp;quot;, :name =&amp;gt; &amp;quot;landing&amp;quot;, :zoneid =&amp;gt; 3, :roomid =&amp;gt; 4, &lt;br /&gt;
        :timeout =&amp;gt; 90, :enable =&amp;gt; &#039;145 177 1 192&#039;, :disable =&amp;gt; &#039;145 177 1 193&#039; },&lt;br /&gt;
{ :trigger =&amp;gt; &#039;48 9 1 694 2 5 9 48&#039;, :response =&amp;gt; &amp;quot;162 102 1 192&amp;quot;, :name =&amp;gt; &amp;quot;bedroom orbiter registered&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;78 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 102 1 192&amp;quot;, :name =&amp;gt; &amp;quot;bedroom md shutdown&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;78 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 102 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 1 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;78 162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 102 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 1 off&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;82 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 102 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 2 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;82 162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 102 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 2 off&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;83 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 154 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;83 162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 154 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 off&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &#039;83 162 2 9 25 1&#039;, :response =&amp;gt; &amp;quot;162 99 1 192&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 on&amp;quot;},&lt;br /&gt;
{ :trigger =&amp;gt; &amp;quot;83 162 2 9 25 0&amp;quot;, :response =&amp;gt; &amp;quot;162 99 1 193&amp;quot;, :name =&amp;gt; &amp;quot;sw 3 off&amp;quot;}&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
def configure(ruleconfig)&lt;br /&gt;
  @rules = []&lt;br /&gt;
  @zones = [] &lt;br /&gt;
  ruleconfig.each do |rc|&lt;br /&gt;
    if rc[:zoneid]&lt;br /&gt;
    	zone = {:id =&amp;gt; rc[:zoneid], :roomid =&amp;gt; rc[:roomid], :trigger =&amp;gt; rc[:trigger], :name =&amp;gt; rc[:name], :on =&amp;gt; rc[:on], :off =&amp;gt; rc[:off], &lt;br /&gt;
			:timeout =&amp;gt; rc[:timeout], :watching_media =&amp;gt; 0, :listening_media =&amp;gt; 0, :auto =&amp;gt; 1, :enable =&amp;gt; rc[:enable], :disable =&amp;gt; rc[:disable] }&lt;br /&gt;
p zone&lt;br /&gt;
@zones &amp;lt;&amp;lt; zone&lt;br /&gt;
    else&lt;br /&gt;
        @rules &amp;lt;&amp;lt; rc&lt;br /&gt;
	p rc&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
    puts &amp;quot;Configured #{@zones.size} zones and #{@rules.size} rules&amp;quot;&lt;br /&gt;
end   &lt;br /&gt;
  &lt;br /&gt;
def connect_lmce(device_id)&lt;br /&gt;
  @in_socket = Socket.new( AF_INET, SOCK_STREAM, 0 )&lt;br /&gt;
  in_sockaddr = Socket.pack_sockaddr_in( 3450, &#039;localhost&#039; )&lt;br /&gt;
  @in_socket.connect( in_sockaddr )&lt;br /&gt;
&lt;br /&gt;
  @out_socket = Socket.new( AF_INET, SOCK_STREAM, 0 )&lt;br /&gt;
  out_sockaddr = Socket.pack_sockaddr_in( 3450, &#039;localhost&#039; )&lt;br /&gt;
  @out_socket.connect( out_sockaddr )&lt;br /&gt;
&lt;br /&gt;
  puts &amp;quot;Setting receiving connection&amp;quot;&lt;br /&gt;
  @in_socket.send(&amp;quot;COMMAND #{device_id}\n&amp;quot;,0)&lt;br /&gt;
  puts @in_socket.recv( 100 )&lt;br /&gt;
    &lt;br /&gt;
  puts &amp;quot;Setting up sending connection&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;EVENT #{device_id}\n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv( 100 )&lt;br /&gt;
     &lt;br /&gt;
  sleep 1&lt;br /&gt;
&lt;br /&gt;
  puts &amp;quot;Registering for plain text messages&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;PLAIN_TEXT\n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv( 100 )&lt;br /&gt;
  &lt;br /&gt;
  puts &amp;quot;Finished initialising&amp;quot;&lt;br /&gt;
  return @in_socket, @out_socket&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
def register_messages(device_id)&lt;br /&gt;
  puts &amp;quot;Registering for message intercepts (lighting devices)&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;MESSAGET 24 \n #{device_id} -1000 8 0 5 2 4 84\n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv(100)&lt;br /&gt;
   &lt;br /&gt;
  puts &amp;quot;Registering for message intercepts (security devices)&amp;quot;&lt;br /&gt;
  @out_socket.send(&amp;quot;MESSAGET 24 \n #{device_id} -1000 8 0 5 1 4 73 \n&amp;quot;,0)&lt;br /&gt;
  puts @out_socket.recv(100)&lt;br /&gt;
   &lt;br /&gt;
  puts &amp;quot;Finished registration&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def process_msg(msg)&lt;br /&gt;
  puts &amp;quot;Received message #{msg}&amp;quot;&lt;br /&gt;
  msg_type_1 = /(\w*)\s(-?\w*),?\s(\w*)\s(\w*)\s(\w*)\s(\&amp;quot;\w*\&amp;quot;)\s(\w*)\s(\&amp;quot;\w*\&amp;quot;)/ # 2 param&lt;br /&gt;
  msg_type_2 = /(\w*)\s(-?\w*),?\s(\w*)\s(\w*)\s(\w*)\s(\&amp;quot;\w*\&amp;quot;)/ # 1 param&lt;br /&gt;
  msg_type_3 = /(\w*)\s(-?\w*),?\s(\w*)\s(\w*)/ # no params&lt;br /&gt;
  msg = msg.gsub(/.*\&amp;amp;\&amp;quot;\s/, &amp;quot;&amp;quot;).gsub(&amp;quot;\n&amp;quot;, &amp;quot;&amp;quot;) &lt;br /&gt;
  puts &amp;quot;Processing message #{msg}&amp;quot;&lt;br /&gt;
  case msg&lt;br /&gt;
	when msg_type_1&lt;br /&gt;
	  msg_type_1.match(msg)&lt;br /&gt;
 	  puts &amp;quot;Type 1: From=#{$1} To=#{$2} Type=#{$3} MsgId=#{$4} P1Id=#{$5} P1Val=#{$6} P2Id=#{$7} P2Val=#{$8}&amp;quot; &lt;br /&gt;
   	  correlate_msg(&amp;quot;#{$1} #{$2} #{$3} #{$4} #{$5} #{$6} #{$7} #{$8}&amp;quot;)&lt;br /&gt;
	when msg_type_2&lt;br /&gt;
          msg_type_2.match(msg)&lt;br /&gt;
          puts &amp;quot;Type 2: From=#{$1} To=#{$2} Type=#{$3} MsgId=#{$4} P1Id=#{$5} P1Val=#{$6}&amp;quot;&lt;br /&gt;
          correlate_msg(&amp;quot;#{$1} #{$2} #{$3} #{$4} #{$5} #{$6}&amp;quot;)&lt;br /&gt;
	when msg_type_3&lt;br /&gt;
          msg_type_3.match(msg)&lt;br /&gt;
          puts &amp;quot;Type 3: From=#{$1} To=#{$2} Type=#{$3} MsgId=#{$4}&amp;quot;&lt;br /&gt;
          correlate_msg(&amp;quot;#{$1} #{$2} #{$3} #{$4}&amp;quot;)&lt;br /&gt;
	else puts &amp;quot;Unknown message &#039;#{msg}&#039;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
     &lt;br /&gt;
def correlate_msg(msg)&lt;br /&gt;
puts &amp;quot;Correlating message: (#{msg})&amp;quot;&lt;br /&gt;
@rules.each do |rule|&lt;br /&gt;
if msg == rule[:trigger]&lt;br /&gt;
 puts &amp;quot;Rule #{rule[:name]} Matched&amp;quot;&lt;br /&gt;
 puts &amp;quot;Sending Message #{rule[:response]}, length #{rule[:response].length}&amp;quot;&lt;br /&gt;
 @out_socket.send(&amp;quot;MESSAGET #{rule[:response].length + 1} \n #{rule[:response]} \n&amp;quot;, 0)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
@zones.each do |zone|&lt;br /&gt;
if msg == zone[:trigger] &amp;amp;&amp;amp; zone[:auto] == 1&lt;br /&gt;
 puts &amp;quot;Zone #{zone[:name]} matched - setting timer for #{zone[:timeout]} secs&amp;quot;&lt;br /&gt;
 if zone[:timer] and zone[:timer].alive?&lt;br /&gt;
   zone[:timer].kill&lt;br /&gt;
 else&lt;br /&gt;
   puts &amp;quot;Switching on light!&amp;quot;&lt;br /&gt;
   @out_socket.send(&amp;quot;MESSAGET #{zone[:on].length + 1} \n #{zone[:on]} \n&amp;quot;, 0)&lt;br /&gt;
 end&lt;br /&gt;
 zone[:timer] = Thread.new do &lt;br /&gt;
   puts &amp;quot;starting new thread&amp;quot;&lt;br /&gt;
   counter = 0&lt;br /&gt;
   while counter &amp;lt; zone[:timeout]&lt;br /&gt;
	counter += 1&lt;br /&gt;
	sleep 1&lt;br /&gt;
   end&lt;br /&gt;
   puts &amp;quot;Switching off light!&amp;quot;&lt;br /&gt;
   @out_socket.send(&amp;quot;MESSAGET #{zone[:off].length + 1} \n #{zone[:off]} \n&amp;quot;, 0)&lt;br /&gt;
 end	&lt;br /&gt;
end&lt;br /&gt;
if msg == zone[:enable]&lt;br /&gt;
  puts &amp;quot;Enabling auto lights for #{zone[:name]}&amp;quot;&lt;br /&gt;
  zone[:auto] = 1&lt;br /&gt;
end&lt;br /&gt;
if msg == zone[:disable]&lt;br /&gt;
  puts &amp;quot;Disabling auto lights for #{zone[:name]}&amp;quot;&lt;br /&gt;
  zone[:auto] = 0&lt;br /&gt;
end &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
configure(ruleconfig) &lt;br /&gt;
@in_socket, @out_socket = connect_lmce(device_id)&lt;br /&gt;
register_messages(device_id)&lt;br /&gt;
&lt;br /&gt;
loop {&lt;br /&gt;
    #puts &amp;quot;Start Loop&amp;quot;&lt;br /&gt;
    if data = @in_socket.read( 11 )&lt;br /&gt;
    #puts &amp;quot;Received data: #{ data }&amp;quot;&lt;br /&gt;
    if (/MESSAGET\ (..)/.match(data))&lt;br /&gt;
      #puts &amp;quot;Message size: #{$1}&amp;quot;&lt;br /&gt;
      len = $1.to_i + 2&lt;br /&gt;
      msg = @in_socket.read( len )&lt;br /&gt;
      @in_socket.send(&amp;quot;OK \n&amp;quot;, 0)&lt;br /&gt;
      process_msg(msg)&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
      @in_socket.close&lt;br /&gt;
      @out_socket.close&lt;br /&gt;
      sleep 3&lt;br /&gt;
      @in_socket, @out_socket = connect_lmce(device_id)&lt;br /&gt;
      register_messages(device_id)&lt;br /&gt;
    end&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Automatic Computer Desk Lamp ==&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
1. SSH access to the core from your Mac without using passwords (Google will help)&lt;br /&gt;
2. A lamp at your desk, controlled by LMCE&lt;br /&gt;
&lt;br /&gt;
=== The Script ===&lt;br /&gt;
&lt;br /&gt;
Save this as CheckIdle.command or similar and run by double clicking.&lt;br /&gt;
&lt;br /&gt;
You might want to change &amp;quot;root@$dcerouter&amp;quot; to something more secure in the code below!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
dcerouter=&amp;quot;192.168.1.1&amp;quot;&lt;br /&gt;
lamp=&amp;quot;108&amp;quot;&lt;br /&gt;
timeout=&amp;quot;300&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## Do not change anything below here ##&lt;br /&gt;
&lt;br /&gt;
status=0 &lt;br /&gt;
while true ; do &lt;br /&gt;
&lt;br /&gt;
idle=`ioreg -c IOHIDSystem | perl -ane &#039;if (/Idle/) {$idle=(pop @F)/1000000000; print $idle;last}&#039; | sed &#039;s/\..*//&#039;` &lt;br /&gt;
if [ $idle -gt $timeout ] ; then&lt;br /&gt;
 if [ $status -eq 1 ] ; then&lt;br /&gt;
  ssh root@$dcerouter &amp;quot;/usr/pluto/bin/MessageSend localhost $lamp $lamp 1 193&amp;quot; &amp;amp;&amp;amp; status=0 &amp;amp;&amp;amp; echo &amp;quot;Lamp turned off&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
else&lt;br /&gt;
  if [ $status -eq 0 ] ; then&lt;br /&gt;
    ssh root@$dcerouter &amp;quot;/usr/pluto/bin/MessageSend localhost $lamp $lamp 1 192&amp;quot; &amp;amp;&amp;amp; status=1 &amp;amp;&amp;amp; echo &amp;quot;Lamp turned on&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
fi&lt;br /&gt;
  &lt;br /&gt;
sleep 2&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chrisbirkinshaw</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Tips%26Tricks_for_various_scenarios%3F&amp;diff=15938</id>
		<title>Tips&amp;Tricks for various scenarios?</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Tips%26Tricks_for_various_scenarios%3F&amp;diff=15938"/>
		<updated>2008-10-23T23:16:25Z</updated>

		<summary type="html">&lt;p&gt;Chrisbirkinshaw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Showing same scenario also in other rooms ? ==&lt;br /&gt;
 1. finish your scenario in Scenario Wizard&amp;lt;br&amp;gt;&lt;br /&gt;
 2. go to Advanced - Scenarios and find your scenario and click on it - you&#039;ll get also ticks for other rooms..&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This is particularly useful if you have complex scneario with more commands to various devices - repeating all those clicks would be inconvenient.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Start playing playlist in certain Audio zone (doesn&#039;t work!)==&lt;br /&gt;
 1. go to Advanced Scenario Wizard&amp;lt;br&amp;gt;&lt;br /&gt;
 2. add MH Play Media command for Media_Plugin (child of DCERouter)&amp;lt;br&amp;gt;&lt;br /&gt;
 3. add Filename (#13 Filename (string) ) and Entertainment Area (#45 PK_EntertainArea (string) ).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
I have sniffed DCERouter when I start playlist from Orbiter and tried to mimic that command being send, but it doesn&#039;t work. Anyone with more insight how to do this properly ?&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Turn on an MD and set the lighting in a room ==&lt;br /&gt;
 1. Create your Scenario, and using the Lighting Wizard set your lights as you wish&lt;br /&gt;
 2. Save changes, then change to the Advanced Wizard&lt;br /&gt;
 3. Add a new command, choose device General Info Plugin (child of the Core)&lt;br /&gt;
 4. Select the command Wake Device &lt;br /&gt;
 5. Enter the id of the Media Director you wish to wake (you can get this from the Media Directors page)&lt;br /&gt;
 6. Save changes&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Turn off an MD ==&lt;br /&gt;
&lt;br /&gt;
Use the General Info Plugin as above and choose the command Halt Device. In the configuration for the command add the id of the MD&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: scenarios]]&lt;/div&gt;</summary>
		<author><name>Chrisbirkinshaw</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Tips%26Tricks_for_various_scenarios%3F&amp;diff=15937</id>
		<title>Tips&amp;Tricks for various scenarios?</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Tips%26Tricks_for_various_scenarios%3F&amp;diff=15937"/>
		<updated>2008-10-23T23:15:50Z</updated>

		<summary type="html">&lt;p&gt;Chrisbirkinshaw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Showing same scenario also in other rooms ? ==&lt;br /&gt;
 1. finish your scenario in Scenario Wizard&amp;lt;br&amp;gt;&lt;br /&gt;
 2. go to Advanced - Scenarios and find your scenario and click on it - you&#039;ll get also ticks for other rooms..&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This is particularly useful if you have complex scneario with more commands to various devices - repeating all those clicks would be inconvenient.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Start playing playlist in certain Audio zone ==&lt;br /&gt;
 1. go to Advanced Scenario Wizard&amp;lt;br&amp;gt;&lt;br /&gt;
 2. add MH Play Media command for Media_Plugin (child of DCERouter)&amp;lt;br&amp;gt;&lt;br /&gt;
 3. add Filename (#13 Filename (string) ) and Entertainment Area (#45 PK_EntertainArea (string) ).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
I have sniffed DCERouter when I start playlist from Orbiter and tried to mimic that command being send, but it doesn&#039;t work. Anyone with more insight how to do this properly ?&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Turn on an MD and set the lighting in a room ==&lt;br /&gt;
 1. Create your Scenario, and using the Lighting Wizard set your lights as you wish&lt;br /&gt;
 2. Save changes, then change to the Advanced Wizard&lt;br /&gt;
 3. Add a new command, choose device General Info Plugin (child of the Core)&lt;br /&gt;
 4. Select the command Wake Device &lt;br /&gt;
 5. Enter the id of the Media Director you wish to wake (you can get this from the Media Directors page)&lt;br /&gt;
 6. Save changes&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Turn off an MD ==&lt;br /&gt;
&lt;br /&gt;
Use the General Info Plugin as above and choose the command Halt Device. In the configuration for the command add the id of the MD&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: scenarios]]&lt;/div&gt;</summary>
		<author><name>Chrisbirkinshaw</name></author>
	</entry>
</feed>