The Tweeting Doorbell

If you’re anything like me (which you are probably thankfully not) you have a dream. A dream that you make all of your friends listen to you endlessly discussing in the pub. A dream that has long ago ceased being based in logic or sense, but is now just something you have to achieve if only to make up for never shutting up about it.

My dream, was to have my doorbell tweet me when someone rang it. Not much of a dream, I’ll admit, but still something I wanted. Before I got my iPhone I used BluePhone Elite with every phone I had (the iPhone doesn’t support the best bits, though). Aside from the main benefits such as texting and answering the phone from my mac, it also alerted me when my phone was ringing and who was calling. This was very unexpectedly useful – often my phone would be on silent and in the pocket of my jacket somewhere, and I would know firstly that it was ringing at all, and secondly whether or not it was worth answering. It solved a problem I didn’t realise I had.

I decided at this point, that everything in my house must be able to send me notifications. Preferably Growl notifications. If you don’t know what Growl is, follow that link and then come back. We’ll wait.

Recently I got a new front door put in. Part of the deal was a Yale “Electronic Door Viewer” which I got cheap since I get on well with the builder that fitted it. It consists of a small box, and a camera that looks like a regular spyhole – except it also has a doorbell button underneath. This little box and camera, both play doorbell chimes and display a picture of the person ringing the bell on a small (poor quality, but good enough) screen. What pleased me most though, was that the pictures are stored with a date/time stamp on an SD card inside the box, so that I can see who rang the bell at what time when I return home. There are a few issues with the setup… people seem to have difficulty locating the bell even with a sticker underneath it saying “this is the doorbell”, the LED lights that light up when the bell are rung blind people, very short people appear to be invisible and I never remember to check the box for pictures when I get home (much like when my phone answering machine became a phone-based service instead of hardware – with no blinking light, I don’t realise I have a message and forget to check). I can’t do much about some of these issues. People can’t find the bell – I might make another, bigger sticker. I will stick some kind of filter over the LED lights to save me from lawsuits. Short people will just have to remain invisible. But forgetting to check the box for new pictures, this seemed impossible to overcome.

Then I came across the Eye-Fi range of SD cards. These have an 802.11n wireless network adapter – built-in. I have no idea how they do that. But they do. The smallest was 4GB, which is excessive for my plans, but that was the smallest. I bought one from Amazon for £50 with free delivery.

Setting up the Eye-Fi card is really easy. It comes with a USB adapter and the software worked fine and was reasonably intuitive. Whenever the card has power and it can find one of the wifi networks you have setup on it with USB it automatically transfers any images (or videos) stored upon it to your mac/PC. I was worried that the doorbell wouldn’t keep power to the card for long enough to make the transfer, but the default setting of 20 seconds or so is apparently enough time to set up a network connection and copy the file across. You can set it up to automatically post them to Facebook or Flickr (or various other services), but that wasn’t what I wanted to achieve. To get the pictures to Twitter was going to take a few extra steps.

As a quick note, I am not 100% sure of the legal position of posting pictures of people on the Internet without their permission. Since it says “CCTV Recording In Operation” above the camera, and the people are outside in plain view, I am pretty sure I’m okay – but I wouldn’t want you to cite me as the person that gave you the go ahead to do this. So if you’re not sure, find out.

So, now the Eye-Fi was automatically putting pictures in a folder (I think ~/Pictures/EyeFi/). It was also adding date information to the folder structure, so in the Eye-Fi software settings I changed this to just stick them all in the root of the directory that was set. OS X has something built-in called “Folder Actions” which allows it to react to changes to a folder. Normally you just locate the folder, right-click it (or control-click for you really old school people) and choose “Folder Actions Setup…”. For some reason, that wasn’t working on my machine so I had to locate the app manually at /System/Library/CoreServices/Folder Actions Until you have a script written though, there’s not yet much you can do except use the provided scripts which are no good to me. So, I started writing the AppleScript. First I needed to be able to send direct messages. Using curl, this is pretty easy:

on dm(user, pwd, recipient, msg)
	do shell script ("curl -k -u " & user & ":" & pwd & " -d 'text=" & msg & "&user=" & recipient & "'")
end dm

Posting a picture online was a bit trickier. For the time being I have used TwitPic but this seems a bit open for my liking. I may revisit that in the future. So, I created another Twitter account (set to private) and made that and my normal account follow each other so they were able to send direct messages to each other. Then I created this script to post images to TwitPic:

on twitpic(filepath, user, pwd)
	set scriptpath to "curl -k -F media=@" & filepath & " -F username=" & user & " -F password=" & pwd & " -F message="
	set xmlValue to (do shell script scriptpath)
	--Parse the result for whether the upload was successful
	if xmlValue contains "<rsp stat="ok">" then
		tell application "System Events"
			set xmlData to make new XML data with data xmlValue
			set URI to value of (XML element "mediaurl" of XML element "rsp" of xmlData)
		end tell
		return URI
		display dialog "TWITPIC ERROR " & xmlResponse as string
	end if
end twitpic

It’s not the most bug resistant code in the world, but it will at least show an error message on the machine if it fails, saying (hopefully) why it failed.

Finally, I needed to hook these altogether. I added to my fast growing script:

on adding folder items to this_folder after receiving added_items
	set twitteruser to "twitteruser" --amend this to be the user name of your doorbell
	set twitterpwd to "password" --amend this to be the password of your doorbell
	repeat with itemadded in added_items
		set the item_path to quoted form of the POSIX path of itemadded
		set mediauri to postPicture(item_path, twitteruser, twitterpwd)
		sendDirectMessage(twitteruser, twitterpwd, "username", mediauri as string) --amend this to be the username you want to be alerted. Duplicate the line if you want to alert more users.
	end repeat
end adding folder items to

I saved this as eyefi.scpt in Macintosh HD/Library/Scripts/Folder Action Scripts/. Now I was ready to open up the Folder Actions Setup… again. I located the folder Eye-Fi was downloading into (uploading to? Whatever), right clicked it, and chose Folder Actions Setup…. I selected eyefi.scpt from the list, and made sure that the right folder was in the left-hand column, and that Enable Folder Actions was ticked. Finally, I pressed the doorbell (while ducking out of the way like a coward). Success! I received a direct message with this attached:


I also received an email about it, since it was a direct message and I have Twitter configured that way. I was living the dream! Perhaps a shallow, superficial, superfluous and ridiculous dream, but the dream nonetheless.

My next job is to make it send Growl notifications.

I hope you love this as much as I do, and if not, keep it to yourself. What do you think? How could I make this more epic? Let me know in the comments.

Update: I now have growl notifications working too! Read about that here.

16 thoughts on “The Tweeting Doorbell

  1. @Gavin Williams It’s not perverted! It’s pointing outside! :) The secret knock lock is amazing, but a bit huge and ugly. If you rewired it there would be nasty cables everywhere. And it would take you longer than an hour! You only have a soldering iron because Tom and I bought you one. :)

    Also, “perverse glory hole” sounds like you are talking about something *very* different.

  2. I think this simple API for twitter has been deprecated and you should now use an OAuth-based API, which is not as straightforward to code up with curl. It could probably be done, though, with custom headers.

    1. Yeah, I half expected that. It’s hardly critical though, so I’ll get Growl working first then address that in a future post. Thanks for the heads-up.

  3. FYI to simply create growl message, install growlnotify. Its a command line tool (packaged with Growl under Extras), so you can call it like you already do with curl.

    1. Perfect, thank you! Is it easy to send a notification to every machine on my network running growlnotify? Or do I have to pick them by IP/DNS?

  4. Want one. But when I had the same idea at a HTML5 talk about 1-2 months ago, I primarily wanted the doorbell to call me when someone rang it, with usual remote access intercom stuff.

    Tweeting and Growl with Photo is almost as good though – so, when are you going on Dragon’s Den for funding?

    1. I’ve been talking about this for years :) Hmm. You want it to call you so you can unlock it remotely? That is a bit out of the scope of this project!

      I’m never going on Dragon’s Den for funding. :) I don’t think it’s complicated or in demand enough. It’s fun though, and easy to do.

  5. awesome idea my friend…and well written too. i have been trawling the web for a solution by which my growl notifications would be sent as Text SMS to my phone (not iPhone) and stumbled on to your article. power to you my friend, looking forward to more shallow, superficial, superfluous and ridiculous dreams..

Leave a Reply to Antony Kennedy Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>