From e1f16ea26629bccc83ba788163e31044c1a73fac Mon Sep 17 00:00:00 2001 From: Tom Wallroth Date: Sun, 10 Nov 2024 18:08:19 +0100 Subject: [PATCH] refactored owmweather, reload weather on NRF connect if due --- apps/owmweather/ChangeLog | 1 + apps/owmweather/boot.js | 58 +++++++++++++++++++++++------------ apps/owmweather/metadata.json | 2 +- 3 files changed, 40 insertions(+), 21 deletions(-) diff --git a/apps/owmweather/ChangeLog b/apps/owmweather/ChangeLog index ac8270fe9..0313f9d07 100644 --- a/apps/owmweather/ChangeLog +++ b/apps/owmweather/ChangeLog @@ -4,3 +4,4 @@ 0.04: Minor code improvements 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.07: Update weather after reconnecting bluetooth if update is due, refactor code \ No newline at end of file diff --git a/apps/owmweather/boot.js b/apps/owmweather/boot.js index 5ac32c55a..5b513f59a 100644 --- a/apps/owmweather/boot.js +++ b/apps/owmweather/boot.js @@ -1,33 +1,51 @@ { - let waiting = false; + let loading = false; + let timeoutRef = null; let settings = Object.assign( require('Storage').readJSON("owmweather.default.json", true) || {}, require('Storage').readJSON("owmweather.json", true) || {} ); - - let completion = function(){ - waiting = false; + + let refreshMillis = function () { + return settings.refresh * 1000 * 60 + } + + let nextDueDate = function () { + return settings.updated + refreshMillis() + 1 + } + + let onCompleted = function () { + loading = false; settings.updated = Date.now(); 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') || {}; - if (weather && weather.weather && weather.weather.time) lastUpdate = weather.weather.time; - - if (!settings.updated || settings.updated + settings.refresh * 1000 * 60 < Date.now()){ - setTimeout(() => { - if (!waiting){ - waiting = true; - require("owmweather").pull(completion); - } - }, 5000); + let lastWeatherUpdate = weather && weather.weather && weather.weather.time && weather.weather.time || 0; + if (lastWeatherUpdate > settings.updated) { + settings.updated = lastWeatherUpdate; } - setInterval(() => { - if (!waiting && NRF.getSecurityStatus().connected){ - waiting = true; - require("owmweather").pull(completion); + + let MillisUntilDue = nextDueDate() - Date.now(); + if (MillisUntilDue <= 0) { + 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 + } +} \ No newline at end of file diff --git a/apps/owmweather/metadata.json b/apps/owmweather/metadata.json index f20c5baca..7bf2e556b 100644 --- a/apps/owmweather/metadata.json +++ b/apps/owmweather/metadata.json @@ -1,7 +1,7 @@ { "id": "owmweather", "name": "OpenWeatherMap weather provider", "shortName":"OWM Weather", - "version": "0.06", + "version": "0.07", "description": "Pulls weather from OpenWeatherMap (OWM) API", "icon": "app.png", "type": "bootloader",