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

ParisJS Nov. 2017 - - Coffee.js - How I hacked my coffee machine using JavaScript

ParisJS Nov. 2017 - - Coffee.js - How I hacked my coffee machine using JavaScript

Talk given at ParisJS Meetup in November 2017 about how I hacked my coffee machine using JavaScript. More information at http://bit.ly/coffee-js

Dominik Kundel

November 29, 2017
Tweet

More Decks by Dominik Kundel

Other Decks in Programming

Transcript

  1. ☕.js
    How I hacked my Coffee Machine
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  2. HI!
    ! I'm Dominik! !
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  3. About me
    Developer Evangelist at
    Get in touch with me!
    ! @dkundel
    " [email protected]
    # github/dkundel
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  4. How I hacked my ☕ Machine
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  5. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  6. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  7. Why?
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  8. 1. It's interes,ng
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  9. 2. "Alexa, make me a coffee"
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  10. 3. APIs for everything!
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  11. Why JS?
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  12. Why JS?
    1. The last +me I wrote C++ was in university
    2. I know JavaScript well which makes coding faster
    3. Wri+ng a web server is easy
    4. It's more challenging
    5. Hardware === eventDriven && JS === eventDriven
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  13. Op#ons?
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  14. Op#on 1: Espruino
    www.espruino.com
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  15. Op#on 1: Espruino
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  16. Op#on 2: Tessel
    tessel.io
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  17. Op#on 2: Tessel
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  18. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  19. Op#on 3: Johnny-Five
    johnny-five.io
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  20. Op#on 3: Johnny-Five
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  21. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  22. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  23. How?
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  24. Disclaimer
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  25. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  26. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  27. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  28. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  29. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  30. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  31. What We Knew
    • 8 cables/pins
    • 6 switches
    • 7 LEDs
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  32. Assump&ons
    1. One cable is ⚡
    2. We need at least 3 pins + power
    controlling the "
    3. We need at least 3 pins + power
    controlling the #
    4. What is the 8th cable for?
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  33. The Naive Approach
    const five = require('johnny-five');
    const Tessel = require('tessel-io');
    const board = new five.Board({
    io: new Tessel()
    });
    board.on('ready', () => {
    const p1 = new five.Pin({
    pin: 'b0',
    mode: 2
    });
    // ...
    const p8 = new five.Pin({
    pin: 'b7',
    mode: 2
    });
    const pins = [p1, /* ... */, p8];
    board.repl.inject({ pins: pins });
    });
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  34. The Naive Approach II
    const five = require('johnny-five');
    const Tessel = require('tessel-io');
    const board = new five.Board({
    io: new Tessel()
    });
    board.on('ready', () => {
    const p2 = new five.Pin({
    pin: 'b1' /*,
    mode: 2 */
    });
    // ...
    const p8 = new five.Pin({
    pin: 'b7' /*,
    mode: 2 */
    });
    const pins = [p2, /* ... */, p8];
    board.repl.inject({ pins: pins });
    });
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  35. Bu#ons? How About Bu#ons!
    board.on('ready', () => {
    // PIN declaration ...
    const b2 = new five.Button('b1');
    const b3 = new five.Button('b2');
    const b7 = new five.Button('b6');
    const b8 = new five.Button('b7');
    const buttons = [b2, b3, b7, b8];
    buttons.forEach(btn => {
    btn.on('press', () => console.log('Pressed button no.%d', btn.pin));
    btn.on('release', () => console.log('Released button no.%d', btn.pin));
    });
    });
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  36. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  37. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  38. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  39. We Are On To Something !
    • Pin 1 is ⚡ (turns on LED4, LED5, LED7)
    • Pin 4-6 can turn off " LED4, " LED5,
    " LED7
    • Pin 7-8 react on #
    • Pin 2 can manipulate # S3 && # S4
    • Pin 3 can manipulate # S1 && # S2
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  40. Back To The Drawing Board
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  41. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  42. To The Rescue!
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  43. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  44. View Slide

  45. ! Progress! !
    Pin 1-3 === ⚡
    Pin 4-6 === !
    Pin 7-8 === !???
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  46. Diodes!
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  47. View Slide

  48. It All Makes Sense!
    ! S1 = P3 ➡ P7
    ! S2 = P3 ➡ P8
    ! S3 = P2 ➡ P7
    ! S4 = P2 ➡ P8
    ! S5 = P1 ➡ P7
    ! S6 = P1 ➡ P8
    " LED7 (Power) = P1 ➡ P6
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  49. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  50. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  51. const espresso = new five.Relay({
    pin: 'a4',
    type: 'NO'
    });
    const grande = new five.Relay({
    pin: 'a5',
    type: 'NO'
    });
    const power = new five.Relay({
    pin: 'a6',
    type: 'NO'
    });
    espresso.close();
    grande.close();
    power.close();
    board.repl.inject({ espresso, grande, power });
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  52. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  53. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  54. IoT Coffee Machine?
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  55. 418 - I'm a teapot
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  56. IETF RFC 2324
    HTCPCP
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  57. Hyper Text Coffee Pot Control Protocol
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  58. Hyper Text Coffee Pot Control Protocol
    • Built on top of HTTP
    • Adds BREW method
    • Safe and Accept-Additions Headers
    • HTTP code 418
    • coffee: // URI scheme
    • many more things
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  59. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  60. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  61. ! It's Alive!! !
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  62. !
    Show me Code!
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  63. !
    github.com/dkundel/htcpcp-delonghi
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  64. What I learned:
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  65. !
    Reverse-engineering is a lot of fun
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  66. !
    Reverse-engineering is frustra/ng
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  67. JS ❤ Hardware
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  68. !
    Tessel 2 is great!
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  69. !
    Johnny-Five is super useful!
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  70. What's Next? !
    • Programma(cally determine state
    • Add more relays
    • Sugges(ons???
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  71. !
    bit.ly/coffee-js
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  72. !
    bit.ly/parisjs-coffee
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  73. Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide

  74. Any Ques)ons?
    Get in touch with me!
    ! Dominik Kundel
    " @dkundel
    # [email protected]
    $ github/dkundel
    Dominik Kundel | @dkundel | #coffeejs #htcpcp #parisjs

    View Slide