Last active
June 2, 2017 05:53
-
-
Save chiensiTB/12ee0948319d0de3359553ef7971e080 to your computer and use it in GitHub Desktop.
ecobeeSi Connector Conversions to EM.Core
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//support | |
//constants | |
const timeslices = [ | |
"12:00am", | |
"12:30am", | |
"1:00am", | |
"1:30am", | |
"2:00am", | |
"2:30am", | |
"3:00am", | |
"3:30am", | |
"4:00am", | |
"4:30am", | |
"5:00am", | |
"5:30am", | |
"6:00am", | |
"6:30am", | |
"7:00am", | |
"7:30am", | |
"8:00am", | |
"8:30am", | |
"9:00am", | |
"9:30am", | |
"10:00am", | |
"10:30am", | |
"11:00am", | |
"11:30am", | |
"12:00pm", | |
"12:30pm", | |
"1:00pm", | |
"1:30pm", | |
"2:00pm", | |
"2:30pm", | |
"3:00pm", | |
"3:30pm", | |
"4:00pm", | |
"4:30pm", | |
"5:00pm", | |
"5:30pm", | |
"6:00pm", | |
"6:30pm", | |
"7:00pm", | |
"7:30pm", | |
"8:00pm", | |
"8:30pm", | |
"9:00pm", | |
"9:30pm", | |
"10:00pm", | |
"10:30pm", | |
"11:00pm", | |
"11:30pm" | |
]; | |
const days = { | |
"mon": 0, | |
"tue": 1, | |
"wed": 2, | |
"thu": 3, | |
"fri": 4, | |
"sat": 5, | |
"sun": 6 | |
}, | |
emcoreToUIClimates = { | |
"home":"home", | |
"away":"away", | |
"sleep":"sleep", | |
"wakeup":"wakeUp" | |
}; | |
//functions | |
function FtoC(f) | |
{ | |
return (f-32)/1.8; | |
} | |
var excludeUnoccupied = true | |
//from UI to EMCore************************** | |
exports.ecobeeSiEMConvert = function(original, ui, tempunits) | |
{ | |
let finalObject = {}; | |
finalObject.ConfigurationId = original.ConfigurationId; | |
finalObject.ClientId = original.ClientId; | |
finalObject.SelectedPoints = original.SelectedPoints; | |
finalObject.ParentAssetId = original.ParentAssetId; | |
finalObject.Label = original.Label; | |
//update the device object | |
let newDevice = {}; | |
newDevice.SerialNumber = original.Device.SerialNumber; | |
newDevice.EffectiveHeatingTemperature = original.Device.EffectiveHeatingTemperature; | |
newDevice.EffectiveCoolingTemperature = original.Device.EffectiveCoolingTemperature; | |
newDevice.Points = original.Device.Points; | |
newDevice.SecuritySettings = original.Device.SecuritySettings; | |
newDevice.ThermostatSettings = original.Device.ThermostatSettings; | |
newDevice.Vacations = convertVacationsEmCore(ui.customEvents,original.Device.SerialNumber, tempunits); | |
newDevice.ClimateSettings = convertClimateSettingsEmCore(ui.settings, original.Device.ClimateSettings, tempunits); | |
newDevice.Schedules = convertSchedulesEmCore(ui.schedules); | |
finalObject.Device = newDevice; | |
return finalObject; | |
} | |
function convertClimateSettingsEmCore(uisettings, origsettings, units) | |
{ | |
let settings = []; | |
let ui = uisettings["wakeUp"]; | |
let orig = origsettings.filter(byProp("ComfortReferenceName","wakeup")); | |
settings.push(makeClimateSettingEmCore(ui, orig[0], units)); | |
ui = uisettings["home"]; | |
orig = origsettings.filter(byProp("ComfortReferenceName","home")); | |
settings.push(makeClimateSettingEmCore(ui, orig[0], units)); | |
ui = uisettings["away"]; | |
orig = origsettings.filter(byProp("ComfortReferenceName","away")); | |
settings.push(makeClimateSettingEmCore(ui, orig[0], units)); | |
ui = uisettings["sleep"]; | |
orig = origsettings.filter(byProp("ComfortReferenceName","sleep")) | |
settings.push(makeClimateSettingEmCore(ui, orig[0], units)); | |
return settings; | |
} | |
function makeClimateSettingEmCore(ui, orig, units) | |
{ | |
let emSetting = {}; | |
emSetting.IsOccupied = ui.usuallyOccupied; | |
emSetting.HeatingTemperature = units == "Celsius" ? ui.heating : FtoC(ui.heating); | |
emSetting.CoolingTemperature = units == "Celsius" ? ui.cooling : FtoC(ui.cooling); | |
emSetting.ThermostatId = orig.ThermostatId; | |
emSetting.ComfortReferenceName = orig.ComfortReferenceName; | |
emSetting.CoolingFanMode = orig.CoolingFanMode; | |
emSetting.HeatingFanMode = orig.HeatingFanMode; | |
emSetting.Ventilator = orig.Ventilator; | |
return emSetting; | |
} | |
function convertVacationsEmCore(uivacations, statId, units) | |
{ | |
let vacationsEm = []; | |
for(let v of uivacations) | |
{ | |
let emv = {}; | |
emv.CoolingTemperature = units == "Celsius" ? v.cooling : FtoC(v.cooling); | |
emv.HeatingTemperature = units == "Celsius" ? v.heating : FtoC(v.heating); | |
emv.MinimumFanRuntimeMinutes = v.minFanRuntime; | |
emv.CoolingFanMode = v.coolingFanMode; | |
emv.Name = v.title; | |
emv.StartDateTime = v.start; | |
emv.EndDateTime = v.end; | |
emv.ThermostatId = statId; | |
vacationsEm.push(emv); | |
} | |
return vacationsEm; | |
} | |
function convertSchedulesEmCore(uischedules) | |
{ | |
return generateWeeklySchedule("away",uischedules,regenerateWeeklySchedule); | |
} | |
// Create 7 arrays for days of week with 48 half-hour time slots, initially set | |
// to default setting ("away" for Smart Si, "unoccupied" from EMS). | |
function generateWeeklySchedule(defaultSetting, uischedules, callback) { | |
let scheduleObject = {}; | |
for (var prop in days) { | |
let day = []; | |
for (let j = 0; j < 48; j++) { | |
day.push(defaultSetting); | |
} | |
scheduleObject[prop] = day; | |
} | |
return callback(scheduleObject, uischedules) | |
} | |
// After CRUD operations, regenerate schedule to API friendly format | |
function regenerateWeeklySchedule(scheduleObject,uischedules) { | |
//let scheduleArray = JSON.parse(JSON.stringify(generateWeeklyScheduleDefault("away"))); | |
for (var day in uischedules) { | |
// for each day of the week | |
let periodArray = uischedules[day]; | |
// For each period, set schedule array settings | |
if(periodArray.length == 0) | |
{ | |
//do nothing, this should all be set to away anyway! | |
} | |
else | |
{ | |
//convert the periods's start and end times to indices instead of timestrings | |
for(let period of periodArray) | |
{ | |
period.start = timeslices.indexOf(period.start); | |
period.end = timeslices.indexOf(period.end); | |
} | |
//now, as we loop through, we make decisions about what to put in this 48 element array | |
for(let i = 0; i < scheduleObject[day].length; i++) | |
{ | |
for(let period of periodArray) | |
{ | |
//special case added for when period.end == "12:00am" | |
if(period.end == 0 && period.start > 0) | |
{ | |
//user implies that they want the remainder of the schedule to be set to this period | |
if(i >= period.start) | |
{ | |
scheduleObject[day][i] = period.setting.replace(" ", "").toLowerCase(); | |
} | |
} | |
else if (period.end == 0 && period.start == 0) | |
{ | |
//all the same | |
scheduleObject[day][i] = period.setting.replace(" ", "").toLowerCase(); | |
} | |
else | |
{ | |
//"normal" | |
if(i >= period.start && i < period.end) //intersection | |
{ | |
scheduleObject[day][i] = period.setting.replace(" ", "").toLowerCase(); | |
} | |
} | |
} | |
} | |
} | |
} | |
//convert the object to the proper EMcore array | |
let scheduleArray = []; | |
scheduleArray.push(scheduleObject["mon"]); | |
scheduleArray.push(scheduleObject["tue"]); | |
scheduleArray.push(scheduleObject["wed"]); | |
scheduleArray.push(scheduleObject["thu"]); | |
scheduleArray.push(scheduleObject["fri"]); | |
scheduleArray.push(scheduleObject["sat"]); | |
scheduleArray.push(scheduleObject["sun"]); | |
return scheduleArray; | |
} | |
//end from UI to EMCore ************************** | |
//from EMCore to UI ************************** | |
exports.ecobeeSiUIConvert = function(emcore) | |
{ | |
let uiObject = {}; | |
uiObject.customEvents = convertVacationsUI(emcore.Device.Vacations); | |
uiObject.settings = convertClimateSettingsUI(emcore.Device.ClimateSettings); | |
uiObject.schedules = convertSchedulesUI(emcore.Device.Schedules); | |
uiObject.thermostatSettings = emcore.Device.ThermostatSettings; | |
uiObject.thermostatSettings["unit"] = "C" //It is assumed that the device settings are always stored on EM.core in Celsius | |
return uiObject | |
} | |
function convertSchedulesUI(schedules) | |
{ | |
let weeklySchedules = getOccupiedPeriods(schedules) | |
return weeklySchedules; | |
} | |
function getOccupiedPeriods(schedules) { | |
let daysMap = { | |
0: "mon", | |
1: "tue", | |
2: "wed", | |
3: "thu", | |
4: "fri", | |
5: "sat", | |
6: "sun" | |
}, | |
weeklySchedule = { | |
mon: [], | |
tue: [], | |
wed: [], | |
thu: [], | |
fri: [], | |
sat: [], | |
sun: [] | |
} | |
for (let dayIdx = 0; dayIdx < 7; dayIdx++) { | |
// For each of 7 day arrays | |
let periods = []; | |
let start = null; | |
let end = null; | |
let currentSetting = ""; | |
for (let timeIdx = 0; timeIdx < 48; timeIdx++) { | |
let setting = schedules[dayIdx][timeIdx]; | |
if (start === null) { | |
// First time period, set start index and setting | |
start = timeIdx; | |
currentSetting = setting; | |
} else if (timeIdx === schedules[dayIdx].length-1) { | |
if(excludeUnoccupied && currentSetting==="away") | |
{ | |
start = timeIdx; | |
currentSetting = setting; | |
end = null; | |
} | |
else | |
{ | |
periods.push({ | |
setting: emcoreToUIClimates[currentSetting], | |
start: timeslices[start], | |
end: timeslices[timeIdx] | |
}); | |
start = timeIdx; | |
currentSetting = setting; | |
end = null; | |
} | |
} else if (setting !== currentSetting) { | |
// If setting is different and you haven't hit the last time period | |
end = timeIdx; | |
if(excludeUnoccupied && currentSetting ==="away") | |
{ | |
start = timeIdx; | |
currentSetting = setting; | |
end = null; | |
} | |
else | |
{ | |
periods.push({ | |
setting: emcoreToUIClimates[currentSetting], | |
start: timeslices[start], | |
end: timeslices[end] | |
}); | |
start = timeIdx; | |
currentSetting = setting; | |
end = null; | |
} | |
} | |
} | |
//special case if all in away mode. | |
if(periods.length == 1) | |
{ | |
if(periods[0].start == "12:00am" && periods[0].end=="11:30pm"&&periods[0].setting=="away") | |
{ | |
periods = []; | |
} | |
} | |
weeklySchedule[daysMap[dayIdx]] = periods; | |
} | |
return weeklySchedule; | |
} | |
function convertVacationsUI(vacations) | |
{ | |
//TODO: consider in future reading incoming vacations to match template (versioned) | |
let customEvents = []; | |
for(let v of vacations) | |
{ | |
let uiv = {}; | |
uiv.cooling = v.CoolingTemperature; | |
uiv.heating = v.HeatingTemperature; | |
uiv.minFanRuntime = v.MinimumFanRuntimeMinutes; | |
uiv.coolingFanMode = v.CoolingFanMode; //this is currently unused by RBC front end. | |
uiv.title = v.Name; | |
uiv.start = v.StartDateTime; | |
uiv.end = v.EndDateTime; | |
uiv.unit = "C" // this is the default for EM.core | |
customEvents.push(uiv); | |
} | |
return customEvents | |
} | |
function convertClimateSettingsUI(climateSettings) | |
{ | |
let settings = {}; | |
let c = climateSettings.filter(byProp("ComfortReferenceName","wakeup")) | |
settings["wakeUp"] = makeClimateUI(c[0],"Wake Up"); | |
c = climateSettings.filter(byProp("ComfortReferenceName","home")) | |
settings["home"] = makeClimateUI(c[0],"Home"); | |
c = climateSettings.filter(byProp("ComfortReferenceName","away")) | |
settings["away"] = makeClimateUI(c[0],"Away"); | |
c = climateSettings.filter(byProp("ComfortReferenceName","sleep")) | |
settings["sleep"] = makeClimateUI(c[0],"Sleep"); | |
return settings; | |
} | |
function byProp(prop,name) | |
{ | |
return function(el) | |
{ | |
return el[prop] == name; | |
} | |
} | |
function makeClimateUI(climateSetting, label) | |
{ | |
let obj = {}; | |
obj.label = label; | |
obj.usuallyOccupied = climateSetting.IsOccupied; | |
obj.heating = climateSetting.HeatingTemperature; | |
obj.cooling = climateSetting.CoolingTemperature; | |
//TODO: thermostat ID? | |
//TODO: CoolingFanMode? | |
//TODO: HeatingFanMode? | |
//TODO: Ventilator? | |
return obj; | |
} | |
exports.ecobeeSiUIConvertSch_fromModal = function(modalObject) | |
{ | |
//incoming modalObjectshould match the mykolaWeeklyEcobee below | |
//this will match the schedules object coming from EM.core | |
let tempschedules = []; | |
//first split and clean up the data coming from Mykola's object | |
for(let i in modalObject) | |
{ | |
//console.log(i); | |
if(i == 0){ console.log("Continuing"); continue; } // skip header | |
else | |
{ | |
let res = modalObject[i][0].split(","); | |
//remove the 0 index | |
res.splice(0,1); | |
//console.log("Result of split ", res); | |
let clean = res.map(function(e){ | |
let c = e.replace(/\s/g,''); | |
return c.toLowerCase(); | |
}) | |
//console.log(clean); | |
tempschedules.push(clean) | |
} | |
} | |
//console.log(tempschedules); | |
let emschedules = []; | |
emschedules = tempschedules[0].map(function(col,i) { | |
return tempschedules.map(function(row){ | |
return row[i]; | |
}) | |
}) | |
//console.log("EM Schedule", emschedules); | |
let schedules = convertSchedulesUI(emschedules) | |
return schedules | |
} | |
exports.ecobeeSiUIConvertVac_fromModal = function(modalVacations){ | |
let customEvents = []; | |
//convert and clean | |
for(let i in modalVacations) | |
{ | |
if(i == 0) { continue; } | |
let res = modalVacations[i][0].split(','); | |
console.log(res); | |
let uiv = {}; | |
uiv.cooling = res[3]; | |
uiv.heating = res[4]; | |
uiv.minFanRuntime = res[6]; | |
uiv.title = res[0]; | |
uiv.start = res[1]; //TODO: needs proper formatting to match EM.core and UI requirements | |
uiv.end = res[2]; //TODO: needs proper formatting to match EM.core and UI requirements | |
uiv.unit = "C" //TODO: could this ever not be the case for modals? | |
customEvents.push(uiv) | |
} | |
return customEvents; | |
} | |
// end convert to UI *********************** | |
//test object | |
exports.mykolaEcobeeVacations = | |
[["Vacation Name, Start Date, End Date, Cooling Setpoint, Heating Setpoint, Fan Mode, Minimum Hourly Runtime Minutes "], | |
["Family Day, 1 / 20 / 2017 0: 00, 1 / 20 / 2017 23: 30, 26, 15, Auto, 10 "], | |
["Good Friday, 4 / 14 / 2017 0: 00, 4 / 14 / 2017 23: 30, 26, 15, Auto, 10 "], | |
["Victoria Day, 5 / 22 / 2017 0: 00, 5 / 22 / 2017 23: 30, 26, 15, Auto, 10 "], | |
["Canada Day, 7 / 1 / 2017 0: 00, 7 / 1 / 2017 23: 30, 26, 15, Auto, 10 "], | |
["Canada Day2, 7 / 3 / 2017 0: 00, 7 / 3 / 2017 23: 30, 26, 15, Auto, 10 "], | |
["Civic Hol, 8 / 7 / 2017 0: 00, 8 / 7 / 2017 23: 30, 26, 15, Auto, 10 "], | |
["Labour Day, 9 / 4 / 2017 0: 00, 9 / 4 / 2017 23: 30, 26, 15, Auto, 10 "], | |
["Thanksgiving, 10 / 9 / 2017 0: 00, 10 / 9 / 2017 23: 30, 26, 15, Auto, 10 "], | |
["Remembrance, 11 / 11 / 2017 0: 00, 11 / 11 / 2017 23: 30, 26, 15, Auto, 10 "], | |
["Remembrance2, 11 / 13 / 2017 0: 00, 11 / 13 / 2017 23: 30, 26, 15, Auto, 10 "], | |
["Christmas, 12 / 25 / 2017 0: 00, 12 / 25 / 2017 23: 30, 26, 15, Auto, 10 "], | |
["Boxing Day, 12 / 26 / 2017 0: 00, 12 / 26 / 2017 23: 30, 26, 15, Auto, 10 "]]; | |
exports.mykolaWeeklyEcobee = | |
[ | |
[", Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday "], | |
["0:00,Away,Away,Away,Away,Away,Away,Away"], | |
["0: 30, Away, Away, Away, Away, Away, Away, Away"], | |
["1:00, Away, Away, Away, Away, Away, Away, Away"], | |
["1:30, Away, Away, Away, Away, Away, Away, Away"], | |
["2:00, Away, Away, Away, Away, Away, Away, Away"], | |
["2:30, Away, Away, Away, Away, Away, Away, Away"], | |
["3:00, Away, Away, Away, Away, Away, Away, Away"], | |
["3:30, Away, Away, Away, Away, Away, Away, Away"], | |
["4:00, Away, Away, Away, Away, Away, Away, Away"], | |
["4:30, Away, Away, Away, Away, Away, Away, Away"], | |
["5:00, Away, Away, Away, Away, Away, Away, Away"], | |
["5: 30, Away, Away, Away, Away, Away, Away, Away "], | |
["6: 00, Away, Away, Away, Away, Away, Away, Away "], | |
["6: 30, Away, Away, Away, Away, Away, Away, Away "], | |
["7: 00, Away, Away, Away, Away, Away, Away, Away "], | |
["7: 30, Away, Away, Away, Away, Away, Away, Away "], | |
["8: 00, Away, Away, Away, Away, Away, Away, Away "], | |
["8: 30, Home, Home, Home, Home, Home, Home, Away "], | |
["9: 00, Home, Home, Home, Home, Home, Home, Away "], | |
["9: 30, Home, Home, Home, Home, Home, Home, Away "], | |
["10: 00, Home, Home, Home, Home, Home, Home, Away "], | |
["10: 30, Home, Home, Home, Home, Home, Home, Away "], | |
["11: 00, Home, Home, Home, Home, Home, Home, Away "], | |
["11: 30, Home, Home, Home, Home, Home, Home, Away "], | |
["12: 00, Home, Home, Home, Home, Home, Home, Away "], | |
["12: 30, Home, Home, Home, Home, Home, Home, Away "], | |
["13: 00, Home, Home, Home, Home, Home, Home, Away "], | |
["13: 30, Home, Home, Home, Home, Home, Home, Away "], | |
["14: 00, Home, Home, Home, Home, Home, Home, Away "], | |
["14: 30, Home, Home, Home, Home, Home, Home, Away "], | |
["15: 00, Home, Home, Home, Home, Home, Home, Away "], | |
["15: 30, Home, Home, Home, Home, Home, Home, Away "], | |
["16: 00, Home, Home, Home, Home, Home, Home, Away "], | |
["16: 30, Home, Home, Home, Home, Home, Home, Away "], | |
["17: 00, Away, Away, Home, Home, Home, Away, Away "], | |
["17: 30, Away, Away, Home, Home, Home, Away, Away "], | |
["18: 00, Away, Away, Home, Home, Away, Away, Away "], | |
["18: 30, Away, Away, Home, Home, Away, Away, Away "], | |
["19: 00, Away, Away, Home, Home, Away, Away, Away "], | |
["19: 30, Away, Away, Home, Home, Away, Away, Away "], | |
["20: 00, Away, Away, Away, Away, Away, Away, Away "], | |
["20: 30, Away, Away, Away, Away, Away, Away, Away "], | |
["21: 00, Away, Away, Away, Away, Away, Away, Away "], | |
["21: 30, Away, Away, Away, Away, Away, Away, Away "], | |
["22: 00, Away, Away, Away, Away, Away, Away, Away "], | |
["22: 30, Away, Away, Away, Away, Away, Away, Away "], | |
["23: 00, Away, Away, Away, Away, Away, Away, Away "], | |
["23: 30, Away, Away, Away, Away, Away, Away, Away "] | |
] | |
exports.sampleUIPassedObject = { | |
"customEvents": [{ | |
"cooling": 26, | |
"heating": 10, | |
"minFanRuntime": 0, | |
"coolingFanMode": 0, | |
"title": "Boxing Day", | |
"start": "2017-12-26T00:00:00", | |
"end": "2017-12-26T23:30:00", | |
"unit": "C" | |
}, { | |
"cooling": 26, | |
"heating": 10, | |
"minFanRuntime": 0, | |
"coolingFanMode": 0, | |
"title": "Christmas", | |
"start": "2017-12-25T00:00:00", | |
"end": "2017-12-25T23:30:00", | |
"unit": "C" | |
}, { | |
"cooling": 26, | |
"heating": 10, | |
"minFanRuntime": 0, | |
"coolingFanMode": 0, | |
"title": "Remembrance2", | |
"start": "2017-11-13T00:00:00", | |
"end": "2017-11-13T23:30:00", | |
"unit": "C" | |
}, { | |
"cooling": 26, | |
"heating": 10, | |
"minFanRuntime": 0, | |
"coolingFanMode": 0, | |
"title": "Remembrance", | |
"start": "2017-11-11T00:00:00", | |
"end": "2017-11-11T23:30:00", | |
"unit": "C" | |
}, { | |
"cooling": 26, | |
"heating": 10, | |
"minFanRuntime": 0, | |
"coolingFanMode": 0, | |
"title": "Thanksgiving", | |
"start": "2017-10-09T00:00:00", | |
"end": "2017-10-09T23:30:00", | |
"unit": "C" | |
}, { | |
"cooling": 26, | |
"heating": 10, | |
"minFanRuntime": 0, | |
"coolingFanMode": 0, | |
"title": "Labour Day", | |
"start": "2017-09-04T00:00:00", | |
"end": "2017-09-04T23:30:00", | |
"unit": "C" | |
}, { | |
"cooling": 26, | |
"heating": 10, | |
"minFanRuntime": 0, | |
"coolingFanMode": 0, | |
"title": "Civic Hol", | |
"start": "2017-08-07T00:00:00", | |
"end": "2017-08-07T23:30:00", | |
"unit": "C" | |
}, { | |
"cooling": 26, | |
"heating": 10, | |
"minFanRuntime": 0, | |
"coolingFanMode": 0, | |
"title": "Canada Day2", | |
"start": "2017-07-03T00:00:00", | |
"end": "2017-07-03T23:30:00", | |
"unit": "C" | |
}, { | |
"cooling": 26, | |
"heating": 10, | |
"minFanRuntime": 0, | |
"coolingFanMode": 0, | |
"title": "Canada Day", | |
"start": "2017-07-01T00:00:00", | |
"end": "2017-07-01T23:30:00", | |
"unit": "C" | |
}, { | |
"cooling": 26, | |
"heating": 10, | |
"minFanRuntime": 0, | |
"coolingFanMode": 0, | |
"title": "Victoria Day", | |
"start": "2017-05-22T00:00:00", | |
"end": "2017-05-22T23:30:00", | |
"unit": "C" | |
}], | |
"settings": { | |
"wakeUp": { | |
"label": "Wake Up", | |
"usuallyOccupied": true, | |
"heating": 15.5, | |
"cooling": 28 | |
}, | |
"home": { | |
"label": "Home", | |
"usuallyOccupied": true, | |
"heating": 22, | |
"cooling": 25.5 | |
}, | |
"away": { | |
"label": "Away", | |
"usuallyOccupied": false, | |
"heating": 15.5, | |
"cooling": 28 | |
}, | |
"sleep": { | |
"label": "Sleep", | |
"usuallyOccupied": true, | |
"heating": 15.5, | |
"cooling": 28 | |
} | |
}, | |
"schedules": { | |
"mon": [{ | |
"setting": "home", | |
"start": "8:30am", | |
"end": "6:00pm" | |
}, | |
{ | |
"setting": "home", | |
"start": "7:00pm", | |
"end": "12:00am" | |
} | |
], | |
"tue": [{ | |
"setting": "home", | |
"start": "8:30am", | |
"end": "6:00pm" | |
}], | |
"wed": [{ | |
"setting": "home", | |
"start": "8:30am", | |
"end": "6:00pm" | |
}], | |
"thu": [{ | |
"setting": "home", | |
"start": "8:30am", | |
"end": "9:00pm" | |
}], | |
"fri": [{ | |
"setting": "home", | |
"start": "8:30am", | |
"end": "7:00pm" | |
}], | |
"sat": [{ | |
"setting": "home", | |
"start": "8:00am", | |
"end": "5:00pm" | |
}], | |
"sun": [] | |
}, | |
"thermostatSettings": { | |
"ZipCode": "M1V 5P7", | |
"HvacMode": 0, | |
"FanMinRuntime": 0, | |
"FanControlRequired": true, | |
"HeatRangeHigh": 24, | |
"HeatRangeLow": 10, | |
"CoolRangeHigh": 30, | |
"CoolRangeLow": 19, | |
"HeatCoolMinDelta": 2.2, | |
"unit": "C" | |
} | |
} | |
exports.sampleEMcoreEcobee = { | |
"Device": { | |
"SerialNumber": "211150261430", | |
"EffectiveHeatingTemperature": 22, | |
"EffectiveCoolingTemperature": 25.5, | |
"Vacations": [ | |
{ | |
"ThermostatId": "211150261430", | |
"Name": "Boxing Day", | |
"StartDateTime": "2017-12-26T00:00:00", | |
"EndDateTime": "2017-12-26T23:30:00", | |
"CoolingTemperature": 26, | |
"HeatingTemperature": 10, | |
"CoolingFanMode": 0, | |
"MinimumFanRuntimeMinutes": 0 | |
}, | |
{ | |
"ThermostatId": "211150261430", | |
"Name": "Christmas", | |
"StartDateTime": "2017-12-25T00:00:00", | |
"EndDateTime": "2017-12-25T23:30:00", | |
"CoolingTemperature": 26, | |
"HeatingTemperature": 10, | |
"CoolingFanMode": 0, | |
"MinimumFanRuntimeMinutes": 0 | |
}, | |
{ | |
"ThermostatId": "211150261430", | |
"Name": "Remembrance2", | |
"StartDateTime": "2017-11-13T00:00:00", | |
"EndDateTime": "2017-11-13T23:30:00", | |
"CoolingTemperature": 26, | |
"HeatingTemperature": 10, | |
"CoolingFanMode": 0, | |
"MinimumFanRuntimeMinutes": 0 | |
}, | |
{ | |
"ThermostatId": "211150261430", | |
"Name": "Remembrance", | |
"StartDateTime": "2017-11-11T00:00:00", | |
"EndDateTime": "2017-11-11T23:30:00", | |
"CoolingTemperature": 26, | |
"HeatingTemperature": 10, | |
"CoolingFanMode": 0, | |
"MinimumFanRuntimeMinutes": 0 | |
}, | |
{ | |
"ThermostatId": "211150261430", | |
"Name": "Thanksgiving", | |
"StartDateTime": "2017-10-09T00:00:00", | |
"EndDateTime": "2017-10-09T23:30:00", | |
"CoolingTemperature": 26, | |
"HeatingTemperature": 10, | |
"CoolingFanMode": 0, | |
"MinimumFanRuntimeMinutes": 0 | |
}, | |
{ | |
"ThermostatId": "211150261430", | |
"Name": "Labour Day", | |
"StartDateTime": "2017-09-04T00:00:00", | |
"EndDateTime": "2017-09-04T23:30:00", | |
"CoolingTemperature": 26, | |
"HeatingTemperature": 10, | |
"CoolingFanMode": 0, | |
"MinimumFanRuntimeMinutes": 0 | |
}, | |
{ | |
"ThermostatId": "211150261430", | |
"Name": "Civic Hol", | |
"StartDateTime": "2017-08-07T00:00:00", | |
"EndDateTime": "2017-08-07T23:30:00", | |
"CoolingTemperature": 26, | |
"HeatingTemperature": 10, | |
"CoolingFanMode": 0, | |
"MinimumFanRuntimeMinutes": 0 | |
}, | |
{ | |
"ThermostatId": "211150261430", | |
"Name": "Canada Day2", | |
"StartDateTime": "2017-07-03T00:00:00", | |
"EndDateTime": "2017-07-03T23:30:00", | |
"CoolingTemperature": 26, | |
"HeatingTemperature": 10, | |
"CoolingFanMode": 0, | |
"MinimumFanRuntimeMinutes": 0 | |
}, | |
{ | |
"ThermostatId": "211150261430", | |
"Name": "Canada Day", | |
"StartDateTime": "2017-07-01T00:00:00", | |
"EndDateTime": "2017-07-01T23:30:00", | |
"CoolingTemperature": 26, | |
"HeatingTemperature": 10, | |
"CoolingFanMode": 0, | |
"MinimumFanRuntimeMinutes": 0 | |
}, | |
{ | |
"ThermostatId": "211150261430", | |
"Name": "Victoria Day", | |
"StartDateTime": "2017-05-22T00:00:00", | |
"EndDateTime": "2017-05-22T23:30:00", | |
"CoolingTemperature": 26, | |
"HeatingTemperature": 10, | |
"CoolingFanMode": 0, | |
"MinimumFanRuntimeMinutes": 0 | |
} | |
], | |
"Schedules": [ | |
[ | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away" | |
], | |
[ | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away" | |
], | |
[ | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away" | |
], | |
[ | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away" | |
], | |
[ | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away" | |
], | |
[ | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"home", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away" | |
], | |
[ | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away", | |
"away" | |
] | |
], | |
"ClimateSettings": [ | |
{ | |
"ThermostatId": "211150261430", | |
"ComfortReferenceName": "wakeup", | |
"IsOccupied": true, | |
"CoolingFanMode": 0, | |
"HeatingFanMode": 0, | |
"CoolingTemperature": 28, | |
"HeatingTemperature": 15.5, | |
"Ventilator": 0 | |
}, | |
{ | |
"ThermostatId": "211150261430", | |
"ComfortReferenceName": "away", | |
"IsOccupied": false, | |
"CoolingFanMode": 0, | |
"HeatingFanMode": 0, | |
"CoolingTemperature": 28, | |
"HeatingTemperature": 15.5, | |
"Ventilator": 0 | |
}, | |
{ | |
"ThermostatId": "211150261430", | |
"ComfortReferenceName": "home", | |
"IsOccupied": true, | |
"CoolingFanMode": 1, | |
"HeatingFanMode": 1, | |
"CoolingTemperature": 25.5, | |
"HeatingTemperature": 22, | |
"Ventilator": 0 | |
}, | |
{ | |
"ThermostatId": "211150261430", | |
"ComfortReferenceName": "sleep", | |
"IsOccupied": true, | |
"CoolingFanMode": 0, | |
"HeatingFanMode": 0, | |
"CoolingTemperature": 28, | |
"HeatingTemperature": 15.5, | |
"Ventilator": 0 | |
} | |
], | |
"Points": [ | |
{ | |
"Label": "ActualHumidity", | |
"Name": "ActualHumidity", | |
"Value": 38 | |
}, | |
{ | |
"Label": "ActualTemperature", | |
"Name": "ActualTemperature", | |
"Value": 24.61 | |
}, | |
{ | |
"Label": "AutoAwayEnabled", | |
"Name": "AutoAwayEnabled", | |
"Value": 1 | |
}, | |
{ | |
"Label": "CoolingStatus", | |
"Name": "CoolingStatus", | |
"Value": 0 | |
}, | |
{ | |
"Label": "CoolRangeHigh", | |
"Name": "CoolRangeHigh", | |
"Value": 30 | |
}, | |
{ | |
"Label": "CoolRangeLow", | |
"Name": "CoolRangeLow", | |
"Value": 19 | |
}, | |
{ | |
"Label": "EffectiveCoolingTemperature", | |
"Name": "EffectiveCoolingTemperature", | |
"Value": 25.5 | |
}, | |
{ | |
"Label": "EffectiveHeatingTemperature", | |
"Name": "EffectiveHeatingTemperature", | |
"Value": 22 | |
}, | |
{ | |
"Label": "FanStatus", | |
"Name": "FanStatus", | |
"Value": 1 | |
}, | |
{ | |
"Label": "HeatingStatus", | |
"Name": "HeatingStatus", | |
"Value": 0 | |
}, | |
{ | |
"Label": "HeatRangeHigh", | |
"Name": "HeatRangeHigh", | |
"Value": 24 | |
}, | |
{ | |
"Label": "HeatRangeLow", | |
"Name": "HeatRangeLow", | |
"Value": 10 | |
}, | |
{ | |
"Label": "HoldActive", | |
"Name": "HoldActive", | |
"Value": 0 | |
}, | |
{ | |
"Label": "HeatCoolMinDelta", | |
"Name": "HeatCoolMinDelta", | |
"Value": 2.2 | |
}, | |
{ | |
"Label": "HvacMode [ Auto ]", | |
"Name": "HvacMode", | |
"Value": 0 | |
}, | |
{ | |
"Label": "DesiredFanMode [ On ]", | |
"Name": "DesiredFanMode", | |
"Value": 1 | |
}, | |
{ | |
"Label": "CurrentClimateReference [ Home ]", | |
"Name": "CurrentClimateReference", | |
"Value": 0 | |
}, | |
{ | |
"Label": "FanMinOnTime", | |
"Name": "FanMinOnTime", | |
"Value": 0 | |
}, | |
{ | |
"Label": "FanControlRequired", | |
"Name": "FanControlRequired", | |
"Value": 1 | |
}, | |
{ | |
"Label": "CompCool1", | |
"Name": "CompCool1", | |
"Value": 0 | |
}, | |
{ | |
"Label": "CompCool2", | |
"Name": "CompCool2", | |
"Value": 0 | |
}, | |
{ | |
"Label": "AuxHeat1", | |
"Name": "AuxHeat1", | |
"Value": 0 | |
}, | |
{ | |
"Label": "AuxHeat2", | |
"Name": "AuxHeat2", | |
"Value": 0 | |
}, | |
{ | |
"Label": "CoolStagesAvailable", | |
"Name": "CoolStagesAvailable", | |
"Value": 2 | |
}, | |
{ | |
"Label": "HeatStagesAvailable", | |
"Name": "HeatStagesAvailable", | |
"Value": 2 | |
}, | |
{ | |
"Label": "AllUserAccess", | |
"Name": "AllUserAccess", | |
"Value": 0 | |
}, | |
{ | |
"Label": "ThermostatFirmwareVersion", | |
"Name": "ThermostatFirmwareVersion", | |
"Value": 0 | |
}, | |
{ | |
"Label": "ActiveAlertCount", | |
"Name": "ActiveAlertCount", | |
"Value": 0 | |
}, | |
{ | |
"Label": "ThermostatConnected", | |
"Name": "ThermostatConnected", | |
"Value": 1 | |
}, | |
{ | |
"Label": "ThermostatTime", | |
"Name": "ThermostatTime", | |
"Value": 1493218774 | |
} | |
], | |
"SecuritySettings": { | |
"PinCode": null, | |
"DetailsAccess": true, | |
"ProgramAccess": true, | |
"SaveAccess": false, | |
"VacationAccess": true | |
}, | |
"ThermostatSettings": { | |
"ZipCode": "M1V 5P7", | |
"HvacMode": 0, | |
"FanMinRuntime": 0, | |
"FanControlRequired": true, | |
"HeatRangeHigh": 24, | |
"HeatRangeLow": 10, | |
"CoolRangeHigh": 30, | |
"CoolRangeLow": 19, | |
"HeatCoolMinDelta": 2.2 | |
} | |
}, | |
"Label": "35-Tstat-Lobby-3", | |
"ParentAssetId": "eee5d245-f7f6-4d8d-91ed-2e6e019781d2", | |
"SelectedPoints": [ | |
"DetailsAccess", | |
"CoolingStatus", | |
"VacationAccess", | |
"EffectiveCoolingTemperature", | |
"ThermostatTime", | |
"CoolRangeHigh", | |
"RemoteSensor2Type", | |
"AutoAwayEnabled", | |
"ActualTemperature", | |
"HeatingStatus", | |
"CompCool2", | |
"HeatCoolMinDelta", | |
"ThermostatFirmwareVersion", | |
"AuxHeat1", | |
"FanStatus", | |
"AllUserAccess", | |
"ActualHumidity", | |
"FanControlRequired", | |
"HoldActive", | |
"CoolStagesAvailable", | |
"RemoteSensor1Type", | |
"SaveAccess", | |
"DesiredFanMode", | |
"HeatRangeHigh", | |
"CompCool1", | |
"ProgramAccess", | |
"RemoteSensor1Value", | |
"EffectiveHeatingTemperature", | |
"HeatStagesAvailable", | |
"HeatRangeLow", | |
"FanMinOnTime", | |
"HvacMode", | |
"ActiveAlertCount", | |
"Fan", | |
"ThermostatConnected", | |
"RemoteSensor2Value", | |
"AuxHeat2", | |
"CurrentClimateReference", | |
"CoolRangeLow" | |
], | |
"ClientId": "9232c8bf-d256-432f-b7ac-c22831943750", | |
"ConfigurationId": "0b389722-2fdc-4a3c-88f4-1207c28435a9" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Tests/examples of how to use: