Skip to content

Instantly share code, notes, and snippets.

@chiensiTB
Last active December 6, 2018 18:46
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/d82e5a5dd9e0085ac19deb8ed6d92ef5 to your computer and use it in GitHub Desktop.
Save chiensiTB/d82e5a5dd9e0085ac19deb8ed6d92ef5 to your computer and use it in GitHub Desktop.
weMoConnector to and from EM.core
//support
//constants
// const timeslices = [
// "12:00am",
// "12:15am",
// "12:30am",
// "12:45am",
// "1:00am",
// "1:15am",
// "1:30am",
// "1:45am",
// "2:00am",
// "2:15am",
// "2:30am",
// "2:45am",
// "3:00am",
// "3:15am",
// "3:30am",
// "3:45am",
// "4:00am",
// "4:15am",
// "4:30am",
// "4:45am",
// "5:00am",
// "5:15am",
// "5:30am",
// "5:45am",
// "6:00am",
// "6:15am",
// "6:30am",
// "6:45am",
// "7:00am",
// "7:15am",
// "7:30am",
// "7:45am",
// "8:00am",
// "8:15am",
// "8:30am",
// "8:45am",
// "9:00am",
// "9:15am",
// "9:30am",
// "9:45am",
// "10:00am",
// "10:15am",
// "10:30am",
// "10:45am",
// "11:00am",
// "11:15am",
// "11:30am",
// "11:45am",
// "12:00pm",
// "12:15am",
// "12:30pm",
// "12:45am",
// "1:00pm",
// "1:15pm",
// "1:30pm",
// "1:45pm",
// "2:00pm",
// "2:15pm",
// "2:30pm",
// "2:45pm",
// "3:00pm",
// "3:15pm",
// "3:30pm",
// "3:45pm",
// "4:00pm",
// "4:15pm",
// "4:30pm",
// "4:45pm",
// "5:00pm",
// "5:15pm",
// "5:30pm",
// "5:45pm",
// "6:00pm",
// "6:15pm",
// "6:30pm",
// "6:45pm",
// "7:00pm",
// "7:15pm",
// "7:30pm",
// "7:45pm",
// "8:00pm",
// "8:15pm",
// "8:30pm",
// "8:45pm",
// "9:00pm",
// "9:15pm",
// "9:30pm",
// "9:45pm",
// "10:00pm",
// "10:15pm",
// "10:30pm",
// "10:45pm",
// "11:00pm",
// "11:15pm",
// "11:30pm",
// "11:45pm"
// ];
const days = {
"mon": 0,
"tue": 1,
"wed": 2,
"thu": 3,
"fri": 4,
"sat": 5,
"sun": 6
};
var excludeUnoccupied = true
//from UI to EMCore**************************
exports.wemoEMConvert = function(original, ui)
{
let finalObject = original;
finalObject.Device.Schedule = convertSchedulesEmCore(ui.schedules, original.Device.Schedule)
finalObject.Device.OverrideTime = ui.overrideTimeLimit;
return finalObject;
}
function convertSchedulesEmCore(uischedules, originalschedules)
{
let finalObject = {}
for(let day of Object.keys(days))
{
finalObject[day] = [];
for(let t = 0; t < uischedules[day].length; t++)
{
let startstop = [];
let t1 = "01-01-1969"+"T"+convertToEMTimestamp(uischedules[day][t].start);
let t2 = "01-01-1969"+"T"+convertToEMTimestamp(uischedules[day][t].end);
startstop.push(t1);
startstop.push(t2);
finalObject[day].push(startstop);
}
}
// for(let day in uischedules)
// {
// //console.log(day)
// let originalday = originalschedules[day];
// if()
// if(originalday.length > 0)
// {
// finalObject[day] = []
// let date1 = originalday[0][0].split("T")[0];
// let date2 = originalday[0][1].split("T")[0];
// //console.log(date1, date2);
// for(let t = 0; t < uischedules[day].length; t++)
// {
// //implies that all days will have the same date
// let startstop = [];
// let t1 = date1+"T"+convertToEMTimestamp(uischedules[day][t].start);
// let t2 = date2+"T"+convertToEMTimestamp(uischedules[day][t].end);
// startstop.push(t1);
// startstop.push(t2);
// finalObject[day].push(startstop);
// }
// }
// else
// {
// finalObject[day] = [];
// }
// }
return finalObject;
}
function convertToEMTimestamp(uidaytimestamp)
{
let origlength = uidaytimestamp.length - 2;
let timeperiod = uidaytimestamp.slice(origlength)
let time = uidaytimestamp.slice(0,origlength);
if(timeperiod == "am")
{
var t = time.split(":");
var hr = parseInt(t[0]);
var min = t[1];
if(hr < 10)
{
let emtime = "0"+hr.toString()+":"+min+":00Z";
return emtime;
}
else
{
let emtime = hr.toString() + ":" + min + ":00Z"
return emtime;
}
}
else
{
var t = time.split(":");
var hr = parseInt(t[0]);
var min = t[1];
var hr = hr == 12 ? hr : hr + 12;
let emtime = hr.toString() + ":" + min + ":00Z"
return emtime;
}
}
//end from UI to EMCore **************************
//from EMCore to UI **************************
exports.wemoUIConvert = function(emcore)
{
let uiObject = {};
uiObject.customEvents = []
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
}
exports.convertWemoSchedulesUI = function(emcore)
{
//console.log("starting wemo em to ui conversion");
let uiObject = {}
uiObject.schedules = convertSchedulesUI(emcore.Device.Schedule);
uiObject.overrideTimeLimit = emcore.Device.OverrideTime
return uiObject;
}
function convertSchedulesUI(schedules)
{
let weeklySchedules = getOccupiedPeriods(schedules)
return weeklySchedules;
}
function getOccupiedPeriods(schedules) {
let weeklySchedule = {
mon: [],
tue: [],
wed: [],
thu: [],
fri: [],
sat: [],
sun: []
};
for(let v in schedules)
{
let emsched = schedules[v];
let uiArray = []
for(let i = 0; i < schedules[v].length; i++)
{
let period = {}
period.start = cleanTime(schedules[v][i][0]);
period.end = cleanTime(schedules[v][i][1]);
uiArray.push(period);
}
weeklySchedule[v] = uiArray;
}
return weeklySchedule;
}
function cleanTime(emcorestring)
{
let uistring = emcorestring.split("T");
uistring = uistring[1];
let hr = parseInt(uistring.slice(0,2));
if(hr>=12)
{
let min = uistring.slice(3,5);
let pmhr = hr == 12 ? 12 : hr - 12;
uistring = pmhr.toString()+":"+min+"pm"
}
else
{
if(hr<10)
{
uistring = uistring.slice(1,5)+"am"
}
else
{
uistring = uistring.slice(0,5)+"am"
}
}
return uistring
}
//placeholder when this functionality becomes available
function convertVacationsUI(vacations)
{
}
function byProp(prop,name)
{
return function(el)
{
return el[prop] == name;
}
}
// end convert to UI ***********************
//modal transformations
//end modal transformations
//modal test objects
//EM core test object
exports.sampleEMcoreWeMo = {
"Device": {
"Name": "Lightswitch-1_0-221624K13006E3",
"Path": "/downstream/DSA-Markham-6003-MarkhamRd&EdwardJeffreysAve/downstream/WeMo_LightSwitch/Lightswitch-1_0-221624K13006E3",
"ParentBroker": "DSA-Markham-6003-MarkhamRd&EdwardJeffreysAve",
"Brokers": {},
"Devices": {},
"Links": {},
"Points": [
{
"Label": "stateValue",
"Name": "stateValue",
"Value": 1
},
{
"Label": "firmwareVersion",
"Name": "firmwareVersion",
"Value": 20010062
},
{
"Label": "signalStrength",
"Name": "signalStrength",
"Value": 76
},
{
"Label": "deviceConnectionStatus",
"Name": "deviceConnectionStatus",
"Value": 1
}
],
"Schedule": "{\"mon\":[[\"2017-04-14T08:30:00Z\",\"2017-04-14T18:00:00Z\"]],\"tue\":[[\"2017-04-14T08:30:00Z\",\"2017-04-14T18:00:00Z\"]],\"wed\":[[\"2017-04-14T08:30:00Z\",\"2017-04-14T21:00:00Z\"]],\"thu\":[[\"2017-04-14T08:30:00Z\",\"2017-04-14T21:00:00Z\"]],\"fri\":[[\"2017-04-14T08:30:00Z\",\"2017-04-14T19:00:00Z\"]],\"sat\":[[\"2017-04-14T08:00:00Z\",\"2017-04-14T17:00:00Z\"]],\"sun\":[]}",
"OverrideTime": "60"
},
"Label": "6003-LightSwitch-Lobby-3",
"DeviceAssetId": "92088dd7-7d26-4de6-af5a-f9c46e8ed744",
"ParentAssetId": "16ca64f3-72b5-4aad-b1e0-1e0fd6b99255",
"SelectedPoints": [
"signalStrength",
"stateValue",
"deviceConnectionStatus"
],
"ClientId": "7094899a-0791-4ae4-8c24-937a659970b1",
"ConfigurationId": "a4a1662c-a07a-488c-9557-7de1d62e5f05"
}
exports.sampleEMcoreWeMo_clean = {
"Device": {
"Name": "Lightswitch-1_0-221624K13006E3",
"Path": "/downstream/DSA-Markham-6003-MarkhamRd&EdwardJeffreysAve/downstream/WeMo_LightSwitch/Lightswitch-1_0-221624K13006E3",
"ParentBroker": "DSA-Markham-6003-MarkhamRd&EdwardJeffreysAve",
"Brokers": {},
"Devices": {},
"Links": {},
"Points": [
{
"Label": "stateValue",
"Name": "stateValue",
"Value": 1
},
{
"Label": "firmwareVersion",
"Name": "firmwareVersion",
"Value": 20010062
},
{
"Label": "signalStrength",
"Name": "signalStrength",
"Value": 76
},
{
"Label": "deviceConnectionStatus",
"Name": "deviceConnectionStatus",
"Value": 1
}
],
"Schedule": {"mon":[["2017-04-10T08:30:00Z","2017-04-10T18:00:00Z"]],"tue":[["2017-04-11T08:30:00Z","2017-04-11T18:00:00Z"]],"wed":[["2017-04-12T08:30:00Z","2017-04-12T21:00:00Z"]],"thu":[["2017-04-13T08:30:00Z","2017-04-13T21:00:00Z"]],"fri":[["2017-04-14T08:30:00Z","2017-04-14T19:00:00Z"]],"sat":[["2017-04-15T08:00:00Z","2017-04-15T17:00:00Z"]],"sun":[]},
"OverrideTime": "60"
},
"Label": "6003-LightSwitch-Lobby-3",
"DeviceAssetId": "92088dd7-7d26-4de6-af5a-f9c46e8ed744",
"ParentAssetId": "16ca64f3-72b5-4aad-b1e0-1e0fd6b99255",
"SelectedPoints": [
"signalStrength",
"stateValue",
"deviceConnectionStatus"
],
"ClientId": "7094899a-0791-4ae4-8c24-937a659970b1",
"ConfigurationId": "a4a1662c-a07a-488c-9557-7de1d62e5f05"
}
exports.sampleEMcoreWeMo_clean2 = {
"Device": {
"Name": "Lightswitch-1_0-221624K13006E3",
"Path": "/downstream/DSA-Markham-6003-MarkhamRd&EdwardJeffreysAve/downstream/WeMo_LightSwitch/Lightswitch-1_0-221624K13006E3",
"ParentBroker": "DSA-Markham-6003-MarkhamRd&EdwardJeffreysAve",
"Brokers": {},
"Devices": {},
"Links": {},
"Points": [
{
"Label": "stateValue",
"Name": "stateValue",
"Value": 1
},
{
"Label": "firmwareVersion",
"Name": "firmwareVersion",
"Value": 20010062
},
{
"Label": "signalStrength",
"Name": "signalStrength",
"Value": 76
},
{
"Label": "deviceConnectionStatus",
"Name": "deviceConnectionStatus",
"Value": 1
}
],
"Schedule": {"mon":[["2017-04-10T08:45:00Z","2017-04-10T18:15:00Z"]],"tue":[["2017-04-11T08:30:00Z","2017-04-12T00:00:00Z"]],"wed":[["2017-04-12T08:30:00Z","2017-04-12T21:45:00Z"]],"thu":[["2017-04-13T08:30:00Z","2017-04-13T21:30:00Z"]],"fri":[["2017-04-14T08:30:00Z","2017-04-14T19:00:00Z"]],"sat":[["2017-04-15T08:00:00Z","2017-04-15T17:00:00Z"]],"sun":[]},
"OverrideTime": "60"
},
"Label": "6003-LightSwitch-Lobby-3",
"DeviceAssetId": "92088dd7-7d26-4de6-af5a-f9c46e8ed744",
"ParentAssetId": "16ca64f3-72b5-4aad-b1e0-1e0fd6b99255",
"SelectedPoints": [
"signalStrength",
"stateValue",
"deviceConnectionStatus"
],
"ClientId": "7094899a-0791-4ae4-8c24-937a659970b1",
"ConfigurationId": "a4a1662c-a07a-488c-9557-7de1d62e5f05"
}
exports.sampleUIChange_clean3 = {
"schedules":{
"mon":[{"start":"10:00am","end":"1:30pm"},{"start":"2:00pm","end":"4:30pm"}],
"tue":[{"start":"10:00am","end":"9:30pm"}],
"wed":[{"start":"10:00am","end":"12:30pm"},{"start":"2:00pm","end":"4:30pm"}],
"thu":[{"start":"10:00am","end":"12:30pm"},{"start":"2:00pm","end":"4:30pm"}],
"fri":[{"start":"10:00am","end":"12:30pm"},{"start":"2:00pm","end":"4:30pm"}],"sat":[],"sun":[]},
"overrideTimeLimit":"5"
}
exports.sampleEMcoreWeMo_clean3 = {
"Device": {
"Name": "Lightswitch-1_0-221624K130154D",
"Path": "/downstream/DSA-NYC-0000-EMOffice/downstream/WeMo_LightSwitch/Lightswitch-1_0-221624K130154D",
"ParentBroker": "DSA-NYC-0000-EMOffice",
"Brokers": {},
"Devices": {},
"Links": {},
"Points": [
{
"Label": "stateValue",
"Name": "stateValue",
"Value": 1
},
{
"Label": "firmwareVersion",
"Name": "firmwareVersion",
"Value": 20010062
},
{
"Label": "signalStrength",
"Name": "signalStrength",
"Value": 73
},
{
"Label": "deviceConnectionStatus",
"Name": "deviceConnectionStatus",
"Value": 1
}
],
"Schedule": {
"mon": [
[
"2017-06-05T10:00:00Z",
"2017-06-05T12:30:00Z"
],
[
"2017-06-05T14:00:00Z",
"2017-06-05T16:30:00Z"
]
],
"tue": [
[
"2017-06-05T10:00:00Z",
"2017-06-05T12:30:00Z"
],
[
"2017-06-05T14:00:00Z",
"2017-06-05T16:30:00Z"
]
],
"wed": [
[
"2017-06-05T10:00:00Z",
"2017-06-05T12:30:00Z"
],
[
"2017-06-05T14:00:00Z",
"2017-06-05T16:30:00Z"
]
],
"thu": [
[
"2017-06-05T10:00:00Z",
"2017-06-05T12:30:00Z"
],
[
"2017-06-05T14:00:00Z",
"2017-06-05T16:30:00Z"
]
],
"fri": [],
"sat": [],
"sun": []
},
"OverrideTime": "5"
},
"Label": "0000-LightswitchEM-Office",
"DeviceAssetId": "6418ad13-20d4-4262-979d-0e70e70ddd38",
"ParentAssetId": "f784fbaa-82af-499e-bb9d-1a5997501a61",
"SelectedPoints": [
"deviceConnectionStatus",
"signalStrength",
"stateValue"
],
"ClientId": "7094899a-0791-4ae4-8c24-937a659970b1",
"ConfigurationId": "ae0ae57e-83fc-4294-b405-a2ff23c625a4"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment