Files
HA-NerdFlows-Functions/climate/kallen/processing.js

163 lines
4.9 KiB
JavaScript

const states = global.get('homeassistant.homeAssistant.states')
const vacationMode = states['input_boolean.vacation_mode'].state
const overnight = states['input_boolean.kallen_overnight'].state
const kallenLoc = states['person.kallen_stork'].state
const dayVolume = states['input_number.kallen_bedroom_google_speaker_day_volume'].state
const nightVolume = states['input_number.kallen_bedroom_google_speaker_night_volume'].state
const brightness = states['switch.adaptive_lighting_kallen_bedroom'].attributes.brightness_pct
const fadeNight = states['input_number.wakeup_lights_fade_night'].state
const hotDay = states['input_boolean.hot_day'].state
const heatWarning = states['binary_sensor.heat_warning'].state
const fanState = states['fan.kallen_bedroom_fan'].state
const fanAvailable = fanState !== 'unavailable'
const fanSeparate = states['binary_sensor.kallen_fan_separate_schedule'].state
const schedMode = states['input_select.scheduled_climate_mode_kallen_bedroom'].state
const topic = msg.topic
const toggle = msg.toggle || ''
const roomName = 'Kallen Bedroom'
node.log("Kallen Bedroom: Constants Set")
let setFan = []
let setWhiteNoise = []
let setVolume = []
let setLights = []
let setWake = []
node.log(`${roomName}: Variables Defined`)
if (schedMode === 'White Noise') {
setFan = 'turn_off'
} else {
if (fanAvailable) {
if (toggle === 'off' && (hotDay === 'on' || heatWarning === 'on')) {
setFan = 'turn_on'
} else if ((toggle === 'on' || topic === 'kallen-fan') && schedMode === 'Fan') {
setFan = 'turn_on'
} else {
setFan = 'turn_off'
}
} else {
if (schedMode === 'Fan') {
node.log(`${roomName}: Fan is unavailable, forcing White Noise mode`)
}
setFan = 'turn_off'
}
}
if ((schedMode === 'White Noise' && toggle === 'on') || (schedMode === 'Fan' && !fanAvailable)) {
setWhiteNoise = 'turn_on'
} else if (topic === 'kallen-fan' && !fanAvailable && schedMode !== 'N/A') {
setWhiteNoise = 'turn_on'
} else {
setWhiteNoise = 'turn_off'
}
if (topic === 'boolean' && toggle === 'on') {
setVolume = parseFloat(nightVolume)
setLights = 'turn_on'
setWake = 'turn_off'
} else if (topic === 'boolean' && toggle === 'off') {
setVolume = parseFloat(dayVolume)
setWake = 'turn_on'
}
let fadeMult = fadeNight * 60
let fadeFinal = Math.round(fadeMult)
let brtFinal = Math.round(brightness)
node.log(`${roomName}: Decision Logic Complete`)
let sendFan = {
"payload": {
"action": `fan.${setFan}`,
"target": {
"entity_id": ["fan.kallen_bedroom_fan"]
},
"data": {}
}
}
let sendWhiteNoise = {
"payload": {
"action": `input_boolean.${setWhiteNoise}`,
"target": {
"entity_id": ["input_boolean.white_noise_kallen_bedroom"]
},
"data": {}
}
}
let sendVolume = {
"payload": {
"action": "media_player.volume_set",
"target": {
"entity_id": ["media_player.kallen_bedroom_google_speaker"]
},
"data": {
"volume_level": setVolume
}
}
}
let sendLights = {
"payload": {
"action": `light.${setLights}`,
"target": {
"entity_id": ["light.kallen_bedroom_lights"]
},
"data": {}
}
}
let sendWake = {
"payload": {
"action": `input_boolean.${setWake}`,
"target": {
"entity_id": ["input_boolean.kallen_awake"]
},
"data": {}
}
}
let wakeMsg = {
"brightness": brtFinal,
"fade": fadeFinal
}
let sleepMsg = {
"payload": "sleep"
}
node.log(`${roomName}: Message Payloads Defined`)
node.log(`----- ${roomName}: Set Parameters -----`)
node.log(`${roomName}: fanAvailable: ${fanAvailable}`)
node.log(`${roomName}: setFan: ${setFan}`)
node.log(`${roomName}: setWhiteNoise: ${setWhiteNoise}`)
node.log(`${roomName}: setVolume: ${setVolume}`)
node.log(`${roomName}: setLights: ${setLights}`)
node.log(`${roomName}: setWake: ${setWake}`)
node.log(`----- ${roomName}: End Parameters -----`)
if (vacationMode === 'off' && overnight === 'off' && kallenLoc === 'home') {
if (topic === 'kallen-fan' && fanSeparate === 'on') {
node.status({fill:"green",shape:"dot",text:"Fan"})
node.log(`${roomName}: Early Fan`)
node.send([null,[sendFan,sendWhiteNoise],null])
} else if (topic === 'boolean' && toggle === 'off') {
node.status({fill:"green",shape:"dot",text:"Wakeup"})
node.log(`${roomName}: Wake`)
node.send([wakeMsg,[sendFan,sendWhiteNoise,sendVolume,sendWake],null])
} else if (topic === 'boolean' && toggle === 'on') {
node.status({fill:"green",shape:"dot",text:"Sleep"})
node.log(`${roomName}: Sleep`)
node.send([null,[sendFan,sendWhiteNoise,sendVolume,sendLights,sendWake],sleepMsg])
}
} else {
node.status({fill:"red",shape:"ring",text:"Blocked"})
node.log(`${roomName}: Flow Blocked`)
}
node.log(`${roomName}: Processing Complete`)