Installation Notes for X-10 software Eugene W. Stark (stark@cs.sunysb.edu) October 30, 1993 The TW523 is a carrier-current modem for home control/automation purposes. It is made by: X-10 Inc. 185A LeGrand Ave. Northvale, NJ 07647 USA (201) 784-9700 or 1-800-526-0027 X-10 Home Controls Inc. 1200 Aerowood Drive, Unit 20 Mississauga, Ontario (416) 624-4446 or 1-800-387-3346 The TW523 is designed for communications using the X-10 protocol, which is compatible with a number of home control systems, including Radio Shack "Plug 'n Power(tm)" and Stanley "Lightmaker(tm)." I bought my TW523 from: Home Control Concepts 9353-C Activity Road San Diego, CA 92126 (619) 693-8887 They supplied me with the TW523 (which has an RJ-11 four-wire modular telephone connector), a modular cable, an RJ-11 to DB-25 connector with internal wiring, documentation from X-10 on the TW523 (very good), an instruction manual by Home Control Concepts (not very informative), and a floppy disk containing binary object code of some demonstration/test programs and of a C function library suitable for controlling the TW523 by an IBM PC under MS-DOS (not useful to me other than to verify that the unit worked). I suggest saving money and buying the bare TW523 rather than the TW523 development kit (what I bought), because if you are running 386BSD you don't really care about the DOS binaries. For details on the X-10 protocol itself, refer to the documentation from X-10 Inc. The interface to the TW-523 consists of four wires on the RJ-11 connector, which are jumpered to somewhat more wires on the DB-25 connector, which in turn is intended to plug into the PC parallel printer port. I dismantled the DB-25 connector to find out what they had done: Signal RJ-11 pin DB-25 pin(s) Parallel Port Transmit TX 4 (Y) 2, 4, 6, 8 Data out Receive RX 3 (G) 10, 14 -ACK, -AutoFeed Common 2 (R) 25 Common Zero crossing 1 (B) 17 -Select Input I use the TW-523 and this software in the USA with 120V/60Hz power. Phil Sampson (vk2jnt@gw.vk2jnt.ampr.org OR sampson@gidday.enet.dec.com) in Australia has reported success in using a TW-7223 (a local version of the TW-523) and Tandy modules with this software under 240V/50Hz power. For reasons explained in the comments in the driver, it will probably not work if you have three-phase power, but this is usually not the case for normal residences and offices. 1. Installing the TW523 Device Driver I assume that you are running FreeBSD. If you are running some other system, you are more or less on your own, though I can try to help if you have problems. Check the configuration parameters at the beginning of the file /sys/i386/isa/tw.c Probably the only thing you might need to change is to change the definition of HALFCYCLE from 8333 to 10000 if you are using 50Hz power. The driver assumes that the TW523 device is connected to a parallel port. See the comments near the beginning of the file to find out where to get a TW523 if you don't have one, and how to make a cable for it to connect to your parallel port. Add a line like the following device tw0 at isa? port 0x278 tty irq 5 vector twintr to /sys/i386/conf/YOURSYSTEM, but make sure to change the I/O port and interrupt to match your hardware configuration. Cd to /sys/i386/conf and do "config YOURSYSTEM". Cd to /sys/compile/YOURSYSTEM and do "make depend", then "make". (If you have any troubles, I suggest starting fresh by doing a full "make clean; make depend; make".) Assuming the make works correctly, do mv /386bsd /386bsd.old mv 386bsd /386bsd (If you are not a trusting person, or you don't have any spare fixit floppies with working kernels lying around, don't do this without testing the kernel first by copying it to a fixit floppy and booting from that.) Reboot the system. You should see a line indicating that the TW523 has been configured as the system comes up. If you see this line, then probably everything is going to work OK, because the TW523 will only get configured if the driver is able to sync to the power line. If the TW523 is not plugged in, or the driver is not getting sync for some reason, then you won't see any message on bootup. NOTE: I have received a report that some multi IDE/SIO/PARALLEL cards "cheat" and use TTL outputs rather than pullup open collector outputs, and this can mess up the scheme by which sync gets to the driver. If you are having trouble getting the driver to work, you might want to look into this possibility. In directory /dev, execute the command MAKEDEV tw0 2. Installing the X-10 Daemon Go to the xten source directory (probably /usr/src/contrib/xten). Check over the file "paths.h", if desired, to make sure that the entries are reasonable for your system. On my system, I have a special UID "xten" for the daemon. If you want to do this, too, you will have to add this UID to your /etc/master.passwd in the usual way. Otherwise, use "root" or "daemon" or something. You should change the ownership of /dev/tw0 to match this UID, so that the daemon will be able to access the TW-523. Edit the file Makefile.inc in the source directory to specify this UID: xtenuser= xten Then run "make". If everything is OK, run make install This should install the daemon "xtend" and the command "xten". Make sure the directory /var/spool/xten exists and is owned by the UID you selected above. This directory is used by the daemon for its log and device status files. When it is run, the daemon will also create a socket /var/run/tw523 and it will put its pid in /var/run/xtend.pid so that it can be signalled from shell scripts. Add the following lines to your /etc/rc.local file: if [ -x /usr/libexec/xtend ]; then echo -n ' xtend'; /usr/libexec/xtend fi This will cause the X-10 daemon to be invoked automatically when you boot the system. To test the installation, you can either reboot now, or you can just run "xtend" by hand. The daemon should start up, and it should create files in /var/spool/xten. Check the file /var/spool/xten/Log to make sure that the daemon started up without any errors. Now you are ready to start trying X-10 commands. Try doing xten A 1 Off xten A 1 On 1 Dim:10 etc. The "xten" program expects a house code as its first argument, then a series of key codes, which are either unit names ("1" through "16") or else are command names. You can find the list of command names by looking at the table in the file "xten.c". Each key code can optionally be followed by a colon : then a number specifying the number of times that command is to be transmitted without gaps between packets. The default is 2, and this is the normal case, but some commands like Bright and Dim are designed to be transmitted with counts other than 2. See the X-10 documentation for more detail. The "xten" program works by connecting to "xtend" through a socket, and asking that the X-10 codes be transmitted over the TW523. All activity on the TW523 is logged by the daemon in /var/spool/xten/Log. The daemon also attempts to track the state of all devices. (Of course, most X-10 devices do not transmit when they are operated manually, so if somebody operates a device manually there is no way the X-10 daemon will know about it.) 3. Low-level Programming of the TW523 Driver Normally, you would never operate the TW523 directly, rather you would use the shell command "xten" or you would connect to "xtend" through its socket. However, if you don't want to run "xtend", you can manipulate the TW523 directly through the device /dev/tw0. Have a look at the xtend code for a programming example. The driver supports read(), write(), and select() system calls. The driver allows multiple processes to read and write simultaneously, but there is probably not much sense in having more than one reader or more than one writer at a time, and in fact there may currently be a race condition in the driver if two processes try to transmit simultaneously (due to unsynchronized access to the sc_pkt structure in tw_sc). Transmission is done by calling write() to send three byte packets of data. The first byte contains a four bit house code (0=A to 15=P). The second byte contains five bit unit/key code (0=unit 1 to 15=unit 16, 16=All Units Off to 31 = Status Request). The third byte specifies the number of times the packet is to be transmitted without any gaps between successive transmissions. Normally this is 2, as per the X-10 documentation, but sometimes (e.g. for bright and dim codes) it can be another value. Each call to write can specify an arbitrary number of data bytes, but at most one packet will actually be processed in any call. Any incomplete packet is buffered until a subsequent call to write() provides data to complete it. Successive calls to write() leave a three-cycle gap between transmissions, per the X-10 documentation. The driver transmits each bit only once per half cycle, not three times as the X-10 documentation states, because the TW523 only provides sync on each power line zero crossing. So, the driver will probably not work properly if you have three-phase service. Most residences use a two-wire system, for which the driver does work. Reception is done using read(). The driver produces a series of three character packets. In each packet, the first character consists of flags, the second character is a four bit house code (0-15), and the third character is a five bit key/function code (0-31). The flags are the following: #define TW_RCV_LOCAL 1 /* The packet arrived during a local transmission */ #define TW_RCV_ERROR 2 /* An invalid/corrupted packet was received */ The select() system call can be used in the usual way to determine if there is data ready for reading. Happy Controlling! Gene Stark stark@cs.sunysb.edu