150 lines
4.0 KiB
JavaScript
150 lines
4.0 KiB
JavaScript
const severeWarningEvents = ["Severe Thunderstorm Warning","Destructive Severe Thunderstorm Warning","Considerable Destructive Severe Thunderstorm Warning"]
|
|
const tornadoWarningEvents = ["Tornado Warning","Radar Indicated Tornado Warning","Confirmed Tornado Warning","Tornado Emergency"]
|
|
const tornadoWatchEvents = ["Tornado Watch"]
|
|
const severeThunderstormWatchEvents = ["Severe Thunderstorm Watch"]
|
|
const area = msg.area
|
|
const mqttTopic = "weather/alerts/" + area
|
|
const allTopic = mqttTopic + "/alerts"
|
|
const tstormTopic = mqttTopic + "/severe_thunderstorm_warning"
|
|
const tornadoWarnTopic = mqttTopic + "/tornado_warning"
|
|
const tornadoWatchTopic = mqttTopic + "/tornado_watch"
|
|
const severeThunderstormWatchTopic = mqttTopic + "/severe_thunderstorm_watch"
|
|
|
|
let alerts = msg.payload.features
|
|
let tornado_possible = false
|
|
let considerable_destructive = false
|
|
let confirmed = false
|
|
|
|
// Filter for Severe Thunderstorm Warnings
|
|
|
|
let ts = alerts.filter(function(alert) {
|
|
if (alert.properties &&
|
|
severeWarningEvents.includes(alert.properties.event)) {
|
|
return true
|
|
}
|
|
})
|
|
|
|
// Filter for Severe Thunderstorm Warnings with tornado detection
|
|
// that have a tornado possible parameter
|
|
|
|
let tstp = alerts.filter(function(alert) {
|
|
if (alert.properties &&
|
|
severeWarningEvents.includes(alert.properties.event) &&
|
|
alert.properties.parameters &&
|
|
alert.properties.parameters.tornadoDetection &&
|
|
alert.properties.parameters.tornadoDetection.length > 0) {
|
|
let tornadoPossible = alert.properties.parameters.tornadoDetection[0]
|
|
return tornadoPossible === "POSSIBLE"
|
|
}
|
|
})
|
|
|
|
if (tstp.length > 0) {
|
|
tornado_possible = true
|
|
}
|
|
|
|
// Filter for considerable destructive severe thunderstorm warnings
|
|
|
|
let cdst = alerts.filter(function(alert) {
|
|
if (alert.properties &&
|
|
alert.properties.event === "Considerable Destructive Severe Thunderstorm Warning") {
|
|
return true
|
|
}
|
|
})
|
|
|
|
if (cdst.length > 0) {
|
|
considerable_destructive = true
|
|
}
|
|
|
|
// Filter for Tornado Warnings
|
|
|
|
let tornado = alerts.filter(function(alert) {
|
|
if (alert.properties &&
|
|
tornadoWarningEvents.includes(alert.properties.event)) {
|
|
return true
|
|
}
|
|
})
|
|
|
|
let confirmed_tornado = alerts.filter(function(alert) {
|
|
if (alert.properties &&
|
|
alert.properties.event === "Confirmed Tornado Warning") {
|
|
return true
|
|
}
|
|
})
|
|
|
|
if (confirmed_tornado.length > 0) {
|
|
confirmed = true
|
|
}
|
|
|
|
// Filter for Tornado Watches
|
|
|
|
let tornado_watch = alerts.filter(function(alert) {
|
|
if (alert.properties &&
|
|
tornadoWatchEvents.includes(alert.properties.event)) {
|
|
return true
|
|
}
|
|
})
|
|
|
|
// Filter for Severe Thunderstorm Watches
|
|
|
|
let severe_thunderstorm_watch = alerts.filter(function(alert) {
|
|
if (alert.properties &&
|
|
severeThunderstormWatchEvents.includes(alert.properties.event)) {
|
|
return true
|
|
}
|
|
})
|
|
|
|
// If there are any alerts, return them
|
|
|
|
let allAlerts = {
|
|
"payload": msg.payload.features,
|
|
"topic": allTopic
|
|
}
|
|
|
|
let tstormMsg = {
|
|
"payload": {
|
|
"alerts": ts,
|
|
"count": ts.length,
|
|
"tornado_possible": tornado_possible,
|
|
"considerable_destructive": considerable_destructive
|
|
},
|
|
"topic": tstormTopic
|
|
}
|
|
|
|
let tornadoWarnMsg = {
|
|
"payload": {
|
|
"alerts": tornado,
|
|
"count": tornado.length,
|
|
"confirmed": confirmed
|
|
},
|
|
"topic": tornadoWarnTopic
|
|
}
|
|
|
|
let tornadoWatchMsg = {
|
|
"payload": {
|
|
"alerts": tornado_watch,
|
|
"count": tornado_watch.length
|
|
},
|
|
"topic": tornadoWatchTopic
|
|
}
|
|
|
|
let severeThunderstormWatchMsg = {
|
|
"payload": {
|
|
"alerts": severe_thunderstorm_watch,
|
|
"count": severe_thunderstorm_watch.length
|
|
},
|
|
"topic": severeThunderstormWatchTopic
|
|
}
|
|
|
|
// Create status message for node
|
|
|
|
let statusMsg = {
|
|
"status": {
|
|
"fill": "green",
|
|
"shape": "dot",
|
|
"text": `${alerts.length} alerts processed at ${new Date().toLocaleString()}`
|
|
}
|
|
}
|
|
|
|
// Send messages to output nodes
|
|
|
|
node.send([allAlerts,tstormMsg,tornadoWarnMsg,tornadoWatchMsg,severeThunderstormWatchMsg,statusMsg]) |