Vigilo - the Dorm Room Watcher
May 14 2018
If you’ve ever shared a room with a roommate, you’ve probably said this a thousand times: I wonder if [insert name here] is in the room right now. Well, at least I know I did. Whether it’s to take a nap, change clothes, or just run in and grab a book, entering a shared room can quickly become an ordeal especially when your roommate has a girlfriend. To make it all much simpler, I came up with Vigilo.
The idea for the interface was simple and immediate: a yes or no. Is the roommate in the room? The only thing I needed was a way to test it. I remembered someone telling me about a system they had in their house that would play a ding anytime someone connected their phone to the WiFi. Of course, it’s not a bullet-proof security system (just shut off your WiFi and you’re invisible), but that’s not the point. It’s just supposed to be a convenient way to know.
My initial look into the campus WiFi made it clear. WiFi was not an option. I thought about tracking the radio signals or something like that, but then it hit me: what’s exactly like WiFi but way less regulated by the campus? Bluetooth.
I did some searching around and found
this. It’s the perfect
answer. All you have to do is link the phone to a computer and then you can
hcitool to scan around and initiate a “handshake” with known devices.
It doesn’t cost too much battery and doesn’t disrupt the phone. In fact, I
didn’t notice any mal-effects in an entire semester of use. I had a raspberry
pi laying around, so I decided to give it a shot.
I wanted to create a simple web interface. Open the web app anywhere and you get a list of who’s in the room. I fired up a new Phoenix project and threw it in.
It took a while and the requests kept timing out.
hcitool can be really
slow. I took what I had and added a GenServer to keep track thanks to
Jose Valim’s answer. The
trade-off is small. Instead of having a very functional web app, as Elixir
projects usually are, I have a state-based app that keeps track of what
it last saw. On a regular interval, it’ll scan for devices and then remember
what it saw. Then when a user queries the website, it will respond with what’s
in the memory. And if you scan often enough, it pretty much answers the
question “who’s in the room?”
So I set it up for a while. It worked okay, but it was hard to reach the raspberry pi’s IP. I couldn’t reach it across campus and I was pretty sure I knew why. The IP addresses worked great when two computers were right next to each other. The problem was being on different routers. So at was the solution? A public website.
Right on this very website, for over two months, I posted the JSON from
Vigilo and put it on an unlinked page:
/vigilo. Then all I had to do was
pull it up on my phone and anywhere and everywhere I could see who was in
(N.B.: now that page is gone because I no longer share a room.)
On Your Own
Want to build this yourself? It’s not too hard. Go to the Vigilo GitHub and clone it and follow the instructions there. Then you can make a small edit to your server. All you need is a JSON POST API to get the names. To see what I did for my phoenix server, check out this commit where I disabled it. And the controller that accepts the JSON and servers the pages.