Fixing 24 hour forecast

This commit is contained in:
2026-06-27 00:26:02 -04:00
parent 62d2c28039
commit 9e7afbd98c
4 changed files with 40 additions and 68 deletions

View File

@@ -1,8 +1,6 @@
import {queryHourly, getCoords, queryCurrent} from './sensors.mjs';
import {getCelestialCurrent} from './celestial.mjs';
import {getWeatherCondition} from './openweather.mjs';
import {localDateStr} from './config.mjs';
import {uvLabel} from './openmeteo.mjs';
export let lastForecast = { ts: 0, slots: [], summary: null }
export const forecastTTL = 5 * 60 * 60_000
@@ -118,16 +116,17 @@ export async function get24HourForecast(currentSensors) {
time.setMinutes(0, 0, 0);
const pressureDamping = Math.exp(-i * 0.08);
const pressure = seedPressure + pressureTrend * (i + 1) * pressureDamping;
const clouds = estimateClouds(seedHumidity + humidityTrend * i, pressureTrend);
const bgTemp = seedTemp + tempTrend * (i + 1);
const temperature = Math.round(bgTemp * 10) / 10;
const humidity = forecastHumidity(seedAbsHum, temperature);
const wind_speed = forecastWind(seedWind, pressureTrend);
const uv_index = estimateUV(celestial.sun_elevation ?? 0, clouds);
const pressure = seedPressure + pressureTrend * (i + 1) * pressureDamping;
const clouds = estimateClouds(seedHumidity + humidityTrend * i, pressureTrend);
const bgTemp = seedTemp + tempTrend * (i + 1);
const temperature = Math.round(bgTemp * 10) / 10;
const humidity = forecastHumidity(seedAbsHum, temperature);
const wind_speed = forecastWind(seedWind, pressureTrend);
const celestial = getCelestialCurrent(coords.latitude, coords.longitude, time);
const snapshot = {
const celestial = getCelestialCurrent(coords.latitude, coords.longitude, time); // ← move up
const uv_index = estimateUV(celestial.sun_elevation ?? 0, clouds); // ← now safe
return {
time,
temperature,
humidity,
@@ -140,12 +139,8 @@ export async function get24HourForecast(currentSensors) {
clouds,
precipitation_chance: Math.round(weather.precipChance * (1 - i * 0.02) * 100),
uv_index,
uv_index_label: uvLabel(uv_index),
...celestial
...celestial,
};
Object.assign(snapshot, getWeatherCondition(snapshot));
return snapshot;
});
for (const slot of slots) {
@@ -216,7 +211,6 @@ function summarise(slots) {
wind_speed: Math.round(Math.max(...winds) * 10) / 10,
wind_gusts: gusts.length ? Math.round(Math.max(...gusts) * 10) / 10 : null,
uv_index: uvs.length ? Math.max(...uvs) : null,
uv_index_label: dominant.uv_index_label ?? null,
solar_wm2: solar.length ? Math.round(solar.reduce((a, b) => a + b, 0) / solar.length * 10) / 10 : null,
sunrise: slots.find(s => s.sunrise)?.sunrise ?? null,
sunset: slots.find(s => s.sunset)?.sunset ?? null,
@@ -239,3 +233,28 @@ export async function getForecast() {
lastForecast = { ts: Date.now(), slots, summary: summarise(todaySlots) }
return lastForecast
}
export function getWeatherCondition(data) {
// Determine primary condition
if(data.lightning_rate > 0 && data.raining === 'True') {
return {label: 'Thunderstorm', icon: '11d'};
}
if(data.raining === 'True') {
if(data.precipitation > 7.6) return {label: 'Heavy Rain', icon: '10d'};
if(data.precipitation > 2.5) return {label: 'Moderate Rain', icon: '10d'};
return {label: 'Light Rain', icon: '09d'};
}
if(data.visibility < 10) {
return {label: 'Mist', icon: '50d'};
}
const dayNight = data.daytime ? 'd' : 'n';
if(data.clouds > 85) return {label: 'Overcast Clouds', icon: `04${dayNight}`};
if(data.clouds > 50) return {label: 'Broken Clouds', icon: `04${dayNight}`};
if(data.clouds > 25) return {label: 'Scattered Clouds', icon: `03${dayNight}`};
if(data.clouds > 10) return {label: 'Few Clouds', icon: `02${dayNight}`};
return {label: 'Clear Sky', icon: `01${dayNight}`};
}