saving and temperature works

This commit is contained in:
Senad Uka
2016-10-23 15:10:20 +02:00
parent 31b355f381
commit 6108d75074
16 changed files with 270 additions and 130 deletions

View File

@@ -1,19 +1,6 @@
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);
var state = Meteor.zoblak.server.controller_state(controller_id);
ControllerState.update(state._id, {
'$set': {
'state.out_valve': nextState,
@@ -33,7 +20,7 @@ function setOutValveTo(controller_id, nextState) {
}
function setInValveTo(controller_id, nextState) {
var state = controller_state(controller_id);
var state = Meteor.zoblak.server.controller_state(controller_id);
ControllerState.update(state._id, {
'$set': {
'state.in_valve': nextState,
@@ -53,7 +40,7 @@ function setInValveTo(controller_id, nextState) {
}
function requestNewPicture(controller_id) {
var state = controller_state(controller_id);
var state = Meteor.zoblak.server.controller_state(controller_id);
ControllerState.update(state._id, {
'$set': {
'state.picture_requested': 'true',
@@ -64,7 +51,7 @@ function requestNewPicture(controller_id) {
};
function openInValve(controller_id) {
var state = controller_state(controller_id);
var state = Meteor.zoblak.server.controller_state(controller_id);
var config = state.config;
if (config.manualInflow) {
setInValveTo(controller_id, 'opening');
@@ -73,7 +60,7 @@ function openInValve(controller_id) {
}
function closeInValve(controller_id) {
var state = controller_state(controller_id);
var state = Meteor.zoblak.server.controller_state(controller_id);
var config = state.config;
if (config.manualInflow) {
setInValveTo(controller_id, 'closing');
@@ -87,7 +74,7 @@ function closeInValve(controller_id) {
function openOutValve(controller_id) {
setOutValveTo(controller_id, 'opening');
setInValveTo(controller_id, 'closing');
var state = controller_state(controller_id);
var state = Meteor.zoblak.server.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);
@@ -108,7 +95,7 @@ function openOutValve(controller_id) {
}
function closeOutValve(controller_id) {
var state = controller_state(controller_id);
var state = Meteor.zoblak.server.controller_state(controller_id);
var jobName = "Close out valve " + state.controller_id + " after draining";
console.log("Closing valve ", controller_id, jobName);
@@ -127,7 +114,7 @@ function clearLog() {
}
function saveControllerConfig(controller_id, time, days, manualInflow) {
var state = controller_state(controller_id);
var state = Meteor.zoblak.server.controller_state(controller_id);
ControllerState.update(state._id, {
'$set': {
'config.automaticTimeOfDay': time,
@@ -157,6 +144,125 @@ function saveControllerConfig(controller_id, time, days, manualInflow) {
});
}
function saveAlarmSettings(controller_id, minTemperature, maxTemperature, timeoutBox, timeoutPhone, smsNumbers) {
var state = Meteor.zoblak.server.controller_state(controller_id);
ControllerState.update(state._id, {
'$set': {
'config.minTemperature': parseFloat(minTemperature),
'config.maxTemperature': parseFloat(maxTemperature),
'config.timeoutBox': parseInt(timeoutBox),
'config.timeoutPhone': parseInt(timeoutPhone),
'config.smsNumbers': smsNumbers,
'config.sms1': smsNumbers[0],
'config.sms2': smsNumbers[1],
'config.sms3': smsNumbers[2],
'config.sms4': smsNumbers[3]
}
});
var jobName = "automatic_alarm_" + controller_id;
SyncedCron.remove(jobName);
SyncedCron.add({
name: jobName,
schedule: function(parser) {
return parser.text('every 30 seconds');
},
job: function() {
reactToAlarmData(controller_id);
}
});
}
function reactToAlarmData(controller_id) {
var reading = last_sensor_reading(controller_id);
var state = Meteor.zoblak.server.controller_state(controller_id);
var config = state.config;
var minTemperature = function(temperatures) {
// if it gets a lot colder than absolute zero we will
// we will have more problems than the bug in this code
if(size(temperatures) <= 0) return -1000;
var minimal = parseFloat(temperatures[0]);
for (var i in temperatures) {
if (parseFloat(temperatures[i]) < minimal) {
minimal = parseFloat(temperatures[i]);
}
}
return minimal;
}
var maxTemperature = function(temperatures) {
// obviously - hell is not supported in this version
if(size(temperatures) <= 0) return 1000;
var maximal = parseFloat(temperatures[0]);
for (var i in temperatures) {
if (parseFloat(temperatures[i]) > maximal) {
maximal = parseFloat(temperatures[i]);
}
}
return maximal;
}
var tooCold = config.minTemperature && (minTemperature(reading.temperatures) < config.minTemperature);
var tooHot = config.maxTemperature && (maxTemperature(reading.temperatures) > config.maxTemperature);
var minutesSinceLastBoxContact = state.lastBoxContact ? moment(state.lastBoxContact).diff(moment(new Date()), 'minutes') : -1;
var boxSilent = config.timeoutBox && minutesSinceLastBoxContact > config.timeoutBox;
var minutesSinceLastPhoneContact = state.lastPhoneContact ? moment(state.lastPhoneContact).diff(moment(new Date()), 'minutes') : -1;
var phoneSilent = config.timeoutPhone && minutesSinceLastPhoneContact > config.timeoutPhone;
if (tooCold || tooHot || boxSilent || phoneSilent) {
soundTheAlarm(tooCold, tooHot, boxSilent, phoneSilent);
}
}
function soundTheAlarm(tooCold, tooHot, boxSilent, phoneSilent) {
var state = Meteor.zoblak.server.controller_state(controller_id);
var reason = {
tooHot: tooHot,
tooCold: tooCold,
boxSilent: boxSilent,
phoneSilent: phoneSilent
};
if (!state.state.alarmTriggered) {
ControllerState.update(state._id, {
'$set': {
'state.alarmTriggered': true,
'state.alarmStarted': new Date(),
'state.alarmStopped': null,
'state.alarmReasons': reason
}
});
if (boxSilent || phoneSilent) {
sendAlarmingSms(reason, state.config.smsNumbers)
}
}
}
function sendAlarmingSms(reason, numbers) {
for (var i in numbers) {
var number = numbers[i];
twilio = Twilio('AC10d7ed0bf54c1be4b1cd7133130e63f4', 'e133d3f02a69b79e93ad9ca1d73517d1');
twilio.sendSms({
to: number, // Any number Twilio can deliver to
from: '+43676800104260', // A number you bought from Twilio and can use for outbound communication
body: 'Zoblak alarm! Pokrenite aplikaciju! HITNO!' // body of the SMS message
}, function(err, responseData) { //this function is executed when a response is received from Twilio
if (!err) { // "err" is an error received during the request, if any
// "responseData" is a JavaScript object containing data received from Twilio.
// A sample response from sending an SMS message is here (click "JSON" to see how the data appears in JavaScript):
// http://www.twilio.com/docs/api/rest/sending-sms#example-1
console.log(responseData.from); // outputs "+14506667788"
console.log(responseData.body); // outputs "word to your mother."
}
});
}
}
function last_sensor_reading(controller_id) {
var result = null;
@@ -186,5 +292,6 @@ Meteor.methods({
closeInValve: closeInValve,
clearLog: clearLog,
saveControllerConfig: saveControllerConfig,
requestNewPicture: requestNewPicture
requestNewPicture: requestNewPicture,
saveAlarmSettings: saveAlarmSettings
});