Building a 'Personal' Personal Assistant, Part I
2017-08-25This part is mostly backstory, how I got to the design and goals I have now.
So, a few years ago it struck me that I wanted to automate my home. I got a Nest thermostat, eventually decided to give X10 a shot, before settling on Insteon. For a while, HouseLinc, their proprietary Windows software, did the job. Then I tried Mayhem, an open source 'if-this-then-that'-type application from Microsoft which had an Insteon module. I looked high and low for other solutions, got rid of my Nest around the time Google bought them (switching to an Insteon thermostat), but still really lacked a piece of software that did what I wanted.
HouseLinc went largely unsupported and is now basically abandoned. It wouldn't handle doors or alarms, despite Insteon having modules for them, because it 'wasn't a security system'. A third party home automation software I looked at refused to support my Insteon Smoke Bridge because they didn't want to be responsible for any safety-related system. A lot of new home automation products and offerings were showing up by this point, but it was of that nasty IoT variety: Cloud-connected, wireless, and based on individual phone apps, rather than a central, intelligent controller.
Eventually I came across Jonathan Dale's excellent site on how to control Insteon devices with Visual Basic. Good old VB was the first language I learned, and despite having long since moved into a lot of PHP and learning C++ and C# in school, falling back into Visual Basic felt like going home. Learning the .NET version took a little more work, of course, but having learned more mature languages in the interim, it wasn't hard to pick up.
The biggest thing I realized early on was that the light switch was still my favorite way to enter a room. Controlling a device on command wasn't the key use here. I wanted to schedule things, and I wanted things to react to other things. And of course, being able to control my house remotely if I needed to was important. But not worrying about turning on a light in my room from my phone while sitting in my room changed my priorities a lot. UI became the least important thing.
So, long story shorter, I ended up with a command line-ish interface. Some commands looking like natural English, but some being quite utilitarian. But the key part about this transition is it put all my disaparate components into one very simple command interface: Text. It was easy for me to make a way to control from my phone by providing a way to let me phone send a text string to the app; I avoided building out a whole mobile app and UI entirely... for now. I could easily prototype new features by making a hidden text command to trigger them.
If my computers or devices didn't do something I wanted them to do... all I needed to do was make a command for them to do it... The ultimate personal assistant is one you write yourself.