Commit 6806afe8 by Martin Kotula

IsOccupied computed based on last readings

parent cd4c9bb3
define({ define({
"Sensor 1": { "Sensor 1": {
name: "Chill room" name: "Chill room"
},
__default__: {
minReadingsCount: 3,
readingExpiry: 3 * 60, //in seconds
lastReadings: 10 //number of last readings taken into account when calculating isOccupied
} }
}); });
\ No newline at end of file
define(['knockout', "app/sensors.config", "lodash"], function(ko, sensorsConfig, _) { define(['knockout', "app/sensors.config", "lodash"], function (ko, sensorsConfig, _) {
function SensorViewModel(sensorData) { function SensorViewModel(sensorData) {
this.name = getName(sensorData.id); this.name = getName(sensorData.id);
this.readings = ko.observableArray([]); this.readings = ko.observableArray([]);
this.config = getConfig(sensorData.id);
this.update(sensorData); this.update(sensorData);
this.isOccupied = ko.computed(_.bind(function () { this.isOccupied = ko.computed(_.bind(calculateIsOcupied, this));
var lastReading = _.last(this.readings());
if(!lastReading) var clearReadingsPeriodically = _.bind(function () {
this.clearExpiredReadings();
setTimeout(clearReadingsPeriodically, 10 * 1000);
}, this);
clearReadingsPeriodically();
}
function calculateIsOcupied() {
var readings = this.readings();
if (readings.length < this.config.minReadingsCount)
return undefined; return undefined;
return lastReading.isOccupied; var lastReadings = _.slice(_.orderBy(readings, "timestamp", "desc"), 0, this.config.lastReadings);
var occupiedReadingsCount = 0;
var notOccupiedReadingsCount = 0;
_.forEach(lastReadings, function (reading) {
if (reading.isOccupied) {
occupiedReadingsCount++;
} else {
notOccupiedReadingsCount++;
}
});
}, this)); return occupiedReadingsCount > notOccupiedReadingsCount;
} }
SensorViewModel.prototype.update = function(sensorData){ SensorViewModel.prototype.clearExpiredReadings = function () {
var currentDate = new Date();
var expiryInMiliseconds = this.config.readingExpiry * 1000;
this.readings.remove(function (reading) {
return currentDate - reading.timestamp > expiryInMiliseconds;
});
};
SensorViewModel.prototype.update = function (sensorData) {
this.readings.push(_.pick(sensorData, ["isOccupied", "timestamp"])); this.readings.push(_.pick(sensorData, ["isOccupied", "timestamp"]));
this.timestamp = ko.observable(sensorData.timestamp); this.timestamp = ko.observable(sensorData.timestamp);
}; };
function getName(id){ function getName(id) {
return (sensorsConfig[id] && sensorsConfig[id].name) || id; return (sensorsConfig[id] && sensorsConfig[id].name) || id;
} }
function getConfig(id) {
return _.merge(sensorsConfig[id] || {}, sensorsConfig.__default__);
}
return SensorViewModel; return SensorViewModel;
}); });
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment