Skip to content

Commit 5211884

Browse files
authored
Merge pull request espruino#3661 from devsnd/owmweather-refactor
owmweather 0.07: refactored owmweather, reload weather on NRF connect if due
2 parents 9421179 + da55ade commit 5211884

File tree

3 files changed

+36
-21
lines changed

3 files changed

+36
-21
lines changed

apps/owmweather/ChangeLog

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44
0.04: Minor code improvements
55
0.05: Upgrade OWM to One Call API 3.0. Add pressure to weather.json
66
0.06: Fix One Call API 3.0 not returning city names, which are required by the weather app
7+
0.07: Update weather after reconnecting bluetooth if update is due, refactor code

apps/owmweather/boot.js

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,47 @@
11
{
2-
let waiting = false;
2+
let loading = false;
3+
let timeoutRef = null;
34
let settings = Object.assign(
45
require('Storage').readJSON("owmweather.default.json", true) || {},
56
require('Storage').readJSON("owmweather.json", true) || {}
67
);
7-
8-
let completion = function(){
9-
waiting = false;
8+
9+
let refreshMillis = function () {
10+
return settings.refresh * 1000 * 60 + 1 // +1 <- leave some slack
11+
}
12+
13+
let onCompleted = function () {
14+
loading = false;
1015
settings.updated = Date.now();
1116
require('Storage').writeJSON("owmweather.json", settings);
17+
if (timeoutRef) clearTimeout(timeoutRef);
18+
timeoutRef = setTimeout(loadIfDueAndReschedule, refreshMillis());
1219
}
1320

14-
if (settings.enabled) {
21+
let loadIfDueAndReschedule = function () {
22+
// also check if the weather.json file has been updated (e.g. force refresh)
1523
let weather = require("Storage").readJSON('weather.json') || {};
16-
if (weather && weather.weather && weather.weather.time) lastUpdate = weather.weather.time;
17-
18-
if (!settings.updated || settings.updated + settings.refresh * 1000 * 60 < Date.now()){
19-
setTimeout(() => {
20-
if (!waiting){
21-
waiting = true;
22-
require("owmweather").pull(completion);
23-
}
24-
}, 5000);
24+
let lastWeatherUpdate = weather && weather.weather && weather.weather.time && weather.weather.time || 0;
25+
if (lastWeatherUpdate > settings.updated) {
26+
settings.updated = lastWeatherUpdate;
2527
}
26-
setInterval(() => {
27-
if (!waiting && NRF.getSecurityStatus().connected){
28-
waiting = true;
29-
require("owmweather").pull(completion);
28+
29+
let MillisUntilDue = settings.updated + refreshMillis() - Date.now();
30+
if (MillisUntilDue <= 0) {
31+
if (!loading) {
32+
loading = true;
33+
require("owmweather").pull(onCompleted);
3034
}
31-
}, settings.refresh * 1000 * 60);
35+
} else {
36+
// called to early, reschedule
37+
// console.log('Weather data is not due yet, rescheduling in ' + MillisUntilDue|0 + 'ms');
38+
if (timeoutRef) clearTimeout(timeoutRef);
39+
timeoutRef = setTimeout(loadIfDueAndReschedule, MillisUntilDue + 1);
40+
}
41+
}
42+
43+
if (settings.enabled) {
44+
setTimeout(loadIfDueAndReschedule, 5000); // run 5 seconds after boot
45+
NRF.on('connect', loadIfDueAndReschedule); // after reconnect, fetch the weather data right away if it's due
3246
}
33-
}
47+
}

apps/owmweather/metadata.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{ "id": "owmweather",
22
"name": "OpenWeatherMap weather provider",
33
"shortName":"OWM Weather",
4-
"version": "0.06",
4+
"version": "0.07",
55
"description": "Pulls weather from OpenWeatherMap (OWM) API",
66
"icon": "app.png",
77
"type": "bootloader",

0 commit comments

Comments
 (0)