[ { "id": "4a8821853d4dd1ad", "type": "tab", "label": "Kallen Timer", "disabled": false, "info": "", "env": [] }, { "id": "e44b1e7a8ef7ae1d", "type": "tab", "label": "Time-based automations", "disabled": false, "info": "", "env": [] }, { "id": "3abb5ae57afb4761", "type": "tab", "label": "Presence", "disabled": false, "info": "", "env": [] }, { "id": "eff21041cc941fef", "type": "tab", "label": "Lighting - First Floor", "disabled": false, "info": "", "env": [] }, { "id": "5e238cbbe6d612c9", "type": "tab", "label": "Lighting - Second Floor", "disabled": false, "info": "", "env": [] }, { "id": "47f17992fab9b4f5", "type": "tab", "label": "Lighting - Basement", "disabled": false, "info": "", "env": [] }, { "id": "b5717a86ce55bc29", "type": "tab", "label": "Outdoor Lighting", "disabled": false, "info": "", "env": [] }, { "id": "ce9c810396e540b6", "type": "tab", "label": "Lighting Effects", "disabled": false, "info": "", "env": [] }, { "id": "b0286fae9f2ce547", "type": "tab", "label": "Media Scenes", "disabled": false, "info": "", "env": [] }, { "id": "72f99805df043603", "type": "tab", "label": "Climate", "disabled": false, "info": "", "env": [] }, { "id": "b7d34d3e9d0c9486", "type": "tab", "label": "Laundry", "disabled": false, "info": "", "env": [] }, { "id": "458e4c0055c8c533", "type": "tab", "label": "Alarm Clocks", "disabled": false, "info": "", "env": [] }, { "id": "5c4ac37140a54ac9", "type": "tab", "label": "Alexa", "disabled": false, "info": "", "env": [] }, { "id": "75e98103856848a6", "type": "tab", "label": "Google Home", "disabled": false, "info": "", "env": [] }, { "id": "9a8e84bd2945505e", "type": "tab", "label": "Announcements", "disabled": false, "info": "", "env": [] }, { "id": "bb961e59e2ef86c9", "type": "tab", "label": "Apple", "disabled": false, "info": "", "env": [] }, { "id": "ee67610b4a0578d2", "type": "tab", "label": "Messaging", "disabled": false, "info": "", "env": [] }, { "id": "873eb2575d6e9014", "type": "tab", "label": "Github", "disabled": false, "info": "", "env": [] }, { "id": "ebd5561c4f077718", "type": "tab", "label": "Weather", "disabled": false, "info": "", "env": [] }, { "id": "fc6801ef8637d652", "type": "tab", "label": "Sports", "disabled": false, "info": "", "env": [] }, { "id": "789ba711dc04fad2", "type": "tab", "label": "Twitch", "disabled": false, "info": "", "env": [] }, { "id": "ffa6a885ac41a5ed", "type": "tab", "label": "Server Stuff", "disabled": false, "info": "", "env": [] }, { "id": "3e4ba157b540d183", "type": "tab", "label": "Global Variable Settings", "disabled": false, "info": "", "env": [] }, { "id": "d3dcbe534743b01d", "type": "tab", "label": "Discord", "disabled": true, "info": "", "env": [] }, { "id": "d49b385d8b582b20", "type": "tab", "label": "Test", "disabled": false, "info": "", "env": [] }, { "id": "a42343e035e3313c", "type": "subflow", "name": "Alexa Location (Serial #)", "info": "", "category": "", "in": [ { "x": 60, "y": 80, "wires": [ { "id": "1102574d15bdad4c" } ] } ], "out": [ { "x": 460, "y": 80, "wires": [ { "id": "afead614fabc01bb", "port": 0 } ] } ], "env": [], "meta": { "type": "Alexa Subflow" }, "color": "#DDAA99", "icon": "node-red-contrib-alexa-remote2-applestrudel/alexa-remote-icon.png", "status": { "x": 460, "y": 140, "wires": [ { "id": "afead614fabc01bb", "port": 1 } ] } }, { "id": "4107976aa434eb03", "type": "subflow", "name": "Weather Conversions", "info": "", "category": "", "in": [ { "x": 40, "y": 80, "wires": [ { "id": "388878f6056fa3e4" } ] } ], "out": [ { "x": 500, "y": 80, "wires": [ { "id": "80ce4b42b82e3c78", "port": 0 } ] } ], "env": [], "meta": {}, "color": "#DDAA99", "icon": "font-awesome/fa-cloud" }, { "id": "6429099c4571dd6b", "type": "subflow", "name": "Speech Engine", "info": "```msg.payload:``` The message you would like spoken\r\n\r\n```msg.topic:``` The room you would like the message spoken in\r\n\r\n```msg.type:``` The type of alert, 'normal', 'alert', 'weather', 'critical'\r\n\r\n```msg.voice: ``` (optional) The voice you would like the message spoken in. Will use default if not defined.", "category": "", "in": [ { "x": 100, "y": 160, "wires": [ { "id": "cee17a2c2fbb48ee" } ] } ], "out": [ { "x": 560, "y": 160, "wires": [ { "id": "98bf66889d4287db", "port": 0 } ] } ], "env": [], "meta": {}, "color": "#DDAA99", "icon": "font-awesome/fa-comment", "status": { "x": 560, "y": 220, "wires": [ { "id": "cee17a2c2fbb48ee", "port": 1 } ] } }, { "id": "a062d9e6d44506dc", "type": "subflow", "name": "Hue Dynamic Scene Handler", "info": "", "category": "", "in": [ { "x": 40, "y": 40, "wires": [ { "id": "cee2f20718ddb03a" } ] } ], "out": [ { "x": 520, "y": 40, "wires": [ { "id": "78a60e2da212f6aa", "port": 0 } ] } ], "env": [], "meta": {}, "color": "#DDAA99", "icon": "node-red-contrib-huemagic/hue-group.svg" }, { "id": "582b8363c9f33bf8", "type": "subflow", "name": "Scene Dropdown Cleanup", "info": "", "category": "", "in": [ { "x": 40, "y": 40, "wires": [ { "id": "f1c11209a9226be9" } ] } ], "out": [], "env": [], "meta": {}, "color": "#DDAA99", "icon": "node-red/mouse.png" }, { "id": "7cc13ada.b6712c", "type": "subflow", "name": "timerange", "info": "Lets through or blocks a payload\nbased on a time range. This can\neither be configured through the\nenviroment variables in the node ui\nor as described below with a message\nthat has an override topic.\nIf in range the msg will be passed\nto the first output and otherwise\nto the second.\nThe start and stop time needs\nto be defined in an hh:mm format.\nThere is also a week array. The week\nstarts on monday so 4 for example is\nThursday. Payload will only be passed\non days that are in the array.\nOut of time range payloads will\nbe redirected to the second output.\nThe schedule can be overriden by injecting\na message with the topic of \"override\"\nthat contains a ```msg.payload``` object with the\nkeys of \"start\",\"stop\",\"days\" like\nthis:\n```\n{\n \"start\": \"10:00\",\n \"stop\": \"14:00\",\n \"days\": [\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7\n ]\n}\n```\nStart and stop need to be strings in the hh:mm\nformat and days an array of numbers as\ndescribed above.\nThe override can be deleted by injecting a\nmsg.payload string \"reset\".", "category": "", "in": [ { "x": 100, "y": 100, "wires": [ { "id": "da7f7d3f.da5af" } ] } ], "out": [ { "x": 620, "y": 60, "wires": [ { "id": "694ce0e1.4bee58", "port": 0 } ] }, { "x": 630, "y": 140, "wires": [ { "id": "694ce0e1.4bee58", "port": 1 } ] } ], "env": [ { "name": "start", "type": "str", "value": "00:00", "ui": { "icon": "font-awesome/fa-arrow-right", "label": { "en-US": "from hh:mm" }, "type": "input", "opts": { "types": [ "str" ] } } }, { "name": "stop", "type": "str", "value": "00:00", "ui": { "icon": "font-awesome/fa-circle", "label": { "en-US": "until hh:mm" }, "type": "input", "opts": { "types": [ "str" ] } } }, { "name": "days", "type": "json", "value": "[1,2,3,4,5,6,7]", "ui": { "icon": "font-awesome/fa-calendar", "label": { "en-US": "days" }, "type": "input", "opts": { "types": [ "json" ] } } } ], "color": "#C7E9C0", "inputLabels": [ "payload input" ], "outputLabels": [ "in time range", "out of time range" ], "icon": "node-red/switch.svg", "status": { "x": 480, "y": 200, "wires": [ { "id": "1bc56c04.ca0a3c", "port": 0 } ] } }, { "id": "a4ee891237e460a2", "type": "subflow", "name": "Main Scenes Handler", "info": "", "category": "", "in": [ { "x": 60, "y": 360, "wires": [ { "id": "ca51f6e6bd51fb55" } ] } ], "out": [], "env": [], "meta": {}, "color": "#DDAA99", "icon": "node-red-contrib-huemagic/hue-scene.svg", "status": { "x": 680, "y": 360, "wires": [ { "id": "4ab49b8485f1886f", "port": 3 }, { "id": "9af9a2966a477b33", "port": 3 } ] } }, { "id": "05a2d9f89e72481f", "type": "subflow", "name": "Alexa Location (Room)", "info": "", "category": "", "in": [ { "x": 60, "y": 80, "wires": [ { "id": "6088f5b9f13e0e36" } ] } ], "out": [ { "x": 500, "y": 80, "wires": [ { "id": "8e803251d3e3c3ae", "port": 0 } ] } ], "env": [], "meta": { "type": "Alexa Subflow" }, "color": "#DDAA99", "icon": "node-red-contrib-alexa-remote2-applestrudel/alexa-remote-icon.png", "status": { "x": 500, "y": 140, "wires": [ { "id": "8e803251d3e3c3ae", "port": 1 } ] } }, { "id": "3aa2aec226246753", "type": "subflow", "name": "Lifx Testing", "info": "", "category": "", "in": [ { "x": 40, "y": 100, "wires": [ { "id": "8b4af77e07c66df9" }, { "id": "54f4bebfc9414dbd" } ] } ], "out": [], "env": [], "meta": {}, "color": "#DDAA99", "inputLabels": [ "Inject Node Here" ], "icon": "node-red-contrib-huemagic/hue-light.svg" }, { "id": "85c4f81ca9628aea", "type": "subflow", "name": "Tina Desk Scenes Handler", "info": "", "category": "", "in": [ { "x": 140, "y": 340, "wires": [ { "id": "9cd0aa12d56438c6" } ] } ], "out": [], "env": [], "meta": {}, "color": "#DDAA99", "status": { "x": 960, "y": 340, "wires": [ { "id": "8ad119b6c6e11ddd", "port": 0 } ] } }, { "id": "b88bb63bb13eeb27", "type": "subflow", "name": "Alexa Location (Entity ID)", "info": "", "category": "", "in": [ { "x": 60, "y": 80, "wires": [ { "id": "b05ef328b90665d5" } ] } ], "out": [ { "x": 500, "y": 80, "wires": [ { "id": "c2a8a3f1f00bc4b7", "port": 0 } ] } ], "env": [], "meta": { "type": "Alexa Subflow" }, "color": "#DDAA99", "icon": "node-red-contrib-alexa-remote2-applestrudel/alexa-remote-icon.png", "status": { "x": 500, "y": 140, "wires": [ { "id": "c2a8a3f1f00bc4b7", "port": 1 } ] } }, { "id": "17510314e84badd9", "type": "subflow", "name": "Team Color Converter", "info": "", "category": "", "in": [ { "x": 60, "y": 80, "wires": [ { "id": "664a1a92c5c5546e" } ] } ], "out": [], "env": [], "meta": {}, "color": "#DDAA99", "inputLabels": [ "Hex" ], "icon": "node-red-contrib-color-convert/color-convert.png" }, { "id": "384eaf2f63dcb5db", "type": "subflow", "name": "Input Datetime - With Date", "info": "Takes a timestamp as input at msg.timestamp and converts it to the proper format for an input_datetime with date enabled. Output is on msg.datetime", "category": "", "in": [ { "x": 60, "y": 80, "wires": [ { "id": "8b3c203e7e901a8c" } ] } ], "out": [ { "x": 420, "y": 80, "wires": [ { "id": "8b3c203e7e901a8c", "port": 0 } ] } ], "env": [], "meta": {}, "color": "#C0DEED", "icon": "font-awesome/fa-clock-o", "status": { "x": 420, "y": 140, "wires": [ { "id": "8b3c203e7e901a8c", "port": 0 } ] } }, { "id": "9766d47584651edb", "type": "subflow", "name": "Convert Minutes to Seconds", "info": "Input minutes on msg.duration, and it will output seconds on msg.duration", "category": "", "in": [ { "x": 60, "y": 80, "wires": [ { "id": "b2d071ca42e4a3c6" } ] } ], "out": [ { "x": 400, "y": 80, "wires": [ { "id": "b2d071ca42e4a3c6", "port": 0 } ] } ], "env": [], "meta": {}, "color": "#C0DEED", "icon": "font-awesome/fa-clock-o", "status": { "x": 400, "y": 140, "wires": [ { "id": "b2d071ca42e4a3c6", "port": 1 } ] } }, { "id": "eccca853a916b662", "type": "group", "z": "5e238cbbe6d612c9", "name": "Upstairs Bathroom Motion Lights", "style": { "label": true }, "nodes": [ "a1ee07ab20229b45", "74c0ced4ac160364", "ea8536fc853a8af4", "d2df58b074b9ba08", "83686fab02a3d825", "853abef16fadc824", "bfcb013bbf11611c", "2ad7be43ccdbdeaf", "2e299ac73c696afc", "5d18c5d00181b011", "ea02f8930aa2c7aa", "8859759915625e2f", "3941b4a5b3493461", "0b122b02cfb10c25", "d1ae15dff680b3b1", "39b90ceaed170ac8", "31b8c8291d19ffc6", "34e2055344eea8fe", "55e84ccb73ae9b74", "3a25dfcae623ee00", "fc4bcd1c117fa849", "017de174925e8c75", "2dc5f9d3e00f4ddc", "86922621398f4b79", "73bf42069fe27d3a", "32559cd9120b4916", "a1fa2d2d1f55af4b", "463689442b9d2046", "5350d2264880d0ad", "1d03ecbe4448d224", "da70285e80c3f195", "a7a59e2f845b849c", "37f1c11c59a6ce16", "b9741e2e2ed0448b", "d0cbe3d9ed984771" ], "x": 74, "y": 339 }, { "id": "39a7ac02f2727f1d", "type": "group", "z": "72f99805df043603", "name": "Kallen Bedroom", "style": { "label": true }, "nodes": [ "57651381835f659c", "acb52adc50d34045", "b4dbbf788c5a30d2", "d6b56cb65c2ff140", "e32aaeb51d3f2e95", "61405a43f61f3d60", "62211bf089bc5b04", "d0dacbae4513b1ad", "7b390a3b24fc3197", "a417e93366843249", "17e5f9acd57c2819", "a8070806c0f88856", "7b0648758704fad4", "3937c38bc1bd0ee0", "f1dbb3a206dba921", "476f73cf6b540f96", "46a1e386f7468d21", "292cda64df0c1c10", "a2c9a6a52d4d2591", "7c483301056c67a9", "a0dd18613130787f", "324d56cbdc1eb170", "ec4682a111a48b70" ], "x": 14, "y": 839 }, { "id": "e065b1ed4938b477", "type": "group", "z": "72f99805df043603", "name": "Master Bedroom", "style": { "label": true }, "nodes": [ "1aa901d26ce8ac46", "21001f5409130f44", "bc592ba259667f9d", "1f7ac875e593d434", "7a7f626dce181b23", "f541ad53e32f703b", "66e85878d60c7d65", "bcba065aa5ecb2be", "6c06c2eec1583c66", "e2581a5f3f4888df", "1dfb0bcc98f1457b", "096369136e9e607f", "783cfb381b70afc5", "1eb13d819ba7e226", "a10629857d60f774", "a8ef744455bb4c0a", "9c01880c6319d29b", "94c022d2eb71e7d5", "ce5d8005cbf08144", "7646c6833d5a1df2", "01c0448b4889d754", "17b6f73d75f480fd", "7852593ec89f150a", "8286284fc9598efa", "cbe37fd5b5fc4381", "5def5d2440e767b3", "d153c7a7f050ce84", "b1c0cca848416d74", "73c2d06e9114a0f6", "e914726b0364c6be", "d613dbf3643d1d4a", "9014f9e42a6b7c54", "abd1783e6054329c", "6a731b17c05f0496", "86c9f3a3185215fc", "b7ac7e6a2ad9f5df", "92ce51a81f7bc58d", "f950918e12591224", "08335765e8c7eac0", "b5cfb253dc157cc9", "6fb6d8041e1a4cad", "ade887c45bde00f1", "d6c81a79393be92c", "88b10efda9e2c047", "96cf0949902f8572", "6bbf7df2c43c481e" ], "x": 14, "y": 11.5 }, { "id": "5c50443a84910fb7", "type": "group", "z": "3e4ba157b540d183", "name": "Tina Schedule Management", "style": { "label": true }, "nodes": [ "4d724735025b0ed8", "6ec62f6cf4fcf994", "71bee01e93d372c4", "31ce8ad28dd41226", "20271b0662a4d5df", "69886cf636bf4f70", "16bf625c802d7910", "a32c37ccf0102258", "d5c6b45df763e57e", "6f011420f6bb15a7", "74bb3d48dd17bef9", "486bca43ddc48fb8", "d2c017d8f8c1dc68", "7a6299413cbbbdcf", "92c97bdd3ffb345d", "1fd2518454b8b8a1", "cc54107a01eca8c2", "33845d78dadbb4df", "2a2e328746eed124", "80fcb34c004369e7", "5f0f296e4f242dfe", "d2d529b327823c22", "8fe032f757ed2b62", "1e1eb662bad16e38", "149704b9f6497881", "b6cb206d9cb34610", "51b11f9d5b8bfbb0" ], "x": 34, "y": 179 }, { "id": "477e752fcd2e2a19", "type": "group", "z": "ee67610b4a0578d2", "name": "House Announcement System", "style": { "label": true }, "nodes": [ "a4c477269b22f766", "5095d45c90d5304f", "3ae21589dd88c080", "93b7bee28a7e896e", "b2bc83c9195efe0f", "f4bfbaca4d7fb1df" ], "x": 14, "y": 39 }, { "id": "46275dd0f9461013", "type": "group", "z": "ffa6a885ac41a5ed", "name": "Functionality", "style": { "label": true }, "nodes": [ "b109c8db1c2cd259", "75a50e8dac7af692", "baae5d6f53900594", "619d1474239faf58", "ca88f85ba00a6744" ], "x": 34, "y": 319 }, { "id": "ff6d8150e8d5e606", "type": "group", "z": "b0286fae9f2ce547", "name": "Living Room Entertainment Mode", "style": { "label": true }, "nodes": [ "7611921cadb91b1e", "3a29cecbefa6cbe2", "4a2031f363418db1", "984386fa0a6369d6", "0beae13503166379", "6c77ade442a47a30", "6392f2f0586d988a", "e505e9f24bf919dd", "9efd5346a1ca1972", "8b53b9f4d5ba0bf0", "cc8f6ab710549be2", "346379575efad516", "8b0b39deb5142557", "7cb8056b3b41a9e8", "d2390789a8b3101a", "d961ffeaea408909", "107f2c88924975fe", "ed2e0f4f214ad76c", "d09061428e9c694d", "6110b45c374a5b7f", "e5af55b177f37c65", "27b2c22907382e6d", "f111c40459e27629", "33903d3f8f53dadd", "f463df7e17e045e9" ], "x": 34, "y": 19 }, { "id": "208284848b13b85b", "type": "group", "z": "47f17992fab9b4f5", "name": "Front Door Awareness", "style": { "label": true }, "nodes": [ "97a441f1ac510844", "fbe3667814a51f6f", "ec543bc9adac3d08", "d4019d35bf5a5f98", "25e12d8e4a0a7f11", "e91c3392b59ff9d1", "981191938ab4ee2f", "59af14a564176ce4", "3c83c0ab0aa96e3d", "7b71cb1967ec5255", "03fad0a960ff39e7", "c0933fcc8737bc0b" ], "x": 34, "y": 239 }, { "id": "1ca205a84922c8c2", "type": "group", "z": "4a8821853d4dd1ad", "name": "Finish", "style": { "label": true }, "nodes": [ "923538ef97772f0c", "a3e3dc438a7b95fc", "fe1ba086baf93ec0", "50056b099a24a824", "d8e2d16e313b938a", "b0c92a72557d0ac6", "408795055634e897", "0a441953c41a18ae", "08a22fa71fce5e91", "d580c539c554a4c1", "f0cc7b3b9622312a", "206e512c5268020f", "4da18a3f1e0298db", "283661388275a459" ], "x": 34, "y": 559, "w": 1012, "h": 382 }, { "id": "5595964c8367c984", "type": "group", "z": "ee67610b4a0578d2", "name": "Text Notification System", "style": { "label": true }, "nodes": [ "98626a8f2b59bde3", "db6d955c039873be", "d2fec32d385dae8c", "0145961e8276c53e", "fd623c46a558a01a", "c52cae79eb97bcc0", "6b039ef7895476e2", "f44427c5a493c428" ], "x": 14, "y": 139 }, { "id": "eeafd13be593ae69", "type": "group", "z": "b5717a86ce55bc29", "name": "Front Porch Light Timer", "style": { "label": true }, "nodes": [ "091390f43bfeddf5", "7a7229eb69c9b1a3", "f34816b23181f21e", "bd75b077a1c76fce", "b69eeb738bbd4bdb", "cfdcc7c9c168dc17", "16029ccf061bdd10", "d2751bc2cfc5af8f", "435280acadb9f364", "ec5937bc60874009", "defcae57f9916394", "459433738b64d14d", "a2ec35a79d79bf2f", "9a8c39dc1a0c20e6", "8c29a2e1a06c5524", "c7a8df4ebeb3b5c5", "77759257dd9c9465", "3a5bb57569e07beb", "76815f07ec2f3eef", "f5fb96bf1a33b3cd" ], "x": 54, "y": 19 }, { "id": "0c81dfaed25d225c", "type": "group", "z": "9a8e84bd2945505e", "name": "Amazon Package Delivered", "style": { "label": true }, "nodes": [ "11f5f6e0f1e4da25", "3250ca66d8342dd8", "6091f5e58812f97f", "32816b7834e1b318", "02cd94391e205cd9", "059eaa30829a743e", "a71c61b06a3e7b0d", "1504548e7ebc3844", "d8b6743cb853018d", "ddbbde89f52be826", "9726bd70b6b83774", "5fbac3420d43ef9d", "d336afe957a65e33", "e2f0e53daa198581", "398d300c5d0b6db5", "d92ae2f7fd3171b5", "96496719d1c09515", "15fde8d3275b8455", "fe7b309fe37cf8e2", "458ddfa9d748f88f", "37bdac2c9a4e2837" ], "x": 54, "y": 39 }, { "id": "8aee4d340a136bac", "type": "group", "z": "eff21041cc941fef", "name": "Downstairs Bathroom", "style": { "label": true }, "nodes": [ "5123a607588fa737", "f84e6b5157e857cf", "b7d94cd0e420c650", "41a8d5ef20cf55d7", "3e40025ac99ec712", "8d2e7fb5f214879c", "b281061a4b08d2eb" ], "x": 34, "y": 759 }, { "id": "550e5b2d99316b12", "type": "group", "z": "47f17992fab9b4f5", "name": "Basement On", "style": { "label": true }, "nodes": [ "1f5808147fa975cf", "1966d10d8f4467c7", "a9bc78f321149316", "b3bb08ff51e46985", "0c7ef72bd0ef47d4", "11aabd786c07244f", "795c53ad6642733a", "ea5306d6f92d9550", "4829663e9913e2aa", "61cb79c998ee0b59", "73078f818abdc6c2", "2516c6e3146cc851" ], "x": 34, "y": 579 }, { "id": "f519aff597ece351", "type": "group", "z": "bb961e59e2ef86c9", "name": "iOS Actions", "style": { "label": true }, "nodes": [ "14c6951746b58a38", "533921a587f031d4", "65240dc52617459d", "d3763c0194214956", "638703bd017d6e5b", "bc5f205fd5e7582e", "1516f464e4d87c56", "e21a948e9523bce7", "6ec2fd7aaaf1fc98", "c5e9589db7e0b0bf", "50cf93faa2e3996c", "89f6119d5702185b", "15ae48c0b6e70f36", "572b2040be874f4e", "b57e12eb73074535", "93b718cd47747ccc", "c8af362d48d5c0ad", "3463c4f2bf6388fe" ], "x": 54, "y": 39 }, { "id": "26f91eb2ef77450d", "type": "group", "z": "bb961e59e2ef86c9", "name": "iOS Notification Actions", "style": { "label": true }, "nodes": [ "f5aff29df4e07a4a", "7107656a6cbecce7", "6bb57058f0a576e7", "e97b782efaaf5976", "d8c62e34298105b4", "900c251ff10a2f5b", "2a0e3a76af7ab628", "53102bdc5d885602", "a169eca7f3f1df15", "2b63f908be8296d0", "0be3c318e9e6df0a" ], "x": 64, "y": 759 }, { "id": "a46fc8e7e70ca893", "type": "group", "z": "4a8821853d4dd1ad", "name": "Start/Pause", "style": { "label": true }, "nodes": [ "7fc67fc156c0f4be", "34dcb204b421710d", "797d3e7cc53d773f", "e69ad4771494c458", "fdf9b6820eb7289a", "5c44fd504453ae63", "908543f7b78f7beb", "dd0be4a0dd77e1db", "d6728df5d1fdf67e", "ae7073e78053da5d", "6b086807971b2618", "6736626753b33834", "736d7433005436b3", "0aa29248b560c45d", "b8ca8a1a2655570b", "24abb932c4cd0b1f", "c0521b53f7efeb17", "95d5ac486b4f9ee0", "49767cbfa622a734", "04113ab4977bf725", "93a52960301bb3a3", "0e39331337b021bb", "82172c8ab1a9c8e2", "afeb1d238a623c3d", "49dbe17ff03ed572", "9612270d4cdfbf07", "1a0adfa82fff507a", "27ae9c023ee2d1f6", "88d088ea70f0030a", "86c7f29776a59797" ], "x": 34, "y": 39, "w": 1812, "h": 502 }, { "id": "6504d94aaaf9b8d9", "type": "group", "z": "ffa6a885ac41a5ed", "name": "Power Stats", "style": { "label": true }, "nodes": [ "ce8a6bb6e9460f13", "ce5a2ea26f26e421", "abb6e16585d7fe61", "aa9b2f0ddc5b77d3", "0a8426dd99cbaeec", "8813b152ed76b96c", "9833b2aff0f97ea9", "51d05298561cfddb" ], "x": 34, "y": 39 }, { "id": "265593f442864b6a", "type": "group", "z": "3e4ba157b540d183", "name": "Climate Variables", "style": { "label": true }, "nodes": [ "a09f10883f07aad0", "464e9271285f8450", "9c8056404bfcafed", "a8d7f5e5d4f549b0" ], "x": 34, "y": 579 }, { "id": "931cc27100c9317e", "type": "group", "z": "3e4ba157b540d183", "name": "Last Alexa", "style": { "label": true }, "nodes": [ "04fdddae578ee136", "266634bf3c6019c8", "4560584de593b5c1", "488e4f61d16705d4", "1f3142828a586d08", "f9bc4d36a0df7947" ], "x": 34, "y": 759 }, { "id": "6e83103b5c5311e9", "type": "group", "z": "3e4ba157b540d183", "name": "Jarvis Voice", "style": { "label": true }, "nodes": [ "e8d2135bb5564a4a", "f6f45d3e3cf9aeab", "40c9c33453179a21", "b49f0642ce0153c6", "a75651492e779bfc" ], "x": 34, "y": 19 }, { "id": "88f099618e56926d", "type": "group", "z": "458e4c0055c8c533", "name": "Master Bedroom", "style": { "label": true }, "nodes": [ "9256f78107619596", "fbd0b0d52ef452d5", "1f44e8f6e98317a7", "efec6f0b8a4ea382", "cfcebd8452629535", "0bfb330d42161fe7", "216ebd5138f63087", "e82fb1576245b7c7", "67e6798433b7bc37", "99c141f21de4feda" ], "x": 74, "y": 39 }, { "id": "a6de35af12739885", "type": "group", "z": "458e4c0055c8c533", "name": "Kallen Bedroom", "style": { "label": true }, "nodes": [ "5f4a234984a654e1", "9ad1aee4f432c0da", "33f1bded52754848", "72052e61710200f9", "9c2ea97d481e6428", "56140b60b6406bd7", "067bcc91d6a04be5", "7f3909f76041b209", "724f186878227dad" ], "x": 74, "y": 339 }, { "id": "0804d9edeca1c9fa", "type": "group", "z": "458e4c0055c8c533", "name": "Emma Bedroom", "style": { "label": true }, "nodes": [ "eff279edcac37798", "adcce6ca1e459cd1", "49a842a41a52f8f3", "e036fd18c5d20645", "9621d4c881da0188", "a5a387d3522f49ed", "53f8d279114dd476", "4523045453de0a33" ], "x": 74, "y": 579 }, { "id": "385f03591bc34bcc", "type": "group", "z": "3e4ba157b540d183", "name": "Temperature", "style": { "label": true }, "nodes": [ "274be2385ae894ce", "dcc947fe66b6342b", "15f7382daddb4b3e" ], "x": 34, "y": 999 }, { "id": "31767ffd6a647579", "type": "group", "z": "eff21041cc941fef", "name": "Doorbell Alert", "style": { "label": true }, "nodes": [ "c983b44381b46ab5", "bc3e0a041efec910", "2c351b21e13b7289", "71e6ae54dc1b958b", "2593383937f292b3", "41ababe9cfbe1297", "c0ce3c040d25e0a1", "e67a2b594c648ac6", "e8510a6c66cd84e6", "2ebe03f5023de47c", "12e827e7416c9dac", "e3ecd23a34c7f82e", "58b11f0c0353d67b", "45df5f447e52cb0f", "e23e7b080ee3773f", "1e1059008d19c0ee" ], "x": 14, "y": 399 }, { "id": "1cc8b382530c33d0", "type": "group", "z": "b0286fae9f2ce547", "name": "Basement Entertainment Mode", "style": { "label": true }, "nodes": [ "496fafb580e8af1b", "6253b68980f8bbca", "19907ff0b6cef449", "98d5f1fa7001b848", "8535d555f858eb5c", "d2d07f8ee20733d0", "7d266754621825e7", "d41365c49024c8eb", "c71a9ea311a86b7f", "5d582639d1f6a501", "cb285727507f50da", "2a8f44429acdd1ea", "50b997d6e5680e6e", "65aaba2528dfde3d", "55962141df8ef164", "5ff13862fb36f90e", "99fccb06d0ae097b", "f3efe80c6ffa4522", "74d645f646c713d2", "cb68f561b5023b31", "8146f43fea5aec03" ], "x": 34, "y": 539 }, { "id": "b9ffa3fa5af46ec3", "type": "group", "z": "ebd5561c4f077718", "name": "Weather Briefing", "style": { "label": true }, "nodes": [ "5d7c63526234945e", "7aaddacf84721c78", "6b5d3e550ad76528" ], "x": 34, "y": 39 }, { "id": "4329e464360d0afa", "type": "group", "z": "ebd5561c4f077718", "name": "Lightning", "style": { "label": true, "stroke": "#ff0000" }, "nodes": [ "d7c2eec75c6063ea", "75c4dc9367328035", "abb24271518ddd9b", "6f29823ba252aef8", "b6e069ac0ebfe31a", "210ae9a754fb0bb7", "6c529210810a63a8", "b4b80e91a535923e", "1180e4c40c3ec0fa", "b64b61c5bfd91293", "70f795fb061cbfef", "7809c760322bf72a", "8ffd3e28319fc173", "be9ebf6d2f7e18d0", "b2c0d6629b2603b7", "c268e2512a503e2a", "1e79cbc1d6e8f507", "dbfb74297b6ecd61", "81c14eac4de9dd9d", "a586df67c15b0914", "4738fd26d0e16bd4", "84f3e5a7cf5cdfc7", "50a2a473686b0445", "33fcb96a4c2c2541", "a4d27381bd614fd1", "8a84615173fd7e97", "f260e2410571356a", "b497fe229c8f2eea", "f47a0d107875d550" ], "x": 34, "y": 139 }, { "id": "395da9d5d5f7e232", "type": "group", "z": "d49b385d8b582b20", "name": "Context Examples", "style": { "label": true }, "nodes": [ "c80bec9a15b703f6", "8687551e01cd2045", "103b03c39c8d9cae", "c043cba9f34ba574", "e674c706437cc0f3", "11f8fb75d4c4e6c0", "1346e34e8c83b2dc", "62d522a844321ef9", "6d109daff443dade", "4e1848c867860d5f", "3102e176923a8fad" ], "x": 34, "y": 719, "info": "https://stackoverflow.com/a/74399359" }, { "id": "c3dc29879117218b", "type": "group", "z": "d49b385d8b582b20", "name": "Climate Tester", "style": { "label": true }, "nodes": [ "5848c6edf2bd06fe", "3bb9755d18f517d6", "c52f61fa427a773c", "d71d65c0e52926b1", "84b00411dee5fc6a", "8a4b246d2356d8f4", "d275a12c1817925e", "4d9e5c1bade281af", "330eaf3afee1c405", "c59db4f3f0112244", "8846ee22051b92cc", "4731a08756c9235f", "62f2704dca41ea4b", "93072f995377775b", "34c4939c3dd1f7d1", "71f5f2a1557b28ea", "b233bf44f92d413d", "a1020d4eaab8a8e5", "7aa9383895c46e30", "401d1612749a4d86", "514057723d9662e0", "1df32d98b498c875", "192260163c49816a", "79f3ceee718cd7cb", "14181143d23aa423", "f9e1aec6c25f6480", "0693239363c59c3e", "44b7eabdec8197a3" ], "x": 34, "y": 19 }, { "id": "50e4d951ee7b3e54", "type": "group", "z": "873eb2575d6e9014", "name": "Report System", "style": { "label": true }, "nodes": [ "f803c6af3a30eb66", "3bd7704103dbfc20", "a6234b2047ba3116", "603140fef1e2edaf", "427cc2991454bbf0", "7674185d1e5ee489", "9e43408e18883dfe", "0107164ee7ff63d6" ], "x": 34, "y": 19 }, { "id": "23b02b1256dfd302", "type": "group", "z": "ffa6a885ac41a5ed", "name": "Mosquitto", "style": { "label": true }, "nodes": [ "939abd584ee8580a", "6b17d7fa4de2b620", "e2a8c8b2638be79f", "96baea4b0d08d151", "8357b66291d6f498", "76eb43f2c84142f8", "1dc56852c1691e89", "b2a69c7d24c170ad", "0f107a6c4d46cdc8", "79822e9d0a97457c", "ef26acc3d75b5b93", "d790797e62163c2b", "463eb1286393993a", "396cee5f3aa5255f", "af22ad5de7f824ed", "cb37ef0a4c6a0d4b", "538a80f1ef807ce5", "8bc88748bdc7fec8", "ca36c535f62a938b", "fe5a9d13c3acdf8a", "704c78f0839b0cbf", "a98df8034046bdc1", "fe27369f5d336321", "1812eb70af41b475", "6e7294be1430b43a", "60b562a91a724301", "ed548a3f33ed2137", "9df778270aff32c7", "5f6468dc8b022b6b", "5486cc70a2a83cd0", "c95f5ac879cfef5d", "ccebc1def6a944d9", "a675ad54d1ec36fa", "0723c20ffd541ca7", "6596ad2f0c91a78c", "bb4ca3d4e66d87a5" ], "x": 734, "y": 39 }, { "id": "fba69dfc80829db7", "type": "junction", "z": "5e238cbbe6d612c9", "x": 320, "y": 40, "wires": [ [ "a17d58585048335d" ] ] }, { "id": "34e2055344eea8fe", "type": "junction", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "x": 1480, "y": 480, "wires": [ [ "2dc5f9d3e00f4ddc" ] ] }, { "id": "9e87348d.9c1c48", "type": "server", "name": "Home Assistant", "version": 5, "addon": true, "rejectUnauthorizedCerts": true, "ha_boolean": "", "connectionDelay": false, "cacheJson": false, "heartbeat": false, "heartbeatInterval": "", "areaSelector": "friendlyName", "deviceSelector": "friendlyName", "entitySelector": "friendlyName", "statusSeparator": "at: ", "statusYear": "hidden", "statusMonth": "short", "statusDay": "numeric", "statusHourCycle": "h23", "statusTimeFormat": "h:m", "enableGlobalContextStore": true }, { "id": "fd29421fc00140a8", "type": "mqtt-broker", "name": "", "broker": "192.168.1.251", "port": "1883", "clientid": "", "autoConnect": true, "usetls": false, "protocolVersion": "5", "keepalive": "60", "cleansession": true, "birthTopic": "", "birthQos": "0", "birthPayload": "", "birthMsg": {}, "closeTopic": "", "closeQos": "0", "closePayload": "", "closeMsg": {}, "willTopic": "", "willQos": "0", "willPayload": "", "willMsg": {}, "userProps": "", "sessionExpiry": "" }, { "id": "be975ce229701797", "type": "alexa-remote-account", "name": "", "authMethod": "proxy", "proxyOwnIp": "192.168.1.26", "proxyPort": "3456", "cookieFile": "/config/node-red/alexa_auth", "refreshInterval": "3", "alexaServiceHost": "pitangui.amazon.com", "pushDispatchHost": "", "amazonPage": "amazon.com", "acceptLanguage": "en-US", "onKeywordInLanguage": "on", "userAgent": "", "usePushConnection": "on", "autoInit": "on", "autoQueryActivityOnTrigger": "on" }, { "id": "f14ef3df2209e9a7", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Send Alexa Message", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Send Alexa Message" }, { "property": "icon", "value": "mdi:bullhorn" }, { "property": "device_class", "value": "" } ] }, { "id": "ad5b1d9f1ea8fea1", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Good Morning", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Good Morning" }, { "property": "icon", "value": "mdi:weather-sunset-up" }, { "property": "device_class", "value": "" } ] }, { "id": "a8da4d03a2922c42", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Weather Briefing", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Weather Briefing" }, { "property": "icon", "value": "mdi:weather-cloudy" }, { "property": "device_class", "value": "" } ] }, { "id": "30f1658baee9378e", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Goodnight", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Goodnight" }, { "property": "icon", "value": "mdi:weather-night" }, { "property": "device_class", "value": "" } ] }, { "id": "04976a7418728aa3", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Restart AppDaemon", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Restart AppDaemon" }, { "property": "icon", "value": "mdi:restart" }, { "property": "device_class", "value": "" } ] }, { "id": "457914a2c9dc72c1", "type": "google-home-conf", "username": "tm24fan8" }, { "id": "fd929ec3bfbeef1a", "type": "discord-token", "name": "Nerd Overlord" }, { "id": "8860321096392e94", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Weather Briefing Google", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Weather Briefing Google" }, { "property": "icon", "value": "mdi:weather-cloudy" }, { "property": "device_class", "value": "" } ] }, { "id": "998d8d67ec377dd3", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Daily Briefing", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Daily Briefing" }, { "property": "icon", "value": "mdi:weather-sunset-up" }, { "property": "device_class", "value": "" } ] }, { "id": "9c84afc610ced7b6", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Daily Briefing Google", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Daily Briefing Google" }, { "property": "icon", "value": "mdi:weather-sunset-up" }, { "property": "device_class", "value": "" } ] }, { "id": "738e7f8f2ac71049", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Sunset Lights Trigger", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Sunset Lights Trigger" }, { "property": "icon", "value": "mdi:lightbulb-alert" }, { "property": "device_class", "value": "" } ] }, { "id": "be9ed28696adcdb0", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Master Bedroom Night Mode", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Master Bedroom Night Mode" }, { "property": "icon", "value": "mdi:lightbulb-night" }, { "property": "device_class", "value": "" } ] }, { "id": "59cb8692ed7accd1", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Master Bedroom Day Mode", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Master Bedroom Day Mode" }, { "property": "icon", "value": "mdi:sun" }, { "property": "device_class", "value": "" } ] }, { "id": "9c63750f16f845ea", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Master Bedroom Bedtime Mode", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Master Bedroom Bedtime Mode" }, { "property": "icon", "value": "mdi:bed" }, { "property": "device_class", "value": "" } ] }, { "id": "675dd216a61c575b", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Send Report", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Send Report" }, { "property": "icon", "value": "mdi:bug" }, { "property": "device_class", "value": "" } ] }, { "id": "fbc65f8185932b5f", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Kallen Timer Start", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Kallen Timer Start" }, { "property": "icon", "value": "mdi:play" }, { "property": "device_class", "value": "" } ] }, { "id": "a11aaf0288452997", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "415bf4eba63b9a50", "name": "Cleanup", "version": "6", "entityType": "button", "haConfig": [ { "property": "name", "value": "Cleanup" }, { "property": "icon", "value": "mdi:broom" }, { "property": "entity_category", "value": "" }, { "property": "device_class", "value": "" } ], "resend": false }, { "id": "d3f8c4466cc1deeb", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Master Bedroom Fan Only", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Master Bedroom Fan Only" }, { "property": "icon", "value": "mdi:fan" }, { "property": "device_class", "value": "" } ] }, { "id": "d9da4bd707013bc5", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Kallen School Status", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Kallen School Status" }, { "property": "icon", "value": "mdi:bus" }, { "property": "device_class", "value": "" } ] }, { "id": "2c222901ee192ba1", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Kallen School Status Google", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Kallen School Status Google" }, { "property": "icon", "value": "mdi:bus" }, { "property": "device_class", "value": "" } ] }, { "id": "60eb53fb94cd64e4", "type": "lifx-config", "token": "c9c9ac0dbbfa906c8a5c6ea51af2857ed4f9631fa41053e67268eaf0b897f51d" }, { "id": "f040a57e80fda8ee", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "name": "Send Text Notification", "version": 6, "entityType": "button", "haConfig": [ { "property": "name", "value": "Send Text Notification" }, { "property": "icon", "value": "mdi:message-alert" }, { "property": "device_class", "value": "" } ] }, { "id": "0df0d4b823c241ca", "type": "ical-config", "url": "webcal://p72-caldav.icloud.com/published/2/ODM5MDk5NTE5ODM5MDk5NR0HVUW-Vl-m45F7V86TDotlk2-IoVPJ7u9SJ4CgaxkUnwXfBv2X3Td4TIRw64EwIf2-usGEsd6zG21yi63A5PY", "caldav": "", "caltype": "ical", "name": "Family Calendar", "replacedates": false, "usecache": false, "username": "", "password": "", "calendar": "", "pastWeeks": "0", "futureWeeks": "4" }, { "id": "527f99f7a7aa36c2", "type": "ha-device-config", "name": "Tina Work Tomorrow", "hwVersion": "", "manufacturer": "Node-RED", "model": "", "swVersion": "" }, { "id": "781adad6153d9661", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "527f99f7a7aa36c2", "name": "Tina Work Tomorrow", "version": "6", "entityType": "binary_sensor", "haConfig": [ { "property": "name", "value": "Tina Work Tomorrow" }, { "property": "icon", "value": "mdi:calendar" }, { "property": "entity_category", "value": "" }, { "property": "device_class", "value": "" } ], "resend": false }, { "id": "415bf4eba63b9a50", "type": "ha-device-config", "name": "Cleanup", "hwVersion": "", "manufacturer": "Node-RED", "model": "", "swVersion": "" }, { "id": "23e5e32354cf867a", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "", "name": "Basement On Manual", "version": "6", "entityType": "button", "haConfig": [ { "property": "name", "value": "Basement On Manual" }, { "property": "icon", "value": "hue:room-stairs" }, { "property": "entity_category", "value": "" }, { "property": "device_class", "value": "" } ], "resend": false, "debugEnabled": false }, { "id": "e27ae85e2a296e7c", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "", "name": "Early Night Mode", "version": "6", "entityType": "binary_sensor", "haConfig": [ { "property": "name", "value": "Early Night Mode" }, { "property": "icon", "value": "mdi:lightbulb-night-outline" }, { "property": "entity_category", "value": "" }, { "property": "device_class", "value": "" } ], "resend": false, "debugEnabled": false }, { "id": "503ba5fd53d97d51", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "", "name": "Kallen Activities", "version": "6", "entityType": "button", "haConfig": [ { "property": "name", "value": "Kallen Activities" }, { "property": "icon", "value": "mdi:timer" }, { "property": "entity_category", "value": "" }, { "property": "device_class", "value": "" } ], "resend": false, "debugEnabled": false }, { "id": "a26fa856149e18bd", "type": "ha-device-config", "name": "Last Alexa Sensors", "hwVersion": "", "manufacturer": "Node-RED", "model": "", "swVersion": "" }, { "id": "4118a859da3ae01f", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "a26fa856149e18bd", "name": "Last Alexa Name", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Last Alexa Name" }, { "property": "icon", "value": "mdi:volume-high" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "" }, { "property": "state_class", "value": "" } ], "resend": false, "debugEnabled": false }, { "id": "790a5433342e7eb5", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "a26fa856149e18bd", "name": "Last Alexa Serial", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Last Alexa Serial" }, { "property": "icon", "value": "mdi:volume-high" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "" }, { "property": "state_class", "value": "" } ], "resend": false, "debugEnabled": false }, { "id": "4d3001dabc174efe", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "a26fa856149e18bd", "name": "Last Alexa Entity ID", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Last Alexa Entity ID" }, { "property": "icon", "value": "mdi:volume-high" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "" }, { "property": "state_class", "value": "" } ], "resend": false, "debugEnabled": false }, { "id": "d7208904f97a76d6", "type": "ha-device-config", "name": "Tina Work", "hwVersion": "", "manufacturer": "Node-RED", "model": "", "swVersion": "" }, { "id": "3577b1d6ba521c18", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "d7208904f97a76d6", "name": "Tina Work Start Zone", "version": "6", "entityType": "binary_sensor", "haConfig": [ { "property": "name", "value": "Tina Work Start Zone" }, { "property": "icon", "value": "" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" } ], "resend": true, "debugEnabled": false }, { "id": "e5f345a03a1ef184", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "d7208904f97a76d6", "name": "Tina Work End Zone", "version": "6", "entityType": "binary_sensor", "haConfig": [ { "property": "name", "value": "Tina Work End Zone" }, { "property": "icon", "value": "" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" } ], "resend": true, "debugEnabled": false }, { "id": "81cb9d95d14a3e5a", "type": "add-todoist-api-token", "name": "Tony" }, { "id": "060e39a6519a8c4a", "type": "github-api-config", "appId": "377582", "instId": "40829548", "ua": "tm24fan8", "name": "" }, { "id": "1f10335891b41077", "type": "ha-device-config", "name": "Nerdhome Sports", "hwVersion": "", "manufacturer": "Node-RED", "model": "", "swVersion": "" }, { "id": "95180a63dc83b944", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "1f10335891b41077", "name": "Active Sporting Event", "version": "6", "entityType": "select", "haConfig": [ { "property": "name", "value": "Active Sporting Event" }, { "property": "icon", "value": "mdi:baseball-bat" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "options", "value": [ "Michigan Wolverines", "Ohio State Buckeyes", "Toledo Rockets", "Minnesota Vikings", "San Francisco 49ers", "Cleveland Guardians", "Minnesota Twins", "Los Angeles Dodgers" ] } ], "resend": false, "debugEnabled": false }, { "id": "dc557449c40eba5e", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "1f10335891b41077", "name": "Watching Sports", "version": "6", "entityType": "switch", "haConfig": [ { "property": "name", "value": "Watching Sports" }, { "property": "icon", "value": "mdi:baseball-bat" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" } ], "resend": false, "debugEnabled": false }, { "id": "c7a23a2b967375ec", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "1f10335891b41077", "name": "Team Score", "version": "6", "entityType": "number", "haConfig": [ { "property": "name", "value": "Team Score" }, { "property": "icon", "value": "mdi:counter" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "points" }, { "property": "min_value", "value": 0 }, { "property": "max_value", "value": 150 }, { "property": "step_value", "value": 1 }, { "property": "mode", "value": "box" } ], "resend": false, "debugEnabled": false }, { "id": "f64cc18b786d7352", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "1f10335891b41077", "name": "Opponent Score", "version": "6", "entityType": "number", "haConfig": [ { "property": "name", "value": "Opponent Score" }, { "property": "icon", "value": "mdi:counter" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "points" }, { "property": "min_value", "value": 0 }, { "property": "max_value", "value": 150 }, { "property": "step_value", "value": 1 }, { "property": "mode", "value": "box" } ], "resend": false, "debugEnabled": false }, { "id": "accdce4dc47fb84a", "type": "ha-device-config", "name": "Github", "hwVersion": "", "manufacturer": "Node-RED", "model": "", "swVersion": "" }, { "id": "cb877a8619b6d57e", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "accdce4dc47fb84a", "name": "Github Main Repo - Issues", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Github Main Repo - Issues" }, { "property": "icon", "value": "mdi:github" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "" }, { "property": "state_class", "value": "measurement" } ], "resend": false, "debugEnabled": false }, { "id": "17a841239bc49473", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "accdce4dc47fb84a", "name": "Node Red Repo - Issues", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Node Red Repo - Issues" }, { "property": "icon", "value": "mdi:github" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "" }, { "property": "state_class", "value": "measurement" } ], "resend": false, "debugEnabled": false }, { "id": "77c0d6f8dd47a65b", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "", "name": "Master Bedroom Climate Reset", "version": "6", "entityType": "button", "haConfig": [ { "property": "name", "value": "Master Bedroom Climate Reset" }, { "property": "icon", "value": "mdi:backup-restore" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" } ], "resend": false, "debugEnabled": false }, { "id": "39198b07403764b1", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "1f10335891b41077", "name": "Sports Room", "version": "6", "entityType": "select", "haConfig": [ { "property": "name", "value": "Sports Room" }, { "property": "icon", "value": "mdi:baseball-bat" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "options", "value": [ "Living Room", "Basement Studio", "Both" ] } ], "resend": false, "debugEnabled": false }, { "id": "aebd1e9ea95e45da", "type": "ha-device-config", "name": "Laundry Tracking", "hwVersion": "", "manufacturer": "Node-RED", "model": "", "swVersion": "" }, { "id": "5627513f9469cbb8", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "aebd1e9ea95e45da", "name": "Washer Start", "version": "6", "entityType": "button", "haConfig": [ { "property": "name", "value": "Washer Start" }, { "property": "icon", "value": "mdi:washing-machine" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" } ], "resend": false, "debugEnabled": false }, { "id": "d2d7710df0394f16", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "aebd1e9ea95e45da", "name": "Dryer Start", "version": "6", "entityType": "button", "haConfig": [ { "property": "name", "value": "Dryer Start" }, { "property": "icon", "value": "mdi:tumble-dryer" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" } ], "resend": false, "debugEnabled": false }, { "id": "52dccff6d2c39667", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "aebd1e9ea95e45da", "name": "Washer Cancel", "version": "6", "entityType": "button", "haConfig": [ { "property": "name", "value": "Washer Cancel" }, { "property": "icon", "value": "mdi:washing-machine-off" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" } ], "resend": false, "debugEnabled": false }, { "id": "9da998d5f74df33c", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "aebd1e9ea95e45da", "name": "Dryer Cancel", "version": "6", "entityType": "button", "haConfig": [ { "property": "name", "value": "Dryer Cancel" }, { "property": "icon", "value": "mdi:tumble-dryer-off" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" } ], "resend": false, "debugEnabled": false }, { "id": "6ae4463a9ad1f043", "type": "ha-device-config", "name": "Holiday Mode", "hwVersion": "", "manufacturer": "Node-RED", "model": "", "swVersion": "" }, { "id": "d945515487bfbb09", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "6ae4463a9ad1f043", "name": "Animated Scene Halloween", "version": "6", "entityType": "switch", "haConfig": [ { "property": "name", "value": "Animated Scene Halloween" }, { "property": "icon", "value": "mdi:halloween" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" } ], "resend": false, "debugEnabled": false }, { "id": "7d2b67c31769ed69", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "", "name": "exposed as for Doorbell Rings", "version": 6, "entityType": "switch", "haConfig": [ { "property": "name", "value": "Node Red Doorbell Alert" }, { "property": "icon", "value": "mdi:doorbell-video" } ], "resend": false }, { "id": "8e399b2a287a0905", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "", "name": "exposed as for Master Bedroom Cooling", "version": 6, "entityType": "switch", "haConfig": [ { "property": "name", "value": "Master Bedroom Cooling Schedule" }, { "property": "icon", "value": "" } ], "resend": false }, { "id": "314752dbc6fd170d", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "", "name": "exposed as for Master Bedroom Fan", "version": 6, "entityType": "switch", "haConfig": [ { "property": "name", "value": "Master Bedroom Fan Schedule" }, { "property": "icon", "value": "" } ], "resend": false }, { "id": "d7261338e6b907f1", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "", "name": "exposed as for Master Bedroom Wakeup", "version": 6, "entityType": "switch", "haConfig": [ { "property": "name", "value": "Master Bedroom Wakeup Schedule" }, { "property": "icon", "value": "" } ], "resend": false }, { "id": "d5784e5baa80a105", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "", "name": "exposed as for Kallen Bedtime", "version": 6, "entityType": "switch", "haConfig": [ { "property": "name", "value": "Kallen Bedtime Schedule" }, { "property": "icon", "value": "" } ], "resend": false }, { "id": "9e1418c3e9595312", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "", "name": "exposed as for Kallen Wakeup", "version": 6, "entityType": "switch", "haConfig": [ { "property": "name", "value": "Kallen Wakeup Schedule" }, { "property": "icon", "value": "" } ], "resend": false }, { "id": "308fce46bd959bce", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "", "name": "exposed as for Kallen Fan Time", "version": 6, "entityType": "switch", "haConfig": [ { "property": "name", "value": "Kallen Fan Schedule" }, { "property": "icon", "value": "" } ], "resend": false }, { "id": "7cc6440f2cdd8a6b", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "", "name": "exposed as for Lightning Warning", "version": 6, "entityType": "switch", "haConfig": [ { "property": "name", "value": "Node Red Lightning Warning" }, { "property": "icon", "value": "mdi:lightning-bolt" } ], "resend": false }, { "id": "77ba0ad52b2a9e2e", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "", "name": "exposed as for Overwolf Events Dump", "version": 6, "entityType": "switch", "haConfig": [ { "property": "name", "value": "Overwolf Events Dump" }, { "property": "icon", "value": "mdi:test-tube" } ], "resend": false }, { "id": "21461835f9233213", "type": "ha-device-config", "name": "Mosquitto Stats", "hwVersion": "", "manufacturer": "Node-RED", "model": "", "swVersion": "" }, { "id": "b78174a1b561ea3f", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "21461835f9233213", "name": "Mosquitto Received 1min", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Mosquitto Received 1min" }, { "property": "icon", "value": "mdi:database" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "messages" }, { "property": "state_class", "value": "measurement" } ], "resend": true, "debugEnabled": false }, { "id": "acbe15cbb8457f35", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "21461835f9233213", "name": "Mosquitto Received 5min", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Mosquitto Received 5min" }, { "property": "icon", "value": "mdi:database" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "messages" }, { "property": "state_class", "value": "measurement" } ], "resend": true, "debugEnabled": false }, { "id": "e023cc05d1c0cecb", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "21461835f9233213", "name": "Mosquitto Received 15min", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Mosquitto Received 15min" }, { "property": "icon", "value": "mdi:database" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "messages" }, { "property": "state_class", "value": "measurement" } ], "resend": true, "debugEnabled": false }, { "id": "7f5c52481ee5041b", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "21461835f9233213", "name": "Mosquitto Sent 1min", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Mosquitto Sent 1min" }, { "property": "icon", "value": "mdi:database" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "messages" }, { "property": "state_class", "value": "measurement" } ], "resend": true, "debugEnabled": false }, { "id": "b1afb202ae5b94cf", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "21461835f9233213", "name": "Mosquitto Sent 5min", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Mosquitto Sent 5min" }, { "property": "icon", "value": "mdi:database" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "messages" }, { "property": "state_class", "value": "measurement" } ], "resend": true, "debugEnabled": false }, { "id": "608fb2f833106a54", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "21461835f9233213", "name": "Mosquitto Sent 15min", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Mosquitto Sent 15min" }, { "property": "icon", "value": "mdi:database" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "messages" }, { "property": "state_class", "value": "measurement" } ], "resend": true, "debugEnabled": false }, { "id": "3a3de00eeef75917", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "21461835f9233213", "name": "Mosquitto Dropped 1min", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Mosquitto Dropped 1min" }, { "property": "icon", "value": "mdi:database" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "messages" }, { "property": "state_class", "value": "measurement" } ], "resend": true, "debugEnabled": false }, { "id": "01b4bc2b7f492cac", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "21461835f9233213", "name": "Mosquitto Dropped 5min", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Mosquitto Dropped 5min" }, { "property": "icon", "value": "mdi:database" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "messages" }, { "property": "state_class", "value": "measurement" } ], "resend": true, "debugEnabled": false }, { "id": "58b262f448b7831a", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "21461835f9233213", "name": "Mosquitto Dropped 15min", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Mosquitto Dropped 15min" }, { "property": "icon", "value": "mdi:database" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "messages" }, { "property": "state_class", "value": "measurement" } ], "resend": true, "debugEnabled": false }, { "id": "63b391b64c920d72", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "21461835f9233213", "name": "Mosquitto Uptime", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Mosquitto Uptime" }, { "property": "icon", "value": "mdi:database" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "seconds" }, { "property": "state_class", "value": "measurement" } ], "resend": true, "debugEnabled": false }, { "id": "06c585be926ee13b", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "21461835f9233213", "name": "Mosquitto Messages Received", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Mosquitto Messages Received" }, { "property": "icon", "value": "mdi:database" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "messages" }, { "property": "state_class", "value": "measurement" } ], "resend": true, "debugEnabled": false }, { "id": "20642905379cffe9", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "21461835f9233213", "name": "Mosquitto Messages Sent", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Mosquitto Messages Sent" }, { "property": "icon", "value": "mdi:database" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "messages" }, { "property": "state_class", "value": "measurement" } ], "resend": true, "debugEnabled": false }, { "id": "3e54ec9fa6f987bc", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "21461835f9233213", "name": "Mosquitto Messages Stored", "version": "6", "entityType": "sensor", "haConfig": [ { "property": "name", "value": "Mosquitto Messages Stored" }, { "property": "icon", "value": "mdi:database" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" }, { "property": "unit_of_measurement", "value": "messages" }, { "property": "state_class", "value": "measurement" } ], "resend": true, "debugEnabled": false }, { "id": "2bdf556c5a30e5d5", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "", "name": "Downstairs Bathroom Motion Lighting", "version": "6", "entityType": "switch", "haConfig": [ { "property": "name", "value": "Downstairs Bathroom Motion Lighting" }, { "property": "icon", "value": "mdi:motion-sensor" }, { "property": "entity_category", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "device_class", "value": "" } ], "resend": false, "debugEnabled": false }, { "id": "86feef66681d907f", "type": "ha-entity-config", "server": "9e87348d.9c1c48", "deviceConfig": "", "name": "exposed as for LightFX Listener", "version": 6, "entityType": "switch", "haConfig": [ { "property": "name", "value": "LightFX Listener" }, { "property": "icon", "value": "mdi:alarm-light" } ], "resend": false }, { "id": "afead614fabc01bb", "type": "function", "z": "a42343e035e3313c", "name": "", "func": "const alexa = global.get('lastAlexaSerial')\nvar statusMsg = {\n \"payload\": alexa\n}\n\nmsg.where = alexa\n\nreturn[msg,statusMsg]", "outputs": 2, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 340, "y": 80, "wires": [ [], [] ] }, { "id": "1102574d15bdad4c", "type": "delay", "z": "a42343e035e3313c", "name": "", "pauseType": "delay", "timeout": "2", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 180, "y": 80, "wires": [ [ "afead614fabc01bb" ] ] }, { "id": "388878f6056fa3e4", "type": "function", "z": "4107976aa434eb03", "name": "Conversions", "func": "msg.data.main.temp = ((msg.data.main.temp - 273.15) * 1.8) + 32\nmsg.data.main.feels_like = ((msg.data.main.feels_like - 273.15) * 1.8) + 32\nmsg.data.main.temp_min = ((msg.data.main.temp_min - 273.15) * 1.8) + 32\nmsg.data.main.temp_max = ((msg.data.main.temp_max - 273.15) * 1.8) + 32\nmsg.data.main.pressure = msg.data.main.pressure * 0.029529983071445\nmsg.data.wind.speed = msg.data.wind.speed * 2.237\nmsg.data.wind.gust = msg.data.wind.gust * 2.237\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 190, "y": 80, "wires": [ [ "80ce4b42b82e3c78" ] ] }, { "id": "80ce4b42b82e3c78", "type": "function", "z": "4107976aa434eb03", "name": "Rounding", "func": "var temp = msg.data.main.temp\nvar feels_like = msg.data.main.feels_like\nvar temp_min = msg.data.main.temp_min\nvar temp_max = msg.data.main.temp_max\nvar pressure = msg.data.main.pressure\nvar windspeed = msg.data.wind.speed\nvar windgust = msg.data.wind.gust\n\nmsg.data.main.temp = +temp.toFixed(1)\nmsg.data.main.feels_like = +feels_like.toFixed(1)\nmsg.data.main.temp_min = +temp_min.toFixed(1)\nmsg.data.main.temp_max = +temp_max.toFixed(1)\nmsg.data.main.pressure = +pressure.toFixed(2)\nmsg.data.wind.speed = +windspeed.toFixed(2)\nmsg.data.wind.gust = +windgust.toFixed(2)\n\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 360, "y": 80, "wires": [ [] ] }, { "id": "98bf66889d4287db", "type": "api-call-service", "z": "6429099c4571dd6b", "name": "Speech Engine", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "speech_engine", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"who\": topic,\t \"message\": payload,\t \"voice\": voice,\t \"type\": type\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 420, "y": 160, "wires": [ [] ] }, { "id": "cee17a2c2fbb48ee", "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', \"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, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 230, "y": 160, "wires": [ [ "98bf66889d4287db" ], [] ] }, { "id": "cee2f20718ddb03a", "type": "function", "z": "a062d9e6d44506dc", "name": "Format", "func": "const tpc = msg.topic\nconst pld = msg.payload\nvar dest = tpc.replaceAll(\"_\",\" \")\nvar scene = pld.replaceAll(\"_\",\" \")\n\nmsg.topic = dest\nmsg.payload = scene\n\nreturn msg", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 160, "y": 40, "wires": [ [ "78a60e2da212f6aa" ] ] }, { "id": "78a60e2da212f6aa", "type": "api-call-service", "z": "a062d9e6d44506dc", "name": "Hue Activate Scene", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "hue", "service": "hue_activate_scene", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"group_name\": topic,\t \"scene_name\": payload,\t \"dynamic\": \"true\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 370, "y": 40, "wires": [ [] ] }, { "id": "0515d266dc983793", "type": "api-call-service", "z": "582b8363c9f33bf8", "name": "Record Scene", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_text", "service": "set_value", "areaId": [], "deviceId": [], "entityId": [ "input_text.{{topic}}_selected_scene" ], "data": "{\t \"value\": payload\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 340, "y": 40, "wires": [ [ "2fc6ea08f8f366b6" ] ] }, { "id": "2fc6ea08f8f366b6", "type": "api-call-service", "z": "582b8363c9f33bf8", "name": "Reset Dropdown", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_first", "areaId": [], "deviceId": [], "entityId": [ "input_select.{{topic}}_scenes" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 550, "y": 40, "wires": [ [] ] }, { "id": "f1c11209a9226be9", "type": "function", "z": "582b8363c9f33bf8", "name": "", "func": "const pld = msg.payload\nvar scene = pld.replaceAll(\"_\",\" \")\n\nmsg.payload = scene\n\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 160, "y": 40, "wires": [ [ "0515d266dc983793" ] ] }, { "id": "694ce0e1.4bee58", "type": "function", "z": "7cc13ada.b6712c", "name": "is in range?", "func": "const schedule = flow.get(\"schedule\");\nlet start = env.get(\"start\");\nlet stop = env.get(\"stop\");\nlet days = env.get(\"days\");\nif(schedule !== undefined){\n start = schedule.start;\n stop = schedule.stop;\n days = schedule.days;\n}\nconst time = new Date();\nlet day = time.getDay();\nif(day === 0) day = 7;\nlet hour = String(time.getHours());\nlet minute = String(time.getMinutes());\nif(hour.length == 1) hour = \"0\" + hour;\nif(minute.length == 1) minute = \"0\" + minute;\nconst hmtime = hour + \":\" + minute;\nif(days.includes(day)){\n if(start == stop){\n return [msg, null];\n } else if(start > stop){\n if(hmtime >= start || hmtime < stop){\n return [msg, null];\n } else {\n return [null, msg];\n }\n } else if(hmtime >= start && hmtime < stop){\n return [msg, null];\n } else {\n return [null, msg];\n }\n} else {\n return null;\n}", "outputs": 2, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 450, "y": 100, "wires": [ [], [] ] }, { "id": "94dc9c00.0f576", "type": "inject", "z": "7cc13ada.b6712c", "name": "", "repeat": "", "crontab": "", "once": true, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 170, "y": 200, "wires": [ [ "1bc56c04.ca0a3c" ] ] }, { "id": "1bc56c04.ca0a3c", "type": "function", "z": "7cc13ada.b6712c", "name": "display rule", "func": "const schedule = flow.get(\"schedule\");\nif(typeof schedule == \"object\"){\n const start = schedule.start;\n const stop = schedule.stop;\n const days = String(schedule.days).replace(/1/g,\"Mo\").replace(/2/g,\"Tu\").replace(/3/g,\"We\").replace(/4/g,\"Th\").replace(/5/g,\"Fr\").replace(/6/g,\"Sa\").replace(/7/g,\"Su\");\n msg.payload = \"override: \" + start + \"-\" + stop + \"/\" + days;\n} else {\n const start = env.get(\"start\");\n const stop = env.get(\"stop\");\n const days = String(env.get(\"days\")).replace(/1/g,\"Mo\").replace(/2/g,\"Tu\").replace(/3/g,\"We\").replace(/4/g,\"Th\").replace(/5/g,\"Fr\").replace(/6/g,\"Sa\").replace(/7/g,\"Su\");\n const override = false;\n msg.payload = start + \"-\" + stop + \"/\" + days;\n}\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 350, "y": 200, "wires": [ [] ] }, { "id": "da7f7d3f.da5af", "type": "function", "z": "7cc13ada.b6712c", "name": "check for override", "func": "if(msg.topic == \"override\"){\n flow.set(\"schedule\",msg.payload);\n return [null, msg];\n} else if (msg.payload == \"reset\"){\n let reset;\n flow.set(\"schedule\",reset);\n return [null, msg];\n} else {\n return [msg, null];\n}", "outputs": 2, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 250, "y": 100, "wires": [ [ "694ce0e1.4bee58" ], [ "1bc56c04.ca0a3c" ] ] }, { "id": "942a915b6599fb27", "type": "api-call-service", "z": "a4ee891237e460a2", "name": "Set Scene", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "scene", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "scene.{{topic}}_{{payload}}" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 930, "y": 460, "wires": [ [] ] }, { "id": "a89c7e8905a07998", "type": "api-call-service", "z": "a4ee891237e460a2", "name": "Reset", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.{{topic}}_scenes" ], "data": "{\t \"option\":\"Adaptive\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 550, "y": 360, "wires": [ [] ] }, { "id": "8c4d4fe614a52d4f", "type": "api-call-service", "z": "a4ee891237e460a2", "name": "Apply Adaptive Lighting", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "adaptive_lighting", "service": "apply", "areaId": [], "deviceId": [], "entityId": [ "switch.adaptive_lighting_{{topic}}" ], "data": "{\t \"adapt_brightness\" : brightness,\t \"adapt_color\" : color\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1530, "y": 280, "wires": [ [] ] }, { "id": "c19b4dccc5d6a9af", "type": "api-call-service", "z": "a4ee891237e460a2", "name": "Nightlight Set", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_{{nightlight}}", "areaId": [], "deviceId": [], "entityId": [ "switch.adaptive_lighting_sleep_mode_{{topic}}" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 750, "y": 460, "wires": [ [ "942a915b6599fb27" ] ] }, { "id": "3a4f567b17b2214e", "type": "api-call-service", "z": "a4ee891237e460a2", "name": "Nightlight Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "switch.adaptive_lighting_sleep_mode_{{topic}}" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 930, "y": 280, "wires": [ [ "f41c0229b9fdcea4" ] ] }, { "id": "f41c0229b9fdcea4", "type": "api-call-service", "z": "a4ee891237e460a2", "name": "Turn Lights On", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "light.{{topic}}_lights" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1120, "y": 280, "wires": [ [ "970f719de254a1e7" ] ] }, { "id": "970f719de254a1e7", "type": "delay", "z": "a4ee891237e460a2", "name": "", "pauseType": "delay", "timeout": "500", "timeoutUnits": "milliseconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 1310, "y": 280, "wires": [ [ "8c4d4fe614a52d4f" ] ] }, { "id": "97400c5ff0842570", "type": "api-call-service", "z": "a4ee891237e460a2", "name": "Adaptive Lighting On", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "switch.adaptive_lighting_{{topic}}" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 600, "y": 160, "wires": [ [] ] }, { "id": "dc0972a3964e6513", "type": "api-call-service", "z": "a4ee891237e460a2", "name": "Adaptive Lighting Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "switch.adaptive_lighting_{{topic}}" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 600, "y": 520, "wires": [ [] ] }, { "id": "defe84d113029e8e", "type": "subflow:a062d9e6d44506dc", "z": "a4ee891237e460a2", "name": "", "x": 980, "y": 400, "wires": [ [] ] }, { "id": "72c0b7fda242bb67", "type": "api-call-service", "z": "a4ee891237e460a2", "name": "Dynamic Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.{{topic}}_dynamic_scenes" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 750, "y": 220, "wires": [ [ "3a4f567b17b2214e" ] ] }, { "id": "a81fd188d89faa25", "type": "subflow:582b8363c9f33bf8", "z": "a4ee891237e460a2", "name": "", "x": 570, "y": 580, "wires": [] }, { "id": "de5a484b79c5d0e4", "type": "subflow:582b8363c9f33bf8", "z": "a4ee891237e460a2", "name": "", "x": 570, "y": 100, "wires": [] }, { "id": "60924f02885cc3c8", "type": "api-call-service", "z": "a4ee891237e460a2", "name": "Notify TV", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "tv_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"who\": dest,\t \"title\": topic,\t \"message\": payload,\t \"data\": {\t \"fontsize\": \"large\",\t \"duration\": 3,\t \"transparency\": \"25%\",\t \"color\": \"red\"\t }\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 920, "y": 340, "wires": [ [] ] }, { "id": "ca51f6e6bd51fb55", "type": "function", "z": "a4ee891237e460a2", "name": "Routing", "func": "var str = msg.payload\nvar newPayload = str.replaceAll(\" \",\"_\")\nvar topic = msg.topic\n\nmsg.payload = newPayload\n\nif (newPayload === 'Select') {\n return null\n} else if (newPayload === 'Adaptive') {\n return[msg,null,null]\n} else if (newPayload === 'Reset') {\n return[null,msg,null]\n} else {\n return[null,null,msg]\n}", "outputs": 3, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 360, "y": 360, "wires": [ [ "de5a484b79c5d0e4", "9af9a2966a477b33", "97400c5ff0842570" ], [ "a89c7e8905a07998" ], [ "a81fd188d89faa25", "dc0972a3964e6513", "4ab49b8485f1886f" ] ], "outputLabels": [ "Adaptive", "Reset", "Otherwise" ], "icon": "node-red/switch.svg" }, { "id": "9af9a2966a477b33", "type": "function", "z": "a4ee891237e460a2", "name": "Routing", "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": "", "finalize": "", "libs": [], "x": 560, "y": 280, "wires": [ [ "72c0b7fda242bb67" ], [ "3a4f567b17b2214e" ], [ "60924f02885cc3c8" ], [] ], "outputLabels": [ "Dynamic", "Else", "", "" ] }, { "id": "4ab49b8485f1886f", "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\", \"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": "", "finalize": "", "libs": [], "x": 560, "y": 440, "wires": [ [ "defe84d113029e8e" ], [ "c19b4dccc5d6a9af" ], [ "60924f02885cc3c8" ], [] ], "outputLabels": [ "Dynamic", "Non-Dynamic", "Notify", "" ] }, { "id": "6088f5b9f13e0e36", "type": "delay", "z": "05a2d9f89e72481f", "name": "", "pauseType": "delay", "timeout": "2", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 200, "y": 80, "wires": [ [ "8e803251d3e3c3ae" ] ] }, { "id": "8e803251d3e3c3ae", "type": "function", "z": "05a2d9f89e72481f", "name": "", "func": "const alexa = global.get('lastAlexaName')\nvar statusMsg = {\n \"payload\": alexa\n}\n\nif (alexa === \"Basement Echo Dot\") {\n msg.who = \"basement\"\n} else if (alexa === \"Living Room Echo Dot\") {\n msg.who = \"living_room\"\n} else if (alexa === \"Master Bedroom Echo Dot\") {\n msg.who = \"master_bedroom\"\n}\n\nreturn[msg,statusMsg]", "outputs": 2, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 360, "y": 80, "wires": [ [], [] ] }, { "id": "54f4bebfc9414dbd", "type": "lifx-list-scenes", "z": "3aa2aec226246753", "name": "", "api": "60eb53fb94cd64e4", "x": 210, "y": 140, "wires": [ [ "96da394eceab9244" ] ] }, { "id": "8b4af77e07c66df9", "type": "lifx-list-lights", "z": "3aa2aec226246753", "name": "", "api": "60eb53fb94cd64e4", "selector": "", "x": 200, "y": 80, "wires": [ [ "817c0a6afb11477b" ] ] }, { "id": "817c0a6afb11477b", "type": "debug", "z": "3aa2aec226246753", "name": "lights", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 370, "y": 80, "wires": [] }, { "id": "96da394eceab9244", "type": "debug", "z": "3aa2aec226246753", "name": "scenes", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 380, "y": 140, "wires": [] }, { "id": "8ad119b6c6e11ddd", "type": "function", "z": "85c4f81ca9628aea", "name": "Format", "func": "const str = msg.payload\nvar scene = str.replaceAll(\"_\",\" \")\n\nmsg.dest = msg.topic\n\nmsg.topic = \"Lights Changed\"\nmsg.payload = ('Lights changed to a new scene: ' + scene)\n\nif (msg.payload === 'Lights changed to a new scene: Reset') {\n return null;\n} else {\n return msg;\n}", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 840, "y": 340, "wires": [ [] ] }, { "id": "78a73c2d816658d8", "type": "subflow:582b8363c9f33bf8", "z": "85c4f81ca9628aea", "name": "", "x": 710, "y": 420, "wires": [] }, { "id": "9cd0aa12d56438c6", "type": "function", "z": "85c4f81ca9628aea", "name": "Routing", "func": "var str = msg.payload\nvar newPayload = str.replaceAll(\" \",\"_\")\n\nmsg.payload = newPayload\n\nif (newPayload != 'Select' && newPayload != 'Reset') {\n return msg;\n} else {\n return null\n}", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 380, "y": 340, "wires": [ [ "78a73c2d816658d8", "138fc130a014b26e" ] ], "outputLabels": [ "Adaptive" ] }, { "id": "138fc130a014b26e", "type": "api-call-service", "z": "85c4f81ca9628aea", "name": "Set Scene", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "script.{{payload}}_in_{{topic}}" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 670, "y": 340, "wires": [ [ "8ad119b6c6e11ddd" ] ] }, { "id": "b05ef328b90665d5", "type": "delay", "z": "b88bb63bb13eeb27", "name": "", "pauseType": "delay", "timeout": "2", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 200, "y": 80, "wires": [ [ "c2a8a3f1f00bc4b7" ] ] }, { "id": "c2a8a3f1f00bc4b7", "type": "function", "z": "b88bb63bb13eeb27", "name": "", "func": "const alexa = global.get('lastAlexaEntityId')\nvar statusMsg = {\n \"payload\": alexa\n}\n\nmsg.who = alexa\n\nreturn[msg,statusMsg]", "outputs": 2, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 360, "y": 80, "wires": [ [], [] ] }, { "id": "d509e18fa07ab430", "type": "color-convert", "z": "17510314e84badd9", "input": "hex", "output": "rgb", "outputType": "array", "scaleInput": false, "x": 350, "y": 80, "wires": [ [ "e0b30104939cf28d" ] ] }, { "id": "664a1a92c5c5546e", "type": "split", "z": "17510314e84badd9", "name": "", "splt": "\\n", "spltType": "str", "arraySplt": 1, "arraySpltType": "len", "stream": false, "addname": "", "x": 190, "y": 80, "wires": [ [ "d509e18fa07ab430" ] ] }, { "id": "e0b30104939cf28d", "type": "join", "z": "17510314e84badd9", "name": "", "mode": "auto", "build": "object", "property": "payload", "propertyType": "msg", "key": "topic", "joiner": "\\n", "joinerType": "str", "accumulate": true, "timeout": "", "count": "", "reduceRight": false, "reduceExp": "", "reduceInit": "", "reduceInitType": "", "reduceFixup": "", "x": 510, "y": 80, "wires": [ [ "52dd35473d9e536f" ] ] }, { "id": "52dd35473d9e536f", "type": "function", "z": "17510314e84badd9", "name": "Set Contexts", "func": "const topic = msg.topic\nconst payload = msg.payload\n\nif (topic === 'teamColors') {\n flow.set(\"$parent.teamColors\", payload, \"diskCon\")\n} else if (topic === 'oppColors') {\n flow.set(\"$parent.oppColors\", payload, \"diskCon\")\n}", "outputs": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 690, "y": 80, "wires": [] }, { "id": "8b3c203e7e901a8c", "type": "moment", "z": "384eaf2f63dcb5db", "name": "", "topic": "", "input": "timestamp", "inputType": "msg", "inTz": "America/New_York", "adjAmount": 0, "adjType": "days", "adjDir": "add", "format": "YYYY-MM-DD HH:mm:00", "locale": "en_us", "output": "datetime", "outputType": "msg", "outTz": "America/New_York", "x": 240, "y": 80, "wires": [ [] ] }, { "id": "b2d071ca42e4a3c6", "type": "function", "z": "9766d47584651edb", "name": "Convert to seconds", "func": "let duration = msg.duration\nlet seconds = duration * 60\n\nlet statusMsg = {\n \"payload\": seconds + \"s\"\n}\n\nmsg.duration = seconds\n\nnode.status({ fill: \"green\", shape: \"dot\", text: msg.duration + \"s\"});\n\nreturn[msg,statusMsg]", "outputs": 2, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 230, "y": 80, "wires": [ [], [] ], "outputLabels": [ "Output", "Status" ], "icon": "font-awesome/fa-clock-o" }, { "id": "7fc67fc156c0f4be", "type": "api-call-service", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Start Timer", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "timer", "service": "start", "areaId": [], "deviceId": [], "entityId": [ "timer.kallen_timer" ], "data": "{ \"duration\": {{duration}}}", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 790, "y": 200, "wires": [ [] ] }, { "id": "34dcb204b421710d", "type": "api-call-service", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Resume Timer", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "timer", "service": "start", "areaId": [], "deviceId": [], "entityId": [ "timer.kallen_timer" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 580, "y": 440, "wires": [ [ "e69ad4771494c458", "93a52960301bb3a3" ] ] }, { "id": "923538ef97772f0c", "type": "api-call-service", "z": "4a8821853d4dd1ad", "g": "1ca205a84922c8c2", "name": "Notification", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "text_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"who\":\"kallen\",\t \"message\": payload,\t \"title\": topic,\t \"type\": \"normal\",\t \"tag\": \"kallen-timer-finished\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 950, "y": 660, "wires": [ [] ] }, { "id": "a3e3dc438a7b95fc", "type": "change", "z": "4a8821853d4dd1ad", "g": "1ca205a84922c8c2", "name": "Finished Message", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "You are done with activity for today!", "tot": "str" }, { "t": "set", "p": "topic", "pt": "msg", "to": "activity Timer Complete", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 570, "y": 660, "wires": [ [ "08a22fa71fce5e91" ] ] }, { "id": "797d3e7cc53d773f", "type": "ha-button", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Start Button", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "fbc65f8185932b5f", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "button", "valueType": "str" } ], "x": 130, "y": 300, "wires": [ [ "1a0adfa82fff507a" ] ] }, { "id": "fe1ba086baf93ec0", "type": "api-call-service", "z": "4a8821853d4dd1ad", "g": "1ca205a84922c8c2", "name": "Reset Slider", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_number", "service": "set_value", "areaId": [], "deviceId": [], "entityId": [ "input_number.kallen_activity_duration" ], "data": "{\t \"value\":30\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 350, "y": 820, "wires": [ [] ] }, { "id": "50056b099a24a824", "type": "subflow:6429099c4571dd6b", "z": "4a8821853d4dd1ad", "g": "1ca205a84922c8c2", "name": "", "x": 640, "y": 600, "wires": [ [] ] }, { "id": "d8e2d16e313b938a", "type": "change", "z": "4a8821853d4dd1ad", "g": "1ca205a84922c8c2", "name": "Task ID", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "{\"id\":\"5631572291\"}", "tot": "json" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 575, "y": 720, "wires": [ [ "283661388275a459" ] ], "l": false }, { "id": "e69ad4771494c458", "type": "api-current-state", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Get Room", "server": "9e87348d.9c1c48", "version": 3, "outputs": 1, "halt_if": "", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "input_select.kallen_activity_room", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": 0, "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 770, "y": 440, "wires": [ [ "fdf9b6820eb7289a" ] ] }, { "id": "fdf9b6820eb7289a", "type": "switch", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Routing", "property": "room", "propertyType": "msg", "rules": [ { "t": "eq", "v": "Kallen Bedroom", "vt": "str" }, { "t": "else" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 885, "y": 440, "wires": [ [ "24abb932c4cd0b1f" ], [] ], "l": false }, { "id": "5c44fd504453ae63", "type": "api-call-service", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Turn on K's bedroom lights", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_on", "areaId": [ "kallen_bedroom" ], "deviceId": [], "entityId": [], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1440, "y": 400, "wires": [ [ "dd0be4a0dd77e1db" ] ] }, { "id": "908543f7b78f7beb", "type": "api-call-service", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Turn on K's bedroom lights", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_on", "areaId": [ "kallen_bedroom" ], "deviceId": [], "entityId": [], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 980, "y": 80, "wires": [ [ "d6728df5d1fdf67e" ] ] }, { "id": "dd0be4a0dd77e1db", "type": "delay", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "", "pauseType": "delay", "timeout": "5", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 1605, "y": 400, "wires": [ [ "6b086807971b2618" ] ], "l": false }, { "id": "d6728df5d1fdf67e", "type": "delay", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "", "pauseType": "delay", "timeout": "5", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 1155, "y": 80, "wires": [ [ "ae7073e78053da5d" ] ], "l": false }, { "id": "ae7073e78053da5d", "type": "api-call-service", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Set to Adaptive", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.kallen_bedroom_scenes" ], "data": "{\t \"option\":\"Adaptive\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1300, "y": 80, "wires": [ [] ] }, { "id": "6b086807971b2618", "type": "api-call-service", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Set to Adaptive", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.kallen_bedroom_scenes" ], "data": "{\t \"option\":\"Adaptive\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1740, "y": 400, "wires": [ [] ] }, { "id": "6736626753b33834", "type": "api-current-state", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Check lights", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "off", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "light.kallen_bedroom_lights", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "lights", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 1210, "y": 440, "wires": [ [ "5c44fd504453ae63" ], [] ], "outputLabels": [ "off", "on" ] }, { "id": "b0c92a72557d0ac6", "type": "switch", "z": "4a8821853d4dd1ad", "g": "1ca205a84922c8c2", "name": "", "property": "activity", "propertyType": "msg", "rules": [ { "t": "eq", "v": "Reading", "vt": "str" }, { "t": "eq", "v": "Writing", "vt": "str" }, { "t": "eq", "v": "Trombone Practice", "vt": "str" }, { "t": "eq", "v": "Studying", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 4, "x": 495, "y": 820, "wires": [ [ "d8e2d16e313b938a" ], [ "408795055634e897" ], [ "d580c539c554a4c1" ], [ "f0cc7b3b9622312a" ] ], "l": false }, { "id": "408795055634e897", "type": "change", "z": "4a8821853d4dd1ad", "g": "1ca205a84922c8c2", "name": "Task ID", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "{\"id\":\"5631620966\"}", "tot": "json" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 575, "y": 780, "wires": [ [ "283661388275a459" ] ], "l": false }, { "id": "0a441953c41a18ae", "type": "change", "z": "4a8821853d4dd1ad", "g": "1ca205a84922c8c2", "name": "Formatting", "rules": [ { "t": "change", "p": "payload", "pt": "msg", "from": "activity", "fromt": "str", "to": "activity", "tot": "msg" }, { "t": "set", "p": "voice", "pt": "msg", "to": "Joanna", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 495, "y": 600, "wires": [ [ "50056b099a24a824" ] ], "l": false }, { "id": "08a22fa71fce5e91", "type": "change", "z": "4a8821853d4dd1ad", "g": "1ca205a84922c8c2", "name": "Set Activity", "rules": [ { "t": "change", "p": "payload", "pt": "msg", "from": "activity", "fromt": "str", "to": "activity", "tot": "msg" }, { "t": "change", "p": "topic", "pt": "msg", "from": "activity", "fromt": "str", "to": "activity", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 770, "y": 660, "wires": [ [ "923538ef97772f0c" ] ] }, { "id": "736d7433005436b3", "type": "change", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Formatting", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "activity timer has been started in room for duration minutes", "tot": "str" }, { "t": "set", "p": "topic", "pt": "msg", "to": "room", "tot": "msg" }, { "t": "change", "p": "payload", "pt": "msg", "from": "activity", "fromt": "str", "to": "activity", "tot": "msg" }, { "t": "change", "p": "payload", "pt": "msg", "from": "room", "fromt": "str", "to": "room", "tot": "msg" }, { "t": "change", "p": "payload", "pt": "msg", "from": "duration", "fromt": "str", "to": "duration", "tot": "msg" }, { "t": "set", "p": "voice", "pt": "msg", "to": "Joanna", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 735, "y": 260, "wires": [ [ "0aa29248b560c45d" ] ], "l": false }, { "id": "0aa29248b560c45d", "type": "subflow:6429099c4571dd6b", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "", "x": 860, "y": 260, "wires": [ [] ] }, { "id": "b8ca8a1a2655570b", "type": "function", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Rounding", "func": "var readout = msg.duration\n\nmsg.duration = +readout.toFixed(0)\n\nnode.status({fill:\"green\",shape:\"dot\",text:msg.duration + \"m\"});\n\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 675, "y": 260, "wires": [ [ "736d7433005436b3" ] ], "l": false }, { "id": "24abb932c4cd0b1f", "type": "api-current-state", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Control Lights?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "input_boolean.kallen_timer_control_lights", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "lights", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 1020, "y": 440, "wires": [ [ "6736626753b33834" ], [] ], "outputLabels": [ "on", "off" ] }, { "id": "c0521b53f7efeb17", "type": "change", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Formatting", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "activity timer has been paused in room with remainingmin minutes and remainingsec seconds left", "tot": "str" }, { "t": "set", "p": "topic", "pt": "msg", "to": "room", "tot": "msg" }, { "t": "change", "p": "payload", "pt": "msg", "from": "activity", "fromt": "str", "to": "activity", "tot": "msg" }, { "t": "change", "p": "payload", "pt": "msg", "from": "room", "fromt": "str", "to": "room", "tot": "msg" }, { "t": "change", "p": "payload", "pt": "msg", "from": "remainingmin", "fromt": "str", "to": "remainingmin", "tot": "msg" }, { "t": "change", "p": "payload", "pt": "msg", "from": "remainingsec", "fromt": "str", "to": "remainingsec", "tot": "msg" }, { "t": "set", "p": "voice", "pt": "msg", "to": "Joanna", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 885, "y": 360, "wires": [ [ "95d5ac486b4f9ee0" ] ], "l": false }, { "id": "95d5ac486b4f9ee0", "type": "subflow:6429099c4571dd6b", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "", "x": 1020, "y": 360, "wires": [ [] ] }, { "id": "49767cbfa622a734", "type": "change", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Formatting", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "activity timer has been resumed in room with remainingmin minutes and remainingsec seconds remaining", "tot": "str" }, { "t": "set", "p": "topic", "pt": "msg", "to": "room", "tot": "msg" }, { "t": "change", "p": "payload", "pt": "msg", "from": "activity", "fromt": "str", "to": "activity", "tot": "msg" }, { "t": "change", "p": "payload", "pt": "msg", "from": "room", "fromt": "str", "to": "room", "tot": "msg" }, { "t": "change", "p": "payload", "pt": "msg", "from": "remainingmin", "fromt": "str", "to": "remainingmin", "tot": "msg" }, { "t": "change", "p": "payload", "pt": "msg", "from": "remainingsec", "fromt": "str", "to": "remainingsec", "tot": "msg" }, { "t": "set", "p": "voice", "pt": "msg", "to": "Joanna", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 885, "y": 500, "wires": [ [ "04113ab4977bf725" ] ], "l": false }, { "id": "04113ab4977bf725", "type": "subflow:6429099c4571dd6b", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "", "x": 1020, "y": 500, "wires": [ [] ] }, { "id": "d580c539c554a4c1", "type": "change", "z": "4a8821853d4dd1ad", "g": "1ca205a84922c8c2", "name": "Task ID", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "{\"id\":\"6222268062\"}", "tot": "json" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 575, "y": 840, "wires": [ [ "283661388275a459" ] ], "l": false }, { "id": "f0cc7b3b9622312a", "type": "change", "z": "4a8821853d4dd1ad", "g": "1ca205a84922c8c2", "name": "Task ID", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "{\"id\":\"6351557015\"}", "tot": "json" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 575, "y": 900, "wires": [ [ "283661388275a459" ] ], "l": false }, { "id": "206e512c5268020f", "type": "server-events", "z": "4a8821853d4dd1ad", "g": "1ca205a84922c8c2", "name": "Timer Finished", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "", "eventType": "timer.finished", "eventData": "{\"entity_id\":\"timer.kallen_timer\"}", "waitForRunning": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" } ], "x": 140, "y": 600, "wires": [ [ "fe1ba086baf93ec0", "4da18a3f1e0298db" ] ] }, { "id": "93a52960301bb3a3", "type": "function", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Announce", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar room = states['input_select.kallen_activity_room'].state\nvar activity = states['input_select.kallen_activities'].state\nvar minutes = states['sensor.kallen_timer_remaining_minutes'].state\nvar seconds = states['sensor.kallen_timer_remaining_seconds'].state\n\nmsg.room = room\nmsg.activity = activity\nmsg.remainingmin = minutes\nmsg.remainingsec = seconds\n\nnode.status({ fill: \"green\", shape: \"dot\", text: \"Sent\" });\n\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 760, "y": 500, "wires": [ [ "49767cbfa622a734" ] ], "icon": "font-awesome/fa-volume-up" }, { "id": "0e39331337b021bb", "type": "function", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Start", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar room = states['input_select.kallen_activity_room'].state\nvar activity = states['input_select.kallen_activities'].state\nvar controlLights = states['input_boolean.kallen_timer_control_lights'].state\nvar duration = states['input_number.kallen_activity_duration'].state\nvar fixDuration = parseFloat(duration)\n\nmsg.room = room\nmsg.activity = activity\nmsg.lights = controlLights\nmsg.duration = fixDuration\n\nnode.status({fill:\"green\",shape:\"dot\",text:room});\n\nif (room === 'Basement') {\n return[msg,null,null]\n} else if (room === 'Kallen Bedroom') {\n return [null,msg,null]\n} else {\n return[null,null,msg]\n}", "outputs": 3, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 550, "y": 160, "wires": [ [ "b8ca8a1a2655570b", "49dbe17ff03ed572", "9612270d4cdfbf07" ], [ "b8ca8a1a2655570b", "49dbe17ff03ed572", "9612270d4cdfbf07" ], [ "b8ca8a1a2655570b", "49dbe17ff03ed572", "9612270d4cdfbf07" ] ], "outputLabels": [ "Basement", "Kallen Bedroom", "Otherwise" ], "icon": "font-awesome/fa-hourglass-start" }, { "id": "82172c8ab1a9c8e2", "type": "function", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Announce", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar room = states['input_select.kallen_activity_room'].state\nvar activity = states['input_select.kallen_activities'].state\nvar minutes = states['sensor.kallen_timer_remaining_minutes'].state\nvar seconds = states['sensor.kallen_timer_remaining_seconds'].state\n\nmsg.room = room\nmsg.activity = activity\nmsg.remainingmin = minutes\nmsg.remainingsec = seconds\n\nnode.status({fill:\"green\",shape:\"dot\",text:\"Sent\"});\n\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 560, "y": 360, "wires": [ [ "afeb1d238a623c3d" ] ], "icon": "font-awesome/fa-volume-up" }, { "id": "afeb1d238a623c3d", "type": "api-call-service", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "timer", "service": "pause", "areaId": [], "deviceId": [], "entityId": [ "timer.kallen_timer" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 770, "y": 360, "wires": [ [ "c0521b53f7efeb17" ] ] }, { "id": "4da18a3f1e0298db", "type": "function", "z": "4a8821853d4dd1ad", "g": "1ca205a84922c8c2", "name": "Announce", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar room = states['input_select.kallen_activity_room'].state\nvar activity = states['input_select.kallen_activities'].state\n\nmsg.topic = room\nmsg.activity = activity\nmsg.payload = 'activity timer completed, good job!'\n\nnode.status({ fill: \"green\", shape: \"dot\", text: \"Sent\" });\n\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 340, "y": 600, "wires": [ [ "a3e3dc438a7b95fc", "b0c92a72557d0ac6", "0a441953c41a18ae" ] ], "icon": "font-awesome/fa-volume-up" }, { "id": "49dbe17ff03ed572", "type": "function", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Lights?", "func": "if (msg.lights === 'on') {\n if (msg.room === 'Kallen Bedroom') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Lights Controlled\"});\n return[msg,null]\n } else if (msg.room === 'Living Room') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Lights Controlled\"});\n return[null,msg]\n } else {\n node.status({fill:\"red\",shape:\"ring\",text:\"N/A in \" + msg.room});\n return null\n }\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Disabled\"});\n return null\n}", "outputs": 2, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 720, "y": 120, "wires": [ [ "908543f7b78f7beb" ], [ "259da5d2e5a07c83" ] ], "outputLabels": [ "Kallen Bedroom", "Living Room" ], "icon": "node-red-contrib-huemagic/hue-light.svg" }, { "id": "259da5d2e5a07c83", "type": "api-call-service", "z": "4a8821853d4dd1ad", "name": "Turn on Living Room lights", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "light.living_room_lights" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 980, "y": 140, "wires": [ [ "cd6fc2c497e8d571" ] ] }, { "id": "cd6fc2c497e8d571", "type": "delay", "z": "4a8821853d4dd1ad", "name": "", "pauseType": "delay", "timeout": "5", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 1155, "y": 140, "wires": [ [ "d6594de2b4194b54" ] ], "l": false }, { "id": "d6594de2b4194b54", "type": "api-call-service", "z": "4a8821853d4dd1ad", "name": "Set to Adaptive", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.living_room_scenes" ], "data": "{\t \"option\":\"Adaptive\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1300, "y": 140, "wires": [ [] ] }, { "id": "283661388275a459", "type": "todoist-task-complete", "z": "4a8821853d4dd1ad", "g": "1ca205a84922c8c2", "name": "", "token": "81cb9d95d14a3e5a", "x": 740, "y": 820, "wires": [ [] ] }, { "id": "9612270d4cdfbf07", "type": "subflow:9766d47584651edb", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "", "x": 675, "y": 200, "wires": [ [ "7fc67fc156c0f4be" ] ], "l": false }, { "id": "1a0adfa82fff507a", "type": "function", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Processing", "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst timer = states['timer.kallen_timer'].state\n\n// Basic replacement for current entry flow\n\nif (timer === 'idle') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Start\"})\n node.send([msg,null,null])\n} else if (timer === 'active') {\n node.status({fill:\"yellow\",shape:\"dot\",text:\"Pause\"})\n node.send([null,msg,null])\n} else if (timer === 'paused') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Resume\"})\n node.send([null,null,msg])\n}", "outputs": 3, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 350, "y": 300, "wires": [ [ "0e39331337b021bb" ], [ "82172c8ab1a9c8e2" ], [ "34dcb204b421710d" ] ], "outputLabels": [ "idle", "active", "paused" ] }, { "id": "27ae9c023ee2d1f6", "type": "server-state-changed", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Duration Change", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_number.kallen_activity_duration", "entityIdType": "exact", "outputInitially": false, "stateType": "num", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": true, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "eventData" } ], "x": 140, "y": 80, "wires": [ [ "88d088ea70f0030a" ] ] }, { "id": "88d088ea70f0030a", "type": "function", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Timer Math", "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst oldState = msg.data.old_state.state\nconst newState = msg.data.new_state.state\nconst entity_id = msg.data.entity_id\nconst subtract = newState - oldState\nconst multiply = subtract * 60\nconst diff = parseInt(multiply)\nconst running = states[\"timer.kallen_timer\"].state\n\nlet changeMsg = {\n \"timer\": \"timer.kallen_timer\",\n \"change\": diff\n}\n\nif (running === 'active') {\n node.send(changeMsg)\n node.status({fill:\"green\",shape:\"dot\",text:\"Timer Changed\"})\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Blocked\"})\n}", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 330, "y": 80, "wires": [ [ "86c7f29776a59797" ] ] }, { "id": "86c7f29776a59797", "type": "api-call-service", "z": "4a8821853d4dd1ad", "g": "a46fc8e7e70ca893", "name": "Timer Change", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "timer_modify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"timer\": timer,\t \"change\": change\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 520, "y": 80, "wires": [ [] ] }, { "id": "fd4bbf481e16e6ea", "type": "sunrise", "z": "e44b1e7a8ef7ae1d", "name": "", "lat": "41.286720", "lon": "-84.362106", "start": "sunriseEnd", "end": "sunsetStart", "soff": 0, "eoff": "-60", "x": 130, "y": 180, "wires": [ [ "15a73af2f8ea690c" ], [ "dd3f147b2583a136" ] ] }, { "id": "bee1e4f9b480f6f6", "type": "ha-button", "z": "e44b1e7a8ef7ae1d", "name": "Manual Trigger", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "738e7f8f2ac71049", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "0", "valueType": "num" }, { "property": "topic", "propertyType": "msg", "value": "manual-trigger", "valueType": "str" } ], "x": 120, "y": 300, "wires": [ [ "5ec63f0857df4164" ] ] }, { "id": "3d97e97025c63331", "type": "ical-upcoming", "z": "e44b1e7a8ef7ae1d", "confignode": "0df0d4b823c241ca", "timeout": "300", "timeoutUnits": "seconds", "cron": "", "name": "", "offsettype": "", "offset": "", "offsetUnitstype": "", "offsetUnits": "", "eventtypes": "events", "eventtypestype": "eventtypes", "calendar": "", "calendartype": "str", "triggertype": "trigger", "trigger": "match", "timezone": "America/New_York", "timezonetype": "str", "dateformat": "{\"timeStyle\":\"short\",\"dateStyle\":\"short\"}", "dateformattype": "json", "language": "en", "languagetype": "language", "filterProperty": "summary", "filterPropertytype": "filterProperty", "filterOperator": "between", "filterOperatortype": "filterOperator", "filtertype": "str", "filter2type": "str", "filter2": "", "filter": "Work", "checkall": false, "endpreview": "", "endpreviewUnits": "", "previewtype": "num", "preview": "", "previewUnitstype": "previewUnits", "previewUnits": "days", "pastviewtype": "num", "pastview": "", "pastviewUnits": "days", "pastviewUnitstype": "pastviewUnits", "x": 150, "y": 640, "wires": [ [ "a605e8b865992be7" ] ] }, { "id": "798ff6ede18394ea", "type": "ha-binary-sensor", "z": "e44b1e7a8ef7ae1d", "name": "Work Tomorrow", "entityConfig": "781adad6153d9661", "version": 0, "state": "work_tomorrow", "stateType": "msg", "attributes": [ { "property": "date", "value": "payload.0.date", "valueType": "msg" }, { "property": "eventStart", "value": "payload.0.eventStart", "valueType": "msg" }, { "property": "eventEnd", "value": "payload.0.eventEnd", "valueType": "msg" }, { "property": "summary", "value": "payload.0.summary", "valueType": "msg" }, { "property": "location", "value": "payload.0.location", "valueType": "msg" }, { "property": "isRecurring", "value": "payload.0.isRecurring", "valueType": "msg" }, { "property": "allDay", "value": "payload.0.allDay", "valueType": "msg" }, { "property": "calendarName", "value": "payload.0.calendarName", "valueType": "msg" }, { "property": "countdown", "value": "payload.0.countdown", "valueType": "msg" }, { "property": "start_timestamp", "value": "payload.0.uid.date", "valueType": "msg" } ], "inputOverride": "allow", "outputProperties": [], "x": 620, "y": 600, "wires": [ [] ] }, { "id": "6995391c94793f08", "type": "server-events", "z": "e44b1e7a8ef7ae1d", "name": "Timer Finished", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "", "eventType": "timer.finished", "eventData": "{\"entity_id\":\"timer.sunset_lighting_timer\"}", "waitForRunning": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "0", "valueType": "num" }, { "property": "topic", "propertyType": "msg", "value": "timer-finished", "valueType": "str" } ], "x": 120, "y": 240, "wires": [ [ "5ec63f0857df4164" ] ] }, { "id": "84d40e607426c66f", "type": "ha-binary-sensor", "z": "e44b1e7a8ef7ae1d", "name": "Early Night Mode", "entityConfig": "e27ae85e2a296e7c", "version": 0, "state": "payload", "stateType": "msg", "attributes": [ { "property": "off", "value": "start", "valueType": "msg" }, { "property": "on", "value": "end", "valueType": "msg" } ], "inputOverride": "allow", "outputProperties": [], "x": 390, "y": 40, "wires": [ [ "f6836ec53245f207" ] ] }, { "id": "15a73af2f8ea690c", "type": "function", "z": "e44b1e7a8ef7ae1d", "name": "Invert", "func": "var daynight = msg.payload\n\nif (daynight === 1) {\n node.status({fill:\"yellow\",shape:\"dot\",text:\"Day\"});\n msg.payload = 0\n} else if (daynight === 0) {\n node.status({fill:\"blue\",shape:\"dot\",text:\"Night\"});\n msg.payload = 1\n}\n\nreturn msg;", "outputs": 1, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 255, "y": 40, "wires": [ [ "84d40e607426c66f" ] ], "l": false }, { "id": "cb5becd5a322ef50", "type": "mqtt out", "z": "e44b1e7a8ef7ae1d", "name": "MQTT Publish", "topic": "house/time/early_night_mode", "qos": "0", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 660, "y": 40, "wires": [] }, { "id": "f6836ec53245f207", "type": "function", "z": "e44b1e7a8ef7ae1d", "name": "Invert", "func": "var daynight = msg.payload\n\nif (daynight === 0) {\n node.status({fill:\"red\",shape:\"ring\",text:\"Off\"});\n msg.payload = \"off\"\n} else if (daynight === 1) {\n node.status({fill:\"green\",shape:\"dot\",text:\"On\"});\n msg.payload = \"on\"\n}\n\nreturn msg;", "outputs": 1, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 525, "y": 40, "wires": [ [ "cb5becd5a322ef50" ] ], "l": false }, { "id": "369e5f1ea8730d39", "type": "mqtt out", "z": "e44b1e7a8ef7ae1d", "name": "MQTT Publish", "topic": "house/time/night_mode", "qos": "1", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 400, "y": 780, "wires": [] }, { "id": "9d4ffc704e9ff81e", "type": "mqtt out", "z": "e44b1e7a8ef7ae1d", "name": "MQTT Publish", "topic": "house/time/give_me_darkness", "qos": "1", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 400, "y": 720, "wires": [] }, { "id": "14ea08ea216a10b6", "type": "server-state-changed", "z": "e44b1e7a8ef7ae1d", "name": "Night Mode", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_boolean.night_mode", "entityIdType": "exact", "outputInitially": true, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 130, "y": 780, "wires": [ [ "369e5f1ea8730d39" ] ] }, { "id": "e6fdd1843b17def1", "type": "server-state-changed", "z": "e44b1e7a8ef7ae1d", "name": "Give Me Darkness", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_boolean.give_me_darkness", "entityIdType": "exact", "outputInitially": true, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 150, "y": 720, "wires": [ [ "9d4ffc704e9ff81e" ] ] }, { "id": "a605e8b865992be7", "type": "function", "z": "e44b1e7a8ef7ae1d", "name": "Processing", "func": "let tomorrow = msg.tomorrow\nlet today = msg.today\nlet number = {}\nlet work_tomorrow = {}\n\nif (tomorrow > 0) {\n work_tomorrow = \"true\"\n if (today == 0) {\n number = 0\n } else {\n number = 1\n }\n} else {\n work_tomorrow = \"false\"\n number = 0\n}\n\nmsg.work_tomorrow = work_tomorrow\n\nif (number == 0) {\n node.status({fill:\"green\",shape:\"dot\",text:\"Number 0\"})\n return[msg,null]\n} else {\n node.status({fill:\"green\",shape:\"dot\",text:\"Number 1\"})\n return[null,msg]\n}", "outputs": 2, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 390, "y": 640, "wires": [ [ "798ff6ede18394ea" ], [ "469e44739d85f2c7" ] ], "outputLabels": [ "Number 0", "Number 1" ] }, { "id": "469e44739d85f2c7", "type": "ha-binary-sensor", "z": "e44b1e7a8ef7ae1d", "name": "Work Tomorrow", "entityConfig": "781adad6153d9661", "version": 0, "state": "work_tomorrow", "stateType": "msg", "attributes": [ { "property": "date", "value": "payload.1.date", "valueType": "msg" }, { "property": "eventStart", "value": "payload.1.eventStart", "valueType": "msg" }, { "property": "eventEnd", "value": "payload.1.eventEnd", "valueType": "msg" }, { "property": "summary", "value": "payload.1.summary", "valueType": "msg" }, { "property": "location", "value": "payload.1.location", "valueType": "msg" }, { "property": "isRecurring", "value": "payload.1.isRecurring", "valueType": "msg" }, { "property": "allDay", "value": "payload.1.allDay", "valueType": "msg" }, { "property": "calendarName", "value": "payload.1.calendarName", "valueType": "msg" }, { "property": "countdown", "value": "payload.1.countdown", "valueType": "msg" }, { "property": "start_timestamp", "value": "payload.1.uid.date", "valueType": "msg" } ], "inputOverride": "allow", "outputProperties": [], "x": 620, "y": 680, "wires": [ [] ] }, { "id": "c59fac053d848a65", "type": "api-call-service", "z": "e44b1e7a8ef7ae1d", "name": "Service Calls", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "", "service": "", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 590, "y": 220, "wires": [ [] ] }, { "id": "41df7a1ac03de337", "type": "api-call-service", "z": "e44b1e7a8ef7ae1d", "name": "Script Calls", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "", "service": "", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 590, "y": 280, "wires": [ [] ] }, { "id": "7cc1659362b85ba0", "type": "api-call-service", "z": "e44b1e7a8ef7ae1d", "name": "Notify Calls", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "", "service": "", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 590, "y": 160, "wires": [ [] ] }, { "id": "dd3f147b2583a136", "type": "delay", "z": "e44b1e7a8ef7ae1d", "name": "", "pauseType": "delay", "timeout": "1", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 245, "y": 180, "wires": [ [ "5ec63f0857df4164" ] ], "l": false }, { "id": "5ec63f0857df4164", "type": "function", "z": "e44b1e7a8ef7ae1d", "name": "Processing", "func": "//! FLOW VARIABLES DEFINED IN START TAB\n\n// Set Constants\n\nconst states = global.get('homeassistant.homeAssistant.states')\nconst holidayMode = states['input_boolean.holiday_mode'].state\nconst holidayHold = states['input_boolean.holiday_mode_hold'].state\nconst currentHoliday = states['input_select.holiday_animation'].state\nconst holiday = currentHoliday.toLowerCase()\nconst sunsetLights = states['input_boolean.sunset_lights_on'].state\nconst weather = states['weather.iron_nerd_weather_station'].state\nconst vacation = states['input_boolean.vacation_mode'].state\nconst upBathOcc = states['binary_sensor.upstairs_bathroom_occupied'].state\nconst deskLights = states['light.tina_desk_lights'].state\nconst adaptiveSleep = flow.get(\"adaptiveSleep\", \"diskCon\")\nconst selScenesMain = flow.get(\"selScenesMain\", \"diskCon\")\nconst selScenesTinaDesk = flow.get(\"selScenesTinaDesk\", \"diskCon\")\nconst booleanOff = flow.get(\"booleanOff\", \"diskCon\")\nconst payload = msg.payload\nnode.log(\"Time-based Automations: Constants Set\")\n\n// Set a few important variables\n\nlet time = {}\nlet topic = {}\nlet delay = {}\n\nif (payload == 0 || payload === 'weather') {\n time = \"night\"\n} else if (payload == 1) {\n time = \"day\"\n}\n\nif (msg.topic === 'timer-finished' || msg.topic === 'manual-trigger' || msg.topic === 'weather') {\n topic = msg.topic\n}\n\nif (topic === 'timer-finished' || topic === 'manual-trigger') {\n delay = 'off'\n} else if (topic === 'weather') {\n delay = 'off'\n} else if (weather === 'sunny' || weather === 'clear-night') {\n delay = 'on'\n} else {\n delay = 'off'\n}\nnode.log(\"Time-based Automations: Main variables defined\")\n\n// ---------- Configuration ----------\n// Decide which nighttime lighting to turn off at sunrise\nlet lightsOff = [\"light.hallway_overhead\"]\n\nif (holidayHold === 'off') {\n lightsOff.push(\"light.front_porch_light\")\n}\n\nif (upBathOcc === 'off') {\n lightsOff.push(\"light.upstairs_bathroom_lights\")\n}\n\n// Stairwell light strip settings\nlet stairKelvin = 2000\nlet stairBrt = {}\nlet stairEntity = [\"light.stairwell_led_strip\"]\nif (time === 'day') {\n stairBrt = 255\n} else if (time === 'night') {\n stairBrt = 150\n}\n\n// Sunset lights timer settings\nlet timerEntity = [\"timer.sunset_lighting_timer\"]\nlet timerDuration = \"00:30:00\"\n\n// Adaptive lighting switches to set\nlet switchAdaptive = []\nlet setAdaptive = {}\n\nif (time === 'day') {\n if (holidayHold === 'on'){\n switchAdaptive = flow.get(\"adaptiveDayHoliday\", \"diskCon\")\n } else {\n switchAdaptive = flow.get(\"adaptiveDay\", \"diskCon\")\n }\n setAdaptive = 'on'\n} else if (time === 'night') {\n switchAdaptive = flow.get(\"adaptiveNight\", \"diskCon\")\n if (holidayMode === 'on') {\n setAdaptive = 'off'\n } else {\n setAdaptive = 'on'\n }\n}\n\n// Notification settings\nlet notifyTitle = {}\nlet notifyMsg = {}\nlet sunsetStatus = {}\nif (sunsetLights === 'off') {\n notifyTitle = \"Sunset Lights SKIPPED\"\n notifyMsg = \"Lights not on due to nobody home, or toggle shutoff\"\n sunsetStatus = \"Skipped\"\n} else {\n notifyTitle = \"Sunset Lights On\"\n if (topic === 'weather') {\n notifyMsg = \"Lights on, delay cancelled due to weather change\"\n sunsetStatus = \"Weather Change\"\n } else if (topic === 'timer-finished') {\n notifyMsg = \"Lights on because timer was finished manually\"\n sunsetStatus = \"Manual Trigger\"\n } else if (delay === 'on') {\n notifyMsg = \"Lights on after delay due to clear weather\"\n sunsetStatus = \"Delayed\"\n } else if (delay === 'off') {\n notifyMsg = \"Lights on early due to cloudy weather\"\n sunsetStatus = \"Early\"\n }\n}\n\n// Holiday Settings\nlet setHoliday = {}\nlet switchHoliday = [\"switch.animated_scene_\" + holiday]\nif (holidayMode === 'on') {\n if (time === 'day') {\n setHoliday = 'off'\n } else if (time === 'night') {\n setHoliday = 'on'\n }\n}\n\nnode.log(\"Time-based Automations: Decision Logic Complete\")\n\n// ---------- Service Calls ----------\nlet sendLights = {\n \"payload\": {\n \"domain\": \"light\",\n \"service\": \"turn_off\",\n \"target\": {\n \"entity_id\": lightsOff\n },\n \"data\": {}\n }\n}\n\nlet sendStairwellScript = {\n \"payload\": {\n \"domain\": \"script\",\n \"service\": \"stairwell_led_strip\",\n \"data\": {\n \"color_temp_kelvin\": stairKelvin,\n \"brightness\": stairBrt\n }\n }\n}\n\nlet sendStairwellOff = {\n \"payload\": {\n \"domain\": \"light\",\n \"service\": \"turn_off\",\n \"target\": {\n \"entity_id\": stairEntity\n },\n \"data\": {}\n }\n}\n\nlet sendSleepOff = {\n \"payload\": {\n \"domain\": \"switch\",\n \"service\": \"turn_off\",\n \"target\": {\n \"entity_id\": adaptiveSleep\n },\n \"data\": {}\n }\n}\n\nlet sendBooleanOff = {\n \"payload\": {\n \"domain\": \"input_boolean\",\n \"service\": \"turn_off\",\n \"target\": {\n \"entity_id\": booleanOff\n },\n \"data\": {}\n }\n}\n\nlet sendAdaptive = {\n \"payload\": {\n \"domain\": \"switch\",\n \"service\": \"turn_\" + setAdaptive,\n \"target\": {\n \"entity_id\": switchAdaptive\n },\n \"data\": {}\n }\n}\n\nlet sendSceneResetMain = {\n \"payload\": {\n \"domain\": \"input_text\",\n \"service\": \"set_value\",\n \"target\": {\n \"entity_id\": selScenesMain\n },\n \"data\": {\n \"value\": \"Adaptive\"\n }\n }\n}\n\nlet sendSceneResetDesk = {\n \"payload\": {\n \"domain\": \"input_text\",\n \"service\": \"set_value\",\n \"target\": {\n \"entity_id\": selScenesTinaDesk\n },\n \"data\": {\n \"value\": \"Day Mode\"\n }\n }\n}\n\nlet sendHoliday = {\n \"payload\": {\n \"domain\": \"switch\",\n \"service\": \"turn_\" + setHoliday,\n \"target\": {\n \"entity_id\": switchHoliday\n },\n \"data\": {}\n }\n}\n\nlet sendTimer = {\n \"payload\": {\n \"domain\": \"timer\",\n \"service\": \"start\",\n \"target\": {\n \"entity_id\": timerEntity\n },\n \"data\": {\n \"duration\": timerDuration\n }\n }\n}\n\nlet sendTimerCancel = {\n \"payload\": {\n \"domain\": \"timer\",\n \"service\": \"cancel\",\n \"target\": {\n \"entity_id\": timerEntity\n },\n \"data\": {}\n }\n}\n\nlet sendNotifyPhone = {\n \"payload\": {\n \"domain\": \"script\",\n \"service\": \"text_notify\",\n \"data\": {\n \"who\": \"all\",\n \"title\": notifyTitle,\n \"message\": notifyMsg,\n \"type\": \"normal\",\n \"tag\": \"sunset-lights\"\n }\n }\n}\n\nlet sendNotifyTV = {\n \"payload\": {\n \"domain\": \"script\",\n \"service\": \"tv_notify\",\n \"data\": {\n \"who\": \"all\",\n \"title\": notifyTitle,\n \"message\": notifyMsg,\n \"data\": {\n \"fontsize\": \"large\",\n \"duration\": 3,\n \"transparency\": \"25%\"\n }\n }\n }\n}\n\nlet sendFirstFloorScene = {\n \"payload\": {\n \"domain\": \"script\",\n \"service\": \"evening_on_first_floor\",\n \"data\": {\n \"sunset_lights\": 1\n }\n }\n}\n\nlet sendSecondFloorScene = {\n \"payload\": {\n \"domain\": \"script\",\n \"service\": \"evening_on_second_floor\",\n \"data\": {\n \"sunset_lights\": 1\n }\n }\n}\n\nlet sendDeskScene = {\n \"payload\": {\n \"domain\": \"input_select\",\n \"service\": \"select_option\",\n \"target\": {\n \"entity_id\": [\"input_select.tina_desk_scenes\"]\n },\n \"data\": {\n \"option\": \"Reset\"\n }\n }\n}\n\nnode.log(\"Time-based Automations: Message Payloads Defined\")\n\nnode.log(\"----- Time-based Automations: Set Parameters\")\nnode.log(\"time: \" + time)\nnode.log(\"topic: \" + topic)\nnode.log(\"lightsOff: \" + lightsOff)\nnode.log(\"stairKelvin: \" + stairKelvin)\nnode.log(\"stairBrt: \" + stairBrt)\nnode.log(\"holidayMode: \" + holidayMode)\nif (time === 'night') {\n node.log(\"weather: \" + weather)\n node.log(\"delay: \" + delay)\n node.log(\"sunsetStatus: \" + sunsetStatus)\n}\nif (holidayMode === 'on') {\n node.log(\"switchHoliday: \" + switchHoliday)\n node.log(\"holiday: \" + holiday)\n node.log(\"holidayHold: \" + holidayHold)\n node.log(\"switchHoliday: \" + switchHoliday)\n}\nnode.log(\"----- Time-based Automations: End Parameters -----\")\n\nif (vacation === 'off') {\n if (time === \"day\") {\n node.status({fill:\"green\",shape:\"dot\",text:\"Sunrise Flow\"})\n node.send([null,[sendLights,sendBooleanOff],sendStairwellScript])\n setTimeout(() => {\n node.send([null,[sendStairwellOff,sendSleepOff,sendAdaptive,sendSceneResetMain,sendSceneResetDesk],null])\n if (holidayMode === 'on' && holidayHold === 'off') {\n node.send([null,[sendHoliday],null])\n }\n }, 5000)\n } else if (time === \"night\") {\n node.status({fill:\"green\",shape:\"dot\",text:\"Sunset Flow\"})\n node.send([null,sendAdaptive,null])\n if (holidayMode === 'on') {\n setTimeout(() => {\n node.send([null,sendHoliday,null])\n }, 1000)\n }\n if (delay === 'on') {\n node.send([null,sendTimer,null])\n } else {\n if (topic === 'weather') {\n node.send([null,sendTimerCancel,null])\n }\n node.send([null,null,[sendFirstFloorScene,sendSecondFloorScene]])\n if (deskLights === 'on') {\n node.send([null,sendDeskScene,null])\n }\n if (topic != 'manual-trigger') {\n node.send([[sendNotifyPhone,sendNotifyTV],null,null])\n }\n }\n }\n}\nnode.log(\"Time-based Automations: Processing Complete\")", "outputs": 3, "timeout": 0, "noerr": 0, "initialize": "//! ---------- DAY MODE ----------\n// Lists of adaptive lighting switches for different scenarios\nconst adaptiveDay = [\n \"switch.adaptive_lighting_basement_studio\",\n \"switch.adaptive_lighting_dining_room_lamp\",\n \"switch.adaptive_lighting_downstairs_bathroom\",\n \"switch.adaptive_lighting_emma_bedroom\",\n \"switch.adaptive_lighting_kallen_bedroom\",\n \"switch.adaptive_lighting_living_room\",\n \"switch.adaptive_lighting_master_bedroom\",\n \"switch.adaptive_lighting_mud_room\",\n \"switch.adaptive_lighting_tina_lamp\",\n \"switch.adaptive_lighting_upstairs_bathroom\",\n \"switch.adaptive_lighting_upstairs_hallway\",\n \"switch.adaptive_lighting_front_porch\"\n]\n\nconst adaptiveDayHoliday = [\n \"switch.adaptive_lighting_basement_studio\",\n \"switch.adaptive_lighting_dining_room_lamp\",\n \"switch.adaptive_lighting_downstairs_bathroom\",\n \"switch.adaptive_lighting_emma_bedroom\",\n \"switch.adaptive_lighting_kallen_bedroom\",\n \"switch.adaptive_lighting_living_room\",\n \"switch.adaptive_lighting_master_bedroom\",\n \"switch.adaptive_lighting_mud_room\",\n \"switch.adaptive_lighting_tina_lamp\",\n \"switch.adaptive_lighting_upstairs_bathroom\",\n \"switch.adaptive_lighting_upstairs_hallway\",\n]\n\n// List of adaptive lighting sleep mode switches to turn off\nconst adaptiveSleep = [\n \"switch.adaptive_lighting_sleep_mode_basement_studio\",\n \"switch.adaptive_lighting_sleep_mode_dining_room_lamp\",\n \"switch.adaptive_lighting_sleep_mode_downstairs_bathroom\",\n \"switch.adaptive_lighting_sleep_mode_emma_bedroom\",\n \"switch.adaptive_lighting_sleep_mode_kallen_bedroom\",\n \"switch.adaptive_lighting_sleep_mode_living_room\",\n \"switch.adaptive_lighting_sleep_mode_master_bedroom\",\n \"switch.adaptive_lighting_sleep_mode_mud_room\",\n \"switch.adaptive_lighting_sleep_mode_tina_lamp\",\n \"switch.adaptive_lighting_sleep_mode_upstairs_bathroom\",\n \"switch.adaptive_lighting_sleep_mode_upstairs_hallway\"\n]\n\n// List of selected scene input texts to reset to Adaptive\nconst selScenesMain = [\n \"input_text.basement_studio_selected_scene\",\n \"input_text.dining_room_lamp_selected_scene\",\n \"input_text.downstairs_bathroom_selected_scene\",\n \"input_text.emma_bedroom_selected_scene\",\n \"input_text.front_porch_selected_scene\",\n \"input_text.kallen_bedroom_selected_scene\",\n \"input_text.living_room_selected_scene\",\n \"input_text.master_bedroom_selected_scene\",\n \"input_text.mud_room_selected_scene\",\n \"input_text.tina_lamp_selected_scene\",\n \"input_text.upstairs_bathroom_selected_scene\",\n \"input_text.upstairs_hallway_selected_scene\"\n]\n\n// Tina's desk reset\nconst selScenesTinaDesk = [\"input_text.tina_desk_selected_scene\"]\n\n// List of booleans to turn off\nconst booleanOff = [\n \"input_boolean.give_me_darkness\",\n \"input_boolean.goodnight\",\n \"input_boolean.kallen_computer_updates\",\n \"input_boolean.night_mode\"\n]\n\n//! ---------- NIGHT MODE ----------\n// Booleans to turn on at night\nconst adaptiveNight = [\n \"switch.adaptive_lighting_front_porch\"\n]\n\n\nflow.set(\"adaptiveDay\", adaptiveDay, \"diskCon\")\nflow.set(\"adaptiveDayHoliday\", adaptiveDayHoliday, \"diskCon\")\nflow.set(\"adaptiveNight\", adaptiveNight, \"diskCon\")\nflow.set(\"adaptiveSleep\", adaptiveSleep, \"diskCon\")\nflow.set(\"selScenesMain\", selScenesMain, \"diskCon\")\nflow.set(\"selScenesTinaDesk\", selScenesTinaDesk, \"diskCon\")\nflow.set(\"booleanOff\", booleanOff, \"diskCon\")", "finalize": "", "libs": [], "x": 390, "y": 180, "wires": [ [ "7cc1659362b85ba0" ], [ "c59fac053d848a65" ], [ "41df7a1ac03de337" ] ], "outputLabels": [ "Notify", "Services", "Scripts" ], "icon": "node-red-node-suncalc/sun.png" }, { "id": "4b76bbe58ee8175e", "type": "server-state-changed", "z": "e44b1e7a8ef7ae1d", "name": "Weather Change", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "weather.iron_nerd_weather_station", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "sunny, clear-night", "ifStateType": "str", "ifStateOperator": "does_not_include", "outputOnlyOnStateChange": true, "for": "3", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "weather", "valueType": "str" } ], "x": 120, "y": 360, "wires": [ [ "d8e3c9bf4f26f31f" ], [] ] }, { "id": "d8e3c9bf4f26f31f", "type": "api-current-state", "z": "e44b1e7a8ef7ae1d", "name": "Timer Running?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "running", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "timer.sunset_lighting_timer", "state_type": "str", "blockInputOverrides": false, "outputProperties": [], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 255, "y": 360, "wires": [ [ "5ec63f0857df4164" ], [] ], "outputLabels": [ "Running", "Idle" ], "l": false }, { "id": "134433d6e21dab5b", "type": "server-state-changed", "z": "3abb5ae57afb4761", "name": "Tony Presence", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "person.tony_stork", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "home", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": true, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "", "valueType": "triggerId" }, { "property": "detect", "propertyType": "msg", "value": "presence", "valueType": "str" } ], "x": 180, "y": 120, "wires": [ [ "77857e77d43a9d2e", "7169f007c32ccc46", "e6bdfba61c73d081", "77bb530373808a86" ], [ "379edcf9fe985ebe" ] ], "outputLabels": [ "home", "away" ] }, { "id": "77857e77d43a9d2e", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Enable Texts (Tony)", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.text_notify_tony" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 410, "y": 100, "wires": [ [ "8c7c1cd31a824cd5" ] ] }, { "id": "379edcf9fe985ebe", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Disable Texts (Tony)", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.text_notify_tony" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 420, "y": 280, "wires": [ [ "24a89088d5503778" ] ] }, { "id": "49dbd6d6cba1b010", "type": "server-state-changed", "z": "3abb5ae57afb4761", "name": "Tina Presence", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "person.christina_stork", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "home", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": true, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "", "valueType": "triggerId" }, { "property": "detect", "propertyType": "msg", "value": "presence", "valueType": "str" }, { "property": "tinawork", "propertyType": "msg", "value": "tinawork", "valueType": "global" } ], "x": 170, "y": 420, "wires": [ [ "a0c7649e26e66ddb", "35d7371023527600", "edaa6ff605ba6fa7", "77bb530373808a86", "9d03fda88310da78" ], [ "898659d514aa58fd" ] ], "outputLabels": [ "home", "away" ] }, { "id": "a0c7649e26e66ddb", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Enable Texts (Tina)", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.text_notify_tina" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 410, "y": 400, "wires": [ [ "2851173db6835eda" ] ] }, { "id": "898659d514aa58fd", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Disable Texts (Tina)", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.text_notify_tina" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 410, "y": 580, "wires": [ [ "82c0fb65066f3b67" ] ] }, { "id": "cd4d8dd6b1d34f49", "type": "server-state-changed", "z": "3abb5ae57afb4761", "name": "Kallen Presence", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "person.kallen_stork", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "home", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": true, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "", "valueType": "triggerId" }, { "property": "detect", "propertyType": "msg", "value": "presence", "valueType": "str" } ], "x": 180, "y": 720, "wires": [ [ "5193627a30d1b32d", "77bb530373808a86", "8a450e797b413418" ], [ "8584a491587be9a2" ] ], "outputLabels": [ "home", "away" ] }, { "id": "5193627a30d1b32d", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Enable Texts (Kallen)", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.text_notify_kallen" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 420, "y": 700, "wires": [ [ "8e081e76e5f19ead" ] ] }, { "id": "fb1afc4c2078ca29", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Disable Texts (Kallen)", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.text_notify_kallen" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 640, "y": 760, "wires": [ [ "156d50efeaeb681c" ] ] }, { "id": "35d7371023527600", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Notify Tony", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "text_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"type\":\"normal\",\t \"who\":\"tony\",\t \"title\": \"New Arrival\",\t \"message\": \"Tina has arrived at home!\",\t \"sound\":\"US-EN-Morgan-Freeman-Wife-Is-Arriving.wav\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 390, "y": 520, "wires": [ [ "bcdf2e5f1249631d" ] ] }, { "id": "9ae7e308f889137d", "type": "wake on lan", "z": "3abb5ae57afb4761", "mac": "B4:2E:99:A8:CF:88", "host": "192.168.1.255", "udpport": 9, "numpackets": 3, "interval": 100, "name": "Boot Tina's Computer", "x": 900, "y": 360, "wires": [] }, { "id": "edaa6ff605ba6fa7", "type": "change", "z": "3abb5ae57afb4761", "name": "Formatting", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "Christina has arrived at home!", "tot": "str" }, { "t": "set", "p": "topic", "pt": "msg", "to": "New Arrival!", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 335, "y": 460, "wires": [ [ "10228956c46b8d7a" ] ], "l": false }, { "id": "e6bdfba61c73d081", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Notify Tina", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "text_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "\t{\t \"type\":\"normal\",\t \"who\":\"tina\",\t \"title\": \"New Arrival\",\t \"message\": \"Tony has arrived at home!\",\t \"sound\":\"US-EN-Alexa-Husband-Is-Arriving.wav\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 390, "y": 220, "wires": [ [ "41aa4436b55474b2" ] ] }, { "id": "7169f007c32ccc46", "type": "change", "z": "3abb5ae57afb4761", "name": "Formatting", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "Tony has arrived at home!", "tot": "str" }, { "t": "set", "p": "topic", "pt": "msg", "to": "New Arrival!", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 335, "y": 160, "wires": [ [ "0a039e097233b977" ] ], "l": false }, { "id": "41aa4436b55474b2", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Notify Kallen", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "text_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"type\":\"normal\",\t \"who\":\"kallen\",\t \"title\": \"New Arrival\",\t \"message\": \"Tony has arrived at home!\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 590, "y": 200, "wires": [ [] ] }, { "id": "bcdf2e5f1249631d", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Notify Kallen", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "text_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"type\":\"normal\",\t \"who\":\"kallen\",\t \"title\": \"New Arrival\",\t \"message\": \"Christina has arrived at home!\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 590, "y": 500, "wires": [ [] ] }, { "id": "7992545819db1a42", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Notify Tony", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "text_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"who\":\"tony\",\t \"title\": \"Hey Dummy\",\t \"message\": \"Your presence flow is a failure and you should be ashamed.\",\t \"data\": {\t \"url\": \"/lovelace/mobile-devices\"\t }\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 870, "y": 420, "wires": [ [] ] }, { "id": "26f15fc8d75a4020", "type": "link out", "z": "3abb5ae57afb4761", "name": "Presence Detection Output", "mode": "link", "links": [ "f34816b23181f21e" ], "x": 985, "y": 40, "wires": [] }, { "id": "6a1cecedd6ef4b44", "type": "link in", "z": "3abb5ae57afb4761", "name": "Cleanup - Presence", "links": [ "619d1474239faf58" ], "x": 195, "y": 40, "wires": [ [ "bf504c30194524b9", "ec497068c3a61d02", "43048b96595e3e97", "df53af0726555079", "802ff36b76e55809", "1ac137ebc9f53e3c" ] ] }, { "id": "bf504c30194524b9", "type": "api-current-state", "z": "3abb5ae57afb4761", "name": "Tony Presence?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "home", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "person.tony_stork", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 180, "y": 180, "wires": [ [ "77857e77d43a9d2e" ], [ "379edcf9fe985ebe" ] ], "outputLabels": [ "home", "away" ] }, { "id": "ec497068c3a61d02", "type": "api-current-state", "z": "3abb5ae57afb4761", "name": "Tina Presence?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "home", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "person.christina_stork", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 180, "y": 480, "wires": [ [ "a0c7649e26e66ddb" ], [ "898659d514aa58fd" ] ], "outputLabels": [ "home", "away" ] }, { "id": "43048b96595e3e97", "type": "api-current-state", "z": "3abb5ae57afb4761", "name": "Kallen Presence?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "home", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "person.kallen_stork", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 190, "y": 780, "wires": [ [ "5193627a30d1b32d" ], [ "8584a491587be9a2" ] ], "outputLabels": [ "home", "away" ] }, { "id": "0a039e097233b977", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "TV Notifications", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "tv_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"who\":\"all\",\t \"title\": msg.topic,\t \"message\": msg.payload,\t \"data\": {\t \"fontsize\": \"large\",\t \"duration\": 3,\t \"transparency\": \"25%\",\t \"color\": \"green\"\t }\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 600, "y": 160, "wires": [ [] ] }, { "id": "10228956c46b8d7a", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "TV Notifications", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "tv_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"who\":\"all\",\t \"title\": msg.topic,\t \"message\": msg.payload,\t \"data\": {\t \"fontsize\": \"large\",\t \"duration\": 3,\t \"transparency\": \"25%\",\t \"color\": \"green\"\t }\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 600, "y": 460, "wires": [ [] ] }, { "id": "77bb530373808a86", "type": "change", "z": "3abb5ae57afb4761", "name": "Formatting", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "on", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 335, "y": 40, "wires": [ [ "26f15fc8d75a4020" ] ], "l": false }, { "id": "47aa56df01f697fc", "type": "server-state-changed", "z": "3abb5ae57afb4761", "name": "Front Door Open", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "binary_sensor.front_door", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "on", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "detect", "propertyType": "msg", "value": "door", "valueType": "str" }, { "property": "whichdoor", "propertyType": "msg", "value": "front", "valueType": "str" } ], "x": 840, "y": 60, "wires": [ [ "26f15fc8d75a4020", "5f8b61ddc9963e99", "025e65a78727f99e" ], [ "26f15fc8d75a4020" ] ], "outputLabels": [ "Open", "" ] }, { "id": "c46dfcaa9a2798f0", "type": "server-state-changed", "z": "3abb5ae57afb4761", "name": "Doorbell", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "binary_sensor.front_doorbell_ding_mqtt", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "detect", "propertyType": "msg", "value": "doorbell", "valueType": "str" } ], "x": 860, "y": 240, "wires": [ [ "26f15fc8d75a4020", "025e65a78727f99e" ] ] }, { "id": "05547a934bbcab4d", "type": "server-state-changed", "z": "3abb5ae57afb4761", "name": "Motion Detected", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "binary_sensor.front_doorbell_motion_mqtt", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "detect", "propertyType": "msg", "value": "motion", "valueType": "str" } ], "x": 840, "y": 180, "wires": [ [ "26f15fc8d75a4020", "025e65a78727f99e" ] ], "outputLabels": [ "On" ] }, { "id": "ff44de8d65439a5f", "type": "server-state-changed", "z": "3abb5ae57afb4761", "name": "Back Door Open", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "binary_sensor.back_door", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "on", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "detect", "propertyType": "msg", "value": "door", "valueType": "str" }, { "property": "whichdoor", "propertyType": "msg", "value": "back", "valueType": "str" } ], "x": 840, "y": 120, "wires": [ [ "5f8b61ddc9963e99" ], [] ], "outputLabels": [ "Open", "" ] }, { "id": "5f8b61ddc9963e99", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "+1", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "counter", "service": "increment", "areaId": [], "deviceId": [], "entityId": [ "counter.{{whichdoor}}_door_opened_today" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1330, "y": 140, "wires": [ [] ] }, { "id": "8a22032494f84cae", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Lights Handler", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.tina_desk_lights" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 880, "y": 300, "wires": [ [ "7fbab2c7cb7ecc92" ] ] }, { "id": "0ba46659c49cf39a", "type": "mqtt out", "z": "3abb5ae57afb4761", "name": "MQTT Last Trigger", "topic": "house/presence/outdoor/last_trigger", "qos": "2", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 1290, "y": 80, "wires": [] }, { "id": "025e65a78727f99e", "type": "change", "z": "3abb5ae57afb4761", "name": "Set Payload", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "detect", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1090, "y": 80, "wires": [ [ "0ba46659c49cf39a" ] ] }, { "id": "028e16d90ac7433d", "type": "server-state-changed", "z": "3abb5ae57afb4761", "name": "Family Presence", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "binary_sensor.family_home", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "on", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": true, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "", "valueType": "triggerId" }, { "property": "detect", "propertyType": "msg", "value": "presence", "valueType": "str" } ], "x": 180, "y": 1080, "wires": [ [ "d5a9248680297b56" ], [ "b8ef333da370f91e" ] ], "outputLabels": [ "home", "not_home" ] }, { "id": "d5a9248680297b56", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Enable Texts (All)", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.text_notify_all" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 450, "y": 1080, "wires": [ [ "66b7ec9a7e332cca" ] ] }, { "id": "b8ef333da370f91e", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Disable Texts (All)", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.text_notify_all" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 450, "y": 1140, "wires": [ [ "bebba6e7a61461b8" ] ] }, { "id": "351ac66c934832eb", "type": "server-state-changed", "z": "3abb5ae57afb4761", "name": "Parents Presence", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "binary_sensor.parents_home", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "on", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": true, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "", "valueType": "triggerId" }, { "property": "detect", "propertyType": "msg", "value": "presence", "valueType": "str" } ], "x": 190, "y": 840, "wires": [ [ "331ed2d217025fd1" ], [ "0eaa398b977e03b5" ] ] }, { "id": "df53af0726555079", "type": "api-current-state", "z": "3abb5ae57afb4761", "name": "Parents Presence?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "binary_sensor.parents_home", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 190, "y": 900, "wires": [ [ "331ed2d217025fd1" ], [ "0eaa398b977e03b5" ] ] }, { "id": "331ed2d217025fd1", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Enable Texts (Parents)", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.text_notify_parents" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 460, "y": 840, "wires": [ [ "63dc161e193d33c5" ] ] }, { "id": "0eaa398b977e03b5", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Disable Texts (Parents)", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.text_notify_parents" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 470, "y": 900, "wires": [ [ "84a56bf51e79fd4d" ] ] }, { "id": "663b5401ea953d2d", "type": "server-state-changed", "z": "3abb5ae57afb4761", "name": "Nerds Presence", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "binary_sensor.nerds_home", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "on", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": true, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "", "valueType": "triggerId" }, { "property": "detect", "propertyType": "msg", "value": "presence", "valueType": "str" } ], "x": 180, "y": 960, "wires": [ [ "a999c33047fc3b61" ], [ "84a2692b31e7d7d8" ] ] }, { "id": "802ff36b76e55809", "type": "api-current-state", "z": "3abb5ae57afb4761", "name": "Nerds Presence?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "binary_sensor.nerds_home", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 190, "y": 1020, "wires": [ [ "a999c33047fc3b61" ], [ "84a2692b31e7d7d8" ] ] }, { "id": "a999c33047fc3b61", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Enable Texts (Nerds)", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.text_notify_nerds" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 460, "y": 960, "wires": [ [ "bf5f6c5af1c02315" ] ] }, { "id": "84a2692b31e7d7d8", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Disable Texts (Nerds)", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.text_notify_nerds" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 460, "y": 1020, "wires": [ [ "dafcce5a61b19f8b" ] ] }, { "id": "1ac137ebc9f53e3c", "type": "api-current-state", "z": "3abb5ae57afb4761", "name": "Family Presence?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "binary_sensor.family_home", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 190, "y": 1140, "wires": [ [ "d5a9248680297b56" ], [ "b8ef333da370f91e" ] ] }, { "id": "788f7cfdfa2fdef9", "type": "server-state-changed", "z": "3abb5ae57afb4761", "name": "Basement Door", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "binary_sensor.basement_studio_door", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "on", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "detect", "propertyType": "msg", "value": "door", "valueType": "str" }, { "property": "whichdoor", "propertyType": "msg", "value": "basement_studio", "valueType": "str" } ], "x": 1060, "y": 160, "wires": [ [ "5f8b61ddc9963e99" ], [] ], "outputLabels": [ "Open", "" ] }, { "id": "8c7c1cd31a824cd5", "type": "mqtt out", "z": "3abb5ae57afb4761", "name": "MQTT Publish", "topic": "house/presence/people/tony", "qos": "2", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 620, "y": 100, "wires": [] }, { "id": "24a89088d5503778", "type": "mqtt out", "z": "3abb5ae57afb4761", "name": "MQTT Publish", "topic": "house/presence/people/tony", "qos": "2", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 620, "y": 280, "wires": [] }, { "id": "2851173db6835eda", "type": "mqtt out", "z": "3abb5ae57afb4761", "name": "MQTT Publish", "topic": "house/presence/people/tina", "qos": "2", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 600, "y": 400, "wires": [] }, { "id": "82c0fb65066f3b67", "type": "mqtt out", "z": "3abb5ae57afb4761", "name": "MQTT Publish", "topic": "house/presence/people/tina", "qos": "2", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 600, "y": 580, "wires": [] }, { "id": "8e081e76e5f19ead", "type": "mqtt out", "z": "3abb5ae57afb4761", "name": "MQTT Publish", "topic": "house/presence/people/kallen", "qos": "2", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 620, "y": 700, "wires": [] }, { "id": "156d50efeaeb681c", "type": "mqtt out", "z": "3abb5ae57afb4761", "name": "MQTT Publish", "topic": "house/presence/people/kallen", "qos": "2", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 840, "y": 760, "wires": [] }, { "id": "63dc161e193d33c5", "type": "mqtt out", "z": "3abb5ae57afb4761", "name": "MQTT Publish", "topic": "house/presence/people/groups/parents", "qos": "2", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 680, "y": 840, "wires": [] }, { "id": "84a56bf51e79fd4d", "type": "mqtt out", "z": "3abb5ae57afb4761", "name": "MQTT Publish", "topic": "house/presence/people/groups/parents", "qos": "2", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 680, "y": 900, "wires": [] }, { "id": "bf5f6c5af1c02315", "type": "mqtt out", "z": "3abb5ae57afb4761", "name": "MQTT Publish", "topic": "house/presence/people/groups/nerds", "qos": "2", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 680, "y": 960, "wires": [] }, { "id": "dafcce5a61b19f8b", "type": "mqtt out", "z": "3abb5ae57afb4761", "name": "MQTT Publish", "topic": "house/presence/people/groups/nerds", "qos": "2", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 680, "y": 1020, "wires": [] }, { "id": "66b7ec9a7e332cca", "type": "mqtt out", "z": "3abb5ae57afb4761", "name": "MQTT Publish", "topic": "house/presence/people/groups/family", "qos": "2", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 680, "y": 1080, "wires": [] }, { "id": "bebba6e7a61461b8", "type": "mqtt out", "z": "3abb5ae57afb4761", "name": "MQTT Publish", "topic": "house/presence/people/groups/family", "qos": "2", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 680, "y": 1140, "wires": [] }, { "id": "8a450e797b413418", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Notify Parents", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "text_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"type\":\"normal\",\t \"who\":\"parents\",\t \"title\": \"New Arrival\",\t \"message\": \"Kallen has arrived at home!\",\t \"sound\":\"US-EN-Morgan-Freeman-Son-Is-Arriving.wav\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 400, "y": 640, "wires": [ [] ] }, { "id": "7fbab2c7cb7ecc92", "type": "api-current-state", "z": "3abb5ae57afb4761", "name": "Give Me Darkness?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "input_boolean.give_me_darkness", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "givemedarkness", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 1005, "y": 300, "wires": [ [ "5e72a180d8f0232d" ], [] ], "l": false }, { "id": "5e72a180d8f0232d", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Living Room Lights", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "light.living_room_lights" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1150, "y": 300, "wires": [ [] ] }, { "id": "8584a491587be9a2", "type": "api-call-service", "z": "3abb5ae57afb4761", "name": "Bedroom Lights Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "light.kallen_bedroom_lights" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 410, "y": 760, "wires": [ [ "fb1afc4c2078ca29" ] ] }, { "id": "9d03fda88310da78", "type": "function", "z": "3abb5ae57afb4761", "name": "Processing", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar workEndZone = states['binary_sensor.tina_work_end_zone'].state\nvar tinawork = msg.tinawork\n\nif (tinawork === 'on' && workEndZone === 'on') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Activated\"});\n return[msg,null]\n} else if (tinawork === 'off') {\n node.status({fill:\"yellow\",shape:\"dot\",text:\"No Work Today\"});\n return null\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"We fucked up\"});\n return[null,msg]\n}", "outputs": 2, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 390, "y": 340, "wires": [ [ "8a22032494f84cae", "9ae7e308f889137d" ], [ "7992545819db1a42" ] ], "outputLabels": [ "Activated", "We fucked up" ], "icon": "node-red-contrib-cpu/cpu.png" }, { "id": "d95d9964546768a5", "type": "server-state-changed", "z": "eff21041cc941fef", "name": "Downstairs Bathroom Scenes", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_select.downstairs_bathroom_scenes", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "downstairs_bathroom", "valueType": "str" } ], "x": 140, "y": 100, "wires": [ [ "d790134891fedfcc" ] ] }, { "id": "bdab41af28f2c7cd", "type": "server-state-changed", "z": "eff21041cc941fef", "name": "Living Room Scenes", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_select.living_room_scenes", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "living_room", "valueType": "str" } ], "x": 110, "y": 40, "wires": [ [ "85e820743550308b" ] ] }, { "id": "7c224927d50a5f97", "type": "server-state-changed", "z": "eff21041cc941fef", "name": "Mud Room Scenes", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_select.mud_room_scenes", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "mud_room", "valueType": "str" } ], "x": 110, "y": 160, "wires": [ [ "d790134891fedfcc" ] ] }, { "id": "e689231430e9c829", "type": "server-state-changed", "z": "eff21041cc941fef", "name": "Tina Lamp Scenes", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_select.tina_lamp_scenes", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "tina_lamp", "valueType": "str" } ], "x": 110, "y": 220, "wires": [ [ "d790134891fedfcc" ] ] }, { "id": "5123a607588fa737", "type": "api-call-service", "z": "eff21041cc941fef", "g": "8aee4d340a136bac", "name": "Turn off light", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "light.downstairs_bathroom_lights" ], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "output_location": "", "output_location_type": "none", "x": 550, "y": 920, "wires": [ [] ] }, { "id": "d790134891fedfcc", "type": "subflow:a4ee891237e460a2", "z": "eff21041cc941fef", "name": "Main Scenes Handler", "x": 580, "y": 40, "wires": [] }, { "id": "b4751d926780b644", "type": "server-state-changed", "z": "eff21041cc941fef", "name": "Dining Room Scenes", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_select.dining_room_lamp_scenes", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "dining_room_lamp", "valueType": "str" } ], "x": 120, "y": 280, "wires": [ [ "d790134891fedfcc" ] ] }, { "id": "74f9d2bf4a8c0b53", "type": "server-state-changed", "z": "eff21041cc941fef", "name": "Back Door Open", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "binary_sensor.back_door", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "on", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "detect", "propertyType": "msg", "value": "door", "valueType": "str" } ], "x": 140, "y": 1020, "wires": [ [ "f0ef9a565f72dcae" ], [] ] }, { "id": "5e7a082800eeb73c", "type": "api-call-service", "z": "eff21041cc941fef", "name": "Mud Room Lights", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_on", "areaId": [ "mud_room" ], "deviceId": [], "entityId": [], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 570, "y": 1020, "wires": [ [] ] }, { "id": "f0ef9a565f72dcae", "type": "api-current-state", "z": "eff21041cc941fef", "name": "Early Night Mode", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "binary_sensor.early_night_mode", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 350, "y": 1020, "wires": [ [ "5e7a082800eeb73c" ], [] ] }, { "id": "5a81041c4a1390b8", "type": "server-state-changed", "z": "eff21041cc941fef", "name": "Tina Desk Scenes", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_select.tina_desk_scenes", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "tina_desk", "valueType": "str" }, { "property": "include", "propertyType": "msg", "value": "dining_room", "valueType": "str" } ], "x": 110, "y": 340, "wires": [ [ "b19f4a996fd4c2ee" ] ] }, { "id": "b19f4a996fd4c2ee", "type": "subflow:85c4f81ca9628aea", "z": "eff21041cc941fef", "name": "", "x": 590, "y": 340, "wires": [] }, { "id": "f84e6b5157e857cf", "type": "function", "z": "eff21041cc941fef", "g": "8aee4d340a136bac", "name": "Delay", "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst lights = states['light.downstairs_bathroom_lights'].state\nconst duration = states['input_number.downstairs_bathroom_lights_off_delay'].state\nconst lux = states['sensor.downstairs_bathroom_illuminance'].state\nconst threshold = states['input_number.downstairs_bathroom_lux_threshold'].state\nconst payload = msg.payload\nconst newDuration = duration * 60\n\nif (payload === 'on') {\n if (lux <= threshold || lights === 'on') {\n node.status({fill:'green',shape:'dot',text:'Lights On'})\n node.send([msg,null])\n } else {\n node.status({fill:'red',shape:'ring',text:'Too bright'})\n }\n} else if (payload === 'off') {\n if (lights === 'on') {\n msg.duration = newDuration\n node.status({fill:\"green\",shape:\"dot\",text:parseInt(duration) + ' minutes'})\n node.send([null,msg])\n } else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Lights already off\"})\n }\n}", "outputs": 2, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 290, "y": 860, "wires": [ [ "b281061a4b08d2eb" ], [ "b7d94cd0e420c650" ] ], "icon": "node-red/timer.svg" }, { "id": "b7d94cd0e420c650", "type": "api-call-service", "z": "eff21041cc941fef", "g": "8aee4d340a136bac", "name": "Start Timer", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "timer", "service": "start", "areaId": [], "deviceId": [], "entityId": [ "timer.downstairs_bathroom_lights_timer" ], "data": "{ \t \"duration\": duration\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 550, "y": 860, "wires": [ [] ] }, { "id": "41a8d5ef20cf55d7", "type": "api-call-service", "z": "eff21041cc941fef", "g": "8aee4d340a136bac", "name": "Cancel Timer", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "timer", "service": "cancel", "areaId": [], "deviceId": [], "entityId": [ "timer.downstairs_bathroom_lights_timer" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 730, "y": 800, "wires": [ [] ] }, { "id": "3e40025ac99ec712", "type": "server-events", "z": "eff21041cc941fef", "g": "8aee4d340a136bac", "name": "Timer Finished", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "", "eventType": "timer.finished", "eventData": "{\"entity_id\":\"timer.downstairs_bathroom_lights_timer\"}", "waitForRunning": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" } ], "x": 140, "y": 920, "wires": [ [ "5123a607588fa737" ] ] }, { "id": "8d2e7fb5f214879c", "type": "server-state-changed", "z": "eff21041cc941fef", "g": "8aee4d340a136bac", "name": "Motion Sensor", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "2bdf556c5a30e5d5", "entityId": "binary_sensor.downstairs_bathroom_motion", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "detect", "propertyType": "msg", "value": "motion", "valueType": "str" } ], "x": 130, "y": 860, "wires": [ [ "f84e6b5157e857cf" ] ], "outputLabels": [ "on", "off" ] }, { "id": "b281061a4b08d2eb", "type": "api-call-service", "z": "eff21041cc941fef", "g": "8aee4d340a136bac", "name": "Lights On", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.downstairs_bathroom_scenes" ], "data": "{\t \"option\":\"Adaptive\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 540, "y": 800, "wires": [ [ "41a8d5ef20cf55d7" ] ] }, { "id": "85e820743550308b", "type": "function", "z": "eff21041cc941fef", "name": "Adaptive", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar adaptBrt = states['switch.adaptive_lighting_adapt_brightness_living_room'].state\nvar adaptColor = states['switch.adaptive_lighting_adapt_color_living_room'].state\n\nif (adaptBrt === 'on' && adaptColor === 'off') {\n msg.brightness = 'true'\n msg.color = 'false'\n node.status({fill:\"yellow\",shape:\"dot\",text:\"Brightness Only\"});\n} else if (adaptColor === 'on' && adaptBrt === 'off') {\n msg.brightness = 'false'\n msg.color = 'true'\n node.status({fill:\"yellow\",shape:\"dot\",text:\"Color Only\"});\n} else {\n msg.brightness = 'true'\n msg.color = 'true'\n node.status({fill:\"green\",shape:\"dot\",text:\"Both\"});\n}\n\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 300, "y": 40, "wires": [ [ "d790134891fedfcc" ] ] }, { "id": "c983b44381b46ab5", "type": "api-current-state", "z": "eff21041cc941fef", "g": "31767ffd6a647579", "name": "Home?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "binary_sensor.parents_home", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "presence", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 300, "y": 440, "wires": [ [ "bc3e0a041efec910", "2c351b21e13b7289" ], [] ] }, { "id": "bc3e0a041efec910", "type": "api-call-service", "z": "eff21041cc941fef", "g": "31767ffd6a647579", "name": "Lights Backup", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "scene", "service": "create", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"scene_id\":\"doorbell_lights_restore\",\t \"snapshot_entities\":[\"light.living_room_overhead\",\"light.living_room_led_strip\",\"light.dining_room_lamp\",\"light.tina_lamp_top\",\"light.tina_desk_strip\"]\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 180, "y": 520, "wires": [ [ "2593383937f292b3" ] ] }, { "id": "2c351b21e13b7289", "type": "api-call-service", "z": "eff21041cc941fef", "g": "31767ffd6a647579", "name": "Adaptive Backup", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "scene", "service": "create", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"scene_id\":\"doorbell_adaptive_restore\",\t \"snapshot_entities\":[\"switch.adaptive_lighting_tina_lamp\",\"switch.adaptive_lighting_living_room\"]\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 190, "y": 580, "wires": [ [ "71e6ae54dc1b958b" ] ] }, { "id": "71e6ae54dc1b958b", "type": "api-call-service", "z": "eff21041cc941fef", "g": "31767ffd6a647579", "name": "Adaptive Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "switch.adaptive_lighting_living_room", "switch.adaptive_lighting_tina_lamp" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 390, "y": 580, "wires": [ [] ] }, { "id": "2593383937f292b3", "type": "api-call-service", "z": "eff21041cc941fef", "g": "31767ffd6a647579", "name": "Lamp Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "light.dining_room_lamp" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 380, "y": 520, "wires": [ [ "41ababe9cfbe1297" ] ] }, { "id": "41ababe9cfbe1297", "type": "api-call-service", "z": "eff21041cc941fef", "g": "31767ffd6a647579", "name": "Lights Green", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "light.living_room_led_strip", "light.living_room_lights", "light.tina_desk_strip", "light.tina_lamp" ], "data": "{\t \"color_name\":\"green\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 550, "y": 520, "wires": [ [ "c0ce3c040d25e0a1" ] ] }, { "id": "c0ce3c040d25e0a1", "type": "api-call-service", "z": "eff21041cc941fef", "g": "31767ffd6a647579", "name": "Flash LED Strip", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "lifx", "service": "effect_pulse", "areaId": [], "deviceId": [], "entityId": [ "light.living_room_led_strip" ], "data": "{\t \"power_on\":\"true\",\t \"mode\":\"ping\",\t \"period\": 1,\t \"cycles\": 30,\t \"color_name\":\"white\",\t \"brightness\": 255\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 740, "y": 520, "wires": [ [ "e67a2b594c648ac6" ] ] }, { "id": "e67a2b594c648ac6", "type": "ha-wait-until", "z": "eff21041cc941fef", "g": "31767ffd6a647579", "name": "Wait for door", "server": "9e87348d.9c1c48", "version": 2, "outputs": 2, "entityId": "binary_sensor.front_door", "entityIdFilterType": "exact", "property": "state", "comparator": "is", "value": "on", "valueType": "str", "timeout": "30", "timeoutType": "num", "timeoutUnits": "seconds", "checkCurrentState": true, "blockInputOverrides": true, "outputProperties": [], "entityLocation": "data", "entityLocationType": "none", "x": 610, "y": 620, "wires": [ [ "45df5f447e52cb0f" ], [ "45df5f447e52cb0f" ] ] }, { "id": "e8510a6c66cd84e6", "type": "api-call-service", "z": "eff21041cc941fef", "g": "31767ffd6a647579", "name": "Lights Restore", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "scene", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "scene.doorbell_lights_restore" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 980, "y": 620, "wires": [ [ "2ebe03f5023de47c" ] ] }, { "id": "2ebe03f5023de47c", "type": "delay", "z": "eff21041cc941fef", "g": "31767ffd6a647579", "name": "", "pauseType": "delay", "timeout": "3", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 1105, "y": 620, "wires": [ [ "12e827e7416c9dac" ] ], "l": false }, { "id": "12e827e7416c9dac", "type": "api-call-service", "z": "eff21041cc941fef", "g": "31767ffd6a647579", "name": "Stop Effect", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "lifx", "service": "effect_stop", "areaId": [], "deviceId": [], "entityId": [ "light.living_room_led_strip" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1230, "y": 620, "wires": [ [ "e3ecd23a34c7f82e" ] ] }, { "id": "e3ecd23a34c7f82e", "type": "api-call-service", "z": "eff21041cc941fef", "g": "31767ffd6a647579", "name": "Adaptive Restore", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "scene", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "scene.doorbell_adaptive_restore" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1430, "y": 620, "wires": [ [] ] }, { "id": "58b11f0c0353d67b", "type": "comment", "z": "eff21041cc941fef", "g": "31767ffd6a647579", "name": "Still need to add support for returning to living room media scenes", "info": "", "x": 270, "y": 640, "wires": [] }, { "id": "45df5f447e52cb0f", "type": "function", "z": "eff21041cc941fef", "g": "31767ffd6a647579", "name": "Media?", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar media = states['input_boolean.living_room_entertainment_mode'].state\n\nif (media === 'on') {\n msg.payload = 'on'\n msg.alert = 'on'\n node.status({fill:\"green\",shape:\"dot\",text:\"Media App Running\"})\n return[msg,null]\n} else {\n node.status({fill:\"blue\",shape:\"dot\",text:\"Otherwise\"})\n return[null,msg]\n}", "outputs": 2, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 780, "y": 620, "wires": [ [ "e23e7b080ee3773f" ], [ "e8510a6c66cd84e6" ] ], "outputLabels": [ "media app running", "otherwise" ] }, { "id": "e23e7b080ee3773f", "type": "link out", "z": "eff21041cc941fef", "g": "31767ffd6a647579", "name": "Doorbell to Media", "mode": "link", "links": [ "27b2c22907382e6d", "8146f43fea5aec03" ], "x": 915, "y": 560, "wires": [] }, { "id": "48976bf8e9a62b0a", "type": "debug", "z": "eff21041cc941fef", "name": "debug 3", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 800, "y": 40, "wires": [] }, { "id": "1e1059008d19c0ee", "type": "server-state-changed", "z": "eff21041cc941fef", "g": "31767ffd6a647579", "name": "Doorbell Rings", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "7d2b67c31769ed69", "entityId": "binary_sensor.front_doorbell_ding_mqtt", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "on", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 120, "y": 440, "wires": [ [ "c983b44381b46ab5" ], [] ] }, { "id": "879ee8903841b8f0", "type": "server-state-changed", "z": "5e238cbbe6d612c9", "name": "Upstairs Hallway Scenes", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_select.upstairs_hallway_scenes", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "upstairs_hallway", "valueType": "str" } ], "x": 150, "y": 280, "wires": [ [ "fba69dfc80829db7" ] ] }, { "id": "bc2426cfcd5afbe8", "type": "server-state-changed", "z": "5e238cbbe6d612c9", "name": "Upstairs Bathroom Scenes", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_select.upstairs_bathroom_scenes", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "upstairs_bathroom", "valueType": "str" } ], "x": 150, "y": 40, "wires": [ [ "fba69dfc80829db7" ] ] }, { "id": "a5498446c1edffa9", "type": "server-state-changed", "z": "5e238cbbe6d612c9", "name": "Kallen Bedroom Scenes", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_select.kallen_bedroom_scenes", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "kallen_bedroom", "valueType": "str" } ], "x": 140, "y": 100, "wires": [ [ "fba69dfc80829db7" ] ] }, { "id": "f28e7fd88f75041e", "type": "server-state-changed", "z": "5e238cbbe6d612c9", "name": "Emma Bedroom Scenes", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_select.emma_bedroom_scenes", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "emma_bedroom", "valueType": "str" } ], "x": 150, "y": 160, "wires": [ [ "fba69dfc80829db7" ] ] }, { "id": "e1123236ee16fdaf", "type": "server-state-changed", "z": "5e238cbbe6d612c9", "name": "Master Bedroom Scenes", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_select.master_bedroom_scenes", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "master_bedroom", "valueType": "str" } ], "x": 150, "y": 220, "wires": [ [ "fba69dfc80829db7" ] ] }, { "id": "a1ee07ab20229b45", "type": "server-state-changed", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Motion Detected", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "binary_sensor.upstairs_bathroom_motion", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 200, "y": 380, "wires": [ [ "73bf42069fe27d3a" ] ], "outputLabels": [ "On", "Off" ] }, { "id": "74c0ced4ac160364", "type": "api-call-service", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Turn off light", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "light.upstairs_bathroom_lights" ], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "output_location": "", "output_location_type": "none", "x": 1630, "y": 620, "wires": [ [] ] }, { "id": "a17d58585048335d", "type": "subflow:a4ee891237e460a2", "z": "5e238cbbe6d612c9", "name": "", "x": 520, "y": 40, "wires": [] }, { "id": "ea8536fc853a8af4", "type": "api-current-state", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Check Shower Mode", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "off", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "input_boolean.shower_mode", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 540, "y": 380, "wires": [ [ "d2df58b074b9ba08" ], [] ], "outputLabels": [ "Off", "On" ] }, { "id": "d2df58b074b9ba08", "type": "api-call-service", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Set Adaptive", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.upstairs_bathroom_scenes" ], "data": "{\t \"option\":\"Adaptive\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 750, "y": 380, "wires": [ [] ] }, { "id": "83686fab02a3d825", "type": "api-call-service", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Set Scene", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.upstairs_bathroom_scenes" ], "data": "{\t \"option\": option\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1630, "y": 560, "wires": [ [] ] }, { "id": "853abef16fadc824", "type": "server-state-changed", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Shower Mode", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "input_boolean.shower_mode", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "on", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "showermode", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "toggle", "valueType": "str" } ], "x": 170, "y": 720, "wires": [ [ "2ad7be43ccdbdeaf", "31b8c8291d19ffc6", "a1fa2d2d1f55af4b" ], [ "31b8c8291d19ffc6", "a1fa2d2d1f55af4b", "a7a59e2f845b849c" ] ], "outputLabels": [ "On", "Off" ] }, { "id": "bfcb013bbf11611c", "type": "change", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Payload \"stop\"", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "stop", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 675, "y": 480, "wires": [ [ "34e2055344eea8fe" ] ], "l": false }, { "id": "2ad7be43ccdbdeaf", "type": "api-call-service", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Set to Bright", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.upstairs_bathroom_scenes" ], "data": "{\t \"option\":\"Bright\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 430, "y": 680, "wires": [ [] ] }, { "id": "2e299ac73c696afc", "type": "api-current-state", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Check Early Night", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "binary_sensor.early_night_mode", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 650, "y": 800, "wires": [ [ "d1ae15dff680b3b1" ], [ "ea02f8930aa2c7aa" ] ], "outputLabels": [ "On", "Off" ] }, { "id": "5d18c5d00181b011", "type": "api-call-service", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Set Nightlight", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.upstairs_bathroom_scenes" ], "data": "{\t \"option\":\"Nightlight\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1470, "y": 760, "wires": [ [] ] }, { "id": "ea02f8930aa2c7aa", "type": "api-call-service", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Turn Off Lights", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "light.upstairs_bathroom_lights" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 860, "y": 820, "wires": [ [ "8859759915625e2f" ] ] }, { "id": "8859759915625e2f", "type": "delay", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "", "pauseType": "delay", "timeout": "5", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 985, "y": 820, "wires": [ [ "3941b4a5b3493461" ] ], "l": false }, { "id": "3941b4a5b3493461", "type": "api-call-service", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Adaptive On", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "switch.adaptive_lighting_upstairs_bathroom" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1110, "y": 820, "wires": [ [ "0b122b02cfb10c25" ] ] }, { "id": "0b122b02cfb10c25", "type": "api-call-service", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Set Scene Text", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_text", "service": "set_value", "areaId": [], "deviceId": [], "entityId": [ "input_text.upstairs_bathroom_selected_scene" ], "data": "{\t \"value\":\"Adaptive\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1300, "y": 820, "wires": [ [] ] }, { "id": "d1ae15dff680b3b1", "type": "api-current-state", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Check Night Mode", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "input_boolean.night_mode", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "nightmode", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 870, "y": 760, "wires": [ [ "3a25dfcae623ee00" ], [ "3a25dfcae623ee00" ] ], "outputLabels": [ "On", "Off" ] }, { "id": "39b90ceaed170ac8", "type": "api-call-service", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Set Single Nightlight", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.upstairs_bathroom_scenes" ], "data": "{\t \"option\":\"Single Nightlight\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1500, "y": 700, "wires": [ [] ] }, { "id": "31b8c8291d19ffc6", "type": "link out", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Shower Mode Out", "mode": "link", "links": [ "7a7f626dce181b23" ], "x": 385, "y": 620, "wires": [] }, { "id": "55e84ccb73ae9b74", "type": "link in", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Goodnight - Lighting", "links": [ "60ce44747cf3e507" ], "x": 135, "y": 480, "wires": [ [ "a1fa2d2d1f55af4b" ] ] }, { "id": "3a25dfcae623ee00", "type": "api-current-state", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Check Kallen Overnight", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "input_boolean.kallen_overnight", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 1110, "y": 760, "wires": [ [ "ea02f8930aa2c7aa" ], [ "fc4bcd1c117fa849" ] ] }, { "id": "fc4bcd1c117fa849", "type": "switch", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "", "property": "nightmode", "propertyType": "msg", "rules": [ { "t": "eq", "v": "on", "vt": "str" }, { "t": "eq", "v": "off", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 1305, "y": 760, "wires": [ [ "39b90ceaed170ac8" ], [ "5d18c5d00181b011" ] ], "l": false }, { "id": "017de174925e8c75", "type": "server-state-changed", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Motion Detected", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "binary_sensor.upstairs_bathroom_motion", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "on", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "stop", "valueType": "str" } ], "x": 1400, "y": 440, "wires": [ [ "2dc5f9d3e00f4ddc" ], [] ], "outputLabels": [ "On", "Off" ] }, { "id": "2dc5f9d3e00f4ddc", "type": "stoptimer", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "duration": "2", "units": "Minute", "payloadtype": "num", "payloadval": "0", "name": "Wait 2 Minutes", "x": 1640, "y": 440, "wires": [ [ "86922621398f4b79" ], [] ] }, { "id": "86922621398f4b79", "type": "api-call-service", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Turn off light", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "light.upstairs_bathroom_lights" ], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "output_location": "", "output_location_type": "none", "x": 1830, "y": 440, "wires": [ [] ] }, { "id": "73bf42069fe27d3a", "type": "switch", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "", "property": "payload", "propertyType": "msg", "rules": [ { "t": "eq", "v": "on", "vt": "str" }, { "t": "eq", "v": "off", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 355, "y": 380, "wires": [ [ "ea8536fc853a8af4", "a1fa2d2d1f55af4b" ], [ "32559cd9120b4916" ] ], "l": false }, { "id": "32559cd9120b4916", "type": "api-current-state", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Delay", "server": "9e87348d.9c1c48", "version": 3, "outputs": 1, "halt_if": "", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "input_number.upstairs_bathroom_motion_off_delay", "state_type": "num", "blockInputOverrides": false, "outputProperties": [ { "property": "duration", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 490, "y": 560, "wires": [ [ "da70285e80c3f195" ] ] }, { "id": "a1fa2d2d1f55af4b", "type": "api-call-service", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Cancel Timer", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "timer", "service": "cancel", "areaId": [], "deviceId": [], "entityId": [ "timer.upstairs_bathroom_motion_timer" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 510, "y": 480, "wires": [ [ "bfcb013bbf11611c" ] ] }, { "id": "1d03ecbe4448d224", "type": "function", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Math", "func": "msg.duration = msg.duration * 60\n\nnode.status({fill:\"green\",shape:\"dot\",text:msg.duration + \"s\"})\nnode.log(\"Upstairs Bathroom Timer started\")\n\nreturn msg", "outputs": 1, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 835, "y": 560, "wires": [ [ "463689442b9d2046" ] ], "l": false }, { "id": "463689442b9d2046", "type": "api-call-service", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Start Timer", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "timer", "service": "start", "areaId": [], "deviceId": [], "entityId": [ "timer.upstairs_bathroom_motion_timer" ], "data": "{ \t \"duration\": duration\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 950, "y": 560, "wires": [ [] ] }, { "id": "5350d2264880d0ad", "type": "server-events", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Timer Finished", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "", "eventType": "timer.finished", "eventData": "{\"entity_id\":\"timer.upstairs_bathroom_motion_timer\"}", "waitForRunning": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" } ], "x": 1200, "y": 560, "wires": [ [ "b9741e2e2ed0448b" ] ] }, { "id": "da70285e80c3f195", "type": "api-current-state", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Check Shower Mode", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "off", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "input_boolean.shower_mode", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 680, "y": 560, "wires": [ [ "1d03ecbe4448d224" ], [] ], "outputLabels": [ "Off", "On" ] }, { "id": "a7a59e2f845b849c", "type": "api-current-state", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Motion On?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "binary_sensor.upstairs_bathroom_occupied", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "motion", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 430, "y": 800, "wires": [ [ "37f1c11c59a6ce16" ], [ "2e299ac73c696afc" ] ], "outputLabels": [ "On", "Off" ] }, { "id": "37f1c11c59a6ce16", "type": "api-call-service", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Set Adaptive", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.upstairs_bathroom_scenes" ], "data": "{\t \"option\":\"Adaptive\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 630, "y": 740, "wires": [ [] ] }, { "id": "b9741e2e2ed0448b", "type": "function", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "Timer Finished", "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst showerMode = states['input_boolean.shower_mode'].state\nconst earlyNightMode = states['binary_sensor.early_night_mode'].state\nconst kallenOvernight = states['input_boolean.kallen_overnight'].state\nconst nightMode = states['input_boolean.night_mode'].state\nconst masterBedroomSleep = states['input_boolean.master_bedroom_sleeping'].state\n\nlet scene = {}\nlet late = {}\n\nif (nightMode === 'on' || (earlyNightMode === 'on' && masterBedroomSleep === 'on')) {\n late = true\n scene = 'Single Nightlight'\n} else {\n late = false\n scene = 'Nightlight'\n}\n\nif (showerMode === 'off') {\n if (earlyNightMode === 'off') {\n node.send([null,null,msg])\n node.status({fill:'green',shape:'dot',text:'Lights Off'})\n } else {\n msg.option = scene\n node.send([null,msg,null])\n if (late === true && kallenOvernight === 'on') {\n node.send([msg,null,null])\n }\n node.status({fill:'green',shape:'dot',text:'Scene set to ' + scene})\n }\n} else {\n node.status({fill:'red',shape:'ring',text:'Blocked'})\n}\n\nnode.log(\"----- Upstairs Bathroom Timer Parameters Start -----\")\nnode.log(\"Upstairs Bathroom showerMode: \" + showerMode)\nnode.log(\"Upstairs Bathroom earlyNightMode: \" + showerMode)\nnode.log(\"Upstairs Bathroom kallenOvernight: \" + kallenOvernight)\nnode.log(\"Upstairs Bathroom nightMode: \" + nightMode)\nnode.log(\"Upstairs Bathroom masterBedroomSleep: \" + masterBedroomSleep)\nnode.log(\"Upstairs Bathroom scene: \" + scene)\nnode.log(\"Upstairs Bathroom late: \" + late)\nnode.log(\"----- Upstairs Bathroom Timer Parameters End -----\")", "outputs": 3, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1400, "y": 560, "wires": [ [ "2dc5f9d3e00f4ddc" ], [ "83686fab02a3d825" ], [ "74c0ced4ac160364" ] ], "outputLabels": [ "Overnight", "Scene", "Lights Off" ] }, { "id": "d0cbe3d9ed984771", "type": "inject", "z": "5e238cbbe6d612c9", "g": "eccca853a916b662", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 1200, "y": 420, "wires": [ [ "b9741e2e2ed0448b" ] ] }, { "id": "07049ae77b6751c6", "type": "server-state-changed", "z": "47f17992fab9b4f5", "name": "Basement Studio Scenes", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_select.basement_studio_scenes", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "basement_studio", "valueType": "str" } ], "x": 130, "y": 40, "wires": [ [ "31c254f61982f19d" ] ] }, { "id": "5e31d6aacad206b8", "type": "server-state-changed", "z": "47f17992fab9b4f5", "name": "Light turned on", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "light.furnace_room_overhead", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "on", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "", "valueType": "triggerId" } ], "x": 100, "y": 100, "wires": [ [ "dd3608c864d7007b" ], [] ] }, { "id": "18599ab162ab225b", "type": "change", "z": "47f17992fab9b4f5", "name": "Stop Timer", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "stop", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 290, "y": 160, "wires": [ [ "dd3608c864d7007b" ] ] }, { "id": "dd3608c864d7007b", "type": "stoptimer", "z": "47f17992fab9b4f5", "duration": "60", "units": "Minute", "payloadtype": "num", "payloadval": "0", "name": "", "x": 500, "y": 100, "wires": [ [ "e79ecc6c79946cc4" ], [] ] }, { "id": "e79ecc6c79946cc4", "type": "api-call-service", "z": "47f17992fab9b4f5", "name": "Turn off light", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "light.furnace_room_overhead" ], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "output_location": "", "output_location_type": "none", "x": 690, "y": 100, "wires": [ [] ] }, { "id": "ab01d3d95c7ea717", "type": "server-state-changed", "z": "47f17992fab9b4f5", "name": "Light turned off", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "light.furnace_room_overhead", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "off", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "", "valueType": "triggerId" } ], "x": 100, "y": 160, "wires": [ [ "18599ab162ab225b" ], [] ] }, { "id": "8fa363e9e0c1b165", "type": "comment", "z": "47f17992fab9b4f5", "name": "Furnace Room", "info": "", "x": 300, "y": 100, "wires": [] }, { "id": "97a441f1ac510844", "type": "inject", "z": "47f17992fab9b4f5", "g": "208284848b13b85b", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 180, "y": 280, "wires": [ [ "3c83c0ab0aa96e3d" ] ] }, { "id": "fbe3667814a51f6f", "type": "server-state-changed", "z": "47f17992fab9b4f5", "g": "208284848b13b85b", "name": "Front Door Opens", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "binary_sensor.front_door", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "on", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "", "valueType": "triggerId" } ], "x": 150, "y": 340, "wires": [ [ "3c83c0ab0aa96e3d" ], [] ] }, { "id": "ec543bc9adac3d08", "type": "api-current-state", "z": "47f17992fab9b4f5", "g": "208284848b13b85b", "name": "Basement Lights On?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "light.basement_studio_lights", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 560, "y": 340, "wires": [ [ "981191938ab4ee2f" ], [] ] }, { "id": "d4019d35bf5a5f98", "type": "inject", "z": "47f17992fab9b4f5", "g": "208284848b13b85b", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 180, "y": 460, "wires": [ [ "7b71cb1967ec5255" ] ] }, { "id": "25e12d8e4a0a7f11", "type": "server-state-changed", "z": "47f17992fab9b4f5", "g": "208284848b13b85b", "name": "Doorbell Rings", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "binary_sensor.front_doorbell_ding_mqtt", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "on", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "", "valueType": "triggerId" } ], "x": 140, "y": 520, "wires": [ [ "7b71cb1967ec5255" ], [] ] }, { "id": "e91c3392b59ff9d1", "type": "api-current-state", "z": "47f17992fab9b4f5", "g": "208284848b13b85b", "name": "Basement Lights On?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "light.basement_studio_lights", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 560, "y": 520, "wires": [ [ "59af14a564176ce4" ], [] ] }, { "id": "981191938ab4ee2f", "type": "api-current-state", "z": "47f17992fab9b4f5", "g": "208284848b13b85b", "name": "Studio Quiet?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "off", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "input_boolean.studio_quiet", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 780, "y": 340, "wires": [ [ "03fad0a960ff39e7" ], [] ] }, { "id": "59af14a564176ce4", "type": "api-current-state", "z": "47f17992fab9b4f5", "g": "208284848b13b85b", "name": "Studio Quiet?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "off", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "input_boolean.studio_quiet", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 780, "y": 520, "wires": [ [ "c0933fcc8737bc0b" ], [] ] }, { "id": "3c83c0ab0aa96e3d", "type": "api-call-service", "z": "47f17992fab9b4f5", "g": "208284848b13b85b", "name": "Save State", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "scene", "service": "create", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"scene_id\":\"basement_restore\",\t \"snapshot_entities\":[\"light.basement_led_strip_1\",\"light.basement_tall_lamp\",\"light.basement_short_lamp\",\"light.basement_stairwell\"]\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 350, "y": 340, "wires": [ [ "ec543bc9adac3d08" ] ] }, { "id": "7b71cb1967ec5255", "type": "api-call-service", "z": "47f17992fab9b4f5", "g": "208284848b13b85b", "name": "Save State", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "scene", "service": "create", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"scene_id\":\"basement_restore\",\t \"snapshot_entities\":[\"light.basement_led_strip_1\",\"light.basement_tall_lamp\",\"light.basement_short_lamp\",\"light.basement_stairwell\"]\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 350, "y": 520, "wires": [ [ "e91c3392b59ff9d1" ] ] }, { "id": "1f5808147fa975cf", "type": "link in", "z": "47f17992fab9b4f5", "g": "550e5b2d99316b12", "name": "Basement On - iOS", "links": [ "572b2040be874f4e" ], "x": 75, "y": 680, "wires": [ [ "11aabd786c07244f", "ea5306d6f92d9550" ] ] }, { "id": "1966d10d8f4467c7", "type": "server-state-changed", "z": "47f17992fab9b4f5", "g": "550e5b2d99316b12", "name": "Alexa Button", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_button.basement_on", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "alexa", "valueType": "str" } ], "x": 130, "y": 620, "wires": [ [ "0c7ef72bd0ef47d4" ] ] }, { "id": "a9bc78f321149316", "type": "ha-button", "z": "47f17992fab9b4f5", "g": "550e5b2d99316b12", "name": "Manual Button", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "23e5e32354cf867a", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "manual", "valueType": "str" } ], "x": 130, "y": 740, "wires": [ [ "11aabd786c07244f", "ea5306d6f92d9550" ] ] }, { "id": "b3bb08ff51e46985", "type": "api-call-service", "z": "47f17992fab9b4f5", "d": true, "g": "550e5b2d99316b12", "name": "Alexa Actionable Notification", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "activate_alexa_actionable_notification", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"text\": \"Would you like me to turn on the computer for Collin?\",\t \"event_id\": \"actionable_notification_kallen_computer_on\",\t \"alexa_device\": $globalContext('lastAlexaEntityId')\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 880, "y": 620, "wires": [ [] ] }, { "id": "0c7ef72bd0ef47d4", "type": "delay", "z": "47f17992fab9b4f5", "g": "550e5b2d99316b12", "name": "", "pauseType": "delay", "timeout": "1", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 255, "y": 620, "wires": [ [ "2516c6e3146cc851", "ea5306d6f92d9550" ] ], "l": false }, { "id": "11aabd786c07244f", "type": "function", "z": "47f17992fab9b4f5", "g": "550e5b2d99316b12", "name": "user conversion", "func": "var userTrigger = msg.payload.context.user_id\n\nif (userTrigger === \"c3909d27048140729f002aaef0391775\") {\n msg.user = \"tony\"\n} else if (userTrigger === \"f387a983651a4321a7411ff8cf36f949\") {\n msg.user = \"tina\"\n} else if (userTrigger === \"879b4c04e32841b3ad1d2763a11b4e70\") {\n msg.user = \"kallen\"\n}\n\nreturn msg;", "outputs": 1, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 275, "y": 740, "wires": [ [ "73078f818abdc6c2" ] ], "l": false }, { "id": "795c53ad6642733a", "type": "api-call-service", "z": "47f17992fab9b4f5", "g": "550e5b2d99316b12", "name": "iOS Actionable Notification", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "text_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"title\":\"Basement On\",\t \"message\": \"Should I turn on Kallen's computer?\",\t \"tag\":\"kallen_PC\",\t \"who\": user,\t \"type\":\"alert\",\t \"actions\": [\t {\t \"action\": \"KALLEN_PC_YES\",\t \"title\": \"Yes\",\t \"icon\": \"mdi:thumb-up\"\t },\t {\t \"action\": \"KALLEN_PC_NO\",\t \"title\": \"No\",\t \"icon\": \"mdi:thumb-down\"\t }\t ]\t\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 700, "y": 740, "wires": [ [] ] }, { "id": "ea5306d6f92d9550", "type": "api-call-service", "z": "47f17992fab9b4f5", "g": "550e5b2d99316b12", "name": "Tony PC On", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "tony_desktop_wake", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 390, "y": 680, "wires": [ [ "4829663e9913e2aa" ] ] }, { "id": "4829663e9913e2aa", "type": "api-call-service", "z": "47f17992fab9b4f5", "g": "550e5b2d99316b12", "name": "TV On", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "media_player", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "media_player.basement_tv" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 550, "y": 680, "wires": [ [] ] }, { "id": "61cb79c998ee0b59", "type": "change", "z": "47f17992fab9b4f5", "d": true, "g": "550e5b2d99316b12", "name": "Last Alexa", "rules": [ { "t": "set", "p": "last_alexa", "pt": "msg", "to": "lastAlexaEntityId", "tot": "global" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 650, "y": 620, "wires": [ [ "b3bb08ff51e46985" ] ] }, { "id": "73078f818abdc6c2", "type": "api-current-state", "z": "47f17992fab9b4f5", "g": "550e5b2d99316b12", "name": "Kallen's Computer On?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "binary_sensor.kallen_desktop_on", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "kallen_pc", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 430, "y": 740, "wires": [ [], [ "795c53ad6642733a" ] ] }, { "id": "2516c6e3146cc851", "type": "api-current-state", "z": "47f17992fab9b4f5", "d": true, "g": "550e5b2d99316b12", "name": "Kallen's Computer On?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "binary_sensor.kallen_desktop_on", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "kallen_pc", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 430, "y": 620, "wires": [ [], [ "61cb79c998ee0b59" ] ] }, { "id": "03fad0a960ff39e7", "type": "api-call-service", "z": "47f17992fab9b4f5", "g": "208284848b13b85b", "name": "Red Alert", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "basement_lights_alert", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"duration\": 5,\t \"type\": \"red\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 960, "y": 340, "wires": [ [] ] }, { "id": "c0933fcc8737bc0b", "type": "api-call-service", "z": "47f17992fab9b4f5", "g": "208284848b13b85b", "name": "Green Alert", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "basement_lights_alert", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"duration\": 5,\t \"type\": \"green\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 970, "y": 520, "wires": [ [] ] }, { "id": "31c254f61982f19d", "type": "subflow:a4ee891237e460a2", "z": "47f17992fab9b4f5", "name": "", "x": 380, "y": 40, "wires": [] }, { "id": "091390f43bfeddf5", "type": "api-call-service", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "Turn on light", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "light.front_porch_light" ], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "output_location": "", "output_location_type": "none", "x": 790, "y": 120, "wires": [ [ "3a5bb57569e07beb" ] ] }, { "id": "7a7229eb69c9b1a3", "type": "api-call-service", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "Turn off light", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "light.front_porch_light" ], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "output_location": "", "output_location_type": "none", "x": 1250, "y": 260, "wires": [ [] ] }, { "id": "f34816b23181f21e", "type": "link in", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "Porch Light Input", "links": [ "26f15fc8d75a4020" ], "x": 125, "y": 120, "wires": [ [ "cfdcc7c9c168dc17" ] ] }, { "id": "bd75b077a1c76fce", "type": "api-call-service", "z": "b5717a86ce55bc29", "d": true, "g": "eeafd13be593ae69", "name": "Turn off Delivery Mode", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.delivery_mode" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1160, "y": 60, "wires": [ [] ] }, { "id": "b69eeb738bbd4bdb", "type": "server-state-changed", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "Porch Automation Stop", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "input_boolean.front_porch_light_on", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "off", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" } ], "x": 180, "y": 60, "wires": [ [ "459433738b64d14d" ], [] ] }, { "id": "cfdcc7c9c168dc17", "type": "switch", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "On/Off", "property": "payload", "propertyType": "msg", "rules": [ { "t": "eq", "v": "on", "vt": "str" }, { "t": "eq", "v": "off", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 230, "y": 120, "wires": [ [ "16029ccf061bdd10", "459433738b64d14d" ], [ "76815f07ec2f3eef" ] ] }, { "id": "16029ccf061bdd10", "type": "switch", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "Method", "property": "detect", "propertyType": "msg", "rules": [ { "t": "eq", "v": "presence", "vt": "str" }, { "t": "else" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 380, "y": 120, "wires": [ [ "c7a8df4ebeb3b5c5", "77759257dd9c9465" ], [ "77759257dd9c9465" ] ] }, { "id": "d2751bc2cfc5af8f", "type": "api-call-service", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "Set Adaptive", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.front_porch_scenes" ], "data": "{\t \"option\":\"Adaptive\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1130, "y": 120, "wires": [ [] ] }, { "id": "435280acadb9f364", "type": "api-call-service", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "Holiday Scene", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "switch.animated_scene_{{holiday}}" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1440, "y": 200, "wires": [ [] ] }, { "id": "ec5937bc60874009", "type": "api-call-service", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "Animations Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "switch.animated_scene_{{holiday}}" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 800, "y": 60, "wires": [ [] ] }, { "id": "defcae57f9916394", "type": "api-call-service", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "Adaptive Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "switch.adaptive_lighting_front_porch" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1250, "y": 200, "wires": [ [ "435280acadb9f364" ] ] }, { "id": "459433738b64d14d", "type": "api-call-service", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "Cancel Timer", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "timer", "service": "cancel", "areaId": [], "deviceId": [], "entityId": [ "timer.front_porch_motion_timer" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 390, "y": 60, "wires": [ [] ] }, { "id": "a2ec35a79d79bf2f", "type": "api-call-service", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "Start Timer", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "timer", "service": "start", "areaId": [], "deviceId": [], "entityId": [ "timer.front_porch_motion_timer" ], "data": "{\t \"duration\": duration\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 510, "y": 260, "wires": [ [] ] }, { "id": "9a8c39dc1a0c20e6", "type": "server-events", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "Timer Finished", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "", "eventType": "timer.finished", "eventData": "{\"entity_id\":\"timer.front_porch_motion_timer\"}", "waitForRunning": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" } ], "x": 860, "y": 260, "wires": [ [ "f5fb96bf1a33b3cd" ] ] }, { "id": "8c29a2e1a06c5524", "type": "server-state-changed", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "Delivery Mode Off", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "input_boolean.delivery_mode", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "off", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 870, "y": 200, "wires": [ [ "f5fb96bf1a33b3cd" ], [] ] }, { "id": "c7a8df4ebeb3b5c5", "type": "delay", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "", "pauseType": "delay", "timeout": "10", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 245, "y": 260, "wires": [ [ "76815f07ec2f3eef" ] ], "l": false }, { "id": "77759257dd9c9465", "type": "function", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "Check Parameters", "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst earlyNightMode = states['binary_sensor.early_night_mode'].state\nconst frontPorchToggle = states['input_boolean.front_porch_light_on'].state\nconst holidaymode = states['input_boolean.holiday_mode'].state\nconst currentholiday = states['input_select.holiday_animation'].state\nconst holiday = currentholiday.toLowerCase()\n\nlet holidayMsg = {\n \"holiday\": holiday\n}\n\nif (earlyNightMode === 'on' && frontPorchToggle === 'on') {\n if (holidaymode === 'on') {\n node.status({fill:\"blue\",shape:\"dot\",text:\"Holiday On\"})\n node.send([holidayMsg,msg])\n } else {\n node.status({fill:\"green\",shape:\"dot\",text:\"Holiday Off\"})\n node.send([null,msg])\n }\n} else {\n if (frontPorchToggle === 'off') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Disabled\" })\n } else if (earlyNightMode === 'off') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Daytime\" })\n }\n}", "outputs": 2, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 590, "y": 120, "wires": [ [ "ec5937bc60874009" ], [ "091390f43bfeddf5" ] ], "outputLabels": [ "Holiday", "Otherwise" ], "icon": "font-awesome/fa-check" }, { "id": "3a5bb57569e07beb", "type": "function", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "If Motion", "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst deliveryMode = states['input_boolean.delivery_mode'].state\nconst detect = msg.detect\n\nnode.send([null,msg])\n\nif (detect === 'motion' && deliveryMode === 'on') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Motion/Delivery\"})\n node.send([msg,null])\n} else {\n node.status({fill:\"green\",shape:\"dot\",text:\"Not Motion\"})\n}", "outputs": 2, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 960, "y": 120, "wires": [ [ "bd75b077a1c76fce" ], [ "d2751bc2cfc5af8f" ] ], "outputLabels": [ "Motion", "Otherwise" ], "icon": "node-red-contrib-huemagic/hue-motion.svg" }, { "id": "76815f07ec2f3eef", "type": "function", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "Delay", "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst delay = states['input_number.front_porch_motion_off_delay'].state\nconst duration = delay * 60\nconst lights = states['light.front_porch_light'].state\n\nmsg.duration = duration\n\nif (lights === 'on') {\n node.status({fill:\"green\",shape:\"dot\",text: parseInt(delay) + \" minutes\"})\n node.send(msg)\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Light Off\"})\n}", "outputs": 1, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 350, "y": 260, "wires": [ [ "a2ec35a79d79bf2f" ] ], "icon": "font-awesome/fa-tree" }, { "id": "f5fb96bf1a33b3cd", "type": "function", "z": "b5717a86ce55bc29", "g": "eeafd13be593ae69", "name": "Shut Off", "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst frontPorchToggle = states['input_boolean.front_porch_light_on'].state\nconst deliveryMode = states['input_boolean.delivery_mode'].state\nconst holidayMode = states['input_boolean.holiday_mode'].state\nconst holidayHold = states['input_boolean.holiday_mode_hold'].state\nconst currentHoliday = states['input_select.holiday_animation'].state\nconst earlyNight = states['binary_sensor.early_night_mode'].state\nconst holiday = currentHoliday.toLowerCase()\n\nif (frontPorchToggle === 'on' && deliveryMode === 'off') {\n if (earlyNight === 'off') {\n if (holidayMode === 'on' && holidayHold === 'on') {\n node.status({fill:\"blue\",shape:\"dot\",text:\"Daytime (Holiday Hold)\"})\n node.send([msg,null])\n } else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Daytime\"})\n node.send([null,msg])\n }\n } else if (earlyNight === 'on') {\n if (holidayMode === 'on') {\n msg.holiday = holiday\n node.status({fill:\"blue\",shape:\"dot\",text:\"Night (Holiday On)\"})\n node.send([msg,null])\n } else {\n node.status({fill:\"green\",shape:\"dot\",text:\"Night (Holiday Off)\"})\n node.send([null,msg])\n }\n }\n} else if (frontPorchToggle === 'off') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Blocked (Automation Off\"})\n} else if (deliveryMode === 'on') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Blocked (Delivery Mode)\"})\n}", "outputs": 2, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1080, "y": 260, "wires": [ [ "defcae57f9916394" ], [ "7a7229eb69c9b1a3" ] ], "outputLabels": [ "Holiday", "Otherwise" ], "icon": "font-awesome/fa-power-off" }, { "id": "af64b56e28c93907", "type": "server-state-changed", "z": "b5717a86ce55bc29", "name": "Front Porch Scenes", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_select.front_porch_scenes", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "front_porch", "valueType": "str" } ], "x": 170, "y": 360, "wires": [ [ "3747d0c21057f3a6" ] ] }, { "id": "3747d0c21057f3a6", "type": "subflow:a4ee891237e460a2", "z": "b5717a86ce55bc29", "name": "", "x": 400, "y": 360, "wires": [] }, { "id": "54c6775f123e230c", "type": "ha-switch", "z": "b5717a86ce55bc29", "name": "Halloween Switch", "version": 0, "debugenabled": false, "inputs": 0, "outputs": 2, "entityConfig": "d945515487bfbb09", "enableInput": false, "outputOnStateChange": true, "outputProperties": [ { "property": "outputType", "propertyType": "msg", "value": "state change", "valueType": "str" }, { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "holiday", "propertyType": "msg", "value": "halloween", "valueType": "str" } ], "x": 170, "y": 420, "wires": [ [ "f8e39e360fbc37d3" ], [] ] }, { "id": "f8e39e360fbc37d3", "type": "api-call-service", "z": "b5717a86ce55bc29", "name": "Halloween Scene", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "light.front_porch_light" ], "data": "{\t \"effect\":\"fire\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 390, "y": 420, "wires": [ [] ] }, { "id": "ec399b3f614c8b17", "type": "api-current-state", "z": "b5717a86ce55bc29", "name": "Early Night Mode?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "binary_sensor.early_night_mode", "state_type": "str", "blockInputOverrides": false, "outputProperties": [], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 390, "y": 480, "wires": [ [ "ade9d177f29d4d95" ], [ "e0820afc97e33329" ] ] }, { "id": "ade9d177f29d4d95", "type": "api-call-service", "z": "b5717a86ce55bc29", "name": "Set Adaptive", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.front_porch_scenes" ], "data": "{\t \"option\":\"Adaptive\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 610, "y": 440, "wires": [ [] ] }, { "id": "e0820afc97e33329", "type": "api-call-service", "z": "b5717a86ce55bc29", "name": "Turn off light", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "light.front_porch_light" ], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "output_location": "", "output_location_type": "none", "x": 610, "y": 500, "wires": [ [] ] }, { "id": "513f37de8d51bb2f", "type": "comment", "z": "b5717a86ce55bc29", "name": "Not sure yet if this is how I want to go about this", "info": "", "x": 480, "y": 560, "wires": [] }, { "id": "9932b8210843f84e", "type": "debug", "z": "ce9c810396e540b6", "name": "Custom Event", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 360, "y": 160, "wires": [] }, { "id": "70925e3cac1396e1", "type": "function", "z": "ce9c810396e540b6", "name": "Processing", "func": "// Set constants\nconst states = global.get('homeassistant.homeAssistant.states')\nconst occupied = states[\"binary_sensor.basement_occupied\"].state\nconst quiet = states[\"input_boolean.studio_quiet\"].state\nconst stateTinaDesk = states[\"light.tina_desk_lights\"].state\nconst stateLivingRoom = states[\"light.living_room_lights\"].state\nconst stateDiningRoom = states[\"light.dining_room_lamp\"].state\nconst stateStairwell = states[\"light.stairwell_led_strip\"].state\nconst stateBasement = states[\"light.basement_studio_lights\"].state\nconst adaptLivingRoom = states[\"switch.adaptive_lighting_living_room\"].state\nconst adaptBasement = states[\"switch.adaptive_lighting_basement_studio\"].state\nconst nightLivingRoom = states[\"switch.adaptive_lighting_sleep_mode_living_room\"].state\nconst nightBasement = states[\"switch.adaptive_lighting_sleep_mode_basement_studio\"].state\nconst currentSceneBasement = states[\"input_text.basement_studio_selected_scene\"].state\nconst currentSceneLivingRoom = states[\"input_text.living_room_selected_scene\"].state\nconst currentSceneTinaDesk = states[\"input_text.tina_desk_selected_scene\"].state\nconst effectBasement = msg.payload.event.basement\nconst effectFirstFloor = msg.payload.event.first_floor\nconst effectType = msg.payload.event.type\nconst effectDivide = msg.payload.event.divide\nconst duration = msg.payload.event.duration\nconst delay = duration * 1000\nconst adaptiveSwitchFirstFloor = flow.get(\"adaptiveFirstFloor\", \"diskCon\")\nconst adaptiveSwitchBasement = flow.get(\"adaptiveBasement\", \"diskCon\")\n\n// Set flow contexts to be used later in the reset node\nflow.set(\"currentSceneBasement\", currentSceneBasement)\nflow.set(\"currentSceneLivingRoom\", currentSceneLivingRoom)\nflow.set(\"currentSceneTinaDesk\", currentSceneTinaDesk)\nflow.set(\"adaptLivingRoom\", adaptLivingRoom)\nflow.set(\"adaptBasement\", adaptBasement)\nflow.set(\"nightLivingRoom\", nightLivingRoom)\nflow.set(\"nightBasement\", nightBasement)\nflow.set(\"stateTinaDesk\", stateTinaDesk)\nflow.set(\"stateLivingRoom\", stateLivingRoom)\nflow.set(\"stateDiningRoom\", stateDiningRoom)\nflow.set(\"stateStairwell\", stateStairwell)\nflow.set(\"stateBasement\", stateBasement)\n\n// Define empty arrays for backup scenes\nlet firstFloorLights = []\nlet basementLights = []\n// Define empty arrays for basement LED strip zones\nlet basement1 = []\nlet basement2 = []\nlet basementFull = []\n// Define empty arrays for living room LED strip zones\nlet livingRoom1 = []\nlet livingRoom2 = []\nlet livingRoomFull = []\n// Color names are set by default, however certain effects can override them below\nlet colorName1 = effectType\nlet colorName2 = \"white\"\n\n// Get lights to add to the backup scenes\n//! We need to change this from one entire first floor scene to individual room scenes\nif (stateTinaDesk === 'on') {\n firstFloorLights.push('light.tina_desk_strip','light.tina_lamp_top','light.tina_lamp_side')\n}\n\nif (stateLivingRoom === 'on') {\n firstFloorLights.push('light.living_room_color_1','light.living_room_color_2','light.living_room_color_3','light.living_room_led_strip')\n}\n\nif (stateDiningRoom === 'on') {\n firstFloorLights.push('light.dining_room_lamp')\n}\n\nif (stateStairwell === 'on') {\n firstFloorLights.push('light.stairwell_led_strip')\n}\n\nif (stateBasement === 'on') {\n basementLights.push('light.basement_tall_lamp','light.basement_short_lamp','light.basement_stairwell','light.basement_led_strip_1')\n}\n\n// Setup the proper zones to use for the effect\nif (effectDivide === 'half') {\n basement1 = flow.get(\"halfBasement1\", \"diskCon\")\n basement2 = flow.get(\"halfBasement2\", \"diskCon\")\n livingRoom1 = flow.get(\"halfLivingRoom1\", \"diskCon\")\n livingRoom2 = flow.get(\"halfLivingRoom2\", \"diskCon\")\n} else if (effectDivide === 'quarter') {\n basement1 = flow.get(\"effectSegBasement1\", \"diskCon\")\n basement2 = flow.get(\"effectSegBasement2\", \"diskCon\")\n livingRoom1 = flow.get(\"effectSegLivingRoom1\", \"diskCon\")\n livingRoom2 = flow.get(\"effectSegLivingRoom2\", \"diskCon\")\n} else if (effectDivide === 'full') {\n basementFull = flow.get(\"basementFull\", \"diskCon\")\n livingRoomFull = flow.get(\"livingRoomFull\", \"diskCon\")\n}\n\n// Set/change colors if necessary\nif (effectType === 'police') {\n colorName1 = 'red'\n colorName2 = 'blue'\n}\n\n// Set message payloads\nlet sendBasementStripFX = {\n \"payload\": {\n \"domain\": \"lifx\",\n \"service\": \"effect_move\",\n \"target\": {\n \"entity_id\": [\"light.basement_led_strip_1\"]\n },\n \"data\": {\n \"speed\": 0.5,\n \"direction\": \"right\",\n \"power_on\": false\n }\n }\n}\n\nlet sendBasementStrip1 = {\n \"payload\": {\n \"domain\": \"lifx\",\n \"service\": \"set_state\",\n \"target\": {\n \"entity_id\": [\"light.basement_led_strip_1\"]\n },\n \"data\": {\n \"zones\": basement1,\n \"color_name\": colorName1,\n \"brightness\": 255\n }\n }\n}\n\nlet sendBasementStrip2 = {\n \"payload\": {\n \"domain\": \"lifx\",\n \"service\": \"set_state\",\n \"target\": {\n \"entity_id\": [\"light.basement_led_strip_1\"]\n },\n \"data\": {\n \"zones\": basement2,\n \"color_name\": colorName2,\n \"brightness\": 255,\n \"power\": true\n }\n }\n}\n\nlet sendBasementLights = {\n \"payload\": {\n \"domain\": \"light\",\n \"service\": \"turn_on\",\n \"target\": {\n \"entity_id\": [\n \"light.basement_tall_lamp\",\n \"light.basement_short_lamp\",\n \"light.basement_stairwell\"\n ]\n },\n \"data\": {\n \"color_name\": colorName1,\n \"brightness\": 255\n }\n }\n}\n\nlet sendLivingRoomStripFX = {\n \"payload\": {\n \"domain\": \"lifx\",\n \"service\": \"effect_move\",\n \"target\": {\n \"entity_id\": [\"light.living_room_led_strip\"]\n },\n \"data\": {\n \"speed\": 0.5,\n \"direction\": \"right\",\n \"power_on\": false\n }\n }\n}\n\nlet sendLivingRoomStrip1 = {\n \"payload\": {\n \"domain\": \"lifx\",\n \"service\": \"set_state\",\n \"target\": {\n \"entity_id\": [\"light.living_room_led_strip\"]\n },\n \"data\": {\n \"zones\": livingRoom1,\n \"color_name\": colorName1,\n \"brightness\": 255\n }\n }\n}\n\nlet sendLivingRoomStrip2 = {\n \"payload\": {\n \"domain\": \"lifx\",\n \"service\": \"set_state\",\n \"target\": {\n \"entity_id\": [\"light.living_room_led_strip\"]\n },\n \"data\": {\n \"zones\": livingRoom2,\n \"color_name\": colorName2,\n \"brightness\": 255,\n \"power\": true\n }\n }\n}\n\nlet sendLivingRoomLights = {\n \"payload\": {\n \"domain\": \"light\",\n \"service\": \"turn_on\",\n \"target\": {\n \"entity_id\": [\n \"light.living_room_color_1\",\n \"light.living_room_color_2\",\n \"light.living_room_color_3\"\n ]\n },\n \"data\": {\n \"color_name\": colorName1,\n \"brightness\": 255\n }\n }\n}\n\nlet sendTinaDeskLights = {\n \"payload\": {\n \"domain\": \"light\",\n \"service\": \"turn_on\",\n \"target\": {\n \"entity_id\": [\"light.tina_desk_lights\"]\n },\n \"data\": {\n \"color_name\": colorName1,\n \"brightness\": 255\n }\n }\n}\n\nlet sendDiningRoomLamp = {\n \"payload\": {\n \"domain\": \"light\",\n \"service\": \"turn_off\",\n \"target\": {\n \"entity_id\": [\"light.dining_room_lamp\"]\n },\n \"data\": {}\n }\n}\n\nlet sendAdaptiveFirstFloor = {\n \"payload\": {\n \"domain\": \"switch\",\n \"service\": \"turn_off\",\n \"target\": {\n \"entity_id\": adaptiveSwitchFirstFloor\n },\n \"data\": {}\n }\n}\n\nlet sendAdaptiveBasement = {\n \"payload\": {\n \"domain\": \"switch\",\n \"service\": \"turn_off\",\n \"target\": {\n \"entity_id\": adaptiveSwitchBasement\n },\n \"data\": {}\n }\n}\n\nlet backupFirstFloor = {\n \"payload\": {\n \"domain\": \"scene\",\n \"service\": \"create\",\n \"data\": {\n \"scene_id\": \"first_floor_alert_restore\",\n \"snapshot_entities\": firstFloorLights\n }\n }\n}\n\nlet backupBasement = {\n \"payload\": {\n \"domain\": \"scene\",\n \"service\": \"create\",\n \"data\": {\n \"scene_id\": \"basement_alert_restore\",\n \"snapshot_entities\": basementLights\n }\n }\n}\n\nlet sendReset = {\n \"delay\": delay\n}\n\nif (stateLivingRoom === 'on' && currentSceneLivingRoom != 'Alert') {\n node.send([[backupFirstFloor],null,null,null,null,null])\n}\n\nif (stateBasement === 'on' && currentSceneBasement != 'Alert') {\n node.send([[backupBasement],null,null,null,null,null])\n}\n\n// Send effect messages\nif (effectBasement === true) {\n node.send([null,null,null,null,[sendBasementStripFX,sendBasementLights,sendBasementStrip1,sendBasementStrip2],null])\n}\n\nif (effectFirstFloor === true) {\n node.send([null,[sendLivingRoomStripFX,sendLivingRoomLights,sendLivingRoomStrip1,sendLivingRoomStrip2],sendTinaDeskLights,sendDiningRoomLamp,null,null])\n}\n\n// Send the reset message to start the timer\nnode.send([null,null,null,null,null,sendReset])", "outputs": 6, "timeout": 0, "noerr": 0, "initialize": "// Set some constants for all of the lights\n\n// Half and half for living room LED strip\nconst halfLivingRoom1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]\nconst halfLivingRoom2 = [20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39]\n\n// Quarters for living room LED strip\nconst segLivingRoom1 = [0,1,2,3,4,5,6,7,8,9]\nconst segLivingRoom2 = [10,11,12,13,14,15,16,17,18,19]\nconst segLivingRoom3 = [20,21,22,23,24,25,26,27,28,29]\nconst segLivingRoom4 = [30,31,32,33,34,35,36,37,38,39]\n\n// Preset effect segments for living room LED strip\nconst effectSegLivingRoom1 = [].concat(segLivingRoom1, segLivingRoom3)\nconst effectSegLivingRoom2 = [].concat(segLivingRoom2, segLivingRoom4)\n\n// Full strip for living room LED strip\nconst livingRoomFull = [].concat(halfLivingRoom1, halfLivingRoom2)\n\n// Half and half for basement LED strip\nconst halfBasement1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]\nconst halfBasement2 = [16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]\n\n// Quarters for basement LED strip\nconst segBasement1 = [0,1,2,3,4,5,6,7]\nconst segBasement2 = [8,9,10,11,12,13,14,15]\nconst segBasement3 = [16,17,18,19,20,21,22,23]\nconst segBasement4 = [24,25,26,27,28,29,30,31]\n\n// Preset effect segments for basement LED strip\nconst effectSegBasement1 = [].concat(segBasement1, segBasement3)\nconst effectSegBasement2 = [].concat(segBasement2, segBasement4)\n\n// Full strip for basement LED strip\nconst basementFull = [].concat(halfBasement1, halfBasement2)\n\n// Adaptive Lighting switches\nconst adaptiveFirstFloor = [\n \"switch.adaptive_lighting_living_room\",\n \"switch.adaptive_lighting_dining_room_lamp\",\n \"switch.adaptive_lighting_tina_lamp\"]\n\nconst adaptiveBasement = [\n \"switch.adaptive_lighting_basement_studio\"\n]\n\n// Write flow variables\nflow.set(\"halfLivingRoom1\", halfLivingRoom1, \"diskCon\")\nflow.set(\"halfLivingRoom2\", halfLivingRoom2, \"diskCon\")\n\nflow.set(\"segLivingRoom1\", segLivingRoom1, \"diskCon\")\nflow.set(\"segLivingRoom2\", segLivingRoom2, \"diskCon\")\nflow.set(\"segLivingRoom3\", segLivingRoom3, \"diskCon\")\nflow.set(\"segLivingRoom4\", segLivingRoom4, \"diskCon\")\n\nflow.set(\"effectSegLivingRoom1\", effectSegLivingRoom1, \"diskCon\")\nflow.set(\"effectSegLivingRoom2\", effectSegLivingRoom2, \"diskCon\")\n\nflow.set(\"livingRoomFull\", livingRoomFull, \"diskCon\")\n\nflow.set(\"halfBasement1\", halfBasement1, \"diskCon\")\nflow.set(\"halfBasement2\", halfBasement2, \"diskCon\")\n\nflow.set(\"segBasement1\", segBasement1, \"diskCon\")\nflow.set(\"segBasement2\", segBasement2, \"diskCon\")\nflow.set(\"segBasement3\", segBasement3, \"diskCon\")\nflow.set(\"segBasement4\", segBasement4, \"diskCon\")\n\nflow.set(\"effectSegBasement1\", effectSegBasement1, \"diskCon\")\nflow.set(\"effectSegBasement2\", effectSegBasement2, \"diskCon\")\n\nflow.set(\"basementFull\", basementFull, \"diskCon\")\n\nflow.set(\"adaptiveFirstFloor\", adaptiveFirstFloor, \"diskCon\")\nflow.set(\"adaptiveBasement\", adaptiveBasement, \"diskCon\")\n", "finalize": "", "libs": [], "x": 430, "y": 300, "wires": [ [ "9052f9699ecea4b6" ], [ "8294215e41a6c030" ], [ "bc571799c81b1bfa" ], [ "fee7d53ab2965fe3" ], [ "4165ae582e799463" ], [ "561b936b324b33de" ] ], "outputLabels": [ "Backup", "Living Room", "Tina Desk", "Dining Room", "Basement", "Reset" ], "icon": "font-awesome/fa-bolt" }, { "id": "b38f12483048e1ac", "type": "api-call-service", "z": "ce9c810396e540b6", "name": "Living Room Strip", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "lifx", "service": "effect_move", "areaId": [], "deviceId": [], "entityId": [ "light.living_room_led_strip" ], "data": "{\t \"speed\": 0.5,\t \"direction\": \"right\",\t \"power_on\": \"false\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 310, "y": 80, "wires": [ [] ] }, { "id": "67ba32adb7d35161", "type": "server-events", "z": "ce9c810396e540b6", "name": "LightFX Listener", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "86feef66681d907f", "eventType": "lightfx", "eventData": "", "waitForRunning": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "$outputData(\"eventData\").event_type", "valueType": "jsonata" } ], "event_type": "", "x": 220, "y": 300, "wires": [ [ "9932b8210843f84e", "70925e3cac1396e1" ] ] }, { "id": "4165ae582e799463", "type": "api-call-service", "z": "ce9c810396e540b6", "name": "Basement", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "", "service": "", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 660, "y": 400, "wires": [ [ "c6886c9ecbce28c1" ] ] }, { "id": "335639590303cd1c", "type": "comment", "z": "ce9c810396e540b6", "name": "Things still to implement from yaml script", "info": "If current scene is a defined scene, take note of it\n\nDefine variable for restoration of the current scene if the backup is not needed\n\nIf the lights were off, turn them back off\n\nIf the lights were in night mode, put them back to it\n\nIf the lights were in adaptive, put them back to it\n\nIf the current scene was a defined scene, activate that scene\n\nOtherwise, restore the backup scene from above\n\nCleanup", "x": 260, "y": 540, "wires": [] }, { "id": "c6886c9ecbce28c1", "type": "debug", "z": "ce9c810396e540b6", "name": "Basement", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 840, "y": 400, "wires": [] }, { "id": "561b936b324b33de", "type": "delay", "z": "ce9c810396e540b6", "name": "Reset after delay", "pauseType": "delayv", "timeout": "5", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 315, "y": 420, "wires": [ [ "def0e3d5cb561f87" ] ], "l": false }, { "id": "8294215e41a6c030", "type": "api-call-service", "z": "ce9c810396e540b6", "name": "Living Room", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "", "service": "", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 670, "y": 220, "wires": [ [ "fa1e1b2739ff28f5" ] ] }, { "id": "bc571799c81b1bfa", "type": "api-call-service", "z": "ce9c810396e540b6", "name": "Tina Desk", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "", "service": "", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 660, "y": 280, "wires": [ [ "9f459560dbd5c755" ] ] }, { "id": "fee7d53ab2965fe3", "type": "api-call-service", "z": "ce9c810396e540b6", "name": "Dining Room", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "", "service": "", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 670, "y": 340, "wires": [ [ "a13dc6bbcb45602a" ] ] }, { "id": "9052f9699ecea4b6", "type": "api-call-service", "z": "ce9c810396e540b6", "name": "Backup", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "", "service": "", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 660, "y": 160, "wires": [ [ "a7d31fef8f77efe8" ] ] }, { "id": "def0e3d5cb561f87", "type": "function", "z": "ce9c810396e540b6", "name": "Reset", "func": "// Set constants\nconst states = global.get('homeassistant.homeAssistant.states')\nconst currentSceneBasement = flow.get('currentSceneBasement')\nconst currentSceneLivingRoom = flow.get('currentSceneLivingRoom')\nconst currentSceneTinaDesk = flow.get('currentSceneTinaDesk')\nconst adaptLivingRoom = flow.get('adaptLivingRoom')\nconst adaptBasement = flow.get('adaptBasement')\nconst nightLivingRoom = flow.get('nightLivingRoom')\nconst nightBasement = flow.get('nightBasement')\nconst stateTinaDesk = flow.get('stateTinaDesk')\nconst stateLivingRoom = flow.get('stateLivingRoom')\nconst stateDiningRoom = flow.get('stateDiningRoom')\nconst stateBasement = flow.get('stateBasement')\nconst scenesLivingRoom = states[\"input_select.living_room_scenes\"].attributes.options\nconst scenesBasement = states[\"input_select.basement_studio_scenes\"].attributes.options\nconst scenesTinaDesk = states[\"input_select.tina_desk_scenes\"].attributes.options\n\nconst definedLivingRoom = scenesLivingRoom.includes(currentSceneLivingRoom)\nconst definedBasement = scenesBasement.includes(currentSceneBasement)\nconst definedTinaDesk = scenesTinaDesk.includes(currentSceneTinaDesk)\n\nlet sendDebug = {\n \"scenesLivingRoom\": scenesLivingRoom,\n \"scenesBasement\": scenesBasement,\n \"scenesTinaDesk\": scenesTinaDesk,\n \"definedLivingRoom\": definedLivingRoom,\n \"definedBasement\": definedBasement,\n \"definedTinaDesk\": definedTinaDesk\n}\n\nnode.send([sendDebug,null,null,null])\nnode.status({fill:\"green\",shape:\"dot\",text:\"Success\"})", "outputs": 4, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 410, "y": 420, "wires": [ [ "f41a46f3aa27ac1b" ], [], [], [] ], "outputLabels": [ "Living Room", "Tina Desk", "Dining Room", "Basement" ], "icon": "node-red-contrib-actionflows/loopflow.png" }, { "id": "fa1e1b2739ff28f5", "type": "debug", "z": "ce9c810396e540b6", "name": "Living Room", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 850, "y": 220, "wires": [] }, { "id": "a13dc6bbcb45602a", "type": "debug", "z": "ce9c810396e540b6", "name": "Dining Room", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 850, "y": 340, "wires": [] }, { "id": "9f459560dbd5c755", "type": "debug", "z": "ce9c810396e540b6", "name": "Tina Desk", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 840, "y": 280, "wires": [] }, { "id": "a7d31fef8f77efe8", "type": "debug", "z": "ce9c810396e540b6", "name": "Backup", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 840, "y": 160, "wires": [] }, { "id": "f41a46f3aa27ac1b", "type": "debug", "z": "ce9c810396e540b6", "name": "Temp Debug", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 670, "y": 460, "wires": [] }, { "id": "7611921cadb91b1e", "type": "api-call-service", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Lamp Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "light.dining_room_lamp" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 760, "y": 220, "wires": [ [ "8b53b9f4d5ba0bf0" ] ] }, { "id": "3a29cecbefa6cbe2", "type": "api-call-service", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Reset Living Room", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.living_room_scenes" ], "data": "{\t \"option\":\"Adaptive\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 930, "y": 300, "wires": [ [ "ed2e0f4f214ad76c" ] ] }, { "id": "4a2031f363418db1", "type": "api-call-service", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Set Scene", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.living_room_scenes" ], "data": "{\t \"option\": msg.huescene\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1130, "y": 180, "wires": [ [] ] }, { "id": "984386fa0a6369d6", "type": "server-state-changed", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Living Room TV Current App", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "sensor.living_room_tv_current_app", "entityIdType": "exact", "outputInitially": true, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "toggle", "propertyType": "msg", "value": "appmode", "valueType": "str" } ], "x": 180, "y": 100, "wires": [ [ "0beae13503166379" ] ] }, { "id": "0beae13503166379", "type": "function", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Processing", "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 toggle = msg.toggle\nvar payload = {}\n\nif (toggle === 'appmode' || toggle === 'on') {\n if (appList.includes(app)) {\n flow.set(\"lampState\", lampState)\n payload = \"start\"\n } else {\n payload = \"stop\"\n }\n} else if (toggle === 'off') {\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, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 410, "y": 100, "wires": [ [ "6c77ade442a47a30" ], [ "6392f2f0586d988a" ] ], "outputLabels": [ "Start", "Stop" ], "icon": "node-red-contrib-cpu/cpu.png" }, { "id": "6c77ade442a47a30", "type": "api-call-service", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Entertainment Mode On", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.living_room_entertainment_mode" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 630, "y": 60, "wires": [ [] ] }, { "id": "6392f2f0586d988a", "type": "api-call-service", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Entertainment Mode Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.living_room_entertainment_mode" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 630, "y": 120, "wires": [ [] ] }, { "id": "e505e9f24bf919dd", "type": "server-state-changed", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Entertainment Mode State", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_boolean.living_room_entertainment_mode", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "alert", "propertyType": "msg", "value": "off", "valueType": "str" } ], "x": 170, "y": 220, "wires": [ [ "346379575efad516" ] ], "outputLabels": [ "On" ] }, { "id": "9efd5346a1ca1972", "type": "server-state-changed", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Detect Pause", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "media_player.living_room_tv", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "seconds", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 130, "y": 380, "wires": [ [ "f463df7e17e045e9" ] ], "outputLabels": [ "paused", "playing" ] }, { "id": "8b53b9f4d5ba0bf0", "type": "api-call-service", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Dynamic On", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.living_room_dynamic_scenes" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 950, "y": 200, "wires": [ [ "4a2031f363418db1", "d2390789a8b3101a" ] ] }, { "id": "cc8f6ab710549be2", "type": "stoptimer", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "duration": "15", "units": "Second", "payloadtype": "num", "payloadval": "0", "name": "", "x": 550, "y": 420, "wires": [ [ "7cb8056b3b41a9e8" ], [] ] }, { "id": "346379575efad516", "type": "function", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Processing", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar allowed = states['input_boolean.living_room_entertainment_control'].state\nvar active = states['input_boolean.living_room_entertainment_mode'].state\nvar currentApp = global.get('tvAppLivingRoom');\nvar lights = states['light.living_room_lights'].state\nvar selectedScene = states['input_text.living_room_selected_scene'].state\nvar lamp = flow.get(\"lampState\")\nvar alert = msg.alert\nvar payload = msg.payload\n\nif (currentApp === 'YouTube' || currentApp === 'Jellyfin') {\n var hueScene = 'Tokyo'\n var lifxScene = 'intense'\n} else if (currentApp === 'Twitch') {\n var hueScene = 'Twitch'\n var lifxScene = 'party'\n} else if (currentApp === 'Hulu') {\n var hueScene = 'Forest Adventure'\n var lifxScene = 'relaxing'\n} else if (currentApp === 'Netflix') {\n var hueScene = 'Netflix'\n var lifxScene = 'love'\n} else if (currentApp === 'MLB') {\n var hueScene = 'MLB'\n var lifxScene = 'independence'\n}\n\nmsg.huescene = hueScene\nmsg.lifxscene = lifxScene\n\nif (allowed === 'on' && lights === 'on') {\n if (payload === 'on') {\n if (selectedScene != hueScene) {\n node.status({fill:\"green\",shape:\"dot\",text:\"On\"});\n return[msg,null,null]\n } else if (alert === 'on' && active === 'on') {\n node.status({fill:\"green\",shape:\"dot\",text:\"On (Alert Resume)\"});\n return[msg,null,null]\n } else if (selectedScene === hueScene) {\n node.status({fill:\"yellow\",shape:\"ring\",text:\"Scene already set\"});\n return null\n }\n } else if (payload === 'off') {\n if (lamp === 'on') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Off\"});\n return[null,msg,msg]\n } else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Off\"});\n return[null,msg,null]\n }\n }\n} else {\n node.status({fill:\"grey\",shape:\"dot\",text:\"Blocked\"});\n return null\n}", "outputs": 3, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 390, "y": 220, "wires": [ [ "107f2c88924975fe" ], [ "3a29cecbefa6cbe2" ], [ "d09061428e9c694d" ] ], "outputLabels": [ "On", "Off (Living Room)", "Off (Dining Room)" ], "icon": "node-red-contrib-cpu/cpu.png" }, { "id": "8b0b39deb5142557", "type": "function", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Processing", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar allowed = states['input_boolean.living_room_entertainment_control'].state\nvar lights = states['light.living_room_lights'].state\nvar active = states['input_boolean.living_room_entertainment_mode'].state\nvar selectedScene = states['input_text.living_room_selected_scene'].state\nvar payload = msg.payload\nvar stopMsg = {\n \"payload\":\"stop\"\n}\nvar resumeMsg = {\n \"payload\":\"on\"\n}\n\nif (allowed === 'on' && lights === 'on') {\n if (payload === 'paused') {\n node.status({fill:\"blue\",shape:\"dot\",text:\"Paused\"});\n return [null,msg,null]\n } else if (payload === 'playing') {\n if (allowed === 'on' && lights === 'on' && active === 'on') {\n node.status({ fill: \"green\", shape: \"dot\", text: \"Playing\" });\n return[resumeMsg,null,stopMsg]\n } else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Blocked\"});\n return[null,null,stopMsg]\n }\n } else {\n node.status({fill:\"grey\",shape:\"dot\",text:\"Timer Stopped\"});\n return[null,null,stopMsg]\n }\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Blocked\"});\n return null\n}", "outputs": 3, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 350, "y": 380, "wires": [ [ "346379575efad516" ], [ "cc8f6ab710549be2" ], [ "cc8f6ab710549be2" ] ], "outputLabels": [ "Playing", "Paused", "Stop Timer" ], "icon": "node-red-contrib-cpu/cpu.png" }, { "id": "7cb8056b3b41a9e8", "type": "function", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Check", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar active = states['input_boolean.living_room_entertainment_mode'].state\nvar lights = states['light.living_room_lights'].state\nvar lamp = flow.get('lampState')\n\nif (active === 'on' && lights === 'on') {\n if (lamp === 'on') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Sent (Both)\"});\n return[msg,msg]\n } else {\n node.status({fill:\"green\",shape:\"dot\",text:\"Sent (Living Room)\"});\n return[msg,null]\n }\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Blocked\"});\n return null\n}", "outputs": 2, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 730, "y": 420, "wires": [ [ "3a29cecbefa6cbe2" ], [ "d09061428e9c694d" ] ], "outputLabels": [ "Living Room", "Dining Room" ], "icon": "font-awesome/fa-check" }, { "id": "d2390789a8b3101a", "type": "api-call-service", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "LIFX", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "lifx", "service": "effect_move", "areaId": [], "deviceId": [], "entityId": [ "light.living_room_led_strip" ], "data": "{\t \"speed\": 8,\t \"direction\": \"right\",\t \"theme\": msg.lifxscene,\t \"power_on\": \"true\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1110, "y": 240, "wires": [ [] ] }, { "id": "d961ffeaea408909", "type": "api-call-service", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "LIFX Stop", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "lifx", "service": "effect_stop", "areaId": [], "deviceId": [], "entityId": [ "light.living_room_led_strip" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1180, "y": 300, "wires": [ [] ] }, { "id": "107f2c88924975fe", "type": "api-call-service", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Adaptive Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "switch.adaptive_lighting_dining_room_lamp", "switch.adaptive_lighting_living_room" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 590, "y": 220, "wires": [ [ "7611921cadb91b1e" ] ] }, { "id": "ed2e0f4f214ad76c", "type": "delay", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "", "pauseType": "delay", "timeout": "5", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 1075, "y": 300, "wires": [ [ "d961ffeaea408909" ] ], "l": false }, { "id": "d09061428e9c694d", "type": "api-call-service", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Turn On Lamp", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "light.dining_room_lamp" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 920, "y": 360, "wires": [ [] ] }, { "id": "6110b45c374a5b7f", "type": "function", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Settings", "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, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 300, "y": 480, "wires": [] }, { "id": "e5af55b177f37c65", "type": "inject", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Update", "props": [ { "p": "payload" } ], "repeat": "3600", "crontab": "", "once": true, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 140, "y": 480, "wires": [ [ "6110b45c374a5b7f" ] ] }, { "id": "496fafb580e8af1b", "type": "api-call-service", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Reset Lights", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.basement_studio_scenes" ], "data": "{\t \"option\":\"Adaptive\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 910, "y": 820, "wires": [ [ "99fccb06d0ae097b" ] ] }, { "id": "6253b68980f8bbca", "type": "api-call-service", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Set Scene", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.basement_studio_scenes" ], "data": "{\t \"option\": msg.huescene\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1130, "y": 700, "wires": [ [] ] }, { "id": "19907ff0b6cef449", "type": "server-state-changed", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Basement TV Current App", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "sensor.basement_tv_current_app", "entityIdType": "exact", "outputInitially": true, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 170, "y": 620, "wires": [ [ "98d5f1fa7001b848" ] ] }, { "id": "98d5f1fa7001b848", "type": "function", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Processing", "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": "", "finalize": "", "libs": [], "x": 410, "y": 620, "wires": [ [ "8535d555f858eb5c" ], [ "d2d07f8ee20733d0" ] ], "outputLabels": [ "Start", "Stop" ], "icon": "node-red-contrib-cpu/cpu.png" }, { "id": "8535d555f858eb5c", "type": "api-call-service", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Entertainment Mode On", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.basement_studio_entertainment_mode" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 630, "y": 580, "wires": [ [] ] }, { "id": "d2d07f8ee20733d0", "type": "api-call-service", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Entertainment Mode Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.basement_studio_entertainment_mode" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 630, "y": 640, "wires": [ [] ] }, { "id": "7d266754621825e7", "type": "server-state-changed", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Entertainment Mode State", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_boolean.basement_studio_entertainment_mode", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "alert", "propertyType": "msg", "value": "off", "valueType": "str" } ], "x": 170, "y": 740, "wires": [ [ "cb285727507f50da" ] ], "outputLabels": [ "On" ] }, { "id": "d41365c49024c8eb", "type": "server-state-changed", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Detect Pause", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "media_player.basement_tv", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "seconds", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 130, "y": 900, "wires": [ [ "cb68f561b5023b31" ] ], "outputLabels": [ "paused" ] }, { "id": "c71a9ea311a86b7f", "type": "api-call-service", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Dynamic On", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.basement_studio_dynamic_scenes" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 950, "y": 720, "wires": [ [ "6253b68980f8bbca", "65aaba2528dfde3d" ] ] }, { "id": "5d582639d1f6a501", "type": "stoptimer", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "duration": "15", "units": "Second", "payloadtype": "num", "payloadval": "0", "name": "", "x": 550, "y": 940, "wires": [ [ "50b997d6e5680e6e" ], [] ] }, { "id": "cb285727507f50da", "type": "function", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Processing", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar allowed = states['input_boolean.basement_studio_entertainment_control'].state\nvar active = states['input_boolean.basement_studio_entertainment_mode'].state\nvar quiet = states['input_boolean.studio_quiet'].state\nvar recliner = states['input_boolean.recliner_mode'].state\nvar currentApp = global.get('tvAppBasement');\nvar lights = states['light.basement_studio_lights'].state\nvar selectedScene = states['input_text.basement_studio_selected_scene'].state\nvar alert = msg.alert\nvar payload = msg.payload\nvar proceed = {}\n\nif (currentApp === 'YouTube' || currentApp === 'Jellyfin' || currentApp === 'Google Cast') {\n var hueScene = 'Tokyo'\n var lifxScene = 'intense'\n} else if (currentApp === 'Twitch') {\n var hueScene = 'Twitch'\n var lifxScene = 'party'\n} else if (currentApp === 'Hulu') {\n var hueScene = 'Forest Adventure'\n var lifxScene = 'relaxing'\n} else if (currentApp === 'Netflix') {\n var hueScene = 'Netflix'\n var lifxScene = 'love'\n} else if (currentApp === 'MLB') {\n var hueScene = 'MLB'\n var lifxScene = 'independence'\n}\n\nif (allowed === 'on' && lights === 'on' && quiet === 'off' && recliner === 'off') {\n proceed = 'true'\n} else {\n proceed = 'false'\n}\n\nmsg.huescene = hueScene\nmsg.lifxscene = lifxScene\n\nif (proceed === 'true') {\n if (payload === 'on') {\n if (selectedScene != hueScene) {\n node.status({fill:\"green\",shape:\"dot\",text:\"On\"});\n return[msg,null]\n } else if (alert === 'on' && active === 'on') {\n node.status({fill:\"green\",shape:\"dot\",text:\"On (Alert Resume)\"});\n return[msg,null]\n } else if (selectedScene === hueScene) {\n node.status({fill:\"yellow\",shape:\"ring\",text:\"Scene already set\"});\n return null\n }\n } else if (payload === 'off') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Off\"});\n return[null,msg]\n }\n} else {\n node.status({fill:\"grey\",shape:\"dot\",text:\"Blocked\"});\n return null\n}", "outputs": 2, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 390, "y": 740, "wires": [ [ "5ff13862fb36f90e" ], [ "496fafb580e8af1b" ] ], "outputLabels": [ "On", "Off" ], "icon": "node-red-contrib-cpu/cpu.png" }, { "id": "2a8f44429acdd1ea", "type": "function", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Processing", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar allowed = states['input_boolean.basement_studio_entertainment_control'].state\nvar lights = states['light.basement_studio_lights'].state\nvar active = states['input_boolean.basement_studio_entertainment_mode'].state\nvar selectedScene = states['input_text.basement_studio_selected_scene'].state\nvar app = global.get(\"tvAppBasement\");\nvar payload = msg.payload\nvar stopMsg = {\n \"payload\":\"stop\"\n}\nvar resumeMsg = {\n \"payload\":\"on\"\n}\n\nif (allowed === 'on' && lights === 'on' && app != 'TV') {\n if (payload === 'paused') {\n node.status({fill:\"blue\",shape:\"dot\",text:\"Paused\"});\n return [null,msg,null]\n } else if (payload === 'playing') {\n if (allowed === 'on' && lights === 'on' && active === 'on') {\n node.status({ fill: \"green\", shape: \"dot\", text: \"Playing\" });\n return[resumeMsg,null,stopMsg]\n } else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Blocked\"});\n return[null,null,stopMsg]\n }\n } else {\n node.status({fill:\"grey\",shape:\"dot\",text:\"Timer Stopped\"});\n return[null,null,stopMsg]\n }\n} else if (app === 'TV') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Blocked (TV)\"});\n return null\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Blocked\"});\n return null\n}", "outputs": 3, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 350, "y": 900, "wires": [ [ "cb285727507f50da" ], [ "5d582639d1f6a501" ], [ "5d582639d1f6a501" ] ], "outputLabels": [ "Playing", "Paused", "Stop Timer" ], "icon": "node-red-contrib-cpu/cpu.png" }, { "id": "50b997d6e5680e6e", "type": "function", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Check", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar active = states['input_boolean.basement_studio_entertainment_mode'].state\nvar lights = states['light.basement_studio_lights'].state\n\nif (active === 'on' && lights === 'on') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Sent\"});\n return msg\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Blocked\"});\n return null\n}", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 730, "y": 940, "wires": [ [ "496fafb580e8af1b" ] ], "outputLabels": [ "Living Room" ], "icon": "font-awesome/fa-check" }, { "id": "65aaba2528dfde3d", "type": "api-call-service", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "LIFX", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "lifx", "service": "effect_move", "areaId": [], "deviceId": [], "entityId": [ "light.basement_led_strip_1" ], "data": "{\t \"speed\": 8,\t \"direction\": \"right\",\t \"theme\": msg.lifxscene,\t \"power_on\": \"true\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1110, "y": 760, "wires": [ [] ] }, { "id": "55962141df8ef164", "type": "api-call-service", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "LIFX Stop", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "lifx", "service": "effect_stop", "areaId": [], "deviceId": [], "entityId": [ "light.basement_led_strip_1" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1140, "y": 820, "wires": [ [] ] }, { "id": "5ff13862fb36f90e", "type": "api-call-service", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Adaptive Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "switch.adaptive_lighting_basement_studio" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 590, "y": 740, "wires": [ [ "c71a9ea311a86b7f" ] ] }, { "id": "99fccb06d0ae097b", "type": "delay", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "", "pauseType": "delay", "timeout": "5", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 1025, "y": 820, "wires": [ [ "55962141df8ef164" ] ], "l": false }, { "id": "f3efe80c6ffa4522", "type": "function", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Settings", "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": "", "finalize": "", "libs": [], "x": 300, "y": 1000, "wires": [] }, { "id": "74d645f646c713d2", "type": "inject", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Update", "props": [ { "p": "payload" } ], "repeat": "3600", "crontab": "", "once": true, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 140, "y": 1000, "wires": [ [ "f3efe80c6ffa4522" ] ] }, { "id": "cb68f561b5023b31", "type": "delay", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "", "pauseType": "delay", "timeout": "1", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 235, "y": 900, "wires": [ [ "2a8f44429acdd1ea" ] ], "l": false }, { "id": "27b2c22907382e6d", "type": "link in", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Media Scenes Input - Living Room", "links": [ "e23e7b080ee3773f", "a586df67c15b0914" ], "x": 265, "y": 280, "wires": [ [ "346379575efad516" ] ] }, { "id": "f111c40459e27629", "type": "comment", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Figure out why alerts aren't resetting to media scenes properly", "info": "", "x": 1060, "y": 440, "wires": [] }, { "id": "8146f43fea5aec03", "type": "link in", "z": "b0286fae9f2ce547", "g": "1cc8b382530c33d0", "name": "Media Scenes Input - Basement", "links": [ "e23e7b080ee3773f", "a586df67c15b0914" ], "x": 265, "y": 800, "wires": [ [ "cb285727507f50da" ] ] }, { "id": "33903d3f8f53dadd", "type": "server-state-changed", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "Media Scenes Toggle", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_boolean.living_room_entertainment_control", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "tvAppLivingRoom", "valueType": "global" }, { "property": "toggle", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 200, "y": 160, "wires": [ [ "0beae13503166379" ] ] }, { "id": "f463df7e17e045e9", "type": "delay", "z": "b0286fae9f2ce547", "d": true, "g": "ff6d8150e8d5e606", "name": "", "pauseType": "delay", "timeout": "1", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 235, "y": 380, "wires": [ [ "8b0b39deb5142557" ] ], "l": false }, { "id": "b4dbbf788c5a30d2", "type": "subflow:6429099c4571dd6b", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "", "x": 780, "y": 1200, "wires": [ [] ] }, { "id": "1aa901d26ce8ac46", "type": "ha-button", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "MB Night Mode", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "be9ed28696adcdb0", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "type", "propertyType": "msg", "value": "manual", "valueType": "str" }, { "property": "time", "propertyType": "msg", "value": "night", "valueType": "str" }, { "property": "topic", "propertyType": "msg", "value": "manual-night", "valueType": "str" } ], "x": 200, "y": 360, "wires": [ [ "a10629857d60f774" ] ] }, { "id": "21001f5409130f44", "type": "ha-button", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "MB Day Mode", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "59cb8692ed7accd1", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "time", "propertyType": "msg", "value": "day", "valueType": "str" }, { "property": "type", "propertyType": "msg", "value": "manual", "valueType": "str" }, { "property": "topic", "propertyType": "msg", "value": "manual-day", "valueType": "str" } ], "x": 210, "y": 420, "wires": [ [ "a10629857d60f774" ] ] }, { "id": "1f7ac875e593d434", "type": "ha-button", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "MB Bedtime Mode", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "9c63750f16f845ea", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "manual-bedtime", "valueType": "str" }, { "property": "time", "propertyType": "msg", "value": "bedtime", "valueType": "str" }, { "property": "type", "propertyType": "msg", "value": "manual", "valueType": "str" } ], "x": 190, "y": 120, "wires": [ [ "a10629857d60f774" ] ] }, { "id": "bc592ba259667f9d", "type": "link in", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Master Bedroom Climate - Input", "links": [ "028351e8c4e2faf5", "5c9c73b7adb72896" ], "x": 265, "y": 540, "wires": [ [ "a10629857d60f774" ] ] }, { "id": "7a7f626dce181b23", "type": "link in", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Shower Mode - Climate", "links": [ "31b8c8291d19ffc6" ], "x": 125, "y": 660, "wires": [ [ "ce5d8005cbf08144" ] ] }, { "id": "f541ad53e32f703b", "type": "api-call-service", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Set to Dry", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "climate", "service": "set_hvac_mode", "areaId": [], "deviceId": [], "entityId": [ "climate.master_bedroom_aircon" ], "data": "{\t \"hvac_mode\":\"dry\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 540, "y": 620, "wires": [ [ "66e85878d60c7d65" ] ] }, { "id": "66e85878d60c7d65", "type": "api-call-service", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Eco Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "climate", "service": "set_preset_mode", "areaId": [], "deviceId": [], "entityId": [ "climate.master_bedroom_aircon" ], "data": "{\t \"preset_mode\":\"none\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 700, "y": 620, "wires": [ [ "bcba065aa5ecb2be" ] ] }, { "id": "bcba065aa5ecb2be", "type": "api-call-service", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Set Temp", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "climate", "service": "set_temperature", "areaId": [], "deviceId": [], "entityId": [ "climate.master_bedroom_aircon" ], "data": "{\t \"temperature\": set\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 860, "y": 620, "wires": [ [] ] }, { "id": "6c06c2eec1583c66", "type": "comment", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Shower Mode", "info": "", "x": 290, "y": 780, "wires": [] }, { "id": "e2581a5f3f4888df", "type": "comment", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Main Flow", "info": "", "x": 540, "y": 220, "wires": [] }, { "id": "1dfb0bcc98f1457b", "type": "api-call-service", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Set to Fan", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "climate", "service": "set_hvac_mode", "areaId": [], "deviceId": [], "entityId": [ "climate.master_bedroom_aircon" ], "data": "{\t \"hvac_mode\":\"fan_only\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1010, "y": 740, "wires": [ [ "096369136e9e607f" ] ] }, { "id": "096369136e9e607f", "type": "api-call-service", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Eco Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "climate", "service": "set_preset_mode", "areaId": [], "deviceId": [], "entityId": [ "climate.master_bedroom_aircon" ], "data": "{\t \"preset_mode\":\"none\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1180, "y": 740, "wires": [ [] ] }, { "id": "783cfb381b70afc5", "type": "ha-button", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "A/C Fan Only", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "d3f8c4466cc1deeb", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 830, "y": 740, "wires": [ [ "1dfb0bcc98f1457b" ] ] }, { "id": "57651381835f659c", "type": "api-current-state", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "School Today?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "input_boolean.kallen_school_today", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "school_today", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 700, "y": 1000, "wires": [ [ "62211bf089bc5b04", "7c483301056c67a9" ], [ "f1dbb3a206dba921" ] ] }, { "id": "acb52adc50d34045", "type": "api-call-service", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Lights On", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "light.kallen_bedroom_lights" ], "data": "{\t \"brightness_pct\": brightness,\t \"transition\": fade\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1240, "y": 1000, "wires": [ [ "7b390a3b24fc3197" ] ] }, { "id": "1eb13d819ba7e226", "type": "api-call-service", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "iOS Notifications", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "text_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"who\":\"parents\",\t \"title\": topic,\t \"message\": payload,\t \"type\": \"normal\",\t \"tag\": \"master-bedroom-climate\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 940, "y": 360, "wires": [ [] ] }, { "id": "d6b56cb65c2ff140", "type": "api-call-service", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Toggle Boolean", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_{{toggle}}", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.kallen_sleeping" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 700, "y": 880, "wires": [ [] ] }, { "id": "e32aaeb51d3f2e95", "type": "server-state-changed", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Boolean State", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_boolean.kallen_sleeping", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": true, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "toggle", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "boolean", "valueType": "str" } ], "x": 110, "y": 1060, "wires": [ [ "61405a43f61f3d60" ] ] }, { "id": "a10629857d60f774", "type": "function", "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', \"diskCon\")\nconst temp = global.get(\"tempStr\")\nconst payload = msg.payload\nconst vacation = states['input_boolean.vacation_mode'].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\nconst echoDotDND = 'switch.basement_echo_dot_do_not_disturb_switch'\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 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 = \"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 (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 = 'none'\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 \"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 sendPeople = {\n \"payload\": {\n \"domain\": \"input_boolean\",\n \"service\": setPeople,\n \"target\": {\n \"entity_id\": [\"input_boolean.tony_awake\",\"input_boolean.tina_awake\"]\n },\n \"data\": {}\n }\n}\n\nlet sendDisplay = {\n \"payload\": {\n \"domain\": \"switch\",\n \"service\": 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 \"domain\": \"script\",\n \"service\": setBriefing\n },\n \"delay\": setBriefingDelay\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}\n\nlet sendEchoDotDND = {\n \"payload\": {\n \"domain\": \"switch\",\n \"service\": 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, sendEco, sendAcFan], 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, sendEco, sendAcFan], 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, sendEco, sendAcFan], 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, sendEco, sendAcFan], 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, sendEco, sendAcFan], 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, sendEco, sendAcFan], 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 === 'night') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Wakeup (Hot Day)\" })\n node.send([null, sendFan, sendEchoDotDND, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Night\")\n if (ac === 'on') {\n node.send([[sendDisplay, 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, sendEchoDotDND, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Day\")\n if (ac === 'on') {\n node.send([[sendDisplay, sendHvac, sendTemp, sendEco, sendAcFan], null, null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Day/AC\")\n }\n if (isWakeup === false) {\n node.send([null, null, null, null, sendBriefing])\n }\n } else 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, sendEco, sendAcFan], null, null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Bedtime/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(\"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, "initialize": "context.set(\"isWakeup\", false)", "finalize": "", "libs": [], "x": 550, "y": 280, "wires": [ [ "cbe37fd5b5fc4381" ], [ "b1c0cca848416d74" ], [ "e914726b0364c6be" ], [ "a8ef744455bb4c0a" ], [ "6bbf7df2c43c481e" ] ], "outputLabels": [ "A/C", "Fan", "Boolean", "Notify", "Briefing" ], "icon": "node-red-contrib-cpu/cpu.png" }, { "id": "a8ef744455bb4c0a", "type": "function", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Notifications", "func": "const topic = msg.topic\nconst nightTemp = msg.nighttemp\nconst acMode = msg.acmode\nconst fanMode = msg.fanmode\n\nlet coolMsg = {\n \"payload\": 'Master bedroom AC temp has been set to ' + nightTemp + '°F as scheduled',\n \"topic\": 'AC Mode: Cooling'\n}\nlet fanOnlyMsg = {\n \"payload\": 'Too cold outside, AC running fan only.',\n \"topic\": \"AC Mode: Fan Only\"\n}\nlet fanSchedMsg = {\n \"payload\": 'Master bedroom fan has been activated as scheduled.',\n \"topic\": 'Fan Schedule Activated'\n}\n\nif (topic === 'mrbedroom-cooling') {\n if (acMode === 'AC') {\n node.status({fill:\"green\",shape:\"dot\",text:\"AC Cooling\"})\n return coolMsg\n } else if (acMode === 'Fan') {\n node.status({fill:\"green\",shape:\"dot\",text:\"AC Fan Only\"})\n return fanOnlyMsg\n }\n} else if (topic === 'mrbedroom-fan' && fanMode === 'Fan') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Fan Schedule\"})\n return fanSchedMsg\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Notification not sent\"})\n return null\n}", "outputs": 1, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 750, "y": 360, "wires": [ [ "1eb13d819ba7e226" ] ] }, { "id": "9c01880c6319d29b", "type": "function", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "On", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar ac = states['input_boolean.master_bedroom_aircon_installed'].state\nvar temp = global.get('tempStr')\nvar threshold = states['input_number.master_bedroom_aircon_run_threshold'].state\nvar nightTemp = states['input_number.master_bedroom_night_temp'].state\nvar bedTemp = states['input_number.master_bedroom_bedtime_temp'].state\nvar sleeping = states['input_boolean.master_bedroom_sleeping'].state\n\nif (ac === 'on') {\n if (temp >= threshold) {\n if (sleeping === 'on') {\n msg.set = bedTemp\n node.status({fill:\"green\",shape:\"dot\",text:\"Shower Mode On: \" + bedTemp});\n return msg\n } else {\n msg.set = nightTemp\n node.status({fill:\"green\",shape:\"dot\",text:\"Shower Mode On: \" + nightTemp});\n return msg\n }\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, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 350, "y": 620, "wires": [ [ "f541ad53e32f703b" ] ], "icon": "node-red/switch.svg" }, { "id": "61405a43f61f3d60", "type": "function", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Processing", "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst vacationMode = states['input_boolean.vacation_mode'].state\nconst overnight = states['input_boolean.kallen_overnight'].state\nconst kallenLoc = states['person.kallen_stork'].state\nconst dayVolume = states['input_number.kallen_bedroom_google_speaker_day_volume'].state\nconst nightVolume = states['input_number.kallen_bedroom_google_speaker_night_volume'].state\nconst brightness = states['switch.adaptive_lighting_kallen_bedroom'].attributes.brightness_pct\nconst fadeNight = states['input_number.wakeup_lights_fade_night'].state\nconst hotDay = states['input_boolean.hot_day'].state\nconst heatWarning = states['binary_sensor.heat_warning'].state\nconst fanSeparate = states['binary_sensor.kallen_fan_separate_schedule'].state\nconst schedMode = states['input_select.scheduled_climate_mode_kallen_fan'].state\nconst topic = msg.topic\nconst toggle = msg.toggle\nnode.log(\"Kallen Bedroom: Constants Set\")\n\nlet setFan = []\nlet setWhiteNoise = []\nlet setVolume = []\nlet setLights = []\nlet setWake = []\nnode.log(\"Kallen Bedroom: Variables Defined\")\n\nif (toggle === 'off' && (hotDay === 'on' || heatWarning === 'on')) {\n setFan = 'turn_on'\n} else if ((toggle === 'on' || topic === 'kallen-fan') && schedMode === 'Fan') {\n setFan = 'turn_on'\n} else {\n setFan = 'turn_off'\n}\n\nif (schedMode === 'White Noise' && toggle === 'on') {\n setWhiteNoise = 'turn_on'\n} else {\n setWhiteNoise = 'turn_off'\n}\n\nif (toggle === 'on') {\n setVolume = parseFloat(nightVolume)\n setLights = 'turn_on'\n setWake = 'turn_off'\n} else {\n setVolume = parseFloat(dayVolume)\n setWake = 'turn_on'\n}\n\nlet fadeMult = fadeNight * 60\nlet fadeFinal = Math.round(fadeMult)\n\nlet brtFinal = Math.round(brightness)\n\nnode.log(\"Kallen Bedroom: Decision Logic Complete\")\n\nlet sendFan = {\n \"payload\": {\n \"domain\": \"fan\",\n \"service\": setFan,\n \"target\": {\n \"entity_id\": [\"fan.kallen_bedroom_fan\"]\n },\n \"data\": {}\n }\n}\n\nlet sendWhiteNoise = {\n \"payload\": {\n \"domain\": \"input_boolean\",\n \"service\": setWhiteNoise,\n \"target\": {\n \"entity_id\": [\"input_boolean.white_noise_kallen_bedroom\"]\n },\n \"data\": {}\n }\n}\n\nlet sendVolume = {\n \"payload\": {\n \"domain\": \"media_player\",\n \"service\": \"volume_set\",\n \"target\": {\n \"entity_id\": [\"media_player.kallen_bedroom_google_speaker\"]\n },\n \"data\": {\n \"volume_level\": setVolume\n }\n }\n}\n\nlet sendLights = {\n \"payload\": {\n \"domain\": \"light\",\n \"service\": setLights,\n \"target\": {\n \"entity_id\": [\"light.kallen_bedroom_lights\"]\n },\n \"data\": {}\n }\n}\n\nlet sendWake = {\n \"payload\": {\n \"domain\": \"input_boolean\",\n \"service\": setWake,\n \"target\": {\n \"entity_id\": [\"input_boolean.kallen_awake\"]\n },\n \"data\": {}\n }\n}\n\nlet wakeMsg = {\n \"brightness\": brtFinal,\n \"fade\": fadeFinal\n}\n\nlet sleepMsg = {\n \"payload\": \"sleep\"\n}\n\nnode.log(\"Kallen Bedroom: Message Payloads Defined\")\n\nnode.log(\"----- Kallen Bedroom: Set Parameters -----\")\nnode.log(\"setFan: \" + setFan)\nnode.log(\"setWhiteNoise: \" + setWhiteNoise)\nnode.log(\"setVolume: \" + setVolume)\nnode.log(\"setLights: \" + setLights)\nnode.log(\"setWake: \" + setWake)\nnode.log(\"----- Kallen Bedroom: End Parameters -----\")\n\nif (vacationMode === 'off' && overnight === 'off' && kallenLoc === 'home') {\n if (topic === 'kallen-fan' && fanSeparate === 'on') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Fan\"})\n node.log(\"Kallen Bedroom: Early Fan\")\n node.send([null,[sendFan,sendWhiteNoise],null])\n } else if (toggle === 'off') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Wakeup\"})\n node.log(\"Kallen Bedroom: Wake\")\n node.send([wakeMsg,[sendFan,sendWhiteNoise,sendVolume,sendWake],null])\n } else if (toggle === 'on') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Sleep\"})\n node.log(\"Kallen Bedroom: Sleep\")\n node.send([null,[sendFan,sendWhiteNoise,sendVolume,sendLights,sendWake],sleepMsg])\n }\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Blocked\"})\n node.log(\"Kallen Bedroom: Flow Blocked\")\n}\n\nnode.log(\"Kallen Bedroom: Processing Complete\")", "outputs": 3, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 450, "y": 1060, "wires": [ [ "17e5f9acd57c2819", "57651381835f659c" ], [ "46a1e386f7468d21" ], [ "7b0648758704fad4", "292cda64df0c1c10" ] ], "outputLabels": [ "wake", "services", "sleep" ] }, { "id": "62211bf089bc5b04", "type": "api-call-service", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Adaptive Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "switch.adaptive_lighting_kallen_bedroom" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1010, "y": 1000, "wires": [ [ "d0dacbae4513b1ad" ] ] }, { "id": "d0dacbae4513b1ad", "type": "delay", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "", "pauseType": "delay", "timeout": "1", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 1135, "y": 1000, "wires": [ [ "acb52adc50d34045" ] ], "l": false }, { "id": "7b390a3b24fc3197", "type": "delay", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "", "pauseType": "delay", "timeout": "5", "timeoutUnits": "minutes", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 1345, "y": 1000, "wires": [ [ "a417e93366843249" ] ], "l": false }, { "id": "a417e93366843249", "type": "api-call-service", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Adaptive On", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.kallen_bedroom_scenes" ], "data": "{\t \"option\":\"Adaptive\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1470, "y": 1000, "wires": [ [] ] }, { "id": "17e5f9acd57c2819", "type": "api-render-template", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "", "server": "9e87348d.9c1c48", "version": 0, "template": "{{ as_timestamp(now()) | timestamp_custom('%H:%M') }}", "resultsLocation": "waketime", "resultsLocationType": "msg", "templateLocation": "", "templateLocationType": "none", "x": 635, "y": 940, "wires": [ [ "a8070806c0f88856" ] ], "l": false }, { "id": "a8070806c0f88856", "type": "api-call-service", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Set Wakeup Time", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_datetime", "service": "set_datetime", "areaId": [], "deviceId": [], "entityId": [ "input_datetime.kallen_awake_at" ], "data": "{\t \"time\": waketime\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 770, "y": 940, "wires": [ [] ] }, { "id": "3937c38bc1bd0ee0", "type": "api-call-service", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Set Sleep Time", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_datetime", "service": "set_datetime", "areaId": [], "deviceId": [], "entityId": [ "input_datetime.kallen_asleep_at" ], "data": "{\t \"time\": sleeptime\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 780, "y": 1140, "wires": [ [] ] }, { "id": "7b0648758704fad4", "type": "api-render-template", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Sleep Time", "server": "9e87348d.9c1c48", "version": 0, "template": "{{ as_timestamp(now()) | timestamp_custom('%H:%M') }}", "resultsLocation": "sleeptime", "resultsLocationType": "msg", "templateLocation": "", "templateLocationType": "none", "x": 635, "y": 1140, "wires": [ [ "3937c38bc1bd0ee0" ] ], "l": false }, { "id": "f1dbb3a206dba921", "type": "api-current-state", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Override", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "input_boolean.kallen_wakeup_override", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "wake_override", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 860, "y": 1020, "wires": [ [ "62211bf089bc5b04" ], [] ] }, { "id": "94c022d2eb71e7d5", "type": "server-events", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Timer Finished", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "", "eventType": "timer.finished", "eventData": "{\"entity_id\":\"timer.shower_mode_cooldown\"}", "waitForRunning": true, "outputProperties": [ { "property": "topic", "propertyType": "msg", "value": "timer", "valueType": "str" }, { "property": "showermode", "propertyType": "msg", "value": "off", "valueType": "str" } ], "x": 120, "y": 720, "wires": [ [ "ce5d8005cbf08144" ] ] }, { "id": "ce5d8005cbf08144", "type": "switch", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "On or Off", "property": "showermode", "propertyType": "msg", "rules": [ { "t": "eq", "v": "on", "vt": "str" }, { "t": "eq", "v": "off", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 255, "y": 660, "wires": [ [ "9c01880c6319d29b" ], [ "7646c6833d5a1df2" ] ], "outputLabels": [ "On", "Off" ], "l": false }, { "id": "7646c6833d5a1df2", "type": "function", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Off", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar ac = states['input_boolean.master_bedroom_aircon_installed'].state\nvar temp = global.get('tempStr')\nvar threshold = states['input_number.master_bedroom_aircon_run_threshold'].state\nvar dayTemp = states['input_number.master_bedroom_daytime_temp'].state\nvar nightTemp = states['input_number.master_bedroom_night_temp'].state\nvar bedTemp = states['input_number.master_bedroom_bedtime_temp'].state\nvar currentSetTemp = states['climate.master_bedroom_aircon'].attributes.temperature\nvar coolingTime = states['input_boolean.master_bedroom_cooling_on'].state\nvar sleeping = states['input_boolean.master_bedroom_sleeping'].state\nvar hotDay = states['input_boolean.hot_day'].state\nvar topic = msg.topic\n\nif (topic === 'toggle') {\n if (hotDay === 'on' || sleeping === 'on') {\n var setTemp = bedTemp\n var ecoMode = 'none'\n } else {\n var setTemp = nightTemp\n var ecoMode = 'eco'\n }\n} else if (topic === 'timer') {\n if (currentSetTemp == bedTemp) {\n var setTemp = nightTemp\n if (hotDay === 'on') {\n var ecoMode = 'none'\n } else {\n var ecoMode = 'eco'\n }\n } else {\n var setTemp = dayTemp\n var ecoMode = 'eco'\n }\n}\n\nif (setTemp == bedTemp) {\n var duration = 3600\n} else if (setTemp == nightTemp && hotDay === 'off') {\n var duration = 3600\n} else {\n var duration = 1800\n}\n\nif (setTemp == dayTemp) {\n var end = true\n if (hotDay === 'off') {\n var hvac = 'off'\n } else {\n var hvac = 'cool'\n }\n} else if (setTemp != bedTemp && coolingTime === 'on') {\n var end = true\n var hvac = 'cool'\n} else {\n var end = false\n var hvac = 'cool'\n}\n\nvar setMsg = {\n \"set\": setTemp,\n \"eco\": ecoMode,\n \"hvac\": hvac,\n \"end\": end\n}\n\nvar timerStart = {\n \"duration\": duration\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 [setMsg, null]\n } else {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Next Cycle\" });\n return [setMsg, 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, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 350, "y": 700, "wires": [ [ "01c0448b4889d754" ], [ "8286284fc9598efa" ] ], "outputLabels": [ "Set", "Timer" ] }, { "id": "01c0448b4889d754", "type": "api-call-service", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "HVAC", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "climate", "service": "set_hvac_mode", "areaId": [], "deviceId": [], "entityId": [ "climate.master_bedroom_aircon" ], "data": "{\t \"hvac_mode\": hvac\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 530, "y": 680, "wires": [ [ "17b6f73d75f480fd" ] ] }, { "id": "17b6f73d75f480fd", "type": "api-call-service", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Eco", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "climate", "service": "set_preset_mode", "areaId": [], "deviceId": [], "entityId": [ "climate.master_bedroom_aircon" ], "data": "{\t \"preset_mode\": eco\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 690, "y": 680, "wires": [ [ "7852593ec89f150a" ] ] }, { "id": "7852593ec89f150a", "type": "api-call-service", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Set Temp", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "climate", "service": "set_temperature", "areaId": [], "deviceId": [], "entityId": [ "climate.master_bedroom_aircon" ], "data": "{\t \"temperature\": set\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 860, "y": 680, "wires": [ [] ] }, { "id": "8286284fc9598efa", "type": "api-call-service", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Start Timer", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "timer", "service": "start", "areaId": [], "deviceId": [], "entityId": [ "timer.shower_mode_cooldown" ], "data": "{\t \"duration\": duration\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 550, "y": 740, "wires": [ [] ] }, { "id": "cbe37fd5b5fc4381", "type": "api-call-service", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "AC Settings", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "", "service": "", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 750, "y": 180, "wires": [ [] ] }, { "id": "5def5d2440e767b3", "type": "server-state-changed", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Meltdown Protocol", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_boolean.meltdown_protocol", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "danger", "propertyType": "flow", "value": "", "valueType": "entityState" } ], "x": 190, "y": 60, "wires": [ [ "d153c7a7f050ce84" ] ] }, { "id": "d153c7a7f050ce84", "type": "function", "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', \"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": "", "finalize": "", "libs": [], "x": 410, "y": 60, "wires": [ [ "cbe37fd5b5fc4381" ], [ "b1c0cca848416d74" ], [ "92ce51a81f7bc58d" ] ], "outputLabels": [ "On (AC)", "On (Fan)", "Off" ], "icon": "node-red-contrib-huemagic/hue-temperature.svg" }, { "id": "b1c0cca848416d74", "type": "api-call-service", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Fan Settings", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "", "service": "", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 750, "y": 240, "wires": [ [] ] }, { "id": "73c2d06e9114a0f6", "type": "server-state-changed", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Sleep Switch", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_boolean.master_bedroom_sleeping", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": true, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "type", "propertyType": "msg", "value": "sleep", "valueType": "str" } ], "x": 210, "y": 480, "wires": [ [ "a10629857d60f774" ] ] }, { "id": "e914726b0364c6be", "type": "api-call-service", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Bool Settings", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "", "service": "", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 750, "y": 300, "wires": [ [] ] }, { "id": "d613dbf3643d1d4a", "type": "function", "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 === 'on') {\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": "", "finalize": "", "libs": [], "x": 1160, "y": 160, "wires": [] }, { "id": "9014f9e42a6b7c54", "type": "inject", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "", "props": [ { "p": "payload" } ], "repeat": "300", "crontab": "", "once": true, "onceDelay": "60", "topic": "", "payload": "", "payloadType": "date", "x": 1045, "y": 100, "wires": [ [ "d613dbf3643d1d4a" ] ], "l": false }, { "id": "abd1783e6054329c", "type": "complete", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "", "scope": [ "a10629857d60f774", "ce5d8005cbf08144", "5def5d2440e767b3", "73c2d06e9114a0f6" ], "uncaught": false, "x": 990, "y": 220, "wires": [ [ "d613dbf3643d1d4a" ] ] }, { "id": "6a731b17c05f0496", "type": "server-state-changed", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Monitor Entities", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": [ "input_boolean.give_me_darkness", "input_boolean.master_bedroom_sleeping", "binary_sensor.early_night_mode", "input_boolean.night_mode", "input_boolean.goodnight", "input_boolean.master_bedroom_cooling_on" ], "entityIdType": "list", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 980, "y": 160, "wires": [ [ "d613dbf3643d1d4a" ] ] }, { "id": "86c9f3a3185215fc", "type": "ha-button", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Reset", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "77c0d6f8dd47a65b", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "reset", "valueType": "str" } ], "x": 410, "y": 480, "wires": [ [ "b7ac7e6a2ad9f5df" ] ] }, { "id": "b7ac7e6a2ad9f5df", "type": "link call", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Reset", "links": [ "ade887c45bde00f1" ], "linkType": "static", "timeout": "30", "x": 505, "y": 480, "wires": [ [ "a10629857d60f774" ] ], "l": false }, { "id": "d6c81a79393be92c", "type": "function", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Reset", "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, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 755, "y": 520, "wires": [ [ "88b10efda9e2c047" ] ], "l": false }, { "id": "ade887c45bde00f1", "type": "link in", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "MB Climate Reset - In", "links": [], "x": 695, "y": 520, "wires": [ [ "d6c81a79393be92c" ] ] }, { "id": "88b10efda9e2c047", "type": "link out", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "MB Climate Reset - Out", "mode": "return", "links": [], "x": 815, "y": 520, "wires": [] }, { "id": "92ce51a81f7bc58d", "type": "link call", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "", "links": [ "ade887c45bde00f1" ], "linkType": "static", "timeout": "30", "x": 415, "y": 180, "wires": [ [ "a10629857d60f774" ] ], "l": false }, { "id": "f950918e12591224", "type": "comment", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Control AC front panel lights", "info": "", "x": 760, "y": 80, "wires": [] }, { "id": "476f73cf6b540f96", "type": "function", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Allowed?", "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst vacationMode = states['input_boolean.vacation_mode'].state\nconst overnight = states['input_boolean.kallen_overnight'].state\nconst kallenLoc = states['person.kallen_stork'].state\n\nif (vacationMode === 'off' && overnight === 'off' && kallenLoc === 'home') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Proceed\"})\n node.log(\"Kallen climate flow allowed to proceed\")\n node.send(msg)\n}", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 400, "y": 880, "wires": [ [ "d6b56cb65c2ff140" ] ] }, { "id": "46a1e386f7468d21", "type": "api-call-service", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Service Calls", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "", "service": "", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 690, "y": 1080, "wires": [ [] ] }, { "id": "292cda64df0c1c10", "type": "api-render-template", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Speech", "server": "9e87348d.9c1c48", "version": 0, "template": "{% from 'speech.jinja' import kallenSleepMsg %}\n{{ kallenSleepMsg() }}", "resultsLocation": "payload", "resultsLocationType": "msg", "templateLocation": "", "templateLocationType": "none", "x": 635, "y": 1200, "wires": [ [ "b4dbbf788c5a30d2" ] ], "l": false }, { "id": "a2c9a6a52d4d2591", "type": "api-call-service", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Downstairs Lights", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "light.living_room_lights", "light.mud_room_overhead" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1210, "y": 940, "wires": [ [] ] }, { "id": "7c483301056c67a9", "type": "api-call-service", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Cancel Timer", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "timer", "service": "cancel", "areaId": [], "deviceId": [], "entityId": [ "timer.living_room_motion_timer" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1010, "y": 940, "wires": [ [ "a2c9a6a52d4d2591" ] ] }, { "id": "08335765e8c7eac0", "type": "ha-time", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Master Bedroom Cooling", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "8e399b2a287a0905", "entityId": "input_datetime.master_bedroom_cooling", "property": "", "offset": "0", "offsetType": "num", "offsetUnits": "minutes", "randomOffset": false, "repeatDaily": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "time", "propertyType": "msg", "value": "night", "valueType": "str" }, { "property": "type", "propertyType": "msg", "value": "auto", "valueType": "str" }, { "property": "topic", "propertyType": "msg", "value": "mrbedroom-cooling", "valueType": "str" } ], "sunday": true, "monday": true, "tuesday": true, "wednesday": true, "thursday": true, "friday": true, "saturday": true, "x": 170, "y": 180, "wires": [ [ "a10629857d60f774" ] ] }, { "id": "b5cfb253dc157cc9", "type": "ha-time", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Master Bedroom Fan", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "314752dbc6fd170d", "entityId": "input_datetime.master_bedroom_fan", "property": "", "offset": "0", "offsetType": "num", "offsetUnits": "minutes", "randomOffset": false, "repeatDaily": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "time", "propertyType": "msg", "value": "night", "valueType": "str" }, { "property": "type", "propertyType": "msg", "value": "auto", "valueType": "str" }, { "property": "topic", "propertyType": "msg", "value": "mrbedroom-fan", "valueType": "str" } ], "sunday": true, "monday": true, "tuesday": true, "wednesday": true, "thursday": true, "friday": true, "saturday": true, "x": 180, "y": 240, "wires": [ [ "a10629857d60f774" ] ] }, { "id": "6fb6d8041e1a4cad", "type": "ha-time", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Master Bedroom Wakeup", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "d7261338e6b907f1", "entityId": "input_datetime.master_bedroom_wakeup", "property": "", "offset": "0", "offsetType": "num", "offsetUnits": "minutes", "randomOffset": false, "repeatDaily": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "time", "propertyType": "msg", "value": "day", "valueType": "str" }, { "property": "type", "propertyType": "msg", "value": "auto", "valueType": "str" }, { "property": "topic", "propertyType": "msg", "value": "mrbedroom-wakeup", "valueType": "str" } ], "sunday": true, "monday": true, "tuesday": true, "wednesday": true, "thursday": true, "friday": true, "saturday": true, "x": 170, "y": 300, "wires": [ [ "a10629857d60f774" ] ] }, { "id": "a0dd18613130787f", "type": "ha-time", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Kallen Bedtime", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "d5784e5baa80a105", "entityId": "input_datetime.kallen_bedtime", "property": "", "offset": "0", "offsetType": "num", "offsetUnits": "minutes", "randomOffset": false, "repeatDaily": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "kallen-night", "valueType": "str" }, { "property": "toggle", "propertyType": "msg", "value": "on", "valueType": "str" } ], "sunday": true, "monday": true, "tuesday": true, "wednesday": true, "thursday": true, "friday": true, "saturday": true, "x": 120, "y": 880, "wires": [ [ "476f73cf6b540f96" ] ] }, { "id": "324d56cbdc1eb170", "type": "ha-time", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Kallen Wakeup", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "9e1418c3e9595312", "entityId": "input_datetime.kallen_wakeup_time", "property": "", "offset": "0", "offsetType": "num", "offsetUnits": "minutes", "randomOffset": false, "repeatDaily": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "kallen-morning", "valueType": "str" }, { "property": "toggle", "propertyType": "msg", "value": "off", "valueType": "str" } ], "sunday": true, "monday": true, "tuesday": true, "wednesday": true, "thursday": true, "friday": true, "saturday": true, "x": 120, "y": 940, "wires": [ [ "476f73cf6b540f96" ] ] }, { "id": "ec4682a111a48b70", "type": "ha-time", "z": "72f99805df043603", "g": "39a7ac02f2727f1d", "name": "Kallen Fan Time", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "308fce46bd959bce", "entityId": "input_datetime.kallen_fan", "property": "", "offset": "0", "offsetType": "num", "offsetUnits": "minutes", "randomOffset": false, "repeatDaily": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "kallen-fan", "valueType": "str" } ], "sunday": true, "monday": true, "tuesday": true, "wednesday": true, "thursday": true, "friday": true, "saturday": true, "x": 120, "y": 1120, "wires": [ [ "61405a43f61f3d60" ] ] }, { "id": "96cf0949902f8572", "type": "api-call-service", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "TTS Briefings", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "", "service": "", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 820, "y": 420, "wires": [ [] ] }, { "id": "6bbf7df2c43c481e", "type": "delay", "z": "72f99805df043603", "g": "e065b1ed4938b477", "name": "Delay", "pauseType": "delayv", "timeout": "5", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 695, "y": 420, "wires": [ [ "96cf0949902f8572" ] ], "l": false }, { "id": "48b8af9419ed18d6", "type": "subflow:384eaf2f63dcb5db", "z": "b7d34d3e9d0c9486", "name": "", "x": 355, "y": 420, "wires": [ [ "54a88968618ed545" ] ], "l": false }, { "id": "54a88968618ed545", "type": "function", "z": "b7d34d3e9d0c9486", "name": "Processing", "func": "// Set Constants\nconst states = global.get('homeassistant.homeAssistant.states')\nconst textAllowed = states['input_boolean.laundry_notifications_text'].state\nconst ttsAllowed = states['input_boolean.laundry_notifications_tts'].state\nconst washerCycle = flow.get(\"washerCycle\", \"diskCon\")\nconst washerFinished = flow.get(\"washerFinished\", \"diskCon\")\nconst washerTimer = flow.get(\"washerTimer\", \"diskCon\")\nconst washerDateTime = flow.get(\"washerDateTime\", \"diskCon\")\nconst dryerCycle = flow.get(\"dryerCycle\", \"diskCon\")\nconst dryerFinished = flow.get(\"dryerFinished\", \"diskCon\")\nconst dryerTimer = flow.get(\"dryerTimer\", \"diskCon\")\nconst dryerDateTime = flow.get(\"dryerDateTime\", \"diskCon\")\nconst topic = msg.topic\nconst payload = msg.payload\n\n// Init variables\nlet timerEntity = []\nlet boolFinished = []\nlet servFinished = {}\nlet dateTimeEntity = []\nlet servTimer = {}\nlet setCycle = []\nlet dateTime = []\nlet deviceName = {}\nlet notifyMsg = {}\nlet ttsMsg = {}\n\n// Set entity IDs and states\nif (topic === 'washer') {\n setCycle = washerCycle\n boolFinished = washerFinished\n dateTimeEntity = washerDateTime\n timerEntity = washerTimer\n deviceName = 'washer'\n} else if (topic === 'dryer') {\n setCycle = dryerCycle\n boolFinished = dryerFinished\n dateTimeEntity = dryerDateTime\n timerEntity = dryerTimer\n deviceName = 'dryer'\n}\n\n// Get states from the entities\n// @ts-ignore\nlet cycle = states[setCycle].state\n// @ts-ignore\nlet timerState = states[timerEntity].state\n// @ts-ignore\nlet finishedState = states[boolFinished].state\n\n// Convert minutes into seconds for the timer\nlet timerDuration = cycle * 60\nlet notifyDuration = Math.round(cycle)\n\n// Decide services\nif (payload === 'start') {\n servFinished = 'turn_off'\n notifyMsg = 'The ' + deviceName + ' has been started for a ' + notifyDuration + ' minute cycle'\n} else if (payload === 'finish') {\n dateTime = msg.datetime\n servFinished = 'turn_on'\n notifyMsg = 'The ' + deviceName + ' has finished its cycle'\n ttsMsg = 'The ' + deviceName + ' has finished its cycle. I repeat, the ' + deviceName + ' has finished its cycle.'\n} else if (payload === 'cancel') {\n notifyMsg = 'The ' + deviceName + ' cycle has been cancelled'\n}\n\n// Prepare message payloads\nlet sendTimerStart = {\n \"payload\": {\n \"domain\": \"timer\",\n \"service\": \"start\",\n \"target\": {\n \"entity_id\": timerEntity\n },\n \"data\": {\n \"duration\": timerDuration\n }\n }\n}\n\nlet sendTimerCancel = {\n \"payload\": {\n \"domain\": \"timer\",\n \"service\": \"cancel\",\n \"target\": {\n \"entity_id\": timerEntity\n },\n \"data\": {}\n }\n}\n\nlet sendBoolFinished = {\n \"payload\": {\n \"domain\": \"input_boolean\",\n \"service\": servFinished,\n \"target\": {\n \"entity_id\": boolFinished\n },\n \"data\": {}\n }\n}\n\nlet sendDateTimeFinished = {\n \"payload\": {\n \"domain\": \"input_datetime\",\n \"service\": \"set_datetime\",\n \"target\": {\n \"entity_id\": dateTimeEntity\n },\n \"data\": {\n \"datetime\": dateTime\n }\n }\n}\n\nlet sendTextNotify = {\n \"payload\": {\n \"data\": {\n \"type\": \"normal\",\n \"who\": \"all\",\n \"title\": \"Laundry Tracking\",\n \"message\": notifyMsg\n }\n }\n}\n\nlet sendTTSNotify = {\n \"payload\": ttsMsg,\n \"type\": \"alert\",\n \"topic\": \"everywhere\"\n}\n\nlet sendLightsAlertLR = {\n \"payload\": {\n \"domain\": \"script\",\n \"service\": \"living_room_lights_alert\",\n \"data\": {\n \"duration\": 10,\n \"type\": \"blue\"\n }\n }\n}\n\nlet sendLightsAlertBM = {\n \"payload\": {\n \"domain\": \"script\",\n \"service\": \"basement_lights_alert\",\n \"data\": {\n \"duration\": 10,\n \"type\": \"blue\"\n }\n }\n}\n\nif (payload === 'start') {\n node.send([sendBoolFinished,sendTimerStart,null,null])\n node.status({fill:\"green\",shape:\"dot\",text:\"Starting \" + deviceName + \" timer for \" + notifyDuration + \" minutes\"})\n node.log(\"Starting \" + deviceName + \" timer for \" + notifyDuration + \" minutes\")\n} else if (payload === 'finish') {\n node.send([[sendBoolFinished,sendDateTimeFinished,sendLightsAlertLR,sendLightsAlertBM],null,null])\n if (ttsAllowed === 'on') {\n node.send([null,null,null,sendTTSNotify])\n }\n node.status({fill:\"green\",shape:\"dot\",text:\"The \" + deviceName + \" has finished\"})\n node.log(\"The \" + deviceName + \" has finished\")\n} else if (payload === 'cancel') {\n node.send([null,sendTimerCancel,null,null])\n node.status({fill:\"red\",shape:\"ring\",text:\"The \" + deviceName + \" has been cancelled\"})\n node.log(\"The \" + deviceName + \" has been cancelled\")\n}\n\nif (textAllowed === 'on') {\n node.send([null,null,sendTextNotify,null])\n}", "outputs": 4, "timeout": 0, "noerr": 0, "initialize": "const washerCycle = 'input_number.washer_cycle_length'\nconst washerFinished = 'input_boolean.washer_finished'\nconst washerTimer = 'timer.washer_timer'\nconst washerDateTime = 'input_datetime.washer_finished'\nconst dryerCycle = 'input_number.dryer_cycle_length'\nconst dryerFinished = 'input_boolean.dryer_finished'\nconst dryerTimer = 'timer.dryer_timer'\nconst dryerDateTime = 'input_datetime.dryer_finished'\n\nflow.set(\"washerCycle\", washerCycle, \"diskCon\")\nflow.set(\"washerFinished\", washerFinished, \"diskCon\")\nflow.set(\"washerTimer\", washerTimer, \"diskCon\")\nflow.set(\"washerDateTime\", washerDateTime, \"diskCon\")\nflow.set(\"dryerCycle\", dryerCycle, \"diskCon\")\nflow.set(\"dryerFinished\", dryerFinished, \"diskCon\")\nflow.set(\"dryerTimer\", dryerTimer, \"diskCon\")\nflow.set(\"dryerDateTime\", dryerDateTime, \"diskCon\")", "finalize": "", "libs": [], "x": 470, "y": 140, "wires": [ [ "7f4ccf77cb54cbf4" ], [ "3c238eb49495cdf7" ], [ "2f59c100baa80e72" ], [ "8528d2306933fd61" ] ], "outputLabels": [ "Services", "Timers", "Notify", "TTS" ], "icon": "node-red-contrib-cpu/cpu.png" }, { "id": "1c69c3f111ae9550", "type": "ha-button", "z": "b7d34d3e9d0c9486", "name": "Washer Start", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "5627513f9469cbb8", "outputProperties": [ { "property": "timestamp", "propertyType": "msg", "value": "", "valueType": "date" }, { "property": "topic", "propertyType": "msg", "value": "washer", "valueType": "str" }, { "property": "payload", "propertyType": "msg", "value": "start", "valueType": "str" } ], "x": 190, "y": 140, "wires": [ [ "54a88968618ed545" ] ] }, { "id": "b45bbd2dbe71e041", "type": "ha-button", "z": "b7d34d3e9d0c9486", "name": "Dryer Start", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "d2d7710df0394f16", "outputProperties": [ { "property": "timestamp", "propertyType": "msg", "value": "", "valueType": "date" }, { "property": "topic", "propertyType": "msg", "value": "dryer", "valueType": "str" }, { "property": "payload", "propertyType": "msg", "value": "start", "valueType": "str" } ], "x": 200, "y": 200, "wires": [ [ "54a88968618ed545" ] ] }, { "id": "e8999bcf95ae6e5e", "type": "ha-button", "z": "b7d34d3e9d0c9486", "name": "Washer Cancel", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "52dccff6d2c39667", "outputProperties": [ { "property": "timestamp", "propertyType": "msg", "value": "", "valueType": "date" }, { "property": "topic", "propertyType": "msg", "value": "washer", "valueType": "str" }, { "property": "payload", "propertyType": "msg", "value": "cancel", "valueType": "str" } ], "x": 180, "y": 260, "wires": [ [ "54a88968618ed545" ] ] }, { "id": "dffb38d3d2973f4b", "type": "ha-button", "z": "b7d34d3e9d0c9486", "name": "Dryer Cancel", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "9da998d5f74df33c", "outputProperties": [ { "property": "timestamp", "propertyType": "msg", "value": "", "valueType": "date" }, { "property": "topic", "propertyType": "msg", "value": "dryer", "valueType": "str" }, { "property": "payload", "propertyType": "msg", "value": "cancel", "valueType": "str" } ], "x": 190, "y": 320, "wires": [ [ "54a88968618ed545" ] ] }, { "id": "d983ad1b9e54e1d5", "type": "server-events", "z": "b7d34d3e9d0c9486", "name": "Washer Finish", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "", "eventType": "timer.finished", "eventData": "{\"entity_id\":\"timer.washer_timer\"}", "waitForRunning": true, "outputProperties": [ { "property": "timestamp", "propertyType": "msg", "value": "", "valueType": "date" }, { "property": "topic", "propertyType": "msg", "value": "washer", "valueType": "str" }, { "property": "payload", "propertyType": "msg", "value": "finish", "valueType": "str" } ], "x": 190, "y": 380, "wires": [ [ "48b8af9419ed18d6" ] ] }, { "id": "74fd80d93138997a", "type": "server-events", "z": "b7d34d3e9d0c9486", "name": "Dryer Finish", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "", "eventType": "timer.finished", "eventData": "{\"entity_id\":\"timer.dryer_timer\"}", "waitForRunning": true, "outputProperties": [ { "property": "timestamp", "propertyType": "msg", "value": "", "valueType": "date" }, { "property": "topic", "propertyType": "msg", "value": "dryer", "valueType": "str" }, { "property": "payload", "propertyType": "msg", "value": "finish", "valueType": "str" } ], "x": 190, "y": 440, "wires": [ [ "48b8af9419ed18d6" ] ] }, { "id": "2f59c100baa80e72", "type": "api-call-service", "z": "b7d34d3e9d0c9486", "name": "Notify", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "text_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 670, "y": 200, "wires": [ [] ] }, { "id": "7f4ccf77cb54cbf4", "type": "api-call-service", "z": "b7d34d3e9d0c9486", "name": "Services", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "", "service": "", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 680, "y": 80, "wires": [ [] ] }, { "id": "3c238eb49495cdf7", "type": "api-call-service", "z": "b7d34d3e9d0c9486", "name": "Timers", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "", "service": "", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "json", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 670, "y": 140, "wires": [ [] ] }, { "id": "660deb40ab25fd53", "type": "server-state-changed", "z": "b7d34d3e9d0c9486", "name": "Cycle Length Change", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": [ "input_number.washer_cycle_length", "input_number.dryer_cycle_length" ], "entityIdType": "list", "outputInitially": false, "stateType": "num", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": true, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "eventData" } ], "x": 220, "y": 520, "wires": [ [ "d5975ad76923cefc" ] ] }, { "id": "d5975ad76923cefc", "type": "function", "z": "b7d34d3e9d0c9486", "name": "Timer Math", "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst oldState = msg.data.old_state.state\nconst newState = msg.data.new_state.state\nconst entity_id = msg.data.entity_id\nconst washerCycle = flow.get(\"washerCycle\", \"diskCon\")\nconst dryerCycle = flow.get(\"dryerCycle\", \"diskCon\")\n\nconst subtract = newState - oldState\nconst multiply = subtract * 60\nconst diff = parseInt(multiply)\n\nlet machine = {}\nlet timer = {}\n\nif (entity_id === washerCycle) {\n machine = 'washer'\n} else if (entity_id === dryerCycle) {\n machine = 'dryer'\n}\n\nif (machine === 'washer') {\n timer = flow.get(\"washerTimer\", \"diskCon\")\n} else if (machine === 'dryer') {\n timer = flow.get(\"dryerTimer\", \"diskCon\")\n}\n\n// @ts-ignore\nlet running = states[timer].state\n\nlet changeMsg = {\n \"timer\": timer,\n \"change\": diff\n}\n\nif (running === 'active') {\n node.send(changeMsg)\n node.status({fill:\"green\",shape:\"dot\",text:\"Timer Changed\"})\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Blocked\"})\n}", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 430, "y": 520, "wires": [ [ "9c7f26df3d21c2aa" ] ] }, { "id": "9c7f26df3d21c2aa", "type": "api-call-service", "z": "b7d34d3e9d0c9486", "name": "Timer Change", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "timer_modify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"timer\": timer,\t \"change\": change\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 620, "y": 520, "wires": [ [] ] }, { "id": "8528d2306933fd61", "type": "subflow:6429099c4571dd6b", "z": "b7d34d3e9d0c9486", "name": "", "x": 700, "y": 260, "wires": [ [] ] }, { "id": "51aca04a0b99e722", "type": "api-call-service", "z": "b7d34d3e9d0c9486", "name": "", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "basement_lights_alert", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 780, "y": 420, "wires": [ [] ] }, { "id": "9256f78107619596", "type": "ha-time", "z": "458e4c0055c8c533", "g": "88f099618e56926d", "name": "Alarm Time", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "", "entityId": "input_datetime.master_bedroom_alarm_clock", "property": "", "offset": "0", "offsetType": "num", "offsetUnits": "minutes", "randomOffset": false, "repeatDaily": true, "outputProperties": [ { "property": "time", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "alarm", "propertyType": "msg", "value": "triggered", "valueType": "str" } ], "sunday": true, "monday": true, "tuesday": true, "wednesday": true, "thursday": true, "friday": true, "saturday": true, "x": 170, "y": 80, "wires": [ [ "fbd0b0d52ef452d5" ] ] }, { "id": "fbd0b0d52ef452d5", "type": "function", "z": "458e4c0055c8c533", "g": "88f099618e56926d", "name": "Processing", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar enabled = states['input_boolean.master_bedroom_alarm_clock'].state\nvar sleeping = states['input_boolean.master_bedroom_sleeping'].state\nvar goodnight = states['input_boolean.goodnight'].state\n\nmsg.topic = \"master_bedroom\"\nmsg.payload = \"This is your alarm clock speaking, it is time to wake up!\"\nmsg.type = \"alert\"\n\nif (enabled === 'on' && sleeping === 'on' && goodnight === 'off') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Proceed\"});\n return msg\n} else if (enabled === 'off') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Disabled\"});\n return null\n} else if (sleeping === 'off') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Not Sleeping\"});\n return null\n} else if (goodnight === 'off') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Goodnight On\"});\n return null\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Unknown Error\"});\n return null\n}", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 350, "y": 80, "wires": [ [ "1f44e8f6e98317a7" ] ] }, { "id": "1f44e8f6e98317a7", "type": "api-call-service", "z": "458e4c0055c8c533", "g": "88f099618e56926d", "name": "Turn off sleep mode", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.master_bedroom_sleeping" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 560, "y": 80, "wires": [ [ "efec6f0b8a4ea382" ] ] }, { "id": "efec6f0b8a4ea382", "type": "stoptimer", "z": "458e4c0055c8c533", "g": "88f099618e56926d", "duration": "5", "units": "Minute", "payloadtype": "num", "payloadval": "0", "name": "", "x": 840, "y": 80, "wires": [ [ "216ebd5138f63087", "e82fb1576245b7c7" ], [] ] }, { "id": "cfcebd8452629535", "type": "server-state-changed", "z": "458e4c0055c8c533", "g": "88f099618e56926d", "name": "Lights Off", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "light.master_bedroom_lights", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "off", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "stop", "valueType": "str" }, { "property": "stop-reason", "propertyType": "msg", "value": "lights", "valueType": "str" } ], "x": 360, "y": 140, "wires": [ [ "67e6798433b7bc37" ], [] ] }, { "id": "0bfb330d42161fe7", "type": "server-state-changed", "z": "458e4c0055c8c533", "g": "88f099618e56926d", "name": "Bathroom Motion", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "binary_sensor.upstairs_bathroom_motion", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "on", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "stop", "valueType": "str" }, { "property": "stop-reason", "propertyType": "msg", "value": "bathroom", "valueType": "str" } ], "x": 340, "y": 200, "wires": [ [ "67e6798433b7bc37" ], [] ] }, { "id": "216ebd5138f63087", "type": "subflow:6429099c4571dd6b", "z": "458e4c0055c8c533", "g": "88f099618e56926d", "name": "", "x": 1100, "y": 80, "wires": [ [] ] }, { "id": "e82fb1576245b7c7", "type": "api-call-service", "z": "458e4c0055c8c533", "g": "88f099618e56926d", "name": "Disable", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.master_bedroom_alarm_clock" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1080, "y": 140, "wires": [ [] ] }, { "id": "5f4a234984a654e1", "type": "ha-time", "z": "458e4c0055c8c533", "g": "a6de35af12739885", "name": "Alarm Time", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "", "entityId": "input_datetime.kallen_alarm_clock", "property": "", "offset": "0", "offsetType": "num", "offsetUnits": "minutes", "randomOffset": false, "repeatDaily": true, "outputProperties": [ { "property": "time", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "alarm", "propertyType": "msg", "value": "triggered", "valueType": "str" } ], "sunday": true, "monday": true, "tuesday": true, "wednesday": true, "thursday": true, "friday": true, "saturday": true, "x": 170, "y": 380, "wires": [ [ "9ad1aee4f432c0da" ] ] }, { "id": "9ad1aee4f432c0da", "type": "function", "z": "458e4c0055c8c533", "g": "a6de35af12739885", "name": "Processing", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar enabled = states['input_boolean.kallen_alarm_clock'].state\nvar sleeping = states['input_boolean.kallen_sleeping'].state\nvar goodnight = states['input_boolean.goodnight'].state\n\nmsg.topic = \"kallen_bedroom\"\nmsg.payload = \"This is your alarm clock speaking, it is time to wake up!\"\nmsg.type = \"alert\"\n\nif (enabled === 'on' && sleeping === 'on' && goodnight === 'off') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Proceed\"});\n return msg\n} else if (enabled === 'off') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Disabled\"});\n return null\n} else if (sleeping === 'off') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Not Sleeping\"});\n return null\n} else if (goodnight === 'off') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Goodnight On\"});\n return null\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Unknown Error\"});\n return null\n}", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 350, "y": 380, "wires": [ [ "33f1bded52754848" ] ] }, { "id": "33f1bded52754848", "type": "api-call-service", "z": "458e4c0055c8c533", "g": "a6de35af12739885", "name": "Turn off sleep mode", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.kallen_sleeping" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 560, "y": 380, "wires": [ [ "72052e61710200f9" ] ] }, { "id": "72052e61710200f9", "type": "stoptimer", "z": "458e4c0055c8c533", "g": "a6de35af12739885", "duration": "5", "units": "Minute", "payloadtype": "num", "payloadval": "0", "name": "", "x": 840, "y": 380, "wires": [ [ "067bcc91d6a04be5", "7f3909f76041b209" ], [] ] }, { "id": "9c2ea97d481e6428", "type": "server-state-changed", "z": "458e4c0055c8c533", "g": "a6de35af12739885", "name": "Lights Off", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "light.kallen_bedroom_lights", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "off", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "stop", "valueType": "str" } ], "x": 360, "y": 440, "wires": [ [ "724f186878227dad" ], [] ] }, { "id": "56140b60b6406bd7", "type": "server-state-changed", "z": "458e4c0055c8c533", "g": "a6de35af12739885", "name": "Lights Adaptive", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "input_select.kallen_bedroom_scenes", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "Adaptive", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "stop", "valueType": "str" } ], "x": 340, "y": 500, "wires": [ [ "724f186878227dad" ], [] ] }, { "id": "067bcc91d6a04be5", "type": "subflow:6429099c4571dd6b", "z": "458e4c0055c8c533", "g": "a6de35af12739885", "name": "", "x": 1100, "y": 380, "wires": [ [] ] }, { "id": "7f3909f76041b209", "type": "api-call-service", "z": "458e4c0055c8c533", "g": "a6de35af12739885", "name": "Disable", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.kallen_alarm_clock" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1080, "y": 440, "wires": [ [] ] }, { "id": "724f186878227dad", "type": "function", "z": "458e4c0055c8c533", "g": "a6de35af12739885", "name": "Processing", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar enabled = states['input_boolean.kallen_alarm_clock'].state\nvar sleeping = states['input_boolean.kallen_sleeping'].state\n\nif (enabled === 'on' && sleeping === 'off') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Proceed\"});\n return msg\n} else if (enabled === 'off') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Disabled\"});\n return null\n} else if (sleeping === 'on') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Sleeping\"});\n return null\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Unknown Error\"});\n return null\n}", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 590, "y": 440, "wires": [ [ "7f3909f76041b209", "72052e61710200f9" ] ] }, { "id": "67e6798433b7bc37", "type": "function", "z": "458e4c0055c8c533", "g": "88f099618e56926d", "name": "Processing", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar enabled = states['input_boolean.master_bedroom_alarm_clock'].state\nvar sleeping = states['input_boolean.master_bedroom_sleeping'].state\n\nif (enabled === 'on' && sleeping === 'off') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Proceed\"});\n return msg\n} else if (enabled === 'off') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Disabled\"});\n return null\n} else if (sleeping === 'on') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Sleeping\"});\n return null\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Unknown Error\"});\n return null\n}", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 590, "y": 140, "wires": [ [ "e82fb1576245b7c7", "efec6f0b8a4ea382" ] ] }, { "id": "99c141f21de4feda", "type": "server-state-changed", "z": "458e4c0055c8c533", "g": "88f099618e56926d", "name": "Lights Adaptive", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "input_select.master_bedroom_scenes", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "Adaptive", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "stop", "valueType": "str" }, { "property": "stop-reason", "propertyType": "msg", "value": "adaptive", "valueType": "str" } ], "x": 340, "y": 260, "wires": [ [ "67e6798433b7bc37" ], [] ] }, { "id": "eff279edcac37798", "type": "ha-time", "z": "458e4c0055c8c533", "g": "0804d9edeca1c9fa", "name": "Alarm Time", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "", "entityId": "input_datetime.emma_alarm_clock", "property": "", "offset": "0", "offsetType": "num", "offsetUnits": "minutes", "randomOffset": false, "repeatDaily": true, "outputProperties": [ { "property": "time", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "alarm", "propertyType": "msg", "value": "triggered", "valueType": "str" } ], "sunday": true, "monday": true, "tuesday": true, "wednesday": true, "thursday": true, "friday": true, "saturday": true, "x": 170, "y": 620, "wires": [ [ "adcce6ca1e459cd1" ] ] }, { "id": "adcce6ca1e459cd1", "type": "function", "z": "458e4c0055c8c533", "g": "0804d9edeca1c9fa", "name": "Processing", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar enabled = states['input_boolean.emma_alarm_clock'].state\nvar sleeping = states['input_boolean.emma_sleeping'].state\nvar goodnight = states['input_boolean.goodnight'].state\n\nmsg.topic = \"emma_bedroom\"\nmsg.payload = \"This is your alarm clock speaking, it is time to wake up!\"\nmsg.type = \"alert\"\n\nif (enabled === 'on' && sleeping === 'on' && goodnight === 'off') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Proceed\"});\n return msg\n} else if (enabled === 'off') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Disabled\"});\n return null\n} else if (sleeping === 'off') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Not Sleeping\"});\n return null\n} else if (goodnight === 'off') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Goodnight On\"});\n return null\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Unknown Error\"});\n return null\n}", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 350, "y": 620, "wires": [ [ "49a842a41a52f8f3" ] ] }, { "id": "49a842a41a52f8f3", "type": "api-call-service", "z": "458e4c0055c8c533", "g": "0804d9edeca1c9fa", "name": "Turn off sleep mode", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.emma_sleeping" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 560, "y": 620, "wires": [ [ "e036fd18c5d20645" ] ] }, { "id": "e036fd18c5d20645", "type": "stoptimer", "z": "458e4c0055c8c533", "g": "0804d9edeca1c9fa", "duration": "5", "units": "Minute", "payloadtype": "num", "payloadval": "0", "name": "", "x": 840, "y": 620, "wires": [ [ "53f8d279114dd476" ], [] ] }, { "id": "9621d4c881da0188", "type": "server-state-changed", "z": "458e4c0055c8c533", "g": "0804d9edeca1c9fa", "name": "Lights Off", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "light.emma_bedroom_light", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "off", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "stop", "valueType": "str" } ], "x": 360, "y": 680, "wires": [ [ "4523045453de0a33" ], [] ] }, { "id": "a5a387d3522f49ed", "type": "server-state-changed", "z": "458e4c0055c8c533", "g": "0804d9edeca1c9fa", "name": "Lights Adaptive", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "", "entityId": "input_select.emma_bedroom_scenes", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "Adaptive", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "stop", "valueType": "str" } ], "x": 340, "y": 740, "wires": [ [ "4523045453de0a33" ], [] ] }, { "id": "53f8d279114dd476", "type": "api-call-service", "z": "458e4c0055c8c533", "g": "0804d9edeca1c9fa", "name": "Disable", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.emma_alarm_clock" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1080, "y": 680, "wires": [ [] ] }, { "id": "4523045453de0a33", "type": "function", "z": "458e4c0055c8c533", "g": "0804d9edeca1c9fa", "name": "Processing", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar enabled = states['input_boolean.emma_alarm_clock'].state\nvar sleeping = states['input_boolean.emma_sleeping'].state\n\nif (enabled === 'on' && sleeping === 'off') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Proceed\"});\n return msg\n} else if (enabled === 'off') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Disabled\"});\n return null\n} else if (sleeping === 'on') {\n node.status({fill:\"red\",shape:\"ring\",text:\"Sleeping\"});\n return null\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Unknown Error\"});\n return null\n}", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 590, "y": 680, "wires": [ [ "53f8d279114dd476", "e036fd18c5d20645" ] ] }, { "id": "105271e0816c6a52", "type": "ha-button", "z": "5c4ac37140a54ac9", "name": "Good Morning", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "ad5b1d9f1ea8fea1", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" }, { "property": "topic", "propertyType": "msg", "value": "mrbedroom-wakeup", "valueType": "str" } ], "x": 110, "y": 60, "wires": [ [ "c18d27a9438bfa08", "ef0efdc23805d872", "bad6373b442c58a1" ] ] }, { "id": "2854170262757e84", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Turn off switches", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "switch.basement_echo_dot_do_not_disturb_switch", "switch.living_room_echo_dot_do_not_disturb_switch", "switch.master_bedroom_echo_dot_do_not_disturb_switch" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 510, "y": 60, "wires": [ [ "5c9c73b7adb72896", "3778a9f4cb80ce0b" ] ] }, { "id": "6f84caa4bd59a747", "type": "ha-button", "z": "5c4ac37140a54ac9", "name": "Weather Briefing", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "a8da4d03a2922c42", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" } ], "x": 120, "y": 740, "wires": [ [ "fa09d8a69bcbfbb5" ] ] }, { "id": "ba97906b7b81342c", "type": "ha-button", "z": "5c4ac37140a54ac9", "name": "Goodnight", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "30f1658baee9378e", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" }, { "property": "topic", "propertyType": "msg", "value": "mrbedroom-bedtime", "valueType": "str" }, { "property": "time", "propertyType": "msg", "value": "bedtime", "valueType": "str" }, { "property": "type", "propertyType": "msg", "value": "auto", "valueType": "str" } ], "x": 100, "y": 300, "wires": [ [ "33773b3aaa551b79" ] ] }, { "id": "d9e39b8ebb86c941", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Kallen Desktop - Shutdown", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "kallen_desktop_shutdown", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 860, "y": 460, "wires": [ [] ] }, { "id": "a58bc61a625f47af", "type": "ha-button", "z": "5c4ac37140a54ac9", "name": "Daily Briefing", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "998d8d67ec377dd3", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" } ], "x": 110, "y": 800, "wires": [ [ "1d121bd0f1f5d628" ] ] }, { "id": "5eb7493d13b65a60", "type": "debug", "z": "5c4ac37140a54ac9", "name": "", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 490, "y": 800, "wires": [] }, { "id": "804c40c435c342fc", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Script", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "daily_briefing", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"who\": msg.who\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 350, "y": 800, "wires": [ [ "5eb7493d13b65a60" ] ] }, { "id": "09c7a61f7a4c4d05", "type": "api-current-state", "z": "5c4ac37140a54ac9", "name": "Check Security", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "disarmed", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "alarm_control_panel.nerdhome_alarm_panel", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 620, "y": 300, "wires": [ [ "280e2a7895ca63fb" ], [] ] }, { "id": "280e2a7895ca63fb", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Arm Security", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "alarm_control_panel", "service": "alarm_arm_home", "areaId": [], "deviceId": [], "entityId": [ "alarm_control_panel.nerdhome_alarm_panel" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 910, "y": 300, "wires": [ [] ] }, { "id": "28a99bbb21540cbc", "type": "debug", "z": "5c4ac37140a54ac9", "name": "", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 510, "y": 740, "wires": [] }, { "id": "3363b9392f425a55", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Script", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "weather_briefing", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"who\": msg.who\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 370, "y": 740, "wires": [ [ "28a99bbb21540cbc" ] ] }, { "id": "fa09d8a69bcbfbb5", "type": "subflow:05a2d9f89e72481f", "z": "5c4ac37140a54ac9", "name": "", "x": 255, "y": 740, "wires": [ [ "3363b9392f425a55" ] ], "l": false }, { "id": "1d121bd0f1f5d628", "type": "subflow:05a2d9f89e72481f", "z": "5c4ac37140a54ac9", "name": "", "x": 235, "y": 800, "wires": [ [ "804c40c435c342fc" ] ], "l": false }, { "id": "5c9c73b7adb72896", "type": "link out", "z": "5c4ac37140a54ac9", "name": "Good Morning Output", "mode": "link", "links": [ "bc592ba259667f9d" ], "x": 675, "y": 60, "wires": [] }, { "id": "028351e8c4e2faf5", "type": "link out", "z": "5c4ac37140a54ac9", "name": "Goodnight Output - Climate", "mode": "link", "links": [ "bc592ba259667f9d" ], "x": 475, "y": 360, "wires": [] }, { "id": "60ce44747cf3e507", "type": "link out", "z": "5c4ac37140a54ac9", "name": "Goodnight Output - Lighting", "mode": "link", "links": [ "55e84ccb73ae9b74" ], "x": 475, "y": 400, "wires": [] }, { "id": "fe338e85c7419657", "type": "ha-button", "z": "5c4ac37140a54ac9", "name": "Kallen School Status", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "d9da4bd707013bc5", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" } ], "x": 130, "y": 860, "wires": [ [ "ed96b2ce33128205" ] ] }, { "id": "ed96b2ce33128205", "type": "subflow:05a2d9f89e72481f", "z": "5c4ac37140a54ac9", "name": "", "x": 275, "y": 860, "wires": [ [ "08eafe762d6146ee" ] ], "l": false }, { "id": "08eafe762d6146ee", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Script", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "kallen_school_status", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"who\": msg.who\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 390, "y": 860, "wires": [ [ "e39da18ec3ecc852" ] ] }, { "id": "e39da18ec3ecc852", "type": "debug", "z": "5c4ac37140a54ac9", "name": "", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 530, "y": 860, "wires": [] }, { "id": "c18d27a9438bfa08", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Morning Scene", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "morning_scene", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 320, "y": 60, "wires": [ [ "2854170262757e84" ] ] }, { "id": "ef0efdc23805d872", "type": "api-current-state", "z": "5c4ac37140a54ac9", "name": "Morning?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "binary_sensor.morning", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "time", "propertyType": "msg", "value": "morning", "valueType": "str" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 300, "y": 120, "wires": [ [ "54b8bca62d27e659" ], [] ], "outputLabels": [ "on", "off" ] }, { "id": "bad6373b442c58a1", "type": "api-current-state", "z": "5c4ac37140a54ac9", "name": "Late Morning?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "binary_sensor.late_morning", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "time", "propertyType": "msg", "value": "late-morning", "valueType": "str" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 320, "y": 180, "wires": [ [ "54b8bca62d27e659" ], [] ], "outputLabels": [ "on", "off" ] }, { "id": "54b8bca62d27e659", "type": "api-current-state", "z": "5c4ac37140a54ac9", "name": "Security State", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "armed_home", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "alarm_control_panel.nerdhome_alarm_panel", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "security", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 540, "y": 180, "wires": [ [ "bb77b36dd4d9cc96" ], [] ], "outputLabels": [ "armed_home", "else" ] }, { "id": "708843ea29ee6626", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Disarm Security", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "alarm_control_panel", "service": "alarm_disarm", "areaId": [], "deviceId": [], "entityId": [ "alarm_control_panel.nerdhome_alarm_panel" ], "data": "{\t \"silent\": 1\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 980, "y": 180, "wires": [ [] ] }, { "id": "bb77b36dd4d9cc96", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Disable Automations", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "automation", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "automation.scheduled_alarm_disarm", "automation.scheduled_alarm_rearm" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 760, "y": 180, "wires": [ [ "708843ea29ee6626" ] ] }, { "id": "50e351d1ee6108b3", "type": "api-current-state", "z": "5c4ac37140a54ac9", "name": "Kallen Computer Updates?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "off", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "input_boolean.kallen_computer_updates", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 580, "y": 460, "wires": [ [ "d9e39b8ebb86c941" ], [] ], "outputLabels": [ "Off", "On" ] }, { "id": "2fb85204eb56f86b", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "TTS Briefing", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "morning_briefing", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"who\":\"alexa_everywhere\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 790, "y": 120, "wires": [ [] ] }, { "id": "8c4d01db6f6ef33e", "type": "ha-button", "z": "5c4ac37140a54ac9", "name": "Kallen Activities", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "503ba5fd53d97d51", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" } ], "x": 120, "y": 940, "wires": [ [ "88c56b0964f9a6db" ] ] }, { "id": "20ede2b52515bc63", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Ask Activity", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "activate_alexa_actionable_notification", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"text\":\"What activity are we timing?\",\t \"event_id\":\"actionable_notification_kallen_timer_activity\",\t \"alexa_device\": who\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 930, "y": 940, "wires": [ [ "38e168a79848fa19" ] ] }, { "id": "88c56b0964f9a6db", "type": "subflow:b88bb63bb13eeb27", "z": "5c4ac37140a54ac9", "name": "", "x": 275, "y": 940, "wires": [ [ "7d53b4bd4c7ea874" ] ], "l": false }, { "id": "38e168a79848fa19", "type": "debug", "z": "5c4ac37140a54ac9", "name": "Activity", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1100, "y": 940, "wires": [] }, { "id": "86cd67e28114a585", "type": "server-events", "z": "5c4ac37140a54ac9", "name": "Activity Response", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "", "eventType": "alexa_actionable_notification", "eventData": "{\"event_id\":\"actionable_notification_kallen_timer_activity\"}", "waitForRunning": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "$outputData(\"eventData\").event_type", "valueType": "jsonata" } ], "event_type": "", "x": 130, "y": 1000, "wires": [ [ "5926b0004a47dfd1" ] ] }, { "id": "5926b0004a47dfd1", "type": "subflow:b88bb63bb13eeb27", "z": "5c4ac37140a54ac9", "name": "", "x": 275, "y": 1000, "wires": [ [ "4726a2605a1f56cc" ] ], "l": false }, { "id": "50982205a91e63c5", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Ask Duration", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "activate_alexa_actionable_notification", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"text\":\"How long would you like the timer set for?\",\t \"event_id\":\"actionable_notification_kallen_timer_duration\",\t \"alexa_device\": who\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 930, "y": 1000, "wires": [ [ "254ffc8e8bd1d414" ] ] }, { "id": "254ffc8e8bd1d414", "type": "debug", "z": "5c4ac37140a54ac9", "name": "Duration", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1100, "y": 1000, "wires": [] }, { "id": "c43b69d84deb44a4", "type": "server-events", "z": "5c4ac37140a54ac9", "name": "Duration Response", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "", "eventType": "alexa_actionable_notification", "eventData": "{\"event_id\":\"actionable_notification_kallen_timer_duration\"}", "waitForRunning": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "$outputData(\"eventData\").event_type", "valueType": "jsonata" } ], "event_type": "", "x": 130, "y": 1060, "wires": [ [ "6167d4da61990bfb" ] ] }, { "id": "65589264d77f668d", "type": "debug", "z": "5c4ac37140a54ac9", "name": "Location", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1100, "y": 1060, "wires": [] }, { "id": "6167d4da61990bfb", "type": "subflow:b88bb63bb13eeb27", "z": "5c4ac37140a54ac9", "name": "", "x": 275, "y": 1060, "wires": [ [ "506e7e645cf06383" ] ], "l": false }, { "id": "2aa8397f85a8ceed", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Set Activity", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.kallen_activities" ], "data": "{\t \"option\": payload.event.event_response\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 690, "y": 1000, "wires": [ [ "50982205a91e63c5" ] ] }, { "id": "9f1c60a822a2b550", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Set Duration", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_number", "service": "set_value", "areaId": [], "deviceId": [], "entityId": [ "input_number.kallen_activity_duration" ], "data": "{\t \"value\": duration\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 690, "y": 1060, "wires": [ [ "dff1ff1e18a1bc74" ] ] }, { "id": "dff1ff1e18a1bc74", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Ask Location", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "activate_alexa_actionable_notification", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"text\":\"Which room would you like the timer to run in?\",\t \"event_id\":\"actionable_notification_kallen_timer_location\",\t \"alexa_device\": who\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 930, "y": 1060, "wires": [ [ "65589264d77f668d" ] ] }, { "id": "9e3c9006ff125d9b", "type": "server-events", "z": "5c4ac37140a54ac9", "name": "Location Response", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "", "eventType": "alexa_actionable_notification", "eventData": "{\"event_id\":\"actionable_notification_kallen_timer_location\"}", "waitForRunning": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "$outputData(\"eventData\").event_type", "valueType": "jsonata" } ], "event_type": "", "x": 130, "y": 1120, "wires": [ [ "716d4f60c2af0f2e" ] ] }, { "id": "efd47cbc26ed2810", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Set Location", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.kallen_activity_room" ], "data": "{\t \"option\": payload.event.event_response\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 690, "y": 1120, "wires": [ [ "c2212b77414c61f3" ] ] }, { "id": "75e1b9f265ecb4e5", "type": "debug", "z": "5c4ac37140a54ac9", "name": "End", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1090, "y": 1120, "wires": [] }, { "id": "c2212b77414c61f3", "type": "delay", "z": "5c4ac37140a54ac9", "name": "", "pauseType": "delay", "timeout": "1", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 805, "y": 1120, "wires": [ [ "1383f8e6ebf8ad88" ] ], "l": false }, { "id": "1383f8e6ebf8ad88", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Start Timer", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "button", "service": "press", "areaId": [], "deviceId": [], "entityId": [ "button.kallen_timer_start" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 930, "y": 1120, "wires": [ [ "75e1b9f265ecb4e5" ] ] }, { "id": "7d53b4bd4c7ea874", "type": "function", "z": "5c4ac37140a54ac9", "name": "Filtering", "func": "var who = msg.who\n\nif (who === 'media_player.master_bedroom_echo_dot') {\n msg.who = 'media_player.living_room_echo_dot'\n node.status({ fill: \"red\", shape: \"dot\", text: \"Rerouted\" });\n return msg;\n} else {\n msg.who = who\n node.status({ fill: \"green\", shape: \"dot\", text: \"Unchanged\" });\n return msg;\n}", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 520, "y": 940, "wires": [ [ "20ede2b52515bc63" ] ] }, { "id": "4726a2605a1f56cc", "type": "function", "z": "5c4ac37140a54ac9", "name": "Filtering", "func": "var who = msg.who\nvar responseType = msg.payload.event.event_response_type\n\nif (responseType != 'ResponseNone') {\n if (who === 'media_player.master_bedroom_echo_dot') {\n msg.who = 'media_player.living_room_echo_dot'\n node.status({fill:\"red\",shape:\"dot\",text:\"Rerouted\"});\n return msg;\n } else {\n msg.who = who\n node.status({fill:\"green\",shape:\"dot\",text:\"Unchanged\"});\n return msg;\n }\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"No Response\"});\n return null\n}", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 520, "y": 1000, "wires": [ [ "2aa8397f85a8ceed" ] ] }, { "id": "506e7e645cf06383", "type": "function", "z": "5c4ac37140a54ac9", "name": "Filtering", "func": "var who = msg.who\nvar responseType = msg.payload.event.event_response_type\n\nmsg.duration = (msg.payload.event.event_response / 60)\n\nif (responseType != 'ResponseNone') {\n if (who === 'media_player.master_bedroom_echo_dot') {\n msg.who = 'media_player.living_room_echo_dot'\n node.status({ fill: \"red\", shape: \"dot\", text: \"Rerouted, \" + msg.duration + \"m\" });\n return msg;\n } else {\n msg.who = who\n node.status({ fill: \"green\", shape: \"dot\", text: \"Unchanged, \" + msg.duration + \"m\" });\n return msg;\n }\n} else {\n node.status({ fill: \"red\", shape: \"ring\", text: \"No Response\" });\n return null\n}", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 520, "y": 1060, "wires": [ [ "9f1c60a822a2b550" ] ] }, { "id": "716d4f60c2af0f2e", "type": "function", "z": "5c4ac37140a54ac9", "name": "Filtering", "func": "var responseType = msg.payload.event.event_response_type\n\nif (responseType === 'ResponseNone') {\n node.status({fill:\"red\",shape:\"ring\",text:\"No Response\"});\n return null\n} else {\n node.status({fill:\"green\",shape:\"dot\",text:\"Success\"});\n return msg;\n}", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 520, "y": 1120, "wires": [ [ "efd47cbc26ed2810" ] ] }, { "id": "33773b3aaa551b79", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Goodnight Switch", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.goodnight", "input_boolean.master_bedroom_sleeping", "input_boolean.night_mode" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 330, "y": 300, "wires": [ [ "09c7a61f7a4c4d05", "028351e8c4e2faf5", "60ce44747cf3e507", "50e351d1ee6108b3", "f30486c8e11db0e4", "9bd4665845af0545" ] ] }, { "id": "f30486c8e11db0e4", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Do Not Disturb", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "switch.basement_echo_dot_do_not_disturb_switch", "switch.living_room_echo_dot_do_not_disturb_switch", "switch.master_bedroom_echo_dot_do_not_disturb_switch" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 540, "y": 520, "wires": [ [ "20b3699a56b0e901" ] ] }, { "id": "9bd4665845af0545", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Goodnight Scripts", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "script.goodnight_in_basement", "script.goodnight_on_first_floor", "script.goodnight_on_second_floor" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 550, "y": 580, "wires": [ [] ] }, { "id": "3778a9f4cb80ce0b", "type": "delay", "z": "5c4ac37140a54ac9", "name": "", "pauseType": "delay", "timeout": "5", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 675, "y": 120, "wires": [ [ "2fb85204eb56f86b" ] ], "l": false }, { "id": "20b3699a56b0e901", "type": "api-call-service", "z": "5c4ac37140a54ac9", "name": "Turn off Quiet/Gaming Modes", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.gaming_mode", "input_boolean.studio_quiet" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 790, "y": 520, "wires": [ [] ] }, { "id": "6a37c598ccfec0c7", "type": "google-home", "z": "75e98103856848a6", "conf": "457914a2c9dc72c1", "device": "20328", "acknowledge": true, "name": "", "topic": "tester of testiness", "x": 250, "y": 240, "wires": [ [ "ef99a4a89289098c" ] ] }, { "id": "ef99a4a89289098c", "type": "debug", "z": "75e98103856848a6", "name": "", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 470, "y": 240, "wires": [] }, { "id": "07a2f8b7e49040f8", "type": "file in", "z": "75e98103856848a6", "name": "Read File", "filename": "/config/files/weather_briefing_full.txt", "filenameType": "str", "format": "utf8", "chunk": false, "sendError": false, "encoding": "none", "allProps": false, "x": 480, "y": 340, "wires": [ [ "0249c367ffa0a6a1" ] ] }, { "id": "d8d284802d3ba380", "type": "ha-button", "z": "75e98103856848a6", "name": "Weather Briefing Google", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "8860321096392e94", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" }, { "property": "topic", "propertyType": "msg", "value": "Kallen Bedroom", "valueType": "str" } ], "x": 270, "y": 340, "wires": [ [ "07a2f8b7e49040f8" ] ] }, { "id": "0249c367ffa0a6a1", "type": "subflow:6429099c4571dd6b", "z": "75e98103856848a6", "name": "", "x": 660, "y": 340, "wires": [ [] ] }, { "id": "223a7234238933a7", "type": "ha-button", "z": "75e98103856848a6", "name": "Daily Briefing Google", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "9c84afc610ced7b6", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" }, { "property": "topic", "propertyType": "msg", "value": "Kallen Bedroom", "valueType": "str" } ], "x": 260, "y": 400, "wires": [ [ "96905a317852d84e" ] ] }, { "id": "6059344e8c26ac8c", "type": "ha-button", "z": "75e98103856848a6", "name": "Kallen School Status Google", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "2c222901ee192ba1", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" }, { "property": "who", "propertyType": "msg", "value": "kallen_bedroom", "valueType": "str" } ], "x": 280, "y": 460, "wires": [ [ "062135211ea05aee" ] ] }, { "id": "062135211ea05aee", "type": "api-call-service", "z": "75e98103856848a6", "name": "Script", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "kallen_school_status", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"who\": who\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 490, "y": 460, "wires": [ [] ] }, { "id": "dc94d479f37be046", "type": "api-call-service", "z": "75e98103856848a6", "name": "Speech Engine", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "speech_engine", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"who\":\"kallen_bedroom\",\t \"message\": payload\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1200, "y": 400, "wires": [ [] ] }, { "id": "96905a317852d84e", "type": "file in", "z": "75e98103856848a6", "name": "Read File", "filename": "/config/templates/speech/daily_briefing.yaml", "filenameType": "str", "format": "utf8", "chunk": false, "sendError": false, "encoding": "none", "allProps": false, "x": 460, "y": 400, "wires": [ [ "293cc3018a39af5d" ] ] }, { "id": "293cc3018a39af5d", "type": "change", "z": "75e98103856848a6", "name": "", "rules": [ { "t": "set", "p": "template", "pt": "msg", "to": "payload", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 650, "y": 400, "wires": [ [ "0b5a8b6754e8ab37" ] ] }, { "id": "0b5a8b6754e8ab37", "type": "api-render-template", "z": "75e98103856848a6", "name": "", "server": "9e87348d.9c1c48", "version": 0, "template": "", "resultsLocation": "payload", "resultsLocationType": "msg", "templateLocation": "template", "templateLocationType": "msg", "x": 840, "y": 400, "wires": [ [ "c1e3cffdafae7507" ] ] }, { "id": "c1e3cffdafae7507", "type": "function", "z": "75e98103856848a6", "name": "Formatting", "func": "var str = msg.payload\nstr = str.replaceAll(\"

\", \" \")\nstr = str.replaceAll(\"

\", \" \")\nstr = str.replaceAll(\">\", \" \")\nstr = str.replaceAll(\"\", \" \")\nstr = str.replaceAll(\"\", \" \")\nstr = str.replaceAll(\" '0' %}\n Currently there are weather alerts active. The total number of alerts is {{ states('sensor.weather_alerts_active_corrected') }}. They are as follows.\n {{ states('sensor.weather_alert_string') }}.\n {% endif %}\n\n{%- endmacro -%}\n{{- cleanup(getReport()) -}}", "resultsLocation": "payload", "resultsLocationType": "msg", "templateLocation": "template", "templateLocationType": "msg", "x": 320, "y": 80, "wires": [ [ "6b5d3e550ad76528" ] ] }, { "id": "7aaddacf84721c78", "type": "inject", "z": "ebd5561c4f077718", "g": "b9ffa3fa5af46ec3", "name": "", "props": [ { "p": "payload" } ], "repeat": "300", "crontab": "", "once": true, "onceDelay": "1", "topic": "", "payload": "", "payloadType": "date", "x": 150, "y": 80, "wires": [ [ "5d7c63526234945e" ] ] }, { "id": "6b5d3e550ad76528", "type": "file", "z": "ebd5561c4f077718", "g": "b9ffa3fa5af46ec3", "name": "", "filename": "/homeassistant/files/weather_briefing_full.txt", "filenameType": "str", "appendNewline": true, "createDir": false, "overwriteFile": "true", "encoding": "none", "x": 590, "y": 80, "wires": [ [] ] }, { "id": "d7c2eec75c6063ea", "type": "api-call-service", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Backup Scene", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "scene", "service": "create", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"scene_id\":\"lightning_alert_restore_firstfloor\",\t \"snapshot_entities\": backup\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 540, "y": 240, "wires": [ [ "75c4dc9367328035" ] ] }, { "id": "75c4dc9367328035", "type": "api-call-service", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Turn off Adaptive", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "switch.adaptive_lighting_tina_lamp" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 750, "y": 240, "wires": [ [ "abb24271518ddd9b" ] ] }, { "id": "abb24271518ddd9b", "type": "delay", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "", "pauseType": "delay", "timeout": "500", "timeoutUnits": "milliseconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 945, "y": 240, "wires": [ [ "6f29823ba252aef8", "b6e069ac0ebfe31a", "210ae9a754fb0bb7", "6c529210810a63a8" ] ], "l": false }, { "id": "6f29823ba252aef8", "type": "api-call-service", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Red Lights", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "light.tina_desk_strip", "light.tina_lamp_side", "light.tina_lamp_top" ], "data": "{\t \"color_name\":\"red\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1070, "y": 300, "wires": [ [] ] }, { "id": "b6e069ac0ebfe31a", "type": "api-call-service", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Red Alert", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "living_room_lights_alert", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"type\":\"red\",\t \"duration\": duration\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1060, "y": 240, "wires": [ [ "f260e2410571356a" ] ] }, { "id": "210ae9a754fb0bb7", "type": "api-call-service", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Lamp Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "light.dining_room_lamp" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1060, "y": 180, "wires": [ [] ] }, { "id": "6c529210810a63a8", "type": "api-call-service", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Announce", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "status_annc", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"who\": who,\t \"type\":\"weather\",\t \"call_interruption\": 1,\t \"call_lightning_alert\": 1\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1060, "y": 360, "wires": [ [] ] }, { "id": "b4b80e91a535923e", "type": "api-call-service", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Restore Scene", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "scene", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "{{scenes}}" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1420, "y": 240, "wires": [ [] ] }, { "id": "1180e4c40c3ec0fa", "type": "api-call-service", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Clear Notification", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "text_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"type\":\"alert\",\t \"who\":\"all\",\t \"message\":\"clear_notification\",\t \"tag\":\"lightning-warning\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 550, "y": 440, "wires": [ [ "7809c760322bf72a" ] ] }, { "id": "b64b61c5bfd91293", "type": "api-call-service", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Text Notify", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "text_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"type\":\"alert\",\t \"who\":\"all\",\t \"title\":\"Lightning Detected!\",\t \"message\": notification,\t \"tag\":\"lightning-warning\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 510, "y": 180, "wires": [ [] ] }, { "id": "70f795fb061cbfef", "type": "api-render-template", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "", "server": "9e87348d.9c1c48", "version": 0, "template": "{% set ltgdist = (states('sensor.blitzortung_lightning_distance') | int) / 1.609 | round %}\nLightning has been detected within 20 miles of the house. Nearest storm is {{ ltgdist }} miles away.\n", "resultsLocation": "notification", "resultsLocationType": "msg", "templateLocation": "", "templateLocationType": "none", "x": 340, "y": 180, "wires": [ [ "b64b61c5bfd91293" ] ] }, { "id": "7809c760322bf72a", "type": "api-call-service", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Announce", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "status_annc", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"who\": who,\t \"type\":\"weather\",\t \"call_interruption\": 1,\t \"call_lightning_clear\": 1\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 740, "y": 440, "wires": [ [ "8ffd3e28319fc173" ] ] }, { "id": "8ffd3e28319fc173", "type": "api-call-service", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Text Notify", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "text_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"type\":\"alert\",\t \"who\":\"all\",\t \"title\":\"Lightning Clear!\",\t \"message\": \"The lightning threat has passed. It is safe to resume normal activities.\",\t \"tag\":\"lightning-clear\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 910, "y": 440, "wires": [ [] ] }, { "id": "be9ebf6d2f7e18d0", "type": "comment", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Work on media scene interaction", "info": "", "x": 190, "y": 520, "wires": [] }, { "id": "b2c0d6629b2603b7", "type": "function", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Processing", "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst allowed = states[\"binary_sensor.audible_weather_alerts_allowed\"].state\nconst occupied = states[\"binary_sensor.basement_occupied\"].state\nconst quiet = states[\"input_boolean.studio_quiet\"].state\nconst deskState = states[\"light.tina_desk_lights\"].state\nconst livingRoomState = states[\"light.living_room_lights\"].state\nconst diningRoomState = states[\"light.dining_room_lamp\"].state\nconst basementState = states[\"light.basement_studio_lights\"].state\nconst who = states[\"binary_sensor.audible_weather_alerts_allowed\"].attributes.location\nconst duration = msg.duration\nconst payload = msg.payload\n\nlet firstFloorLights = []\nlet basementLights = []\n\nif (deskState === 'on') {\n firstFloorLights.push('light.tina_desk_strip','light.tina_lamp_top','light.tina_lamp_side')\n}\n\nif (livingRoomState === 'on') {\n firstFloorLights.push('light.living_room_color_1','light.living_room_color_2','light.living_room_color_3','light.living_room_led_strip')\n}\n\nif (diningRoomState === 'on') {\n firstFloorLights.push('light.dining_room_lamp')\n}\n\nif (basementState === 'on') {\n basementLights.push('light.basement_tall_lamp','light.basement_short_lamp','light.basement_stairwell','light.basement_led_strip_1')\n}\n\nflow.set(\"deskState\", deskState)\nflow.set(\"livingRoomState\", livingRoomState)\nflow.set(\"diningRoomState\", diningRoomState)\nflow.set(\"basementState\", basementState)\n\nlet firstFloorMsg = {\n \"payload\": payload,\n \"duration\": duration,\n \"backup\": firstFloorLights,\n \"who\": who\n}\n\nlet basementMsg = {\n \"payload\": payload,\n \"duration\": duration,\n \"backup\": basementLights\n}\n\nif (allowed === 'on') {\n if (occupied === 'on' && quiet === 'off') {\n flow.set(\"basementTrigger\",\"true\")\n node.status({fill:\"green\",shape:\"dot\",text:\"Both\"})\n return[firstFloorMsg,basementMsg]\n } else {\n flow.set(\"basementTrigger\",\"false\")\n node.status({fill:\"green\",shape:\"dot\",text:\"Living Room\"})\n return[firstFloorMsg,null]\n }\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Blocked\"})\n return null\n}", "outputs": 2, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 350, "y": 300, "wires": [ [ "d7c2eec75c6063ea" ], [ "c268e2512a503e2a" ] ], "outputLabels": [ "Living Room", "Basement" ] }, { "id": "c268e2512a503e2a", "type": "api-call-service", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Backup Scene", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "scene", "service": "create", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"scene_id\":\"lightning_alert_restore_basement\",\t \"snapshot_entities\": backup\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 540, "y": 360, "wires": [ [ "1e79cbc1d6e8f507" ] ] }, { "id": "1e79cbc1d6e8f507", "type": "delay", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "", "pauseType": "delay", "timeout": "500", "timeoutUnits": "milliseconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 665, "y": 360, "wires": [ [ "dbfb74297b6ecd61" ] ], "l": false }, { "id": "dbfb74297b6ecd61", "type": "api-call-service", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Red Alert", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "basement_lights_alert", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"type\":\"red\",\t \"duration\": duration\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 780, "y": 360, "wires": [ [] ] }, { "id": "81c14eac4de9dd9d", "type": "function", "z": "ebd5561c4f077718", "d": true, "g": "4329e464360d0afa", "name": "Media?", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar mediaLivingRoom = states['input_boolean.living_room_entertainment_mode'].state\nvar mediaBasement = states['input_boolean.basement_studio_entertainment_mode'].state\n\nif (mediaLivingRoom === 'on' || mediaBasement === 'on') {\n msg.payload = 'on'\n msg.alert = 'on'\n node.status({fill:\"green\",shape:\"dot\",text:\"Media App Running\"})\n return[msg,null]\n} else {\n node.status({fill:\"blue\",shape:\"dot\",text:\"Otherwise\"})\n return[null,msg]\n}", "outputs": 2, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 860, "y": 520, "wires": [ [], [] ], "outputLabels": [ "media app running", "otherwise" ] }, { "id": "a586df67c15b0914", "type": "link out", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "link out 1", "mode": "link", "links": [ "27b2c22907382e6d", "8146f43fea5aec03" ], "x": 975, "y": 520, "wires": [] }, { "id": "4738fd26d0e16bd4", "type": "comment", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Living Room", "info": "", "x": 370, "y": 240, "wires": [] }, { "id": "84f3e5a7cf5cdfc7", "type": "comment", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Basement", "info": "", "x": 380, "y": 360, "wires": [] }, { "id": "50a2a473686b0445", "type": "api-call-service", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Lights Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "light", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "{{lightsoff}}" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1400, "y": 300, "wires": [ [] ] }, { "id": "33fcb96a4c2c2541", "type": "delay", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "", "pauseType": "delay", "timeout": "3", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 1415, "y": 180, "wires": [ [ "8a84615173fd7e97" ] ], "l": false }, { "id": "a4d27381bd614fd1", "type": "switch", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Desk?", "property": "deskState", "propertyType": "flow", "rules": [ { "t": "eq", "v": "on", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 1, "x": 1355, "y": 180, "wires": [ [ "33fcb96a4c2c2541" ] ], "l": false }, { "id": "8a84615173fd7e97", "type": "api-call-service", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Reset Desk", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_select", "service": "select_option", "areaId": [], "deviceId": [], "entityId": [ "input_select.tina_desk_scenes" ], "data": "{\t \"option\":\"Reset\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1530, "y": 180, "wires": [ [] ] }, { "id": "f260e2410571356a", "type": "function", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Processing", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar deskState = flow.get(\"deskState\")\nvar livingRoomState = flow.get(\"livingRoomState\")\nvar diningRoomState = flow.get(\"diningRoomState\")\nvar basementState = flow.get(\"basementState\")\nvar basementTrigger = flow.get(\"basementTrigger\")\nvar lightsOff = []\nvar scenesReset = []\n\nscenesReset.push('scene.lightning_alert_restore_firstfloor')\n\nif (deskState === 'off') {\n lightsOff.push('light.tina_desk_lights')\n}\n\nif (diningRoomState === 'off') {\n lightsOff.push('light.dining_room_lamp')\n}\n\nif (livingRoomState === 'off') {\n lightsOff.push('light.living_room_lights')\n}\n\nif (basementTrigger === 'true') {\n if (basementState === 'off') {\n lightsOff.push('light.basement_studio_lights')\n } else {\n scenesReset.push('scene.lightning_alert_restore_basement')\n }\n}\n\nvar size = lightsOff.length\n\nvar resetMsg = {\n \"scenes\": scenesReset\n}\n\nvar lightsMsg = {\n \"lightsoff\": lightsOff\n}\n\nif (size > 0) {\n node.send([null,lightsMsg])\n}\n\nnode.send([resetMsg,null])", "outputs": 2, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1230, "y": 240, "wires": [ [ "b4b80e91a535923e", "a4d27381bd614fd1" ], [ "50a2a473686b0445" ] ], "outputLabels": [ "Scene Reset", "Lights Off" ] }, { "id": "b497fe229c8f2eea", "type": "function", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Routing", "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst who = states[\"binary_sensor.audible_weather_alerts_allowed\"].attributes.location\nconst payload = msg.payload\n\nlet newMsg = {\n \"payload\": payload,\n \"who\": who\n}\n\nnode.send(newMsg)\nnode.status({fill:\"green\",shape:\"dot\",text: payload + \", \" + who})", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 380, "y": 440, "wires": [ [ "1180e4c40c3ec0fa" ] ] }, { "id": "f47a0d107875d550", "type": "server-state-changed", "z": "ebd5561c4f077718", "g": "4329e464360d0afa", "name": "Lightning Warning", "server": "9e87348d.9c1c48", "version": 5, "outputs": 2, "exposeAsEntityConfig": "7cc6440f2cdd8a6b", "entityId": "binary_sensor.lightning_warning", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "on", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": true, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "duration", "propertyType": "msg", "value": "10", "valueType": "num" } ], "x": 150, "y": 360, "wires": [ [ "70f795fb061cbfef", "b2c0d6629b2603b7" ], [ "b497fe229c8f2eea" ] ] }, { "id": "1f7af146c06b8b85", "type": "ha-select", "z": "fc6801ef8637d652", "name": "Active Sporting Event", "version": 1, "debugenabled": false, "inputs": 0, "outputs": 1, "entityConfig": "95180a63dc83b944", "mode": "listen", "value": "payload", "valueType": "msg", "outputProperties": [ { "property": "#:(diskCon)::activeEvent", "propertyType": "flow", "value": "", "valueType": "value" }, { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" } ], "x": 260, "y": 380, "wires": [ [ "e2e55a6db871e124" ] ] }, { "id": "8e7bb3461773c5b9", "type": "ha-switch", "z": "fc6801ef8637d652", "name": "Watching Sports", "version": 0, "debugenabled": false, "inputs": 0, "outputs": 2, "entityConfig": "dc557449c40eba5e", "enableInput": false, "outputOnStateChange": true, "outputProperties": [ { "property": "watching", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 280, "y": 320, "wires": [ [ "e2e55a6db871e124" ], [ "e2e55a6db871e124" ] ] }, { "id": "c0e5b488ed073f56", "type": "ha-number", "z": "fc6801ef8637d652", "name": "Team Score", "version": 1, "debugenabled": false, "inputs": 0, "outputs": 1, "entityConfig": "c7a23a2b967375ec", "mode": "listen", "value": "payload", "valueType": "msg", "outputProperties": [ { "property": "teamScore", "propertyType": "msg", "value": "", "valueType": "value" }, { "property": "teamPreviousScore", "propertyType": "msg", "value": "", "valueType": "previousValue" } ], "x": 290, "y": 500, "wires": [ [ "04829df5b7dfb2c2" ] ] }, { "id": "77affe81dadd8a64", "type": "ha-number", "z": "fc6801ef8637d652", "name": "Opponent Score", "version": 1, "debugenabled": false, "inputs": 0, "outputs": 1, "entityConfig": "f64cc18b786d7352", "mode": "listen", "value": "payload", "valueType": "msg", "outputProperties": [ { "property": "oppScore", "propertyType": "msg", "value": "", "valueType": "value" }, { "property": "oppPreviousScore", "propertyType": "msg", "value": "", "valueType": "previousValue" } ], "x": 280, "y": 560, "wires": [ [ "103231f89b894205" ] ] }, { "id": "99c8d72f9eb4be38", "type": "function", "z": "fc6801ef8637d652", "name": "Init", "func": "const states = global.get('homeassistant.homeAssistant.states')\nconst team = flow.get(\"activeEvent\", \"diskCon\")\nconst room = flow.get(\"activeRoom\", \"diskCon\")\n\nif (team === 'No events today') {\n node.status({ fill: \"red\", shape: \"ring\", text: \"No events today\" })\n node.done\n} else {\n const lowerTeam = team.toLowerCase()\n const convertTeam = lowerTeam.replaceAll(\" \", \"_\")\n const sensor = \"sensor.\" + convertTeam\n const getInhibitSensor = \"binary_sensor.\" + convertTeam + \"_inhibit\"\n const inhibit = states[getInhibitSensor].state\n const teamSensor = states[sensor]\n const lowerRoom = room.toLowerCase()\n const convertRoom = lowerRoom.replaceAll(\" \",\"_\")\n const teamColors = teamSensor.attributes.team_colors\n const oppColors = teamSensor.attributes.opponent_colors\n\n flow.set(\"team\", convertTeam, \"diskCon\")\n flow.set(\"inhibit\", inhibit, \"diskCon\")\n flow.set(\"teamSensor\", teamSensor, \"diskCon\")\n flow.set(\"room\", convertRoom, \"diskCon\")\n flow.set(\"teamColors\", teamColors, \"diskCon\")\n flow.set(\"oppColors\", oppColors, \"diskCon\")\n\n let sendTeam = {\n \"payload\": teamColors,\n \"topic\": \"teamColors\"\n }\n\n let sendOpp = {\n \"payload\": oppColors,\n \"topic\": \"oppColors\"\n }\n\n node.send([[sendTeam,sendOpp]])\n \n node.status({fill:\"green\",shape:\"dot\",text:\"Team: \" + team})\n node.log(\"Active sports team changed to \" + team)\n}", "outputs": 1, "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, \"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": 810, "y": 380, "wires": [ [ "e0eb2dc4c1035407" ] ], "icon": "font-awesome/fa-hourglass-start" }, { "id": "eee6c6f985bbcc1e", "type": "comment", "z": "fc6801ef8637d652", "name": "Reliably catch score changes", "info": "", "x": 240, "y": 680, "wires": [] }, { "id": "aedcd3658f94590d", "type": "inject", "z": "fc6801ef8637d652", "name": "", "props": [ { "p": "payload" } ], "repeat": "300", "crontab": "", "once": true, "onceDelay": "30", "topic": "", "payload": "", "payloadType": "date", "x": 175, "y": 60, "wires": [ [ "518b1bb6954c11d2" ] ], "l": false }, { "id": "44f65019901cd6c8", "type": "ha-update-config", "z": "fc6801ef8637d652", "name": "Update Dropdown", "server": "9e87348d.9c1c48", "entityConfig": "95180a63dc83b944", "version": 0, "outputProperties": [], "x": 510, "y": 60, "wires": [ [] ] }, { "id": "518b1bb6954c11d2", "type": "function", "z": "fc6801ef8637d652", "name": "Events Today", "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, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 300, "y": 60, "wires": [ [ "44f65019901cd6c8" ] ] }, { "id": "0105c3f26dc03946", "type": "inject", "z": "fc6801ef8637d652", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": true, "onceDelay": "30", "topic": "", "payload": "", "payloadType": "date", "x": 115, "y": 260, "wires": [ [ "cfe0ade2b0e3be21", "1a397d63067f9bac" ] ], "l": false }, { "id": "cfe0ade2b0e3be21", "type": "api-current-state", "z": "fc6801ef8637d652", "name": "Watching Sports?", "server": "9e87348d.9c1c48", "version": 3, "outputs": 2, "halt_if": "on", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "switch.watching_sports", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "watching", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 270, "y": 260, "wires": [ [ "e2e55a6db871e124" ], [ "e2e55a6db871e124" ] ] }, { "id": "ab1e0278165f7fd1", "type": "function", "z": "fc6801ef8637d652", "name": "Scores", "func": "// Get sensor\nconst states = global.get('homeassistant.homeAssistant.states')\nconst active = states['switch.watching_sports'].state\n\nif (active === 'on') {\n // Get scores\n const team = flow.get(\"team\", \"diskCon\")\n const teamSensor = states[\"sensor.\" + team]\n const status = teamSensor.state\n if (status === 'IN') {\n const teamScore = teamSensor.attributes.team_score\n const oppScore = teamSensor.attributes.opponent_score\n msg = {\n \"teamscore\": teamScore,\n \"oppscore\": oppScore\n }\n node.status({ fill: \"green\", shape: \"dot\", text: \"Score: \" + teamScore + \"-\" + oppScore })\n node.send(msg)\n } else {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Not in game\" })\n }\n} else {\n node.status({ fill: \"red\", shape: \"ring\", text: \"Inactive\" })\n}", "outputs": 1, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 720, "y": 200, "wires": [ [ "5017d392b30ac710", "3d982dc8b2247951" ] ] }, { "id": "364a58744d93b5bb", "type": "inject", "z": "fc6801ef8637d652", "name": "", "props": [ { "p": "payload" } ], "repeat": "5", "crontab": "", "once": true, "onceDelay": "35", "topic": "", "payload": "", "payloadType": "date", "x": 290, "y": 200, "wires": [ [ "ab1e0278165f7fd1" ] ] }, { "id": "e2e55a6db871e124", "type": "api-call-service", "z": "fc6801ef8637d652", "name": "Reset Scores", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "number", "service": "set_value", "areaId": [], "deviceId": [], "entityId": [ "number.opponent_score", "number.team_score" ], "data": "{\t \"value\": 0\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 500, "y": 220, "wires": [ [ "ea6939832ebe09cf" ] ] }, { "id": "5017d392b30ac710", "type": "api-call-service", "z": "fc6801ef8637d652", "name": "Team Score", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "number", "service": "set_value", "areaId": [], "deviceId": [], "entityId": [ "number.team_score" ], "data": "{\t \"value\": teamscore\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 930, "y": 140, "wires": [ [] ] }, { "id": "3d982dc8b2247951", "type": "api-call-service", "z": "fc6801ef8637d652", "name": "Opponent Score", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "number", "service": "set_value", "areaId": [], "deviceId": [], "entityId": [ "number.opponent_score" ], "data": "{\t \"value\": oppscore\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 940, "y": 240, "wires": [ [] ] }, { "id": "04829df5b7dfb2c2", "type": "debug", "z": "fc6801ef8637d652", "name": "team score", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 490, "y": 500, "wires": [] }, { "id": "103231f89b894205", "type": "debug", "z": "fc6801ef8637d652", "name": "opp score", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 480, "y": 560, "wires": [] }, { "id": "ea6939832ebe09cf", "type": "delay", "z": "fc6801ef8637d652", "name": "", "pauseType": "delay", "timeout": "1", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 615, "y": 220, "wires": [ [ "ab1e0278165f7fd1" ] ], "l": false }, { "id": "4c7a405055e38678", "type": "ha-select", "z": "fc6801ef8637d652", "name": "Active Room", "version": 1, "debugenabled": false, "inputs": 0, "outputs": 1, "entityConfig": "39198b07403764b1", "mode": "listen", "value": "payload", "valueType": "msg", "outputProperties": [ { "property": "#:(diskCon)::activeRoom", "propertyType": "flow", "value": "", "valueType": "value" }, { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" } ], "x": 290, "y": 440, "wires": [ [] ] }, { "id": "e0eb2dc4c1035407", "type": "subflow:17510314e84badd9", "z": "fc6801ef8637d652", "name": "", "x": 1040, "y": 380, "wires": [] }, { "id": "4d93e5b1e81ce569", "type": "inject", "z": "fc6801ef8637d652", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "{\"options\":[\"Cleveland Guardians\",\"Los Angeles Dodgers\"]}", "payloadType": "json", "x": 330, "y": 20, "wires": [ [ "44f65019901cd6c8" ] ] }, { "id": "1a397d63067f9bac", "type": "ha-select", "z": "fc6801ef8637d652", "name": "Active Room", "version": 1, "debugenabled": false, "inputs": 1, "outputs": 1, "entityConfig": "39198b07403764b1", "mode": "get", "value": "payload", "valueType": "msg", "outputProperties": [ { "property": "#:(diskCon)::activeRoom", "propertyType": "flow", "value": "", "valueType": "value" }, { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" } ], "x": 290, "y": 120, "wires": [ [ "4e193132ac06af56" ] ] }, { "id": "4e193132ac06af56", "type": "ha-select", "z": "fc6801ef8637d652", "name": "Active Sporting Event", "version": 1, "debugenabled": false, "inputs": 1, "outputs": 1, "entityConfig": "95180a63dc83b944", "mode": "get", "value": "payload", "valueType": "msg", "outputProperties": [ { "property": "#:(diskCon)::activeEvent", "propertyType": "flow", "value": "", "valueType": "value" }, { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" } ], "x": 520, "y": 120, "wires": [ [] ] }, { "id": "ea686c71f041c78b", "type": "complete", "z": "fc6801ef8637d652", "name": "Watching?", "scope": [ "8e7bb3461773c5b9", "cfe0ade2b0e3be21" ], "uncaught": false, "x": 120, "y": 120, "wires": [ [ "1a397d63067f9bac" ] ] }, { "id": "e563dd31b4750c0e", "type": "complete", "z": "fc6801ef8637d652", "name": "Event/Room Change", "scope": [ "1f7af146c06b8b85", "4c7a405055e38678", "1a397d63067f9bac", "4e193132ac06af56" ], "uncaught": false, "x": 590, "y": 380, "wires": [ [ "99c8d72f9eb4be38", "2c2bb571085c5a90" ] ] }, { "id": "2c2bb571085c5a90", "type": "debug", "z": "fc6801ef8637d652", "name": "catch", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 810, "y": 440, "wires": [] }, { "id": "077ae8dc789e9089", "type": "comment", "z": "fc6801ef8637d652", "name": "Figuring out how to smoothly handle event and room changes", "info": "Need to be able to update context with necessary info\n\n- Team\n- Opponent\n- Colors\n- Room\n\netc", "x": 900, "y": 540, "wires": [] }, { "id": "1031080bdf3b95bf", "type": "server-state-changed", "z": "789ba711dc04fad2", "name": "Twitch Stream Status", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "sensor.twitch_ironnerd24", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 140, "y": 220, "wires": [ [ "4a51b2cf2fe4c02c" ] ], "outputLabels": [ "Live", "Offline" ] }, { "id": "dcf595a3aeb025a4", "type": "api-call-service", "z": "789ba711dc04fad2", "name": "Turn on booleans", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.gaming_mode", "input_boolean.studio_quiet" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 610, "y": 200, "wires": [ [] ] }, { "id": "21deb99e77dfa74d", "type": "api-call-service", "z": "789ba711dc04fad2", "name": "Turn off boolean", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "input_boolean", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "input_boolean.studio_quiet" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 600, "y": 320, "wires": [ [] ] }, { "id": "e6aea47391a1f784", "type": "api-call-service", "z": "789ba711dc04fad2", "name": "Basement DnD On", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_on", "areaId": [], "deviceId": [], "entityId": [ "switch.basement_echo_dot_do_not_disturb_switch" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 610, "y": 260, "wires": [ [] ] }, { "id": "3f97e618415f37c5", "type": "api-call-service", "z": "789ba711dc04fad2", "name": "Basement DnD Off", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "switch", "service": "turn_off", "areaId": [], "deviceId": [], "entityId": [ "switch.basement_echo_dot_do_not_disturb_switch" ], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 610, "y": 380, "wires": [ [] ] }, { "id": "dc05476aa4d90974", "type": "api-call-service", "z": "789ba711dc04fad2", "name": "TV Notifications", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "script", "service": "tv_notify", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"who\":\"all\",\t \"title\": \"Stream Starting\",\t \"message\": \"Tony has started a live stream in the studio!\",\t \"data\": {\t \"fontsize\": \"large\",\t \"duration\": 3,\t \"transparency\": \"30%\",\t \"color\": \"indigo\"\t }\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 600, "y": 140, "wires": [ [] ] }, { "id": "efade953371aa59e", "type": "mqtt out", "z": "789ba711dc04fad2", "name": "MQTT Publish", "topic": "house/studio/live", "qos": "1", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 600, "y": 80, "wires": [] }, { "id": "3eef2b6b25a9b04f", "type": "mqtt out", "z": "789ba711dc04fad2", "name": "MQTT Publish", "topic": "house/studio/live", "qos": "1", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 600, "y": 440, "wires": [] }, { "id": "596e7ae95bf50ffd", "type": "link in", "z": "789ba711dc04fad2", "name": "Cleanup - Twitch", "links": [ "619d1474239faf58" ], "x": 95, "y": 320, "wires": [ [ "f5e5f17c682ddb8c" ] ] }, { "id": "f5e5f17c682ddb8c", "type": "api-current-state", "z": "789ba711dc04fad2", "name": "State", "server": "9e87348d.9c1c48", "version": 3, "outputs": 1, "halt_if": "", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "sensor.twitch_ironnerd24", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 190, "y": 320, "wires": [ [ "4a51b2cf2fe4c02c" ] ], "outputLabels": [ "Live", "Offline" ] }, { "id": "4a51b2cf2fe4c02c", "type": "function", "z": "789ba711dc04fad2", "name": "Processing", "func": "var states = global.get('homeassistant.homeAssistant.states')\nvar vacationMode = states['input_boolean.vacation_mode'].state\nvar peoplePresent = states['binary_sensor.people_present'].state\nvar streamLive = msg.payload\n\nif (vacationMode === 'off' && peoplePresent === 'on') {\n if (streamLive === 'streaming') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Stream Live\"});\n return[msg,null]\n } else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Stream Offline\"});\n return[null,msg]\n }\n} else {\n node.status({fill:\"grey\",shape:\"dot\",text:\"Skipped\"});\n return null\n}", "outputs": 2, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 390, "y": 260, "wires": [ [ "e6aea47391a1f784", "dcf595a3aeb025a4", "dc05476aa4d90974", "efade953371aa59e" ], [ "21deb99e77dfa74d", "3f97e618415f37c5", "3eef2b6b25a9b04f" ] ], "icon": "node-red-contrib-cpu/cpu.png" }, { "id": "b109c8db1c2cd259", "type": "ha-button", "z": "ffa6a885ac41a5ed", "g": "46275dd0f9461013", "name": "Restart AppDaemon", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "04976a7418728aa3", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "date" } ], "x": 150, "y": 360, "wires": [ [ "75a50e8dac7af692" ] ] }, { "id": "75a50e8dac7af692", "type": "api-call-service", "z": "ffa6a885ac41a5ed", "g": "46275dd0f9461013", "name": "", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "hassio", "service": "addon_restart", "areaId": [], "deviceId": [], "entityId": [], "data": "{\t \"addon\":\"a0d7b954_appdaemon\"\t}", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 380, "y": 360, "wires": [ [] ] }, { "id": "baae5d6f53900594", "type": "ha-button", "z": "ffa6a885ac41a5ed", "g": "46275dd0f9461013", "name": "Cleanup", "version": 0, "debugenabled": false, "outputs": 1, "entityConfig": "a11aaf0288452997", "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "topic", "propertyType": "msg", "value": "cleanup", "valueType": "str" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "x": 120, "y": 420, "wires": [ [ "619d1474239faf58" ] ] }, { "id": "619d1474239faf58", "type": "link out", "z": "ffa6a885ac41a5ed", "g": "46275dd0f9461013", "name": "Cleanup", "mode": "link", "links": [ "6a1cecedd6ef4b44", "596e7ae95bf50ffd" ], "x": 235, "y": 420, "wires": [] }, { "id": "ce8a6bb6e9460f13", "type": "server-state-changed", "z": "ffa6a885ac41a5ed", "g": "6504d94aaaf9b8d9", "name": "Tony Desktop Power", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "sensor.tony_desktop_power", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 150, "y": 80, "wires": [ [ "ce5a2ea26f26e421" ] ] }, { "id": "ce5a2ea26f26e421", "type": "mqtt out", "z": "ffa6a885ac41a5ed", "g": "6504d94aaaf9b8d9", "name": "", "topic": "house/power/basement/tony_desktop", "qos": "0", "retain": "false", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 470, "y": 80, "wires": [] }, { "id": "abb6e16585d7fe61", "type": "server-state-changed", "z": "ffa6a885ac41a5ed", "g": "6504d94aaaf9b8d9", "name": "Kallen Desktop Power", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "sensor.kallen_desktop_power", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 160, "y": 140, "wires": [ [ "aa9b2f0ddc5b77d3" ] ] }, { "id": "aa9b2f0ddc5b77d3", "type": "mqtt out", "z": "ffa6a885ac41a5ed", "g": "6504d94aaaf9b8d9", "name": "", "topic": "house/power/basement/kallen_desktop", "qos": "0", "retain": "false", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 470, "y": 140, "wires": [] }, { "id": "0a8426dd99cbaeec", "type": "server-state-changed", "z": "ffa6a885ac41a5ed", "g": "6504d94aaaf9b8d9", "name": "Basement Server Power", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "sensor.basement_server_power", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 170, "y": 260, "wires": [ [ "8813b152ed76b96c" ] ] }, { "id": "8813b152ed76b96c", "type": "mqtt out", "z": "ffa6a885ac41a5ed", "g": "6504d94aaaf9b8d9", "name": "", "topic": "house/power/basement/basement_server", "qos": "0", "retain": "false", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 480, "y": 260, "wires": [] }, { "id": "9833b2aff0f97ea9", "type": "server-state-changed", "z": "ffa6a885ac41a5ed", "g": "6504d94aaaf9b8d9", "name": "Tina Desktop Power", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "sensor.tina_desktop_power", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 150, "y": 200, "wires": [ [ "51d05298561cfddb" ] ] }, { "id": "51d05298561cfddb", "type": "mqtt out", "z": "ffa6a885ac41a5ed", "g": "6504d94aaaf9b8d9", "name": "", "topic": "house/power/first_floor/tina_desk/tina_desktop", "qos": "0", "retain": "false", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 500, "y": 200, "wires": [] }, { "id": "ca88f85ba00a6744", "type": "inject", "z": "ffa6a885ac41a5ed", "g": "46275dd0f9461013", "name": "Reboot", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": true, "onceDelay": "120", "topic": "reboot", "payload": "", "payloadType": "date", "x": 140, "y": 480, "wires": [ [ "619d1474239faf58" ] ] }, { "id": "939abd584ee8580a", "type": "mqtt in", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Received 1min", "topic": "$SYS/broker/load/messages/received/1min", "qos": "1", "datatype": "auto-detect", "broker": "fd29421fc00140a8", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 840, "y": 80, "wires": [ [ "6b17d7fa4de2b620" ] ] }, { "id": "6b17d7fa4de2b620", "type": "function", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "function 4", "func": "let payload = msg.payload\n\nmsg.payload = Math.round(payload)\n\nreturn msg", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 985, "y": 80, "wires": [ [ "e2a8c8b2638be79f" ] ], "l": false }, { "id": "e2a8c8b2638be79f", "type": "ha-sensor", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Received 1min", "entityConfig": "b78174a1b561ea3f", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 1140, "y": 80, "wires": [ [] ] }, { "id": "96baea4b0d08d151", "type": "mqtt in", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Received 5min", "topic": "$SYS/broker/load/messages/received/5min", "qos": "1", "datatype": "auto-detect", "broker": "fd29421fc00140a8", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 840, "y": 140, "wires": [ [ "8357b66291d6f498" ] ] }, { "id": "8357b66291d6f498", "type": "function", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "function 5", "func": "let payload = msg.payload\n\nmsg.payload = Math.round(payload)\n\nreturn msg", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 985, "y": 140, "wires": [ [ "76eb43f2c84142f8" ] ], "l": false }, { "id": "76eb43f2c84142f8", "type": "ha-sensor", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Received 5min", "entityConfig": "acbe15cbb8457f35", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 1140, "y": 140, "wires": [ [] ] }, { "id": "1dc56852c1691e89", "type": "mqtt in", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Received 15min", "topic": "$SYS/broker/load/messages/received/15min", "qos": "1", "datatype": "auto-detect", "broker": "fd29421fc00140a8", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 840, "y": 200, "wires": [ [ "b2a69c7d24c170ad" ] ] }, { "id": "b2a69c7d24c170ad", "type": "function", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "function 6", "func": "let payload = msg.payload\n\nmsg.payload = Math.round(payload)\n\nreturn msg", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 985, "y": 200, "wires": [ [ "0f107a6c4d46cdc8" ] ], "l": false }, { "id": "0f107a6c4d46cdc8", "type": "ha-sensor", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Received 15min", "entityConfig": "e023cc05d1c0cecb", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 1140, "y": 200, "wires": [ [] ] }, { "id": "79822e9d0a97457c", "type": "mqtt in", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Sent 1min", "topic": "$SYS/broker/load/messages/sent/1min", "qos": "1", "datatype": "auto-detect", "broker": "fd29421fc00140a8", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 820, "y": 260, "wires": [ [ "ef26acc3d75b5b93" ] ] }, { "id": "ef26acc3d75b5b93", "type": "function", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "function 7", "func": "let payload = msg.payload\n\nmsg.payload = Math.round(payload)\n\nreturn msg", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 985, "y": 260, "wires": [ [ "d790797e62163c2b" ] ], "l": false }, { "id": "d790797e62163c2b", "type": "ha-sensor", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Sent 1min", "entityConfig": "7f5c52481ee5041b", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 1120, "y": 260, "wires": [ [] ] }, { "id": "463eb1286393993a", "type": "mqtt in", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Sent 5min", "topic": "$SYS/broker/load/messages/sent/5min", "qos": "1", "datatype": "auto-detect", "broker": "fd29421fc00140a8", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 820, "y": 320, "wires": [ [ "396cee5f3aa5255f" ] ] }, { "id": "396cee5f3aa5255f", "type": "function", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "function 8", "func": "let payload = msg.payload\n\nmsg.payload = Math.round(payload)\n\nreturn msg", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 985, "y": 320, "wires": [ [ "af22ad5de7f824ed" ] ], "l": false }, { "id": "af22ad5de7f824ed", "type": "ha-sensor", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Sent 5min", "entityConfig": "b1afb202ae5b94cf", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 1120, "y": 320, "wires": [ [] ] }, { "id": "cb37ef0a4c6a0d4b", "type": "mqtt in", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Sent 15min", "topic": "$SYS/broker/load/messages/sent/15min", "qos": "1", "datatype": "auto-detect", "broker": "fd29421fc00140a8", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 830, "y": 380, "wires": [ [ "538a80f1ef807ce5" ] ] }, { "id": "538a80f1ef807ce5", "type": "function", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "function 9", "func": "let payload = msg.payload\n\nmsg.payload = Math.round(payload)\n\nreturn msg", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 985, "y": 380, "wires": [ [ "8bc88748bdc7fec8" ] ], "l": false }, { "id": "8bc88748bdc7fec8", "type": "ha-sensor", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Sent 15min", "entityConfig": "608fb2f833106a54", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 1130, "y": 380, "wires": [ [] ] }, { "id": "ca36c535f62a938b", "type": "mqtt in", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Dropped 1min", "topic": "$SYS/broker/load/publish/dropped/1min", "qos": "1", "datatype": "auto-detect", "broker": "fd29421fc00140a8", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 830, "y": 440, "wires": [ [ "fe5a9d13c3acdf8a" ] ] }, { "id": "fe5a9d13c3acdf8a", "type": "function", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "function 10", "func": "let payload = msg.payload\n\nmsg.payload = Math.round(payload)\n\nreturn msg", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 985, "y": 440, "wires": [ [ "704c78f0839b0cbf" ] ], "l": false }, { "id": "704c78f0839b0cbf", "type": "ha-sensor", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Dropped 1min", "entityConfig": "3a3de00eeef75917", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 1140, "y": 440, "wires": [ [] ] }, { "id": "a98df8034046bdc1", "type": "mqtt in", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Dropped 5min", "topic": "$SYS/broker/load/publish/dropped/5min", "qos": "1", "datatype": "auto-detect", "broker": "fd29421fc00140a8", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 830, "y": 500, "wires": [ [ "fe27369f5d336321" ] ] }, { "id": "fe27369f5d336321", "type": "function", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "function 11", "func": "let payload = msg.payload\n\nmsg.payload = Math.round(payload)\n\nreturn msg", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 985, "y": 500, "wires": [ [ "1812eb70af41b475" ] ], "l": false }, { "id": "1812eb70af41b475", "type": "ha-sensor", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Dropped 5min", "entityConfig": "01b4bc2b7f492cac", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 1140, "y": 500, "wires": [ [] ] }, { "id": "6e7294be1430b43a", "type": "mqtt in", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Dropped 15min", "topic": "$SYS/broker/load/publish/dropped/15min", "qos": "1", "datatype": "auto-detect", "broker": "fd29421fc00140a8", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 840, "y": 560, "wires": [ [ "60b562a91a724301" ] ] }, { "id": "60b562a91a724301", "type": "function", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "function 12", "func": "let payload = msg.payload\n\nmsg.payload = Math.round(payload)\n\nreturn msg", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 985, "y": 560, "wires": [ [ "ed548a3f33ed2137" ] ], "l": false }, { "id": "ed548a3f33ed2137", "type": "ha-sensor", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Dropped 15min", "entityConfig": "58b262f448b7831a", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 1140, "y": 560, "wires": [ [] ] }, { "id": "9df778270aff32c7", "type": "mqtt in", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Uptime", "topic": "$SYS/broker/uptime", "qos": "1", "datatype": "auto-detect", "broker": "fd29421fc00140a8", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 810, "y": 620, "wires": [ [ "5486cc70a2a83cd0" ] ] }, { "id": "5f6468dc8b022b6b", "type": "ha-sensor", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Uptime", "entityConfig": "63b391b64c920d72", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 1120, "y": 620, "wires": [ [] ] }, { "id": "5486cc70a2a83cd0", "type": "function", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Formatting", "func": "const payload = msg.payload\nconst numbersOnly = payload.replace(/\\D/g, \"\")\n\nmsg.payload = numbersOnly\n\nreturn msg", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 985, "y": 620, "wires": [ [ "5f6468dc8b022b6b" ] ], "l": false }, { "id": "c95f5ac879cfef5d", "type": "mqtt in", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Msg Received", "topic": "$SYS/broker/messages/received", "qos": "1", "datatype": "auto-detect", "broker": "fd29421fc00140a8", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 830, "y": 740, "wires": [ [ "ccebc1def6a944d9" ] ] }, { "id": "ccebc1def6a944d9", "type": "ha-sensor", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Msg Received", "entityConfig": "06c585be926ee13b", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 1140, "y": 740, "wires": [ [] ] }, { "id": "a675ad54d1ec36fa", "type": "mqtt in", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Msg Sent", "topic": "$SYS/broker/messages/sent", "qos": "1", "datatype": "auto-detect", "broker": "fd29421fc00140a8", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 820, "y": 800, "wires": [ [ "0723c20ffd541ca7" ] ] }, { "id": "0723c20ffd541ca7", "type": "ha-sensor", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Msg Sent", "entityConfig": "20642905379cffe9", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 1120, "y": 800, "wires": [ [] ] }, { "id": "6596ad2f0c91a78c", "type": "ha-sensor", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Msg Stored", "entityConfig": "3e54ec9fa6f987bc", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 1130, "y": 680, "wires": [ [] ] }, { "id": "bb4ca3d4e66d87a5", "type": "mqtt in", "z": "ffa6a885ac41a5ed", "g": "23b02b1256dfd302", "name": "Msg Stored", "topic": "$SYS/broker/messages/stored", "qos": "1", "datatype": "auto-detect", "broker": "fd29421fc00140a8", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 830, "y": 680, "wires": [ [ "6596ad2f0c91a78c" ] ] }, { "id": "e8d2135bb5564a4a", "type": "server-state-changed", "z": "3e4ba157b540d183", "g": "6e83103b5c5311e9", "name": "Voice Change", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_select.jarvis_voice", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "", "valueType": "triggerId" } ], "x": 150, "y": 60, "wires": [ [ "a75651492e779bfc" ] ] }, { "id": "4d724735025b0ed8", "type": "server-state-changed", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Work Today", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_boolean.work_today", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": false, "ignoreCurrentStateUnavailable": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 130, "y": 340, "wires": [ [ "6ec62f6cf4fcf994" ] ] }, { "id": "6ec62f6cf4fcf994", "type": "switch", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "", "property": "payload", "propertyType": "msg", "rules": [ { "t": "eq", "v": "on", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 1, "x": 430, "y": 340, "wires": [ [ "486bca43ddc48fb8" ] ] }, { "id": "71bee01e93d372c4", "type": "inject", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "00 01 * * *", "once": false, "onceDelay": 0.1, "topic": "", "payload": "off", "payloadType": "str", "x": 610, "y": 400, "wires": [ [ "486bca43ddc48fb8" ] ] }, { "id": "31ce8ad28dd41226", "type": "api-render-template", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Offset Before", "server": "9e87348d.9c1c48", "version": 0, "template": "{{ (state_attr('input_datetime.tina_workday_end', 'timestamp') - 5400) | timestamp_custom('%H:%M', false) }}", "resultsLocation": "start", "resultsLocationType": "msg", "templateLocation": "", "templateLocationType": "none", "x": 410, "y": 240, "wires": [ [ "20271b0662a4d5df" ] ] }, { "id": "20271b0662a4d5df", "type": "api-render-template", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Offset After", "server": "9e87348d.9c1c48", "version": 0, "template": "{{ (state_attr('input_datetime.tina_workday_end', 'timestamp') + 7200) | timestamp_custom('%H:%M', false) }}", "resultsLocation": "stop", "resultsLocationType": "msg", "templateLocation": "", "templateLocationType": "none", "x": 590, "y": 240, "wires": [ [ "16bf625c802d7910" ] ] }, { "id": "69886cf636bf4f70", "type": "inject", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Set Schedule", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "00 06 * * *", "once": false, "onceDelay": "1", "topic": "", "payload": "", "payloadType": "date", "x": 160, "y": 240, "wires": [ [ "31ce8ad28dd41226" ] ] }, { "id": "16bf625c802d7910", "type": "function", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Set Times", "func": "msg.payload = {\n \"start\": msg.start,\n \"stop\": msg.stop,\n \"days\": [\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7\n ]\n}\nmsg.topic = \"override\"\nnode.status({fill:\"green\",shape:\"dot\",text:msg.start + \" - \" + msg.stop});\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 760, "y": 240, "wires": [ [ "b6cb206d9cb34610" ] ], "icon": "font-awesome/fa-clock-o" }, { "id": "a32c37ccf0102258", "type": "inject", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Set Workday on Reboot", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": true, "onceDelay": "120", "topic": "", "payload": "", "payloadType": "date", "x": 190, "y": 400, "wires": [ [ "d5c6b45df763e57e" ] ] }, { "id": "d5c6b45df763e57e", "type": "api-current-state", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Work Today", "server": "9e87348d.9c1c48", "version": 3, "outputs": 1, "halt_if": "", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "input_boolean.work_today", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 410, "y": 400, "wires": [ [ "486bca43ddc48fb8" ] ] }, { "id": "6f011420f6bb15a7", "type": "inject", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Set Schedule on Reboot", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": true, "onceDelay": "120", "topic": "", "payload": "", "payloadType": "date", "x": 190, "y": 280, "wires": [ [ "31ce8ad28dd41226" ] ] }, { "id": "f6f45d3e3cf9aeab", "type": "inject", "z": "3e4ba157b540d183", "g": "6e83103b5c5311e9", "name": "Set Voice on Reboot", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": true, "onceDelay": "120", "topic": "", "payload": "", "payloadType": "date", "x": 180, "y": 120, "wires": [ [ "40c9c33453179a21" ] ] }, { "id": "40c9c33453179a21", "type": "api-current-state", "z": "3e4ba157b540d183", "g": "6e83103b5c5311e9", "name": "Jarvis Voice", "server": "9e87348d.9c1c48", "version": 3, "outputs": 1, "halt_if": "", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "input_select.jarvis_voice", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "entity" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 390, "y": 120, "wires": [ [ "a75651492e779bfc" ] ] }, { "id": "74bb3d48dd17bef9", "type": "mqtt out", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "MQTT Publish", "topic": "house/scheduling/tina/work_today", "qos": "2", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 1000, "y": 340, "wires": [] }, { "id": "b49f0642ce0153c6", "type": "mqtt out", "z": "3e4ba157b540d183", "g": "6e83103b5c5311e9", "name": "MQTT Publish", "topic": "house/jarvis/voice", "qos": "2", "retain": "true", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "fd29421fc00140a8", "x": 840, "y": 60, "wires": [] }, { "id": "486bca43ddc48fb8", "type": "change", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "", "rules": [ { "t": "set", "p": "tinawork", "pt": "global", "to": "payload", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 790, "y": 340, "wires": [ [ "74bb3d48dd17bef9" ] ] }, { "id": "a75651492e779bfc", "type": "change", "z": "3e4ba157b540d183", "g": "6e83103b5c5311e9", "name": "", "rules": [ { "t": "set", "p": "#:(diskCon)::jarvis_voice", "pt": "global", "to": "payload", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 620, "y": 60, "wires": [ [ "b49f0642ce0153c6" ] ] }, { "id": "a09f10883f07aad0", "type": "server-state-changed", "z": "3e4ba157b540d183", "g": "265593f442864b6a", "name": "MB Aircon Installed", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "input_boolean.master_bedroom_aircon_installed", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": false, "ignorePrevStateUnavailable": false, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 170, "y": 620, "wires": [ [ "a8d7f5e5d4f549b0" ] ] }, { "id": "464e9271285f8450", "type": "api-current-state", "z": "3e4ba157b540d183", "g": "265593f442864b6a", "name": "MB Aircon Installed", "server": "9e87348d.9c1c48", "version": 3, "outputs": 1, "halt_if": "", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "input_boolean.master_bedroom_aircon_installed", "state_type": "str", "blockInputOverrides": false, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 350, "y": 700, "wires": [ [ "a8d7f5e5d4f549b0" ] ] }, { "id": "9c8056404bfcafed", "type": "inject", "z": "3e4ba157b540d183", "g": "265593f442864b6a", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": true, "onceDelay": "120", "topic": "", "payload": "", "payloadType": "date", "x": 150, "y": 700, "wires": [ [ "464e9271285f8450" ] ] }, { "id": "a8d7f5e5d4f549b0", "type": "change", "z": "3e4ba157b540d183", "g": "265593f442864b6a", "name": "", "rules": [ { "t": "set", "p": "#:(diskCon)::mb_aircon_installed", "pt": "global", "to": "payload", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 610, "y": 620, "wires": [ [] ] }, { "id": "04fdddae578ee136", "type": "alexa-remote-event", "z": "3e4ba157b540d183", "g": "931cc27100c9317e", "name": "", "account": "be975ce229701797", "event": "ws-device-activity", "x": 150, "y": 860, "wires": [ [ "266634bf3c6019c8", "f9bc4d36a0df7947" ] ] }, { "id": "266634bf3c6019c8", "type": "function", "z": "3e4ba157b540d183", "g": "931cc27100c9317e", "name": "Set Global Variables", "func": "var name = msg.payload.name\nvar serial = msg.payload.deviceSerialNumber\nvar entityId = '{}'\n\nif (name === 'Basement Echo Dot') {\n var entityId = 'media_player.basement_echo_dot'\n} else if (name === 'Living Room Echo Dot') {\n var entityId = 'media_player.living_room_echo_dot'\n} else if (name === 'Master Bedroom Echo Dot') {\n var entityId = 'media_player.master_bedroom_echo_dot'\n}\n\nvar nameMsg = {\n \"payload\": name\n}\nvar serialMsg = {\n \"payload\": serial\n}\nvar entityMsg = {\n \"payload\": entityId\n}\n\nglobal.set('lastAlexaName',name)\nglobal.set('lastAlexaEntityId',entityId)\nglobal.set('lastAlexaSerial',serial)\n\nnode.status({fill:\"green\",shape:\"dot\",text:name});\n\nreturn[nameMsg,serialMsg,entityMsg];", "outputs": 3, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 380, "y": 860, "wires": [ [ "4560584de593b5c1" ], [ "488e4f61d16705d4" ], [ "1f3142828a586d08" ] ], "outputLabels": [ "Name", "Serial", "Entity ID" ], "icon": "font-awesome/fa-globe" }, { "id": "4560584de593b5c1", "type": "ha-sensor", "z": "3e4ba157b540d183", "g": "931cc27100c9317e", "name": "Name", "entityConfig": "4118a859da3ae01f", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 610, "y": 800, "wires": [ [] ] }, { "id": "488e4f61d16705d4", "type": "ha-sensor", "z": "3e4ba157b540d183", "g": "931cc27100c9317e", "name": "Serial", "entityConfig": "790a5433342e7eb5", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 610, "y": 860, "wires": [ [] ] }, { "id": "1f3142828a586d08", "type": "ha-sensor", "z": "3e4ba157b540d183", "g": "931cc27100c9317e", "name": "Entity ID", "entityConfig": "4d3001dabc174efe", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 620, "y": 920, "wires": [ [] ] }, { "id": "f9bc4d36a0df7947", "type": "debug", "z": "3e4ba157b540d183", "g": "931cc27100c9317e", "name": "Alexa Activities", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 360, "y": 940, "wires": [] }, { "id": "d2c017d8f8c1dc68", "type": "subflow:7cc13ada.b6712c", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "", "env": [ { "name": "start", "value": "15:00", "type": "str" }, { "name": "stop", "value": "17:00", "type": "str" } ], "x": 920, "y": 500, "wires": [ [ "5f0f296e4f242dfe" ], [ "80fcb34c004369e7" ] ] }, { "id": "7a6299413cbbbdcf", "type": "api-render-template", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Offset Before", "server": "9e87348d.9c1c48", "version": 0, "template": "{{ (state_attr('input_datetime.tina_workday_start', 'timestamp') - 5400) | timestamp_custom('%H:%M', false) }}", "resultsLocation": "start", "resultsLocationType": "msg", "templateLocation": "", "templateLocationType": "none", "x": 410, "y": 460, "wires": [ [ "92c97bdd3ffb345d" ] ] }, { "id": "92c97bdd3ffb345d", "type": "api-render-template", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Offset After", "server": "9e87348d.9c1c48", "version": 0, "template": "{{ (state_attr('input_datetime.tina_workday_start', 'timestamp') + 900) | timestamp_custom('%H:%M', false) }}", "resultsLocation": "stop", "resultsLocationType": "msg", "templateLocation": "", "templateLocationType": "none", "x": 590, "y": 460, "wires": [ [ "1fd2518454b8b8a1" ] ] }, { "id": "1fd2518454b8b8a1", "type": "function", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Set Times", "func": "msg.payload = {\n \"start\": msg.start,\n \"stop\": msg.stop,\n \"days\": [\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7\n ]\n}\nmsg.topic = \"override\"\nnode.status({fill:\"green\",shape:\"dot\",text:msg.start + \" - \" + msg.stop});\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 760, "y": 460, "wires": [ [ "d2c017d8f8c1dc68" ] ], "icon": "font-awesome/fa-clock-o" }, { "id": "33845d78dadbb4df", "type": "inject", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Set Schedule", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "58 03 * * *", "once": false, "onceDelay": "1", "topic": "", "payload": "", "payloadType": "date", "x": 160, "y": 460, "wires": [ [ "7a6299413cbbbdcf" ] ] }, { "id": "cc54107a01eca8c2", "type": "inject", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Set Schedule on Reboot", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": true, "onceDelay": "120", "topic": "", "payload": "", "payloadType": "date", "x": 190, "y": 500, "wires": [ [ "7a6299413cbbbdcf" ] ] }, { "id": "2a2e328746eed124", "type": "inject", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "", "props": [ { "p": "payload" } ], "repeat": "60", "crontab": "", "once": true, "onceDelay": "1", "topic": "", "payload": "", "payloadType": "date", "x": 750, "y": 520, "wires": [ [ "d2c017d8f8c1dc68" ] ] }, { "id": "80fcb34c004369e7", "type": "change", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Off", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "off", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1035, "y": 500, "wires": [ [ "d2d529b327823c22" ] ], "l": false }, { "id": "5f0f296e4f242dfe", "type": "change", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "On", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "on", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1035, "y": 440, "wires": [ [ "d2d529b327823c22" ] ], "l": false }, { "id": "d2d529b327823c22", "type": "ha-binary-sensor", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Tina Work Start Zone", "entityConfig": "3577b1d6ba521c18", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 1200, "y": 480, "wires": [ [] ] }, { "id": "b6cb206d9cb34610", "type": "subflow:7cc13ada.b6712c", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "", "env": [ { "name": "start", "value": "15:00", "type": "str" }, { "name": "stop", "value": "17:00", "type": "str" } ], "x": 920, "y": 280, "wires": [ [ "149704b9f6497881" ], [ "1e1eb662bad16e38" ] ] }, { "id": "51b11f9d5b8bfbb0", "type": "inject", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "", "props": [ { "p": "payload" } ], "repeat": "60", "crontab": "", "once": true, "onceDelay": "1", "topic": "", "payload": "", "payloadType": "date", "x": 750, "y": 300, "wires": [ [ "b6cb206d9cb34610" ] ] }, { "id": "1e1eb662bad16e38", "type": "change", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Off", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "off", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1035, "y": 280, "wires": [ [ "8fe032f757ed2b62" ] ], "l": false }, { "id": "149704b9f6497881", "type": "change", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "On", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "on", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1035, "y": 220, "wires": [ [ "8fe032f757ed2b62" ] ], "l": false }, { "id": "8fe032f757ed2b62", "type": "ha-binary-sensor", "z": "3e4ba157b540d183", "g": "5c50443a84910fb7", "name": "Tina Work End Zone", "entityConfig": "e5f345a03a1ef184", "version": 0, "state": "payload", "stateType": "msg", "attributes": [], "inputOverride": "allow", "outputProperties": [], "x": 1200, "y": 260, "wires": [ [] ] }, { "id": "274be2385ae894ce", "type": "api-render-template", "z": "3e4ba157b540d183", "g": "385f03591bc34bcc", "name": "", "server": "9e87348d.9c1c48", "version": 0, "template": "{% set temps = [\n states.sensor.kdfi_temperature,\n states.sensor.pirateweather_temperature,\n states.sensor.openweathermap_temperature,\n states.sensor.myradar_temperature\n] %}\n{% set sensor = temps | selectattr('state','ne','unavailable') | selectattr('state','ne','unknown') | map(attribute='entity_id') | list | first %}\n{{ states(sensor) | float }}\n", "resultsLocation": "temperature", "resultsLocationType": "msg", "templateLocation": "", "templateLocationType": "none", "x": 320, "y": 1040, "wires": [ [ "15f7382daddb4b3e" ] ] }, { "id": "dcc947fe66b6342b", "type": "inject", "z": "3e4ba157b540d183", "g": "385f03591bc34bcc", "name": "", "props": [ { "p": "payload" } ], "repeat": "60", "crontab": "", "once": true, "onceDelay": "30", "topic": "", "payload": "", "payloadType": "date", "x": 150, "y": 1040, "wires": [ [ "274be2385ae894ce" ] ] }, { "id": "15f7382daddb4b3e", "type": "function", "z": "3e4ba157b540d183", "g": "385f03591bc34bcc", "name": "Set Global Variables", "func": "var temp = msg.temperature\n\nglobal.set('tempInt',parseInt(temp))\nglobal.set('tempFloat',parseFloat(temp))\nglobal.set('tempStr',temp)\n\nnode.status({fill:\"green\",shape:\"dot\",text:temp});", "outputs": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 540, "y": 1040, "wires": [] }, { "id": "ec5628079748bafe", "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, \"diskCon\")\nglobal.set(\"tvRooms\", tvRooms, \"diskCon\")\n\nnode.status({fill:\"green\",shape:\"dot\",text:\"Saved\"});", "outputs": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1040, "y": 620, "wires": [] }, { "id": "f49fc3da65a68efd", "type": "inject", "z": "3e4ba157b540d183", "name": "Update", "props": [ { "p": "payload" } ], "repeat": "3600", "crontab": "", "once": true, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 880, "y": 620, "wires": [ [ "ec5628079748bafe" ] ] }, { "id": "e038489eca14b1dd", "type": "discordMessage", "z": "d3dcbe534743b01d", "name": "", "token": "fd929ec3bfbeef1a", "x": 180, "y": 200, "wires": [ [ "a8a7658145e92c1d", "e05ecd981929376b" ] ] }, { "id": "e5f2798df4bf16d6", "type": "debug", "z": "d3dcbe534743b01d", "name": "debug-pass", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 530, "y": 60, "wires": [] }, { "id": "a8a7658145e92c1d", "type": "switch", "z": "d3dcbe534743b01d", "name": "", "property": "member.roles", "propertyType": "msg", "rules": [ { "t": "cont", "v": "1002314506271203509", "vt": "str" }, { "t": "else" } ], "checkall": "true", "repair": true, "outputs": 2, "x": 350, "y": 200, "wires": [ [ "e5f2798df4bf16d6", "8a2f04665191a1a7" ], [ "7742083919fb7b59" ] ] }, { "id": "7742083919fb7b59", "type": "debug", "z": "d3dcbe534743b01d", "name": "debug-fail", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 520, "y": 100, "wires": [] }, { "id": "c2b9267e3ea81cd4", "type": "discordMessageManager", "z": "d3dcbe534743b01d", "d": true, "name": "", "channel": "", "token": "fd929ec3bfbeef1a", "x": 750, "y": 280, "wires": [ [] ] }, { "id": "8a2f04665191a1a7", "type": "change", "z": "d3dcbe534743b01d", "d": true, "name": "", "rules": [ { "t": "set", "p": "channel", "pt": "msg", "to": "1002320534614323260", "tot": "str" }, { "t": "set", "p": "payload", "pt": "msg", "to": "Farts are fun", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 520, "y": 260, "wires": [ [ "c2b9267e3ea81cd4" ] ] }, { "id": "d777145b11649c65", "type": "debug", "z": "d3dcbe534743b01d", "name": "debug-lights", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1470, "y": 320, "wires": [] }, { "id": "e05ecd981929376b", "type": "switch", "z": "d3dcbe534743b01d", "name": "Permissions", "property": "member.roles", "propertyType": "msg", "rules": [ { "t": "cont", "v": "1002314506271203509", "vt": "str" } ], "checkall": "true", "repair": true, "outputs": 1, "x": 370, "y": 420, "wires": [ [ "76d4b57e3b98e799" ] ] }, { "id": "76d4b57e3b98e799", "type": "change", "z": "d3dcbe534743b01d", "name": "Prepare service data", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "$split($trim($lowercase(payload)), \" \", 3)", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 580, "y": 420, "wires": [ [ "64a02909ab4707e0" ] ] }, { "id": "64a02909ab4707e0", "type": "switch", "z": "d3dcbe534743b01d", "name": "Service selection", "property": "payload", "propertyType": "msg", "rules": [ { "t": "cont", "v": "light", "vt": "str" }, { "t": "eq", "v": "temperature", "vt": "str" }, { "t": "eq", "v": "humidity", "vt": "str" }, { "t": "eq", "v": "help", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 4, "x": 810, "y": 420, "wires": [ [ "97bc11edf2480435" ], [], [], [] ] }, { "id": "97bc11edf2480435", "type": "change", "z": "d3dcbe534743b01d", "name": "Prepare light entity", "rules": [ { "t": "set", "p": "payload[1]", "pt": "msg", "to": "$string(payload[0]) & \" \" & $string(payload[1]) & \" \" & $string(payload[2])", "tot": "jsonata" }, { "t": "set", "p": "payload[0]", "pt": "msg", "to": "light", "tot": "str" }, { "t": "change", "p": "payload[1]", "pt": "msg", "from": "studio", "fromt": "str", "to": "basement_studio_lights", "tot": "str" }, { "t": "change", "p": "payload[2]", "pt": "msg", "from": "off", "fromt": "str", "to": "turn_off", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1030, "y": 380, "wires": [ [ "c56e681e1210b7fb" ] ] }, { "id": "c56e681e1210b7fb", "type": "template", "z": "d3dcbe534743b01d", "name": "Format service data", "field": "payload", "fieldType": "msg", "format": "json", "syntax": "mustache", "template": "{\n \"domain\": \"{{payload.0}}\",\n \"service\": \"{{payload.2}}\",\n \"data\": {\"entity_id\":\"{{payload.1}}\"}\n}", "output": "json", "x": 1260, "y": 380, "wires": [ [ "34bfc4d501d21f17", "d777145b11649c65" ] ] }, { "id": "34bfc4d501d21f17", "type": "api-call-service", "z": "d3dcbe534743b01d", "name": "Call light service", "server": "9e87348d.9c1c48", "version": 5, "debugenabled": false, "domain": "", "service": "", "areaId": [], "deviceId": [], "entityId": [], "data": "", "dataType": "jsonata", "mergeContext": "", "mustacheAltTags": false, "outputProperties": [], "queue": "none", "x": 1480, "y": 380, "wires": [ [] ] }, { "id": "6a28a84de488e39d", "type": "debug", "z": "d3dcbe534743b01d", "name": "fs22status", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 930, "y": 560, "wires": [] }, { "id": "229adf0d8b27fd7c", "type": "server-state-changed", "z": "d3dcbe534743b01d", "name": "FS22 Server Status", "server": "9e87348d.9c1c48", "version": 5, "outputs": 1, "exposeAsEntityConfig": "", "entityId": "sensor.win10_vm_processactive", "entityIdType": "exact", "outputInitially": false, "stateType": "str", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputOnlyOnStateChange": true, "for": "0", "forType": "num", "forUnits": "minutes", "ignorePrevStateNull": false, "ignorePrevStateUnknown": true, "ignorePrevStateUnavailable": true, "ignoreCurrentStateUnknown": true, "ignoreCurrentStateUnavailable": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" }, { "property": "data", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "", "valueType": "triggerId" } ], "x": 190, "y": 560, "wires": [ [ "305cc8b15072569c" ] ] }, { "id": "305cc8b15072569c", "type": "switch", "z": "d3dcbe534743b01d", "name": "", "property": "payload", "propertyType": "msg", "rules": [ { "t": "gt", "v": "0", "vt": "str" }, { "t": "eq", "v": "0", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 370, "y": 560, "wires": [ [ "69b1f5484ee668b9" ], [ "d8ace9a59d21cad0" ] ], "outputLabels": [ "Up", "Down" ] }, { "id": "d9170dbc46fa2c0b", "type": "discordMessageManager", "z": "d3dcbe534743b01d", "name": "Send Message", "channel": "", "token": "fd929ec3bfbeef1a", "x": 740, "y": 560, "wires": [ [ "6a28a84de488e39d" ] ] }, { "id": "69b1f5484ee668b9", "type": "change", "z": "d3dcbe534743b01d", "name": "Up message", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "Farming Simulator 22 server is up and running!", "tot": "str" }, { "t": "set", "p": "channel", "pt": "msg", "to": "912503253973999617", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 530, "y": 520, "wires": [ [ "d9170dbc46fa2c0b" ] ] }, { "id": "d8ace9a59d21cad0", "type": "change", "z": "d3dcbe534743b01d", "name": "Down message", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "Farming Simulator 22 server is down!", "tot": "str" }, { "t": "set", "p": "channel", "pt": "msg", "to": "912503253973999617", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 540, "y": 580, "wires": [ [ "d9170dbc46fa2c0b" ] ] }, { "id": "bf2ad73a.23bdb8", "type": "change", "z": "d49b385d8b582b20", "name": "Save Secret", "rules": [ { "t": "set", "p": "#:(secrets)::secret_id", "pt": "global", "to": "secret_value", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1070, "y": 140, "wires": [ [] ] }, { "id": "5c5c19b4.549de8", "type": "inject", "z": "d49b385d8b582b20", "name": "Press", "props": [ { "p": "payload", "v": "", "vt": "date" }, { "p": "topic", "v": "", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 910, "y": 140, "wires": [ [ "bf2ad73a.23bdb8" ] ] }, { "id": "635934334d5cf6a5", "type": "http request", "z": "d49b385d8b582b20", "name": "Get Todoist API Info", "method": "GET", "ret": "obj", "paytoqs": "ignore", "url": "https://api.todoist.com/sync/v9/sync?sync_token='*'&resource_types=[\"all\"]", "tls": "", "persist": false, "proxy": "", "insecureHTTPParser": false, "authType": "bearer", "senderr": false, "headers": [], "x": 1090, "y": 80, "wires": [ [ "c4b9e44cd5ad6448" ] ] }, { "id": "c821804b2468d585", "type": "inject", "z": "d49b385d8b582b20", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 900, "y": 80, "wires": [ [ "635934334d5cf6a5" ] ] }, { "id": "c4b9e44cd5ad6448", "type": "debug", "z": "d49b385d8b582b20", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1270, "y": 80, "wires": [] }, { "id": "2a6fe7c07c6b34e1", "type": "subflow:3aa2aec226246753", "z": "d49b385d8b582b20", "name": "", "x": 1070, "y": 200, "wires": [] }, { "id": "942304b8743cdd40", "type": "inject", "z": "d49b385d8b582b20", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 900, "y": 200, "wires": [ [ "2a6fe7c07c6b34e1" ] ] }, { "id": "59892c31142ac295", "type": "file", "z": "d49b385d8b582b20", "name": "Write to overwolf.txt", "filename": "/config/files/overwolf.txt", "filenameType": "str", "appendNewline": true, "createDir": false, "overwriteFile": "false", "encoding": "none", "x": 1150, "y": 260, "wires": [ [] ] }, { "id": "c80bec9a15b703f6", "type": "inject", "z": "d49b385d8b582b20", "g": "395da9d5d5f7e232", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 140, "y": 800, "wires": [ [ "8687551e01cd2045" ] ] }, { "id": "8687551e01cd2045", "type": "function", "z": "d49b385d8b582b20", "g": "395da9d5d5f7e232", "name": "msg_1", "func": "global.set(\"msg_1\",\"test\");\n\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 280, "y": 800, "wires": [ [] ] }, { "id": "103b03c39c8d9cae", "type": "debug", "z": "d49b385d8b582b20", "g": "395da9d5d5f7e232", "name": "debug 29", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "statusVal": "", "statusType": "auto", "x": 500, "y": 960, "wires": [] }, { "id": "c043cba9f34ba574", "type": "inject", "z": "d49b385d8b582b20", "g": "395da9d5d5f7e232", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 140, "y": 840, "wires": [ [ "e674c706437cc0f3" ] ] }, { "id": "e674c706437cc0f3", "type": "function", "z": "d49b385d8b582b20", "g": "395da9d5d5f7e232", "name": "msg_2 ", "func": "global.set(\"msg_2\",\"hello\");\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 280, "y": 840, "wires": [ [] ] }, { "id": "11f8fb75d4c4e6c0", "type": "inject", "z": "d49b385d8b582b20", "d": true, "g": "395da9d5d5f7e232", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "1", "crontab": "", "once": true, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 150, "y": 960, "wires": [ [ "1346e34e8c83b2dc" ] ] }, { "id": "1346e34e8c83b2dc", "type": "function", "z": "d49b385d8b582b20", "g": "395da9d5d5f7e232", "name": "check if 2 msg set", "func": "var msg1 = global.get(\"msg_1\");\nvar msg2 = global.get(\"msg_2\");\n\nif(msg1 && msg2){\n msg.payload=\"both message arrived!\";\n}\nelse{\n msg.payload=\"Nope. Not yet.\";\n}\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 330, "y": 960, "wires": [ [ "103b03c39c8d9cae" ] ] }, { "id": "62d522a844321ef9", "type": "inject", "z": "d49b385d8b582b20", "g": "395da9d5d5f7e232", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 540, "y": 800, "wires": [ [ "6d109daff443dade" ] ] }, { "id": "6d109daff443dade", "type": "function", "z": "d49b385d8b582b20", "g": "395da9d5d5f7e232", "name": "reset", "func": "global.set(\"msg_1\",null);\nglobal.set(\"msg_2\",null);\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 690, "y": 800, "wires": [ [] ] }, { "id": "4e1848c867860d5f", "type": "comment", "z": "d49b385d8b582b20", "g": "395da9d5d5f7e232", "name": "Here gonna auto-run", "info": "", "x": 170, "y": 920, "wires": [] }, { "id": "3102e176923a8fad", "type": "comment", "z": "d49b385d8b582b20", "g": "395da9d5d5f7e232", "name": "Check what if both inject clicked", "info": "", "x": 210, "y": 760, "wires": [] }, { "id": "5848c6edf2bd06fe", "type": "inject", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "MB Bedtime Mode", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" }, { "p": "type", "v": "manual", "vt": "str" }, { "p": "time", "v": "bedtime", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "manual-bedtime", "payload": "", "payloadType": "date", "x": 250, "y": 240, "wires": [ [ "14181143d23aa423" ] ] }, { "id": "3bb9755d18f517d6", "type": "inject", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Master Bedroom Cooling", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" }, { "p": "type", "v": "auto", "vt": "str" }, { "p": "time", "v": "night", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "mrbedroom-cooling", "payload": "", "payloadType": "date", "x": 230, "y": 300, "wires": [ [ "14181143d23aa423" ] ] }, { "id": "c52f61fa427a773c", "type": "inject", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Master Bedroom Fan", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" }, { "p": "type", "v": "auto", "vt": "str" }, { "p": "time", "v": "night", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "mrbedroom-fan", "payload": "", "payloadType": "date", "x": 240, "y": 360, "wires": [ [ "14181143d23aa423" ] ] }, { "id": "d71d65c0e52926b1", "type": "inject", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Master Bedroom Wakeup", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" }, { "p": "type", "v": "auto", "vt": "str" }, { "p": "time", "v": "day", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "mrbedroom-wakeup", "payload": "", "payloadType": "date", "x": 230, "y": 420, "wires": [ [ "14181143d23aa423" ] ] }, { "id": "84b00411dee5fc6a", "type": "inject", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "MB Night Mode", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" }, { "p": "type", "v": "manual", "vt": "str" }, { "p": "time", "v": "night", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "manual-night", "payload": "", "payloadType": "date", "x": 260, "y": 480, "wires": [ [ "14181143d23aa423" ] ] }, { "id": "8a4b246d2356d8f4", "type": "inject", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "MB Day Mode", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" }, { "p": "type", "v": "manual", "vt": "str" }, { "p": "time", "v": "day", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "manual-day", "payload": "", "payloadType": "date", "x": 270, "y": 540, "wires": [ [ "14181143d23aa423" ] ] }, { "id": "d275a12c1817925e", "type": "debug", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "AC", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 670, "y": 280, "wires": [] }, { "id": "4d9e5c1bade281af", "type": "debug", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Fan", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 670, "y": 340, "wires": [] }, { "id": "330eaf3afee1c405", "type": "debug", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Boolean", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 680, "y": 400, "wires": [] }, { "id": "c59db4f3f0112244", "type": "debug", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Notify", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 670, "y": 600, "wires": [] }, { "id": "8846ee22051b92cc", "type": "function", "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', \"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": "", "finalize": "", "libs": [], "x": 330, "y": 120, "wires": [ [ "d275a12c1817925e", "34c4939c3dd1f7d1" ], [ "4d9e5c1bade281af", "71f5f2a1557b28ea" ], [ "b233bf44f92d413d", "514057723d9662e0" ] ], "outputLabels": [ "On (AC)", "On (Fan)", "Off" ], "icon": "node-red-contrib-huemagic/hue-temperature.svg" }, { "id": "4731a08756c9235f", "type": "inject", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "on", "payloadType": "str", "x": 130, "y": 100, "wires": [ [ "8846ee22051b92cc" ] ] }, { "id": "62f2704dca41ea4b", "type": "inject", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "off", "payloadType": "str", "x": 130, "y": 160, "wires": [ [ "8846ee22051b92cc" ] ] }, { "id": "93072f995377775b", "type": "function", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Notifications", "func": "const topic = msg.topic\nconst nightTemp = msg.nighttemp\nconst acMode = msg.acmode\nconst fanMode = msg.fanmode\n\nlet coolMsg = {\n \"payload\": 'Master bedroom AC temp has been set to ' + nightTemp + '°F as scheduled',\n \"topic\": 'AC Mode: Cooling'\n}\nlet fanOnlyMsg = {\n \"payload\": 'Too cold outside, AC running fan only.',\n \"topic\": \"AC Mode: Fan Only\"\n}\nlet fanSchedMsg = {\n \"payload\": 'Master bedroom fan has been activated as scheduled.',\n \"topic\": 'Fan Schedule Activated'\n}\n\nif (topic === 'mrbedroom-cooling') {\n if (acMode === 'AC') {\n node.status({fill:\"green\",shape:\"dot\",text:\"AC Cooling\"})\n return coolMsg\n } else if (acMode === 'Fan') {\n node.status({fill:\"green\",shape:\"dot\",text:\"AC Fan Only\"})\n return fanOnlyMsg\n }\n} else if (topic === 'mrbedroom-fan' && fanMode === 'Fan') {\n node.status({fill:\"green\",shape:\"dot\",text:\"Fan Schedule\"})\n return fanSchedMsg\n} else {\n node.status({fill:\"red\",shape:\"ring\",text:\"Notification not sent\"})\n return null\n}", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 690, "y": 460, "wires": [ [ "c59db4f3f0112244" ] ] }, { "id": "34c4939c3dd1f7d1", "type": "debug", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Meltdown AC", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 630, "y": 60, "wires": [] }, { "id": "71f5f2a1557b28ea", "type": "debug", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Meltdown Fan", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 640, "y": 120, "wires": [] }, { "id": "b233bf44f92d413d", "type": "debug", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Meltdown Off", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 630, "y": 180, "wires": [] }, { "id": "a1020d4eaab8a8e5", "type": "inject", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Sleep On", "props": [ { "p": "payload" }, { "p": "type", "v": "sleep", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "on", "payloadType": "str", "x": 280, "y": 600, "wires": [ [ "14181143d23aa423" ] ] }, { "id": "7aa9383895c46e30", "type": "inject", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Sleep Off", "props": [ { "p": "payload" }, { "p": "type", "v": "sleep", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "off", "payloadType": "str", "x": 280, "y": 660, "wires": [ [ "14181143d23aa423" ] ] }, { "id": "401d1612749a4d86", "type": "inject", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Reset", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "reset", "payload": "", "payloadType": "date", "x": 290, "y": 200, "wires": [ [ "514057723d9662e0" ] ] }, { "id": "514057723d9662e0", "type": "link call", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Reset", "links": [ "192260163c49816a" ], "linkType": "static", "timeout": "30", "x": 395, "y": 200, "wires": [ [ "14181143d23aa423" ] ], "l": false }, { "id": "1df32d98b498c875", "type": "function", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Reset", "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": "", "finalize": "", "libs": [], "x": 635, "y": 640, "wires": [ [ "79f3ceee718cd7cb" ] ], "l": false }, { "id": "192260163c49816a", "type": "link in", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "MB Climate Test Reset - In", "links": [], "x": 575, "y": 640, "wires": [ [ "1df32d98b498c875" ] ] }, { "id": "79f3ceee718cd7cb", "type": "link out", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "MB Climate Test Reset - Out", "mode": "return", "links": [], "x": 695, "y": 640, "wires": [] }, { "id": "c92edf73327c1a2a", "type": "server-events", "z": "d49b385d8b582b20", "name": "Overwolf Events Dump", "server": "9e87348d.9c1c48", "version": 3, "exposeAsEntityConfig": "77ba0ad52b2a9e2e", "eventType": "overwolf_game_event", "eventData": "", "waitForRunning": true, "outputProperties": [ { "property": "payload", "propertyType": "msg", "value": "", "valueType": "eventData" }, { "property": "topic", "propertyType": "msg", "value": "$outputData(\"eventData\").event_type", "valueType": "jsonata" } ], "event_type": "", "x": 920, "y": 260, "wires": [ [ "59892c31142ac295" ] ] }, { "id": "14181143d23aa423", "type": "function", "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', \"diskCon\")\nconst temp = global.get(\"tempStr\")\nconst payload = msg.payload\nconst vacation = states['input_boolean.vacation_mode'].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.toggle_testing'].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// init variables\n\nlet setTemp = []\nlet setEco = []\nlet setHvac = []\nlet setFan = []\nlet setCool = []\nlet setSleep = []\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 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 = \"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 (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 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 sendDisplay = {\n \"payload\": {\n \"domain\": \"switch\",\n \"service\": 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 \"domain\": \"script\",\n \"service\": setBriefing\n },\n \"delay\": setBriefingDelay\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}\n\nlet sendEchoDotDND = {\n \"payload\": {\n \"domain\": \"switch\",\n \"service\": 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(\"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, sendEco, sendAcFan], null, 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, 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, sendEco, sendAcFan], 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, sendEco, sendAcFan], 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, sendEco, sendAcFan], 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, sendEco, sendAcFan], null, null, null, null])\n node.log(\"Master Bedroom Climate: Manual/Bedtime/AC\")\n }\n }\n context.set(\"isWakeup\", false)\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, sendEchoDotDND, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Night\")\n if (ac === 'on') {\n node.send([[sendDisplay, 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, sendEchoDotDND, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Day\")\n if (ac === 'on') {\n node.send([[sendDisplay, sendHvac, sendTemp, sendEco, sendAcFan], null, null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Day/AC\")\n }\n if (isWakeup === false) {\n node.send([null, null, null, null, sendBriefing])\n }\n } else if (time === 'bedtime') {\n node.status({ fill: \"blue\", shape: \"dot\", text: \"Sleep\" })\n node.send([null, sendFan, sendEchoDotDND, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Bedtime\")\n if (ac === 'on') {\n node.send([[sendDisplay, sendHvac, sendTemp, sendEco, sendAcFan], null, null, null, null])\n node.log(\"Master Bedroom Climate: Sleep/Bedtime/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(\"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, "initialize": "context.set(\"isWakeup\", false)", "finalize": "", "libs": [], "x": 490, "y": 380, "wires": [ [ "d275a12c1817925e" ], [ "4d9e5c1bade281af" ], [ "330eaf3afee1c405" ], [ "93072f995377775b" ], [ "f9e1aec6c25f6480" ] ], "outputLabels": [ "A/C", "Fan", "Boolean", "Notify", "Briefing" ], "icon": "node-red-contrib-cpu/cpu.png" }, { "id": "f9e1aec6c25f6480", "type": "delay", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "Delay", "pauseType": "delayv", "timeout": "5", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 575, "y": 520, "wires": [ [ "0693239363c59c3e" ] ], "l": false }, { "id": "0693239363c59c3e", "type": "debug", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "TTS", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 670, "y": 520, "wires": [] }, { "id": "44b7eabdec8197a3", "type": "inject", "z": "d49b385d8b582b20", "g": "c3dc29879117218b", "name": "reset", "props": [ { "p": "reset", "v": "", "vt": "date" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "x": 470, "y": 580, "wires": [ [ "f9e1aec6c25f6480" ] ] } ]