Self Discovering IoT System

I’ve been working for a couple years now to automate my RV using a combination of Particle.io Photon micro-controllers, an iOS app, and an Alexa skill. This has been fairly easy to do, due mostly to the ease of using the Particle.io API. Over the next year, in addition to adding additional functionality and more Photons, I hope to add Apple TV and Watch apps. This got me to thinking about how to make the system easier to configure and extend.

Since I’ve written all the software pieces myself (iOS app, Alexa skill, Particle sketches), up until now I’ve taken the expedient route of just hard coding the names of each controller into both of the apps. With only a single iOS app and Alexa smart home skill, this meant updating those two programs every time I added a new Photon, or extended one of the existing Photons. Not a big deal, albeit somewhat inconvenient.

However, recently I created an additional iOS app to allow using older iPhones to be mounted to the wall and used as control panels. Hard coding the names of the controllers into the apps means that I have to manually update each device whenever there is a micro-controller change. Now this is becoming a much bigger inconvenience.

So I’m in the process of making each micro-controller self registering with the system:

  1. Each Photon will broadcast periodic “I’m alive” messages on the particle.io pub/sub network. This messages will include the Photon’s name. This name can be used to address it using the particle.io API.
  2. A designated ‘master controller’ Photon will monitor these messages, collect a list of all the names, and publish a comma separated list of names via a ‘controllers’ variable accessible via the particle.io API.
  3. Each application will read the ‘controllers’ variable get the names of all Photons, instead of having a hard coded list in its program.
  4. The master controller will also send out a ‘system updated’ event whenever it updates its list, so the apps know when to refresh their device list.
  5. Each Photon will similarly publish a list of each of the devices it implements in a ‘devices’ variable, exposed by the particle.io API. This list will include the name and type of device (light, fan, etc).
  6. All applications will read the list of controllers from the master controller, then access the list of devices from each of those controllers.

So now instead of needing to reprogram each app whenever I add a new controller, I just need to expose the data about that controller as described above, and all the applications pick it up as soon as it powers on and sends its “I’m Alive” message.

I’m in the process of posting all this code to Github, so keep an eye out there for updates.

Alexa Smart Home Skill

I’ve now replaced my previously created Alexa Custom Skill with an Alexa Smart Home Skill. I’ve been holding off doing this because of the difficulty of setting up an OAuth2 server. Recently I came across an article describing how to use Login With Amazon to do this though, and I have gotten that working now.

So now I don’t have to say the name of the custom skill when invoking Alexa. Using the custom skill, I would have to say something like “Alexa, tell My RV to turn on the computer”. Sheesh. Quite a mouthful. And easy to get wrong. But using an Alexa Smart Home skill, I now only need to say something like “Alexa, computer on”. This seems like a small change, but it has made a big difference.

I’m working on providing some instructions, and then I’ll post all this code to Github.

Friends that Think Differently are a Blessing

I consider it a real blessing to have friends that I know, like, and trust, that happen to also have very different opinions about things. I’m not talking about whether it feels warm or chilly outside. I’m talking about big, controversial items like what to do about immigration, the national debt, and who would make the best president. Unfortunately, there appears to be a strong trend within our country to demonize those that disagree with us. Really? Do we really want to live in a country where everyone agrees completely about everything? I suggest watching the movie “The Stepford Wives” for an idea of what that might look like.

I say “no thanks”. Let’s disagree.

But please, let’s not fall into the trap of thinking that anyone that disagrees is evil, stupid, or uninformed. As an engineer, I know that there are always multiple answers to any problem. Thinking that there can only be one solution is a sign of an inexperienced or immature engineer. The best engineering solutions always result from lively discussions of opposing or different opinions. The worst solutions happen when one person forces their solution on everyone else.

Using Old iPhones for IoT Control Panels

I’ve been thinking for awhile now about using my old iPhones in my IoT projects. They have touch displays, wifi, cameras, audio, accelerometers, and maybe GPS depending on how old they are. Plus they have almost no value once they get a few years old. The only real downside to using them is the fact that they’re a bit hard to program, but hey, that’s what I do for a living.

So this past weekend, I scrummaged through my old Apple parts boxes, and came up with (2) iPhone G, an iPhone GS, iPhone 4s, and iPhone 5.
Doing some research, I decided that the iPhone G is not really worth messing with for a couple reasons:

  1. The newest iOS support available is SDK4, so writing code to run on it would be difficult, and could not support the advanced features released over the past five years or so.
  2. The iPhone G does not have a rear facing camera. One of the features I want to eventually support is using the camera for a room monitor. But since the phone will be mounted to a wall, the normal front facing camera will be pointed into the wall.

That said, the support for iPhone 3GS is not bad, but it is limited.

  1. iOS 6 is supported
  2. Xcode 7.3.1 is supported, currently the latest Xcode.
  3. Swift is NOT supported. Swift requires iOS 7.
    Image of iPhone 3GS

    Using an iPhone 3GS for simple control panel

So just for fun, I created a version of the control panel in Objective-C for iOS 6 to run on the iPhone 3GS. This app simply displays images in a collection view, and calls the Particle.io API when one is pressed. I probably won’t add much more to this app, but instead develop a Swift version for use on the newer phones. I’ll add new features to that version, and leave the Objective-C version for just simple control operations.

New Photon Based IoT PCBs

New IoTv2 PCBs

I’ve updated the printed circuit boards for my IoT projects. These boards are 5×5 cm and intended to be used in a variety of IoT applications. They include the following features:

  • Switch from linear voltage regulator to buck regulator.
    • The linear regulators used on my previous boards were getting quite warm as a result of converting the RVs +12 volts to +5 or +3.3v. I found some inexpensive variable voltage bucking regulators for about $1 each. These are marked “D-Sun”, readily available on Amazon.com, and they work well.
  • Provide direct pin-outs to LED driver boards.IoTv2 PCB with LED drivers
    • I’ve provided 4 sets of PWM pins that can interface directly with the Sparkfun 12959 MOSFET LED driver boards. I’ve positioned the pins such that standard header pins can be used to attach the boards instead of wires. I’ve gone back and forth about integrating the functionality directly, and finally concluded that the space used by the MOSFET and screw terminals was better pushed off onto small extension boards. Up to four of these can then be optionally added as needed. Sparkfun sells these for $4 each, so it’s sort of a no brainer. Putting them onboard would force me to moving to a larger 10×5 cm board, and only save a couple bucks.
  • Both 3.3v and 5v supplied
    • I’m using a 5v regulator to provide power to the Photon. It then has a 3.3v regulator for itself, and can provide 3.3v @ 100 mA to other sensors, etc. Since most of the Photons pins are 5v tolerant, this enables using both 3.3v and 5v sensors.
  • Provide groups of pins for ease of connecting other devices
    • To simplify adding additional sensors such as DHT11 temperature sensors, I’ve provided groups of pads that provide a GPIO, power, and ground. Some are 5v, and some are 3.3v. I was careful to ensure that the GPIOs provided with the 5v power groups are in fact 5v tolerant. These are great for things like PIR motion sensors, various switches, and so forth.

So after checking that the first batch of 10 boards work as intended, I’ve ordered another 10 and am in the process of replacing most of my existing controllers with these. While the Photon costs substantially more than the previous Arduino Pro Mini and RF24 radios, the ease of programming over the air combined with their robust design (5v tolerant pins, super stable operation) and included Particle.io support make these worth it!

I’m currently using my Echo and Dot to control these, but recently got AVS running on my Raspberry Pi and may throw that into the mix also.

If anyone is interested in using these boards in your own projects, post your request in the comments and I’ll provide links to the Eagle files so you can have boards made yourself. If you don’t mind waiting about 6 weeks, you can order these from itead.cc for $13 total for 10 boards. If you’re in a hurry, DHL shipping increases the total cost to about $26 total for 10 boards that arrive in less than 2 weeks. I ship with DHL for the first batch, then use the cheaper shipping to get more while I work with the first batch.

Note: I’ve now posted the Eagle files on Github.

Particle.io based IoT

Switch and PCBAt this point I’ve installed about a dozen Arduino Pro Mini based controllers in my RV. These are very inexpensive, about $2 each, but suffer from several limitations:

  1. Fairly slow
    • This is ok if all you need is something to read a switch and set a corresponding set of outputs, but becomes an issue as requirements grow.
  2. Require a direct FTDI cable connection to program or update
    • Arduino Pro Mini mounted to switchIn my usage case, I’m mounting these things above ceilings to control lights, and behind wall switches to read and broadcast switch state. This means every time I need to change or debug them, I have to open up the wall, which means removing the switch plate and switch or lamp fixture to get to them.
  3. Require direct physical access to resetSwitch plate removed and hanging from wall
    • Sometimes they just hang, or their associated circuitry hangs up, and it is necessary to “hard reset” them. They have a push button reset on them, but as mentioned above it isn’t easy to access them in my situation.

So for awhile now I’ve been contemplating converting my Arduino Pro Mini based designs to use the Particle.io Photon MCU instead. These parts are awesome:

  • Fast 32 bit CPU
  • Lots of memory
  • Built-in WiFi and antenna

This last item is the biggie. I can update them remotely, meaning that I can leave the boards buried in a wall somewhere and still reprogram or reset them.

The thing that has made me reluctant to do so up until now has been the price. These parts are $19 each. That may not sound like much, but I plan on using a lot of controllers in my RV, probably on the order of 30 to 40. But then I stopped and did the math: 30 Photons at $19 each comes out to $570.

What? I’ve been using one Photon to bridge between the Pro Minis and the internet to allow Alexa to control them. Now I’m going to have each directly accessible, simplifying the overall design. So I’ve designed and built another PCB for the Photon.

Photon PCB

So far things are working great. I’ve redesigned the architecture to use a publish/subscribe model, which will allow the system to be expanded without having to reprogram existing units. And I’ve converted my Alexa code so my Echo talks directly to the boards using particle.io publish instead of functions calls. But that’s a topic for another post.

Alexa Controlled Motorized Drawer

Now that I’ve integrated Alexa into my custom Arduino based RV control system, I’ve been looking for unusual ways to leverage motors. An opportunity recently presented itself. I use a Varidesk standing desk at work, and I really like it. So I’ve been thinking about how to setup a standing desk in my RV.

My computer is currently setup on a booth table that converts to a bed. So my initial thought was to replace the solid pedestal with some sort of motorized post. This would be great, but I was unable to find any motorized pedestals that can raise and lower far enough. Too bad, because having Alexa “make the bed” would be pretty cool.

Hand drawn design for piano cabinet

Piano cabinet sketch

So upon further thought, I decided to build a stand-up desk area on the wall near the booth where I have my piano setup. Measuring the height of the stand-up desk that I use at work, I realized that I could build a shelf above the piano, and make a drawer for the piano to slide out from under it when I’m playing piano.

PianoCabinet1 PianoCabinet2

So work is underway on the cabinet.

And then it occurred to me. If this isn’t an opportunity for gratuitous use of Alexa controlled motors, then I don’t know what is! So my plan at this point is to use some very low cost stepper motors to slide the piano drawer in or out using voice commands. Can you say “Alexa, ask My RV to hand me that piano”.

Alexa does comedy

I’ve been playing recently with programming Amazon Echo’s Alexa to perform comedy. As a first proof-of-concept, I programmed it to do the Abbott and Costello “Who’s on first?” routine. This routine is very long: about 8 minutes with each performer saying about 87 lines. I was wondering whether Alexa’s speech engine could handle that many lines, and whether or not the programming could handle all the repeated lines; the sentence “Who” is said about a dozen times.

Well, the results were pretty good, and I’ve published the skill. It’s called “Who’s On First? Baseball Skit”. And if you have two Alexa devices, for example an Echo and a Dot, then you can have them perform both parts together.

Here’s an early video I made.

Texas Pinball Festival

Texas Pinball Festival posterWe’re heading up to Dallas this weekend for the Texas Pinball Festival. Last year was our first time attending, and we’re excited about going again this year. This time I’ll be competing in the pinball tournament. I’ve always considered myself pretty good at playing pinball, but I believe I’m going to get a lesson in humility this weekend 🙂

We had made plans to haul the RV up to Dallas for the weekend, but the Army Corps of Engineers RV park where we had reservations had some flooding and had to close for awhile. It was too late to find any other parks with room for a 40′ RV, but we were blessed to be able to stay with a friend instead.

We’re really looking forward to the weekend and many hours of visiting with friends and playing pinball.

MyRvApp

MyRvApp is an iPhone app that I’ve been working on to control my Arduino-equipped RV. The concept is pretty simple:

  • Display the floor plan of the RV
  • Controllable lights have circles overlaid to show their location
  • Tapping on a circle turns the light on or off
  • The color or alpha of the circle changes to reflect on/off state

Lights are controlled by Arduinos. These in turn communicate with each other over a simple RF24 radio network. One of the Arduinos is also connected to WiFi and Particle.io and serves as a bridge for all of the Arduinos.

Initially, lights will be hardcoded into the app. Going forward though, I’ll want the Arduinos to self publish information about their location and capabilities. This differs from HomeKit in that units are configured within each’s Arduino code. I’m doing this because I want to distribute the intelligence of the system across all of the units, instead of locating it all within a single point of control. I believe that this will result in a more robust, and eventually more intelligent system.

I’ll be creating a Github repo for this code and will be posting links here.