diff --git a/index.html b/index.html
index 62b7218..50cae11 100644
--- a/index.html
+++ b/index.html
@@ -377,7 +377,7 @@ async function updateWeather() {
} catch(e) {}
}
updateWeather();
-setInterval(updateWeather, 1800000);
+setInterval(updateWeather, 86400000); // once per day
// === ROOM SENSORS (7pm - 8am only) ===
const sensorEl = document.getElementById('room-sensors');
diff --git a/server.js b/server.js
index 4e02660..866f714 100644
--- a/server.js
+++ b/server.js
@@ -101,7 +101,24 @@ let weatherCache = { data: null, ts: 0 };
const SEVERE_EVENTS = ['hurricane', 'tropical storm', 'tornado', 'severe thunderstorm', 'flash flood', 'storm surge', 'tsunami', 'extreme wind'];
app.get('/api/weather', async (req, res) => {
- if (weatherCache.data && Date.now() - weatherCache.ts < 1800000) {
+ // Refresh current temp from HA every request (cheap, local), forecast/NHC daily
+ const forecastFresh = weatherCache.data && Date.now() - weatherCache.ts < 86400000;
+ if (forecastFresh) {
+ // Just update current temp from HA
+ try {
+ const haData = await new Promise((resolve, reject) => {
+ const r = http.get(`${HA_URL}/api/states/sensor.air_temp`, {
+ headers: { 'Authorization': `Bearer ${HA_TOKEN}` }
+ }, (resp) => {
+ let body = '';
+ resp.on('data', c => body += c);
+ resp.on('end', () => { try { resolve(JSON.parse(body)); } catch(e) { reject(e); } });
+ });
+ r.on('error', reject);
+ r.setTimeout(3000, () => { r.destroy(); reject(new Error('timeout')); });
+ });
+ weatherCache.data.current = parseInt(haData.state);
+ } catch(e) {}
return res.json(weatherCache.data);
}
try {