mirror of
				https://github.com/node-red/node-red-nodes.git
				synced 2025-03-01 10:37:43 +00:00 
			
		
		
		
	Initial push of timeswitch node
This commit is contained in:
		
							
								
								
									
										177
									
								
								time/timeswitch/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								time/timeswitch/LICENSE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | ||||
|  | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
							
								
								
									
										33
									
								
								time/timeswitch/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								time/timeswitch/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| node-red-node-timeswitch | ||||
| ======================== | ||||
|  | ||||
| A <a href="http://nodered.org" target="_new">Node-RED</a> node to provide a | ||||
| simple timeswitch node to schedule daily on/off events. | ||||
|  | ||||
| Install | ||||
| ------- | ||||
|  | ||||
| Run the following command in the root directory of your Node-RED install. | ||||
| Usually this is `~/.node-red` | ||||
|  | ||||
|         npm install node-red-node-timeswitch | ||||
|  | ||||
| Usage | ||||
| ----- | ||||
|  | ||||
| Sets **msg.payload** to *1* during on times, and *0* during off times. | ||||
|  | ||||
| Also uses the suncalc module to allow use of dawn and dusk. | ||||
|  | ||||
| Dawn and dusk times can be offset both positively (+ve) for minutes after dawn | ||||
| or dusk, and negatively (-ve) for minutes before dawn or dusk.. | ||||
|  | ||||
| The output emits a **msg.payload** of *1* or *0* every minute depending on | ||||
| whether the current time is during the selected on time or off time. | ||||
|  | ||||
| If you just need the transitions from 0->1 or 1->0 then follow this node with an RBE node. | ||||
|  | ||||
| You may also optionally specify a **msg.topic** if required. | ||||
|  | ||||
| **Note**: For a more complex version with more built-in options see Pete Scargill's | ||||
| [node-red-contrib-bigtimer](http://flows.nodered.org/node/node-red-contrib-bigtimer) node. | ||||
							
								
								
									
										24
									
								
								time/timeswitch/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								time/timeswitch/package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| { | ||||
|     "name"          : "node-red-node-timeswitch", | ||||
|     "version"       : "0.0.1", | ||||
|     "description"   : "A Node-RED node to provide a simple timeswitch to schedule daily on/off events.", | ||||
|     "dependencies"  : { | ||||
|         "suncalc": "1.6.0" | ||||
|     }, | ||||
|     "repository" : { | ||||
|         "type":"git", | ||||
|         "url":"https://github.com/node-red/node-red-nodes/tree/master/time/scheduler" | ||||
|     }, | ||||
|     "license": "Apache-2.0", | ||||
|     "keywords": [ "node-red", "timeswitch", "timer", "scheduler" ], | ||||
|     "node-red"      : { | ||||
|         "nodes"     : { | ||||
|             "timeswitch": "timeswitch.js" | ||||
|         } | ||||
|     }, | ||||
|     "author": { | ||||
|         "name": "Dave Conway-Jones", | ||||
|         "email": "ceejay@vnet.ibm.com", | ||||
|         "url": "http://nodered.org" | ||||
|     } | ||||
| } | ||||
							
								
								
									
										390
									
								
								time/timeswitch/timeswitch.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										390
									
								
								time/timeswitch/timeswitch.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,390 @@ | ||||
| <!-- | ||||
|   Copyright 2015 IBM Corp. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|   http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
|   Based on work by P.Scargill and D.Conway-Jones | ||||
| --> | ||||
|  | ||||
| <script type="text/x-red" data-template-name="timeswitch"> | ||||
|     <div class="form-row"> | ||||
|         <label for="node-input-starttime"><i class="fa fa-clock-o"></i> Time     On</label> | ||||
|         <select id="node-input-starttime" style="width:24% !important"> | ||||
|             <option value=  "0">00:00</option> | ||||
|             <option value= "15">00:15</option> | ||||
|             <option value= "30">00:30</option> | ||||
|             <option value= "45">00:45</option> | ||||
|             <option value= "60">01:00</option> | ||||
|             <option value= "75">01:15</option> | ||||
|             <option value= "90">01:30</option> | ||||
|             <option value="105">01:45</option> | ||||
|             <option value="120">02:00</option> | ||||
|             <option value="135">02:15</option> | ||||
|             <option value="150">02:30</option> | ||||
|             <option value="165">02:45</option> | ||||
|             <option value="180">03:00</option> | ||||
|             <option value="195">03:15</option> | ||||
|             <option value="210">03:30</option> | ||||
|             <option value="225">03:45</option> | ||||
|             <option value="240">04:00</option> | ||||
|             <option value="255">04:15</option> | ||||
|             <option value="270">04:30</option> | ||||
|             <option value="285">04:45</option> | ||||
|             <option value="300">05:00</option> | ||||
|             <option value="315">05:15</option> | ||||
|             <option value="330">05:30</option> | ||||
|             <option value="345">05:45</option> | ||||
|             <option value="360">06:00</option> | ||||
|             <option value="375">06:15</option> | ||||
|             <option value="390">06:30</option> | ||||
|             <option value="405">06:45</option> | ||||
|             <option value="420">07:00</option> | ||||
|             <option value="435">07:15</option> | ||||
|             <option value="450">07:30</option> | ||||
|             <option value="465">07:45</option> | ||||
|             <option value="480">08:00</option> | ||||
|             <option value="495">08:15</option> | ||||
|             <option value="510">08:30</option> | ||||
|             <option value="525">08:45</option> | ||||
|             <option value="540">09:00</option> | ||||
|             <option value="555">09:15</option> | ||||
|             <option value="570">09:30</option> | ||||
|             <option value="585">09:45</option> | ||||
|             <option value="600">10:00</option> | ||||
|             <option value="615">10:15</option> | ||||
|             <option value="630">10:30</option> | ||||
|             <option value="645">10:45</option> | ||||
|             <option value="660">11:00</option> | ||||
|             <option value="675">11:15</option> | ||||
|             <option value="690">11:30</option> | ||||
|             <option value="705">11:45</option> | ||||
|             <option value="720">12:00</option> | ||||
|             <option value="735">12:15</option> | ||||
|             <option value="750">12:30</option> | ||||
|             <option value="765">12:45</option> | ||||
|             <option value="780">13:00</option> | ||||
|             <option value="795">13:15</option> | ||||
|             <option value="810">13:30</option> | ||||
|             <option value="825">13:45</option> | ||||
|             <option value="840">14:00</option> | ||||
|             <option value="855">14:15</option> | ||||
|             <option value="870">14:30</option> | ||||
|             <option value="885">14:45</option> | ||||
|             <option value="900">15:00</option> | ||||
|             <option value="915">15:15</option> | ||||
|             <option value="930">15:30</option> | ||||
|             <option value="945">15:45</option> | ||||
|             <option value="960">16:00</option> | ||||
|             <option value="975">16:15</option> | ||||
|             <option value="990">16:30</option> | ||||
|             <option value="1005">16:45</option> | ||||
|             <option value="1020">17:00</option> | ||||
|             <option value="1035">17:15</option> | ||||
|             <option value="1050">17:30</option> | ||||
|             <option value="1065">17:45</option> | ||||
|             <option value="1080">18:00</option> | ||||
|             <option value="1095">18:15</option> | ||||
|             <option value="1110">18:30</option> | ||||
|             <option value="1125">18:45</option> | ||||
|             <option value="1140">19:00</option> | ||||
|             <option value="1155">19:15</option> | ||||
|             <option value="1170">19:30</option> | ||||
|             <option value="1185">19:45</option> | ||||
|             <option value="1200">20:00</option> | ||||
|             <option value="1215">20:15</option> | ||||
|             <option value="1230">20:30</option> | ||||
|             <option value="1245">20:45</option> | ||||
|             <option value="1260">21:00</option> | ||||
|             <option value="1275">21:15</option> | ||||
|             <option value="1290">21:30</option> | ||||
|             <option value="1305">21:45</option> | ||||
|             <option value="1320">22:00</option> | ||||
|             <option value="1335">22:15</option> | ||||
|             <option value="1350">22:30</option> | ||||
|             <option value="1365">22:45</option> | ||||
|             <option value="1380">23:00</option> | ||||
|             <option value="1395">23:15</option> | ||||
|             <option value="1410">23:30</option> | ||||
|             <option value="1425">23:45</option> | ||||
|             <option value="5000">Dawn</option> | ||||
|             <option value="6000">Dusk</option> | ||||
|         </select> | ||||
|         <div style="display:inline-block; width:12%; text-align:right;">Off</div> | ||||
|         <select id="node-input-endtime" style="width:24% !important"> | ||||
|             <option value=  "0">00:00</option> | ||||
|             <option value= "15">00:15</option> | ||||
|             <option value= "30">00:30</option> | ||||
|             <option value= "45">00:45</option> | ||||
|             <option value= "60">01:00</option> | ||||
|             <option value= "75">01:15</option> | ||||
|             <option value= "90">01:30</option> | ||||
|             <option value="105">01:45</option> | ||||
|             <option value="120">02:00</option> | ||||
|             <option value="135">02:15</option> | ||||
|             <option value="150">02:30</option> | ||||
|             <option value="165">02:45</option> | ||||
|             <option value="180">03:00</option> | ||||
|             <option value="195">03:15</option> | ||||
|             <option value="210">03:30</option> | ||||
|             <option value="225">03:45</option> | ||||
|             <option value="240">04:00</option> | ||||
|             <option value="255">04:15</option> | ||||
|             <option value="270">04:30</option> | ||||
|             <option value="285">04:45</option> | ||||
|             <option value="300">05:00</option> | ||||
|             <option value="315">05:15</option> | ||||
|             <option value="330">05:30</option> | ||||
|             <option value="345">05:45</option> | ||||
|             <option value="360">06:00</option> | ||||
|             <option value="375">06:15</option> | ||||
|             <option value="390">06:30</option> | ||||
|             <option value="405">06:45</option> | ||||
|             <option value="420">07:00</option> | ||||
|             <option value="435">07:15</option> | ||||
|             <option value="450">07:30</option> | ||||
|             <option value="465">07:45</option> | ||||
|             <option value="480">08:00</option> | ||||
|             <option value="495">08:15</option> | ||||
|             <option value="510">08:30</option> | ||||
|             <option value="525">08:45</option> | ||||
|             <option value="540">09:00</option> | ||||
|             <option value="555">09:15</option> | ||||
|             <option value="570">09:30</option> | ||||
|             <option value="585">09:45</option> | ||||
|             <option value="600">10:00</option> | ||||
|             <option value="615">10:15</option> | ||||
|             <option value="630">10:30</option> | ||||
|             <option value="645">10:45</option> | ||||
|             <option value="660">11:00</option> | ||||
|             <option value="675">11:15</option> | ||||
|             <option value="690">11:30</option> | ||||
|             <option value="705">11:45</option> | ||||
|             <option value="720">12:00</option> | ||||
|             <option value="735">12:15</option> | ||||
|             <option value="750">12:30</option> | ||||
|             <option value="765">12:45</option> | ||||
|             <option value="780">13:00</option> | ||||
|             <option value="795">13:15</option> | ||||
|             <option value="810">13:30</option> | ||||
|             <option value="825">13:45</option> | ||||
|             <option value="840">14:00</option> | ||||
|             <option value="855">14:15</option> | ||||
|             <option value="870">14:30</option> | ||||
|             <option value="885">14:45</option> | ||||
|             <option value="900">15:00</option> | ||||
|             <option value="915">15:15</option> | ||||
|             <option value="930">15:30</option> | ||||
|             <option value="945">15:45</option> | ||||
|             <option value="960">16:00</option> | ||||
|             <option value="975">16:15</option> | ||||
|             <option value="990">16:30</option> | ||||
|             <option value="1005">16:45</option> | ||||
|             <option value="1020">17:00</option> | ||||
|             <option value="1035">17:15</option> | ||||
|             <option value="1050">17:30</option> | ||||
|             <option value="1065">17:45</option> | ||||
|             <option value="1080">18:00</option> | ||||
|             <option value="1095">18:15</option> | ||||
|             <option value="1110">18:30</option> | ||||
|             <option value="1125">18:45</option> | ||||
|             <option value="1140">19:00</option> | ||||
|             <option value="1155">19:15</option> | ||||
|             <option value="1170">19:30</option> | ||||
|             <option value="1185">19:45</option> | ||||
|             <option value="1200">20:00</option> | ||||
|             <option value="1215">20:15</option> | ||||
|             <option value="1230">20:30</option> | ||||
|             <option value="1245">20:45</option> | ||||
|             <option value="1260">21:00</option> | ||||
|             <option value="1275">21:15</option> | ||||
|             <option value="1290">21:30</option> | ||||
|             <option value="1305">21:45</option> | ||||
|             <option value="1320">22:00</option> | ||||
|             <option value="1335">22:15</option> | ||||
|             <option value="1350">22:30</option> | ||||
|             <option value="1365">22:45</option> | ||||
|             <option value="1380">23:00</option> | ||||
|             <option value="1395">23:15</option> | ||||
|             <option value="1410">23:30</option> | ||||
|             <option value="1425">23:45</option> | ||||
|             <option value="5000">Dawn</option> | ||||
|             <option value="6000">Dusk</option> | ||||
|             <option value="10001">Start + 1 min</option> | ||||
|             <option value="10002">Start + 2 mins</option> | ||||
|             <option value="10005">Start + 5 mins</option> | ||||
|             <option value="10010">Start + 10 mins</option> | ||||
|             <option value="10015">Start + 15 mins</option> | ||||
|             <option value="10030">Start + 30 mins</option> | ||||
|             <option value="10060">Start + 60 mins</option> | ||||
|             <option value="10090">Start + 90 mins</option> | ||||
|             <option value="10120">Start + 120 mins</option> | ||||
|         </select> | ||||
|     </div> | ||||
|  | ||||
|   <div class="form-row" id="latlonrow"> | ||||
|     <label for="node-input-lat"><i class="fa fa-globe"></i> Place    Lat</label> | ||||
|     <input type="text" id="node-input-lat" placeholder="51.025" style="width:22%"> | ||||
|     <div style="display:inline-block; width:12%; text-align:right;">Lon</div> | ||||
|     <input type="text" id="node-input-lon" placeholder="-1.4" style="width:22%"> | ||||
|   </div> | ||||
|  | ||||
|   <div class="form-row" id="offsetrow"> | ||||
|     <label for="node-input-dawnoff">Offset : Dawn</label> | ||||
|     <input type="text" id="node-input-dawnoff" placeholder="0" style="width:22%"> | ||||
|     <div style="display:inline-block; width:12%; text-align:right;">Dusk</div> | ||||
|     <input type="text" id="node-input-duskoff" placeholder="0" style="width:22%"> | ||||
|   </div> | ||||
|  | ||||
|   <style>input[type=checkbox] { vertical-align:top; position:relative; bottom:1px; }</style> | ||||
|  | ||||
|   <div> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-sun" placeholder="sun" > Sun </span> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-mon" placeholder="mon" > Mon </span> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-tue" placeholder="tue" > Tue </span> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-wed" placeholder="wed" > Wed </span> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-thu" placeholder="thu" > Thu </span> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-fri" placeholder="fri" > Fri </span> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-sat" placeholder="sat" > Sat </span> | ||||
|   </div> | ||||
|   <br/><br/> | ||||
|   <div> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-jan" placeholder="jan" > Jan </span> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-feb" placeholder="feb" > Feb </span> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-mar" placeholder="mar" > Mar </span> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-apr" placeholder="apr" > Apr </span> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-may" placeholder="may" > May </span> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-jun" placeholder="jun" > Jun </span> | ||||
|     <br/> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-jul" placeholder="jul" > Jul </span> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-aug" placeholder="aug" > Aug </span> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-sep" placeholder="sep" > Sep </span> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-oct" placeholder="oct" > Oct </span> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-nov" placeholder="nov" > Nov </span> | ||||
|     <span style="width: 55px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-dec" placeholder="dec" > Dec </span> | ||||
|   </div> | ||||
|   <br/><br/> | ||||
|   <div class="form-row"> | ||||
|     <label for="node-input-mytopic"><i class="fa fa-tasks"></i> Topic </label> | ||||
|     <input type="text" id="node-input-mytopic" placeholder="optional msg.topic"> | ||||
|   </div> | ||||
|   <div class="form-row"> | ||||
|         <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> | ||||
|         <input type="text" id="node-input-name" placeholder="Name"> | ||||
|     </div> | ||||
| </script> | ||||
|  | ||||
| <script type="text/x-red" data-help-name="timeswitch"> | ||||
|     <p>Timeswitch node to schedule daily on/off events.</p> | ||||
|     <p>Sets <b>msg.payload</b> to 1 at on time, and 0 at off time.</p> | ||||
|     <p>Also allows the use of dawn and dusk.</p> | ||||
|     <p>Dawn and dusk times can be offset both positively (+ve) for minutes later | ||||
|     or negatively (-ve) for minutes earlier.</p> | ||||
|     <p>The output emits a <b>msg.payload</b> of <i>1</i> or <i>0</i> every minute depending on | ||||
|     whether the current time is during the selected on time or off time.</p> | ||||
|     <p>If you just need the transitions from 0->1 or 1->0 then follow this node with an RBE node.</p> | ||||
|     <p>You may also optionally specify a <b>msg.topic</b> if required.</p> | ||||
| </script> | ||||
|  | ||||
| <script type="text/javascript"> | ||||
|  | ||||
|     function updaterows() { | ||||
|         if (($("#node-input-starttime").val() >= 5000 ) || ($("#node-input-endtime").val() == 5000 ) || ($("#node-input-endtime").val() == 6000 )) { | ||||
|             $("#latlonrow").show(); | ||||
|             $("#offsetrow").show(); | ||||
|         } else { | ||||
|             $("#latlonrow").hide(); | ||||
|             $("#offsetrow").hide(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     RED.nodes.registerType('timeswitch',{ | ||||
|         category: 'advanced-input', | ||||
|         color:"#6699ff", | ||||
|         defaults: { | ||||
|             name: {value:""}, | ||||
|             mytopic: {value:""}, | ||||
|             lat: {value:"", validate:RED.validators.number()}, | ||||
|             lon: {value:"", required:true, validate:RED.validators.number()}, | ||||
|             starttime: {value:"5000", required: true}, | ||||
|             endtime: {value:"780", required: true}, | ||||
|             duskoff: {value:"0", required: true}, | ||||
|             dawnoff: {value:"0", required: true}, | ||||
|             sun: {value:true}, | ||||
|             mon: {value:true}, | ||||
|             tue: {value:true}, | ||||
|             wed: {value:true}, | ||||
|             thu: {value:true}, | ||||
|             fri: {value:true}, | ||||
|             sat: {value:true}, | ||||
|             jan: {value:true}, | ||||
|             feb: {value:true}, | ||||
|             mar: {value:true}, | ||||
|             apr: {value:true}, | ||||
|             may: {value:true}, | ||||
|             jun: {value:true}, | ||||
|             jul: {value:true}, | ||||
|             aug: {value:true}, | ||||
|             sep: {value:true}, | ||||
|             oct: {value:true}, | ||||
|             nov: {value:true}, | ||||
|             dec: {value:true} | ||||
|         }, | ||||
|         inputs:0, | ||||
|         outputs:1, | ||||
|         icon: "timer.png", | ||||
|         label: function() { | ||||
|             return this.name||"timeswitch"; | ||||
|         }, | ||||
|         labelStyle: function() { | ||||
|             return this.name?"node_label_italic":""; | ||||
|         }, | ||||
|         oneditprepare: function() { | ||||
|             if (($("#node-input-lat").val() === "") && ($("#node-input-lon").val() === "")) { | ||||
|                 if ("geolocation" in navigator) { | ||||
|                     navigator.geolocation.getCurrentPosition(function(position) { | ||||
|                         $("#node-input-lat").val(Number(position.coords.latitude.toFixed(5))); | ||||
|                         $("#node-input-lon").val(Number(position.coords.longitude.toFixed(5))); | ||||
|                     }); | ||||
|                 } | ||||
|             } | ||||
|             $("#node-input-starttime").change(function() { | ||||
|                 updaterows(); | ||||
|             }); | ||||
|             $("#node-input-endtime").change(function() { | ||||
|                 updaterows(); | ||||
|             }); | ||||
|         }, | ||||
|         button: { | ||||
|             onclick: function() { | ||||
|                 $.ajax({ | ||||
|                     url: "timeswitch/"+this.id, | ||||
|                     type:"POST", | ||||
|                     success: function(resp) { | ||||
|                         RED.notify("Successfully injected: "+label,"success"); | ||||
|                     }, | ||||
|                     error: function(jqXHR,textStatus,errorThrown) { | ||||
|                         if (jqXHR.status === 404) { | ||||
|                             RED.notify("<strong>Error</strong>: timeswitch node not deployed","error"); | ||||
|                         } else if (jqXHR.status === 500) { | ||||
|                             RED.notify("<strong>Error</strong>: timeswitch reset failed, see log for details.","error"); | ||||
|                         } else if (jqXHR.status === 0) { | ||||
|                             RED.notify("<strong>Error</strong>: no response from server","error"); | ||||
|                         } else { | ||||
|                             RED.notify("<strong>Error</strong>: unexpected error: ("+jqXHR.status+") "+textStatus,"error"); | ||||
|                         } | ||||
|                     } | ||||
|                 }); | ||||
|             } | ||||
|         } | ||||
|     }); | ||||
| </script> | ||||
							
								
								
									
										175
									
								
								time/timeswitch/timeswitch.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								time/timeswitch/timeswitch.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,175 @@ | ||||
| /** | ||||
|  * Copyright 2015 IBM Corp. | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  * | ||||
|  * Based on work by P.Scargill and D.Conway-Jones | ||||
|  * | ||||
|  **/ | ||||
|  | ||||
| module.exports = function(RED) { | ||||
|     "use strict"; | ||||
|     var SunCalc = require('suncalc'); | ||||
|  | ||||
|     function TimeswitchNode(n) { | ||||
|         RED.nodes.createNode(this, n); | ||||
|         this.lat = n.lat; | ||||
|         this.lon = n.lon; | ||||
|         this.start = n.start || "sunrise"; | ||||
|         this.end = n.end || "sunset"; | ||||
|         this.startt = n.starttime; | ||||
|         this.endt = n.endtime; | ||||
|         this.duskoff = n.duskoff; | ||||
|         this.dawnoff = n.dawnoff; | ||||
|         this.mytopic = n.mytopic; | ||||
|  | ||||
|         this.sun = n.sun; | ||||
|         this.mon = n.mon; | ||||
|         this.tue = n.tue; | ||||
|         this.wed = n.wed; | ||||
|         this.thu = n.thu; | ||||
|         this.fri = n.fri; | ||||
|         this.sat = n.sat; | ||||
|         this.jan = n.jan; | ||||
|         this.feb = n.feb; | ||||
|         this.mar = n.mar; | ||||
|         this.apr = n.apr; | ||||
|         this.may = n.may; | ||||
|         this.jun = n.jun; | ||||
|         this.jul = n.jul; | ||||
|         this.aug = n.aug; | ||||
|         this.sep = n.sep; | ||||
|         this.oct = n.oct; | ||||
|         this.nov = n.nov; | ||||
|         this.dec = n.dec; | ||||
|  | ||||
|         var node = this; | ||||
|         var ison = 0; | ||||
|         var newendtime = 0; | ||||
|  | ||||
|         this.on("input", function(msg2) { | ||||
|             if (msg2.payload === "reset") { ison = 0; } | ||||
|  | ||||
|             var now = new Date(); | ||||
|             var nowoff = -now.getTimezoneOffset() * 60000; | ||||
|             var nowMillis = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), 0); | ||||
|             nowMillis += nowoff; | ||||
|             var midnightMillis = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), 0, 0); | ||||
|             var today = Math.round((nowMillis - midnightMillis) / 60000) % 1440; | ||||
|             var starttime = Number(node.startt); | ||||
|             var endtime = Number(node.endt); | ||||
|  | ||||
|             if ((starttime >= 5000) || (endtime == 5000) || (endtime == 6000)) { | ||||
|                 var times = SunCalc.getTimes(now, node.lat, node.lon); | ||||
|                 var startMillis = Date.UTC(times[node.start].getUTCFullYear(), times[node.start].getUTCMonth(), times[node.start].getUTCDate(), times[node.start].getUTCHours(), times[node.start].getUTCMinutes()); | ||||
|                 var endMillis   = Date.UTC(times[node.end].getUTCFullYear(), times[node.end].getUTCMonth(), times[node.end].getUTCDate(), times[node.end].getUTCHours(), times[node.end].getUTCMinutes()); | ||||
|                 startMillis += nowoff; | ||||
|                 endMillis   += nowoff; | ||||
|                 var dawn = ((startMillis - midnightMillis) / 60000) + Number(node.dawnoff); | ||||
|                 var dusk = ((endMillis   - midnightMillis) / 60000) + Number(node.duskoff); | ||||
|                 if (starttime == 5000) { starttime = dawn; } | ||||
|                 if (starttime == 6000) { starttime = dusk; } | ||||
|                 if (endtime   == 5000) { endtime   = dawn; } | ||||
|                 if (endtime   == 6000) { endtime   = dusk; } | ||||
|                 if (RED.settings.verbose) { node.log("Dawn " + parseInt(dawn / 60) + ":" + dawn % 60 + " - Dusk " + parseInt(dusk / 60) + ":" + dusk % 60); } | ||||
|             } | ||||
|  | ||||
|             var proceed = 0; | ||||
|             switch (now.getDay()) { | ||||
|                 case 0 : { if (node.sun) { proceed++ } break; } | ||||
|                 case 1 : { if (node.mon) { proceed++ } break; } | ||||
|                 case 2 : { if (node.tue) { proceed++ } break; } | ||||
|                 case 3 : { if (node.wed) { proceed++ } break; } | ||||
|                 case 4 : { if (node.thu) { proceed++ } break; } | ||||
|                 case 5 : { if (node.fri) { proceed++ } break; } | ||||
|                 case 6 : { if (node.sat) { proceed++ } break; } | ||||
|             } | ||||
|  | ||||
|             if (proceed) { | ||||
|                 switch (now.getMonth()) { | ||||
|                     case 0 : { if (node.jan) { proceed++ } break; } | ||||
|                     case 1 : { if (node.feb) { proceed++ } break; } | ||||
|                     case 2 : { if (node.mar) { proceed++ } break; } | ||||
|                     case 3 : { if (node.apr) { proceed++ } break; } | ||||
|                     case 4 : { if (node.may) { proceed++ } break; } | ||||
|                     case 5 : { if (node.jun) { proceed++ } break; } | ||||
|                     case 6 : { if (node.jul) { proceed++ } break; } | ||||
|                     case 7 : { if (node.aug) { proceed++ } break; } | ||||
|                     case 8 : { if (node.sep) { proceed++ } break; } | ||||
|                     case 9 : { if (node.oct) { proceed++ } break; } | ||||
|                     case 10: { if (node.nov) { proceed++ } break; } | ||||
|                     case 11: { if (node.dec) { proceed++ } break; } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (proceed >= 2) { proceed = 1; } | ||||
|             else { proceed = 0; } | ||||
|  | ||||
|             newendtime = endtime; | ||||
|             if (endtime > 10000) { newendtime = starttime + (endtime - 10000); } | ||||
|  | ||||
|             if (proceed) { // have to handle midnight wrap | ||||
|                 if (starttime <= newendtime) { | ||||
|                     if ((today >= starttime) && (today <= newendtime)) { proceed++; } | ||||
|                 } | ||||
|                 else { | ||||
|                     if ((today >= starttime) || (today <= newendtime)) { proceed++; } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (proceed >= 2) { | ||||
|                 var duration = newendtime - today; | ||||
|                 if (today > newendtime) { duration += 1440; } | ||||
|                 //node.status({fill:"yellow",shape:"dot",text:"on for " + duration + " mins"}); | ||||
|                 node.status({fill:"yellow", shape:"dot", text:"on until " + parseInt(newendtime / 60) + ":" + ("0" + newendtime % 60).substr(-2)}); | ||||
|             } | ||||
|             //else { node.status({fill:"blue",shape:"dot",text:"off"}); } | ||||
|             else {  node.status({fill:"blue", shape:"dot", text:"off until " + parseInt(starttime / 60) + ":" + ("0" + starttime % 60).substr(-2)}); } | ||||
|  | ||||
|             var msg = {}; | ||||
|             if (node.mytopic) { msg.topic = node.mytopic; } | ||||
|             (proceed >= 2) ? (msg.payload = 1) : (msg.payload = 0); | ||||
|             node.send(msg); | ||||
|         }); | ||||
|  | ||||
|         var tock = setTimeout(function() { | ||||
|             node.emit("input", {}); | ||||
|         }, 2000); // wait 2 secs before starting to let things settle down – e.g. UI connect | ||||
|  | ||||
|         var tick = setInterval(function() { | ||||
|             node.emit("input", {}); | ||||
|         }, 60000); // trigger every 60 secs | ||||
|  | ||||
|         this.on("close", function() { | ||||
|             if (tock) { clearTimeout(tock); } | ||||
|             if (tick) { clearInterval(tick); } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     RED.httpAdmin.post("/timeswitch/:id", RED.auth.needsPermission("timeswitch.write"), function(req, res) { | ||||
|         var node = RED.nodes.getNode(req.params.id); | ||||
|         if (node != null) { | ||||
|             try { | ||||
|                 node.emit("input", {payload:"reset"}); | ||||
|                 res.send(200); | ||||
|             } catch (err) { | ||||
|                 res.send(500); | ||||
|                 node.error("Inject failed:" + err); | ||||
|             } | ||||
|         } else { | ||||
|             res.send(404); | ||||
|         } | ||||
|     }); | ||||
|  | ||||
|     RED.nodes.registerType("timeswitch", TimeswitchNode); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user