Pro Yearly is on sale from $80 to $50! »

Monsters, brievenbussen en andere onzin @ DomoticaGrunn

Monsters, brievenbussen en andere onzin @ DomoticaGrunn

Tegenwoordig kun je allerlei ‘Internet of Things’ apparaten in de winkel kopen. Hue lampen, Sonos speakers en nog veel, veel meer. Aan en uit zetten van lampen met een app is een leuk nieuwtje, maar niet zo praktisch en wordt al snel saai. Als developer en all-round geek vind ik het leuk om te spelen met nieuwe technologie, maar ook vooral om te kijken hoe alles werkt onder de motorkap en dingen te bedenken die net even niet mogelijk zijn met de app van de fabrikant.

Deze presentatie gaat over het combineren van sensoren, switches en displays met verschillende technologieën om problemen op de lossen die eigenlijk helemaal niet zo belangrijk zijn. Veel belangrijker, om gewoon lol te hebben met IoT en gewoon geeky dingen maken. Deze presentatie bevat monsters, veel monsters.

De023a9aff4c7a5ede3a81e8c76f17b5?s=128

Niels Leenheer

September 05, 2017
Tweet

Transcript

  1. monsters, brievenbussen en andere onzin

  2. None
  3. een nieuw huis

  4. None
  5. None
  6. 10 meter

  7. het huis 
 van de toekomst

  8. None
  9. None
  10. 433MHz

  11. None
  12. None
  13. None
  14. None
  15. None
  16. IoT is zo ongelofelijk saai

  17. raspberry pi met domoticz

  18. None
  19. kippenverwarming

  20. brrrr!

  21. kippenwaterdrinkbak

  22. kippenwaterdrinkbakverwarmingselement

  23. kippenwaterdrinkbakverwarmingselementschakelaar

  24. kippenwaterdrinkbakverwarmingselementschakelaarthermometer

  25. None
  26. rfxcom

  27. elke 30 seconden een “ping” met de temperatuur

  28. temperatuur onder nul → zet de verwarming aan

  29. zet klikaanklikuit schakelaar aan

  30. None
  31. The “S” in IoT stands for security

  32. None
  33. de vurige 
 heksenpot

  34. Doe-het-zelf IoT

  35. brains (oftewel microcontrollers)

  36. Arduino Uno
 ATmega238
 16 Mhz
 2 KB RAM
 32 KB

    Flash
  37. ESP-01
 ESP 8266 
 80 Mhz
 128 KB RAM
 512

    KB Flash

  38. NodeMCU
 ESP 8266
 80 Mhz
 128 KB RAM
 4 MB

    Flash

  39. NodeMCU

  40. Neopixel
 24 serieel 
 geschakelde 
 WS2812 RGB 
 LEDs

  41. #include <Adafruit_NeoPixel.h> #define PIN D1 #define PIXELS 24 Adafruit_NeoPixel strip

    = Adafruit_NeoPixel(PIXELS, PIN, NEO_GRB + NEO_KHZ800); void setup(void) { strip.begin(); strip.setBrightness(255); strip.setPixelColor(0, strip.Color(0, 0, 255)); strip.show(); } void loop(void) { }
  42. int i = 0; void setup(void) { strip.begin(); strip.setBrightness(255); }

    void loop(void) { i = (i + 1) % PIXELS; strip.setPixelColor(i % PIXELS, strip.Color(0, 0, 0)); strip.setPixelColor((i + 1) % PIXELS, strip.Color(0, 0, 63)); strip.setPixelColor((i + 2) % PIXELS, strip.Color(0, 0, 127)); strip.setPixelColor((i + 3) % PIXELS, strip.Color(0, 0, 195)); strip.setPixelColor((i + 4) % PIXELS, strip.Color(0, 0, 255)); strip.show(); delay(8); }
  43. ?! JavaScript? En C?
 Zo'n beetje hetzelfde. Ongeveer.
 Niet helemaal.

    Nee.
  44. IKEA SOMMAR 2017 theelichthouder

  45. None
  46. None
  47. None
  48. None
  49. WiFi is vast heel moeilijk…

  50. const char* ssid = "........"; const char* password = "........";

    ESP8266WebServer server(80); void setup(void) { WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) delay(500); server.on("/on", [](){ server.send(200, "text/plain", "on"); }); server.on("/off", [](){ server.send(200, "text/plain", "off"); }); server.begin(); } void loop(void) { server.handleClient(); }
  51. http:/ /sparkle.local/api?command=power&status
 command=power&on
 command=power&off command=brightness&status
 command=brightness&set=50 command=color&status
 command=color&set=f34d0d

  52. homebridge homebridge-better-http-rgb

  53. siri

  54. ?

  55. espruino

  56. None
  57. pixel monsters

  58. Prolight 12W plafondlamp

  59. None
  60. Neopixel
 64 serieel 
 geschakelde 
 WS2812 RGB 
 LEDs

  61. None
  62. SD card Opslag van monsters Buzzer Piepjes voor een notificatie

    Lichtgevoelige weerstand Nachtstand
  63. None
  64. None
  65. None
  66. None
  67. None
  68. None
  69. None
  70. None
  71. ben je gek geworden? ja, geen probleem kan ik het

    meenemen in een vliegtuig?
  72. None
  73. progressive
 web app

  74. http:/ /pixel.local

  75. http:/ /pixel.local

  76. None
  77. editor.addEventListener('touchstart', handleTouch); editor.addEventListener('touchmove', handleTouch); function handleTouch(e) { for (var i

    = 0; i < e.changedTouches.length; i++) { let elem = document.elementFromPoint( e.changedTouches[i].pageX, e.changedTouches[i].pageY ); if (elem.tagName && elem.tagName == 'TD' && 
 editor.contains(elem)) 
 { drawPixel(elem); } } e.preventDefault(); }
  78. editor.addEventListener('touchstart', handleTouch); editor.addEventListener('touchmove', handleTouch); function handleTouch(e) { for (var i

    = 0; i < e.changedTouches.length; i++) { let elem = document.elementFromPoint( e.changedTouches[i].pageX, e.changedTouches[i].pageY ); if (elem.tagName && elem.tagName == 'TD' && 
 editor.contains(elem)) 
 { drawPixel(elem); } } e.preventDefault(); }
  79. let socket = new WebSocket( "ws://" + window.location.host + "/ws"

    ); function drawPixel(elem) { if (elem.dataset.color != currentColor) { elem.dataset.color = currentColor; elem.style.backgroundColor = '#' + currentColor; socket.send(JSON.stringify({ command: "draw", x: elem.dataset.x, y: elem.dataset.y, color: currentColor })); } }
  80. let socket = new WebSocket( "ws://" + window.location.host + "/ws"

    ); function drawPixel(elem) { if (elem.dataset.color != currentColor) { elem.dataset.color = currentColor; elem.style.backgroundColor = '#' + currentColor; socket.send(JSON.stringify({ command: "draw", x: elem.dataset.x, y: elem.dataset.y, color: currentColor })); } }
  81. {
 "command": "draw",
 "x": 5,
 "y": 5,
 "color": "ffffff"
 }

  82. {
 "command": "draw",
 "x": 5,
 "y": 5,
 "color": "ffffff"
 }

  83. None
  84. None
  85. None
  86. socket.onmessage = function(msg) { let data = JSON.parse(msg.data); if (data.command

    == "draw") { let elem = document.querySelector( 'td[data-x=' + data.x + ']' + 
 '[data-y=' + data.y + ']' ); elem.dataset.color = data.color; elem.style.backgroundColor = '#' + data.color }; } }
  87. socket.onmessage = function(msg) { let data = JSON.parse(msg.data); if (data.command

    == "draw") { let elem = document.querySelector( 'td[data-x=' + data.x + ']' + 
 '[data-y=' + data.y + ']' ); elem.dataset.color = data.color; elem.style.backgroundColor = '#' + data.color }; } }
  88. demo

  89. het mysterie 
 van de 
 spookbrievenbus

  90. brieven bus

  91. magneetcontact

  92. bij openen van de deksel een signaal

  93. http:/ /pixel.local/api?command=notify&icon=mailbox

  94. None
  95. None
  96. None
  97. oplossing #1 magneetcontact
 combineren met een 
 bewegingsdetector?

  98. oplossing #2 magneetcontact
 uitzetten bij 
 harde westenwind?

  99. oplossing #3

  100. de wispelturige
 wasmachine

  101. None
  102. None
  103. Standby verbruik
 4,6 watt Wasmachine uit
 0,3 watt Begin programma


    24,9 watt
  104. None
  105. De was is klaar!

  106. De was is klaar! De was is klaar! De was

    is klaar! De was is klaar!
  107. None
  108. 2000 watt

  109. 20 - 200 watt

  110. 2 - 5 watt

  111. De was is klaar! De was is klaar! De was

    is klaar! De was is klaar!
  112. None
  113. commandArray = {} if (uservariables['WasmachineBezig'] == 2) then s =

    uservariables_lastupdate['WasmachineBezig'] lastUpdate = os.time{ year=string.sub(s, 1, 4), month=string.sub(s, 6, 7), day=string.sub(s, 9, 10), hour=string.sub(s, 12, 13), min=string.sub(s, 15, 16), sec=string.sub(s, 18, 19) } difference = os.difftime (os.time(), lastUpdate) if (difference > 300) then commandArray['Variable:WasmachineBezig'] = '0' commandArray['OpenURL'] = 'pixel.local/api?command=notify&icon=shirt' end end return commandArray
  114. De was is klaar!

  115. None
  116. None
  117. bedankt! vragen? 
 
 @html5test