1
0
Fork 0

refactored owmweather, reload weather on NRF connect if due

master
Tom Wallroth 2024-11-10 18:08:19 +01:00
parent d18c0d2fd3
commit e1f16ea266
3 changed files with 40 additions and 21 deletions

View File

@ -4,3 +4,4 @@
0.04: Minor code improvements 0.04: Minor code improvements
0.05: Upgrade OWM to One Call API 3.0. Add pressure to weather.json 0.05: Upgrade OWM to One Call API 3.0. Add pressure to weather.json
0.06: Fix One Call API 3.0 not returning city names, which are required by the weather app 0.06: Fix One Call API 3.0 not returning city names, which are required by the weather app
0.07: Update weather after reconnecting bluetooth if update is due, refactor code

View File

@ -1,33 +1,51 @@
{ {
let waiting = false; let loading = false;
let timeoutRef = null;
let settings = Object.assign( let settings = Object.assign(
require('Storage').readJSON("owmweather.default.json", true) || {}, require('Storage').readJSON("owmweather.default.json", true) || {},
require('Storage').readJSON("owmweather.json", true) || {} require('Storage').readJSON("owmweather.json", true) || {}
); );
let completion = function(){ let refreshMillis = function () {
waiting = false; return settings.refresh * 1000 * 60
}
let nextDueDate = function () {
return settings.updated + refreshMillis() + 1
}
let onCompleted = function () {
loading = false;
settings.updated = Date.now(); settings.updated = Date.now();
require('Storage').writeJSON("owmweather.json", settings); require('Storage').writeJSON("owmweather.json", settings);
if (timeoutRef) clearTimeout(timeoutRef);
timeoutRef = setTimeout(loadIfDueAndReschedule, refreshMillis() + 1);
} }
if (settings.enabled) { let loadIfDueAndReschedule = function () {
// also check if the weather.json file has been updated (e.g. force refresh)
let weather = require("Storage").readJSON('weather.json') || {}; let weather = require("Storage").readJSON('weather.json') || {};
if (weather && weather.weather && weather.weather.time) lastUpdate = weather.weather.time; let lastWeatherUpdate = weather && weather.weather && weather.weather.time && weather.weather.time || 0;
if (lastWeatherUpdate > settings.updated) {
if (!settings.updated || settings.updated + settings.refresh * 1000 * 60 < Date.now()){ settings.updated = lastWeatherUpdate;
setTimeout(() => {
if (!waiting){
waiting = true;
require("owmweather").pull(completion);
}
}, 5000);
} }
setInterval(() => {
if (!waiting && NRF.getSecurityStatus().connected){ let MillisUntilDue = nextDueDate() - Date.now();
waiting = true; if (MillisUntilDue <= 0) {
require("owmweather").pull(completion); if (!loading) {
loading = true;
require("owmweather").pull(onCompleted);
} }
}, settings.refresh * 1000 * 60); } else {
// called to early, reschedule
// console.log('Weather data is not due yet, rescheduling in ' + MillisUntilDue|0 + 'ms');
if (timeoutRef) clearTimeout(timeoutRef);
timeoutRef = setTimeout(loadIfDueAndReschedule, MillisUntilDue + 1);
}
} }
}
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
}
}

View File

@ -1,7 +1,7 @@
{ "id": "owmweather", { "id": "owmweather",
"name": "OpenWeatherMap weather provider", "name": "OpenWeatherMap weather provider",
"shortName":"OWM Weather", "shortName":"OWM Weather",
"version": "0.06", "version": "0.07",
"description": "Pulls weather from OpenWeatherMap (OWM) API", "description": "Pulls weather from OpenWeatherMap (OWM) API",
"icon": "app.png", "icon": "app.png",
"type": "bootloader", "type": "bootloader",