so here is a quick and dirty "my take" on what I think you are asking. There is one node node-red-contrib-mytimeout that is non standard.
[{"id":"875aaaaf67c75478","type":"inject","z":"b7e805ceee0d9cbf","name":"time now","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"time now","payload":"","payloadType":"date","x":260,"y":120,"wires":[["74baafe725218c84","be885b7aea55800b"]]},{"id":"be885b7aea55800b","type":"function","z":"b7e805ceee0d9cbf","name":"calculate","func":"let Future = 0;\nlet Now = 0;\nlet FutureTime = 0;\nlet Difference = 0;\nlet TimeOut = 0;\n\nif (msg.topic == \"time now\"){\n context.set(\"now\",msg.payload); //save time now\n}\n\nif (msg.topic == \"future\"){\n context.set(\"difference\",msg.payload); //save future time\n}\n\nNow = context.get(\"now\");\nDifference = context.get(\"difference\");\nFuture = Now + Difference;\n\nTimeOut = Difference / 1000; // divide to get seconds\n\nlet Msg1 = {\n payload: Future,\n}\n\nlet Msg2 = {\n payload: \"on\",\n timeout: TimeOut,\n warning: 30\n}\nnode.status({ fill: \"blue\", shape: \"ring\", text: Msg1.payload });\n\nreturn [Msg1,Msg2];","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":580,"y":200,"wires":[["2302c9c1bafc4e7e"],["644c019aaff8d897"]]},{"id":"644c019aaff8d897","type":"mytimeout","z":"b7e805ceee0d9cbf","name":"","outtopic":"","outsafe":"","outwarning":"Warning","outunsafe":"off","warning":"5","timer":"30","debug":false,"ndebug":false,"ignoreCase":false,"repeat":false,"again":false,"x":690,"y":300,"wires":[[],["f16afd957ab09adb","6dc66cea757ab1cc"]]},{"id":"915a3b809df826a6","type":"debug","z":"b7e805ceee0d9cbf","name":"future","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"true","targetType":"full","statusVal":"payload","statusType":"auto","x":1010,"y":200,"wires":[]},{"id":"74baafe725218c84","type":"moment","z":"b7e805ceee0d9cbf","name":"","topic":"","input":"","inputType":"msg","inTz":"America/Los_Angeles","adjAmount":0,"adjType":"days","adjDir":"add","format":"h:mm:ss","locale":"en-US","output":"","outputType":"msg","outTz":"America/Los_Angeles","x":260,"y":200,"wires":[["d274e0bbbd8b81c5"]]},{"id":"d274e0bbbd8b81c5","type":"debug","z":"b7e805ceee0d9cbf","name":"time now","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"true","targetType":"full","statusVal":"payload","statusType":"auto","x":460,"y":300,"wires":[]},{"id":"c20d2ca7b3d0ec2e","type":"inject","z":"b7e805ceee0d9cbf","name":"add 40 minutes","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"future","payload":"2400000","payloadType":"num","x":520,"y":120,"wires":[["be885b7aea55800b"]]},{"id":"2302c9c1bafc4e7e","type":"moment","z":"b7e805ceee0d9cbf","name":"","topic":"","input":"","inputType":"msg","inTz":"America/Los_Angeles","adjAmount":0,"adjType":"days","adjDir":"add","format":"h:mm:ss","locale":"en-US","output":"","outputType":"msg","outTz":"America/Los_Angeles","x":820,"y":200,"wires":[["915a3b809df826a6"]]},{"id":"f16afd957ab09adb","type":"function","z":"b7e805ceee0d9cbf","name":"Time Remaining","func":"let Z = msg.payload;\n\nlet Y = Z / 60;\n\n Y = Y.toFixed(2);\n\nmsg = {\n payload: Y + \" mins\",\n}\n\nnode.status({ fill: \"blue\", shape: \"ring\", text: msg.payload });\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":940,"y":300,"wires":[[]]},{"id":"6dc66cea757ab1cc","type":"debug","z":"b7e805ceee0d9cbf","name":"count down","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":910,"y":360,"wires":[]}]