Doorbell Ringer

Doorbell Ringer

An intentionally complex IoT project

C7f65a2f291636c0bd19920b2b6d525b?s=128

Ates Goral

June 08, 2016
Tweet

Transcript

  1. 6.
  2. 7.

    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
  3. 8.
  4. 11.
  5. 13.

    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
  6. 15.
  7. 17.
  8. 18.
  9. 19.

    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
  10. 20.
  11. 21.

    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
  12. 22.

    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
  13. 25.

    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
  14. 27.
  15. 28.

    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”
  16. 29.

    Still, if this were to be real doorbell… • Not

    convenient for visitors to tweet • Don’t want my doorbell to ring at 3am
  17. 30.

    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
  18. 31.
  19. 35.

    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
  20. 37.
  21. 38.
  22. 39.
  23. 40.
  24. 42.

    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
  25. 44.

    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
  26. 45.

    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.
  27. 47.

    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