Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
8dd7771eee
|
|||
c63adaa68d
|
|||
3c092bf519
|
|||
19e0e35bf4
|
|||
b9a296d312
|
|||
503776de4a
|
|||
e37e4d7718
|
|||
2a5aa26e5c
|
|||
96c4918d76
|
@ -53,8 +53,7 @@ node.log("Kallen Bedroom: Decision Logic Complete")
|
|||||||
|
|
||||||
let sendFan = {
|
let sendFan = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "fan",
|
"action": "fan." + setFan,
|
||||||
"service": setFan,
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["fan.kallen_bedroom_fan"]
|
"entity_id": ["fan.kallen_bedroom_fan"]
|
||||||
},
|
},
|
||||||
@ -64,8 +63,7 @@ let sendFan = {
|
|||||||
|
|
||||||
let sendWhiteNoise = {
|
let sendWhiteNoise = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "input_boolean",
|
"action": "input_boolean." + setWhiteNoise,
|
||||||
"service": setWhiteNoise,
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["input_boolean.white_noise_kallen_bedroom"]
|
"entity_id": ["input_boolean.white_noise_kallen_bedroom"]
|
||||||
},
|
},
|
||||||
@ -75,8 +73,7 @@ let sendWhiteNoise = {
|
|||||||
|
|
||||||
let sendVolume = {
|
let sendVolume = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "media_player",
|
"action": "media_player.volume_set",
|
||||||
"service": "volume_set",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["media_player.kallen_bedroom_google_speaker"]
|
"entity_id": ["media_player.kallen_bedroom_google_speaker"]
|
||||||
},
|
},
|
||||||
@ -88,8 +85,7 @@ let sendVolume = {
|
|||||||
|
|
||||||
let sendLights = {
|
let sendLights = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "light",
|
"action": "light." + setLights,
|
||||||
"service": setLights,
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["light.kallen_bedroom_lights"]
|
"entity_id": ["light.kallen_bedroom_lights"]
|
||||||
},
|
},
|
||||||
@ -99,8 +95,7 @@ let sendLights = {
|
|||||||
|
|
||||||
let sendWake = {
|
let sendWake = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "input_boolean",
|
"action": "input_boolean." + setWake,
|
||||||
"service": setWake,
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["input_boolean.kallen_awake"]
|
"entity_id": ["input_boolean.kallen_awake"]
|
||||||
},
|
},
|
||||||
|
@ -12,8 +12,7 @@ let setFan = 'turn_off'
|
|||||||
|
|
||||||
let sendFan = {
|
let sendFan = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "fan",
|
"action": "fan." + setFan,
|
||||||
"service": setFan,
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["fan.master_bedroom_fan"]
|
"entity_id": ["fan.master_bedroom_fan"]
|
||||||
},
|
},
|
||||||
@ -23,8 +22,7 @@ let sendFan = {
|
|||||||
|
|
||||||
let sendHvac = {
|
let sendHvac = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "climate",
|
"action": "climate.set_hvac_mode",
|
||||||
"service": "set_hvac_mode",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["climate.master_bedroom_aircon"]
|
"entity_id": ["climate.master_bedroom_aircon"]
|
||||||
},
|
},
|
||||||
@ -36,8 +34,7 @@ let sendHvac = {
|
|||||||
|
|
||||||
let sendTemp = {
|
let sendTemp = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "climate",
|
"action": "climate.set_temperature",
|
||||||
"service": "set_temperature",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["climate.master_bedroom_aircon"]
|
"entity_id": ["climate.master_bedroom_aircon"]
|
||||||
},
|
},
|
||||||
@ -49,8 +46,7 @@ let sendTemp = {
|
|||||||
|
|
||||||
let sendEco = {
|
let sendEco = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "climate",
|
"action": "climate.set_preset_mode",
|
||||||
"service": "set_preset_mode",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["climate.master_bedroom_aircon"]
|
"entity_id": ["climate.master_bedroom_aircon"]
|
||||||
},
|
},
|
||||||
@ -62,8 +58,7 @@ let sendEco = {
|
|||||||
|
|
||||||
let sendAcFan = {
|
let sendAcFan = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "climate",
|
"action": "climate.set_fan_mode",
|
||||||
"service": "set_fan_mode",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["climate.master_bedroom_aircon"]
|
"entity_id": ["climate.master_bedroom_aircon"]
|
||||||
},
|
},
|
||||||
|
@ -183,8 +183,7 @@ node.log("Master Bedroom Climate: Decision Logic Complete")
|
|||||||
|
|
||||||
let sendFan = {
|
let sendFan = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "fan",
|
"action": "fan." + setFan,
|
||||||
"service": setFan,
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["fan.master_bedroom_fan"]
|
"entity_id": ["fan.master_bedroom_fan"]
|
||||||
},
|
},
|
||||||
@ -194,8 +193,7 @@ let sendFan = {
|
|||||||
|
|
||||||
let sendCool = {
|
let sendCool = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "input_boolean",
|
"action": "input_boolean." + setCool,
|
||||||
"service": setCool,
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["input_boolean.master_bedroom_cooling_on"]
|
"entity_id": ["input_boolean.master_bedroom_cooling_on"]
|
||||||
},
|
},
|
||||||
@ -205,8 +203,7 @@ let sendCool = {
|
|||||||
|
|
||||||
let sendSleep = {
|
let sendSleep = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "input_boolean",
|
"action": "input_boolean." + setSleep,
|
||||||
"service": setSleep,
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["input_boolean.master_bedroom_sleeping"]
|
"entity_id": ["input_boolean.master_bedroom_sleeping"]
|
||||||
},
|
},
|
||||||
@ -216,8 +213,7 @@ let sendSleep = {
|
|||||||
|
|
||||||
let sendPeople = {
|
let sendPeople = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "input_boolean",
|
"action": "input_boolean." + setPeople,
|
||||||
"service": setPeople,
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["input_boolean.tony_awake","input_boolean.tina_awake"]
|
"entity_id": ["input_boolean.tony_awake","input_boolean.tina_awake"]
|
||||||
},
|
},
|
||||||
@ -227,8 +223,7 @@ let sendPeople = {
|
|||||||
|
|
||||||
let sendDisplay = {
|
let sendDisplay = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "switch",
|
"action": "switch." + setDisplay,
|
||||||
"service": setDisplay,
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["switch.master_bedroom_aircon_display"]
|
"entity_id": ["switch.master_bedroom_aircon_display"]
|
||||||
},
|
},
|
||||||
@ -245,16 +240,14 @@ let notify = {
|
|||||||
|
|
||||||
let sendBriefing = {
|
let sendBriefing = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "script",
|
"action": "script." + setBriefing,
|
||||||
"service": setBriefing
|
|
||||||
},
|
},
|
||||||
"delay": setBriefingDelay
|
"delay": setBriefingDelay
|
||||||
}
|
}
|
||||||
|
|
||||||
let sendHvac = {
|
let sendHvac = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "climate",
|
"action": "climate.set_hvac_mode",
|
||||||
"service": "set_hvac_mode",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["climate.master_bedroom_aircon"]
|
"entity_id": ["climate.master_bedroom_aircon"]
|
||||||
},
|
},
|
||||||
@ -266,8 +259,7 @@ let sendHvac = {
|
|||||||
|
|
||||||
let sendTemp = {
|
let sendTemp = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "climate",
|
"action": "climate.set_temperature",
|
||||||
"service": "set_temperature",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["climate.master_bedroom_aircon"]
|
"entity_id": ["climate.master_bedroom_aircon"]
|
||||||
},
|
},
|
||||||
@ -279,8 +271,7 @@ let sendTemp = {
|
|||||||
|
|
||||||
let sendEco = {
|
let sendEco = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "climate",
|
"action": "climate.set_preset_mode",
|
||||||
"service": "set_preset_mode",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["climate.master_bedroom_aircon"]
|
"entity_id": ["climate.master_bedroom_aircon"]
|
||||||
},
|
},
|
||||||
@ -292,8 +283,7 @@ let sendEco = {
|
|||||||
|
|
||||||
let sendAcFan = {
|
let sendAcFan = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "climate",
|
"action": "climate.set_fan_mode",
|
||||||
"service": "set_fan_mode",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["climate.master_bedroom_aircon"]
|
"entity_id": ["climate.master_bedroom_aircon"]
|
||||||
},
|
},
|
||||||
@ -305,8 +295,7 @@ let sendAcFan = {
|
|||||||
|
|
||||||
let sendEchoDotDND = {
|
let sendEchoDotDND = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "switch",
|
"action": "switch." + echoDotService,
|
||||||
"service": echoDotService,
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["switch.basement_echo_dot_do_not_disturb_switch"]
|
"entity_id": ["switch.basement_echo_dot_do_not_disturb_switch"]
|
||||||
},
|
},
|
||||||
|
@ -68,8 +68,7 @@ if (payload === 'start') {
|
|||||||
// Prepare message payloads
|
// Prepare message payloads
|
||||||
let sendTimerStart = {
|
let sendTimerStart = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "timer",
|
"action": "timer.start",
|
||||||
"service": "start",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": timerEntity
|
"entity_id": timerEntity
|
||||||
},
|
},
|
||||||
@ -81,8 +80,7 @@ let sendTimerStart = {
|
|||||||
|
|
||||||
let sendTimerCancel = {
|
let sendTimerCancel = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "timer",
|
"action": "timer.cancel",
|
||||||
"service": "cancel",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": timerEntity
|
"entity_id": timerEntity
|
||||||
},
|
},
|
||||||
@ -92,8 +90,7 @@ let sendTimerCancel = {
|
|||||||
|
|
||||||
let sendBoolFinished = {
|
let sendBoolFinished = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "input_boolean",
|
"action": "input_boolean." + servFinished,
|
||||||
"service": servFinished,
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": boolFinished
|
"entity_id": boolFinished
|
||||||
},
|
},
|
||||||
@ -103,8 +100,7 @@ let sendBoolFinished = {
|
|||||||
|
|
||||||
let sendDateTimeFinished = {
|
let sendDateTimeFinished = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "input_datetime",
|
"action": "input_datetime.set_datetime",
|
||||||
"service": "set_datetime",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": dateTimeEntity
|
"entity_id": dateTimeEntity
|
||||||
},
|
},
|
||||||
|
@ -127,8 +127,7 @@ node.log("Time-based Automations: Decision Logic Complete")
|
|||||||
// ---------- Service Calls ----------
|
// ---------- Service Calls ----------
|
||||||
let sendLights = {
|
let sendLights = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "light",
|
"action": "light.turn_off",
|
||||||
"service": "turn_off",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": lightsOff
|
"entity_id": lightsOff
|
||||||
},
|
},
|
||||||
@ -138,8 +137,7 @@ let sendLights = {
|
|||||||
|
|
||||||
let sendSleepOff = {
|
let sendSleepOff = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "switch",
|
"action": "switch.turn_off",
|
||||||
"service": "turn_off",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": adaptiveSleep
|
"entity_id": adaptiveSleep
|
||||||
},
|
},
|
||||||
@ -149,8 +147,7 @@ let sendSleepOff = {
|
|||||||
|
|
||||||
let sendBooleanOff = {
|
let sendBooleanOff = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "input_boolean",
|
"action": "input_boolean.turn_off",
|
||||||
"service": "turn_off",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": booleanOff
|
"entity_id": booleanOff
|
||||||
},
|
},
|
||||||
@ -160,8 +157,7 @@ let sendBooleanOff = {
|
|||||||
|
|
||||||
let sendAdaptive = {
|
let sendAdaptive = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "switch",
|
"action": "switch.turn_" + setAdaptive,
|
||||||
"service": "turn_" + setAdaptive,
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": switchAdaptive
|
"entity_id": switchAdaptive
|
||||||
},
|
},
|
||||||
@ -171,8 +167,7 @@ let sendAdaptive = {
|
|||||||
|
|
||||||
let sendSceneResetMain = {
|
let sendSceneResetMain = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "input_text",
|
"action": "input_text.set_value",
|
||||||
"service": "set_value",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": selScenesMain
|
"entity_id": selScenesMain
|
||||||
},
|
},
|
||||||
@ -184,8 +179,7 @@ let sendSceneResetMain = {
|
|||||||
|
|
||||||
let sendSceneResetDesk = {
|
let sendSceneResetDesk = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "input_text",
|
"action": "input_text.set_value",
|
||||||
"service": "set_value",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": selScenesTinaDesk
|
"entity_id": selScenesTinaDesk
|
||||||
},
|
},
|
||||||
@ -197,8 +191,7 @@ let sendSceneResetDesk = {
|
|||||||
|
|
||||||
let sendHoliday = {
|
let sendHoliday = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "switch",
|
"action": "switch.turn_" + setHoliday,
|
||||||
"service": "turn_" + setHoliday,
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": switchHoliday
|
"entity_id": switchHoliday
|
||||||
},
|
},
|
||||||
@ -208,8 +201,7 @@ let sendHoliday = {
|
|||||||
|
|
||||||
let sendTimer = {
|
let sendTimer = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "timer",
|
"action": "timer.start",
|
||||||
"service": "start",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": timerEntity
|
"entity_id": timerEntity
|
||||||
},
|
},
|
||||||
@ -221,8 +213,7 @@ let sendTimer = {
|
|||||||
|
|
||||||
let sendTimerCancel = {
|
let sendTimerCancel = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "timer",
|
"action": "timer.cancel",
|
||||||
"service": "cancel",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": timerEntity
|
"entity_id": timerEntity
|
||||||
},
|
},
|
||||||
@ -232,8 +223,7 @@ let sendTimerCancel = {
|
|||||||
|
|
||||||
let sendNotifyPhone = {
|
let sendNotifyPhone = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "script",
|
"action": "script.text_notify",
|
||||||
"service": "text_notify",
|
|
||||||
"data": {
|
"data": {
|
||||||
"who": "all",
|
"who": "all",
|
||||||
"title": notifyTitle,
|
"title": notifyTitle,
|
||||||
@ -246,8 +236,7 @@ let sendNotifyPhone = {
|
|||||||
|
|
||||||
let sendNotifyTV = {
|
let sendNotifyTV = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "script",
|
"action": "script.tv_notify",
|
||||||
"service": "tv_notify",
|
|
||||||
"data": {
|
"data": {
|
||||||
"who": "all",
|
"who": "all",
|
||||||
"title": notifyTitle,
|
"title": notifyTitle,
|
||||||
@ -263,8 +252,7 @@ let sendNotifyTV = {
|
|||||||
|
|
||||||
let sendFirstFloorScene = {
|
let sendFirstFloorScene = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "script",
|
"action": "script.evening_on_first_floor",
|
||||||
"service": "evening_on_first_floor",
|
|
||||||
"data": {
|
"data": {
|
||||||
"sunset_lights": 1
|
"sunset_lights": 1
|
||||||
}
|
}
|
||||||
@ -273,8 +261,7 @@ let sendFirstFloorScene = {
|
|||||||
|
|
||||||
let sendSecondFloorScene = {
|
let sendSecondFloorScene = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "script",
|
"action": "script.evening_on_second_floor",
|
||||||
"service": "evening_on_second_floor",
|
|
||||||
"data": {
|
"data": {
|
||||||
"sunset_lights": 1
|
"sunset_lights": 1
|
||||||
}
|
}
|
||||||
@ -283,8 +270,7 @@ let sendSecondFloorScene = {
|
|||||||
|
|
||||||
let sendDeskScene = {
|
let sendDeskScene = {
|
||||||
"payload": {
|
"payload": {
|
||||||
"domain": "input_select",
|
"action": "input_select.select_option",
|
||||||
"service": "select_option",
|
|
||||||
"target": {
|
"target": {
|
||||||
"entity_id": ["input_select.tina_desk_scenes"]
|
"entity_id": ["input_select.tina_desk_scenes"]
|
||||||
},
|
},
|
||||||
|
74
weather/alerts_filter.js
Normal file
74
weather/alerts_filter.js
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
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"]
|
||||||
|
|
||||||
|
let alerts = msg.payload
|
||||||
|
|
||||||
|
// Filter for Severe Thunderstorm Warnings
|
||||||
|
|
||||||
|
let ts = alerts.filter(function(alert) {
|
||||||
|
if (alert.raw.properties &&
|
||||||
|
severeWarningEvents.includes(alert.raw.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.raw.properties &&
|
||||||
|
severeWarningEvents.includes(alert.raw.properties.event) &&
|
||||||
|
alert.raw.properties.parameters &&
|
||||||
|
alert.raw.properties.parameters.tornadoDetection &&
|
||||||
|
alert.raw.properties.parameters.tornadoDetection.length > 0) {
|
||||||
|
let tornadoPossible = alert.raw.properties.parameters.tornadoDetection[0]
|
||||||
|
return tornadoPossible === "POSSIBLE"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// Filter for considerable destructive severe thunderstorm warnings
|
||||||
|
|
||||||
|
let cdst = alerts.filter(function(alert) {
|
||||||
|
if (alert.raw.properties &&
|
||||||
|
alert.raw.properties.event === "Considerable Destructive Severe Thunderstorm Warning") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// Filter for Tornado Warnings
|
||||||
|
|
||||||
|
let tornado = alerts.filter(function(alert) {
|
||||||
|
if (alert.raw.properties &&
|
||||||
|
tornadoWarningEvents.includes(alert.raw.properties.event)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
let confirmed_tornado = alerts.filter(function(alert) {
|
||||||
|
if (alert.raw.properties &&
|
||||||
|
alert.raw.properties.event === "Confirmed Tornado Warning") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// If there are any alerts, return them
|
||||||
|
|
||||||
|
let tstormMsg = {
|
||||||
|
"payload": {
|
||||||
|
"alerts": ts,
|
||||||
|
"count": ts.length,
|
||||||
|
"tornado_possible": tstp.length,
|
||||||
|
"considerable_destructive": cdst.length
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let tornadoWarnMsg = {
|
||||||
|
"payload": {
|
||||||
|
"alerts": tornado,
|
||||||
|
"count": tornado.length,
|
||||||
|
"confirmed": confirmed_tornado.length
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
node.send([tstormMsg,tornadoWarnMsg])
|
||||||
|
node.status({fill:'green',shape:'dot',text:'Alerts Updated'})
|
148
weather/local_alerts.js
Normal file
148
weather/local_alerts.js
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
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 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
|
||||||
|
}
|
||||||
|
|
||||||
|
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])
|
Reference in New Issue
Block a user