-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrobohome.js
executable file
·129 lines (105 loc) · 3.58 KB
/
robohome.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
var https = require("https");
var querystring = require("querystring");
var ROBOHOME_WEB_HOSTNAME = "robohome.xyz";
const DISCOVERY = "Alexa.ConnectedHome.Discovery";
const CONTROL = "Alexa.ConnectedHome.Control";
const PAYLOAD_VERSION = "2";
exports.handler = function(event, context) {
var namespace = event.header.namespace;
switch (namespace) {
case DISCOVERY:
handleDiscovery(event, context);
break;
case CONTROL:
handleControl(event, context);
break;
default:
context.fail("Unsupported namespace: " + namespace);
break;
}
};
function handleDiscovery(event, context) {
var requestName = event.header.name;
var messageId = event.header.messageId;
var accessToken = event.payload.accessToken;
log("Request Name", requestName);
log("Message ID", messageId);
log("Access Token", accessToken);
createApiEndpointRequest("/api/devices", "GET", "", messageId, accessToken, context);
}
function handleControl(event, context) {
var requestName = event.header.name;
var messageId = event.header.messageId;
var applianceId = event.payload.appliance.applianceId;
var accessToken = event.payload.accessToken;
log("Request Name", requestName);
log("Message ID", messageId);
log("Appliance ID", applianceId);
log("Access Token", accessToken);
var postData = querystring.stringify({
"id": applianceId
});
if (event.header.namespace === CONTROL) {
if (requestName === "TurnOnRequest") {
createApiEndpointRequest("/api/devices/turnon", "POST", postData, messageId, accessToken, context);
}
else if (requestName === "TurnOffRequest") {
createApiEndpointRequest("/api/devices/turnoff", "POST", postData, messageId, accessToken, context);
}
}
else {
context.fail(generateControlError(requestName, "UNSUPPORTED_OPERATION", "Unrecognized operation"));
}
}
function createApiEndpointRequest(endpoint, verb, postData, messageId, accessToken, context) {
var options = {
hostname: ROBOHOME_WEB_HOSTNAME,
port: 443,
path: endpoint,
method: verb,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"Authorization": "Bearer " + accessToken,
"Message-Id": messageId
}
};
var callback = function(response) {
var str = "";
response.on("data", function(chunk) {
str += chunk.toString("utf-8");
});
response.on("end", function() {
context.succeed(JSON.parse(str));
});
response.on("error", serverError);
};
var request = https.request(options, callback);
request.on("error", serverError);
request.write(postData);
request.end();
}
function log(title, msg) {
console.log(title + ": " + msg);
}
var serverError = function (e) {
log("Error", e.message);
context.fail(generateControlError(requestName, "DEPENDENT_SERVICE_UNAVAILABLE", "Unable to connect to server"));
};
function generateControlError(name, code, description) {
var headers = {
namespace: CONTROL,
name: name,
payloadVersion: PAYLOAD_VERSION
};
var payload = {
exception: {
code: code,
description: description
}
};
var result = {
header: headers,
payload: payload
};
return result;
}