RESTful Home Automation
Here are the general steps to get a REST service going on your Raspberry Pi, using Python. One thing that I’ve learned from blogging over the last several years is that extremely detailed, granular how-tos tend to be the most yawned-at posts. So this is just a quick overview of how you can accomplish the goal without going into a lot of detail. If you want that detail, you can drill into the links I’m providing or else feel free to ask questions in comments or via email/twitter.
- Go out and buy these things: USB transceiver, plugin transceiver, lamp module (optional)
- On your Pi, install apache with sudo apt-get install apache2. This is the web server.
- Also on your Pi, install web2py with sudo apt-get install python-webpy. This is the module that makes setting up a REST service a snap.
- Install some driver dependencies (I will probably later roll these into what I’m doing) with “sudo apt-get install libusb-1.0 python-usb”. Here are more detailed instructions from the page of the home automation python driver that I’m using.
- Follow the instructions on that page for disabling interfering kernel drivers.
- Give your user space account permissions to hit the USB device from the referenced instruction page, but note a typo where he says “sudo nano /etc/udevrules.d/cm19a.rules” and you really want
“sudo nano /etc/udev/rules.d/cm19a.rules”. - Now go get my stuff from github and run a web server using python rest.py <port>
That’s all there is to it. Right now, at the time of writing, you would go to http://<your pi’s ip>:<port>/office/on to basically turn everything from A on. A and office are both hard-coded, but that’s going to change in the next few days as I grow this service to support adding rooms and lights via PUT, and storing them as JSON documents on the server. You’ll be able to add a light with PUT, supplying the room, light, and X10 code, and then you’ll subsequently be able to toggle it with http://pi:port/room/light/{on/off}
You can also just install Andrew’s driver and use it as-is. It even has a web mode that supports query parameters. The reason I didn’t do things that way is because (1) I wanted a REST service and (2) I wanted to be able to customize everything as I went while learning a new language.