[sleeplogalarm] Alarm only once each alarm

master
storm64 2022-11-18 15:26:15 +01:00
parent a49f902f02
commit 69d0890cfa
1 changed files with 26 additions and 11 deletions

View File

@ -2,15 +2,19 @@
var sched = require("sched");
// find next active alarm in range
function getNextAlarm(allAlarms, from, to, msg, withId) {
function getNextAlarm(allAlarms, fo, withId) {
if (withId) allAlarms = allAlarms.map((a, idx) => {
a.idx = idx;
return a;
});
// return next active alarms in range
// return next active alarms in range, filter for
// active, not timer, not own alarm,
// after from, before to, includes msg
// not lastTime, not lastDay
return allAlarms.filter(
a => a.on && !a.timer && a.id !== "sleeplog" &&
a.t >= from && a.t < to && (!msg || a.msg.includes(msg))
a.t >= fo.from && a.t < fo.to && (!fo.msg || a.msg.includes(fo.msg)) &&
fo.lastTime !== a.t && fo.lastDay !== a.last
).map(a => { // add time to alarm
a.tTo = sched.getTimeToAlarm(a);
return a;
@ -48,7 +52,13 @@ exports = {
var settings = exports.getSettings();
// set the alarm time
this.time = getNextAlarm(sched.getAlarms(), settings.filter_from * 36E5, settings.filter_to * 36E5, settings.filter_msg).t;
this.time = getNextAlarm(sched.getAlarms(), {
from: settings.filter_from * 36E5,
to: settings.filter_to * 36E5,
msg: settings.filter_msg,
lastTime: settings.lastTime,
lastDay: settings.lastDay
}).t;
// abort if no alarm time could be found inside range
if (!this.time) return;
@ -56,9 +66,6 @@ exports = {
// set widget width if not hidden
if (!this.hidden) this.width = 8;
// abort if already alarmed for this alarm
if ((sleeplog.trigger.sleeplogalarm || {}).last == this.time) return;
// insert sleeplogalarm conditions and function
sleeplog.trigger.sleeplogalarm = {
from: this.time - settings.earlier * 6E4,
@ -80,10 +87,13 @@ exports = {
var allAlarms = sched.getAlarms();
// find first active alarm
var alarm = getNextAlarm(sched.getAlarms(), settings.filter_from * 36E5, settings.filter_to * 36E5, settings.filter_msg, settings.disableOnAlarm);
// clear sleeplog.trigger object and set alarm time to prevent resetting for this alarm
sleeplog.trigger.sleeplogalarm = {last: alarm.t};
var alarm = getNextAlarm(sched.getAlarms(), {
from: settings.filter_from * 36E5,
to: settings.filter_to * 36E5,
msg: settings.filter_msg,
lastTime: settings.lastTime,
lastDay: settings.lastDay
}, settings.disableOnAlarm);
// return if no alarm is found
if (!alarm) return;
@ -118,6 +128,11 @@ exports = {
del: true
});
// save time of alarm and this day to prevent triggering for the same alarm again
settings.lastTime = alarm.t;
settings.lastDay = now.getDay();
require("Storage").writeJSON("sleeplogalarm.settings.json", settings);
// write changes
sched.setAlarms(allAlarms);