9 Commits

7 changed files with 261 additions and 78 deletions

View File

@ -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"]
}, },

View File

@ -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"]
}, },

View File

@ -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"]
}, },

View File

@ -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
}, },

View File

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