Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Doorbell Ringer

Doorbell Ringer

An intentionally complex IoT project

Ates Goral

June 08, 2016

More Decks by Ates Goral

Other Decks in How-to & DIY


  1. Onion Omega Dimensions: 28.2mm x 42mm (1.1" x 1.7") CPU:

    Atheros AR9331 400MHZ MIPS 24K RAM: 64MB DDR2 400MHz Flash: 16MB WiFi: 802.11b/g/n 150Mbps Ethernet: 100Mbps GPIO: 18 USB: USB 2.0, Supports additional USB Hub Power: 3.3V Antenna: PCB Antenna w/ uFL Connector Power Consumption: 0.6W
  2. Wireless Doorbell “Piece of junk” —GeorgeC “Simply does NOT perform”

    —jtreader “Avoid this product” —Julian “Worthless Door bell” —decodenise “Worked one hot second after installed” —NotWorking “Over priced paper weight” — Straightline22
  3. Prototype Circuit • Using a single GPIO pin • Over

    an 4N35 optocoupler • Setting the GPIO pin output to HIGH “presses” the button • Button sends a RF signal to the doorbell to ring it
  4. But, if this were to be real doorbell… • Visitors

    cannot connect through USB and type commands • Would be silly to add a new button to tell Omega to tell the old button to ring the doorbell
  5. IoT to the rescue! • The natural path is to

    trigger the button via WiFi • But, the Omega is behind a NAT on my WiFi at home • Decided to run a client and not a server on the Omega
  6. But, couldn’t install the SDK • Had a plethora of

    options: Node.js, Python, Perl… • Tried Node.js and Python, ran into compilation issues and gave up
  7. Doorbell Ringer • Python script, running as a daemon via

    /etc/init.d • Uses Twitter API • Watches live user stream of @DoorbellRinger • Rings the bell when it sees “#ringit”
  8. Still, if this were to be real doorbell… • Not

    convenient for visitors to tweet • Don’t want my doorbell to ring at 3am
  9. Need a local trigger that is not a physical button

    • Thought about using QR codes • Visitor scans a QR code, is taken to a URL that tweets on behalf of the visitor • Already had an OLED display for my Omega • The same good friend recommended that I use TOTP for token generation -- what Google Authenticator uses
  10. Doorbell Nudger • Node.js server running on Heroku • Generating

    TOTP tokens every 30 seconds • Shows QR code image + token value + timer • QR code encodes a callback URL • Callback tweets as @DoorbellNudger • Curious hack to avoid adding an API: piggyback token value as a cookie in the image response
  11. Going the extra mile… • Vagrant box with OpenWRT image

    for local development • Travis CI runs Python tests, • Calls webhook on Heroku when tests pass, • Which in turn results in a tweet from @DoorbellNudger with #update • Which in turn prompts the Python service on Omega to self-update from GitHub
  12. Play! • Apply skills that you use for “serious” work

    to “silly” projects to hone your skills • Problem solving is fun, so invent new problems • You don’t need a serious/real project to start experimenting with new stuff - just do silly things • End-to-end, planned execution practice • Pleasure of getting multiple moving parts working together • Conversation starter (or ender) • Fun
  13. New things that I’ve learned/done about in this project Optocouplers,

    OpenWRT (ubus, opkg, uci), Twitter API, TOTP, QR codes, Python (virtualenv, unittest), Travis CI webhooks, /etc/init.d scripts, Onion relay expansion, using USB storage as rootfs, animating a countdown pie chart in <canvas>, plus more I’m probably forgetting to appreciate.
  14. Links • @atesgoral - http://magnetiq.com • @DoorbellRinger - https://github.com/atesgoral/doorbell- ringer

    • @DoorbellNudger - https://github.com/atesgoral/doorbell- nudger • @OnionIoT - https://onion.io/product/omega/ • GitHub - https://github.com/atesgoral/ • LinkedIn - https://www.linkedin.com/in/atesgoral