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 full-size slide

  2. @atesgoral
    http://magnetiq.com

    View full-size slide

  3. http://myplanet.com

    View full-size slide

  4. In the beginning there was...

    View full-size slide

  5. Onion Omega
    Invention Platform for IoT

    View full-size slide

  6. 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 full-size slide

  7. No project ideas.

    View full-size slide

  8. Then there was...

    View full-size slide

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

    View full-size slide

  10. 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 full-size slide

  11. The aha! moment

    View full-size slide

  12. 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 full-size slide

  13. 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 full-size slide

  14. 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 full-size slide

  15. Then tried...

    View full-size slide

  16. PubNub
    Always-on communication
    layer

    View full-size slide

  17. 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 full-size slide

  18. Then was recommended...

    View full-size slide

  19. 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 full-size slide

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

    View full-size slide

  21. 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 full-size slide

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

    View full-size slide

  23. Then I remembered...

    View full-size slide

  24. HTC Magic
    2009

    View full-size slide

  25. 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 full-size slide

  26. Hardware upgrade...

    View full-size slide

  27. Some DevOps overkill

    View full-size slide

  28. 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 full-size slide

  29. BUT SRSLY, WHY?!?!1

    View full-size slide

  30. 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 full-size slide

  31. 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 full-size slide

  32. 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 full-size slide