UNPKG

barometer-trend

Version:

Calculate the tendency, trend and weather predictions of barometric pressure

85 lines (67 loc) 2.18 kB
const utils = require('./utils'); const TENDENCY = { RISING: { key: 'RISING' }, FALLING: { key: 'FALLING' } }; const TREND = { STEADY: { key: 'STEADY', severity: 0 }, SLOWLY: { key: 'SLOWLY', severity: 1 }, CHANGING: { key: 'CHANGING', severity: 2 }, QUICKLY: { key: 'QUICKLY', severity: 3 }, RAPIDLY: { key: 'RAPIDLY', severity: 4 } }; const THRESHOLDS_RATIO = [ { pascal: 0.056, trend: TREND.STEADY }, //up to 10 Pa per 3 hours { pascal: 0.89, trend: TREND.SLOWLY }, //10-160 Pa per 3 hours { pascal: 2, trend: TREND.CHANGING }, //160-360 Pa per 3 hours { pascal: 3.33, trend: TREND.QUICKLY }, //360-600 Pa per 3 hours { pascal: 9999, trend: TREND.RAPIDLY } ]; function ascendingNumbers(a, b) { return a - b; } function getSeverityNotion(severity, tendency) { if(severity === 0) return severity; return tendency === TENDENCY.RISING ? severity : -severity; } function calculate(pressures, from) { if (pressures.length < 2) return null; let subsetOfPressures = utils.getPressuresSince(pressures, from); if (subsetOfPressures.length >= 2) { let earlier = subsetOfPressures[0]; let later = subsetOfPressures[subsetOfPressures.length - 1]; let difference = later.value - earlier.value; let ratio = difference / from; let tendency = difference >= 0 ? TENDENCY.RISING : TENDENCY.FALLING; let threshold = THRESHOLDS_RATIO.sort(ascendingNumbers).find((t) => Math.abs(ratio) < t.pascal); return { tendency: tendency.key, trend: threshold.trend.key, from: earlier, to: later, difference: difference, ratio: Math.abs(ratio), period: Math.abs(from), severity: getSeverityNotion(threshold.trend.severity, tendency), } } return null; } function compareSeverity(earlier, later) { if (earlier !== null && later !== null && earlier.severity > later.severity) { return earlier; } return later; } function getTrend(pressures) { let threeHours = calculate(pressures, -utils.MINUTES.THREE_HOURS); let oneHour = calculate(pressures, -utils.MINUTES.ONE_HOUR); let actual = threeHours; actual = compareSeverity(oneHour, actual); return actual; } module.exports = { getTrend, TENDENCY, TREND }