2022-11-11 16:17:07 +00:00
|
|
|
// load library
|
|
|
|
var sched = require("sched");
|
|
|
|
|
|
|
|
// find next active alarm in range
|
2022-11-18 14:26:15 +00:00
|
|
|
function getNextAlarm(allAlarms, fo, withId) {
|
2022-11-11 16:17:07 +00:00
|
|
|
if (withId) allAlarms = allAlarms.map((a, idx) => {
|
|
|
|
a.idx = idx;
|
|
|
|
return a;
|
|
|
|
});
|
2022-11-18 14:26:15 +00:00
|
|
|
// return next active alarms in range, filter for
|
2022-11-23 17:11:42 +00:00
|
|
|
// active && not timer && not own alarm &&
|
|
|
|
// after from && before to && includes msg &&
|
|
|
|
// lastDate not today || after lastTime
|
2022-11-12 00:42:31 +00:00
|
|
|
return allAlarms.filter(
|
2022-11-17 16:09:18 +00:00
|
|
|
a => a.on && !a.timer && a.id !== "sleeplog" &&
|
2022-11-18 14:26:15 +00:00
|
|
|
a.t >= fo.from && a.t < fo.to && (!fo.msg || a.msg.includes(fo.msg)) &&
|
2022-11-23 17:11:42 +00:00
|
|
|
fo.lastDate !== new Date().getDate() || a.t > fo.lastTime
|
2022-11-12 00:42:31 +00:00
|
|
|
).map(a => { // add time to alarm
|
2022-11-11 16:17:07 +00:00
|
|
|
a.tTo = sched.getTimeToAlarm(a);
|
|
|
|
return a;
|
2022-11-12 00:42:31 +00:00
|
|
|
}).filter(a => a.tTo // filter non active alarms
|
|
|
|
// sort to get next alarm first
|
|
|
|
).sort((a, b) => a.tTo - b.tTo)[0] || {};
|
2022-11-11 16:17:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
exports = {
|
|
|
|
// function to read settings with defaults
|
|
|
|
getSettings: function() {
|
|
|
|
return Object.assign({
|
|
|
|
enabled: true,
|
|
|
|
earlier: 30,
|
2022-11-18 22:08:41 +00:00
|
|
|
fromConsec: false,
|
2022-11-17 14:16:18 +00:00
|
|
|
vibrate: "..",
|
|
|
|
msg: "...\n",
|
2022-11-11 16:17:07 +00:00
|
|
|
msgAsPrefix: true,
|
|
|
|
disableOnAlarm: false, // !!! not available if alarm is at the next day
|
2022-11-17 14:16:18 +00:00
|
|
|
as: true,
|
2022-11-18 22:08:41 +00:00
|
|
|
filter_from: 3,
|
|
|
|
filter_to: 12,
|
|
|
|
filter_msg: "",
|
2022-11-17 14:16:18 +00:00
|
|
|
wid_hide: false,
|
|
|
|
wid_time: true,
|
|
|
|
wid_color: g.theme.dark ? 65504 : 31, // yellow or blue
|
2022-11-11 16:17:07 +00:00
|
|
|
}, require("Storage").readJSON("sleeplogalarm.settings.json", true) || {});
|
|
|
|
},
|
|
|
|
|
|
|
|
// widget reload function
|
|
|
|
widReload: function() {
|
2022-11-16 22:24:43 +00:00
|
|
|
// abort if trigger object is not available
|
|
|
|
if (typeof (global.sleeplog || {}).trigger !== "object") return;
|
2022-11-11 16:17:07 +00:00
|
|
|
|
|
|
|
// read settings to calculate alarm range
|
2022-11-12 00:42:31 +00:00
|
|
|
var settings = exports.getSettings();
|
2022-11-11 16:17:07 +00:00
|
|
|
|
|
|
|
// set the alarm time
|
2022-11-18 14:26:15 +00:00
|
|
|
this.time = getNextAlarm(sched.getAlarms(), {
|
|
|
|
from: settings.filter_from * 36E5,
|
|
|
|
to: settings.filter_to * 36E5,
|
|
|
|
msg: settings.filter_msg,
|
|
|
|
lastTime: settings.lastTime,
|
2022-11-23 17:11:42 +00:00
|
|
|
lastDate: settings.lastDate
|
2022-11-18 14:26:15 +00:00
|
|
|
}).t;
|
2022-11-11 16:17:07 +00:00
|
|
|
|
|
|
|
// abort if no alarm time could be found inside range
|
|
|
|
if (!this.time) return;
|
|
|
|
|
|
|
|
// set widget width if not hidden
|
|
|
|
if (!this.hidden) this.width = 8;
|
|
|
|
|
2022-11-16 22:24:43 +00:00
|
|
|
// insert sleeplogalarm conditions and function
|
|
|
|
sleeplog.trigger.sleeplogalarm = {
|
2022-11-17 08:33:00 +00:00
|
|
|
from: this.time - settings.earlier * 6E4,
|
|
|
|
to: this.time - 1,
|
2022-11-16 22:24:43 +00:00
|
|
|
fn: function (data) {
|
|
|
|
// execute trigger function if on light sleep or awake
|
2022-11-18 22:08:41 +00:00
|
|
|
// and if set if comming from consecutive
|
|
|
|
if ((data.status === 3 || data.status === 2) && !settings.fromConsec ||
|
|
|
|
data.consecutive === 3 || data.prevConsecutive === 3)
|
2022-11-16 22:24:43 +00:00
|
|
|
require("sleeplogalarm").trigger();
|
|
|
|
}
|
2022-11-11 16:17:07 +00:00
|
|
|
};
|
|
|
|
},
|
|
|
|
|
|
|
|
// trigger function
|
2022-11-17 09:32:55 +00:00
|
|
|
trigger: function() {
|
2022-11-11 23:16:39 +00:00
|
|
|
// read settings
|
2022-11-12 00:42:31 +00:00
|
|
|
var settings = exports.getSettings();
|
2022-11-11 16:17:07 +00:00
|
|
|
|
|
|
|
// read all alarms
|
|
|
|
var allAlarms = sched.getAlarms();
|
|
|
|
|
|
|
|
// find first active alarm
|
2022-11-18 14:26:15 +00:00
|
|
|
var alarm = getNextAlarm(sched.getAlarms(), {
|
|
|
|
from: settings.filter_from * 36E5,
|
|
|
|
to: settings.filter_to * 36E5,
|
|
|
|
msg: settings.filter_msg,
|
|
|
|
lastTime: settings.lastTime,
|
2022-11-23 17:11:42 +00:00
|
|
|
lastDate: settings.lastDate
|
2022-11-18 14:26:15 +00:00
|
|
|
}, settings.disableOnAlarm);
|
2022-11-12 00:42:31 +00:00
|
|
|
|
2022-11-11 16:17:07 +00:00
|
|
|
// return if no alarm is found
|
|
|
|
if (!alarm) return;
|
|
|
|
|
2022-11-16 22:24:43 +00:00
|
|
|
// get now
|
|
|
|
var now = new Date();
|
|
|
|
|
2022-11-11 23:16:39 +00:00
|
|
|
// get date of the alarm
|
|
|
|
var aDate = new Date(now + alarm.tTo).getDate();
|
|
|
|
|
|
|
|
// disable earlier triggered alarm if set and on the same day
|
|
|
|
if (settings.disableOnAlarm && now.getDate() === aDate) {
|
|
|
|
// set alarms last to today
|
|
|
|
allAlarms[alarm.idx].last = aDate;
|
2022-11-11 16:17:07 +00:00
|
|
|
// remove added indexes
|
|
|
|
allAlarms = allAlarms.map(a => {
|
|
|
|
delete a.idx;
|
|
|
|
return a;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// add new alarm for now with data from found alarm
|
|
|
|
allAlarms.push({
|
|
|
|
id: "sleeplog",
|
|
|
|
appid: "sleeplog",
|
|
|
|
on: true,
|
2022-11-17 09:32:55 +00:00
|
|
|
t: ((now.getHours() * 60 + now.getMinutes()) * 60 + now.getSeconds()) * 1000,
|
2022-11-11 16:17:07 +00:00
|
|
|
dow: 127,
|
|
|
|
msg: settings.msg + (settings.msgAsPrefix ? alarm.msg || "" : ""),
|
|
|
|
vibrate: settings.vibrate || alarm.vibrate,
|
|
|
|
as: settings.as,
|
|
|
|
del: true
|
|
|
|
});
|
|
|
|
|
2022-11-18 14:26:15 +00:00
|
|
|
// save time of alarm and this day to prevent triggering for the same alarm again
|
|
|
|
settings.lastTime = alarm.t;
|
2022-11-23 17:11:42 +00:00
|
|
|
settings.lastDate = now.getDay();
|
2022-11-18 14:26:15 +00:00
|
|
|
require("Storage").writeJSON("sleeplogalarm.settings.json", settings);
|
|
|
|
|
2022-11-11 16:17:07 +00:00
|
|
|
// write changes
|
|
|
|
sched.setAlarms(allAlarms);
|
|
|
|
|
|
|
|
// trigger sched.js
|
|
|
|
load("sched.js");
|
|
|
|
}
|
|
|
|
};
|