Skip to content

Instantly share code, notes, and snippets.

@chiensiTB
Last active June 2, 2017 05:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chiensiTB/12ee0948319d0de3359553ef7971e080 to your computer and use it in GitHub Desktop.
Save chiensiTB/12ee0948319d0de3359553ef7971e080 to your computer and use it in GitHub Desktop.
ecobeeSi Connector Conversions to EM.Core
//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"
}
@chiensiTB
Copy link
Author

Tests/examples of how to use:

var emConnector = require('path to this file on your project dir')

let uiobject = emConnector.ecobeeSiUIConvert(emConnector.sampleEMcoreEcobee);
  console.log(JSON.stringify(uiobject));
  let finalobject = emConnector.ecobeeSiEMConvert(emConnector.sampleEMcoreEcobee, uiobject, "Celsius");
  console.log(JSON.stringify(finalobject));

  //convert mykola's object to a UI object that James can read
  let uiSchedules = emConnector.ecobeeSiUIConvertSch_fromModal(emConnector.mykolaWeeklyEcobee);
  console.log(uiSchedules);

  let uiVacations = emConnector.ecobeeSiUIConvertVac_fromModal(emConnector.mykolaEcobeeVacations);
  console.log(uiVacations);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment