So, a few weeks ago I got a PiFace for my Raspberry Pi.

The PiFace is a clip on extension board for the Raspberry Pi which, together with the free library software, makes it super easy to control various real-world inputs and outputs – turning things on and off, and sensing whether switches have been pressed.

Pretty cool, but unfortunately due to my work load, and an ever growing to-do list, I had so far not had the time to play with it at all. However, a recent sports injury forced me to stay at home for a few days, and since I couldn’t really move (or indeed, put on my own socks), I decided to use this as an opportunity to play.

My first bit of tinkering was to see if I could wire up and take advantage of the 8 software controllable outputs exposed by the PiFace. These outputs consist of 9 connectors, the first of which is a 5 volt power line, and the other 8 being the ends of an open collector.

The Circuit

I am not an electrical engineer, so this is all brand new ground for me, and that is enough of a reason for me to find it all terribly exciting. These first bits of hardware hacking giving me the same thrill of figuring something out and getting something to work as when I wrote my first software programs all those years ago!

Anyway, the circuit is a simple one, and consisted of a breadboard with 8 leds connected in parallel with the 5 volt power rail on one side and the open collector terminal on the other. The back of the packet my LEDs in also noted that a resistor of 330 ohm should be used in series with the led when connected to a 5 volt power supply in order to avoid burning them out.

Experiment1

The Software

As a proof of concept, I wrote a bit of software to cycle through and turn each light on for a second, before turning it off and turning the next one on. Nothing too fancy right now!

The Finished Article

So, here’s my first experiment in action…


Like I said, I’m not an electrical engineer so this is hardly the Starship Enterprise, but I learnt a lot!

This is just a quick note to readers of this website to give you advanced warning of some planned server maintenance.

Over the next few days I will be migrating all sites and services over to a new hosting facility. Unfortunately, the migration will necessitate short periods of downtime while I move things over and repoint DNS etc. We will do the utmost to minimise any disruption caused, but over the next week or so, you may notice that certain services that you use will become unavailable for short periods
of time.

If you have any questions please get in touch!

As I’ve blogged before, IFTTT.com (short for “If This Then That”) is a popular service which lets you trigger actions based on certain events that occur around the internet.

One of the most requested features, by programmers at least, is to add WebHooks support. Webhooks are a very simple way of pinging API information about the internet between web services. It uses JSON to send an arbitrary payload over HTTP via a POST request to a specified endpoint. This is about as simple as you can get, which is of course the beauty of it.

Support for Webhooks is an obvious extension to IFTTT, and would allow people to build on the service, connecting together more than just the hand picked menu of channels on the IFTTT dashboard. Quite why this is so slow coming is a mystery; some have speculated that it was a business decision on their part, others that it is hard to build a slick interface for something of such a highly technical nature, others that they simply haven’t gotten around to it just yet.

Free Software to the Rescue!

Until IFTTT implement a WebHooks channel, you can use the following workaround.

Abhay Rana, in a project over on GitHub, has built a some code which provides a WebHooks bridge for IFTTT and other services. I have extend to add some extra functionality you might find useful.

Currently, the IFTTT wordpress channel uses that software’s RPC endpoint to make posts, so the software works by providing a little bit of middleware, that you install on an internet facing machine, which pretends to be an installation of WordPress. You then point the wordpress IFTTT channel at this installation, passing it some special parameters.

You specify the final endpoint URL as a tag, and by default the contents of the post, title, and categories get JSON encoded and relayed to this endpoint.

My extensions

Different Webhook endpoints need different fields, however, so my extension lets you provide service specific plugins. These plugins can manipulate the data sent to the upstream endpoint further, providing different fields and encoding options. This lets you support multiple webhook endpoints from a single installation, and without having to set up multiple IFTTT accounts.

To use, create the appropriate plugin in your installation’s plugins directory containing your extension of the Plugin class, then pass a special category “plugin:NameOfClass“.

I have included an example class and a JSON payload class. The latter assumes that the post body is valid JSON, validates it, and then sends it to the upstream endpoint. This lets you send specially crafted messages to upstream webhook endpoints.

My extension also includes much more debug logging, as well as some extra validation code and graceful failures.

Why?

IFTTT is a fantastically useful service, but unfortunately you are limited to using the services they choose to (or have time to) write connectors for. I find this limiting, and at times frustrating, since as well as excluding some great existing services, it places limits on my ability to hack my own stuff together!

Previously, I’d often used twitter to glue things together. However, since Twitter are currently making concerted efforts to turn their service into just another ad serving platform, rather than the communication platform and messaging service it was growing into, it was necessary to come up with an alternative method.

WebHooks seem a better solution anyway.

Thanks again to Abhay Rana for the original code, and I hope people find my additions useful!

» Visit the project on Github…