diff --git a/flows.json b/flows.json index 4aff1c5..ceb374c 100644 --- a/flows.json +++ b/flows.json @@ -884,7 +884,9 @@ "f4bfbaca4d7fb1df" ], "x": 14, - "y": 39 + "y": 39, + "w": 1192, + "h": 82 }, { "id": "fbbe69a14cbe0236", @@ -932,7 +934,9 @@ "febc179b34c8cf71" ], "x": 34, - "y": 39 + "y": 39, + "w": 692, + "h": 682 }, { "id": "46275dd0f9461013", @@ -950,7 +954,9 @@ "ca88f85ba00a6744" ], "x": 34, - "y": 739 + "y": 739, + "w": 472, + "h": 202 }, { "id": "ff6d8150e8d5e606", @@ -986,7 +992,9 @@ "f111c40459e27629" ], "x": 34, - "y": 19 + "y": 19, + "w": 1272, + "h": 502 }, { "id": "208284848b13b85b", @@ -1061,7 +1069,9 @@ "f44427c5a493c428" ], "x": 14, - "y": 139 + "y": 139, + "w": 1152, + "h": 242 }, { "id": "eeafd13be593ae69", @@ -1293,7 +1303,9 @@ "51d05298561cfddb" ], "x": 754, - "y": 39 + "y": 39, + "w": 672, + "h": 262 }, { "id": "b708cb6d93f40dee", @@ -1309,7 +1321,9 @@ "e59180a1a6ae0a90" ], "x": 1094, - "y": 659 + "y": 659, + "w": 632, + "h": 82 }, { "id": "265593f442864b6a", @@ -1369,7 +1383,9 @@ "5ba9cfc0194ef62a" ], "x": 754, - "y": 319 + "y": 319, + "w": 672, + "h": 622 }, { "id": "931cc27100c9317e", @@ -1433,7 +1449,9 @@ "99c141f21de4feda" ], "x": 74, - "y": 39 + "y": 39, + "w": 1132, + "h": 262 }, { "id": "a6de35af12739885", @@ -1455,7 +1473,9 @@ "724f186878227dad" ], "x": 74, - "y": 339 + "y": 339, + "w": 1132, + "h": 202 }, { "id": "0804d9edeca1c9fa", @@ -1476,7 +1496,9 @@ "4523045453de0a33" ], "x": 74, - "y": 579 + "y": 579, + "w": 1092, + "h": 202 }, { "id": "385f03591bc34bcc", @@ -1557,7 +1579,9 @@ "8146f43fea5aec03" ], "x": 34, - "y": 539 + "y": 539, + "w": 1192, + "h": 502 }, { "id": "b9ffa3fa5af46ec3", @@ -3891,7 +3915,7 @@ "type": "function", "z": "6429099c4571dd6b", "name": "Processing", - "func": "var room = msg.topic\n\nif (room === \"Living Room\") {\n msg.topic = \"living_room\"\n} else if (room === \"Living Room Echo Dot\") {\n msg.topic = \"living_room\"\n} else if (room === \"Basement\") {\n msg.topic = \"basement\"\n} else if (room === \"Basement Echo Dot\") {\n msg.topic = \"basement\"\n} else if (room === \"Basement Google\") {\n msg.topic = \"basement_google\"\n} else if (room === \"basement_google\") {\n msg.topic = \"basement_google\"\n} else if (room === \"Kallen Bedroom\") {\n msg.topic = \"kallen_bedroom\"\n} else if (room === \"Kallen Bedroom Speaker\") {\n msg.topic = \"kallen_bedroom\"\n} else if (room === \"Emma Bedroom\") {\n msg.topic = \"emma_bedroom\"\n} else if (room === \"Emma Bedroom Speaker\") {\n msg.topic = \"emma_bedroom\"\n} else if (room === \"Kids Bedrooms\") {\n msg.topic = \"kids_bedrooms\"\n} else if (room === \"All Bedrooms\") {\n msg.topic = \"all_bedrooms\"\n} else if (room === \"Master Bedroom\") {\n msg.topic = \"master_bedroom\"\n} else if (room === \"Master Bedroom Echo Dot\") {\n msg.topic = \"master_bedroom\"\n} else if (room === \"Common Areas\") {\n msg.topic = \"common\"\n} else if (room === \"Everywhere\") {\n msg.topic = \"everywhere\"\n}\n\nif (msg.voice) {\n msg.voice = msg.voice\n} else {\n msg.voice = global.get('jarvis_voice')\n}\n\nif (msg.type) {\n msg.type = msg.type\n} else {\n msg.type = \"normal\"\n}\n\nvar statusMsg = {\n \"payload\": msg.voice + \" speaking in \" + room\n}\n\nreturn[msg,statusMsg];", + "func": "var room = msg.topic\n\nif (room === \"Living Room\") {\n msg.topic = \"living_room\"\n} else if (room === \"Living Room Echo Dot\") {\n msg.topic = \"living_room\"\n} else if (room === \"Basement\") {\n msg.topic = \"basement\"\n} else if (room === \"Basement Echo Dot\") {\n msg.topic = \"basement\"\n} else if (room === \"Basement Google\") {\n msg.topic = \"basement_google\"\n} else if (room === \"basement_google\") {\n msg.topic = \"basement_google\"\n} else if (room === \"Kallen Bedroom\") {\n msg.topic = \"kallen_bedroom\"\n} else if (room === \"Kallen Bedroom Speaker\") {\n msg.topic = \"kallen_bedroom\"\n} else if (room === \"Emma Bedroom\") {\n msg.topic = \"emma_bedroom\"\n} else if (room === \"Emma Bedroom Speaker\") {\n msg.topic = \"emma_bedroom\"\n} else if (room === \"Kids Bedrooms\") {\n msg.topic = \"kids_bedrooms\"\n} else if (room === \"All Bedrooms\") {\n msg.topic = \"all_bedrooms\"\n} else if (room === \"Master Bedroom\") {\n msg.topic = \"master_bedroom\"\n} else if (room === \"Master Bedroom Echo Dot\") {\n msg.topic = \"master_bedroom\"\n} else if (room === \"Common Areas\") {\n msg.topic = \"common\"\n} else if (room === \"Everywhere\") {\n msg.topic = \"everywhere\"\n}\n\nif (msg.voice) {\n msg.voice = msg.voice\n} else {\n msg.voice = global.get('jarvis_voice', \"diskCon\")\n}\n\nif (msg.type) {\n msg.type = msg.type\n} else {\n msg.type = \"normal\"\n}\n\nvar statusMsg = {\n \"payload\": msg.voice + \" speaking in \" + room\n}\n\nreturn[msg,statusMsg];", "outputs": 2, "noerr": 0, "initialize": "", @@ -4472,7 +4496,7 @@ "type": "function", "z": "a4ee891237e460a2", "name": "Routing", - "func": "const str = msg.payload\nvar scene = str.replaceAll(\"_\", \" \")\nvar dynamicRooms = global.get(\"dynamicRooms\")\nvar tvRooms = global.get(\"tvRooms\")\nvar room = msg.topic\n\nvar notify = {\n \"dest\": room,\n \"topic\": \"Lights Changed\",\n \"payload\": \"Lights changed to a new scene: \" + scene\n}\n\nvar statusMsg = {\n \"payload\": \"Lights changed to a new scene: \" + scene\n}\n\nif (dynamicRooms.includes(room)) {\n node.send([msg,null,null,null])\n} else {\n node.send([null,msg,null,null])\n}\n\nif (tvRooms.includes(room)) {\n node.send([null,null,notify,null])\n}\n\nnode.send([null,null,null,statusMsg])", + "func": "const str = msg.payload\nvar scene = str.replaceAll(\"_\", \" \")\nvar dynamicRooms = global.get(\"dynamicRooms\", \"diskCon\")\nvar tvRooms = global.get(\"tvRooms\", \"diskCon\")\nvar room = msg.topic\n\nvar notify = {\n \"dest\": room,\n \"topic\": \"Lights Changed\",\n \"payload\": \"Lights changed to a new scene: \" + scene\n}\n\nvar statusMsg = {\n \"payload\": \"Lights changed to a new scene: \" + scene\n}\n\nif (dynamicRooms.includes(room)) {\n node.send([msg,null,null,null])\n} else {\n node.send([null,msg,null,null])\n}\n\nif (tvRooms.includes(room)) {\n node.send([null,null,notify,null])\n}\n\nnode.send([null,null,null,statusMsg])", "outputs": 4, "noerr": 0, "initialize": "", @@ -4504,7 +4528,7 @@ "type": "function", "z": "a4ee891237e460a2", "name": "Routing", - "func": "const str = msg.payload\nvar scene = str.replaceAll(\"_\", \" \")\nvar states = global.get('homeassistant.homeAssistant.states')\nvar dynamicRooms = global.get(\"dynamicRooms\")\nvar tvRooms = global.get(\"tvRooms\")\nvar room = msg.topic\n\nvar notify = {\n \"dest\": room,\n \"topic\":\"Lights Changed\",\n \"payload\":\"Lights changed to a new scene: \" + scene\n}\n\nvar statusMsg = {\n \"payload\": \"Lights changed to a new scene: \" + scene\n}\n\nif (scene.includes(\"Nightlight\")) {\n msg.nightlight = \"on\"\n} else {\n msg.nightlight = \"off\"\n}\n\nif (dynamicRooms.includes(room)) {\n var inputBoolean = \"input_boolean.\" + room + \"_dynamic_scenes\"\n var boolState = states[inputBoolean].state\n if (boolState === 'on') {\n node.send([msg,null,null,null])\n } else {\n node.send([null,msg,null,null])\n }\n} else {\n node.send([null,msg,null,null])\n}\n\nif (tvRooms.includes(room)) {\n node.send([null,null,notify,null])\n}\n\nnode.send([null,null,null,statusMsg])", + "func": "const str = msg.payload\nvar scene = str.replaceAll(\"_\", \" \")\nvar states = global.get('homeassistant.homeAssistant.states')\nvar dynamicRooms = global.get(\"dynamicRooms\", \"diskCon\")\nvar tvRooms = global.get(\"tvRooms\", \"diskCon\")\nvar room = msg.topic\n\nvar notify = {\n \"dest\": room,\n \"topic\":\"Lights Changed\",\n \"payload\":\"Lights changed to a new scene: \" + scene\n}\n\nvar statusMsg = {\n \"payload\": \"Lights changed to a new scene: \" + scene\n}\n\nif (scene.includes(\"Nightlight\")) {\n msg.nightlight = \"on\"\n} else {\n msg.nightlight = \"off\"\n}\n\nif (dynamicRooms.includes(room)) {\n var inputBoolean = \"input_boolean.\" + room + \"_dynamic_scenes\"\n var boolState = states[inputBoolean].state\n if (boolState === 'on') {\n node.send([msg,null,null,null])\n } else {\n node.send([null,msg,null,null])\n }\n} else {\n node.send([null,msg,null,null])\n}\n\nif (tvRooms.includes(room)) {\n node.send([null,null,notify,null])\n}\n\nnode.send([null,null,null,statusMsg])", "outputs": 4, "noerr": 0, "initialize": "", @@ -15280,7 +15304,7 @@ "d": true, "g": "ff6d8150e8d5e606", "name": "Processing", - "func": "const appList = global.get(\"appListLivingRoom\")\nvar states = global.get('homeassistant.homeAssistant.states')\nvar lampState = states['light.dining_room_lamp'].state\nvar app = msg.payload\nvar payload = {}\n\nif (appList.includes(app)) {\n flow.set(\"lampState\", lampState)\n payload = \"start\"\n} else {\n payload = \"stop\"\n}\n\nmsg.payload = payload\n\nglobal.set('tvAppLivingRoom',app)\n\nif (payload === 'start') {\n node.status({fill:\"green\",shape:\"dot\",text:app});\n return[msg,null]\n} else if (payload === 'stop') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Stopped\"});\n return[null,msg]\n}", + "func": "const appList = global.get(\"appListLivingRoom\", \"diskCon\")\nvar states = global.get('homeassistant.homeAssistant.states')\nvar lampState = states['light.dining_room_lamp'].state\nvar app = msg.payload\nvar payload = {}\n\nif (appList.includes(app)) {\n flow.set(\"lampState\", lampState)\n payload = \"start\"\n} else {\n payload = \"stop\"\n}\n\nmsg.payload = payload\n\nglobal.set('tvAppLivingRoom',app)\n\nif (payload === 'start') {\n node.status({fill:\"green\",shape:\"dot\",text:app});\n return[msg,null]\n} else if (payload === 'stop') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Stopped\"});\n return[null,msg]\n}", "outputs": 2, "noerr": 0, "initialize": "", @@ -15780,7 +15804,7 @@ "d": true, "g": "ff6d8150e8d5e606", "name": "Settings", - "func": "const appListLivingRoom = [\"YouTube\", \"Netflix\", \"MLB\", \"Jellyfin\", \"Twitch\", \"Hulu\"]\n\nglobal.set(\"appListLivingRoom\", appListLivingRoom);\n\nnode.status({fill:\"green\",shape:\"dot\",text:\"Updated\"});", + "func": "const appListLivingRoom = [\"YouTube\", \"Netflix\", \"MLB\", \"Jellyfin\", \"Twitch\", \"Hulu\"]\n\nglobal.set(\"appListLivingRoom\", appListLivingRoom, \"diskCon\");\n\nnode.status({fill:\"green\",shape:\"dot\",text:\"Updated\"});", "outputs": 0, "noerr": 0, "initialize": "", @@ -15933,7 +15957,7 @@ "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Processing", - "func": "const appList = global.get(\"appListBasement\")\nvar states = global.get('homeassistant.homeAssistant.states')\nvar app = msg.payload\nvar payload = {}\n\nif (appList.includes(app)) {\n payload = \"start\"\n} else {\n payload = \"stop\"\n}\n\nmsg.payload = payload\n\nglobal.set('tvAppBasement',app)\n\nif (payload === 'start') {\n node.status({fill:\"green\",shape:\"dot\",text:app});\n return[msg,null]\n} else if (payload === 'stop') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Stopped\"});\n return[null,msg]\n}", + "func": "const appList = global.get(\"appListBasement\", \"diskCon\")\nvar states = global.get('homeassistant.homeAssistant.states')\nvar app = msg.payload\nvar payload = {}\n\nif (appList.includes(app)) {\n payload = \"start\"\n} else {\n payload = \"stop\"\n}\n\nmsg.payload = payload\n\nglobal.set('tvAppBasement',app)\n\nif (payload === 'start') {\n node.status({fill:\"green\",shape:\"dot\",text:app});\n return[msg,null]\n} else if (payload === 'stop') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Stopped\"});\n return[null,msg]\n}", "outputs": 2, "noerr": 0, "initialize": "", @@ -16380,7 +16404,7 @@ "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Settings", - "func": "const appListBasement = [\"YouTube\", \"Netflix\", \"MLB\", \"Jellyfin\", \"Twitch\", \"Hulu\", \"Google Cast\"]\n\nglobal.set(\"appListBasement\", appListBasement);\n\nnode.status({fill:\"green\",shape:\"dot\",text:\"Updated\"});", + "func": "const appListBasement = [\"YouTube\", \"Netflix\", \"MLB\", \"Jellyfin\", \"Twitch\", \"Hulu\", \"Google Cast\"]\n\nglobal.set(\"appListBasement\", appListBasement, \"diskCon\");\n\nnode.status({fill:\"green\",shape:\"dot\",text:\"Updated\"});", "outputs": 0, "noerr": 0, "initialize": "", @@ -17789,7 +17813,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('mb_aircon_installed')\nconst temp = global.get(\"tempStr\")\nconst payload = msg.payload\nconst vacation = states['input_boolean.vacation_mode'].state\nconst adults = states['group.adults'].state\nconst highTemp = states['sensor.today_corrected_high_temp'].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\nnode.log(\"Master Bedroom Climate: Constants Set\")\n\n// init variables\n\nlet setTemp = []\nlet setEco = []\nlet setHvac = []\nlet setFan = []\nlet setCool = []\nlet setSleep = []\nlet time = []\nlet type = msg.type\nlet topic = msg.topic\nnode.log(\"Master Bedroom Climate: Variables Defined\")\n\n// Sleep Switch Handling\nif (type === 'sleep' && payload === 'off') {\n if (coolingActive === 'on') {\n time = 'night'\n } else {\n time = 'day'\n }\n} else if (type === 'sleep' && payload === 'on') {\n time = 'bedtime'\n} else {\n time = msg.time\n}\n\nif (topic === 'mrbedroom-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 setFan = \"turn_off\"\n if (ac === 'on') {\n if (danger === 'Extreme') {\n setTemp = nightTemp\n setEco = \"eco\"\n setHvac = \"cool\"\n } else if (hotDay === 'on' || heatWarning === 'on') {\n setTemp = dayTemp\n setEco = \"eco\"\n setHvac = \"cool\"\n } else {\n setTemp = nightTemp\n setEco = \"eco\"\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 = 'off'\n } else {\n setEco = 'on'\n }\n }\n }\n// Night Time\n} else if (time === 'night') {\n if (type === 'auto') {\n setCool = 'turn_on'\n }\n if (danger === 'Extreme') {\n setTemp = bedTemp\n } else {\n setTemp = nightTemp\n }\n if (hotDay === 'on' || sleeping === 'on') {\n setEco = 'none'\n } else {\n setEco = 'eco'\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 (fanMode === 'Fan') {\n setFan = 'turn_on'\n }\n// Bed Time\n} else if (time === 'bedtime') {\n if (ac === 'on') {\n setTemp = bedTemp\n setEco = 'none'\n if (acMode === 'AC') {\n setHvac = 'cool'\n } else if (acMode === 'Fan') {\n setHvac = \"fan_only\"\n }\n }\n if (fanMode === 'Fan') {\n setFan = 'turn_on'\n }\n}\nnode.log(\"Master Bedroom Climate: Decision Logic Complete\")\n\n// Define message payloads\n\nlet sendFan = {\n \"payload\": {\n \"domain\": \"fan\",\n \"service\": setFan,\n \"target\": {\n \"entity_id\": [\"fan.master_bedroom_fan\"]\n },\n \"data\": {}\n }\n}\n\nlet sendCool = {\n \"payload\": {\n \"domain\": \"input_boolean\",\n \"service\": setCool,\n \"target\": {\n \"entity_id\": [\"input_boolean.master_bedroom_cooling_on\"]\n },\n \"data\": {}\n }\n}\n\nlet sendSleep = {\n \"payload\": {\n \"domain\": \"input_boolean\",\n \"service\": setSleep,\n \"target\": {\n \"entity_id\": [\"input_boolean.master_bedroom_sleeping\"]\n },\n \"data\": {}\n }\n}\n\nlet notify = {\n \"topic\": topic,\n \"nighttemp\": nightTemp,\n \"acmode\": acMode,\n \"fanmode\": fanMode\n}\n\nlet sendHvac = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_hvac_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_temperature\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_preset_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"preset_mode\": setEco\n }\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_fan_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"fan_mode\": \"Auto\"\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(\"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])\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, sendEco, sendAcFan], null, null])\n node.log(\"Master Bedroom Climate: Auto/Cooling\")\n } else if (topic === 'mrbedroom-bedtime') {\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, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Bedtime/AC\")\n }\n if (fanMode === 'fan') {\n node.send([null, sendFan, 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])\n node.log(\"Master Bedroom Climate: Auto/Fan\")\n } else if (topic === 'mrbedroom-wakeup') {\n node.status({ fill: \"green\", shape: \"dot\", text: \"Wakeup Schedule\" })\n node.log(\"Master Bedroom Climate: Auto/Wakeup\");\n if (sleeping === 'off') {\n node.send([null, sendFan, null, null])\n node.log(\"Master Bedroom Climate: Auto/Wakeup/Sleep Off\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Wakeup/AC On\")\n }\n } else if (sleeping === 'on') {\n node.send([null, null, sendSleep, 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])\n node.log(\"Master Bedroom Climate: Manual/Night\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], 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])\n node.log(\"Master Bedroom Climate: Manual/Day\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], 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])\n node.log(\"Master Bedroom Climate: Manual/Bedtime\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Bedtime/AC\");\n }\n }\n} else if (type === 'sleep') {\n node.log(\"Master Bedroom Climate: Sleep\");\n if (time === 'night') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Wakeup (Hot Day)\" })\n node.send([null, sendFan, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Night\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Night/AC\")\n }\n } else if (time === 'day') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Wakeup\" })\n node.send([null, sendFan, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Day\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Day/AC\")\n }\n } else if (time === 'bedtime') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Sleep\" })\n node.send([null, sendFan, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Bedtime\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Bedtime/AC\")\n }\n }\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('mb_aircon_installed', \"diskCon\")\nconst temp = global.get(\"tempStr\")\nconst payload = msg.payload\nconst vacation = states['input_boolean.vacation_mode'].state\nconst adults = states['group.adults'].state\nconst highTemp = states['sensor.today_corrected_high_temp'].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\nnode.log(\"Master Bedroom Climate: Constants Set\")\n\n// init variables\n\nlet setTemp = []\nlet setEco = []\nlet setHvac = []\nlet setFan = []\nlet setCool = []\nlet setSleep = []\nlet time = []\nlet type = msg.type\nlet topic = msg.topic\nnode.log(\"Master Bedroom Climate: Variables Defined\")\n\n// Sleep Switch Handling\nif (type === 'sleep' && payload === 'off') {\n if (coolingActive === 'on') {\n time = 'night'\n } else {\n time = 'day'\n }\n} else if (type === 'sleep' && payload === 'on') {\n time = 'bedtime'\n} else {\n time = msg.time\n}\n\nif (topic === 'mrbedroom-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 setFan = \"turn_off\"\n if (ac === 'on') {\n if (danger === 'Extreme') {\n setTemp = nightTemp\n setEco = \"eco\"\n setHvac = \"cool\"\n } else if (hotDay === 'on' || heatWarning === 'on') {\n setTemp = dayTemp\n setEco = \"eco\"\n setHvac = \"cool\"\n } else {\n setTemp = nightTemp\n setEco = \"eco\"\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 = 'off'\n } else {\n setEco = 'on'\n }\n }\n }\n// Night Time\n} else if (time === 'night') {\n if (type === 'auto') {\n setCool = 'turn_on'\n }\n if (danger === 'Extreme') {\n setTemp = bedTemp\n } else {\n setTemp = nightTemp\n }\n if (hotDay === 'on' || sleeping === 'on') {\n setEco = 'none'\n } else {\n setEco = 'eco'\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 (fanMode === 'Fan') {\n setFan = 'turn_on'\n }\n// Bed Time\n} else if (time === 'bedtime') {\n if (ac === 'on') {\n setTemp = bedTemp\n setEco = 'none'\n if (acMode === 'AC') {\n setHvac = 'cool'\n } else if (acMode === 'Fan') {\n setHvac = \"fan_only\"\n }\n }\n if (fanMode === 'Fan') {\n setFan = 'turn_on'\n }\n}\nnode.log(\"Master Bedroom Climate: Decision Logic Complete\")\n\n// Define message payloads\n\nlet sendFan = {\n \"payload\": {\n \"domain\": \"fan\",\n \"service\": setFan,\n \"target\": {\n \"entity_id\": [\"fan.master_bedroom_fan\"]\n },\n \"data\": {}\n }\n}\n\nlet sendCool = {\n \"payload\": {\n \"domain\": \"input_boolean\",\n \"service\": setCool,\n \"target\": {\n \"entity_id\": [\"input_boolean.master_bedroom_cooling_on\"]\n },\n \"data\": {}\n }\n}\n\nlet sendSleep = {\n \"payload\": {\n \"domain\": \"input_boolean\",\n \"service\": setSleep,\n \"target\": {\n \"entity_id\": [\"input_boolean.master_bedroom_sleeping\"]\n },\n \"data\": {}\n }\n}\n\nlet notify = {\n \"topic\": topic,\n \"nighttemp\": nightTemp,\n \"acmode\": acMode,\n \"fanmode\": fanMode\n}\n\nlet sendHvac = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_hvac_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_temperature\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_preset_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"preset_mode\": setEco\n }\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_fan_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"fan_mode\": \"Auto\"\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(\"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])\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, sendEco, sendAcFan], null, null])\n node.log(\"Master Bedroom Climate: Auto/Cooling\")\n } else if (topic === 'mrbedroom-bedtime') {\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, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Bedtime/AC\")\n }\n if (fanMode === 'fan') {\n node.send([null, sendFan, 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])\n node.log(\"Master Bedroom Climate: Auto/Fan\")\n } else if (topic === 'mrbedroom-wakeup') {\n node.status({ fill: \"green\", shape: \"dot\", text: \"Wakeup Schedule\" })\n node.log(\"Master Bedroom Climate: Auto/Wakeup\");\n if (sleeping === 'off') {\n node.send([null, sendFan, null, null])\n node.log(\"Master Bedroom Climate: Auto/Wakeup/Sleep Off\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Wakeup/AC On\")\n }\n } else if (sleeping === 'on') {\n node.send([null, null, sendSleep, 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])\n node.log(\"Master Bedroom Climate: Manual/Night\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], 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])\n node.log(\"Master Bedroom Climate: Manual/Day\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], 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])\n node.log(\"Master Bedroom Climate: Manual/Bedtime\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Bedtime/AC\");\n }\n }\n} else if (type === 'sleep') {\n node.log(\"Master Bedroom Climate: Sleep\");\n if (time === 'night') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Wakeup (Hot Day)\" })\n node.send([null, sendFan, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Night\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Night/AC\")\n }\n } else if (time === 'day') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Wakeup\" })\n node.send([null, sendFan, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Day\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Day/AC\")\n }\n } else if (time === 'bedtime') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Sleep\" })\n node.send([null, sendFan, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Bedtime\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Bedtime/AC\")\n }\n }\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": 4, "noerr": 0, "initialize": "", @@ -18636,7 +18660,7 @@ "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Meltdown Center", - "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst toggle = msg.payload\nconst ac = global.get('mb_aircon_installed')\nconst lastMode = flow.get(\"lastMode\")\nconst bedTemp = states['input_number.master_bedroom_bedtime_temp'].state\n\nlet setTemp = bedTemp\nlet setEco = 'none'\nlet setHvac = 'cool'\nlet setAcFan = 'High'\nlet setFan = 'turn_off'\n\nlet sendFan = {\n \"payload\": {\n \"domain\": \"fan\",\n \"service\": setFan,\n \"target\": {\n \"entity_id\": [\"fan.master_bedroom_fan\"]\n },\n \"data\": {}\n }\n}\n\nlet sendHvac = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_hvac_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_temperature\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_preset_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"preset_mode\": setEco\n }\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_fan_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\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,sendEco,sendTemp],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('mb_aircon_installed', \"diskCon\")\nconst lastMode = flow.get(\"lastMode\", \"diskCon\")\nconst bedTemp = states['input_number.master_bedroom_bedtime_temp'].state\n\nlet setTemp = bedTemp\nlet setEco = 'none'\nlet setHvac = 'cool'\nlet setAcFan = 'High'\nlet setFan = 'turn_off'\n\nlet sendFan = {\n \"payload\": {\n \"domain\": \"fan\",\n \"service\": setFan,\n \"target\": {\n \"entity_id\": [\"fan.master_bedroom_fan\"]\n },\n \"data\": {}\n }\n}\n\nlet sendHvac = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_hvac_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_temperature\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_preset_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"preset_mode\": setEco\n }\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_fan_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\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,sendEco,sendTemp],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, "noerr": 0, "initialize": "", @@ -18778,7 +18802,7 @@ "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Set Mode", - "func": "const states = global.get(\"homeassistant.homeAssistant.states\")\nconst sleeping = states[\"input_boolean.master_bedroom_sleeping\"].state\nconst earlyNight = states[\"binary_sensor.early_night_mode\"].state\nconst giveMeDarkness = states[\"input_boolean.give_me_darkness\"].state\nconst nightMode = states[\"input_boolean.night_mode\"].state\nconst goodnight = states[\"input_boolean.goodnight\"].state\nconst coolingActive = states['input_boolean.master_bedroom_cooling_on'].state\n\nlet lastMode = []\n\nif (sleeping === 'on' || nightMode === 'on' || goodnight === 'on') {\n lastMode = 'bedtime'\n} else if (earlyNight === 'on' || giveMeDarkness === 'on' || coolingActive) {\n lastMode = 'night'\n} else {\n lastMode = 'day'\n}\n\nflow.set(\"lastMode\", lastMode)\nnode.status({ fill: \"green\", shape: \"dot\", text: \"Last Mode Set: \" + lastMode})", + "func": "const states = global.get(\"homeassistant.homeAssistant.states\")\nconst sleeping = states[\"input_boolean.master_bedroom_sleeping\"].state\nconst earlyNight = states[\"binary_sensor.early_night_mode\"].state\nconst giveMeDarkness = states[\"input_boolean.give_me_darkness\"].state\nconst nightMode = states[\"input_boolean.night_mode\"].state\nconst goodnight = states[\"input_boolean.goodnight\"].state\nconst coolingActive = states['input_boolean.master_bedroom_cooling_on'].state\n\nlet lastMode = []\n\nif (sleeping === 'on' || nightMode === 'on' || goodnight === 'on') {\n lastMode = 'bedtime'\n} else if (earlyNight === 'on' || giveMeDarkness === 'on' || coolingActive) {\n lastMode = 'night'\n} else {\n lastMode = 'day'\n}\n\nflow.set(\"lastMode\", lastMode, \"diskCon\")\nnode.status({ fill: \"green\", shape: \"dot\", text: \"Last Mode Set: \" + lastMode})", "outputs": 0, "noerr": 0, "initialize": "", @@ -18952,7 +18976,7 @@ "type": "function", "z": "72f99805df043603", "name": "Reset", - "func": "const lastMode = flow.get('lastMode')\nconst linkSource = msg._linkSource\n\nlet setTime = []\nlet setType = []\nlet setTopic = []\n\nif (lastMode === 'day') {\n setTime = 'day'\n setType = 'manual'\n setTopic = 'manual-day'\n} else if (lastMode === 'night') {\n setTime = 'night'\n setType = 'manual'\n setTopic = 'manual-night'\n} else if (lastMode === 'bedtime') {\n setTime = 'bedtime'\n setType = 'manual'\n setTopic = 'manual-bedtime'\n}\n\nlet reset = {\n \"type\": setType,\n \"time\": setTime,\n \"topic\": setTopic,\n \"_linkSource\": linkSource\n}\n\nnode.send(reset)\nnode.status({ fill: \"green\", shape: \"dot\", text: \"Mode reset to \" + setTopic})", + "func": "const lastMode = flow.get('lastMode', \"diskCon\")\nconst linkSource = msg._linkSource\n\nlet setTime = []\nlet setType = []\nlet setTopic = []\n\nif (lastMode === 'day') {\n setTime = 'day'\n setType = 'manual'\n setTopic = 'manual-day'\n} else if (lastMode === 'night') {\n setTime = 'night'\n setType = 'manual'\n setTopic = 'manual-night'\n} else if (lastMode === 'bedtime') {\n setTime = 'bedtime'\n setType = 'manual'\n setTopic = 'manual-bedtime'\n}\n\nlet reset = {\n \"type\": setType,\n \"time\": setTime,\n \"topic\": setTopic,\n \"_linkSource\": linkSource\n}\n\nnode.send(reset)\nnode.status({ fill: \"green\", shape: \"dot\", text: \"Mode reset to \" + setTopic})", "outputs": 1, "noerr": 0, "initialize": "", @@ -23766,7 +23790,7 @@ "z": "ee67610b4a0578d2", "g": "477e752fcd2e2a19", "name": "Processing", - "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar message = states['input_text.tts_message'].state\nvar who = states['input_select.tts_devices'].state\nvar voice = states['input_select.announcement_voice'].state\nconst resetMessage = 'Words go here and stuff'\nconst resetWho = 'Living Room'\nconst resetVoice = global.get(\"jarvis_voice\")\n\nmsg.payload = message\nmsg.topic = who\nmsg.voice = voice\n\nmsg.reset_message = resetMessage\nmsg.reset_who = resetWho\nmsg.reset_voice = resetVoice\n\nnode.status({fill:\"green\",shape:\"dot\",text:voice + \" speaking in \" + who});\n\nreturn msg;", + "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar message = states['input_text.tts_message'].state\nvar who = states['input_select.tts_devices'].state\nvar voice = states['input_select.announcement_voice'].state\nconst resetMessage = 'Words go here and stuff'\nconst resetWho = 'Living Room'\nconst resetVoice = global.get(\"jarvis_voice\", \"diskCon\")\n\nmsg.payload = message\nmsg.topic = who\nmsg.voice = voice\n\nmsg.reset_message = resetMessage\nmsg.reset_who = resetWho\nmsg.reset_voice = resetVoice\n\nnode.status({fill:\"green\",shape:\"dot\",text:voice + \" speaking in \" + who});\n\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", @@ -25178,10 +25202,10 @@ "type": "function", "z": "fc6801ef8637d652", "name": "Init", - "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst team = msg.activeEvent\n\nif (team === 'No events today') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"No events today\" })\n node.done\n} else {\n const lower = team.toLowerCase()\n const convert = lower.replaceAll(\" \", \"_\")\n const sensor = \"sensor.\" + convert\n const getInhibitSensor = \"binary_sensor.\" + convert + \"_inhibit\"\n const inhibit = states[getInhibitSensor].state\n const teamSensor = states[sensor]\n\n flow.set(\"team\", convert)\n flow.set(\"inhibit\", inhibit)\n flow.set(\"teamSensor\", teamSensor)\n \n node.status({fill:\"green\",shape:\"dot\",text:\"Team: \" + team})\n node.log(\"Active sports team changed to \" + team)\n}", + "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst team = msg.activeEvent\n\nif (team === 'No events today') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"No events today\" })\n node.done\n} else {\n const lower = team.toLowerCase()\n const convert = lower.replaceAll(\" \", \"_\")\n const sensor = \"sensor.\" + convert\n const getInhibitSensor = \"binary_sensor.\" + convert + \"_inhibit\"\n const inhibit = states[getInhibitSensor].state\n const teamSensor = states[sensor]\n\n flow.set(\"team\", convert, \"diskCon\")\n flow.set(\"inhibit\", inhibit, \"diskCon\")\n flow.set(\"teamSensor\", teamSensor, \"diskCon\")\n \n node.status({fill:\"green\",shape:\"dot\",text:\"Team: \" + team})\n node.log(\"Active sports team changed to \" + team)\n}", "outputs": 0, "noerr": 0, - "initialize": "const teams = [\"michigan_wolverines\",\n \"ohio_state_buckeyes\",\n \"toledo_rockets\",\n \"minnesota_vikings\",\n \"san_francisco_49ers\",\n \"cleveland_guardians\",\n \"minnesota_twins\",\n \"los_angeles_dodgers\"]\n\nconst michigan_wolverines = ['sensor.michigan_wolverines', 'binary_sensor.michigan_wolverines_inhibit']\nconst ohio_state_buckeyes = ['sensor.ohio_state_buckeyes', 'binary_sensor.ohio_state_buckeyes_inhibit']\nconst toledo_rockets = ['sensor.toledo_rockets', 'binary_sensor.toledo_rockets_inhibit']\nconst minnesota_vikings = ['sensor.minnesota_vikings', 'binary_sensor.minnesota_vikings_inhibit']\nconst san_francisco_49ers = ['sensor.san_francisco_49ers', 'binary_sensor.san_francisco_49ers_inhibit']\nconst cleveland_guardians = ['sensor.cleveland_guardians', 'binary_sensor.cleveland_guardians_inhibit']\nconst minnesota_twins = ['sensor.minnesota_twins', 'binary_sensor.minnesota_twins_inhibit']\nconst los_angeles_dodgers = ['sensor.los_angeles_dodgers', 'binary_sensor.los_angeles_dodgers_inhibit']\n\nflow.set(\"teams\", teams)\nflow.set(\"michigan_wolverines\", michigan_wolverines)\nflow.set(\"ohio_state_buckeyes\", ohio_state_buckeyes)\nflow.set(\"toledo_rockets\", toledo_rockets)\nflow.set(\"minnesota_vikings\", minnesota_vikings)\nflow.set(\"san_francisco_49ers\", san_francisco_49ers)\nflow.set(\"cleveland_guardians\", cleveland_guardians)\nflow.set(\"minnesota_twins\", minnesota_twins)\nflow.set(\"los_angeles_dodgers\", los_angeles_dodgers)", + "initialize": "const teams = [\"michigan_wolverines\",\n \"ohio_state_buckeyes\",\n \"toledo_rockets\",\n \"minnesota_vikings\",\n \"san_francisco_49ers\",\n \"cleveland_guardians\",\n \"minnesota_twins\",\n \"los_angeles_dodgers\"]\n\nconst michigan_wolverines = ['sensor.michigan_wolverines', 'binary_sensor.michigan_wolverines_inhibit']\nconst ohio_state_buckeyes = ['sensor.ohio_state_buckeyes', 'binary_sensor.ohio_state_buckeyes_inhibit']\nconst toledo_rockets = ['sensor.toledo_rockets', 'binary_sensor.toledo_rockets_inhibit']\nconst minnesota_vikings = ['sensor.minnesota_vikings', 'binary_sensor.minnesota_vikings_inhibit']\nconst san_francisco_49ers = ['sensor.san_francisco_49ers', 'binary_sensor.san_francisco_49ers_inhibit']\nconst cleveland_guardians = ['sensor.cleveland_guardians', 'binary_sensor.cleveland_guardians_inhibit']\nconst minnesota_twins = ['sensor.minnesota_twins', 'binary_sensor.minnesota_twins_inhibit']\nconst los_angeles_dodgers = ['sensor.los_angeles_dodgers', 'binary_sensor.los_angeles_dodgers_inhibit']\n\nflow.set(\"teams\", teams, \"diskCon\")\nflow.set(\"michigan_wolverines\", michigan_wolverines, \"diskCon\")\nflow.set(\"ohio_state_buckeyes\", ohio_state_buckeyes, \"diskCon\")\nflow.set(\"toledo_rockets\", toledo_rockets, \"diskCon\")\nflow.set(\"minnesota_vikings\", minnesota_vikings, \"diskCon\")\nflow.set(\"san_francisco_49ers\", san_francisco_49ers, \"diskCon\")\nflow.set(\"cleveland_guardians\", cleveland_guardians, \"diskCon\")\nflow.set(\"minnesota_twins\", minnesota_twins, \"diskCon\")\nflow.set(\"los_angeles_dodgers\", los_angeles_dodgers, \"diskCon\")", "finalize": "", "libs": [], "x": 710, @@ -25280,7 +25304,7 @@ "type": "function", "z": "fc6801ef8637d652", "name": "Events Today", - "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst teams = flow.get(\"teams\")\nlet teamsToday = []\nlet options = []\n\nfor (let index = 0; index < teams.length; index++) {\n const element = teams[index];\n let sensor = \"sensor.\" + element\n let binary_today = \"binary_sensor.\" + element + \"_event_today\"\n let binary_inhibit = \"binary_sensor.\" + element + \"_inhibit\"\n let today = states[binary_today].state\n let inhibit = states[binary_inhibit].state\n let teamName = states[sensor].attributes.friendly_name\n if (today === 'on' && inhibit === 'off') {\n teamsToday.push(teamName)\n }\n}\n\nflow.set(\"teamsToday\", teamsToday)\n\nif (teamsToday.length > 0) {\n options = teamsToday\n node.status({fill:\"green\",shape:\"dot\",text:\"Events today: \" + teamsToday.length})\n} else {\n options = ['No events today']\n node.status({fill:\"red\",shape:\"ring\",text:\"No events today\"});\n}\n\nmsg.payload = {\n \"options\": options\n}\n\nnode.send(msg)\nnode.done", + "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst teams = flow.get(\"teams\", \"diskCon\")\nlet teamsToday = []\nlet options = []\n\nfor (let index = 0; index < teams.length; index++) {\n const element = teams[index];\n let sensor = \"sensor.\" + element\n let binary_today = \"binary_sensor.\" + element + \"_event_today\"\n let binary_inhibit = \"binary_sensor.\" + element + \"_inhibit\"\n let today = states[binary_today].state\n let inhibit = states[binary_inhibit].state\n let teamName = states[sensor].attributes.friendly_name\n if (today === 'on' && inhibit === 'off') {\n teamsToday.push(teamName)\n }\n}\n\nflow.set(\"teamsToday\", teamsToday, \"diskCon\")\n\nif (teamsToday.length > 0) {\n options = teamsToday\n node.status({fill:\"green\",shape:\"dot\",text:\"Events today: \" + teamsToday.length})\n} else {\n options = ['No events today']\n node.status({fill:\"red\",shape:\"ring\",text:\"No events today\"});\n}\n\nmsg.payload = {\n \"options\": options\n}\n\nnode.send(msg)\nnode.done", "outputs": 1, "noerr": 0, "initialize": "", @@ -28016,7 +28040,7 @@ "rules": [ { "t": "set", - "p": "jarvis_voice", + "p": "#:(diskCon)::jarvis_voice", "pt": "global", "to": "payload", "tot": "msg" @@ -28161,7 +28185,7 @@ "rules": [ { "t": "set", - "p": "mb_aircon_installed", + "p": "#:(diskCon)::mb_aircon_installed", "pt": "global", "to": "payload", "tot": "msg" @@ -28749,7 +28773,7 @@ "type": "function", "z": "3e4ba157b540d183", "name": "Constants", - "func": "// Set options here\nconst dynamicRooms = [\"living_room\",\"basement_studio\"]\nconst tvRooms = [\"living_room\",\"basement\",\"basement_studio\",\"master_bedroom\"]\n\n// Commit those options to global context\nglobal.set(\"dynamicRooms\", dynamicRooms)\nglobal.set(\"tvRooms\", tvRooms)\n\nnode.status({fill:\"green\",shape:\"dot\",text:\"Saved\"});", + "func": "// Set options here\nconst dynamicRooms = [\"living_room\",\"basement_studio\"]\nconst tvRooms = [\"living_room\",\"basement\",\"basement_studio\",\"master_bedroom\"]\n\n// Commit those options to global context\nglobal.set(\"dynamicRooms\", dynamicRooms, \"diskCon\")\nglobal.set(\"tvRooms\", tvRooms, \"diskCon\")\n\nnode.status({fill:\"green\",shape:\"dot\",text:\"Saved\"});", "outputs": 0, "noerr": 0, "initialize": "", @@ -29785,7 +29809,7 @@ "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "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('mb_aircon_installed')\nconst temp = global.get(\"tempStr\")\nconst payload = msg.payload\nconst vacation = states['input_boolean.vacation_mode'].state\nconst adults = states['group.adults'].state\nconst highTemp = states['sensor.today_corrected_high_temp'].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\nnode.log(\"Master Bedroom Climate: Constants Set\")\n\n// init variables\n\nlet setTemp = []\nlet setEco = []\nlet setHvac = []\nlet setFan = []\nlet setCool = []\nlet setSleep = []\nlet time = []\nlet type = msg.type\nlet topic = msg.topic\nnode.log(\"Master Bedroom Climate: Variables Defined\")\n\n// Sleep Switch Handling\nif (type === 'sleep' && payload === 'off') {\n if (coolingActive === 'on') {\n time = 'night'\n } else {\n time = 'day'\n }\n} else if (type === 'sleep' && payload === 'on') {\n time = 'bedtime'\n} else {\n time = msg.time\n}\n\nif (topic === 'mrbedroom-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 setFan = \"turn_off\"\n if (ac === 'on') {\n if (danger === 'Extreme') {\n setTemp = nightTemp\n setEco = \"eco\"\n setHvac = \"cool\"\n } else if (hotDay === 'on' || heatWarning === 'on') {\n setTemp = dayTemp\n setEco = \"eco\"\n setHvac = \"cool\"\n } else {\n setTemp = nightTemp\n setEco = \"eco\"\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 = 'off'\n } else {\n setEco = 'on'\n }\n }\n }\n// Night Time\n} else if (time === 'night') {\n if (type === 'auto') {\n setCool = 'turn_on'\n }\n if (danger === 'Extreme') {\n setTemp = bedTemp\n } else {\n setTemp = nightTemp\n }\n if (hotDay === 'on' || sleeping === 'on') {\n setEco = 'none'\n } else {\n setEco = 'eco'\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 (fanMode === 'Fan') {\n setFan = 'turn_on'\n }\n// Bed Time\n} else if (time === 'bedtime') {\n if (ac === 'on') {\n setTemp = bedTemp\n setEco = 'none'\n if (acMode === 'AC') {\n setHvac = 'cool'\n } else if (acMode === 'Fan') {\n setHvac = \"fan_only\"\n }\n }\n if (fanMode === 'Fan') {\n setFan = 'turn_on'\n }\n}\nnode.log(\"Master Bedroom Climate: Decision Logic Complete\")\n\n// Define message payloads\n\nlet sendFan = {\n \"payload\": {\n \"domain\": \"fan\",\n \"service\": setFan,\n \"target\": {\n \"entity_id\": [\"fan.master_bedroom_fan\"]\n },\n \"data\": {}\n }\n}\n\nlet sendCool = {\n \"payload\": {\n \"domain\": \"input_boolean\",\n \"service\": setCool,\n \"target\": {\n \"entity_id\": [\"input_boolean.master_bedroom_cooling_on\"]\n },\n \"data\": {}\n }\n}\n\nlet sendSleep = {\n \"payload\": {\n \"domain\": \"input_boolean\",\n \"service\": setSleep,\n \"target\": {\n \"entity_id\": [\"input_boolean.master_bedroom_sleeping\"]\n },\n \"data\": {}\n }\n}\n\nlet notify = {\n \"topic\": topic,\n \"nighttemp\": nightTemp,\n \"acmode\": acMode,\n \"fanmode\": fanMode\n}\n\nlet sendHvac = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_hvac_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_temperature\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_preset_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"preset_mode\": setEco\n }\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_fan_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"fan_mode\": \"Auto\"\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(\"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])\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, sendEco, sendAcFan], null, null])\n node.log(\"Master Bedroom Climate: Auto/Cooling\")\n } else if (topic === 'mrbedroom-bedtime') {\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, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Bedtime/AC\")\n }\n if (fanMode === 'fan') {\n node.send([null, sendFan, 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])\n node.log(\"Master Bedroom Climate: Auto/Fan\")\n } else if (topic === 'mrbedroom-wakeup') {\n node.status({ fill: \"green\", shape: \"dot\", text: \"Wakeup Schedule\" })\n node.log(\"Master Bedroom Climate: Auto/Wakeup\");\n if (sleeping === 'off') {\n node.send([null, sendFan, null, null])\n node.log(\"Master Bedroom Climate: Auto/Wakeup/Sleep Off\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Wakeup/AC On\")\n }\n } else if (sleeping === 'on') {\n node.send([null, null, sendSleep, 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])\n node.log(\"Master Bedroom Climate: Manual/Night\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], 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])\n node.log(\"Master Bedroom Climate: Manual/Day\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], 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])\n node.log(\"Master Bedroom Climate: Manual/Bedtime\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Bedtime/AC\");\n }\n }\n} else if (type === 'sleep') {\n node.log(\"Master Bedroom Climate: Sleep\");\n if (time === 'night') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Wakeup (Hot Day)\" })\n node.send([null, sendFan, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Night\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Night/AC\")\n }\n } else if (time === 'day') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Wakeup\" })\n node.send([null, sendFan, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Day\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Day/AC\")\n }\n } else if (time === 'bedtime') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Sleep\" })\n node.send([null, sendFan, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Bedtime\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Bedtime/AC\")\n }\n }\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('mb_aircon_installed', \"diskCon\")\nconst temp = global.get(\"tempStr\")\nconst payload = msg.payload\nconst vacation = states['input_boolean.vacation_mode'].state\nconst adults = states['group.adults'].state\nconst highTemp = states['sensor.today_corrected_high_temp'].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\nnode.log(\"Master Bedroom Climate: Constants Set\")\n\n// init variables\n\nlet setTemp = []\nlet setEco = []\nlet setHvac = []\nlet setFan = []\nlet setCool = []\nlet setSleep = []\nlet time = []\nlet type = msg.type\nlet topic = msg.topic\nnode.log(\"Master Bedroom Climate: Variables Defined\")\n\n// Sleep Switch Handling\nif (type === 'sleep' && payload === 'off') {\n if (coolingActive === 'on') {\n time = 'night'\n } else {\n time = 'day'\n }\n} else if (type === 'sleep' && payload === 'on') {\n time = 'bedtime'\n} else {\n time = msg.time\n}\n\nif (topic === 'mrbedroom-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 setFan = \"turn_off\"\n if (ac === 'on') {\n if (danger === 'Extreme') {\n setTemp = nightTemp\n setEco = \"eco\"\n setHvac = \"cool\"\n } else if (hotDay === 'on' || heatWarning === 'on') {\n setTemp = dayTemp\n setEco = \"eco\"\n setHvac = \"cool\"\n } else {\n setTemp = nightTemp\n setEco = \"eco\"\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 = 'off'\n } else {\n setEco = 'on'\n }\n }\n }\n// Night Time\n} else if (time === 'night') {\n if (type === 'auto') {\n setCool = 'turn_on'\n }\n if (danger === 'Extreme') {\n setTemp = bedTemp\n } else {\n setTemp = nightTemp\n }\n if (hotDay === 'on' || sleeping === 'on') {\n setEco = 'none'\n } else {\n setEco = 'eco'\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 (fanMode === 'Fan') {\n setFan = 'turn_on'\n }\n// Bed Time\n} else if (time === 'bedtime') {\n if (ac === 'on') {\n setTemp = bedTemp\n setEco = 'none'\n if (acMode === 'AC') {\n setHvac = 'cool'\n } else if (acMode === 'Fan') {\n setHvac = \"fan_only\"\n }\n }\n if (fanMode === 'Fan') {\n setFan = 'turn_on'\n }\n}\nnode.log(\"Master Bedroom Climate: Decision Logic Complete\")\n\n// Define message payloads\n\nlet sendFan = {\n \"payload\": {\n \"domain\": \"fan\",\n \"service\": setFan,\n \"target\": {\n \"entity_id\": [\"fan.master_bedroom_fan\"]\n },\n \"data\": {}\n }\n}\n\nlet sendCool = {\n \"payload\": {\n \"domain\": \"input_boolean\",\n \"service\": setCool,\n \"target\": {\n \"entity_id\": [\"input_boolean.master_bedroom_cooling_on\"]\n },\n \"data\": {}\n }\n}\n\nlet sendSleep = {\n \"payload\": {\n \"domain\": \"input_boolean\",\n \"service\": setSleep,\n \"target\": {\n \"entity_id\": [\"input_boolean.master_bedroom_sleeping\"]\n },\n \"data\": {}\n }\n}\n\nlet notify = {\n \"topic\": topic,\n \"nighttemp\": nightTemp,\n \"acmode\": acMode,\n \"fanmode\": fanMode\n}\n\nlet sendHvac = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_hvac_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_temperature\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_preset_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"preset_mode\": setEco\n }\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_fan_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"fan_mode\": \"Auto\"\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(\"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])\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, sendEco, sendAcFan], null, null])\n node.log(\"Master Bedroom Climate: Auto/Cooling\")\n } else if (topic === 'mrbedroom-bedtime') {\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, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Bedtime/AC\")\n }\n if (fanMode === 'fan') {\n node.send([null, sendFan, 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])\n node.log(\"Master Bedroom Climate: Auto/Fan\")\n } else if (topic === 'mrbedroom-wakeup') {\n node.status({ fill: \"green\", shape: \"dot\", text: \"Wakeup Schedule\" })\n node.log(\"Master Bedroom Climate: Auto/Wakeup\");\n if (sleeping === 'off') {\n node.send([null, sendFan, null, null])\n node.log(\"Master Bedroom Climate: Auto/Wakeup/Sleep Off\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Auto/Wakeup/AC On\")\n }\n } else if (sleeping === 'on') {\n node.send([null, null, sendSleep, 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])\n node.log(\"Master Bedroom Climate: Manual/Night\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], 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])\n node.log(\"Master Bedroom Climate: Manual/Day\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], 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])\n node.log(\"Master Bedroom Climate: Manual/Bedtime\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Bedtime/AC\");\n }\n }\n} else if (type === 'sleep') {\n node.log(\"Master Bedroom Climate: Sleep\");\n if (time === 'night') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Wakeup (Hot Day)\" })\n node.send([null, sendFan, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Night\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Night/AC\")\n }\n } else if (time === 'day') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Wakeup\" })\n node.send([null, sendFan, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Day\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Day/AC\")\n }\n } else if (time === 'bedtime') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Sleep\" })\n node.send([null, sendFan, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Bedtime\")\n if (ac === 'on') {\n node.send([[sendHvac, sendTemp, sendEco, sendAcFan], null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Bedtime/AC\")\n }\n }\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": 4, "noerr": 0, "initialize": "", @@ -30133,7 +30157,7 @@ "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Meltdown Center", - "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst toggle = msg.payload\nconst ac = global.get('mb_aircon_installed')\nconst lastMode = flow.get(\"lastMode\")\nconst bedTemp = states['input_number.master_bedroom_bedtime_temp'].state\n\nlet setTemp = bedTemp\nlet setEco = 'none'\nlet setHvac = 'cool'\nlet setAcFan = 'High'\nlet setFan = 'turn_off'\n\nlet sendFan = {\n \"payload\": {\n \"domain\": \"fan\",\n \"service\": setFan,\n \"target\": {\n \"entity_id\": [\"fan.master_bedroom_fan\"]\n },\n \"data\": {}\n }\n}\n\nlet sendHvac = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_hvac_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_temperature\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_preset_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"preset_mode\": setEco\n }\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_fan_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\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,sendEco,sendTemp],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('mb_aircon_installed', \"diskCon\")\nconst lastMode = flow.get(\"lastMode\")\nconst bedTemp = states['input_number.master_bedroom_bedtime_temp'].state\n\nlet setTemp = bedTemp\nlet setEco = 'none'\nlet setHvac = 'cool'\nlet setAcFan = 'High'\nlet setFan = 'turn_off'\n\nlet sendFan = {\n \"payload\": {\n \"domain\": \"fan\",\n \"service\": setFan,\n \"target\": {\n \"entity_id\": [\"fan.master_bedroom_fan\"]\n },\n \"data\": {}\n }\n}\n\nlet sendHvac = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_hvac_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"hvac_mode\": setHvac\n }\n }\n}\n\nlet sendTemp = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_temperature\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"temperature\": setTemp\n }\n }\n}\n\nlet sendEco = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_preset_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\n },\n \"data\": {\n \"preset_mode\": setEco\n }\n }\n}\n\nlet sendAcFan = {\n \"payload\": {\n \"domain\": \"climate\",\n \"service\": \"set_fan_mode\",\n \"target\": {\n \"entity_id\": [\"climate.master_bedroom_aircon\"]\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,sendEco,sendTemp],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, "noerr": 0, "initialize": "", @@ -30406,7 +30430,7 @@ "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Reset", - "func": "const lastMode = flow.get('lastMode')\nconst linkSource = msg._linkSource\n\nlet setTime = []\nlet setType = []\nlet setTopic = []\n\nif (lastMode === 'day') {\n setTime = 'day'\n setType = 'manual'\n setTopic = 'manual-day'\n} else if (lastMode === 'night') {\n setTime = 'night'\n setType = 'manual'\n setTopic = 'manual-night'\n} else if (lastMode === 'bedtime') {\n setTime = 'bedtime'\n setType = 'manual'\n setTopic = 'manual-bedtime'\n}\n\nlet reset = {\n \"type\": setType,\n \"time\": setTime,\n \"topic\": setTopic,\n \"_linkSource\": linkSource\n}\n\nnode.send(reset)\nnode.status({ fill: \"green\", shape: \"dot\", text: \"Mode reset to \" + setTopic})", + "func": "const lastMode = flow.get('lastMode', \"diskCon\")\nconst linkSource = msg._linkSource\n\nlet setTime = []\nlet setType = []\nlet setTopic = []\n\nif (lastMode === 'day') {\n setTime = 'day'\n setType = 'manual'\n setTopic = 'manual-day'\n} else if (lastMode === 'night') {\n setTime = 'night'\n setType = 'manual'\n setTopic = 'manual-night'\n} else if (lastMode === 'bedtime') {\n setTime = 'bedtime'\n setType = 'manual'\n setTopic = 'manual-bedtime'\n}\n\nlet reset = {\n \"type\": setType,\n \"time\": setTime,\n \"topic\": setTopic,\n \"_linkSource\": linkSource\n}\n\nnode.send(reset)\nnode.status({ fill: \"green\", shape: \"dot\", text: \"Mode reset to \" + setTopic})", "outputs": 1, "noerr": 0, "initialize": "",