User:Sine over cosine
From DSL Wiki
Contents |
DSL for X10 control
Intro
I'm fairly new to DSL and currently have it installed on an old system with a 4 GB hard drive and 32MB of memory. The install was done as a hard drive install. After reading more about DSL, I realize that a Frugal install would have been better...
If/when I have time I may redo the install...
DSL as an X10 controller
Summary
- System connected to home network
- monkey web server set up
- cron30.dsl installed
- perl cgi scripts to communicate over serial port to old CP-290 X-10 controller
Functionality
Allows control of my many X10 modules by a web page as well as the option of
using cron for scheduling on/off/dim events.
Perl Serial Port Subroutine
In order to talk to the CP290 with DSL I needed a way to communicate without using the Device:SerialPort module. I figured it wasn't worth the effort for me to get that working in DSL. With a little research I found what I needed.
OK my code is not a thing of beauty... and I'm sure it could be done shorter and better but it does work. The lines involved with opening the serial port and writing/reading were inspired by an old web page of Paul Haas(1).
Part of my cgi script
sub output_cmd { $err = 1; # Set up command bytes $cmd_out = $byte1_to_16 . $byte17 . $byte18 ; $cmd_out .= $byte19 . $byte20 . $byte21 . $byte22; # $port = /dev/ttyS0 for my system open ("sPORT","+<$port") || die "failed opening $port : $!"; # Set up serial port for 600 baud, no echo, 8 Bit, 1 Stop, raw in/out system("stty 600 -echo cs8 -cstopb raw < $port"); #output command $len= length $cmd_out; syswrite sPORT, $cmd_out, $len; #get response from CP290, does not use handshaking # waits a maximum of 9 seconds to get a complete response # .... 6 x ( 1sec from sleep command + .5 sec from select command ) # (Dim commands take a while to complete) $len= 0; $count=1; $inbuf=""; #Using the vec ,select, and sysread commands to get the data vec($rin,fileno("sPORT"),1) = 1; READ: while($count < 7) { sleep(1); while(select($rout=$rin, undef, undef, .5)) { $char=""; sysread ("sPORT", $char,1); $inbuf .= $char; $len = length $inbuf; } $count +=1; # If successful CP290 will respond with # an acknowledge that is 19 char long if ($len == 19) # equals success { $err = 0; # clear error flag last READ; # exit loop } } return($err)
References
(1) Paul Haas - http://www.hamjudo.com/rcx "Talk to an RCX from a serial port on a Linux box"
Future
If/when I have time I hope to provide more detail .... such as describing the 22 byte direct command format for the CP290