iv123 lin
/
connected-lights
sample_pir-lights_rgb
Diff: webapp/main.js
- Revision:
- 0:7a352727249b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webapp/main.js Sun Jun 18 10:14:56 2017 +0000 @@ -0,0 +1,94 @@ +var TOKEN = 'YOUR_ACCESS_TOKEN'; + +var konekuta = require('konekuta'); +var express = require('express'); +var app = express(); +var server = require('http').Server(app); +var io = require('socket.io')(server); +var hbs = require('hbs'); + +// Some options for express (node.js web app library) +hbs.registerPartials(__dirname + '/views/partials'); +app.use(express.static(__dirname + '/public')); +app.set('view engine', 'html'); +app.set('views', __dirname + '/views'); +app.engine('html', hbs.__express); + +if (!process.env.TOKEN && TOKEN === 'YOUR_ACCESS_TOKEN') { + throw 'Please set your access token first in main.js!'; +} + +// This is how we go from device => view model +// we'll use this to render the device view, this will also be sent to the client +// when a device connects (so it knows what to render) +function mapToView(d) { + var hex = Number(d.color).toString(16); + var model = { + name: d.endpoint, + rawColor: d.color, + color: '#' + '000000'.substring(0, 6 - hex.length) + hex, + motionClass: d.status == 0 ? 'selected' : '', + onClass: d.status == 1 ? 'selected' : '', + offClass: d.status == 2 ? 'selected' : '', + timeout: d.timeout, + status: d.status + }; + + // create the device HTML + var html = hbs.handlebars.compile('{{> device}}')(model); + + return { model: model, html: html }; +} + +var options = { + endpointType: 'light-system', // what endpoint types to look for + token: TOKEN, + io: io, + deviceModel: { // building the initial device model (w/ 4 properties) + status: { + retrieve: 'led/0/permanent_status', // when device registers, retrieve value + update: { + method: 'put', // update actions + path: 'led/0/permanent_status' + } + }, + timeout: { + retrieve: 'led/0/timeout', + update: { + method: 'put', + path: 'led/0/timeout' + } + }, + color: { + retrieve: 'led/0/color', + update: { + method: 'put', + path: 'led/0/color' + } + }, + count: { + retrieve: 'pir/0/count', + subscribe: true // subscribe to updates + } + }, + mapToView: mapToView, + verbose: true // Verbose logging +}; + +// Start konekuta (connects to mbed Device Connector, and retrieves initial device model) +konekuta(options, (err, devices, ee, connector) => { + if (err) { + throw err; + } + + // Now we can start the web server + server.listen(process.env.PORT || 5265, process.env.HOST || '0.0.0.0', function() { + console.log('Web server listening on port %s!', process.env.PORT || 5265); + }); + + // And handle requests + app.get('/', function(req, res, next) { + // Render index view, with the devices based on mapToView function + res.render('index', { devices: devices.map(d => mapToView(d).model) }); + }); +});