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
Tweet

More Decks by Ates Goral

Other Decks in How-to & DIY

Transcript

  1. Doorbell Ringer
    An intentionally complex IoT project
    by Ates Goral

    View Slide

  2. @atesgoral
    http://magnetiq.com

    View Slide

  3. http://myplanet.com

    View Slide

  4. In the beginning there was...

    View Slide

  5. Onion Omega
    Invention Platform for IoT

    View Slide

  6. View Slide

  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

    View Slide

  8. View Slide

  9. No project ideas.

    View Slide

  10. Then there was...

    View Slide

  11. View Slide

  12. Heath Zenith DL-
    6505
    Wireless Battery-Operated
    Door Chime Kit

    View Slide

  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

    View Slide

  14. The aha! moment

    View Slide

  15. View Slide

  16. Earlier…

    View Slide

  17. View Slide

  18. View Slide

  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

    View Slide

  20. View Slide

  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

    View Slide

  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

    View Slide

  23. Then tried...

    View Slide

  24. PubNub
    Always-on communication
    layer

    View Slide

  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

    View Slide

  26. Then was recommended...

    View Slide

  27. Twitter

    View Slide

  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”

    View Slide

  29. Still, if this were to be real doorbell…
    ● Not convenient for visitors to tweet
    ● Don’t want my doorbell to ring at 3am

    View Slide

  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

    View Slide

  31. View Slide

  32. Another display?
    ● Bigger, faster OLED
    ● LED
    ● E-paper

    View Slide

  33. Then I remembered...

    View Slide

  34. HTC Magic
    2009

    View Slide

  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

    View Slide

  36. Hardware upgrade...

    View Slide

  37. View Slide

  38. View Slide

  39. View Slide

  40. View Slide

  41. Some DevOps overkill

    View Slide

  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

    View Slide

  43. BUT SRSLY, WHY?!?!1

    View Slide

  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

    View Slide

  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
    , plus more I’m probably forgetting to appreciate.

    View Slide

  46. Links, Q&A

    View Slide

  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

    View Slide