From 179d6e865fb3caff8565b14f339816dd705dd0da Mon Sep 17 00:00:00 2001 From: Tony Stork Date: Wed, 23 Apr 2025 22:55:37 -0400 Subject: [PATCH] Standardize some entity constants naming --- flows.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flows.json b/flows.json index 0888d7a..585481e 100644 --- a/flows.json +++ b/flows.json @@ -21921,7 +21921,7 @@ "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Processing", - "func": "node.log(\"Master Bedroom Climate: Processing Started\")\n// pull in the necessary information\n\nconst states = global.get('homeassistant.homeAssistant.states')\nconst allowed = states['input_boolean.master_bedroom_climate_protocol'].state\nconst ac = global.get('masterBedroom.aircon.installed', \"diskCon\")\nconst temp = global.get(\"outdoorTemp.tempStr\")\nconst payload = msg.payload\nconst vacation = states['input_boolean.vacation_mode'].state\nconst dayTemp = states['input_number.master_bedroom_daytime_temp'].state\nconst nightTemp = states['input_number.master_bedroom_night_temp'].state\nconst bedTemp = states['input_number.master_bedroom_bedtime_temp'].state\nconst showerMode = states['input_boolean.shower_mode'].state\nconst nightVolume = states['input_number.master_bedroom_echo_dot_night_volume'].state\nconst fanMode = states['input_select.scheduled_climate_mode_master_bedroom_fan'].state\nconst acMode = states['input_select.scheduled_climate_mode_master_bedroom_aircon'].state\nconst sleeping = states['input_boolean.master_bedroom_sleeping'].state\nconst hotDay = states['input_boolean.hot_day'].state\nconst heatWarning = states[\"binary_sensor.heat_warning\"].state\nconst showerCooldown = states[\"timer.shower_mode_cooldown\"].state\nconst earlyNight = states[\"binary_sensor.early_night_mode\"].state\nconst danger = states['binary_sensor.heat_warning'].attributes.danger\nconst meltdown = states['input_boolean.meltdown_protocol'].state\nconst coolingActive = states['input_boolean.master_bedroom_cooling_on'].state\nconst echoDotDND = 'switch.basement_echo_dot_do_not_disturb_switch'\nnode.log(\"Master Bedroom Climate: Constants Set\")\n\n// Define some entity IDs\n\nconst masterBedroomAircon = [\"climate.master_bedroom_aircon\"]\nconst masterBedroomFan = [\"fan.master_bedroom_fan\"]\nconst peopleIDs = [\"input_boolean.tony_awake\", \"input_boolean.tina_awake\"]\n\n// Helper function to convert a string to title case\n\nfunction convertToTitleCase(str) {\n if (!str) {\n return \"\";\n }\n return str.toLowerCase().replace(/\\b\\w/g, (s) => s.toUpperCase());\n}\n\n// init variables\n\nlet setTemp = []\nlet setEco = []\nlet setHvac = []\nlet setFan = []\nlet setCool = []\nlet setSleep = []\nlet setPeople = []\nlet setDisplay = []\nlet time = []\nlet echoDotService = []\nlet setBriefing = []\nlet setBriefingDelay = []\nlet type = msg.type\nlet topic = msg.topic\nlet isWakeup = context.get(\"isWakeup\")\nnode.log(\"Master Bedroom Climate: Variables Defined\")\n\n// Sleep Switch Handling\nif (type === 'sleep' && payload === 'off') {\n setDisplay = 'turn_on'\n echoDotService = 'turn_off'\n setPeople = 'turn_on'\n if (coolingActive === 'on') {\n time = 'night'\n } else {\n time = 'day'\n }\n} else if (type === 'sleep' && payload === 'on') {\n setDisplay = 'turn_off'\n echoDotService = 'turn_on'\n time = 'bedtime'\n} else {\n time = msg.time\n}\n\nif (topic === 'mrbedroom-wakeup') {\n setSleep = 'turn_off'\n}\n\n// Setup TTS briefing\nif (topic === 'mrbedroom-wakeup') {\n setBriefing = \"master_bedroom_wakeup_briefing\"\n setBriefingDelay = 60000\n} else if (type === 'sleep' && payload === 'off') {\n setBriefing = \"master_bedroom_wakeup_briefing\"\n setBriefingDelay = 15000\n}\n\n// Day Time\nif (time === 'day') {\n if (type === 'auto') {\n setCool = 'turn_off'\n }\n if (earlyNight === 'off') {\n setFan = \"turn_off\"\n if (ac === 'on') {\n if (danger === 'Extreme') {\n setTemp = nightTemp\n setEco = \"turn_on\"\n setHvac = \"cool\"\n } else if (hotDay === 'on' || heatWarning === 'on') {\n setTemp = dayTemp\n setEco = \"turn_on\"\n setHvac = \"cool\"\n } else {\n setTemp = nightTemp\n setEco = \"turn_on\"\n setHvac = \"off\"\n }\n }\n } else if (earlyNight === 'on') {\n if (ac === 'on') {\n if (danger === 'Extreme') {\n setTemp === bedTemp\n } else {\n setTemp = nightTemp\n }\n if (fanMode === 'Fan') {\n setFan = 'turn_on'\n } else {\n setFan = 'turn_off'\n }\n if (acMode === 'AC') {\n setHvac = 'cool'\n } else if (acMode === 'fan') {\n setHvac = 'fan_only'\n } else {\n setHvac = 'off'\n }\n if (hotDay === 'on') {\n setEco = 'turn_off'\n } else {\n setEco = 'turn_on'\n }\n }\n }\n// Night Time\n} else if (time === 'night') {\n // If this is being run at scheduled time, turn on input_boolean.master_bedroom_cooling_on\n if (type === 'auto') {\n setCool = 'turn_on'\n }\n // Decide temperature\n if (type === 'sleep' && payload === 'off') {\n setTemp = dayTemp\n } else if (danger === 'Extreme') {\n setTemp = bedTemp\n } else {\n setTemp = nightTemp\n }\n // Decide eco mode\n if (sleeping === 'on') {\n setEco = 'turn_off'\n } else {\n setEco = 'turn_on'\n }\n // Decide HVAC mode\n if (acMode === 'AC') {\n setHvac = 'cool'\n } else if (acMode === 'Fan') {\n setHvac = 'fan_only'\n } else {\n setHvac = 'off'\n }\n // Decide fan on/off\n if (type === 'sleep' && payload === 'off') {\n setFan = 'turn_off'\n } else if (fanMode === 'Fan') {\n setFan = 'turn_on'\n }\n// Bed Time\n} else if (time === 'bedtime') {\n setPeople = 'turn_off'\n if (ac === 'on') {\n setTemp = bedTemp\n setEco = 'turn_off'\n if (acMode === 'AC') {\n setHvac = 'cool'\n } else if (acMode === 'Fan') {\n setHvac = \"fan_only\"\n } else {\n setHvac = \"off\"\n }\n }\n if (fanMode === 'Fan') {\n setFan = 'turn_on'\n } else {\n setFan = 'turn_off'\n }\n}\nnode.log(\"Master Bedroom Climate: Decision Logic Complete\")\n\n// Define message payloads\n\nlet sendFan = {\n \"payload\": {\n \"action\": `fan.${setFan}`,\n \"target\": {\n \"entity_id\": masterBedroomFan\n },\n \"data\": {}\n }\n}\n\nlet sendCool = {\n \"payload\": {\n \"action\": `input_boolean.${setCool}`,\n \"target\": {\n \"entity_id\": [\"input_boolean.master_bedroom_cooling_on\"]\n },\n \"data\": {}\n }\n}\n\nlet sendSleep = {\n \"payload\": {\n \"action\": `input_boolean.${setSleep}`,\n \"target\": {\n \"entity_id\": [\"input_boolean.master_bedroom_sleeping\"]\n },\n \"data\": {}\n }\n}\n\nlet sendPeople = {\n \"payload\": {\n \"action\": `input_boolean.${setPeople}`,\n \"target\": {\n \"entity_id\": peopleIDs\n },\n \"data\": {}\n }\n}\n\nlet sendDisplay = {\n \"payload\": {\n \"action\": `switch.${setDisplay}`,\n \"target\": {\n \"entity_id\": [\"switch.master_bedroom_aircon_display\"]\n },\n \"data\": {}\n }\n}\n\nlet notify = {\n \"topic\": topic,\n \"nighttemp\": nightTemp,\n \"acmode\": acMode,\n \"fanmode\": fanMode\n}\n\nlet sendBriefing = {\n \"payload\": {\n \"action\": `script.${setBriefing}`,\n },\n \"delay\": setBriefingDelay\n}\n\nlet sendHvac = {\n \"payload\": {\n \"action\": \"climate.set_hvac_mode\",\n \"target\": {\n \"entity_id\": masterBedroomAircon\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"action\": \"climate.set_temperature\",\n \"target\": {\n \"entity_id\": masterBedroomAircon\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"action\": `switch.${setEco}`,\n \"target\": {\n \"entity_id\": [\"switch.master_bedroom_aircon_eco_mode\"]\n },\n \"data\": {}\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"action\": \"climate.set_fan_mode\",\n \"target\": {\n \"entity_id\": masterBedroomAircon\n },\n \"data\": {\n \"fan_mode\": \"auto\"\n }\n }\n}\n\nlet sendEchoDotDND = {\n \"payload\": {\n \"action\": `switch.${echoDotService}`,\n \"target\": {\n \"entity_id\": [\"switch.basement_echo_dot_do_not_disturb_switch\"]\n },\n \"data\": {}\n }\n}\n\nnode.log(\"Master Bedroom Climate: Message Payloads Defined\")\n\n// Log the parameters that were chosen, for debugging purposes\n\nnode.log(\"----- Master Bedroom Climate: Set Parameters -----\")\nnode.log(`setTemp: ${setTemp}`)\nnode.log(`setEco: ${setEco}`)\nnode.log(`setHvac: ${setHvac}`)\nnode.log(`setFan: ${setFan}`)\nnode.log(`setCool: ${setCool}`)\nnode.log(`setSleep: ${setSleep}`)\nnode.log(`setPeople: ${setPeople}`)\nnode.log(`setDisplay: ${setDisplay}`)\nnode.log(`setBriefing: ${setBriefing}`)\nnode.log(`setBriefingDelay: ${setBriefingDelay}`)\nnode.log(`time: ${time}`)\nnode.log(`type: ${type}`)\nnode.log(`topic: ${topic}`)\nnode.log(\"----- Master Bedroom Climate: End Parameters -----\")\n\n// If this was an automated trigger, set the cooling context for the bedroom accordingly.\n\nif (type === 'auto' && time != 'bedtime') {\n node.send([null, null, sendCool, null, null])\n node.log(\"Master Bedroom Climate: Cooling Context Set\")\n}\n\n// Automated responses\nif (type === 'auto' && allowed === 'on' && meltdown === 'off' && vacation === 'off') {\n node.log(\"Master Bedroom Climate: Auto\")\n if (sleeping === 'on' && topic != 'mrbedroom-wakeup') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Blocked (sleep mode)\" })\n node.log(\"Master Bedroom Climate: Blocked (sleep mode)\")\n } else {\n if (topic === 'mrbedroom-cooling' && ac === 'on') {\n node.status({ fill: \"green\", shape: \"dot\", text: \"Cooling Schedule\" })\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Cooling\")\n } else if (topic === 'mrbedroom-bedtime') {\n node.send([null, null, sendPeople, null, null])\n node.status({ fill: \"green\", shape: \"dot\", text: \"Bedtime\" })\n node.log(\"Master Bedroom Climate: Auto/Bedtime\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Bedtime/AC\")\n }\n if (fanMode === 'fan') {\n node.send([null, sendFan, null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Bedtime/Fan\")\n }\n } else if (topic === 'mrbedroom-fan' && fanMode === 'Fan') {\n node.status({ fill: \"green\", shape: \"dot\", text: \"Fan Schedule\" })\n node.send([null, sendFan, null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Fan\")\n } else if (topic === 'mrbedroom-wakeup') {\n node.send([null, null, null, null, sendBriefing])\n node.status({ fill: \"green\", shape: \"dot\", text: \"Wakeup Schedule\" })\n node.log(\"Master Bedroom Climate: Auto/Wakeup\")\n if (sleeping === 'off') {\n context.set(\"isWakeup\", false)\n node.send([null, sendFan, null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Wakeup/Sleep Off\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Wakeup/AC On\")\n }\n } else if (sleeping === 'on') {\n context.set(\"isWakeup\", true)\n node.send([null, null, sendSleep, null, null])\n node.log(\"Master Bedroom Climate: Auto/Wakeup/Sleep On\")\n }\n }\n }\n// Manual Responses\n} else if (type === 'manual') {\n node.log(\"Master Bedroom Climate: Manual\")\n if (time === 'night') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Manual Night\" })\n node.send([null, sendFan, null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Night\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Night/AC\")\n }\n } else if (time === 'day') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Manual Day\" })\n node.send([null, sendFan, null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Day\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Day/AC\")\n }\n } else if (time === 'bedtime') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Manual Bedtime\" })\n node.send([null, sendFan, null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Bedtime\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Bedtime/AC\")\n }\n }\n context.set(\"isWakeup\", false)\n// Sleep Switch Responses\n} else if (type === 'sleep') {\n if (payload === 'off') {\n node.send([null, null, sendPeople, null, null])\n }\n node.log(\"Master Bedroom Climate: Sleep\")\n if (time === 'bedtime') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Sleep\" })\n node.send([null, sendFan, [sendEchoDotDND,sendPeople], null, null])\n node.log(\"Master Bedroom Climate: Sleep/Bedtime\")\n if (ac === 'on') {\n node.send([[sendDisplay, sendHvac, sendTemp, sendAcFan, sendEco], null, null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Bedtime/AC\")\n }\n } else {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Wakeup\" })\n node.send([null, sendFan, sendEchoDotDND, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Day\")\n if (ac === 'on') {\n node.send([[sendDisplay, sendHvac, sendTemp, sendAcFan, sendEco], null, null, null, null])\n node.log(`Master Bedroom Climate: Sleep/${convertToTitleCase(time)}/AC`)\n }\n if (time === 'day' && isWakeup === false) {\n node.send([null, null, null, null, sendBriefing])\n }\n }\n context.set(\"isWakeup\", false)\n} else if (meltdown === 'on') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Blocked (Meltdown Protocol)\" })\n node.log(\"Master Bedroom Climate: Blocked (Meltdown Protocol)\")\n} else if (vacation === 'on') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Blocked (Vacation Mode)\" })\n node.log(\"Master Bedroom Climate: Blocked (Vacation Mode)\")\n} else {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Blocked (Automation Disabled)\" })\n node.log(\"Master Bedroom Climate: Blocked (Automation Disabled)\")\n}\n\nnode.log(\"Master Bedroom Climate: Processing Complete\")\n", + "func": "node.log(\"Master Bedroom Climate: Processing Started\")\n// pull in the necessary information\n\nconst states = global.get('homeassistant.homeAssistant.states')\nconst allowed = states['input_boolean.master_bedroom_climate_protocol'].state\nconst ac = global.get('masterBedroom.aircon.installed', \"diskCon\")\nconst temp = global.get(\"outdoorTemp.tempStr\")\nconst payload = msg.payload\nconst vacation = states['input_boolean.vacation_mode'].state\nconst dayTemp = states['input_number.master_bedroom_daytime_temp'].state\nconst nightTemp = states['input_number.master_bedroom_night_temp'].state\nconst bedTemp = states['input_number.master_bedroom_bedtime_temp'].state\nconst showerMode = states['input_boolean.shower_mode'].state\nconst nightVolume = states['input_number.master_bedroom_echo_dot_night_volume'].state\nconst fanMode = states['input_select.scheduled_climate_mode_master_bedroom_fan'].state\nconst acMode = states['input_select.scheduled_climate_mode_master_bedroom_aircon'].state\nconst sleeping = states['input_boolean.master_bedroom_sleeping'].state\nconst hotDay = states['input_boolean.hot_day'].state\nconst heatWarning = states[\"binary_sensor.heat_warning\"].state\nconst showerCooldown = states[\"timer.shower_mode_cooldown\"].state\nconst earlyNight = states[\"binary_sensor.early_night_mode\"].state\nconst danger = states['binary_sensor.heat_warning'].attributes.danger\nconst meltdown = states['input_boolean.meltdown_protocol'].state\nconst coolingActive = states['input_boolean.master_bedroom_cooling_on'].state\nconst echoDotDND = 'switch.basement_echo_dot_do_not_disturb_switch'\nnode.log(\"Master Bedroom Climate: Constants Set\")\n\n// Define some entity IDs\n\nconst airconEntity = [\"climate.master_bedroom_aircon\"]\nconst fanEntity = [\"fan.master_bedroom_fan\"]\nconst peopleIDs = [\"input_boolean.tony_awake\", \"input_boolean.tina_awake\"]\n\n// Helper function to convert a string to title case\n\nfunction convertToTitleCase(str) {\n if (!str) {\n return \"\";\n }\n return str.toLowerCase().replace(/\\b\\w/g, (s) => s.toUpperCase());\n}\n\n// init variables\n\nlet setTemp = []\nlet setEco = []\nlet setHvac = []\nlet setFan = []\nlet setCool = []\nlet setSleep = []\nlet setPeople = []\nlet setDisplay = []\nlet time = []\nlet echoDotService = []\nlet setBriefing = []\nlet setBriefingDelay = []\nlet type = msg.type\nlet topic = msg.topic\nlet isWakeup = context.get(\"isWakeup\")\nnode.log(\"Master Bedroom Climate: Variables Defined\")\n\n// Sleep Switch Handling\nif (type === 'sleep' && payload === 'off') {\n setDisplay = 'turn_on'\n echoDotService = 'turn_off'\n setPeople = 'turn_on'\n if (coolingActive === 'on') {\n time = 'night'\n } else {\n time = 'day'\n }\n} else if (type === 'sleep' && payload === 'on') {\n setDisplay = 'turn_off'\n echoDotService = 'turn_on'\n time = 'bedtime'\n} else {\n time = msg.time\n}\n\nif (topic === 'mrbedroom-wakeup') {\n setSleep = 'turn_off'\n}\n\n// Setup TTS briefing\nif (topic === 'mrbedroom-wakeup') {\n setBriefing = \"master_bedroom_wakeup_briefing\"\n setBriefingDelay = 60000\n} else if (type === 'sleep' && payload === 'off') {\n setBriefing = \"master_bedroom_wakeup_briefing\"\n setBriefingDelay = 15000\n}\n\n// Day Time\nif (time === 'day') {\n if (type === 'auto') {\n setCool = 'turn_off'\n }\n if (earlyNight === 'off') {\n setFan = \"turn_off\"\n if (ac === 'on') {\n if (danger === 'Extreme') {\n setTemp = nightTemp\n setEco = \"turn_on\"\n setHvac = \"cool\"\n } else if (hotDay === 'on' || heatWarning === 'on') {\n setTemp = dayTemp\n setEco = \"turn_on\"\n setHvac = \"cool\"\n } else {\n setTemp = nightTemp\n setEco = \"turn_on\"\n setHvac = \"off\"\n }\n }\n } else if (earlyNight === 'on') {\n if (ac === 'on') {\n if (danger === 'Extreme') {\n setTemp === bedTemp\n } else {\n setTemp = nightTemp\n }\n if (fanMode === 'Fan') {\n setFan = 'turn_on'\n } else {\n setFan = 'turn_off'\n }\n if (acMode === 'AC') {\n setHvac = 'cool'\n } else if (acMode === 'fan') {\n setHvac = 'fan_only'\n } else {\n setHvac = 'off'\n }\n if (hotDay === 'on') {\n setEco = 'turn_off'\n } else {\n setEco = 'turn_on'\n }\n }\n }\n// Night Time\n} else if (time === 'night') {\n // If this is being run at scheduled time, turn on input_boolean.master_bedroom_cooling_on\n if (type === 'auto') {\n setCool = 'turn_on'\n }\n // Decide temperature\n if (type === 'sleep' && payload === 'off') {\n setTemp = dayTemp\n } else if (danger === 'Extreme') {\n setTemp = bedTemp\n } else {\n setTemp = nightTemp\n }\n // Decide eco mode\n if (sleeping === 'on') {\n setEco = 'turn_off'\n } else {\n setEco = 'turn_on'\n }\n // Decide HVAC mode\n if (acMode === 'AC') {\n setHvac = 'cool'\n } else if (acMode === 'Fan') {\n setHvac = 'fan_only'\n } else {\n setHvac = 'off'\n }\n // Decide fan on/off\n if (type === 'sleep' && payload === 'off') {\n setFan = 'turn_off'\n } else if (fanMode === 'Fan') {\n setFan = 'turn_on'\n }\n// Bed Time\n} else if (time === 'bedtime') {\n setPeople = 'turn_off'\n if (ac === 'on') {\n setTemp = bedTemp\n setEco = 'turn_off'\n if (acMode === 'AC') {\n setHvac = 'cool'\n } else if (acMode === 'Fan') {\n setHvac = \"fan_only\"\n } else {\n setHvac = \"off\"\n }\n }\n if (fanMode === 'Fan') {\n setFan = 'turn_on'\n } else {\n setFan = 'turn_off'\n }\n}\nnode.log(\"Master Bedroom Climate: Decision Logic Complete\")\n\n// Define message payloads\n\nlet sendFan = {\n \"payload\": {\n \"action\": `fan.${setFan}`,\n \"target\": {\n \"entity_id\": fanEntity\n },\n \"data\": {}\n }\n}\n\nlet sendCool = {\n \"payload\": {\n \"action\": `input_boolean.${setCool}`,\n \"target\": {\n \"entity_id\": [\"input_boolean.master_bedroom_cooling_on\"]\n },\n \"data\": {}\n }\n}\n\nlet sendSleep = {\n \"payload\": {\n \"action\": `input_boolean.${setSleep}`,\n \"target\": {\n \"entity_id\": [\"input_boolean.master_bedroom_sleeping\"]\n },\n \"data\": {}\n }\n}\n\nlet sendPeople = {\n \"payload\": {\n \"action\": `input_boolean.${setPeople}`,\n \"target\": {\n \"entity_id\": peopleIDs\n },\n \"data\": {}\n }\n}\n\nlet sendDisplay = {\n \"payload\": {\n \"action\": `switch.${setDisplay}`,\n \"target\": {\n \"entity_id\": [\"switch.master_bedroom_aircon_display\"]\n },\n \"data\": {}\n }\n}\n\nlet notify = {\n \"topic\": topic,\n \"nighttemp\": nightTemp,\n \"acmode\": acMode,\n \"fanmode\": fanMode\n}\n\nlet sendBriefing = {\n \"payload\": {\n \"action\": `script.${setBriefing}`,\n },\n \"delay\": setBriefingDelay\n}\n\nlet sendHvac = {\n \"payload\": {\n \"action\": \"climate.set_hvac_mode\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"action\": \"climate.set_temperature\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"action\": `switch.${setEco}`,\n \"target\": {\n \"entity_id\": [\"switch.master_bedroom_aircon_eco_mode\"]\n },\n \"data\": {}\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"action\": \"climate.set_fan_mode\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"fan_mode\": \"auto\"\n }\n }\n}\n\nlet sendEchoDotDND = {\n \"payload\": {\n \"action\": `switch.${echoDotService}`,\n \"target\": {\n \"entity_id\": [\"switch.basement_echo_dot_do_not_disturb_switch\"]\n },\n \"data\": {}\n }\n}\n\nnode.log(\"Master Bedroom Climate: Message Payloads Defined\")\n\n// Log the parameters that were chosen, for debugging purposes\n\nnode.log(\"----- Master Bedroom Climate: Set Parameters -----\")\nnode.log(`setTemp: ${setTemp}`)\nnode.log(`setEco: ${setEco}`)\nnode.log(`setHvac: ${setHvac}`)\nnode.log(`setFan: ${setFan}`)\nnode.log(`setCool: ${setCool}`)\nnode.log(`setSleep: ${setSleep}`)\nnode.log(`setPeople: ${setPeople}`)\nnode.log(`setDisplay: ${setDisplay}`)\nnode.log(`setBriefing: ${setBriefing}`)\nnode.log(`setBriefingDelay: ${setBriefingDelay}`)\nnode.log(`time: ${time}`)\nnode.log(`type: ${type}`)\nnode.log(`topic: ${topic}`)\nnode.log(\"----- Master Bedroom Climate: End Parameters -----\")\n\n// If this was an automated trigger, set the cooling context for the bedroom accordingly.\n\nif (type === 'auto' && time != 'bedtime') {\n node.send([null, null, sendCool, null, null])\n node.log(\"Master Bedroom Climate: Cooling Context Set\")\n}\n\n// Automated responses\nif (type === 'auto' && allowed === 'on' && meltdown === 'off' && vacation === 'off') {\n node.log(\"Master Bedroom Climate: Auto\")\n if (sleeping === 'on' && topic != 'mrbedroom-wakeup') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Blocked (sleep mode)\" })\n node.log(\"Master Bedroom Climate: Blocked (sleep mode)\")\n } else {\n if (topic === 'mrbedroom-cooling' && ac === 'on') {\n node.status({ fill: \"green\", shape: \"dot\", text: \"Cooling Schedule\" })\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Cooling\")\n } else if (topic === 'mrbedroom-bedtime') {\n node.send([null, null, sendPeople, null, null])\n node.status({ fill: \"green\", shape: \"dot\", text: \"Bedtime\" })\n node.log(\"Master Bedroom Climate: Auto/Bedtime\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Bedtime/AC\")\n }\n if (fanMode === 'fan') {\n node.send([null, sendFan, null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Bedtime/Fan\")\n }\n } else if (topic === 'mrbedroom-fan' && fanMode === 'Fan') {\n node.status({ fill: \"green\", shape: \"dot\", text: \"Fan Schedule\" })\n node.send([null, sendFan, null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Fan\")\n } else if (topic === 'mrbedroom-wakeup') {\n node.send([null, null, null, null, sendBriefing])\n node.status({ fill: \"green\", shape: \"dot\", text: \"Wakeup Schedule\" })\n node.log(\"Master Bedroom Climate: Auto/Wakeup\")\n if (sleeping === 'off') {\n context.set(\"isWakeup\", false)\n node.send([null, sendFan, null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Wakeup/Sleep Off\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Wakeup/AC On\")\n }\n } else if (sleeping === 'on') {\n context.set(\"isWakeup\", true)\n node.send([null, null, sendSleep, null, null])\n node.log(\"Master Bedroom Climate: Auto/Wakeup/Sleep On\")\n }\n }\n }\n// Manual Responses\n} else if (type === 'manual') {\n node.log(\"Master Bedroom Climate: Manual\")\n if (time === 'night') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Manual Night\" })\n node.send([null, sendFan, null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Night\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Night/AC\")\n }\n } else if (time === 'day') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Manual Day\" })\n node.send([null, sendFan, null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Day\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Day/AC\")\n }\n } else if (time === 'bedtime') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Manual Bedtime\" })\n node.send([null, sendFan, null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Bedtime\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Bedtime/AC\")\n }\n }\n context.set(\"isWakeup\", false)\n// Sleep Switch Responses\n} else if (type === 'sleep') {\n if (payload === 'off') {\n node.send([null, null, sendPeople, null, null])\n }\n node.log(\"Master Bedroom Climate: Sleep\")\n if (time === 'bedtime') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Sleep\" })\n node.send([null, sendFan, [sendEchoDotDND,sendPeople], null, null])\n node.log(\"Master Bedroom Climate: Sleep/Bedtime\")\n if (ac === 'on') {\n node.send([[sendDisplay, sendHvac, sendTemp, sendAcFan, sendEco], null, null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Bedtime/AC\")\n }\n } else {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Wakeup\" })\n node.send([null, sendFan, sendEchoDotDND, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Day\")\n if (ac === 'on') {\n node.send([[sendDisplay, sendHvac, sendTemp, sendAcFan, sendEco], null, null, null, null])\n node.log(`Master Bedroom Climate: Sleep/${convertToTitleCase(time)}/AC`)\n }\n if (time === 'day' && isWakeup === false) {\n node.send([null, null, null, null, sendBriefing])\n }\n }\n context.set(\"isWakeup\", false)\n} else if (meltdown === 'on') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Blocked (Meltdown Protocol)\" })\n node.log(\"Master Bedroom Climate: Blocked (Meltdown Protocol)\")\n} else if (vacation === 'on') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Blocked (Vacation Mode)\" })\n node.log(\"Master Bedroom Climate: Blocked (Vacation Mode)\")\n} else {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Blocked (Automation Disabled)\" })\n node.log(\"Master Bedroom Climate: Blocked (Automation Disabled)\")\n}\n\nnode.log(\"Master Bedroom Climate: Processing Complete\")\n", "outputs": 5, "timeout": "", "noerr": 0, @@ -21988,7 +21988,7 @@ "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "On", - "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst ac = global.get('masterBedroom.aircon.installed', \"diskCon\")\nconst temp = global.get('outdoorTemp.tempStr')\nconst threshold = states['input_number.master_bedroom_aircon_run_threshold'].state\nconst nightTemp = states['input_number.master_bedroom_night_temp'].state\nconst bedTemp = states['input_number.master_bedroom_bedtime_temp'].state\nconst sleeping = states['input_boolean.master_bedroom_sleeping'].state\n\nconst masterBedroomAircon = [\"climate.master_bedroom_aircon\"]\n\nlet setTemp = []\nlet setHvac = \"dry\"\nlet setEco = \"turn_off\"\n\nif (sleeping === 'on') {\n setTemp = bedTemp\n} else {\n setTemp = nightTemp\n}\n\nlet sendHvac = {\n \"payload\": {\n \"action\": \"climate.set_hvac_mode\",\n \"target\": {\n \"entity_id\": masterBedroomAircon\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"action\": \"climate.set_temperature\",\n \"target\": {\n \"entity_id\": masterBedroomAircon\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"action\": `switch.${setEco}`,\n \"target\": {\n \"entity_id\": [\"switch.master_bedroom_aircon_eco_mode\"]\n },\n \"data\": {}\n }\n}\n\nif (ac === 'on') {\n if (temp >= threshold) {\n node.status({fill:\"green\",shape:\"dot\",text:`Shower Mode On: ${setTemp}°F`})\n node.send([[sendHvac, sendTemp, sendEco]])\n } else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Too Cold\"})\n return null\n }\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"A/C Not Installed\"})\n return null\n}\n", + "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst ac = global.get('masterBedroom.aircon.installed', \"diskCon\")\nconst temp = global.get('outdoorTemp.tempStr')\nconst threshold = states['input_number.master_bedroom_aircon_run_threshold'].state\nconst nightTemp = states['input_number.master_bedroom_night_temp'].state\nconst bedTemp = states['input_number.master_bedroom_bedtime_temp'].state\nconst sleeping = states['input_boolean.master_bedroom_sleeping'].state\n\nconst airconEntity = [\"climate.master_bedroom_aircon\"]\n\nlet setTemp = []\nlet setHvac = \"dry\"\nlet setEco = \"turn_off\"\n\nif (sleeping === 'on') {\n setTemp = bedTemp\n} else {\n setTemp = nightTemp\n}\n\nlet sendHvac = {\n \"payload\": {\n \"action\": \"climate.set_hvac_mode\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"action\": \"climate.set_temperature\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"action\": `switch.${setEco}`,\n \"target\": {\n \"entity_id\": [\"switch.master_bedroom_aircon_eco_mode\"]\n },\n \"data\": {}\n }\n}\n\nif (ac === 'on') {\n if (temp >= threshold) {\n node.status({fill:\"green\",shape:\"dot\",text:`Shower Mode On: ${setTemp}°F`})\n node.send([[sendHvac, sendTemp, sendEco]])\n } else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Too Cold\"})\n return null\n }\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"A/C Not Installed\"})\n return null\n}\n", "outputs": 1, "timeout": "", "noerr": 0, @@ -22388,7 +22388,7 @@ "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Off", - "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst ac = global.get('masterBedroom.aircon.installed', \"diskCon\")\nconst temp = global.get('outdoorTemp.tempStr')\nconst threshold = states['input_number.master_bedroom_aircon_run_threshold'].state\nconst dayTemp = states['input_number.master_bedroom_daytime_temp'].state\nconst nightTemp = states['input_number.master_bedroom_night_temp'].state\nconst bedTemp = states['input_number.master_bedroom_bedtime_temp'].state\nconst currentSetTemp = states['climate.master_bedroom_aircon'].attributes.temperature\nconst coolingTime = states['input_boolean.master_bedroom_cooling_on'].state\nconst sleeping = states['input_boolean.master_bedroom_sleeping'].state\nconst hotDay = states['input_boolean.hot_day'].state\nconst topic = msg.topic\n\nconst masterBedroomAircon = [\"climate.master_bedroom_aircon\"]\n\nlet setTemp = {}\nlet setEco = {}\nlet duration = {}\nlet end = {}\nlet setHvac = {}\n\nif (topic === 'toggle') {\n if (hotDay === 'on' || sleeping === 'on') {\n setTemp = bedTemp\n setEco = 'turn_off'\n } else {\n setTemp = nightTemp\n setEco = 'turn_on'\n }\n} else if (topic === 'timer') {\n if (currentSetTemp == bedTemp) {\n setTemp = nightTemp\n if (hotDay === 'on') {\n setEco = 'turn_off'\n } else {\n setEco = 'turn_on'\n }\n } else {\n setTemp = dayTemp\n setEco = 'turn_on'\n }\n}\n\nif (setTemp == bedTemp) {\n duration = 3600\n} else if (setTemp == nightTemp && hotDay === 'off') {\n duration = 3600\n} else {\n duration = 1800\n}\n\nif (setTemp == dayTemp) {\n end = true\n if (hotDay === 'off') {\n setHvac = 'off'\n } else {\n setHvac = 'cool'\n }\n} else if (setTemp != bedTemp && coolingTime === 'on') {\n end = true\n setHvac = 'cool'\n} else {\n end = false\n setHvac = 'cool'\n}\n\nlet timerStart = {\n \"duration\": duration\n}\n\nlet sendHvac = {\n \"payload\": {\n \"action\": \"climate.set_hvac_mode\",\n \"target\": {\n \"entity_id\": masterBedroomAircon\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"action\": \"climate.set_temperature\",\n \"target\": {\n \"entity_id\": masterBedroomAircon\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"action\": `switch.${setEco}`,\n \"target\": {\n \"entity_id\": [\"switch.master_bedroom_aircon_eco_mode\"]\n },\n \"data\": {}\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"action\": \"climate.set_fan_mode\",\n \"target\": {\n \"entity_id\": masterBedroomAircon\n },\n \"data\": {\n \"fan_mode\": \"auto\"\n }\n }\n}\n\nif (ac === 'on' && temp >= threshold) {\n if (sleeping === 'on' || coolingTime === 'on' || end === true) {\n node.status({fill:\"green\",shape:\"dot\",text:\"Finished\"})\n return [[sendHvac, sendTemp, sendAcFan, sendEco], null]\n } else {\n node.status({fill:\"blue\",shape:\"dot\",text:\"Next Cycle\"})\n return [[sendHvac, sendTemp, sendAcFan, sendEco], timerStart]\n }\n} else if (ac === 'off') {\n node.status({fill:\"red\",shape:\"ring\",text:\"A/C Not Installed\"})\n return null\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Too Cold\"})\n return null\n}\n", + "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst ac = global.get('masterBedroom.aircon.installed', \"diskCon\")\nconst temp = global.get('outdoorTemp.tempStr')\nconst threshold = states['input_number.master_bedroom_aircon_run_threshold'].state\nconst dayTemp = states['input_number.master_bedroom_daytime_temp'].state\nconst nightTemp = states['input_number.master_bedroom_night_temp'].state\nconst bedTemp = states['input_number.master_bedroom_bedtime_temp'].state\nconst currentSetTemp = states['climate.master_bedroom_aircon'].attributes.temperature\nconst coolingTime = states['input_boolean.master_bedroom_cooling_on'].state\nconst sleeping = states['input_boolean.master_bedroom_sleeping'].state\nconst hotDay = states['input_boolean.hot_day'].state\nconst topic = msg.topic\n\nconst airconEntity = [\"climate.master_bedroom_aircon\"]\n\nlet setTemp = {}\nlet setEco = {}\nlet duration = {}\nlet end = {}\nlet setHvac = {}\n\nif (topic === 'toggle') {\n if (hotDay === 'on' || sleeping === 'on') {\n setTemp = bedTemp\n setEco = 'turn_off'\n } else {\n setTemp = nightTemp\n setEco = 'turn_on'\n }\n} else if (topic === 'timer') {\n if (currentSetTemp == bedTemp) {\n setTemp = nightTemp\n if (hotDay === 'on') {\n setEco = 'turn_off'\n } else {\n setEco = 'turn_on'\n }\n } else {\n setTemp = dayTemp\n setEco = 'turn_on'\n }\n}\n\nif (setTemp == bedTemp) {\n duration = 3600\n} else if (setTemp == nightTemp && hotDay === 'off') {\n duration = 3600\n} else {\n duration = 1800\n}\n\nif (setTemp == dayTemp) {\n end = true\n if (hotDay === 'off') {\n setHvac = 'off'\n } else {\n setHvac = 'cool'\n }\n} else if (setTemp != bedTemp && coolingTime === 'on') {\n end = true\n setHvac = 'cool'\n} else {\n end = false\n setHvac = 'cool'\n}\n\nlet timerStart = {\n \"duration\": duration\n}\n\nlet sendHvac = {\n \"payload\": {\n \"action\": \"climate.set_hvac_mode\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"action\": \"climate.set_temperature\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"action\": `switch.${setEco}`,\n \"target\": {\n \"entity_id\": [\"switch.master_bedroom_aircon_eco_mode\"]\n },\n \"data\": {}\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"action\": \"climate.set_fan_mode\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"fan_mode\": \"auto\"\n }\n }\n}\n\nif (ac === 'on' && temp >= threshold) {\n if (sleeping === 'on' || coolingTime === 'on' || end === true) {\n node.status({fill:\"green\",shape:\"dot\",text:\"Finished\"})\n return [[sendHvac, sendTemp, sendAcFan, sendEco], null]\n } else {\n node.status({fill:\"blue\",shape:\"dot\",text:\"Next Cycle\"})\n return [[sendHvac, sendTemp, sendAcFan, sendEco], timerStart]\n }\n} else if (ac === 'off') {\n node.status({fill:\"red\",shape:\"ring\",text:\"A/C Not Installed\"})\n return null\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Too Cold\"})\n return null\n}\n", "outputs": 2, "timeout": "", "noerr": 0, @@ -22533,7 +22533,7 @@ "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Meltdown Center", - "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst toggle = msg.payload\nconst ac = global.get('masterBedroom.aircon.installed', \"diskCon\")\nconst lastMode = flow.get(\"masterBedroom.lastMode\", \"diskCon\")\nconst bedTemp = states['input_number.master_bedroom_bedtime_temp'].state\n\nconst masterBedroomAircon = [\"climate.master_bedroom_aircon\"]\nconst masterBedroomFan = [\"fan.master_bedroom_fan\"]\n\nlet setTemp = bedTemp\nlet setEco = 'turn_off'\nlet setHvac = 'cool'\nlet setAcFan = 'High'\nlet setFan = 'turn_off'\n\nlet sendFan = {\n \"payload\": {\n \"action\": `fan.${setFan}`,\n \"target\": {\n \"entity_id\": masterBedroomFan\n },\n \"data\": {}\n }\n}\n\nlet sendHvac = {\n \"payload\": {\n \"action\": \"climate.set_hvac_mode\",\n \"target\": {\n \"entity_id\": masterBedroomAircon\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"action\": \"climate.set_temperature\",\n \"target\": {\n \"entity_id\": masterBedroomAircon\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"action\": `switch.${setEco}`,\n \"target\": {\n \"entity_id\": [\"switch.master_bedroom_aircon_eco_mode\"]\n },\n \"data\": {}\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"action\": \"climate.set_fan_mode\",\n \"target\": {\n \"entity_id\": masterBedroomAircon\n },\n \"data\": {\n \"fan_mode\": setAcFan\n }\n }\n}\n\nlet reset = {\n \"topic\": \"Reset\"\n}\n\nif (toggle === 'on') {\n node.status({fill:\"red\",shape:\"dot\",text:\"DANGER MODE ACTIVE\"})\n node.send([null,sendFan,null])\n if (ac === 'on') {\n node.send([[sendHvac,sendTemp,sendAcFan,sendEco],null,null])\n }\n} else {\n node.status({fill:\"green\",shape:\"dot\",text:\"Danger Mode Off\"})\n node.send([null,null,reset])\n}", + "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst toggle = msg.payload\nconst ac = global.get('masterBedroom.aircon.installed', \"diskCon\")\nconst lastMode = flow.get(\"masterBedroom.lastMode\", \"diskCon\")\nconst bedTemp = states['input_number.master_bedroom_bedtime_temp'].state\n\nconst airconEntity = [\"climate.master_bedroom_aircon\"]\nconst fanEntity = [\"fan.master_bedroom_fan\"]\n\nlet setTemp = bedTemp\nlet setEco = 'turn_off'\nlet setHvac = 'cool'\nlet setAcFan = 'High'\nlet setFan = 'turn_off'\n\nlet sendFan = {\n \"payload\": {\n \"action\": `fan.${setFan}`,\n \"target\": {\n \"entity_id\": fanEntity\n },\n \"data\": {}\n }\n}\n\nlet sendHvac = {\n \"payload\": {\n \"action\": \"climate.set_hvac_mode\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"action\": \"climate.set_temperature\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"action\": `switch.${setEco}`,\n \"target\": {\n \"entity_id\": [\"switch.master_bedroom_aircon_eco_mode\"]\n },\n \"data\": {}\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"action\": \"climate.set_fan_mode\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"fan_mode\": setAcFan\n }\n }\n}\n\nlet reset = {\n \"topic\": \"Reset\"\n}\n\nif (toggle === 'on') {\n node.status({fill:\"red\",shape:\"dot\",text:\"DANGER MODE ACTIVE\"})\n node.send([null,sendFan,null])\n if (ac === 'on') {\n node.send([[sendHvac,sendTemp,sendAcFan,sendEco],null,null])\n }\n} else {\n node.status({fill:\"green\",shape:\"dot\",text:\"Danger Mode Off\"})\n node.send([null,null,reset])\n}", "outputs": 3, "timeout": "", "noerr": 0, @@ -23974,7 +23974,7 @@ "z": "72f99805df043603", "g": "5802ea32c1de36e8", "name": "Processing", - "func": "node.log(\"Emma Bedroom Climate: Processing Started\");\n// pull in the necessary information\n\nconst states = global.get('homeassistant.homeAssistant.states')\nconst allowed = states['input_boolean.emma_bedroom_climate_protocol'].state\nconst ac = global.get('emmaBedroom.aircon.installed', \"diskCon\")\nconst temp = global.get(\"outdoorTemp.tempStr\")\nconst payload = msg.payload\nconst vacation = states['input_boolean.vacation_mode'].state\nconst dayTemp = states['input_number.emma_bedroom_daytime_temp'].state\nconst nightTemp = states['input_number.emma_bedroom_night_temp'].state\nconst bedTemp = states['input_number.emma_bedroom_bedtime_temp'].state\nconst schedMode = states['input_select.scheduled_climate_mode_emma_bedroom'].state\nconst sleeping = states['input_boolean.emma_sleeping'].state\nconst hotDay = states['input_boolean.hot_day'].state\nconst heatWarning = states[\"binary_sensor.heat_warning\"].state\nconst earlyNight = states[\"binary_sensor.early_night_mode\"].state\nconst danger = states['binary_sensor.heat_warning'].attributes.danger\nconst meltdown = states['input_boolean.meltdown_protocol'].state\nconst coolingActive = states['input_boolean.emma_bedroom_cooling_on'].state\nnode.log(\"Emma Bedroom Climate: Constants Set\")\n\n// Define reusable constants\n\nconst emmaBedroomAircon = [\"climate.emma_bedroom_aircon\"]\nconst emmaBedroomWhiteNoise = [\"input_boolean.white_noise_emma_bedroom\"]\nconst validSchedModesAC = ['AC', 'Fan']\n\n// Helper function to convert a string to title case\n\nfunction convertToTitleCase(str) {\n if (!str) {\n return \"\";\n }\n return str.toLowerCase().replace(/\\b\\w/g, (s) => s.toUpperCase());\n}\n\n// init variables\n\nlet setTemp = []\nlet setEco = []\nlet setHvac = []\nlet setCool = []\nlet setSleep = []\nlet setPeople = []\nlet setDisplay = []\nlet setWhiteNoise = \"turn_off\"\nlet time = []\nlet type = msg.type\nlet topic = msg.topic\nlet isWakeup = context.get(\"isWakeup\")\nnode.log(\"Emma Bedroom Climate: Variables Defined\")\n\n// Sleep Switch Handling\nif (type === 'sleep' && payload === 'off') {\n setDisplay = 'turn_on'\n setPeople = 'turn_on'\n if (coolingActive === 'on') {\n time = 'night'\n } else {\n time = 'day'\n }\n} else if (type === 'sleep' && payload === 'on') {\n setDisplay = 'turn_off'\n time = 'bedtime'\n} else {\n time = msg.time\n}\n\nif (topic === 'emmabedroom-wakeup') {\n setSleep = 'turn_off'\n}\n\n// Day Time\nif (time === 'day') {\n if (type === 'auto') {\n setCool = 'turn_off'\n }\n if (earlyNight === 'off') {\n if (ac === 'on') {\n if (danger === 'Extreme') {\n setTemp = nightTemp\n setEco = \"turn_on\"\n setHvac = \"cool\"\n } else if (hotDay === 'on' || heatWarning === 'on') {\n setTemp = dayTemp\n setEco = \"turn_on\"\n setHvac = \"cool\"\n } else {\n setTemp = nightTemp\n setEco = \"turn_on\"\n setHvac = \"off\"\n }\n }\n } else if (earlyNight === 'on') {\n if (ac === 'on') {\n if (danger === 'Extreme') {\n setTemp === bedTemp\n } else {\n setTemp = nightTemp\n }\n if (schedMode === 'AC') {\n setHvac = 'cool'\n } else if (schedMode === 'fan') {\n setHvac = 'fan_only'\n } else {\n setHvac = 'off'\n }\n if (hotDay === 'on') {\n setEco = 'turn_off'\n } else {\n setEco = 'turn_on'\n }\n }\n }\n// Night Time\n} else if (time === 'night') {\n // If this is being run at scheduled time, turn on input_boolean.emma_bedroom_cooling_on\n if (type === 'auto') {\n setCool = 'turn_on'\n }\n // Decide temperature\n if (type === 'sleep' && payload === 'off') {\n setTemp = dayTemp\n } else if (danger === 'Extreme') {\n setTemp = bedTemp\n } else {\n setTemp = nightTemp\n }\n // Decide eco mode\n if (sleeping === 'on') {\n setEco = 'turn_off'\n } else {\n setEco = 'turn_on'\n }\n // Decide HVAC mode\n if (schedMode === 'AC') {\n setHvac = 'cool'\n } else if (schedMode === 'Fan') {\n setHvac = 'fan_only'\n } else {\n setHvac = 'off'\n }\n// Bed Time\n} else if (time === 'bedtime') {\n setPeople = 'turn_off'\n if (ac === 'on') {\n setTemp = bedTemp\n setEco = 'turn_off'\n if (schedMode === 'AC') {\n setHvac = 'cool'\n } else if (schedMode === 'Fan') {\n setHvac = \"fan_only\"\n } else if (schedMode === 'White Noise') {\n setWhiteNoise = 'turn_on'\n if (ac === 'on') {\n setHvac = 'off'\n }\n } else {\n setHvac = \"off\"\n }\n }\n}\nnode.log(\"Emma Bedroom Climate: Decision Logic Complete\")\n\n// Define message payloads\n\nlet sendCool = {\n \"payload\": {\n \"action\": `input_boolean.${setCool}`,\n \"target\": {\n \"entity_id\": [\"input_boolean.emma_bedroom_cooling_on\"]\n },\n \"data\": {}\n }\n}\n\nlet sendSleep = {\n \"payload\": {\n \"action\": `input_boolean.${setSleep}`,\n \"target\": {\n \"entity_id\": [\"input_boolean.emma_sleeping\"]\n },\n \"data\": {}\n }\n}\n\nlet sendPeople = {\n \"payload\": {\n \"action\": `input_boolean.${setPeople}`,\n \"target\": {\n \"entity_id\": [\"input_boolean.emma_awake\"]\n },\n \"data\": {}\n }\n}\n\nlet sendDisplay = {\n \"payload\": {\n \"action\": `switch.${setDisplay}`,\n \"target\": {\n \"entity_id\": [\"switch.emma_bedroom_aircon_display\"]\n },\n \"data\": {}\n }\n}\n\nlet sendWhiteNoise = {\n \"payload\": {\n \"action\": `input_boolean.${setWhiteNoise}`,\n \"target\": {\n \"entity_id\": emmaBedroomWhiteNoise\n },\n \"data\": {}\n }\n}\n\nlet notify = {\n \"topic\": topic,\n \"nighttemp\": nightTemp,\n \"schedMode\": schedMode\n}\n\nlet sendHvac = {\n \"payload\": {\n \"action\": \"climate.set_hvac_mode\",\n \"target\": {\n \"entity_id\": emmaBedroomAircon\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"action\": \"climate.set_temperature\",\n \"target\": {\n \"entity_id\": emmaBedroomAircon\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"action\": `switch.${setEco}`,\n \"target\": {\n \"entity_id\": [\"switch.emma_bedroom_aircon_eco_mode\"]\n },\n \"data\": {}\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"action\": \"climate.set_fan_mode\",\n \"target\": {\n \"entity_id\": emmaBedroomAircon\n },\n \"data\": {\n \"fan_mode\": \"auto\"\n }\n }\n}\n\nnode.log(\"Emma Bedroom Climate: Message Payloads Defined\")\n\n// Send some parameters to flow context for use in other nodes\n\nif (setHvac.length > 0) {\n flow.set('emmaBedroom.airconHvacMode',setHvac,'diskCon')\n}\n\nif (setEco.length > 0) {\n flow.set('emmaBedroom.airconPreset',setEco,'diskCon')\n}\n\nif (setTemp.length > 0) {\n flow.set('emmaBedroom.airconTargetTemp',setTemp,'diskCon')\n}\n\nif (setDisplay.length > 0) {\n flow.set('emmaBedroom.airconDisplay',setDisplay,'diskCon')\n}\n\nflow.set('emmaBedroom.airconFanMode','auto','diskCon')\n\n// Log the parameters that were chosen, for debugging purposes\n\nnode.log(\"----- Emma Bedroom Climate: Set Parameters -----\")\nnode.log(`setTemp: ${setTemp}`)\nnode.log(`setEco: ${setEco}`)\nnode.log(`setHvac: ${setHvac}`)\nnode.log(`setCool: ${setCool}`)\nnode.log(`setSleep: ${setSleep}`)\nnode.log(`setPeople: ${setPeople}`)\nnode.log(`setDisplay: ${setDisplay}`)\nnode.log(`time: ${time}`)\nnode.log(`type: ${type}`)\nnode.log(`topic: ${topic}`)\nnode.log(\"----- Emma Bedroom Climate: End Parameters -----\")\n\n// If this was an automated trigger, set the cooling context for the bedroom accordingly.\n\nif (type === 'auto' && time != 'bedtime') {\n node.send([null, sendCool, null])\n node.log(\"Emma Bedroom Climate: Cooling Context Set\")\n}\n\nif (type === 'auto' && allowed === 'on' && meltdown === 'off' && vacation === 'off') {\n node.log(\"Emma Bedroom Climate: Auto\")\n if (sleeping === 'on' && topic != 'emmabedroom-wakeup') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Blocked (sleep mode)\" })\n node.log(\"Emma Bedroom Climate: Blocked (sleep mode)\")\n } else {\n if (topic === 'emmabedroom-cooling' && ac === 'on') {\n node.status({ fill: \"green\", shape: \"dot\", text: \"Cooling Schedule\" })\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null])\n node.log(\"Emma Bedroom Climate: Auto/Cooling\")\n } else if (topic === 'emmabedroom-bedtime') {\n node.send([null, sendPeople, null])\n node.status({ fill: \"green\", shape: \"dot\", text: \"Bedtime\" })\n node.log(\"Emma Bedroom Climate: Auto/Bedtime\")\n if (validSchedModesAC.includes(schedMode) && ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null])\n node.log(\"Emma Bedroom Climate: Auto/Bedtime/AC\")\n } else if (schedMode === 'White Noise') {\n node.send([null, sendWhiteNoise, null])\n node.log(\"Emma Bedroom Climate: Auto/Bedtime/White Noise\")\n }\n } else if (topic === 'emmabedroom-wakeup') {\n node.status({ fill: \"green\", shape: \"dot\", text: \"Wakeup Schedule\" })\n node.log(\"Emma Bedroom Climate: Auto/Wakeup\")\n if (sleeping === 'off') {\n context.set(\"isWakeup\", false)\n node.send([null, sendWhiteNoise, null])\n node.log(\"Emma Bedroom Climate: Auto/Wakeup/Sleep Off\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null])\n node.log(\"Emma Bedroom Climate: Auto/Wakeup/AC On\")\n }\n } else if (sleeping === 'on') {\n context.set(\"isWakeup\", true)\n node.send([null, sendSleep, null])\n node.log(\"Emma Bedroom Climate: Auto/Wakeup/Sleep On\")\n }\n }\n }\n// Manual Responses\n} else if (type === 'manual') {\n node.log(\"Emma Bedroom Climate: Manual\")\n if (time === 'night') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Manual Night\" })\n node.log(\"Emma Bedroom Climate: Manual/Night\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null])\n node.log(\"Emma Bedroom Climate: Manual/Night/AC\")\n }\n } else if (time === 'day') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Manual Day\" })\n node.send([null, sendWhiteNoise, null])\n node.log(\"Emma Bedroom Climate: Manual/Day\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null])\n node.log(\"Emma Bedroom Climate: Manual/Day/AC\")\n }\n } else if (time === 'bedtime') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Manual Bedtime\" })\n node.log(\"Emma Bedroom Climate: Manual/Bedtime\")\n if (validSchedModesAC.includes(schedMode) && ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null])\n node.log(\"Emma Bedroom Climate: Manual/Bedtime/AC\")\n } else if (schedMode === 'White Noise') {\n node.send([null, sendWhiteNoise, null])\n node.log(\"Emma Bedroom Climate: Manual/Bedtime/White Noise\")\n }\n }\n context.set(\"isWakeup\", false)\n// Sleep Switch Responses\n} else if (type === 'sleep') {\n if (payload === 'off') {\n node.send([null, [sendPeople, sendWhiteNoise], null])\n }\n node.log(\"Emma Bedroom Climate: Sleep\")\n if (time === 'bedtime') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Sleep\" })\n node.send([null, [sendPeople, sendWhiteNoise], null])\n node.log(\"Emma Bedroom Climate: Sleep/Bedtime\")\n if (ac === 'on') {\n node.send([[sendDisplay, sendHvac, sendTemp, sendAcFan, sendEco], null, null])\n node.log(\"Emma Bedroom Climate: Sleep/Bedtime/AC\")\n }\n } else {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Wakeup\" })\n node.send([null, sendWhiteNoise, null])\n node.log(\"Emma Bedroom Climate: Sleep/Day\")\n if (ac === 'on') {\n node.send([[sendDisplay, sendHvac, sendTemp, sendAcFan, sendEco], null, null])\n node.log(`Emma Bedroom Climate: Sleep/${convertToTitleCase(time)}/AC`)\n }\n }\n context.set(\"isWakeup\", false)\n} else if (meltdown === 'on') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Blocked (Meltdown Protocol)\" })\n node.log(\"Emma Bedroom Climate: Blocked (Meltdown Protocol)\")\n} else if (vacation === 'on') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Blocked (Vacation Mode)\" })\n node.log(\"Emma Bedroom Climate: Blocked (Vacation Mode)\")\n} else {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Blocked (Automation Disabled)\" })\n node.log(\"Emma Bedroom Climate: Blocked (Automation Disabled)\")\n}\n\nnode.log(\"Emma Bedroom Climate: Processing Complete\")\n", + "func": "node.log(\"Emma Bedroom Climate: Processing Started\");\n// pull in the necessary information\n\nconst states = global.get('homeassistant.homeAssistant.states')\nconst allowed = states['input_boolean.emma_bedroom_climate_protocol'].state\nconst ac = global.get('emmaBedroom.aircon.installed', \"diskCon\")\nconst temp = global.get(\"outdoorTemp.tempStr\")\nconst payload = msg.payload\nconst vacation = states['input_boolean.vacation_mode'].state\nconst dayTemp = states['input_number.emma_bedroom_daytime_temp'].state\nconst nightTemp = states['input_number.emma_bedroom_night_temp'].state\nconst bedTemp = states['input_number.emma_bedroom_bedtime_temp'].state\nconst schedMode = states['input_select.scheduled_climate_mode_emma_bedroom'].state\nconst sleeping = states['input_boolean.emma_sleeping'].state\nconst hotDay = states['input_boolean.hot_day'].state\nconst heatWarning = states[\"binary_sensor.heat_warning\"].state\nconst earlyNight = states[\"binary_sensor.early_night_mode\"].state\nconst danger = states['binary_sensor.heat_warning'].attributes.danger\nconst meltdown = states['input_boolean.meltdown_protocol'].state\nconst coolingActive = states['input_boolean.emma_bedroom_cooling_on'].state\nnode.log(\"Emma Bedroom Climate: Constants Set\")\n\n// Define reusable constants\n\nconst airconEntity = [\"climate.emma_bedroom_aircon\"]\nconst whiteNoiseEntity = [\"input_boolean.white_noise_emma_bedroom\"]\nconst validSchedModesAC = ['AC', 'Fan']\n\n// Helper function to convert a string to title case\n\nfunction convertToTitleCase(str) {\n if (!str) {\n return \"\";\n }\n return str.toLowerCase().replace(/\\b\\w/g, (s) => s.toUpperCase());\n}\n\n// init variables\n\nlet setTemp = []\nlet setEco = []\nlet setHvac = []\nlet setCool = []\nlet setSleep = []\nlet setPeople = []\nlet setDisplay = []\nlet setWhiteNoise = \"turn_off\"\nlet time = []\nlet type = msg.type\nlet topic = msg.topic\nlet isWakeup = context.get(\"isWakeup\")\nnode.log(\"Emma Bedroom Climate: Variables Defined\")\n\n// Sleep Switch Handling\nif (type === 'sleep' && payload === 'off') {\n setDisplay = 'turn_on'\n setPeople = 'turn_on'\n if (coolingActive === 'on') {\n time = 'night'\n } else {\n time = 'day'\n }\n} else if (type === 'sleep' && payload === 'on') {\n setDisplay = 'turn_off'\n time = 'bedtime'\n} else {\n time = msg.time\n}\n\nif (topic === 'emmabedroom-wakeup') {\n setSleep = 'turn_off'\n}\n\n// Day Time\nif (time === 'day') {\n if (type === 'auto') {\n setCool = 'turn_off'\n }\n if (earlyNight === 'off') {\n if (ac === 'on') {\n if (danger === 'Extreme') {\n setTemp = nightTemp\n setEco = \"turn_on\"\n setHvac = \"cool\"\n } else if (hotDay === 'on' || heatWarning === 'on') {\n setTemp = dayTemp\n setEco = \"turn_on\"\n setHvac = \"cool\"\n } else {\n setTemp = nightTemp\n setEco = \"turn_on\"\n setHvac = \"off\"\n }\n }\n } else if (earlyNight === 'on') {\n if (ac === 'on') {\n if (danger === 'Extreme') {\n setTemp === bedTemp\n } else {\n setTemp = nightTemp\n }\n if (schedMode === 'AC') {\n setHvac = 'cool'\n } else if (schedMode === 'fan') {\n setHvac = 'fan_only'\n } else {\n setHvac = 'off'\n }\n if (hotDay === 'on') {\n setEco = 'turn_off'\n } else {\n setEco = 'turn_on'\n }\n }\n }\n// Night Time\n} else if (time === 'night') {\n // If this is being run at scheduled time, turn on input_boolean.emma_bedroom_cooling_on\n if (type === 'auto') {\n setCool = 'turn_on'\n }\n // Decide temperature\n if (type === 'sleep' && payload === 'off') {\n setTemp = dayTemp\n } else if (danger === 'Extreme') {\n setTemp = bedTemp\n } else {\n setTemp = nightTemp\n }\n // Decide eco mode\n if (sleeping === 'on') {\n setEco = 'turn_off'\n } else {\n setEco = 'turn_on'\n }\n // Decide HVAC mode\n if (schedMode === 'AC') {\n setHvac = 'cool'\n } else if (schedMode === 'Fan') {\n setHvac = 'fan_only'\n } else {\n setHvac = 'off'\n }\n// Bed Time\n} else if (time === 'bedtime') {\n setPeople = 'turn_off'\n if (ac === 'on') {\n setTemp = bedTemp\n setEco = 'turn_off'\n if (schedMode === 'AC') {\n setHvac = 'cool'\n } else if (schedMode === 'Fan') {\n setHvac = \"fan_only\"\n } else if (schedMode === 'White Noise') {\n setWhiteNoise = 'turn_on'\n if (ac === 'on') {\n setHvac = 'off'\n }\n } else {\n setHvac = \"off\"\n }\n }\n}\nnode.log(\"Emma Bedroom Climate: Decision Logic Complete\")\n\n// Define message payloads\n\nlet sendCool = {\n \"payload\": {\n \"action\": `input_boolean.${setCool}`,\n \"target\": {\n \"entity_id\": [\"input_boolean.emma_bedroom_cooling_on\"]\n },\n \"data\": {}\n }\n}\n\nlet sendSleep = {\n \"payload\": {\n \"action\": `input_boolean.${setSleep}`,\n \"target\": {\n \"entity_id\": [\"input_boolean.emma_sleeping\"]\n },\n \"data\": {}\n }\n}\n\nlet sendPeople = {\n \"payload\": {\n \"action\": `input_boolean.${setPeople}`,\n \"target\": {\n \"entity_id\": [\"input_boolean.emma_awake\"]\n },\n \"data\": {}\n }\n}\n\nlet sendDisplay = {\n \"payload\": {\n \"action\": `switch.${setDisplay}`,\n \"target\": {\n \"entity_id\": [\"switch.emma_bedroom_aircon_display\"]\n },\n \"data\": {}\n }\n}\n\nlet sendWhiteNoise = {\n \"payload\": {\n \"action\": `input_boolean.${setWhiteNoise}`,\n \"target\": {\n \"entity_id\": whiteNoiseEntity\n },\n \"data\": {}\n }\n}\n\nlet notify = {\n \"topic\": topic,\n \"nighttemp\": nightTemp,\n \"schedMode\": schedMode\n}\n\nlet sendHvac = {\n \"payload\": {\n \"action\": \"climate.set_hvac_mode\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"action\": \"climate.set_temperature\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"action\": `switch.${setEco}`,\n \"target\": {\n \"entity_id\": [\"switch.emma_bedroom_aircon_eco_mode\"]\n },\n \"data\": {}\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"action\": \"climate.set_fan_mode\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"fan_mode\": \"auto\"\n }\n }\n}\n\nnode.log(\"Emma Bedroom Climate: Message Payloads Defined\")\n\n// Send some parameters to flow context for use in other nodes\n\nif (setHvac.length > 0) {\n flow.set('emmaBedroom.airconHvacMode',setHvac,'diskCon')\n}\n\nif (setEco.length > 0) {\n flow.set('emmaBedroom.airconPreset',setEco,'diskCon')\n}\n\nif (setTemp.length > 0) {\n flow.set('emmaBedroom.airconTargetTemp',setTemp,'diskCon')\n}\n\nif (setDisplay.length > 0) {\n flow.set('emmaBedroom.airconDisplay',setDisplay,'diskCon')\n}\n\nflow.set('emmaBedroom.airconFanMode','auto','diskCon')\n\n// Log the parameters that were chosen, for debugging purposes\n\nnode.log(\"----- Emma Bedroom Climate: Set Parameters -----\")\nnode.log(`setTemp: ${setTemp}`)\nnode.log(`setEco: ${setEco}`)\nnode.log(`setHvac: ${setHvac}`)\nnode.log(`setCool: ${setCool}`)\nnode.log(`setSleep: ${setSleep}`)\nnode.log(`setPeople: ${setPeople}`)\nnode.log(`setDisplay: ${setDisplay}`)\nnode.log(`time: ${time}`)\nnode.log(`type: ${type}`)\nnode.log(`topic: ${topic}`)\nnode.log(\"----- Emma Bedroom Climate: End Parameters -----\")\n\n// If this was an automated trigger, set the cooling context for the bedroom accordingly.\n\nif (type === 'auto' && time != 'bedtime') {\n node.send([null, sendCool, null])\n node.log(\"Emma Bedroom Climate: Cooling Context Set\")\n}\n\nif (type === 'auto' && allowed === 'on' && meltdown === 'off' && vacation === 'off') {\n node.log(\"Emma Bedroom Climate: Auto\")\n if (sleeping === 'on' && topic != 'emmabedroom-wakeup') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Blocked (sleep mode)\" })\n node.log(\"Emma Bedroom Climate: Blocked (sleep mode)\")\n } else {\n if (topic === 'emmabedroom-cooling' && ac === 'on') {\n node.status({ fill: \"green\", shape: \"dot\", text: \"Cooling Schedule\" })\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null])\n node.log(\"Emma Bedroom Climate: Auto/Cooling\")\n } else if (topic === 'emmabedroom-bedtime') {\n node.send([null, sendPeople, null])\n node.status({ fill: \"green\", shape: \"dot\", text: \"Bedtime\" })\n node.log(\"Emma Bedroom Climate: Auto/Bedtime\")\n if (validSchedModesAC.includes(schedMode) && ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null])\n node.log(\"Emma Bedroom Climate: Auto/Bedtime/AC\")\n } else if (schedMode === 'White Noise') {\n node.send([null, sendWhiteNoise, null])\n node.log(\"Emma Bedroom Climate: Auto/Bedtime/White Noise\")\n }\n } else if (topic === 'emmabedroom-wakeup') {\n node.status({ fill: \"green\", shape: \"dot\", text: \"Wakeup Schedule\" })\n node.log(\"Emma Bedroom Climate: Auto/Wakeup\")\n if (sleeping === 'off') {\n context.set(\"isWakeup\", false)\n node.send([null, sendWhiteNoise, null])\n node.log(\"Emma Bedroom Climate: Auto/Wakeup/Sleep Off\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null])\n node.log(\"Emma Bedroom Climate: Auto/Wakeup/AC On\")\n }\n } else if (sleeping === 'on') {\n context.set(\"isWakeup\", true)\n node.send([null, sendSleep, null])\n node.log(\"Emma Bedroom Climate: Auto/Wakeup/Sleep On\")\n }\n }\n }\n// Manual Responses\n} else if (type === 'manual') {\n node.log(\"Emma Bedroom Climate: Manual\")\n if (time === 'night') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Manual Night\" })\n node.log(\"Emma Bedroom Climate: Manual/Night\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null])\n node.log(\"Emma Bedroom Climate: Manual/Night/AC\")\n }\n } else if (time === 'day') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Manual Day\" })\n node.send([null, sendWhiteNoise, null])\n node.log(\"Emma Bedroom Climate: Manual/Day\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null])\n node.log(\"Emma Bedroom Climate: Manual/Day/AC\")\n }\n } else if (time === 'bedtime') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Manual Bedtime\" })\n node.log(\"Emma Bedroom Climate: Manual/Bedtime\")\n if (validSchedModesAC.includes(schedMode) && ac === 'on') {\n node.send([[sendHvac, sendTemp, sendAcFan, sendEco], null, null])\n node.log(\"Emma Bedroom Climate: Manual/Bedtime/AC\")\n } else if (schedMode === 'White Noise') {\n node.send([null, sendWhiteNoise, null])\n node.log(\"Emma Bedroom Climate: Manual/Bedtime/White Noise\")\n }\n }\n context.set(\"isWakeup\", false)\n// Sleep Switch Responses\n} else if (type === 'sleep') {\n if (payload === 'off') {\n node.send([null, [sendPeople, sendWhiteNoise], null])\n }\n node.log(\"Emma Bedroom Climate: Sleep\")\n if (time === 'bedtime') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Sleep\" })\n node.send([null, [sendPeople, sendWhiteNoise], null])\n node.log(\"Emma Bedroom Climate: Sleep/Bedtime\")\n if (ac === 'on') {\n node.send([[sendDisplay, sendHvac, sendTemp, sendAcFan, sendEco], null, null])\n node.log(\"Emma Bedroom Climate: Sleep/Bedtime/AC\")\n }\n } else {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Wakeup\" })\n node.send([null, sendWhiteNoise, null])\n node.log(\"Emma Bedroom Climate: Sleep/Day\")\n if (ac === 'on') {\n node.send([[sendDisplay, sendHvac, sendTemp, sendAcFan, sendEco], null, null])\n node.log(`Emma Bedroom Climate: Sleep/${convertToTitleCase(time)}/AC`)\n }\n }\n context.set(\"isWakeup\", false)\n} else if (meltdown === 'on') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Blocked (Meltdown Protocol)\" })\n node.log(\"Emma Bedroom Climate: Blocked (Meltdown Protocol)\")\n} else if (vacation === 'on') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Blocked (Vacation Mode)\" })\n node.log(\"Emma Bedroom Climate: Blocked (Vacation Mode)\")\n} else {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Blocked (Automation Disabled)\" })\n node.log(\"Emma Bedroom Climate: Blocked (Automation Disabled)\")\n}\n\nnode.log(\"Emma Bedroom Climate: Processing Complete\")\n", "outputs": 3, "timeout": "", "noerr": 0, @@ -24239,7 +24239,7 @@ "z": "72f99805df043603", "g": "5802ea32c1de36e8", "name": "Meltdown Center", - "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst toggle = msg.payload\nconst ac = global.get('emmaBedroom.aircon.installed', \"diskCon\")\nconst lastMode = flow.get(\"emmaBedroom.lastMode\", \"diskCon\")\nconst bedTemp = states['input_number.emma_bedroom_bedtime_temp'].state\n\nconst emmaBedroomAircon = [\"climate.emma_bedroom_aircon\"]\n\nlet setTemp = bedTemp\nlet setEco = 'turn_off'\nlet setHvac = 'cool'\nlet setAcFan = 'High'\n\nlet sendHvac = {\n \"payload\": {\n \"action\": \"climate.set_hvac_mode\",\n \"target\": {\n \"entity_id\": emmaBedroomAircon\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"action\": \"climate.set_temperature\",\n \"target\": {\n \"entity_id\": emmaBedroomAircon\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"action\": `switch.${setEco}`,\n \"target\": {\n \"entity_id\": [\"switch.emma_bedroom_aircon_eco_mode\"]\n },\n \"data\": {}\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"action\": \"climate.set_fan_mode\",\n \"target\": {\n \"entity_id\": emmaBedroomAircon\n },\n \"data\": {\n \"fan_mode\": setAcFan\n }\n }\n}\n\nlet reset = {\n \"topic\": \"Reset\"\n}\n\nif (toggle === 'on') {\n node.status({fill:\"red\",shape:\"dot\",text:\"DANGER MODE ACTIVE\"})\n if (ac === 'on') {\n node.send([[sendHvac,sendTemp,sendAcFan,sendEco],null])\n }\n} else {\n node.status({fill:\"green\",shape:\"dot\",text:\"Danger Mode Off\"})\n node.send([null,reset])\n}", + "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst toggle = msg.payload\nconst ac = global.get('emmaBedroom.aircon.installed', \"diskCon\")\nconst lastMode = flow.get(\"emmaBedroom.lastMode\", \"diskCon\")\nconst bedTemp = states['input_number.emma_bedroom_bedtime_temp'].state\n\nconst airconEntity = [\"climate.emma_bedroom_aircon\"]\n\nlet setTemp = bedTemp\nlet setEco = 'turn_off'\nlet setHvac = 'cool'\nlet setAcFan = 'High'\n\nlet sendHvac = {\n \"payload\": {\n \"action\": \"climate.set_hvac_mode\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"action\": \"climate.set_temperature\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"action\": `switch.${setEco}`,\n \"target\": {\n \"entity_id\": [\"switch.emma_bedroom_aircon_eco_mode\"]\n },\n \"data\": {}\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"action\": \"climate.set_fan_mode\",\n \"target\": {\n \"entity_id\": airconEntity\n },\n \"data\": {\n \"fan_mode\": setAcFan\n }\n }\n}\n\nlet reset = {\n \"topic\": \"Reset\"\n}\n\nif (toggle === 'on') {\n node.status({fill:\"red\",shape:\"dot\",text:\"DANGER MODE ACTIVE\"})\n if (ac === 'on') {\n node.send([[sendHvac,sendTemp,sendAcFan,sendEco],null])\n }\n} else {\n node.status({fill:\"green\",shape:\"dot\",text:\"Danger Mode Off\"})\n node.send([null,reset])\n}", "outputs": 2, "timeout": "", "noerr": 0,