From 94fa7db000d7824811c466a365fbd12cdc87a3dc Mon Sep 17 00:00:00 2001 From: James Date: Sat, 14 Feb 2026 03:51:59 -0500 Subject: [PATCH] Weather: forecast daily, current temp from HA on each request, sensor poll stays 5s for testing --- index.html | 2 +- server.js | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) 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 {