Skip to content

Commit c1809f4

Browse files
author
Robert Strouse
committed
Add sunrise/sunset offset to schedules.
1 parent 34c96ed commit c1809f4

2 files changed

Lines changed: 96 additions & 14 deletions

File tree

scripts/config/general.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@
155155
var v = dataBinder.fromElement(p);
156156
console.log(v);
157157
$.putApiService('/config/general', v, 'Saving Locality Information...', function (data, status, xhr) {
158-
self.dataBind(data);
158+
self.dataBind(data.pool);
159159
console.log(data);
160160
var tempUnits = o.tempUnits.find(elem => elem.val === data.pool.options.units) || { val: 0, name: 'F', desc: 'Fahrenheit' };
161161
var tu = '°' + tempUnits.name;

scripts/config/schedules.js

Lines changed: 95 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,12 @@
6363
// Figure out our formats.
6464
o.fmtTime = o.clockMode === 12 ? 'h:mmtt' : 'HH:mm';
6565
o.fmtTimeEmpty = o.clockMode === 12 ? '12:00am' : '00:00';
66-
66+
6767
var line = $('<div></div>').addClass('schedule-circuit').appendTo(pnl);
68+
if ($('div.dashOuter').data('controllertype').includes('Nixie')) {
69+
$('<div></div>').appendTo(line).checkbox({ labelText: 'Disabled', binding: binding + 'disabled', display: 'inline-block' });
70+
}
71+
line = $('<div></div>').addClass('schedule-circuit').appendTo(pnl);
6872
$('<input type="hidden" data-datatype="int"></input>').attr('data-bind', 'id').appendTo(line);
6973
$('<div></div>').appendTo(line).pickList({
7074
required: true, bindColumn: 0, displayColumn: 1, labelText: 'Circuit', binding: binding + 'circuit',
@@ -83,8 +87,8 @@
8387
items: o.displayTypes, inputAttrs: { style: { width: '6.7rem' } }, labelAttrs: { style: { marginLeft: '.25rem' } }
8488
});
8589
}
86-
var line_outer = $('<div></div>').appendTo(pnl);
87-
line = $('<div></div>').addClass('schedule-heatsource').css({display: 'inline-block'}).appendTo(line_outer).hide();$('<div></div>').appendTo(line).pickList({
90+
var line_outer = $('<div></div>').appendTo(pnl);
91+
line = $('<div></div>').addClass('schedule-heatsource').css({ display: 'inline-block' }).appendTo(line_outer).hide(); $('<div></div>').appendTo(line).pickList({
8892
required: true, bindColumn: 0, displayColumn: 1, labelText: 'Heat Source', binding: binding + 'heatSource',
8993
columns: [{ binding: 'val', hidden: true, text: 'Id', style: { whiteSpace: 'nowrap' } }, { binding: 'desc', text: 'Heat Source', style: { whiteSpace: 'nowrap' } }],
9094
items: o.heatSources, inputAttrs: { style: { width: '8rem' } }, labelAttrs: { style: { width: '5.75rem', marginLeft: '.25rem' } }
@@ -96,7 +100,7 @@
96100
}
97101
else {
98102
p.find('div.picValueSpinner[data-bind=heatSetpoint]').show()[0].required(true);
99-
if (evt.newItem.hasCoolSetpoint === true && ($('div.dashOuter').data('controllertype')).includes('center'))
103+
if (evt.newItem.hasCoolSetpoint === true && $('div.dashOuter').data('controllertype').indexOf('touch') === -1)
100104
p.find('div.picValueSpinner[data-bind=coolSetpoint]').show()[0].required(true);
101105
else
102106
p.find('div.picValueSpinner[data-bind=coolSetpoint]').hide()[0].required(false);
@@ -105,37 +109,56 @@
105109
});
106110
$('<div></div>').appendTo(line).valueSpinner({ canEdit: true, labelText: 'Heat', binding: binding + 'heatSetpoint', min: 0, max: 104, step: 1, maxlength: 5, units: '°' + o.tempUnits.name, labelAttrs: { style: { marginLeft: '1rem', marginRight: '.25rem' } } });
107111
$('<div></div>').appendTo(line).valueSpinner({ canEdit: true, labelText: 'Cool', binding: binding + 'coolSetpoint', min: 0, max: 104, step: 1, maxlength: 5, units: '°' + o.tempUnits.name, labelAttrs: { style: { marginLeft: '1rem', marginRight: '.25rem' } } }).hide();
108-
if ($('div.dashOuter').data('controllertype').includes('Nixie')){
109-
$('<div></div>').appendTo(line_outer).checkbox({ labelText: 'Disabled', binding: binding + 'disabled', display: 'inline-block' });
110-
}
111112
$('<hr></hr>').appendTo(pnl);
112-
var inline = $('<div></div>').addClass('inline-line').appendTo(pnl);
113+
var pnlTime = $('<div></div>').appendTo(pnl).css({ display: 'table-row' });
114+
var inline = $('<div></div>').addClass('inline-line').appendTo(pnlTime).css({ display: 'table-cell', width: '100%' });
113115

114116
line = $('<div></div>').addClass('schedule-time').addClass('start-time').appendTo(inline);
115-
$('<label></label>').appendTo(line).text('Start Time').css({ marginLeft: '.25rem', width: '5.75rem', display: 'inline-block' });
117+
$('<label></label>').appendTo(line).text('Start Time').css({ marginLeft: '.25rem', width: '5rem', display: 'inline-block' });
116118
$('<div></div>').appendTo(line).pickList({
117119
required: true, bindColumn: 0, displayColumn: 1, labelText: '', binding: binding + 'startTimeType',
118120
columns: [{ binding: 'val', hidden: true, text: 'Id', style: { whiteSpace: 'nowrap' } }, { binding: 'desc', text: 'Start Type', style: { whiteSpace: 'nowrap' } }],
119121
items: o.scheduleTimeTypes, inputAttrs: { style: { width: '4rem' } }, labelAttrs: { style: { display: 'none' } }
120122
}).css({ marginRight: '.25rem' });
121123
$('<div></div>').appendTo(line).timeSpinner({ labelText: '', binding: binding + 'startTime', min: 0, max: 1440, step: 30, fmtMask: o.fmtTime, emptyMask: o.fmtTimeEmpty, inputAttrs: { maxlength: 7 }, labelAttrs: {} });
124+
$('<div></div>').appendTo(line).pickList({
125+
value: -1,
126+
bindColumn: 0, displayColumn: 1, labelText: '', binding: binding + 'startTimeMult',
127+
columns: [{ binding: 'val', hidden: true, text: 'mult' }, { binding: 'direction', text: 'Offset' }, { binding: 'desc', text: 'Description', style: { whiteSpace: 'nowrap' } }],
128+
items: [{ val: -1, direction: 'minus', desc: 'Shedule time will start before sunrise/sunset' }, { val: 1, direction: 'plus', desc: 'Shedule time will start after sunrise/sunset' }],
129+
inputAttrs: { style: { width: '4rem' } }, labelAttrs: { style: { display: 'none' } }, style: {}
130+
});
122131

123-
line = $('<div></div>').addClass('schedule-time').addClass('end-time').appendTo(inline);
124-
$('<label></label>').appendTo(line).text('End Time').css({ marginLeft: '.25rem', width: '5.75rem', display: 'inline-block' });
132+
var line1 = $('<div></div>').addClass('schedule-time').addClass('timeoffset').appendTo(line);
133+
$('<div></div>').appendTo(line1).valueSpinner({ canEdit: true, labelText: '', binding: binding + 'startTimeOffsetHours', min: 0, max: 6, step: 1, units: 'hrs', inputAttrs: { maxlength: 2 }, labelAttrs: { style: { marginLeft: '.25rem', width: '5rem' } }, style: { marginRight: '.25rem' } });
134+
$('<div></div>').appendTo(line1).valueSpinner({ canEdit: true, labelText: '', binding: binding + 'startTimeOffsetMins', min: 0, max: 59, step: 1, units: 'min', inputAttrs: { maxlength: 3 }, labelAttrs: {} });
135+
136+
line = $('<div></div>').addClass('schedule-time').addClass('end-time').appendTo(inline).css({ marginTop: '3px' });
137+
$('<label></label>').appendTo(line).text('End Time').css({ marginLeft: '.25rem', width: '5rem', display: 'inline-block' });
125138
$('<div></div>').appendTo(line).pickList({
126139
required: true, bindColumn: 0, displayColumn: 1, labelText: '', binding: binding + 'endTimeType',
127140
columns: [{ binding: 'val', hidden: true, text: 'Id', style: { whiteSpace: 'nowrap' } }, { binding: 'desc', text: 'End Type', style: { whiteSpace: 'nowrap' } }],
128141
items: o.scheduleTimeTypes, inputAttrs: { style: { width: '4rem' } }, labelAttrs: { style: { display: 'none' } }
129142
}).css({ marginRight: '.25rem' });
130143
$('<div></div>').appendTo(line).timeSpinner({ labelText: '', binding: binding + 'endTime', min: 0, max: 1440, step: 30, fmtMask: o.fmtTime, emptyMask: o.fmtTimeEmpty, inputAttrs: { maxlength: 7 }, labelAttrs: {} });
144+
$('<div></div>').appendTo(line).pickList({
145+
value: -1,
146+
bindColumn: 0, displayColumn: 1, labelText: '', binding: binding + 'endTimeMult',
147+
columns: [{ binding: 'val', hidden: true, text: 'mult' }, { binding: 'direction', text: 'Offset' }, { binding: 'desc', text: 'Description', style: { whiteSpace: 'nowrap' } }],
148+
items: [{ val: -1, direction: 'minus', desc: 'Shedule time will end before sunrise/sunset' }, { val: 1, direction: 'plus', desc: 'Shedule time will end after sunrise/sunset' }],
149+
inputAttrs: { style: { width: '4rem' } }, labelAttrs: { style: { display: 'none' } }, style: {}
150+
});
151+
line1 = $('<div></div>').addClass('schedule-time').addClass('timeoffset').appendTo(line);
152+
$('<div></div>').appendTo(line1).valueSpinner({ canEdit: true, labelText: '', binding: binding + 'endTimeOffsetHours', min: 0, max: 6, step: 1, units: 'hrs', inputAttrs: { maxlength: 2 }, labelAttrs: { style: { marginLeft: '.25rem', width: '5rem' } }, style: { marginRight: '.25rem' } });
153+
$('<div></div>').appendTo(line1).valueSpinner({ canEdit: true, labelText: '', binding: binding + 'endTimeOffsetMins', min: 0, max: 59, step: 1, units: 'min', inputAttrs: { maxlength: 3 }, labelAttrs: {} });
131154

132-
inline = $('<div></div>').addClass('inline-line').appendTo(pnl);
155+
inline = $('<div></div>').addClass('inline-line').appendTo(pnlTime).css({ display: 'table-cell', paddingRight: '7px' });
133156
$('<div></div>').appendTo(inline).pnlScheduleDays({ singleSelect: false, days: o.scheduleDays, binding: binding + 'scheduleDays' }).css({ paddingLeft: '.25rem' });
134157
line = $('<div></div>').appendTo(inline);
135158
$('<div></div>').appendTo(line).dateField({
136159
labelText: 'Schedule Date', binding: binding + 'startDate', canEdit: true,
137160
labelAttrs: {}, inputAttrs: { maxlength: 15, style: { width: '7rem' } }
138-
});
161+
}).css({ whiteSpace: 'nowrap' });
139162
var btnPnl = $('<div class="picBtnPanel btn-panel"></div>').appendTo(pnl);
140163
var btnSave = $('<div id="btnSaveBody"></div>').appendTo(btnPnl).actionButton({ text: 'Save Schedule', icon: '<i class="fas fa-save"></i>' });
141164
el.on('selchanged', 'div.picPickList[data-bind=circuit]', function (evt) {
@@ -152,20 +175,70 @@
152175
el.on('selchanged', 'div.picPickList[data-bind$=TimeType]', function (evt) {
153176
var p = $(evt.currentTarget).parents('div.schedule-time:first');
154177
var spin = p.find('div.picValueSpinner[data-bind$=Time]:first');
178+
var mult = p.find('div.picPickList[data-bind$=Mult]:first');
179+
var off = p.find('div.timeoffset:first');
155180
if (evt.newItem.name !== 'manual') {
156181
spin.hide();
182+
mult.show();
183+
off.show();
157184
spin[0].required(false);
158185
}
159186
else {
160187
spin.show();
188+
mult.hide();
189+
off.hide();
161190
spin[0].required(true);
162191
}
163192
});
164193
el.on('selchanged', 'div.picPickList[data-bind=scheduleType]', function (evt) { self._setScheduleType(evt.newItem.val); });
165194
btnSave.on('click', function (e) {
166195
var p = $(e.target).parents('div.picAccordian-contents:first');
167196
var v = dataBinder.fromElement(p);
197+
let st = o.scheduleTimeTypes.find(elem => elem.val === v.startTimeType);
198+
let et = o.scheduleTimeTypes.find(elem => elem.val === v.endTimeType);
199+
let ct = $('body').attr('data-controllertype');
168200
if (dataBinder.checkRequired(el, true)) {
201+
// Ok so lets calculate the startTime offset.
202+
if (st.name !== 'manual') {
203+
if (ct !== 'nixie' && st.name === 'sunset' && et.name === 'sunrise') {
204+
$('<div></div>')
205+
.appendTo(p.find('div[data-bind$=startTime]'))
206+
.fieldTip({ message: 'The start time must be less than the end time' });
207+
return;
208+
}
209+
v.startTimeOffset = v.startTimeMult * ((v.startTimeOffsetHours * 60) + v.startTimeOffsetMins);
210+
if (Math.abs(v.startTimeOffset) > (6 * 60)) {
211+
$('<div></div>')
212+
.appendTo(p.find('div[data-bind$=startTimeOffsetHours]'))
213+
.fieldTip({ message: 'You may only provide an offset<br/>of 6 hours or less' });
214+
return;
215+
}
216+
}
217+
else {
218+
v.startTimeOffset = 0;
219+
if (ct !== 'nixie' && et.name === 'manual' && v.startTime > v.endTime) {
220+
$('<div></div>')
221+
.appendTo(p.find('div[data-bind$=startTime]'))
222+
.fieldTip({ message: 'The start time must be less than the end time' });
223+
return;
224+
}
225+
}
226+
if (et.name !== 'manual') {
227+
v.endTimeOffset = v.endTimeMult * ((v.endTimeOffsetHours * 60) + v.endTimeOffsetMins);
228+
if (Math.abs(v.endTimeOffset) > (6 * 60)) {
229+
$('<div></div>')
230+
.appendTo(p.find('div[data-bind$=endTimeOffsetHours]'))
231+
.fieldTip({ message: 'You may only provide an offset<br/>of 6 hours or less' });
232+
return;
233+
}
234+
}
235+
else v.endTimeOffset = 0;
236+
delete v.endTimeMult;
237+
delete v.endTimeOffsetHours;
238+
delete v.endTimeOffsetMins;
239+
delete v.startTimeMult;
240+
delete v.startTimeOffsetHours;
241+
delete v.startTimeOffsetMins;
169242
console.log(v);
170243
$.putApiService('/config/schedule', v, 'Saving Schedule...', function (data, status, xhr) {
171244
console.log({ data: data, status: status, xhr: xhr });
@@ -282,6 +355,15 @@
282355
if (typeof obj.display === 'undefined') obj.display = 0;
283356
if (!obj.isActive || obj.disabled) cols[0].elGlyph().css({ color: 'silver' });
284357
else cols[0].elGlyph().css({ color: '' });
358+
// Convert our data for the start/end time offsets.
359+
var stOffset = Math.abs(obj.startTimeOffset || 0);
360+
obj.startTimeMult = (obj.startTimeOffset || 0) >= 0 ? 1 : -1;
361+
obj.startTimeOffsetHours = Math.floor(stOffset / 60);
362+
obj.startTimeOffsetMins = (stOffset) - (obj.startTimeOffsetHours * 60);
363+
var etOffset = Math.abs(obj.endTimeOffset || 0);
364+
obj.endTimeMult = (obj.endTimeOffset || 0) >= 0 ? 1 : -1;
365+
obj.endTimeOffsetHours = Math.floor(etOffset / 60);
366+
obj.endTimeOffsetMins = (etOffset) - (obj.endTimeOffsetHours * 60);
285367
console.log(obj);
286368
dataBinder.bind(el, obj);
287369
if (o.scheduleTimeTypes.length <= 1) el.find('div.picPickList[data-bind$=TimeType]').hide()[0].required(false);

0 commit comments

Comments
 (0)