Here is my first flow. I am sure there are efficiencies that could be found but it works.
I tried to keep it as clean as possible but it does get a bit messy around the lights.
and the Node-Red flow export:
[{"id":"bb01177afb3efad0","type":"websocket in","z":"e17061c5369e4b2b","name":"Rhasspy In","server":"af92e4f2.028968","client":"","x":80,"y":140,"wires":[["6af596d8414a6121"]]},{"id":"6af596d8414a6121","type":"switch","z":"e17061c5369e4b2b","name":"","property":"intent.name","propertyType":"msg","rules":[{"t":"eq","v":"GetTime","vt":"str"},{"t":"eq","v":"GetForecast","vt":"str"},{"t":"eq","v":"GetWeather","vt":"str"},{"t":"eq","v":"GetTemperature","vt":"str"},{"t":"eq","v":"TurnState","vt":"str"},{"t":"eq","v":"Goodnight","vt":"str"},{"t":"eq","v":"SetTemperature","vt":"str"},{"t":"else"}],"checkall":"false","repair":false,"outputs":8,"x":90,"y":260,"wires":[["c5c2535d4f57eefc"],["a177a9c6ceba6fe0"],["d398c11b7bf7ec79","65af43da39379e01"],["2d3a12859ffe8b53","50490adb392afc13"],["8df0105aac81fe79"],["899f888e7f9d1c76"],["9cb024e068df3a81"],["8518cd2330e9e245"]]},{"id":"2d3a12859ffe8b53","type":"api-current-state","z":"e17061c5369e4b2b","name":"House Temperature","server":"890f6b21.aaf278","version":2,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is_not","entity_id":"sensor.house_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"x":310,"y":380,"wires":[["649a9c6bbb64afe8"]]},{"id":"50490adb392afc13","type":"api-current-state","z":"e17061c5369e4b2b","name":"Outside Temperature","server":"890f6b21.aaf278","version":2,"outputs":1,"halt_if":"","halt_if_type":"num","halt_if_compare":"is_not","entity_id":"sensor.temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"x":300,"y":440,"wires":[["fd21be261c32e191"]]},{"id":"fd21be261c32e191","type":"function","z":"e17061c5369e4b2b","name":"Outside Temp prefix","func":"msg.payload = \"It is \" + msg.payload + \" degrees outside\";\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":440,"wires":[["f3a36540080a5c29"]]},{"id":"649a9c6bbb64afe8","type":"function","z":"e17061c5369e4b2b","name":"House Temp prefix","func":"msg.payload = \"and \" + msg.payload + \" degrees inside\";\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":510,"y":380,"wires":[["8fe94ea5cf3f4040"]]},{"id":"f3a36540080a5c29","type":"change","z":"e17061c5369e4b2b","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"A","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":440,"wires":[["664c2682c5d9273b"]]},{"id":"8fe94ea5cf3f4040","type":"change","z":"e17061c5369e4b2b","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"B","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":380,"wires":[["664c2682c5d9273b"]]},{"id":"664c2682c5d9273b","type":"join","z":"e17061c5369e4b2b","name":"Assemble Output Text","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":" ","joinerType":"str","accumulate":false,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":900,"y":400,"wires":[["cb4a15fd8818b2b0"]]},{"id":"a413ae6ef73bb123","type":"debug","z":"e17061c5369e4b2b","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1590,"y":620,"wires":[]},{"id":"c5c2535d4f57eefc","type":"function","z":"e17061c5369e4b2b","name":"time text","func":"var timeString = new Date().toLocaleTimeString([],\n{\n hour: \"2-digit\", \n minute: \"2-digit\",\n hour12: true\n})\n\nreturn {\n payload: \"It is \" + timeString\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":480,"y":60,"wires":[["30dcf62f8d4df3f3"]]},{"id":"30dcf62f8d4df3f3","type":"http request","z":"e17061c5369e4b2b","name":"text to speech","method":"POST","ret":"txt","paytoqs":"ignore","url":"http://internal-ip:12101/api/text-to-speech","tls":"","persist":false,"proxy":"","authType":"basic","senderr":false,"credentials":{},"x":1540,"y":500,"wires":[[]]},{"id":"cb4a15fd8818b2b0","type":"template","z":"e17061c5369e4b2b","name":"Temperature Speech","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{{payload.A}} {{payload.B}}","output":"str","x":1120,"y":400,"wires":[["30dcf62f8d4df3f3"]]},{"id":"a177a9c6ceba6fe0","type":"api-current-state","z":"e17061c5369e4b2b","name":"","server":"890f6b21.aaf278","version":2,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.forecast","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":410,"y":160,"wires":[["30dcf62f8d4df3f3"]]},{"id":"d398c11b7bf7ec79","type":"api-current-state","z":"e17061c5369e4b2b","name":"","server":"890f6b21.aaf278","version":2,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"weather.location","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":410,"y":240,"wires":[["4f38578b391130c6"]]},{"id":"65af43da39379e01","type":"api-current-state","z":"e17061c5369e4b2b","name":"Outside Temperature","server":"890f6b21.aaf278","version":2,"outputs":1,"halt_if":"","halt_if_type":"num","halt_if_compare":"is_not","entity_id":"sensor.temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"x":380,"y":280,"wires":[["5b10193a941e46bb"]]},{"id":"4f38578b391130c6","type":"function","z":"e17061c5369e4b2b","name":"Weather Conditions Prefix","func":"msg.payload = \"It is currently \" + msg.payload;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":670,"y":240,"wires":[["48197537cf56307a"]]},{"id":"5b10193a941e46bb","type":"function","z":"e17061c5369e4b2b","name":"Weather Temp prefix","func":"msg.payload = \" and \" + msg.payload + \" degrees\";\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":660,"y":280,"wires":[["3ea0bc0186980f2a"]]},{"id":"48197537cf56307a","type":"change","z":"e17061c5369e4b2b","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"A","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":870,"y":240,"wires":[["525f01efd4c09078"]]},{"id":"3ea0bc0186980f2a","type":"change","z":"e17061c5369e4b2b","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"B","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":870,"y":280,"wires":[["525f01efd4c09078"]]},{"id":"525f01efd4c09078","type":"join","z":"e17061c5369e4b2b","name":"Assemble Output Text","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":" ","joinerType":"str","accumulate":false,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":1060,"y":260,"wires":[["a8284377ab8dd819"]]},{"id":"a8284377ab8dd819","type":"template","z":"e17061c5369e4b2b","name":"Weather Speech","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{{payload.A}} {{payload.B}}","output":"str","x":1270,"y":260,"wires":[["30dcf62f8d4df3f3"]]},{"id":"5aad4df0390ecf45","type":"api-call-service","z":"e17061c5369e4b2b","name":"Turn Floor Lamp Off","server":"890f6b21.aaf278","version":3,"debugenabled":false,"service_domain":"light","service":"turn_off","entityId":"light.living_room_lamp_1, light.living_room_lamp_2 ","data":"{\"transition\":60}","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":640,"y":720,"wires":[[]]},{"id":"52305dfb4aba69b5","type":"switch","z":"e17061c5369e4b2b","name":"Plug or Light","property":"slots.object","propertyType":"msg","rules":[{"t":"cont","v":"plug","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":390,"y":560,"wires":[["61e3b9650ae9b86d"],["9ec726a7988edc60"]]},{"id":"39ce83d5864bc6f7","type":"template","z":"e17061c5369e4b2b","name":"single light","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{\n \"domain\": \"light\",\n \"service\": \"turn_{{slots.state}}\",\n \"data\": {\n \"entity_id\": \"light.{{slots.room}}_{{slots.object}}_1\"\n }\n}","output":"json","x":850,"y":560,"wires":[["6080756c10216a2c","a36a9b75528acad9"]]},{"id":"8df0105aac81fe79","type":"function","z":"e17061c5369e4b2b","name":"","func":"if (msg.slots.object) {\n msg.slots.object = msg.slots.object.replace(\" \", \"_\");\n}\n\nif (msg.slots.object) {\n msg.slots.object = msg.slots.object.replace(\"table_lamp\", \"plug_1\")\n}\n\nif (msg.slots.object) {\n msg.slots.object = msg.slots.object.replace(\"holiday_lights\", \"holiday_wled\")\n}\n\nif (msg.slots.object) {\n msg.slots.object = msg.slots.object.replace(\"light\", \"lamp\")\n}\n\nif (msg.slots.room) {\n msg.slots.room = msg.slots.room.replace(\" \", \"_\");\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":240,"y":560,"wires":[["52305dfb4aba69b5"]]},{"id":"61e3b9650ae9b86d","type":"template","z":"e17061c5369e4b2b","name":"single plug","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{\n \"domain\": \"switch\",\n \"service\": \"turn_{{slots.state}}\",\n \"data\": {\n \"entity_id\": \"switch.{{slots.object}}\"\n }\n}\n","output":"json","x":670,"y":500,"wires":[["9969e4fb9d8140c0","a36a9b75528acad9"]]},{"id":"a36a9b75528acad9","type":"api-call-service","z":"e17061c5369e4b2b","name":"Execute","server":"890f6b21.aaf278","version":3,"debugenabled":false,"service_domain":"","service":"","entityId":"","data":"","dataType":"json","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1080,"y":540,"wires":[[]]},{"id":"6080756c10216a2c","type":"template","z":"e17061c5369e4b2b","name":"lights on speech","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"ok, Turning {{slots.state}} the {{entities.1.value}}{{slots.object}}","output":"str","x":1140,"y":600,"wires":[["30dcf62f8d4df3f3"]]},{"id":"9969e4fb9d8140c0","type":"template","z":"e17061c5369e4b2b","name":"table lamp on speech","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"ok, turning on the table lamp","output":"str","x":900,"y":500,"wires":[["30dcf62f8d4df3f3"]]},{"id":"bf9e7ff07de6325a","type":"comment","z":"e17061c5369e4b2b","name":"Turn on and off the lights","info":"","x":220,"y":520,"wires":[]},{"id":"1451d218e5a537e3","type":"comment","z":"e17061c5369e4b2b","name":"Inside and outside temperatures","info":"","x":340,"y":340,"wires":[]},{"id":"190924da1c3d3bbb","type":"comment","z":"e17061c5369e4b2b","name":"Current weather forecast","info":"","x":360,"y":120,"wires":[]},{"id":"e998f75a8b9f2b4d","type":"api-call-service","z":"e17061c5369e4b2b","name":"Turn Table Lamp Off","server":"890f6b21.aaf278","version":3,"debugenabled":false,"service_domain":"switch","service":"turn_off","entityId":"switch.plug_1","data":"","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":640,"y":760,"wires":[[]]},{"id":"51262329e11a9c1d","type":"delay","z":"e17061c5369e4b2b","name":"","pauseType":"delay","timeout":"60","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":420,"y":740,"wires":[["5aad4df0390ecf45","e998f75a8b9f2b4d"]]},{"id":"899f888e7f9d1c76","type":"template","z":"e17061c5369e4b2b","name":"Goodnight Speech","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"Goodnight, turning off the lights in one minute","output":"str","x":250,"y":740,"wires":[["30dcf62f8d4df3f3","51262329e11a9c1d"]]},{"id":"9ec726a7988edc60","type":"switch","z":"e17061c5369e4b2b","name":"All or Single","property":"slots.all","propertyType":"msg","rules":[{"t":"eq","v":"all","vt":"str"},{"t":"else"}],"checkall":"false","repair":false,"outputs":2,"x":550,"y":560,"wires":[["ad34cad2fb6e18dd"],["8b6ec50dac68a859"]]},{"id":"ad34cad2fb6e18dd","type":"switch","z":"e17061c5369e4b2b","name":"All lights on/off","property":"slots.state","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"eq","v":"off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":560,"y":640,"wires":[["d4d9e5cf758d6095","57f7ae274c18e77e","2a400547d1fef6b6"],["d4d9e5cf758d6095","5aad4df0390ecf45","e998f75a8b9f2b4d"]]},{"id":"57f7ae274c18e77e","type":"api-call-service","z":"e17061c5369e4b2b","name":"Turn Floor Lamp On","server":"890f6b21.aaf278","version":3,"debugenabled":false,"service_domain":"light","service":"turn_on","entityId":"light.living_room_lamp_1, light.living_room_lamp_2 ","data":"{\"transition\":60}","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":880,"y":660,"wires":[[]]},{"id":"2a400547d1fef6b6","type":"api-call-service","z":"e17061c5369e4b2b","name":"Turn Table Lamp On","server":"890f6b21.aaf278","version":3,"debugenabled":false,"service_domain":"switch","service":"turn_on","entityId":"switch.plug_1","data":"","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":880,"y":700,"wires":[[]]},{"id":"d4d9e5cf758d6095","type":"template","z":"e17061c5369e4b2b","name":"All lights speech","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"ok, Turning {{entities.0.value}} {{entities.1.value}} the {{entities.2.value}}{{entities.3.value}}","output":"str","x":880,"y":760,"wires":[["30dcf62f8d4df3f3"]]},{"id":"b5e37ce5b26beea8","type":"template","z":"e17061c5369e4b2b","name":"Temperature Change Speech","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"Ok, setting the temperature to {{slots.degrees}} degrees","output":"str","x":600,"y":880,"wires":[["30dcf62f8d4df3f3"]]},{"id":"946207e55784e7d7","type":"api-call-service","z":"e17061c5369e4b2b","name":"Set temperature","server":"890f6b21.aaf278","version":3,"debugenabled":true,"service_domain":"climate","service":"set_temperature","entityId":"climate.thermostat_73_db_cc","data":"","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":880,"y":920,"wires":[[]]},{"id":"9cb024e068df3a81","type":"function","z":"e17061c5369e4b2b","name":"Phonetic to Numeric Replace","func":"const lookup = { // add more lookups for other numbers\n \"thirty\": 30,\n \"twenty\": 20, \n \"nine\": 9,\n \"eight\": 8,\n \"seven\": 7,\n \"six\": 6,\n \"five\": 5,\n \"four\": 4,\n \"three\": 3,\n \"two\": 2,\n \"one\": 1,\n \"nineteen\": 19,\n \"eighteen\": 18,\n \"seventeen\": 17,\n \"sixteen\": 16,\n \"fifteen\": 15,\n \"fourteen\": 14,\n \"thirteen\": 13,\n \"twelve\": 12,\n \"eleven\": 11,\n \"ten\": 10,\n \"point five\": 0.5,\n \"and a half\": 0.5\n};\nlet pattern = RegExp(Object.keys(lookup).join(\"|\"), \"gi\")\nlet look_up_keys = msg.slots.degrees.match(pattern);\nlet sum = look_up_keys.reduce((a,v) => a+lookup[v.toLowerCase()],0);\nmsg.slots.degrees = msg.slots.degrees.replace(look_up_keys.join(\" \"), sum);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":280,"y":920,"wires":[["b5e37ce5b26beea8","97b58311f59b347b"]]},{"id":"97b58311f59b347b","type":"template","z":"e17061c5369e4b2b","name":"Temperature Change Template","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{\n \"data\": {\n \"temperature\":{{slots.degrees}}\n }\n}","output":"str","x":610,"y":920,"wires":[["946207e55784e7d7"]]},{"id":"ecbbf2447e95fcbb","type":"comment","z":"e17061c5369e4b2b","name":"Change the Thermostat Temperature Setting","info":"","x":290,"y":840,"wires":[]},{"id":"8b6ec50dac68a859","type":"switch","z":"e17061c5369e4b2b","name":"Holiday?","property":"slots.object","propertyType":"msg","rules":[{"t":"neq","v":"holiday_wled","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":700,"y":560,"wires":[["39ce83d5864bc6f7"],["702aaf9227d7ed78"]]},{"id":"702aaf9227d7ed78","type":"template","z":"e17061c5369e4b2b","name":"Holiday lights","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{\n \"domain\": \"light\",\n \"service\": \"turn_{{slots.state}}\",\n \"data\": {\n \"entity_id\": \"light.{{slots.object}}\"\n }\n}","output":"json","x":850,"y":600,"wires":[["401f72da3f67a2de","a36a9b75528acad9"]]},{"id":"401f72da3f67a2de","type":"template","z":"e17061c5369e4b2b","name":"Holiday lights on speech","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"ok, Turning {{slots.state}} the {{entities.1.value}}","output":"str","x":1170,"y":640,"wires":[["30dcf62f8d4df3f3"]]},{"id":"8518cd2330e9e245","type":"link out","z":"e17061c5369e4b2b","name":"","mode":"link","links":["c855eb911347c7f9"],"x":115,"y":1040,"wires":[]},{"id":"fdf0440997c3a4ea","type":"link in","z":"e17061c5369e4b2b","name":"Speech Request In","links":["7b69d47055c23024","885921b779d12688","c2d1bddbe1d79c3e"],"x":1415,"y":800,"wires":[["30dcf62f8d4df3f3","a413ae6ef73bb123"]]},{"id":"be14b496ce11a660","type":"comment","z":"e17061c5369e4b2b","name":"Speech Request In from Other Flows","info":"","x":1400,"y":860,"wires":[]},{"id":"481b2a48538b290c","type":"comment","z":"e17061c5369e4b2b","name":"Unknown Sending to Play Radio","info":"","x":230,"y":1000,"wires":[]},{"id":"af92e4f2.028968","type":"websocket-listener","path":"ws://internal-ip:12101/api/events/intent","wholemsg":"true"},{"id":"890f6b21.aaf278","type":"server","name":"Home Assistant","version":2,"addon":false,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30"}]
For this flow the only add-on node I am using is the Home Assistant Websocket (node-red-contrib-home-assistant-websocket)