nightscout
Version:
Nightscout acts as a web-based CGM (Continuous Glucose Monitor) to allow multiple caregivers to remotely view a patients glucose data in realtime.
157 lines (127 loc) • 5.8 kB
JavaScript
;
var _ = require('lodash');
var moment = require('moment');
function init(ctx) {
var translate = ctx.language.translate;
var levels = ctx.levels;
var bage = {
name: 'bage'
, label: 'Pump Battery Age'
, pluginType: 'pill-minor'
};
bage.getPrefs = function getPrefs(sbx) {
return {
info: sbx.extendedSettings.info || 312
, warn: sbx.extendedSettings.warn || 336
, urgent: sbx.extendedSettings.urgent || 360
, display: sbx.extendedSettings.display ? sbx.extendedSettings.display : 'days'
, enableAlerts: sbx.extendedSettings.enableAlerts || false
};
};
bage.setProperties = function setProperties (sbx) {
sbx.offerProperty('bage', function setProp ( ) {
return bage.findLatestTimeChange(sbx);
});
};
bage.checkNotifications = function checkNotifications(sbx) {
var batteryInfo = sbx.properties.bage;
if (batteryInfo.notification) {
var notification = _.extend({}, batteryInfo.notification, {
plugin: bage
, debug: {
age: batteryInfo.age
}
});
sbx.notifications.requestNotify(notification);
}
};
bage.findLatestTimeChange = function findLatestTimeChange(sbx) {
var prefs = bage.getPrefs(sbx);
var batteryInfo = {
found: false
, age: 0
, treatmentDate: null
, checkForAlert: false
};
var prevDate = 0;
_.each(sbx.data.batteryTreatments, function eachTreatment (treatment) {
var treatmentDate = treatment.mills;
if (treatmentDate > prevDate && treatmentDate <= sbx.time) {
prevDate = treatmentDate;
batteryInfo.treatmentDate = treatmentDate;
var a = moment(sbx.time);
var b = moment(batteryInfo.treatmentDate);
var days = a.diff(b,'days');
var hours = a.diff(b,'hours') - days * 24;
var age = a.diff(b,'hours');
if (!batteryInfo.found || (age >= 0 && age < batteryInfo.age)) {
batteryInfo.found = true;
batteryInfo.age = age;
batteryInfo.days = days;
batteryInfo.hours = hours;
batteryInfo.notes = treatment.notes;
batteryInfo.minFractions = a.diff(b,'minutes') - age * 60;
}
}
});
batteryInfo.level = levels.NONE;
var sound = 'incoming';
var message;
var sendNotification = false;
if (batteryInfo.age >= prefs.urgent) {
sendNotification = batteryInfo.age === prefs.urgent;
message = translate('Pump Battery change overdue!');
sound = 'persistent';
batteryInfo.level = levels.URGENT;
} else if (batteryInfo.age >= prefs.warn) {
sendNotification = batteryInfo.age === prefs.warn;
message = translate('Time to change pump battery');
batteryInfo.level = levels.WARN;
} else if (batteryInfo.age >= prefs.info) {
sendNotification = batteryInfo.age === prefs.info;
message = 'Change pump battery soon';
batteryInfo.level = levels.INFO;
}
if (prefs.display === 'days' && batteryInfo.found) {
batteryInfo.display = '';
if (batteryInfo.age >= 24) {
batteryInfo.display += batteryInfo.days + 'd';
}
batteryInfo.display += batteryInfo.hours + 'h';
} else {
batteryInfo.display = batteryInfo.found ? batteryInfo.age + 'h' : 'n/a ';
}
//allow for 20 minute period after a full hour during which we'll alert the user
if (prefs.enableAlerts && sendNotification && batteryInfo.minFractions <= 20) {
batteryInfo.notification = {
title: translate('Pump battery age %1 hours', { params: [batteryInfo.age] })
, message: message
, pushoverSound: sound
, level: batteryInfo.level
, group: 'BAGE'
};
}
return batteryInfo;
};
bage.updateVisualisation = function updateVisualisation (sbx) {
var batteryInfo = sbx.properties.bage;
var info = [{ label: translate('Inserted'), value: new Date(batteryInfo.treatmentDate).toLocaleString() }];
if (!_.isEmpty(batteryInfo.notes)) {
info.push({label: translate('Notes') + ':', value: batteryInfo.notes});
}
var statusClass = null;
if (batteryInfo.level === levels.URGENT) {
statusClass = 'urgent';
} else if (batteryInfo.level === levels.WARN) {
statusClass = 'warn';
}
sbx.pluginBase.updatePillText(bage, {
value: batteryInfo.display
, label: translate('BAGE')
, info: info
, pillClass: statusClass
});
};
return bage;
}
module.exports = init;