node-red-contrib-vacation-timer
Version:
A node-red node that simulates a house being occupied, by turning something on and off in a natural way.
777 lines (747 loc) • 42.7 kB
HTML
<!--
Copyright 2017 JBardi
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.
-->
<script type="text/x-red" data-template-name="vacation-timer">
<style>
.container {
width: 100%;
}
ul.tabs {
margin: 0px;
padding: 0px;
list-style: none;
}
ul.tabs li {
background: none;
color: #222;
display: inline-block;
padding: 10px 15px;
cursor: pointer;
}
ul.tabs li.current {
background: #ebebeb;
color: #222;
}
.tab-content {
display: none;
padding: 15px;
border: 1px solid #ededed;
}
.tab-content.current {
display: inherit;
}
</style>
<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" style="width: 300px;">
</div>
<br/>
<div class="form-row"><input type="checkbox" id="node-input-suspended" style="width: auto; vertical-align: top;"> <span>Initially Suspended (recommended)</span></div>
<div class="form-row"><span> An incoming <b><i>msg</i></b> that has a positive payload of</span> <span style="color:red;"><i>start</i></span>, <span style="color:red;"><i>on</i></span>, <span style="color:red;"><i>1</i></span> or <span style="color:red;"><i>true</i></span><br/><span> will activate the schedule.</span></div>
<div class="form-row"><span> An incoming <b><i>msg</i></b> that has a negative payload of</span> <span style="color:red;"><i>stop</i></span>, <span style="color:red;"><i>off</i></span>, <span style="color:red;"><i>0</i></span> or <span style="color:red;"><i>false</i></span><br/><span> will suspend the schedule.</span></div>
<br/>
<div class="form-row"><input type="checkbox" id="node-input-midnightSchedule" style="width: auto; vertical-align: top;"> <span>Reschedule After Completion (recommended)</span></div>
<div class="form-row"><span> When checked, a new randomized schedule will automatically be<br/>
generated for the next active day, otherwise it will be</span> <span style="color:red;"><i>Suspended</i></span><br/><span> once the current schedule completes.</span></div>
<br/>
<div class="form-row"><i class="fa fa-globe"></i> <span>Enter your Latitude and Longitude to use Dawn/Dusk/Sunrise/Sunset</span>:</div>
<div class="form-row"><span> Get Latitude/Longitude</span>: <a href="http://mygeoposition.com" target="_blank">http://mygeoposition.com</a></div>
<div class="form-row"><span> Latitude</span>: <input type="text" id="node-input-lat" placeholder="51.025" style="width:125px"> <span>Longitude</span>: <input type="text" id="node-input-lon" placeholder="-1.4" style="width:125px;"></div>
<br/>
<style>
input[type=checkbox] {
vertical-align: top;
position: relative;
bottom: 1px;
}
</style>
<div class="form-row"><i class="fa fa-calendar"></i> <span>Days of the Week</span>:</div>
<div>
<span style="width: 50px; float: left; margin-left: 5px;"> <input type="checkbox" id="node-input-sun" placeholder="sun"> Sun</span>
<span style="width: 50px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-mon" placeholder="mon"> Mon</span>
<span style="width: 50px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-tue" placeholder="tue"> Tue</span>
<span style="width: 50px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-wed" placeholder="wed"> Wed</span>
<span style="width: 50px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-thu" placeholder="thu"> Thu</span>
<span style="width: 50px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-fri" placeholder="fri"> Fri</span>
<span style="width: 50px; float: left; margin-left: 5px;"><input type="checkbox" id="node-input-sat" placeholder="sat"> Sat</span>
</div>
<div class="form-row"> <input type="checkbox" id="node-input-turnOffOnDaysOff" style="width: auto; vertical-align: top;"> <span>Issue <b>Off</b> command if it spans Midnight onto a non-scheduled day</span></div>
<br/>
<div class="form-row"><i class="fa fa-clock-o"></i> <span>Choose the Device On Time and Delay</span>:</div>
<div class="form-row">
<span> Time On</span>: <select id="node-input-onTime" style="width:100px">
<option value="dawn">Dawn</option>
<option value="dusk">Dusk</option>
<option value="sunrise">Sunrise</option>
<option value="sunset">Sunset</option>
<option value="00:00">12:00 AM</option>
<option value="00:15">12:15 AM</option>
<option value="00:30">12:30 AM</option>
<option value="00:45">12:45 AM</option>
<option value="01:00">1:00 AM</option>
<option value="01:15">1:15 AM</option>
<option value="01:30">1:30 AM</option>
<option value="01:45">1:45 AM</option>
<option value="02:00">2:00 AM</option>
<option value="02:15">2:15 AM</option>
<option value="02:30">2:30 AM</option>
<option value="02:45">2:45 AM</option>
<option value="03:00">3:00 AM</option>
<option value="03:15">3:15 AM</option>
<option value="03:30">3:30 AM</option>
<option value="03:45">3:45 AM</option>
<option value="04:00">4:00 AM</option>
<option value="04:15">4:15 AM</option>
<option value="04:30">4:30 AM</option>
<option value="04:45">4:45 AM</option>
<option value="05:00">5:00 AM</option>
<option value="05:15">5:15 AM</option>
<option value="05:30">5:30 AM</option>
<option value="05:45">5:45 AM</option>
<option value="06:00">6:00 AM</option>
<option value="06:15">6:15 AM</option>
<option value="06:30">6:30 AM</option>
<option value="06:45">6:45 AM</option>
<option value="07:00">7:00 AM</option>
<option value="07:15">7:15 AM</option>
<option value="07:30">7:30 AM</option>
<option value="07:45">7:45 AM</option>
<option value="08:00">8:00 AM</option>
<option value="08:15">8:15 AM</option>
<option value="08:30">8:30 AM</option>
<option value="08:45">8:45 AM</option>
<option value="09:00">9:00 AM</option>
<option value="09:15">9:15 AM</option>
<option value="09:30">9:30 AM</option>
<option value="09:45">9:45 AM</option>
<option value="10:00">10:00 AM</option>
<option value="10:15">10:15 AM</option>
<option value="10:30">10:30 AM</option>
<option value="10:45">10:45 AM</option>
<option value="11:00">11:00 AM</option>
<option value="11:15">11:15 AM</option>
<option value="11:30">11:30 AM</option>
<option value="11:45">11:45 AM</option>
<option value="12:00">12:00 PM</option>
<option value="12:15">12:15 PM</option>
<option value="12:30">12:30 PM</option>
<option value="12:45">12:45 PM</option>
<option value="13:00">1:00 PM</option>
<option value="13:15">1:15 PM</option>
<option value="13:30">1:30 PM</option>
<option value="13:45">1:45 PM</option>
<option value="14:00">2:00 PM</option>
<option value="14:15">2:15 PM</option>
<option value="14:30">2:30 PM</option>
<option value="14:45">2:45 PM</option>
<option value="15:00">3:00 PM</option>
<option value="15:15">3:15 PM</option>
<option value="15:30">3:30 PM</option>
<option value="15:45">3:45 PM</option>
<option value="16:00">4:00 PM</option>
<option value="16:15">4:15 PM</option>
<option value="16:30">4:30 PM</option>
<option value="16:45">4:45 PM</option>
<option value="17:00">5:00 PM</option>
<option value="17:15">5:15 PM</option>
<option value="17:30">5:30 PM</option>
<option value="17:45">5:45 PM</option>
<option value="18:00">6:00 PM</option>
<option value="18:15">6:15 PM</option>
<option value="18:30">6:30 PM</option>
<option value="18:45">6:45 PM</option>
<option value="19:00">7:00 PM</option>
<option value="19:15">7:15 PM</option>
<option value="19:30">7:30 PM</option>
<option value="19:45">7:45 PM</option>
<option value="20:00">8:00 PM</option>
<option value="20:15">8:15 PM</option>
<option value="20:30">8:30 PM</option>
<option value="20:45">8:45 PM</option>
<option value="21:00">9:00 PM</option>
<option value="21:15">9:15 PM</option>
<option value="21:30">9:30 PM</option>
<option value="21:45">9:45 PM</option>
<option value="22:00">10:00 PM</option>
<option value="22:15">10:15 PM</option>
<option value="22:30">10:30 PM</option>
<option value="22:45">10:45 PM</option>
<option value="23:00">11:00 PM</option>
<option value="23:15">11:15 PM</option>
<option value="23:30">11:30 PM</option>
<option value="23:45">11:45 PM</option>
</select>
<span>Max Delay</span>:
<select id="node-input-randMinutes" style="width:100px">
<option value="0">0</option>
<option value="5">5</option>
<option value="10">10</option>
<option value="15">15</option>
<option value="20">20</option>
<option value="25">25</option>
<option value="30">30</option>
<option value="35">35</option>
<option value="40">40</option>
<option value="45">45</option>
<option value="50">50</option>
<option value="55">55</option>
</select>
</div>
<br/>
<div class="form-row"><input type="hidden" id="node-input-stopTab"><i class="fa fa-random"></i> <span>Choose whether you want a Length of Time to turn off the device,<br/>or a Specific Time with a Delay</span>:</div>
<div class="container">
<ul class="tabs">
<li class="tab-link current" data-tab="tab-1" id="tab-1">Use Length of Time</li>
<li class="tab-link" data-tab="tab-2" id="tab-2">Use Specific Time</li>
</ul>
<div id="tab-1-content" class="tab-content current">
<div class="form-row"><i class="fa fa-arrow-down"></i> <span>The Minimum length of time you want the Device to be On</span>:</div>
<div class="form-row"><label></label>
<span>Hours</span>:
<select id="node-input-minOnHours" style="width:100px;">
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
</select>
<span>Minutes</span>:
<select id="node-input-minOnMinutes" style="width:100px;">
<option value="0">0</option>
<option value="5" class="min-0">5</option>
<option value="10" class="min-0">10</option>
<option value="15" class="min-0">15</option>
<option value="20" class="min-0">20</option>
<option value="25" class="min-0">25</option>
<option value="30" class="min-0">30</option>
<option value="35" class="min-0">35</option>
<option value="40" class="min-0">40</option>
<option value="45" class="min-0">45</option>
<option value="50" class="min-0">50</option>
<option value="55" class="min-0">55</option>
</select>
</div>
<div class="form-row"><i class="fa fa-arrow-up"></i> <span>The Maximum length of time you want the Device to be On</span>:</div>
<div class="form-row"><label><input type="checkbox" id="node-input-disableMax" style="width: 20px; vertical-align: top;"><span>Disable</span></label>
<span>Hours</span>:
<select id="node-input-maxOnHours" style="width:100px;">
<option value="0">0</option>
<option value="1" class="hr-0">1</option>
<option value="2" class="hr-0 hr-1">2</option>
<option value="3" class="hr-0 hr-1 hr-2">3</option>
<option value="4" class="hr-0 hr-1 hr-2 hr-3">4</option>
<option value="5" class="hr-0 hr-1 hr-2 hr-3 hr-4">5</option>
<option value="6" class="hr-0 hr-1 hr-2 hr-3 hr-4 hr-5">6</option>
<option value="7" class="hr-0 hr-1 hr-2 hr-3 hr-4 hr-5 hr-6">7</option>
<option value="8" class="hr-0 hr-1 hr-2 hr-3 hr-4 hr-5 hr-6 hr-7">8</option>
<option value="9" class="hr-0 hr-1 hr-2 hr-3 hr-4 hr-5 hr-6 hr-7 hr-8">9</option>
<option value="10" class="hr-0 hr-1 hr-2 hr-3 hr-4 hr-5 hr-6 hr-7 hr-8 hr-9">10</option>
<option value="11" class="hr-0 hr-1 hr-2 hr-3 hr-4 hr-5 hr-6 hr-7 hr-8 hr-9 hr-10">11</option>
<option value="12" class="hr-0 hr-1 hr-2 hr-3 hr-4 hr-5 hr-6 hr-7 hr-8 hr-9 hr-10 hr-11">12</option>
</select>
<span>Minutes</span>:
<select id="node-input-maxOnMinutes" style="width:100px;">
<option value="0">0</option>
<option value="5" class="min-0">5</option>
<option value="10" class="min-0 min-5">10</option>
<option value="15" class="min-0 min-5 min-10">15</option>
<option value="20" class="min-0 min-5 min-10 min-15">20</option>
<option value="25" class="min-0 min-5 min-10 min-15 min-20">25</option>
<option value="30" class="min-0 min-5 min-10 min-15 min-20 min-25">30</option>
<option value="35" class="min-0 min-5 min-10 min-15 min-20 min-25 min-30">35</option>
<option value="40" class="min-0 min-5 min-10 min-15 min-20 min-25 min-30 min-35">40</option>
<option value="45" class="min-0 min-5 min-10 min-15 min-20 min-25 min-30 min-35 min-40">45</option>
<option value="50" class="min-0 min-5 min-10 min-15 min-20 min-25 min-30 min-35 min-40 min-45">50</option>
<option value="55" class="min-0 min-5 min-10 min-15 min-20 min-25 min-30 min-35 min-40 min-45 min-50">55</option>
</select>
</div>
</div>
<div id="tab-2-content" class="tab-content">
<div class="form-row"><i class="fa fa-clock-o"></i> <span>Choose the Device Off Time and Delay</span>:</div>
<div class="form-row">
<span> Time Off</span>:
<select id="node-input-offTime" style="width:100px">
<option value="dawn">Dawn</option>
<option value="dusk">Dusk</option>
<option value="sunrise">Sunrise</option>
<option value="sunset">Sunset</option>
<option value="00:00">12:00 AM</option>
<option value="00:15">12:15 AM</option>
<option value="00:30">12:30 AM</option>
<option value="00:45">12:45 AM</option>
<option value="01:00">1:00 AM</option>
<option value="01:15">1:15 AM</option>
<option value="01:30">1:30 AM</option>
<option value="01:45">1:45 AM</option>
<option value="02:00">2:00 AM</option>
<option value="02:15">2:15 AM</option>
<option value="02:30">2:30 AM</option>
<option value="02:45">2:45 AM</option>
<option value="03:00">3:00 AM</option>
<option value="03:15">3:15 AM</option>
<option value="03:30">3:30 AM</option>
<option value="03:45">3:45 AM</option>
<option value="04:00">4:00 AM</option>
<option value="04:15">4:15 AM</option>
<option value="04:30">4:30 AM</option>
<option value="04:45">4:45 AM</option>
<option value="05:00">5:00 AM</option>
<option value="05:15">5:15 AM</option>
<option value="05:30">5:30 AM</option>
<option value="05:45">5:45 AM</option>
<option value="06:00">6:00 AM</option>
<option value="06:15">6:15 AM</option>
<option value="06:30">6:30 AM</option>
<option value="06:45">6:45 AM</option>
<option value="07:00">7:00 AM</option>
<option value="07:15">7:15 AM</option>
<option value="07:30">7:30 AM</option>
<option value="07:45">7:45 AM</option>
<option value="08:00">8:00 AM</option>
<option value="08:15">8:15 AM</option>
<option value="08:30">8:30 AM</option>
<option value="08:45">8:45 AM</option>
<option value="09:00">9:00 AM</option>
<option value="09:15">9:15 AM</option>
<option value="09:30">9:30 AM</option>
<option value="09:45">9:45 AM</option>
<option value="10:00">10:00 AM</option>
<option value="10:15">10:15 AM</option>
<option value="10:30">10:30 AM</option>
<option value="10:45">10:45 AM</option>
<option value="11:00">11:00 AM</option>
<option value="11:15">11:15 AM</option>
<option value="11:30">11:30 AM</option>
<option value="11:45">11:45 AM</option>
<option value="12:00">12:00 PM</option>
<option value="12:15">12:15 PM</option>
<option value="12:30">12:30 PM</option>
<option value="12:45">12:45 PM</option>
<option value="13:00">1:00 PM</option>
<option value="13:15">1:15 PM</option>
<option value="13:30">1:30 PM</option>
<option value="13:45">1:45 PM</option>
<option value="14:00">2:00 PM</option>
<option value="14:15">2:15 PM</option>
<option value="14:30">2:30 PM</option>
<option value="14:45">2:45 PM</option>
<option value="15:00">3:00 PM</option>
<option value="15:15">3:15 PM</option>
<option value="15:30">3:30 PM</option>
<option value="15:45">3:45 PM</option>
<option value="16:00">4:00 PM</option>
<option value="16:15">4:15 PM</option>
<option value="16:30">4:30 PM</option>
<option value="16:45">4:45 PM</option>
<option value="17:00">5:00 PM</option>
<option value="17:15">5:15 PM</option>
<option value="17:30">5:30 PM</option>
<option value="17:45">5:45 PM</option>
<option value="18:00">6:00 PM</option>
<option value="18:15">6:15 PM</option>
<option value="18:30">6:30 PM</option>
<option value="18:45">6:45 PM</option>
<option value="19:00">7:00 PM</option>
<option value="19:15">7:15 PM</option>
<option value="19:30">7:30 PM</option>
<option value="19:45">7:45 PM</option>
<option value="20:00">8:00 PM</option>
<option value="20:15">8:15 PM</option>
<option value="20:30">8:30 PM</option>
<option value="20:45">8:45 PM</option>
<option value="21:00">9:00 PM</option>
<option value="21:15">9:15 PM</option>
<option value="21:30">9:30 PM</option>
<option value="21:45">9:45 PM</option>
<option value="22:00">10:00 PM</option>
<option value="22:15">10:15 PM</option>
<option value="22:30">10:30 PM</option>
<option value="22:45">10:45 PM</option>
<option value="23:00">11:00 PM</option>
<option value="23:15">11:15 PM</option>
<option value="23:30">11:30 PM</option>
<option value="23:45">11:45 PM</option>
</select>
<span>Max Delay</span>:
<select id="node-input-randOffMinutes" style="width:100px">
<option value="0">0</option>
<option value="5">5</option>
<option value="10">10</option>
<option value="15">15</option>
<option value="20">20</option>
<option value="25">25</option>
<option value="30">30</option>
<option value="35">35</option>
<option value="40">40</option>
<option value="45">45</option>
<option value="50">50</option>
<option value="55">55</option>
</select>
</div>
</div>
</div>
<br/>
<div class="form-row"><i class="fa fa-envelope"></i> <span>Payload and Topic for the </span><span style="color:red;">On Command</span>:</div>
<div class="form-row">
<span> Payload</span>: <input type="hidden" id="node-input-onPayloadType"><input style="width:150px;" type="text" id="node-input-onPayloadVal"> <span>Topic</span>:
<input type="text" id="node-input-onTopicVal" style="width:150px;">
</div>
<div class="form-row"><i class="fa fa-envelope"></i> <span>Payload and Topic for the </span><span style="color:red;">Off Command</span>:</div>
<div class="form-row">
<span> Payload</span>: <input type="hidden" id="node-input-offPayloadType"><input style="width:150px;" type="text" id="node-input-offPayloadVal"> <span>Topic</span>:
<input type="text" id="node-input-offTopicVal" style="width:150px;">
</div>
<hr/>
<div class="form-row">
Example:
<br/><br/>
<b>On Time:</b> 11:30 PM, <b>Max Delay:</b> 20 minutes<br/>
<b>Min Time On:</b> 3hrs, 15mins, <b>Max Time On:</b> 3hrs, 45mins
<br/><br/> The Device will be on for a random amount of time between 3hrs, 15mins<br/> and 3hrs, 45mins from the time it initially turns on, which will be<br/> randomly between 11:30 PM and 11:50 PM
</div>
</script>
<script type="text/x-red" data-help-name="vacation-timer">
<p>Simulates a house being occupied, by turning something on and off in a natural way.</p>
<p><b>Initially Suspended:</b><br/>When this is checked, the schedule will only be activated when the node receives a <code>msg</code> with a positive <code>payload</code> of <code>start</code>, <code>on</code>, <code>1</code> or <code>true</code>. If
you uncheck this box, the schedule will be activated immediately upon Deploying. You can manually enable <code>Suspend Mode</code> at any time by sending a <code>msg</code> with a negative <code>payload</code> of <code>stop</code>, <code>off</code>,
<code>0</code> or <code>false</code>. This is option is checked by default, as the recommended way of activating and deactivating the schedule is to send the node a <code>msg</code>, such as when you active or deactive your own custom <code>Vacation Mode</code> in your home automation system.</p>
<p><b>Reschedule After Completion:</b><br/>When checked, a new randomized schedule will automatically be generated for the next active day, otherwise it will be <code>Suspended</code> once the current schedule completes. It then must be re-activated
with an incoming <code>msg</code> containing a positive <code>payload</code> of <code>start</code>, <code>on</code>, <code>1</code> or <code>true</code>.</p>
<p><b>Latitude and Longitude:</b><br/>Your latitude and longitude for use with <code>Dusk, Dawn, Sunrise or Sunset</code> from the <code>Time On</code> and <code>Time Off</code> dropdowns.</p>
<p><b>Days of the Week:</b><br/>Here you can select which days of the week the schedule will be run.</p>
<p><b>Issue Off Command on non-scheduled days:</b><br/>If the scheduled <code>Time On</code> is before Midnight on a scheduled day, the device will always turn on, however, if the following day is a non-scheduled day, and the <code>Time Off</code> of
the same schedule is after Midnight, thus falling on the non-scheduled day, the device will <code>NOT</code> be turned off unless this option is checked. The assumption is that if you do not want the normal schedule to take place on a specific
day, you may also not want the <code>Off</code> command to be activated on that day either. If this option is not checked, you will have to either setup an additional <code>Vacation Timer</code> node or some other node-red timer to take care of
shutting off those devices that were not turned off.</p>
<p><b>Time On:</b><br/>This is the earliest time of day that you want the device to be turned on.</p>
<p><b>Max Delay:</b><br/>This is the maximum number of random minutes you want tagged onto your chosen <code>Time On</code>. If you choose <code>7:30 AM</code> as your <code>Time On</code> with a <code>Max Delay</code> of <code>30 minutes</code>, your
device will turn on between <code>7:30 AM and 8:00 AM</code></p>
<p><b>Length of Time OR Specific Time:</b><br/>Depending on which tab you choose, you can have the device turn off after a Length of Time (minimum/maximum), or you can have the device turn off at a Specific Time with a Delay.</p>
<p><b>Use Length of Time:</b><br/>
<b>Minimum Time On:</b><br/> The minimum hours and minutes you want the device to be on.<br/>
<b>Maximum Time On:</b><br/> The maximum hours and minutes you want the device to be on.<br/>
<b>Disable Maximum Time On:</b><br/> If this is checked, the <code>Maximum Time On</code> will be ignored and the device will be turned off after the exact hours and minutes selected in <code>Minimum Time On</code>.</p>
<p><b>Use Specific Time:</b><br/>
<b>Time On:</b><br/> This is the earliest time you want the device to be turned off.<br/>
<b>Max Delay:</b><br/> This is the maximum number of random minutes you want tagged onto your chosen <code>Time Off</code>. If you choose <code>8:15 PM</code> as your <code>Time Off</code> with a <code>Max Delay</code> of <code>45 minutes</code>,
your device will turn on between <code>8:15 PM and 8:45 PM</code></p>
<p><b>Payload and Topic:</b><br/>Set the <code>Payload</code> and <code>Topic</code> values for both the <code>On</code> and <code>Off</code> commands.</p>
</script>
<script type="text/javascript">
RED.nodes.registerType('vacation-timer', {
category: 'function',
color: "#B0DFE3",
defaults: {
name: {
value: ""
},
lat: {
value: ""
},
lon: {
value: ""
},
turnOffOnDaysOff: {
value: true
},
midnightSchedule: {
value: true
},
onTime: {
value: "07:00"
},
randMinutes: {
value: "0"
},
offTime: {
value: "14:00"
},
randOffMinutes: {
value: "0"
},
minOnHours: {
value: "0"
},
minOnMinutes: {
value: "10"
},
maxOnHours: {
value: "0"
},
maxOnMinutes: {
value: "20"
},
stopTab: {
value: "tab-1"
},
onPayloadType: {
value: "str"
},
onPayloadVal: {
value: "on"
},
onTopicVal: {
value: ""
},
offPayloadType: {
value: "str"
},
offPayloadVal: {
value: "off"
},
offTopicVal: {
value: ""
},
suspended: {
value: true
},
disableMax: {
value: false
},
sun: {
value: true
},
mon: {
value: true
},
tue: {
value: true
},
wed: {
value: true
},
thu: {
value: true
},
fri: {
value: true
},
sat: {
value: true
}
},
inputs: 1,
outputs: 1,
icon: "vacation-timer.png",
label: function() {
return this.name || "Vacation Timer";
},
labelStyle: function() {
return this.name ? "node_label_italic" : "";
},
oneditprepare: function() {
// First Load
var minOnHours = parseInt($("#node-input-minOnHours").val());
var maxOnHours = parseInt($("#node-input-maxOnHours").val());
var minOnMinutes = parseInt($("#node-input-minOnMinutes").val());
var maxOnMinutes = parseInt($("#node-input-maxOnMinutes").val());
if (maxOnHours == minOnHours) {
for (var i = 55; i > minOnMinutes; i = i - 5) {
$("#node-input-maxOnMinutes option[value='" + i + "']").prop('disabled', false);
}
for (var i = 0; i <= minOnMinutes; i = i + 5) {
$("#node-input-maxOnMinutes option[value='" + i + "']").prop('disabled', true);
}
}
if (minOnHours === 0) {
if (minOnMinutes === 0) {
$("#node-input-minOnMinutes").val('5');
}
$("#node-input-minOnMinutes option[value='0']").prop('disabled', true);
}
if (minOnMinutes == 55) {
$("#node-input-maxOnHours option[value='" + minOnHours + "']").prop('disabled', true);
}
if (!$("#node-input-stopTab").val()) {
$("#node-input-stopTab").val("tab-1");
}
if (!$("#node-input-offTime").val()) {
$("#node-input-offTime").val("14:00");
}
if (!$("#node-input-randOffMinutes").val()) {
$("#node-input-randOffMinutes").val("30");
}
var stopTab = $("#node-input-stopTab").val();
$("ul.tabs li").removeClass("current");
$(".tab-content").removeClass("current");
if (stopTab == "tab-1") {
$("#tab-1").addClass('current');
$("#tab-1-content").addClass('current');
} else if (stopTab == "tab-2") {
$("#tab-2").addClass('current');
$("#tab-2-content").addClass('current');
}
// Length of Time Off Tab Click Function
$("#tab-1").click(function() {
$("#tab-2").removeClass('current');
$("#tab-2-content").removeClass('current');
$("#tab-1").addClass('current');
$("#tab-1-content").addClass('current');
$("#node-input-stopTab").val('tab-1');
});
// Specific Time Off Tab Click Function
$("#tab-2").click(function() {
$("#tab-1").removeClass('current');
$("#tab-1-content").removeClass('current');
$("#tab-2").addClass('current');
$("#tab-2-content").addClass('current');
$("#node-input-stopTab").val('tab-2');
});
// Automatically Set Latitude and Longitude if the browser allows it
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)));
});
}
}
// Min Minutes Change Function
$("#node-input-minOnMinutes").change(function() {
if($("#node-input-disableMax").is(":checked")) {
$("#node-input-maxOnMinutes").val($(this).val());
}
});
// Min Hours Change Function
$("#node-input-minOnHours").change(function() {
var minOnHours = parseInt($(this).val());
var maxOnHours = parseInt($("#node-input-maxOnHours").val());
var minOnMinutes = parseInt($("#node-input-minOnMinutes").val());
for (var i = 12; i >= minOnHours; i--) {
$("#node-input-maxOnHours option[value='" + i + "']").prop('disabled', false);
}
for (var i = 0; i < minOnHours; i++) {
$("#node-input-maxOnHours option[value='" + i + "']").prop('disabled', true);
}
if (maxOnHours < minOnHours) {
$("#node-input-maxOnHours").val(minOnHours.toString());
}
if (minOnHours === 0) {
if (minOnMinutes === 0) {
$("#node-input-minOnMinutes").val('5');
}
$("#node-input-minOnMinutes option[value='0']").prop('disabled', true);
} else {
$("#node-input-minOnMinutes option[value='0']").prop('disabled', false);
}
if($("#node-input-disableMax").is(":checked")) {
$("#node-input-maxOnHours").val($(this).val());
}
});
// Min Minutes & Min Hours Change Function
$("#node-input-minOnMinutes").add("#node-input-minOnHours").change(function() {
var minOnHours = parseInt($("#node-input-minOnHours").val());
var maxOnHours = parseInt($("#node-input-maxOnHours").val());
var minOnMinutes = parseInt($("#node-input-minOnMinutes").val());
var maxOnMinutes = parseInt($("#node-input-maxOnMinutes").val());
if (minOnMinutes == 55) {
if (maxOnHours == minOnHours) {
$("#node-input-maxOnHours").val((maxOnHours + 1).toString());
}
$("#node-input-maxOnHours option[value='" + minOnHours + "']").prop('disabled', true);
} else {
$("#node-input-maxOnHours option[value='" + minOnHours + "']").prop('disabled', false);
}
if (maxOnMinutes < minOnMinutes) {
if ((minOnMinutes == 55) && (maxOnHours == minOnHours)) {
$("#node-input-maxOnMinutes").val('0');
} else if (maxOnHours == minOnHours) {
$("#node-input-maxOnMinutes").val((minOnMinutes + 5).toString());
}
}
});
// Max Minutes Focus Function
$("#node-input-maxOnMinutes").focus(function() {
var minOnHours = parseInt($("#node-input-minOnHours").val());
var maxOnHours = parseInt($("#node-input-maxOnHours").val());
var minOnMinutes = parseInt($("#node-input-minOnMinutes").val());
var maxOnMinutes = parseInt($(this).val());
if (maxOnHours == minOnHours) {
for (var i = 55; i > minOnMinutes; i = i - 5) {
$("#node-input-maxOnMinutes option[value='" + i + "']").prop('disabled', false);
}
for (var i = 0; i <= minOnMinutes; i = i + 5) {
$("#node-input-maxOnMinutes option[value='" + i + "']").prop('disabled', true);
}
} else {
$("#node-input-maxOnMinutes option[value='0']").prop('disabled', false);
$("#node-input-maxOnMinutes option[value='5']").prop('disabled', false);
$("#node-input-maxOnMinutes option[value='10']").prop('disabled', false);
$("#node-input-maxOnMinutes option[value='15']").prop('disabled', false);
$("#node-input-maxOnMinutes option[value='20']").prop('disabled', false);
$("#node-input-maxOnMinutes option[value='25']").prop('disabled', false);
$("#node-input-maxOnMinutes option[value='30']").prop('disabled', false);
$("#node-input-maxOnMinutes option[value='35']").prop('disabled', false);
$("#node-input-maxOnMinutes option[value='40']").prop('disabled', false);
$("#node-input-maxOnMinutes option[value='45']").prop('disabled', false);
$("#node-input-maxOnMinutes option[value='50']").prop('disabled', false);
$("#node-input-maxOnMinutes option[value='55']").prop('disabled', false);
}
});
// Max Hours Change Function
$("#node-input-maxOnHours").change(function(e) {
var minOnHours = parseInt($("#node-input-minOnHours").val());
var maxOnHours = parseInt($("#node-input-maxOnHours").val());
var minOnMinutes = parseInt($("#node-input-minOnMinutes").val());
var maxOnMinutes = parseInt($("#node-input-maxOnMinutes").val());
if ((maxOnHours == minOnHours) && (maxOnMinutes <= minOnMinutes)) {
$("#node-input-maxOnMinutes").val((minOnMinutes + 5).toString());
}
});
// Allow disabling Maximum Time and only using Minimum Time as an Exact Stop Time
$("#node-input-disableMax").change(function() {
if($(this).is(":checked")) {
$(this).val(true);
$("#node-input-maxOnHours").prop("disabled", true);
$("#node-input-maxOnMinutes").prop("disabled", true);
$("#node-input-maxOnHours").val($("#node-input-minOnHours").val());
$("#node-input-maxOnMinutes").val($("#node-input-minOnMinutes").val());
} else {
$(this).val(false);
$("#node-input-maxOnHours").prop("disabled", false);
$("#node-input-maxOnMinutes").prop("disabled", false);
var val = parseInt($("#node-input-minOnMinutes").val());
val = val + 5;
$("#node-input-maxOnMinutes").val(val.toString());
}
});
// On Payload Types
$("#node-input-onPayloadVal").typedInput({
default: 'str',
typeField: $("#node-input-onPayloadType"),
types: ['str', 'num', 'bool']
});
// Off Payload Types
$("#node-input-offPayloadVal").typedInput({
default: 'str',
typeField: $("#node-input-offPayloadType"),
types: ['str', 'num', 'bool']
});
// Make sure Payloads are not Empty
if (!$("#node-input-onPayloadVal").val()) {
$("#node-input-onPayloadType").val("str");
$("#node-input-onPayloadVal").val("on");
}
if (!$("#node-input-offPayloadVal").val()) {
$("#node-input-offPayloadType").val("str");
$("#node-input-offPayloadVal").val("off");
}
}
});
</script>