Skip to content

Instantly share code, notes, and snippets.

@liamcurry
Created September 29, 2014 23:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save liamcurry/990af9edc936098baa30 to your computer and use it in GitHub Desktop.
Save liamcurry/990af9edc936098baa30 to your computer and use it in GitHub Desktop.
var lab_data = nio.src.socketio('http://54.197.236.34:443')('lab');
function digitalSensor(selector, on_text, off_text) {
var el = d3.select(selector);
return _.assign({}, nio._streamer, {
write: function (data) {
if (data == 'on') {
el.selectAll('.status').html(on_text);
el.attr('status', 'on');
} else {
el.selectAll('.status').html(off_text);
el.attr('status', 'off');
}
this.push(data);
}
})
}
function analogSensor(selector) {
var el = d3.select(selector);
return _.assign({}, nio._streamer, {
write: function (data) {
el.selectAll('.status').html(data);
el.attr('status', 'on');
this.push(data);
}
});
}
function numericVisual(selector) {
var el = d3.select(selector);
return _.assign({}, nio._streamer, {
write: function (data) {
el.html(data);
this.push(data);
}
});
}
function getSensorTransform(key, digitalCompute) {
if (! digitalCompute) {
digitalCompute = function(d) { return d; }
}
return function(d) {
if (key in d) {
var val = digitalCompute(d[key]);
if (val == true) {
return 'on';
} else if (val == false) {
return 'off';
} else {
return val
}
}
// we don't have it, do nothing
return false;
}
}
function analogDecimalFix(places) {
return function(num) {
if (isNaN(num)) {
return num;
} else {
return num.toFixed(places);
}
};
}
function tempify(num) {
return num + ' °C';
}
function pressurify(num) {
return num + ' Atms';
}
function ampify(num) {
return (num * 120) + ' Watts';
}
function percentify(num) {
return num + '%';
}
function commafy(num) {
return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
function addAnalogSensor(data_src, sensor_id, signal_key, transforms) {
var stream = data_src
.pipe(nio.transform(getSensorTransform(signal_key)))
.pipe(nio.transform(analogDecimalFix(1)));
if (! transforms) {
transforms = [];
}
for (var i=0; i<transforms.length; i++) {
stream = stream.pipe(nio.transform(transforms[i]));
}
stream.pipe(analogSensor(".sensor[sensor='" + sensor_id + "']"));
}
function addDigitalSensor(data_src, sensor_id,
signal_key, on_text, off_text, compute) {
data_src
.pipe(nio.transform(getSensorTransform(signal_key, compute)))
.pipe(digitalSensor(
".sensor[sensor='" + sensor_id + "']",
on_text,
off_text));
}
/*
* Kitchen Sensors
*/
addDigitalSensor(lab_data, 'fridge', 'PhotoR', 'Open', 'Closed', function(val) {
return val < 10000;
});
addAnalogSensor(lab_data, 'fridge-temp', 'temp_data', [function(d) {
return d['tempC'];
}, tempify]);
addAnalogSensor(lab_data, 'fridge-humid', 'temp_data', [function(d) {
return d['hum'];
}, percentify]);
addDigitalSensor(lab_data, 'garbage', 'accel', 'Running', 'Off', function(val) {
var mag = Math.pow(Math.pow(val['x'], 2) + Math.pow(val['y'], 2) + Math.pow(val['z'], 2), 0.5);
return mag > 1.1;
});
/*
* Server Sensors
*/
addDigitalSensor(lab_data, 'server', '0000', 'Connected', 'Disconnected', function(val) {
return val > 0;
});
addAnalogSensor(lab_data, 'server-room-temp', 'A0601', [tempify]);
addAnalogSensor(lab_data, 'server-temp', 'A0600', [tempify]);
addDigitalSensor(lab_data, 'fan', 'D1200', 'On', 'Off');
addAnalogSensor(lab_data, 'power', 'A0100', [ampify]);
addDigitalSensor(lab_data, 'door', 'A0400', 'Open', 'Closed', function(val) {
return val < 1.0;
});
//lab_data.pipe(nio.log())
/*
* Graphs
*/
lab_data
.pipe(nio.filter(function (d) { return d.cpu_percentage_overall }))
.pipe(nio.graphs.dataset())
.y('cpu_percentage_overall')
.id(function () { return 'cpu' })
.pipe(nio.graphs.line('#cpu-graph'))
.domains({y: [0, 100]})
.width(500)
.tickFormat(function (d) { return Math.floor(d) + '%' })
.labels({y: 'cpu usage (%)'})
.render()
lab_data
.pipe(nio.filter(function (d) { return d.A0300 }))
.pipe(nio.graphs.dataset())
.y('A0300')
.id(function () { return 'temp' })
.pipe(nio.graphs.line('#temp-graph'))
.domains({y: [0, 100]})
.width(500)
.tickFormat(function (value) { return Math.floor(value) + '°' })
.labels({y: 'temperature (°C)'})
.render()
/*
* Lab Sensors
*/
addAnalogSensor(lab_data, 'pressure', 'A0300', [pressurify]);
addAnalogSensor(lab_data, 'bench-power', 'A0001', [ampify]);
addAnalogSensor(lab_data, 'lab-temp', 'A0500', [tempify]);
addDigitalSensor(lab_data, 'lab-ac', 'lab', 'Running', 'Off', function(val) {
return ('fan' in val && val['fan']);
});
/*
* Office Sensors
*/
addDigitalSensor(lab_data, 'office-light', 'bathroom', 'On', 'Off');
addDigitalSensor(lab_data, 'office-motion', 'bathroom', 'Detected', 'Not Detected');
//lab_data.pipe(nio.log());
/*
* Footer Visuals
*/
lab_data
.pipe(nio.transform(function(d) { return d.cpu_percentage_overall }))
.pipe(nio.transform(analogDecimalFix(1)))
.pipe(nio.transform(percentify))
.pipe(numericVisual('.cpu-pct'));
lab_data
.pipe(nio.transform(function(d) { return d.count }))
.pipe(nio.transform(analogDecimalFix(0)))
.pipe(nio.transform(commafy))
.pipe(numericVisual('.sig-per-sec'));
lab_data
.pipe(nio.transform(function(d) { return d.cumulative_count }))
.pipe(nio.transform(analogDecimalFix(0)))
.pipe(nio.transform(commafy))
.pipe(numericVisual('.total-sig'));
function showTime() {
var d = new Date(),
hr = (d.getUTCHours() - 6 + 24) % 24, // locking into Boulder time
min = ("0" + d.getUTCMinutes()).slice(-2);
d3.select('.nio-time').html(hr + ':' + min + ' MDT');
}
showTime();
setInterval(showTime, 5000);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment