A presentation at Domotica Grunn in in Groningen, Netherlands by Niels Leenheer
monsters, brievenbussen en andere onzin
een nieuw huis
10 meter
het huis van de toekomst
433MHz
IoT is zo ongelofelijk saai
raspberry pi met domoticz
kippenverwarming
brrrr!
kippenwaterdrinkbak
kippenwaterdrinkbakverwarmingselement
kippenwaterdrinkbakverwarmingselementschakelaar
kippenwaterdrinkbakverwarmingselementschakelaarthermometer
rfxcom
elke 30 seconden een “ping” met de temperatuur
temperatuur onder nul → zet de verwarming aan
zet klikaanklikuit schakelaar aan
The “S” in IoT stands for security
de vurige heksenpot
Doe-het-zelf IoT
brains (oftewel microcontrollers)
Arduino Uno ATmega238 16 Mhz 2 KB RAM 32 KB Flash
ESP-01 ESP 8266 80 Mhz 128 KB RAM 512 KB Flash
NodeMCU ESP 8266 80 Mhz 128 KB RAM 4 MB Flash
NodeMCU
Neopixel 24 serieel geschakelde WS2812 RGB LEDs
#include <Adafruit_NeoPixel.h> #define PIN #define PIXELS D1 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) { }
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, strip.setPixelColor((i + 2) % PIXELS, strip.Color(0, 0, strip.setPixelColor((i + 3) % PIXELS, strip.Color(0, 0, strip.setPixelColor((i + 4) % PIXELS, strip.Color(0, 0, strip.show(); delay(8); } 63)); 127)); 195)); 255));
?! JavaScript? En C? Zo’n beetje hetzelfde. Ongeveer. Niet helemaal. Nee.
IKEA SOMMAR 2017 theelichthouder
WiFi is vast heel moeilijk…
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(); }
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
homebridge homebridge-better-http-rgb
siri
?
espruino
pixel monsters
Prolight 12W plafondlamp
Neopixel 64 serieel geschakelde WS2812 RGB LEDs
SD card Opslag van monsters Lichtgevoelige weerstand Nachtstand Buzzer Piepjes voor een notificatie
kan ik het meenemen in een vliegtuig? ben je gek geworden? ja, geen probleem
progressive web app
http://pixel.local
http://pixel.local
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(); }
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(); }
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 })); } }
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 })); } }
{ “command”: “draw”, “x”: 5, “y”: 5, “color”: “ffffff” }
{ “command”: “draw”, “x”: 5, “y”: 5, “color”: “ffffff” }
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 }; } }
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 }; } }
demo
het mysterie van de spookbrievenbus
brieven bus
magneetcontact
bij openen van de deksel een signaal
http://pixel.local/api?command=notify&icon=mailbox
magneetcontact combineren met een bewegingsdetector? oplossing #1
magneetcontact uitzetten bij harde westenwind? oplossing #2
oplossing #3
de wispelturige wasmachine
Begin programma 24,9 watt Wasmachine uit 0,3 watt Standby verbruik 4,6 watt
De was is klaar!
De was is klaar! De was is klaar! De was is klaar! De was is klaar!
2000 watt
20 - 200 watt
2 - 5 watt
De was is klaar! De was is klaar! De was is klaar! De was is klaar!
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
De was is klaar!
bedankt! vragen? @html5test
The Internet of Things can become quite boring pretty fast. Turning on the lights in your apartment with an app is a nice novelty, but it isn’t really very creative. And as developers we like to tinker and look under the hood, but manufacturers like their walled gardens. This talk is about combining sensors, switches and displays with different technologies to solve problems that don’t really exist and more importantly just to have fun with IoT and make geeky stuff. This talk contains monsters, and lots of them.