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