[sleeplogalarm] Add triger, widget code

master
storm64 2022-11-10 01:18:02 +01:00
parent ffa26233d8
commit 716b2e454a
2 changed files with 130 additions and 4 deletions

View File

@ -0,0 +1,75 @@
exports = function(now, tNow) {
// define settings
var settings = Object.assign({
from: 4, // 0400
to: 8, // 0800
earlier: 6E4 * 30,
msgAsPrefix: true,
disableOnAlarm: false, // !!! not available if alarm is at the next day
msg: "...\n",
vibrate: "..",
as: true
}, require("Storage").readJSON("sleeplogalarm.settings.json", true) || {});
// calculate then date
var then = new Date(now + settings.earlier);
// load library
var sched = require("sched");
// define function to return first active alarm in range to come
function firstActiveAlarm(allAlarms) {
return (sched.getActiveAlarms(allAlarms.filter(
// filter for active alarms, ...
a => a.on && !a.timer &&
// after now+10s and in alarm range
a.t > tNow && a.t >= settings.from * 36E5 && a.t <= settings.to * 36E5
), then) || []).sort((a, b) => a.t > b.t)[0];
}
// read all alarms
var allAlarms = sched.getAlarms();
// find first active alarm
var alarm = firstActiveAlarm(allAlarms);
// return if no alarm is found
if (!alarm) return;
// disable early triggered alarm if set and now and then on the same day
if (settings.disableOnAlarm && now.getDate() === then.getDate()) {
// add indexes to find alarm to temporary disable
allAlarms = allAlarms.map((a, idx) => {
a.idx = idx;
return a;
});
// get index of first active alarm
var idx = firstActiveAlarm(allAlarms).idx;
// set this alarms last to then
allAlarms[idx].last = then.getDate();
// 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,
t: (((now.getHours() * 60 + now.getMinutes()) * 60 + now.getSeconds()) * 1000),
dow: 127,
msg: settings.msg + (settings.msgAsPrefix ? alarm.msg || "" : ""),
vibrate: settings.vibrate || alarm.vibrate,
as: settings.as,
del: true
});
// write changes
sched.setAlarms(allAlarms);
// trigger sched.js
load("sched.js");
};

View File

@ -1,4 +1,55 @@
// sleeplog.status values:
// undefined = service stopped, 0 = unknown, 1 = not worn, 2 = awake, 3 = light sleep, 4 = deep sleep
// sleeplog.consecutive values:
// undefined = service stopped, 0 = unknown, 1 = no consecutive sleep, 2 = consecutive sleep
// check if sleeplog is available and any alarm is active
if (typeof (global.sleeplog || {}).onChange === "object" &&
(require("Storage").readJSON("sched.json", 1) || []).some(a => a.on && !a.timer)) {
// read settings to calculate alarm range
var settings = Object.assign({
enabled: true,
hide: false,
drawRange: true,
from: 4, // 0400
to: 8, // 0800
earlier: 6E4 * 30
}, require("Storage").readJSON("sleeplogalarm.settings.json", true) || {});
// abort if not enabled in settings
if (!settings.enabled) return;
// setup widget depending on settings
WIDGETS.sleeplogalarm = {
area: "tl",
width: 0,
from: settings.from,
to: settings.to,
earlier: settings.earlier,
draw: function() {
if (this.width) g.reset().setColor(1, 1, 0).drawImage(atob(""), this.x, this.y + this.width - 8);
if (this.width > 8) {
g.setFont().setFontAllign();
g.drwaString(this.from, this.x + 6, this.y);
g.drwaString(this.to, this.x + 18, this.y);
}
}
};
// set widget width and draw
WIDGETS.sleeplogalarm.width = settings.hide ? 0 : settings.drawRange ? 24 : 8;
WIDGETS.sleeplogalarm.draw();
// add sleeplogalarm function to onChange
sleeplog.onChange.push(function(data) {
// abort if not changed from deep sleep to light sleep or awake
if (data.prevStatus !== 4 || !(data.status === 3 || data.status === 2)) return;
// get now and calculate time of now
var now = new Date();
var tNow = (now.getHours() * 3600000) + (now.getMinutes() * 60000) + (now.getSeconds() * 1000);
// abort if now is outside the possible alarm range
if (tNow + WIDGETS.sleeplogalarm.earlier < WIDGETS.sleeplogalarm.from * 36E5 ||
tNow + WIDGETS.sleeplogalarm.earlier >= WIDGETS.sleeplogalarm.to * 36E5) return;
// execute trigger function
require("sleeplogalarm.trigger.js")(now, tNow);
});
}