Allow for station data overrides #125

This commit is contained in:
Matt Walsh
2025-07-15 22:00:33 -05:00
parent 2db7f30de7
commit 7d50ce28bd
6 changed files with 16169 additions and 16139 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,19 @@
// station overrides are used to change the data for a station that is provided by the api
// the most common use is to adjust the city (station name) for formatting or to update an outdated name
// a complete station object looks like this:
// {
// "id": "KMCO", // 4-letter station identifier and key for lookups
// "city": "Orlando International Airport", // name displayed for this station
// "state": "FL", // state
// "lat": 28.41826, // latitude of station
// "lon": -81.32413 // longitude of station
// }
// any or all of the data for a station can be overwritten, follow the existing override patterns below
const overrides = {
KBJC: {
city: 'Rocky Mountain Metro',
},
};
export default overrides;

View File

@@ -5,6 +5,7 @@ import { writeFileSync } from 'fs';
import https from './https.mjs'; import https from './https.mjs';
import states from './stations-states.mjs'; import states from './stations-states.mjs';
import chunk from './chunk.mjs'; import chunk from './chunk.mjs';
import overrides from './stations-overrides.mjs';
// skip stations starting with these letters // skip stations starting with these letters
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'];
@@ -43,12 +44,16 @@ for (let i = 0; i < chunkStates.length; i += 1) {
console.log(`Duplicate station: ${state}-${id}`); console.log(`Duplicate station: ${state}-${id}`);
return; return;
} }
// get any overrides if available
const override = overrides[id] ?? {};
output[id] = { output[id] = {
id, id,
city: station.properties.name, city: station.properties.name,
state, state,
lat: station.geometry.coordinates[1], lat: station.geometry.coordinates[1],
lon: station.geometry.coordinates[0], lon: station.geometry.coordinates[0],
// finally add the overrides
...override,
}; };
}); });
next = stations?.pagination?.next; next = stations?.pagination?.next;
@@ -59,7 +64,7 @@ for (let i = 0; i < chunkStates.length; i += 1) {
while (next && stations.features.length > 0); while (next && stations.features.length > 0);
console.log(`Complete: ${state}`); console.log(`Complete: ${state}`);
return true; return true;
} catch (e) { } catch {
console.error(`Unable to get state: ${state}`); console.error(`Unable to get state: ${state}`);
return false; return false;
} }

View File

@@ -13350,6 +13350,13 @@ const StationInfo = {
lat: 38.7578, lat: 38.7578,
lon: -104.3013, lon: -104.3013,
}, },
KAEJ: {
id: 'KAEJ',
city: 'Central Colorado Regional Airport',
state: 'CO',
lat: 38.81416,
lon: -106.12069,
},
KAFF: { KAFF: {
id: 'KAFF', id: 'KAFF',
city: 'Air Force Academy', city: 'Air Force Academy',
@@ -13357,13 +13364,6 @@ const StationInfo = {
lat: 38.96667, lat: 38.96667,
lon: -104.81667, lon: -104.81667,
}, },
KAIB: {
id: 'KAIB',
city: 'Nucla Hopkins Field Airport',
state: 'CO',
lat: 38.23875,
lon: -108.563277,
},
KAJZ: { KAJZ: {
id: 'KAJZ', id: 'KAJZ',
city: 'Delta/Blake Field Airport', city: 'Delta/Blake Field Airport',
@@ -13415,7 +13415,7 @@ const StationInfo = {
}, },
KBJC: { KBJC: {
id: 'KBJC', id: 'KBJC',
city: 'Broomfield / Jeffco', city: 'Rocky Mountain Metro',
state: 'CO', state: 'CO',
lat: 39.90085, lat: 39.90085,
lon: -105.10417, lon: -105.10417,

View File

@@ -114,11 +114,14 @@ 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)
const location = (StationInfo[this.data.station.properties.stationIdentifier]?.city ?? locationCleanup(this.data.station.properties.name)).substr(0, 20);
const fill = { const fill = {
temp: this.data.Temperature + String.fromCharCode(176), temp: this.data.Temperature + String.fromCharCode(176),
condition, condition,
wind, wind,
location: locationCleanup(this.data.station.properties.name).substr(0, 20), location,
humidity: `${this.data.Humidity}%`, humidity: `${this.data.Humidity}%`,
dewpoint: this.data.DewPoint + String.fromCharCode(176), dewpoint: this.data.DewPoint + String.fromCharCode(176),
ceiling: (this.data.Ceiling === 0 ? 'Unlimited' : this.data.Ceiling + this.data.CeilingUnit), ceiling: (this.data.Ceiling === 0 ? 'Unlimited' : this.data.Ceiling + this.data.CeilingUnit),

View File

@@ -133,7 +133,10 @@ const baseScreens = [
// hazards // hazards
hazards, hazards,
// station name // station name
(data) => `Conditions at ${locationCleanup(data.station.properties.name).substr(0, 20)}`, (data) => {
const location = (StationInfo[data.station.properties.stationIdentifier]?.city ?? locationCleanup(data.station.properties.name)).substr(0, 20);
return `Conditions at ${location}`;
},
// temperature // temperature
(data) => { (data) => {