X10 is a very cheap way to go, but it's not a very good system. The $20 switches you get are pretty low quality. More importantly though, the X10 protocol is pretty bad. It was designed in the 70's, and is very low bandwidth (I can't find a bps rating, but it takes about 3/4 of a second to send one command). If you don't use scene-capable switches (like Smarthome makes) you will notice a delay when activating different scenes.
I have a large Smarthome X10 installation at my parent's cottage/future home. The hardware is nice, but it suffers from reliability problems (eg, Sometimes when you hit a button, not all the lights activate; sometimes noise caused by power spikes/outages causes all lights to turn on, even though I have whole-house surge protection). I wired the place specifically to support X10, and have signal boosting/bridging in place (which helps), but honestly, I wouldn't do X10 ever again.
Programming the X10 devices is a pain: you have to send arcane commands to set up scenes.
At my house, I have a couple Smarthome Insteon switches in my basement for my home theatre. Again, I really like the hardware, and in fact it's even nicer than the Smarthome X10 stuff.
With insteon, they tried to simplify programming. What they ended up doing is making the very basic options (linking a single light to a button) a bit easier -- you just have to hold one for a few seconds till it blinks, then hold the other, and they're linked -- while at the same time making anything mildly more complex incredibly difficult. There are dumb limitations, like it's not possible to have a scene where one light goes to 0% and others turn on/dim to 10% (think "movie time" scene).
I purchased a computer interface for it, which is really the only way to do anything beyond the simple button-press-linking, and the best software I found to program it was Insteon Explorer. I wasn't willing to spend $150 for the Smarthome software to program 3 devices, so I can't say if it's better or not. Every time one device controls another, there are two links - one on each side. This means if you ever replace a device, not only do you have to reprogram the new device, but you also have to reprogram everything it controlled or was controlled by. This would be a HUGE pain with a keypad (8 buttons + integrated dimmer).
One thing that was relatively easy is integrating to PC. I was not able to actually activate "scenes" (this again, was easy with X10, but is now apparently not possible with Insteon), so I have to go device-by-device. Since I only have two main lighting circuits, it's not a huge deal. I use a Smarthome PLM and plmtools, and then small shell scripts that invoke plmtools for my various scenes. I can invoke the shell scripts in several ways:
* Using LIRC, from my Harmony remote. While watching Tv/movies, I have buttons that say "Bright", "Movie", etc.
* Using the XML interface on my Aastra IP phone. I have buttons programmed with scene names
* Using a small web site (running on a local server) I wrote using jQtouch, as well as a bookmark on my iPod touch, I can change scenes using my iPod. (also works on all smartphones/tablets).
I haven't tried the actual hardware yet, but the Simply Automated UBP stuff looks very appealing. They have the concept of a "base" switch, plus a faceplate - and there are face plates with various combinations of rockers/buttons.
The software looks amazing. You can basically set the entire system up completely offline, and then dump the programming to all devices. If I remember properly, switching a device was as easy as changing the address in the setup, then dumping programming again.
The individual options for what you could program was amazing: you could set up different physical buttons to be toggle, push buttons, rockers, single-button dimmers (hold to go up/down), one, two, or three-click buttons (different commands for each). You could then set commands to turn off, on, dim, activate a scene, etc. I think there were even timer buttons ("press the button, then 5 seconds later, turn off scene B").
I am considering a remodel of my kitchen, which would include some new lighting. I'm almost certain right now that I'll be using these switches to control the different lights (main, under cabinet, etc) from different entrances.
For lighting, I would go with one of the existing protocols/companies as mentioned above (there are many others as well, such as Zwave). You get a switch that is the dimmer circuitry, network interface, and human interface. You just won't be able to make something that quality yourself.
Using one of the existing home automation controllers is also not bad - it's like using a domain specific programming language. The common things to do in an automation system are timers, schedules, responding to events (motion sensor activated = turn on lights for x minutes, if it's currently dark outside but not past 12am). The commercial controllers let you set this up pretty easily. If you're doing it all yourself, you are more prone to bugs simply because you have to do more of the mundane stuff yourself, and you have more code.
I think there is a place for things like an Arduino though, for very specific, localized tasks, and have it integrate into the rest of your system if needed.
I'm of the mind I'd like to develop the UI for this myself (the existing systems are very expensive, and/or are not flexible enough so for example, I couldn't do the integration onto my Aastra phone with any off-the-shelf automation system), which means I need a way to control everything from a PC basically using the command-line (or some API). From there, I'd mix and match. Eg:
* SimplyAutomated stuff for all my lighting control,
* a standalone DSC alarm system that has a couple I/O interconnects to tell my computer its status, and let me arm/disarm
* An ardino programmed to run my pool filter and lights based on a motion sensor to detect how much the pool has been used.
I can then have a web UI that I can access on a PC, wall-mount touch screen, or iPod/Pad/blackberry that interfaces to all this stuff.
I know my first inclination as a programmer is to have one master controller that runs everything, but from an industrial control perspective, this is actually opposite of what you want. Decentralized, specialized systems are more reliable, and you're less likely that a single failure is going to be catastrophic (eg, my ardino pool controller could blow up, and my lighting and security will continue to be just fine). The centralized bit brings the systems together and provides oversight/interaction.