Files
old-tfm/app/server/methods.js
2016-10-08 16:02:59 +02:00

191 lines
4.5 KiB
JavaScript

function controller_state(controller_id) {
var result = {}
if (controller_id) {
result = ControllerState.findOne({
controller_id: controller_id
});
}
if (!result) {
result = {}
};
return result;
};
function setOutValveTo(controller_id, nextState) {
var state = controller_state(controller_id);
ControllerState.update(state._id, {
'$set': {
'state.out_valve': nextState,
'time': new Date(),
'set_by': 'server'
}
});
if (nextState === "open") {
ControllerState.update(state._id, {
'$set': {
'significantEvents.lastOutValveOpen': new Date(),
}
});
}
}
function setInValveTo(controller_id, nextState) {
var state = controller_state(controller_id);
ControllerState.update(state._id, {
'$set': {
'state.in_valve': nextState,
'time': new Date(),
'set_by': 'server'
}
});
if (nextState === "open") {
ControllerState.update(state._id, {
'$set': {
'significantEvents.lastInValveOpen': new Date(),
}
});
}
}
function requestNewPicture(controller_id) {
var state = controller_state(controller_id);
ControllerState.update(state._id, {
'$set': {
'state.picture_requested': 'true',
'time': new Date(),
'set_by': 'server'
}
});
};
function openInValve(controller_id) {
var state = controller_state(controller_id);
var config = state.config;
if (config.manualInflow) {
setInValveTo(controller_id, 'opening');
}
reactToSensorData(last_sensor_reading(controller_id));
}
function closeInValve(controller_id) {
var state = controller_state(controller_id);
var config = state.config;
if (config.manualInflow) {
setInValveTo(controller_id, 'closing');
}
reactToSensorData(last_sensor_reading(controller_id));
}
function openOutValve(controller_id) {
setOutValveTo(controller_id, 'opening');
setInValveTo(controller_id, 'closing');
var state = controller_state(controller_id);
var config = state.config;
var jobName = "Close out valve " + state.controller_id + " after draining";
console.log("Opening valve ", controller_id, jobName);
SyncedCron.remove(jobName);
SyncedCron.add({
name: jobName,
schedule: function(parser) {
var time = moment().add(config.draining_period_amount, config.draining_period_unit).toDate();
return parser.recur().on(time).fullDate();
},
job: function() {
closeOutValve(controller_id);
}
});
console.log(Meteor.sharedFunctions);
reactToSensorData(last_sensor_reading(controller_id));
}
function closeOutValve(controller_id) {
var state = controller_state(controller_id);
var jobName = "Close out valve " + state.controller_id + " after draining";
console.log("Closing valve ", controller_id, jobName);
SyncedCron.remove(jobName);
setOutValveTo(controller_id, 'closing');
console.log("Finished clearing cron ", controller_id);
console.log(Meteor.sharedFunctions);
reactToSensorData(last_sensor_reading(controller_id));
}
function clearLog() {
console.log("Removing sensor data");
SensorData.remove({});
}
function saveControllerConfig(controller_id, time, days, manualInflow) {
var state = controller_state(controller_id);
ControllerState.update(state._id, {
'$set': {
'config.automaticTimeOfDay': time,
'config.automaticDaysOfWeek': days,
'config.manualInflow': manualInflow
}
});
var jobName = "automatic_" + controller_id;
var times = time.split(":");
var hours = parseInt(times[0]);
var minutes = parseInt(times[1]);
SyncedCron.remove(jobName);
SyncedCron.add({
name: jobName,
schedule: function(parser) {
var period = parser.recur();
for (var i = 0; i < days.length; i++) {
period = period.and().on(parseInt(days[i])).dayOfWeek().on(hours).hour().on(minutes).minute();
}
return period;
},
job: function() {
openOutValve(controller_id);
}
});
}
function last_sensor_reading(controller_id) {
var result = null;
if (controller_id) {
result = SensorData.find({
controllerId: controller_id
}, {
sort: {
created_at: -1
},
limit: 1
});
}
if (result && result.count() > 0) {
return result.fetch()[0];
} else {
return {}
}
}
Meteor.methods({
openOutValve: openOutValve,
closeOutValve: closeOutValve,
openInValve: openInValve,
closeInValve: closeInValve,
clearLog: clearLog,
saveControllerConfig: saveControllerConfig,
requestNewPicture: requestNewPicture
});