Linux Home
Automation
(Last updated: Saturday February 24, 2007)
Automation
(Last updated: Saturday February 24, 2007)
Insteon on Linux Feb. 22, 2006 This is a bunch of experimental code to try and utilize the Insteon USB PLC from Linux. The primary goal at this point is to be able to manipulate the device link tables progmaticlly and avoid having to run around the house setting up links. It would also be nice to have a backup of the links and an easy way to replace a failed device. The current version does this and more. How to build: Building the program is pretty simple. Typing 'make' should build the ilink executable. You can look at the Makefile to see what options are currently being used. There is also a utility program included, called detach, that will detach the PLC from the HID driver. This can be built by typing make detach. How to install: This program needs a USB driver in order to communicate with the PLC. It currently uses the USB driver created by Neil Cherry. You can get a copy of his driver from www.linuxha.com. A slightly modified version for later 2.6 kernels is included here. Steps to get the driver installed and working. 1. Compile the driver, type "make" in the iplc directory and it should create the driver. Note that you need kernel include files for this to work. 2. Create the device node needed by the driver, type "make node" and it should create the proper device node in /dev. You need to be root for this to work. 3. Detach the PLC from the HID driver. Do this by running the detach program created above. This is only needed if you are actually running the HID driver. You need to be root to do this. 4. Install the driver. Type "insmod ./iplc.ko" again, you need to be root to do this. You can check /var/log/messages to make sure the driver installed correctly. The device and scene definition file. ilink uses a simple text file to store information about the various INSTEON devices you have and the scenes you want to create. A sample file is included in the distribution. A scene can be something as simple as one switch controlling one lamp module or as complicated as one button on a KeypadLinc controlling every device you have. A scene is described from the controlling devices point of view. The attributes of a scene are: 1. A scene name. This can be anything you want it to be. 2. A master. This is the device that will be controlling the scene. 3. A group number. This is the group number that will be used to activate the scene 4. At least one responder. These are the devices you want controlled by the master. The number of responders is only limited by the amount of memory a device has to hold scenes. The responder line has space separated fields: <device id> <on level> <ramp rate> <group*> *KeypadLincs require the last field to match the button number, for all other devices this field is ignored. For links to work effectivly, you'll need to create scenes for every link group you want because Links will overwrite the link table in any device listed, master or responder. The only exception is PowerLinc V2 devices (device type 0000 or 0001) will not currently get updated. Copy the sample_scenes.inf file to ilink_scene.inf and edit it with your favorite text editor. About the code. First, remember this is experimental code. There is a lot of functionallity here but not everything is hooked up or controlled in an intuitive way. The GUI was created using GLADE and the glade files are included. The main code is in ilink.c. This file reads the GLADE xml file, hooks up the signal handlers, and creates all the GUI widgets. It has functions that manipulate some of the widgets, specificly it populates the combo boxes. ilink_signals.[ch] has all the GTK widget signal handlers. This is where a lot of the really high level code is. Every button press and menu item event is handled here. scenes.[ch] has the code and data structures for device and scene managment. Here you'll find the functions that read/write the scene file and functions that build the in-memory link tables prior to programming the devices. All of the PLC/remote device communication is handled in other files. These files are described below. insteon_msg.[ch] ================ These files contain functions for sending Insteon messages and receiving replies. A couple of helper functions are also in here. send_insteon_msg() - writes the message to the IBIOS area and flips a bit that tells IBIOS to send the message. salad_send_msg() - uses a SALad event to send the message. write_insteon_msg() - write the message into the PLC's memory but don't send it. send_extended_insteon_msg() - send extended messages (that doesn't work). send_insteon_ping() - ping a device and return the device identification information. idrv.[ch] ========= This is the low level communication interface to the PLC. Most of the important IBIOS commands are implemented (write memory, read memory, events, masks, reset, get_version). This also has the functions that communicate with the PLC USB driver. This handles all the timing and handshaking required by the PLC. This requires Neil Cherry's USB driver for the PLC. A version for later 2.6 kernels is included in the iplc directory. There are a couple of utility programs. detach.c This program uses libusb to detach the PLC from the Linux Kernel HID driver. This must be run as root and run prior to inserting the PLC USB device driver. An alternative is to add the PLC's vendor/product id's to the HID driver's blacklist so that it doesn't claim ownership of the device. (requires re-compiling the Linux kernel) link.c This is a command line version of the code. It can't do everything the GUI can and it can do somethings the GUI can't. It links with scenes, insteon_msg and idrv so all the high/mid/low level functions are shared with the GUI version.