enhance current weather, latest observations #188 #196 #193 #194

This commit is contained in:
Matt Walsh
2026-04-07 13:50:37 -05:00
parent e70639d7a6
commit 38cdb46c85
10 changed files with 85 additions and 10 deletions

View File

@@ -14,6 +14,7 @@ import {
import { debugFlag } from './utils/debug.mjs'; import { debugFlag } from './utils/debug.mjs';
import { isDataStale, enhanceObservationWithMapClick } from './utils/mapclick.mjs'; import { isDataStale, enhanceObservationWithMapClick } from './utils/mapclick.mjs';
import { DateTime } from '../vendor/auto/luxon.mjs'; import { DateTime } from '../vendor/auto/luxon.mjs';
import settings from './settings.mjs';
// some stations prefixed do not provide all the necessary data // some stations prefixed do not provide all the necessary data
const skipStations = ['U', 'C', 'H', 'W', 'Y', 'T', 'S', 'M', 'O', 'L', 'A', 'F', 'B', 'N', 'V', 'R', 'D', 'E', 'I', 'G', 'J']; const skipStations = ['U', 'C', 'H', 'W', 'Y', 'T', 'S', 'M', 'O', 'L', 'A', 'F', 'B', 'N', 'V', 'R', 'D', 'E', 'I', 'G', 'J'];
@@ -192,7 +193,9 @@ class CurrentWeather extends WeatherDisplay {
const wind = (typeof this.data.WindSpeed === 'number') ? this.data.WindDirection.padEnd(3, '') + this.data.WindSpeed.toString().padStart(3, ' ') : this.data.WindSpeed; const wind = (typeof this.data.WindSpeed === 'number') ? this.data.WindDirection.padEnd(3, '') + this.data.WindSpeed.toString().padStart(3, ' ') : this.data.WindSpeed;
// get location (city name) from StationInfo if available (allows for overrides) // get location (city name) from StationInfo if available (allows for overrides)
const location = (StationInfo[this.data.station.properties.stationIdentifier]?.city ?? locationCleanup(this.data.station.properties.name)).substr(0, 20); // longer name allowed if in wide-enhanced
const locationLimit = (settings.wide?.value && settings.enhancedScreens?.value) ? 25 : 20;
const location = (StationInfo[this.data.station.properties.stationIdentifier]?.city ?? locationCleanup(this.data.station.properties.name)).substr(0, locationLimit);
const fill = { const fill = {
temp: this.data.Temperature + String.fromCharCode(176), temp: this.data.Temperature + String.fromCharCode(176),

View File

@@ -159,12 +159,17 @@ class LatestObservations extends WeatherDisplay {
const windDirection = directionToNSEW(condition.windDirection.value); const windDirection = directionToNSEW(condition.windDirection.value);
const Temperature = temperatureConverter(condition.temperature.value); const Temperature = temperatureConverter(condition.temperature.value);
const Like = likeTemperature(condition.heatIndex?.value, condition.windChill?.value, Temperature, temperatureConverter);
const WindSpeed = windConverter(condition.windSpeed.value); const WindSpeed = windConverter(condition.windSpeed.value);
const locationLimit = (settings.wide?.value && settings.enhancedScreens?.value) ? 20 : 14;
const weatherLimit = (settings.wide?.value && settings.enhancedScreens?.value) ? 10 : 9;
const fill = { const fill = {
location: locationCleanup(condition.city).substr(0, 14), location: locationCleanup(condition.city).substr(0, locationLimit),
temp: Temperature, temp: Temperature,
weather: shortenCurrentConditions(condition.textDescription).substr(0, 9), like: Like.value,
weather: shortenCurrentConditions(condition.textDescription).substr(0, weatherLimit),
}; };
if (WindSpeed > 0) { if (WindSpeed > 0) {
@@ -175,7 +180,12 @@ class LatestObservations extends WeatherDisplay {
fill.wind = 'Calm'; fill.wind = 'Calm';
} }
return this.fillTemplate('observation-row', fill); const filledRow = this.fillTemplate('observation-row', fill);
// add the feels like class
filledRow.querySelector('.like').classList.add(Like.cssClass);
return filledRow;
}); });
const linesContainer = this.elem.querySelector('.observation-lines'); const linesContainer = this.elem.querySelector('.observation-lines');
@@ -186,6 +196,25 @@ class LatestObservations extends WeatherDisplay {
} }
} }
// generate a "feels like" temperature from heat index and wind chill.
const likeTemperature = (heat, wind, actual, converter) => {
// figure out the feels like value
let value = '';
if (heat) value = converter(heat);
if (wind) value = converter(wind);
// determine if there's a red/blue color class to add
let cssClass;
if (value !== '') {
if (value > actual) cssClass = 'heat-index';
if (value < actual) cssClass = 'wind-chill';
}
return {
value,
cssClass,
};
};
const shortenCurrentConditions = (_condition) => { const shortenCurrentConditions = (_condition) => {
let condition = _condition; let condition = _condition;
condition = condition.replace(/Light/, 'L'); condition = condition.replace(/Light/, 'L');

View File

@@ -14,6 +14,12 @@
padding-top: 10px; padding-top: 10px;
position: absolute; position: absolute;
.wide.enhanced & {
width: 300px;
margin-left: 25px;
margin-right: 25px;
}
@include u.text-shadow(); @include u.text-shadow();
&.left { &.left {

View File

@@ -84,11 +84,11 @@
left: 425px; left: 425px;
&.heat-index { &.heat-index {
color: #e00; color: c.$heat-index;
} }
&.wind-chill { &.wind-chill {
color: c.$extended-low; color: c.$wind-chill;
} }
} }

View File

@@ -46,6 +46,39 @@
left: 430px; left: 430px;
} }
.like {
display: none;
}
// wide and enhanced moves the columns and enables the like column
.wide.enhanced & {
.temp {
left: 320px;
}
.like {
left: 380px;
display: block;
&.heat-index {
color: c.$heat-index;
}
&.wind-chill {
color: c.$wind-chill;
}
}
.weather {
left: 470px;
}
.wind {
left: 630px;
}
}
.observation-lines { .observation-lines {
min-height: 338px; min-height: 338px;
padding-top: 10px; padding-top: 10px;

View File

@@ -13,5 +13,7 @@ $gradient-loading-3: #4f99f9;
$gradient-loading-4: #8ffdfa; $gradient-loading-4: #8ffdfa;
$extended-low: #8080FF; $extended-low: #8080FF;
$wind-chill: #8080FF;
$heat-index: #e00;
$blue-box: #26235a; $blue-box: #26235a;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
<%- include('header.ejs', {titleDual:{ top: 'Current' , bottom: 'Conditions' }, noaaLogo: true, hasTime: true}) %> <%- include('header.ejs', {titleDual:{ top: 'Current' , bottom: 'Conditions' }, noaaLogo: true, hasTime: true}) %>
<div class="main has-scroll has-box current-weather"> <div class="main has-scroll has-box current-weather can-enhance">
<div class="weather template"> <div class="weather template">
<div class="left col"> <div class="left col">
<div class="temp center"></div> <div class="temp center"></div>

View File

@@ -1,9 +1,10 @@
<%- include('header.ejs', {titleDual:{ top: 'Latest' , bottom: 'Observations' }, noaaLogo: true, hasTime: true }) %> <%- include('header.ejs', {titleDual:{ top: 'Latest' , bottom: 'Observations' }, noaaLogo: true, hasTime: true }) %>
<div class="main has-scroll latest-observations has-box"> <div class="main has-scroll latest-observations has-box can-enhance">
<div class="container"> <div class="container">
<div class="column-headers"> <div class="column-headers">
<div class="temp english">&deg;F</div> <div class="temp english">&deg;F</div>
<div class="temp metric">&deg;C</div> <div class="temp metric">&deg;C</div>
<div class="like">Like</div>
<div class="weather">Weather</div> <div class="weather">Weather</div>
<div class="wind">Wind</div> <div class="wind">Wind</div>
</div> </div>
@@ -11,6 +12,7 @@
<div class="observation-row template"> <div class="observation-row template">
<div class="location"></div> <div class="location"></div>
<div class="temp"></div> <div class="temp"></div>
<div class="like"></div>
<div class="weather"></div> <div class="weather"></div>
<div class="wind"></div> <div class="wind"></div>
</div> </div>