2022-10-30 14:30:10 +00:00
|
|
|
{
|
2024-11-10 17:08:19 +00:00
|
|
|
let loading = false;
|
|
|
|
let timeoutRef = null;
|
2023-05-17 19:54:35 +00:00
|
|
|
let settings = Object.assign(
|
|
|
|
require('Storage').readJSON("owmweather.default.json", true) || {},
|
|
|
|
require('Storage').readJSON("owmweather.json", true) || {}
|
|
|
|
);
|
2024-11-10 17:08:19 +00:00
|
|
|
|
|
|
|
let refreshMillis = function () {
|
2024-11-30 17:43:52 +00:00
|
|
|
return settings.refresh * 1000 * 60 + 1; // +1 <- leave some slack
|
|
|
|
};
|
2024-11-10 17:08:19 +00:00
|
|
|
|
|
|
|
let onCompleted = function () {
|
|
|
|
loading = false;
|
2023-05-17 20:05:08 +00:00
|
|
|
settings.updated = Date.now();
|
|
|
|
require('Storage').writeJSON("owmweather.json", settings);
|
2024-11-10 17:08:19 +00:00
|
|
|
if (timeoutRef) clearTimeout(timeoutRef);
|
2024-11-16 17:43:35 +00:00
|
|
|
timeoutRef = setTimeout(loadIfDueAndReschedule, refreshMillis());
|
2024-11-30 17:43:52 +00:00
|
|
|
};
|
2022-10-30 14:52:06 +00:00
|
|
|
|
2024-11-10 17:08:19 +00:00
|
|
|
let loadIfDueAndReschedule = function () {
|
|
|
|
// also check if the weather.json file has been updated (e.g. force refresh)
|
2022-07-02 13:24:11 +00:00
|
|
|
let weather = require("Storage").readJSON('weather.json') || {};
|
2024-11-10 17:08:19 +00:00
|
|
|
let lastWeatherUpdate = weather && weather.weather && weather.weather.time && weather.weather.time || 0;
|
|
|
|
if (lastWeatherUpdate > settings.updated) {
|
|
|
|
settings.updated = lastWeatherUpdate;
|
2022-07-02 13:24:11 +00:00
|
|
|
}
|
2024-11-10 17:08:19 +00:00
|
|
|
|
2024-11-16 17:43:35 +00:00
|
|
|
let MillisUntilDue = settings.updated + refreshMillis() - Date.now();
|
2024-11-30 17:43:52 +00:00
|
|
|
if (!MillisUntilDue || MillisUntilDue <= 0) {
|
2024-11-10 17:08:19 +00:00
|
|
|
if (!loading) {
|
|
|
|
loading = true;
|
|
|
|
require("owmweather").pull(onCompleted);
|
2022-07-02 21:27:02 +00:00
|
|
|
}
|
2024-11-10 17:08:19 +00:00
|
|
|
} else {
|
|
|
|
// called to early, reschedule
|
2024-11-30 17:43:52 +00:00
|
|
|
// console.log('Weather data is not due yet, rescheduling in ' + (MillisUntilDue || 0) + 'ms');
|
2024-11-10 17:08:19 +00:00
|
|
|
if (timeoutRef) clearTimeout(timeoutRef);
|
|
|
|
timeoutRef = setTimeout(loadIfDueAndReschedule, MillisUntilDue + 1);
|
|
|
|
}
|
2024-11-30 17:43:52 +00:00
|
|
|
};
|
2024-11-10 17:08:19 +00:00
|
|
|
|
|
|
|
if (settings.enabled) {
|
|
|
|
setTimeout(loadIfDueAndReschedule, 5000); // run 5 seconds after boot
|
|
|
|
NRF.on('connect', loadIfDueAndReschedule); // after reconnect, fetch the weather data right away if it's due
|
2022-06-16 15:23:02 +00:00
|
|
|
}
|
2024-11-10 17:08:19 +00:00
|
|
|
}
|