How to triggers at event time coming

If you must go out to the internet for the timings, you need to set the schedular (cron-plus) dynamically.

Here is a demo...

chrome_dDoaZ2vChD

↑ Ignore the times, I am in a different timezone - should look normal for you)

Demo flow...

[{"id":"7a7e32fbaf64babd","type":"inject","z":"e785afc51dbac133","name":"","props":[],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":530,"y":180,"wires":[["2980903373f6c1c2"]]},{"id":"2980903373f6c1c2","type":"http request","z":"e785afc51dbac133","name":"Get times","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://api.aladhan.com/v1/timings?latitude=40.7145672345337&longitude=-74.00297622685953&method=99&methodSettings=20.0,null,18.0","tls":"","persist":false,"proxy":"","authType":"","senderr":false,"x":680,"y":180,"wires":[["7f406d3aaab5539a"]]},{"id":"7f406d3aaab5539a","type":"function","z":"e785afc51dbac133","name":"Create Schedules","func":"const now = new Date();\n\nlet sunriseHHMM = msg.payload.data.timings.Sunrise.split(\":\").map(e => Number(e))\nlet sunsetHHMM = msg.payload.data.timings.Sunset.split(\":\").map(e => Number(e))\n\nlet sunrise = new Date()\nsunrise.setHours(sunriseHHMM[0])\nsunrise.setMinutes(sunriseHHMM[1])\n\nlet sunset = new Date()\nsunset.setHours(sunsetHHMM[0])\nsunset.setMinutes(sunsetHHMM[1])\n\n//if next event has past, add 1 day to the time\nif (sunrise < now) {\n    sunrise.setDate(sunrise.getDate()+1);\n}\n\nif (sunset < now) {\n    sunset.setDate(sunset.getDate()+1);\n}\n\nmsg.payload = [\n    {\n        \"command\": \"add\",\n        \"name\": \"sunrise\",\n        \"topic\": \"sunrise\",\n        \"expression\": sunrise,\n        \"expressionType\": \"dates\",\n        \"payloadType\": \"json\",\n        \"payload\": {\n            \"url\": \"https://www.trekcore.com/audio/doors/tng_chime_clean.mp3\"\n        }\n    },\n    {\n        \"command\": \"add\",\n        \"name\": \"sunset\",\n        \"topic\": \"sunset\",\n        \"expression\": sunset,\n        \"expressionType\": \"dates\",\n        \"payloadType\": \"json\",\n        \"payload\": {\n            \"url\": \"https://www.trekcore.com/audio/computer/voice/transfercomplete_clean.mp\"\n        }\n    }\n]\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":850,"y":180,"wires":[["7f11a3ee9f40197a"]]},{"id":"7f11a3ee9f40197a","type":"cronplus","z":"e785afc51dbac133","name":"cron (dynamic)","outputField":"payload","timeZone":"","persistDynamic":false,"commandResponseMsgOutput":"output1","outputs":1,"options":[],"x":560,"y":240,"wires":[["4c91d39174bc639c"]]},{"id":"afa01256089061f5","type":"inject","z":"e785afc51dbac133","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"trigger","payload":"sunrise","payloadType":"str","x":330,"y":200,"wires":[["7f11a3ee9f40197a"]]},{"id":"bfbe6c063e9ec457","type":"inject","z":"e785afc51dbac133","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"trigger","payload":"sunset","payloadType":"str","x":330,"y":260,"wires":[["7f11a3ee9f40197a"]]},{"id":"4c91d39174bc639c","type":"cast-to-client","z":"e785afc51dbac133","name":"cast","url":"","contentType":"","message":"","language":"en","ip":"192.168.1.19","port":"8009","volume":"","x":810,"y":240,"wires":[[]]}]