diff --git a/cmd/ingestd/web/app.js b/cmd/ingestd/web/app.js index 7d17efb..2de0997 100644 --- a/cmd/ingestd/web/app.js +++ b/cmd/ingestd/web/app.js @@ -163,6 +163,13 @@ function computeRange(range, tz) { axisEnd = end; break; } + case "72h-last": { + end = now; + start = new Date(now.getTime() - 72 * 60 * 60 * 1000); + axisStart = start; + axisEnd = end; + break; + } case "72h": { end = startOfDay(now, tz); start = new Date(end.getTime() - 72 * 60 * 60 * 1000); @@ -170,6 +177,13 @@ function computeRange(range, tz) { axisEnd = end; break; } + case "7d-last": { + end = now; + start = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000); + axisStart = start; + axisEnd = end; + break; + } case "7d": { start = startOfWeekSunday(now, tz); end = new Date(start.getTime() + 7 * 24 * 60 * 60 * 1000); @@ -289,6 +303,58 @@ function updateText(id, text) { if (el) el.textContent = text; } +function describeBarometer(pressure, trend) { + if (pressure === null || pressure === undefined) { + return "No barometer data yet."; + } + + let pressureLabel = "normal"; + if (pressure <= 1000) { + pressureLabel = "very low"; + } else if (pressure < 1008) { + pressureLabel = "low"; + } else if (pressure >= 1024) { + pressureLabel = "high"; + } + + let trendLabel = "steady"; + if (trend !== null && trend !== undefined) { + if (trend <= -2.0) { + trendLabel = "falling fast"; + } else if (trend <= -0.5) { + trendLabel = "falling"; + } else if (trend >= 2.0) { + trendLabel = "rising fast"; + } else if (trend >= 0.5) { + trendLabel = "rising"; + } + } + + let outlook = "Stable; no strong rain signal."; + if (trend !== null && trend !== undefined) { + if (trend <= -1.0 && pressure <= 1008) { + outlook = "Unsettled; rain more likely."; + } else if (trend <= -1.0) { + outlook = "Unsettled; rain possible."; + } else if (trend >= 1.0 && pressure >= 1020) { + outlook = "Improving; rain less likely."; + } else if (trend >= 1.0) { + outlook = "Improving; rain chance easing."; + } + } else if (pressure <= 1005) { + outlook = "Low pressure; rain possible."; + } else if (pressure >= 1022) { + outlook = "Fair weather likely."; + } + + if (trend === null || trend === undefined) { + return `Pressure ${formatNumber(pressure, 1)} hPa (${pressureLabel}); trend unavailable. ${outlook}`; + } + + const trendText = `${trend >= 0 ? "+" : ""}${trend.toFixed(1)} hPa/hr`; + return `Pressure ${formatNumber(pressure, 1)} hPa (${pressureLabel}), ${trendLabel} (${trendText}). ${outlook}`; +} + function lastNonNull(points, key) { for (let i = points.length - 1; i >= 0; i -= 1) { const v = points[i][key]; @@ -461,6 +527,7 @@ function renderDashboard(data) { } else { updateText("live-rain-prob", "--"); } + updateText("baro-outlook", describeBarometer(latest ? latest.pressure_hpa : null, lastPressureTrend)); const obsTemps = obsFiltered.map((p) => p.temp_c); const obsWinds = obsFiltered.map((p) => p.wind_m_s); diff --git a/cmd/ingestd/web/index.html b/cmd/ingestd/web/index.html index fe4137c..e44386b 100644 --- a/cmd/ingestd/web/index.html +++ b/cmd/ingestd/web/index.html @@ -29,7 +29,9 @@ + +
@@ -97,6 +99,10 @@
Deviation Commentary
Waiting for forecast data...
+
+
Barometer Outlook
+
--
+
Observation Summary
--