// Set constants const states = global.get('homeassistant.homeAssistant.states') const occupied = states["binary_sensor.basement_occupied"].state const quiet = states["input_boolean.studio_quiet"].state const stateTinaDesk = states["light.tina_desk_lights"].state const stateLivingRoom = states["light.living_room_lights"].state const stateDiningRoom = states["light.dining_room_lamp"].state const stateStairwell = states["light.stairwell_led_strip"].state const stateBasement = states["light.basement_studio_lights"].state const adaptLivingRoom = states["switch.adaptive_lighting_living_room"].state const adaptDiningRoom = states["switch.adaptive_lighting_dining_room_lamp"].state const adaptBasement = states["switch.adaptive_lighting_basement_studio"].state const nightLivingRoom = states["switch.adaptive_lighting_sleep_mode_living_room"].state const nightDiningRoom = states["switch.adaptive_lighting_sleep_mode_dining_room_lamp"].state const nightBasement = states["switch.adaptive_lighting_sleep_mode_basement_studio"].state const currentSceneBasement = states["input_text.basement_studio_selected_scene"].state const currentSceneLivingRoom = states["input_text.living_room_selected_scene"].state const currentSceneTinaDesk = states["input_text.tina_desk_selected_scene"].state const currentSceneDiningRoom = states["input_text.dining_room_lamp_selected_scene"].state const effectBasement = msg.payload.event.basement const effectFirstFloor = msg.payload.event.first_floor const effectColor = msg.payload.event.color const effectDivide = msg.payload.event.divide const duration = msg.payload.event.duration const delay = duration * 1000 const adaptiveSwitchFirstFloor = flow.get("adaptiveFirstFloor", "diskCon") const adaptiveSwitchBasement = flow.get("adaptiveBasement", "diskCon") const lightsTinaDesk = flow.get('lightsTinaDesk', 'diskCon') const lightsBasement = flow.get('lightsBasement', 'diskCon') const lightsLivingRoom = flow.get('lightsLivingRoom', 'diskCon') const lightsDiningRoom = flow.get('lightsDiningRoom', 'diskCon') const alertFirstFloor = flow.get('alertFirstFloor') const alertBasement = flow.get('alertBasement') // Set flow contexts to be used later in the reset node flow.set("currentSceneBasement", currentSceneBasement) flow.set("currentSceneLivingRoom", currentSceneLivingRoom) flow.set("currentSceneTinaDesk", currentSceneTinaDesk) flow.set('currentSceneDiningRoom', currentSceneDiningRoom) flow.set("adaptLivingRoom", adaptLivingRoom) flow.set("adaptBasement", adaptBasement) flow.set("nightLivingRoom", nightLivingRoom) flow.set("nightBasement", nightBasement) flow.set('nightDiningRoom', nightDiningRoom) flow.set("stateTinaDesk", stateTinaDesk) flow.set("stateLivingRoom", stateLivingRoom) flow.set("stateDiningRoom", stateDiningRoom) flow.set("stateStairwell", stateStairwell) flow.set("stateBasement", stateBasement) // Define empty arrays for basement LED strip zones let basement1 = [] let basement2 = [] let basementFull = [] // Define empty arrays for living room LED strip zones let livingRoom1 = [] let livingRoom2 = [] let livingRoomFull = [] // Color names are set by default, however certain effects can override them below let colorName1 = effectColor let colorName2 = "white" // Define empty object for LIFX effect settings let lifxData = {} let effectLifx = msg.payload.event.lifx // Setup the proper zones to use for the effect if (effectDivide === 'half') { basement1 = flow.get("halfBasement1", "diskCon") basement2 = flow.get("halfBasement2", "diskCon") livingRoom1 = flow.get("halfLivingRoom1", "diskCon") livingRoom2 = flow.get("halfLivingRoom2", "diskCon") } else if (effectDivide === 'quarter') { basement1 = flow.get("effectSegBasement1", "diskCon") basement2 = flow.get("effectSegBasement2", "diskCon") livingRoom1 = flow.get("effectSegLivingRoom1", "diskCon") livingRoom2 = flow.get("effectSegLivingRoom2", "diskCon") } else if (effectDivide === 'full') { basementFull = flow.get("basementFull", "diskCon") livingRoomFull = flow.get("livingRoomFull", "diskCon") } if (effectFirstFloor === true) { flow.set('alertFirstFloor', true) } if (effectBasement === true) { flow.set('alertBasement', true) } // Set/change colors if necessary if (effectColor === 'police') { colorName1 = 'red' colorName2 = 'blue' } // Define parameters for different LIFX effects if (effectLifx === 'move') { lifxData = { "speed": 0.5, "direction": "right", "power_on": false } } else if (effectLifx === 'ping') { effectLifx = 'pulse' colorName2 = colorName1 lifxData = { "power_on": false, "mode": "ping", "period": 1, "cycles": duration, "color_name": "white", "brightness": 255 } } else if (effectLifx === 'blink') { effectLifx = 'pulse' colorName2 = colorName1 lifxData = { "power_on": false, "mode": "blink", "period": 0.5, "cycles": duration * 2, "color_name": "white", "brightness": 255 } } // Define messages let sendBasementStripFX = { "payload": { "domain": "lifx", "service": "effect_" + effectLifx, "target": { "entity_id": ["light.basement_led_strip_1"] }, "data": lifxData } } let sendBasementStrip1 = { "payload": { "domain": "lifx", "service": "set_state", "target": { "entity_id": ["light.basement_led_strip_1"] }, "data": { "zones": basement1, "color_name": colorName1, "brightness": 255 } } } let sendBasementStrip2 = { "payload": { "domain": "lifx", "service": "set_state", "target": { "entity_id": ["light.basement_led_strip_1"] }, "data": { "zones": basement2, "color_name": colorName2, "brightness": 255, "power": true } } } let sendBasementLights = { "payload": { "domain": "light", "service": "turn_on", "target": { "entity_id": [ "light.basement_tall_lamp", "light.basement_short_lamp", "light.basement_stairwell" ] }, "data": { "color_name": colorName1, "brightness": 255 } } } let sendLivingRoomStripFX = { "payload": { "domain": "lifx", "service": "effect_" + effectLifx, "target": { "entity_id": ["light.living_room_led_strip"] }, "data": lifxData } } let sendLivingRoomStrip1 = { "payload": { "domain": "lifx", "service": "set_state", "target": { "entity_id": ["light.living_room_led_strip"] }, "data": { "zones": livingRoom1, "color_name": colorName1, "brightness": 255 } } } let sendLivingRoomStrip2 = { "payload": { "domain": "lifx", "service": "set_state", "target": { "entity_id": ["light.living_room_led_strip"] }, "data": { "zones": livingRoom2, "color_name": colorName2, "brightness": 255, "power": true } } } let sendLivingRoomLights = { "payload": { "domain": "light", "service": "turn_on", "target": { "entity_id": [ "light.living_room_color_1", "light.living_room_color_2", "light.living_room_color_3", "light.stairwell_led_strip" ] }, "data": { "color_name": colorName1, "brightness": 255 } } } let sendTinaDeskLights = { "payload": { "domain": "light", "service": "turn_on", "target": { "entity_id": ["light.tina_desk_lights"] }, "data": { "color_name": colorName1, "brightness": 255 } } } let sendDiningRoomLamp = { "payload": { "domain": "light", "service": "turn_off", "target": { "entity_id": ["light.dining_room_lamp"] }, "data": {} } } let sendAdaptiveFirstFloor = { "payload": { "domain": "switch", "service": "turn_off", "target": { "entity_id": adaptiveSwitchFirstFloor }, "data": {} } } let sendAdaptiveBasement = { "payload": { "domain": "switch", "service": "turn_off", "target": { "entity_id": adaptiveSwitchBasement }, "data": {} } } let backupLivingRoom = { "payload": { "domain": "scene", "service": "create", "data": { "scene_id": "living_room_alert_restore", "snapshot_entities": lightsLivingRoom } } } let backupTinaDesk = { "payload": { "domain": "scene", "service": "create", "data": { "scene_id": "tina_desk_alert_restore", "snapshot_entities": lightsTinaDesk } } } let backupBasement = { "payload": { "domain": "scene", "service": "create", "data": { "scene_id": "basement_alert_restore", "snapshot_entities": lightsBasement } } } let sendReset = { "delay": delay } let sendDebug = { "topic": "debug", "colorName1": colorName1, "colorName2": colorName2, "lifxData": lifxData, "effectLifx": effectLifx, "basement1": basement1, "basement2": basement2 } // Send backup messages if (stateLivingRoom === 'on' && alertFirstFloor === false) { node.send([backupLivingRoom,null,null,null,null,null]) } if (stateTinaDesk === 'on' && alertFirstFloor === false) { node.send([backupTinaDesk,null,null,null,null,null]) } if (stateBasement === 'on' && alertBasement === false) { node.send([backupBasement,null,null,null,null,null]) } // Send effect messages if (effectBasement === true) { node.send([null,null,null,null,[sendAdaptiveBasement,sendBasementLights,sendBasementStripFX,sendBasementStrip1,sendBasementStrip2,sendDebug],null]) } if (effectFirstFloor === true) { node.send([null,[sendAdaptiveFirstFloor,sendLivingRoomLights,sendLivingRoomStripFX,sendLivingRoomStrip1,sendLivingRoomStrip2],sendTinaDeskLights,sendDiningRoomLamp,null,null]) } // Send the reset message to start the timer node.send([null,null,null,null,null,sendReset]) node.status({fill:'green',shape:'dot',text:'Alert Sent'})