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])