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