UNPKG

node-red-contrib-cron-plus

Version:

A flexible scheduler (cron, solar events, fixed dates) node for Node-RED with full dynamic control and time zone support

1 lines 14.9 kB
[{"id":"c261ada8.d4cd7","type":"ui_text","z":"21106466.70e60c","group":"d6a1695f.c376f8","order":1,"width":"16","height":"2","name":"CRON Description","label":"Expression Description (updates as you type)...","format":"{{msg.payload.result.description}}","layout":"col-center","x":810,"y":220,"wires":[]},{"id":"eb8003d2.ea6ef","type":"cronplus","z":"21106466.70e60c","name":"Cron Describer","outputField":"payload","timeZone":"","persistDynamic":false,"commandResponseMsgOutput":"output2","outputs":2,"options":[],"x":540,"y":220,"wires":[[],["c261ada8.d4cd7"]]},{"id":"35c93639.1b4fda","type":"function","z":"21106466.70e60c","name":"describe cmd","func":"msg.payload = {\n \"command\": \"describe\",\n \"expression\": msg.payload\n}\nreturn msg;","outputs":1,"noerr":0,"x":330,"y":220,"wires":[["eb8003d2.ea6ef"]]},{"id":"4cac7726.7daf48","type":"change","z":"21106466.70e60c","name":"","rules":[{"t":"set","p":"ui_add_schedule_name","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":390,"y":100,"wires":[[]]},{"id":"e3b13d35.c4cfd","type":"change","z":"21106466.70e60c","name":"","rules":[{"t":"set","p":"ui_add_schedule_payload","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":400,"y":140,"wires":[[]]},{"id":"d8d4beef.ba71d","type":"change","z":"21106466.70e60c","name":"","rules":[{"t":"set","p":"ui_add_schedule_expression","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":410,"y":180,"wires":[[]]},{"id":"c2de3df3.b4691","type":"change","z":"21106466.70e60c","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"{}","tot":"json"},{"t":"set","p":"payload.command","pt":"msg","to":"add","tot":"str"},{"t":"set","p":"payload.payload","pt":"msg","to":"ui_add_schedule_payload","tot":"flow"},{"t":"set","p":"payload.name","pt":"msg","to":"ui_add_schedule_name","tot":"flow"},{"t":"set","p":"payload.expression","pt":"msg","to":"ui_add_schedule_expression","tot":"flow"},{"t":"set","p":"payload.payloadType","pt":"msg","to":"str","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":340,"y":300,"wires":[["81360336.f7e43","43e9895e.8605a8"]]},{"id":"81360336.f7e43","type":"cronplus","z":"21106466.70e60c","name":"dyn schedules","outputField":"payload","timeZone":"","persistDynamic":true,"commandResponseMsgOutput":"output2","outputs":2,"options":[],"x":800,"y":300,"wires":[["95207c41.96f1a"],["19c90ed9.4b4a31"]]},{"id":"88ceb596.c48648","type":"ui_toast","z":"21106466.70e60c","position":"top right","displayTime":"3","highlight":"","sendall":true,"outputs":0,"ok":"OK","cancel":"","topic":"","name":"","x":810,"y":500,"wires":[]},{"id":"51778764.7dc538","type":"catch","z":"21106466.70e60c","name":"","scope":null,"uncaught":false,"x":140,"y":500,"wires":[["bc7a8f0a.eb15c","4f492a55.ff17b4"]]},{"id":"bc7a8f0a.eb15c","type":"ui_toast","z":"21106466.70e60c","position":"top right","displayTime":"3","highlight":"red","outputs":0,"ok":"OK","cancel":"","topic":"Error...","name":"","x":350,"y":500,"wires":[]},{"id":"43e9895e.8605a8","type":"ui_button","z":"21106466.70e60c","name":"Refresh","group":"d6a1695f.c376f8","order":6,"width":"1","height":"1","passthru":true,"label":"","tooltip":"Get status of jobs","color":"","bgcolor":"","icon":"fa-refresh","payload":"","payloadType":"date","topic":"list-all","x":560,"y":320,"wires":[["81360336.f7e43"]]},{"id":"b3ad9498.ca2c88","type":"ui_text_input","z":"21106466.70e60c","name":"","label":"Expression","tooltip":"CRON expression","group":"d6a1695f.c376f8","order":3,"width":"4","height":"1","passthru":true,"mode":"text","delay":"100","topic":"","x":150,"y":180,"wires":[["35c93639.1b4fda","d8d4beef.ba71d"]]},{"id":"74693f08.e64c4","type":"ui_text_input","z":"21106466.70e60c","name":"","label":"Name","tooltip":"Schedule Name","group":"d6a1695f.c376f8","order":2,"width":"4","height":"1","passthru":true,"mode":"text","delay":"100","topic":"","x":130,"y":100,"wires":[["4cac7726.7daf48"]]},{"id":"17e038e.7419bc7","type":"ui_button","z":"21106466.70e60c","name":"","group":"d6a1695f.c376f8","order":5,"width":"3","height":"1","passthru":false,"label":"Add","tooltip":"Add or update named schedule","color":"","bgcolor":"","icon":"send","payload":"","payloadType":"str","topic":"","x":130,"y":300,"wires":[["c2de3df3.b4691"]]},{"id":"440d4e3.ab64fb","type":"ui_text_input","z":"21106466.70e60c","name":"","label":"Payload","tooltip":"Payload to send when schedule fires","group":"d6a1695f.c376f8","order":4,"width":"4","height":"1","passthru":true,"mode":"text","delay":"100","topic":"","x":140,"y":140,"wires":[["e3b13d35.c4cfd"]]},{"id":"e3ea0c.b99c05f8","type":"ui_template","z":"21106466.70e60c","group":"d6a1695f.c376f8","name":"","order":7,"width":"16","height":"5","format":"<style type=\"text/css\">\n.t1 {border-collapse:collapse;border-spacing:0;border-color:#ccc;}\n.t1 td{font-family:Arial, sans-serif;font-size:14px;padding:8px 3px;border-style:solid;border-width:0px;overflow:hidden;word-break:normal;border-top-width:1px;border-bottom-width:1px;border-color:#ccc;color:#333;background-color:#fff;}\n.t1 th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#ccc;color:#333;background-color:#f0f0f0;}\n.t1 .t1-36r9{background-color:#000000;color:#ffffff;text-align:left;vertical-align:top}\n.t1 .t1-x2zo{background-color:#c0c0c0;font-size:small;text-align:left;vertical-align:top}\n.t1 .t1-o73e{background-color:#c0c0c0;font-size:small;text-align:center;vertical-align:top}\n.t1 .t1-5qt9{font-size:small;text-align:left;vertical-align:top}\n.t1 .t1-5qta{font-size:small;text-align:center;vertical-align:middle}\n</style>\n<table class=\"t1\">\n <tr>\n <th class=\"t1-36r9\" colspan=\"9\">CRON Schedules</th>\n </tr>\n <tr>\n <td class=\"t1-x2zo\">Name</td>\n <td class=\"t1-x2zo\">Expression</td>\n <td class=\"t1-x2zo\">Payload</td>\n <td class=\"t1-x2zo\">Description</td>\n <td class=\"t1-x2zo\">Next run</td>\n <td class=\"t1-x2zo\">State</td>\n <td class=\"t1-o73e\">Delete</td>\n <td class=\"t1-o73e\">Pause</td>\n <td class=\"t1-o73e\">Resume</td>\n </tr>\n <tr ng-repeat=\"item in msg.payload\">\n <td class=\"t1-5qt9\">{{item.config.name}}</td>\n <td class=\"t1-5qt9\" style=\"white-space: nowrap\" nowrap>{{item.config.expression}}</td>\n <td class=\"t1-5qt9\">{{item.config.payload}}</td>\n <td class=\"t1-5qt9\">{{item.status.description}}</td>\n <td class=\"t1-5qt9\">{{item.status.nextDescription}}</td>\n <td class=\"t1-5qta\"><i class=\"fa fa-{{item.status.isRunning ? 'play' : 'pause'}}\"> </i></td>\n\n <td class=\"t1-5qta\">\n <md-button class=\"md-raised\"\n ng-click=\"send([[{payload:{command:'remove', name: item.config.name}}, {payload:{command:'list-all'}}]]);\"> <i class=\"fa fa-trash\"> </i></md-button>\n </td>\n <td class=\"t1-5qta\">\n <md-button class=\"button\" \n ng-click=\"send([[{payload:{command:'pause', name: item.config.name}}, {payload:{command:'list-all'}}]]);\"> <i class=\"fa fa-pause\"> </i></md-button>\n </td>\n <td class=\"t1-5qta\">\n <md-button class=\"button\" \n ng-click=\"send([[{payload:{command:'start', name: item.config.name}}, {payload:{command:'list-all'}}]]);\"> <i class=\"fa fa-play\"> </i></md-button>\n </td>\n\n </tr>\n\n </tbody>\n</table>\n\n<!--<table id=\"table\" class=\"table table-striped table-responsive-md btn-table\" >-->\n<!-- <tr>-->\n<!-- <th>Name</th> -->\n<!-- <th>Expression</th> -->\n<!-- <th>Payload</th> -->\n<!-- <th>Description</th>-->\n<!-- <th>Next run</th>-->\n<!-- <th>State</th>-->\n<!-- <th>Delete</th>-->\n<!-- <th>Pause</th>-->\n<!-- <th>Resume</th>-->\n<!-- </tr>-->\n<!-- <tbody>-->\n<!-- <tr ng-repeat=\"item in msg.payload\">-->\n<!-- <td >{{item.config.name}}</td>-->\n<!-- <td style=\"white-space: nowrap\" nowrap>{{item.config.expression}}</td>-->\n<!-- <td >{{item.config.payload}}</td>-->\n<!-- <td >{{item.status.description}}</td>-->\n<!-- <td >{{item.status.nextDescription}}</td>-->\n<!-- <td >{{item.status.isRunning ? 'Running' : 'Paused'}}</td>-->\n<!-- <td>-->\n<!-- <md-button class=\"md-raised\"-->\n<!-- ng-click=\"send([[{payload:{command:'remove', name: item.config.name}}, {payload:{command:'list-all'}}]]);\"> <i class=\"fa fa-trash\"> </i></md-button>-->\n<!-- </td>-->\n<!-- <td>-->\n<!-- <md-button class=\"button\" -->\n<!-- ng-click=\"send([[{payload:{command:'pause', name: item.config.name}}, {payload:{command:'list-all'}}]]);\"> <i class=\"fa fa-pause\"> </i></md-button>-->\n<!-- </td>-->\n<!-- <td>-->\n<!-- <md-button class=\"button\" -->\n<!-- ng-click=\"send([[{payload:{command:'start', name: item.config.name}}, {payload:{command:'list-all'}}]]);\"> <i class=\"fa fa-play\"> </i></md-button>-->\n<!-- </td>-->\n<!-- </tr>-->\n<!-- </tbody>-->\n<!--</table>-->\n\n","storeOutMessages":false,"fwdInMessages":false,"resendOnRefresh":false,"templateScope":"local","x":520,"y":400,"wires":[["81360336.f7e43"]]},{"id":"650dc2c3.f8ef2c","type":"function","z":"21106466.70e60c","name":"Make table data","func":"if(!msg.payload || !msg.payload.result || !msg.payload.result.length){\n msg.payload = [];\n return msg;\n}\n\nmsg.payload = msg.payload.result;\nreturn msg;","outputs":1,"noerr":0,"x":340,"y":400,"wires":[["e3ea0c.b99c05f8"]]},{"id":"4f492a55.ff17b4","type":"debug","z":"21106466.70e60c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":310,"y":540,"wires":[]},{"id":"780d7131.671b7","type":"ui_template","z":"21106466.70e60c","group":"d6a1695f.c376f8","name":"CRON Info","order":8,"width":"16","height":"12","format":"<div>\n<pre>CRON Format...\n\n s m h md m wd y\n | | | | | | |\n * * * * * * * Field Allowed values Special symbols\n | | | | | | | ----------------- --------------- ---------------\n `--|--|--|--|--|--|-> Second (optional) 0-59 * / , -\n `--|--|--|--|--|-> Minute 0-59 * / , -\n `--|--|--|--|-> Hour 0-23 * / , -\n `--|--|--|-> Day of Month 1-31 * / , - L W\n `--|--|-> Month 1-12 or JAN-DEC * / , -\n `--|-> Day of Week 0-7 or SUN-SAT * / , - L #\n `-> Year (optional) 1970-2099 * / , -\n \n</pre> \n</div>\n\n<style type=\"text/css\">\n.t2 {border-collapse:collapse;border-spacing:0;border-color:#ccc;}\n.t2 td{font-family:Arial, sans-serif;font-size:14px;padding:2px 2px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#ccc;color:#333;background-color:#fff;}\n.t2 th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#ccc;color:#333;background-color:#f0f0f0;}\n.t2 .t2-dg6o{background-color:#000000;color:#ffffff;text-align:left;vertical-align:top}\n.t2 .t2-6e8n{font-weight:bold;background-color:#c0c0c0;border-color:inherit;text-align:left;vertical-align:top}\n.t2 .t2-0pky{border-color:inherit;text-align:left;vertical-align:top}\n</style>\n<table class=\"t2\">\n <tr>\n <th class=\"t2-dg6o\" colspan=\"2\">Example CRON Expressions</th>\n </tr>\n <tr>\n <td class=\"t2-6e8n\">Expression</td>\n <td class=\"t2-6e8n\">Description</td>\n </tr>\n <tr>\n <td class=\"t2-0pky\">* * * * * *</td>\n <td class=\"t2-0pky\">Every Second</td>\n </tr>\n <tr>\n <td class=\"t2-0pky\">0 * * * * *</td>\n <td class=\"t2-0pky\">Every minute</td>\n </tr>\n <tr>\n <td class=\"t2-0pky\">0 */10 * * * *</td>\n <td class=\"t2-0pky\">Every 10 minutes</td>\n </tr>\n <tr>\n <td class=\"t2-0pky\">0 */20 1 * * *</td>\n <td class=\"t2-0pky\">Every 20 minutes, between 01:00 AM and 01:59 AM</td>\n </tr>\n <tr>\n <td class=\"t2-0pky\">0 15,30,45 * * * *</td>\n <td class=\"t2-0pky\">At 15, 30, and 45 minutes past the hour</td>\n </tr>\n <tr>\n <td class=\"t2-0pky\">0 0 12 * * *</td>\n <td class=\"t2-0pky\">Every day at noon - 12pm</td>\n </tr>\n <tr>\n <td class=\"t2-0pky\">0 0 2 29 FEB * 2020-2040</td>\n <td class=\"t2-0pky\">At 02:00 AM, on day 29 of the month, only in February, every 4 years, 2020 through 2040</td>\n </tr>\n <tr>\n <td class=\"t2-0pky\">0 0 7 * *</td>\n <td class=\"t2-0pky\">MON#1 * At 07:00 AM, on the first Monday of the month</td>\n </tr>\n <tr>\n <td class=\"t2-0pky\">0 0 12 * JAN,FEB,MAR,APR *</td>\n <td class=\"t2-0pky\">Every day at noon in January, February, March and April</td>\n </tr>\n <tr>\n <td class=\"t2-0pky\">* * 1W * *</td>\n <td class=\"t2-0pky\">Every minute, on the first weekday of the month</td>\n </tr>\n <tr>\n <td class=\"t2-0pky\">* * * * Tue#3</td>\n <td class=\"t2-0pky\">Every minute, on the third Tuesday of the month</td>\n </tr>\n <tr>\n <td class=\"t2-0pky\">0 12 * * MONL</td>\n <td class=\"t2-0pky\">At 12:00 PM, on the last Monday of the month</td>\n </tr>\n</table>","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":790,"y":140,"wires":[[]]},{"id":"478fbbd.cfa1c44","type":"link in","z":"21106466.70e60c","name":"Cron Events","links":["68f2f76e.aba708","95207c41.96f1a"],"x":610,"y":500,"wires":[["88ceb596.c48648","d85796ff.a49238"]],"l":true},{"id":"d85796ff.a49238","type":"debug","z":"21106466.70e60c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":770,"y":560,"wires":[]},{"id":"268d2762.906e88","type":"comment","z":"21106466.70e60c","name":"Dynamic cron schedules - setup by dashboard","info":"","x":510,"y":40,"wires":[]},{"id":"95207c41.96f1a","type":"link out","z":"21106466.70e60c","name":"","links":["478fbbd.cfa1c44"],"x":935,"y":280,"wires":[]},{"id":"a17cdbbc.8b2328","type":"ui_ui_control","z":"21106466.70e60c","name":"","events":"all","x":320,"y":340,"wires":[["43e9895e.8605a8"]]},{"id":"19c90ed9.4b4a31","type":"delay","z":"21106466.70e60c","name":"","pauseType":"delay","timeout":"200","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":150,"y":400,"wires":[["650dc2c3.f8ef2c"]]},{"id":"d6a1695f.c376f8","type":"ui_group","z":"","name":"Default","tab":"c08b5841.22f118","order":1,"disp":false,"width":"16","collapse":false},{"id":"c08b5841.22f118","type":"ui_tab","z":"","name":"CRON","icon":"dashboard","order":2,"disabled":false,"hidden":false}]