hue-hacking-node
Version:
Utility to control Philips Hue light bulbs
602 lines • 26.3 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
var ava_1 = require("ava");
var hue_interfaces_js_1 = require("./hue-interfaces.js");
var hue_node_js_1 = require("./hue-node.js");
var TestConstants = require("./hue-test-constants.js");
var moxios = require("moxios");
var ip = 'localhost';
var key = 'testapp';
var baseURL = "http://".concat(ip, "/api/").concat(key);
var hue = null;
/**
* Return a string representing the state URI path to a specific indexed Hue lamp
* @param index Lamp index
*/
function lightStatePath(index) {
return "".concat(baseURL, "/lights/").concat(index, "/state");
}
/**
* Return a string representing the action URI path to a specific indexed Hue lamp group
* @param index Lamp group index
*/
function groupActionPath(index) {
return "".concat(baseURL, "/groups/").concat(index, "/action");
}
/**
* Return an object representing a successful axios/moxios PUT response from a remote server
* @param responsePayload Response body
*/
function successfulPut(responsePayload) {
return successfulRequest('PUT', responsePayload);
}
/**
* Return an object representing a successful axios/moxios GET response from a remote server
* @param responsePayload Response body
*/
function successfulGet(responsePayload) {
return successfulRequest('GET', responsePayload);
}
/**
* Return an object representing a successful axios/moxios response from a remote server
* @param requestMethod HTTP method (e.g. GET, PUT, etc.)
* @param responsePayload Response body
*/
function successfulRequest(requestMethod, responsePayload) {
return {
status: 200,
method: requestMethod,
response: responsePayload
};
}
ava_1.default.serial('init with retrieval', function (t) { return __awaiter(void 0, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
hue = new hue_node_js_1.Hue({
ip: ip,
key: key,
retrieveInitialState: true
});
moxios.install(hue.getHttp());
moxios.stubRequest("".concat(baseURL, "/lights/1"), {
status: 200,
response: {
state: {
bri: TestConstants.full_brightness
}
}
});
moxios.stubRequest("".concat(baseURL, "/lights/2"), {
status: 200,
response: {
state: {
bri: TestConstants.full_brightness
}
}
});
moxios.stubRequest("".concat(baseURL, "/lights/3"), {
status: 200,
response: {
state: {
bri: TestConstants.no_brightness
}
}
});
return [4 /*yield*/, hue.init()];
case 1:
_a.sent();
moxios.uninstall(hue.getHttp());
t.pass();
return [2 /*return*/];
}
});
}); });
ava_1.default.serial.beforeEach(function (_) { return __awaiter(void 0, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
hue = new hue_node_js_1.Hue({
ip: ip,
key: key,
retrieveInitialState: false
});
moxios.install(hue.getHttp());
moxios.install(hue_node_js_1.Hue.getHttp());
return [4 /*yield*/, hue.init()];
case 1:
_a.sent();
return [2 /*return*/];
}
});
}); });
ava_1.default.serial.afterEach(function (t) {
moxios.uninstall(hue.getHttp());
moxios.uninstall(hue_node_js_1.Hue.getHttp());
});
ava_1.default.serial('turnOnLamp1', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var response;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
moxios.stubRequest("".concat(baseURL, "/lights/1/state"), {
status: 200,
response: [{ success: { '/lights/1/state/on': true } }]
});
return [4 /*yield*/, hue.turnOn(1)];
case 1:
response = _a.sent();
t.deepEqual(response.changedStates[0], TestConstants.state_on(1));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('turnOffLamp1', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var response;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
moxios.stubRequest("".concat(baseURL, "/lights/1/state"), {
status: 200,
response: [{ success: { '/lights/1/state/on': false } }]
});
return [4 /*yield*/, hue.turnOff(1)];
case 1:
response = _a.sent();
t.deepEqual(response.changedStates[0], TestConstants.state_off(1));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('turnOffAll', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var response;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
moxios.stubRequest("".concat(baseURL, "/groups/0/action"), {
status: 200,
response: [{ success: { address: '/groups/0/action/on', value: false } }]
});
return [4 /*yield*/, hue.turnOffAll()];
case 1:
response = _a.sent();
t.deepEqual(response.acknowledgedActions[0], TestConstants.group_off(0));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('turnOnAll', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var response;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
moxios.stubRequest("".concat(baseURL, "/groups/0/action"), {
status: 200,
response: [{ success: { address: '/groups/0/action/on', value: true } }]
});
return [4 /*yield*/, hue.turnOnAll()];
case 1:
response = _a.sent();
t.deepEqual(response.acknowledgedActions[0], TestConstants.group_on(0));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('setCssColor', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var response;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
moxios.stubRequest("".concat(baseURL, "/lights/1/state"), {
status: 200,
response: [{ success: { '/lights/1/state/xy': TestConstants.color_red } }]
});
return [4 /*yield*/, hue.setColor(1, 'red')];
case 1:
response = _a.sent();
t.deepEqual(response.changedStates[0], TestConstants.color_red_response);
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('setCssColorAll', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var response;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
moxios.stubRequest("".concat(baseURL, "/groups/0/action"), {
status: 200,
response: TestConstants.color_white_response
});
return [4 /*yield*/, hue.setAllColors('white')];
case 1:
response = _a.sent();
t.deepEqual(response, new hue_interfaces_js_1.HueBridgeGroupActionResponse(TestConstants.color_white_response));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('testEmptyConfig', function (t) { return __awaiter(void 0, void 0, void 0, function () {
return __generator(this, function (_a) {
hue = new hue_node_js_1.Hue();
t.truthy(hue);
return [2 /*return*/];
});
}); });
ava_1.default.serial('getColors', function (t) {
t.truthy(hue.getColors());
});
ava_1.default.serial('setBrightness', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var responsePayload, setBriResponse, getBriResponse;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
responsePayload = [{ success: { '/lights/1/state/bri': 231 } }];
moxios.stubRequest("".concat(baseURL, "/lights/1/state"), {
status: 200,
response: responsePayload
});
return [4 /*yield*/, hue.setBrightness(1, 231)];
case 1:
setBriResponse = _a.sent();
t.deepEqual(setBriResponse, new hue_interfaces_js_1.HueBridgeStateChangeResponse(responsePayload));
moxios.stubRequest("".concat(baseURL, "/lights/1"), {
status: 200,
response: { state: { bri: 231 } }
});
return [4 /*yield*/, hue.getBrightness(1)];
case 2:
getBriResponse = _a.sent();
t.deepEqual(getBriResponse, 231);
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('setGroupBrightness', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var responsePayload, setBriResponse;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
responsePayload = [
{ success: { address: 'groups/1/action/bri', value: 231 } }
];
moxios.stubRequest("".concat(baseURL, "/groups/1/action"), {
status: 200,
response: responsePayload
});
return [4 /*yield*/, hue.setGroupBrightness(1, 231)];
case 1:
setBriResponse = _a.sent();
t.deepEqual(setBriResponse, new hue_interfaces_js_1.HueBridgeGroupActionResponse(responsePayload));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('setAllBrightness', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var responsePayload, setBriResponse;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
responsePayload = [
{ success: { address: 'groups/0/action/bri', value: 231 } }
];
moxios.stubRequest("".concat(baseURL, "/groups/0/action"), {
status: 200,
response: responsePayload
});
return [4 /*yield*/, hue.setAllBrightness(231)];
case 1:
setBriResponse = _a.sent();
t.deepEqual(setBriResponse, new hue_interfaces_js_1.HueBridgeGroupActionResponse(responsePayload));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('search', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var nupnpResponse, foundBridges;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nupnpResponse = [
{ id: '785d973935391ad0', internalipaddress: '192.168.x.x' }
];
moxios.stubRequest("https://discovery.meethue.com/", {
status: 200,
response: nupnpResponse
});
return [4 /*yield*/, hue_node_js_1.Hue.search()];
case 1:
foundBridges = _a.sent();
t.deepEqual(foundBridges, [new hue_interfaces_js_1.HueUPNPResponse(nupnpResponse[0])]);
t.is(foundBridges.length, 1);
t.is(foundBridges[0].internalipaddress, '192.168.x.x');
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('setColorTemperature', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var responsePayload, setCTResponse;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
responsePayload = [{ success: { '/lights/1/state/ct': 124 } }];
moxios.stubRequest("".concat(baseURL, "/lights/1/state"), {
status: 200,
response: responsePayload
});
return [4 /*yield*/, hue.setColorTemperature(1, 4000)];
case 1:
setCTResponse = _a.sent();
t.deepEqual(setCTResponse, new hue_interfaces_js_1.HueBridgeStateChangeResponse(responsePayload));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('brighten', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var responsePayload, brightenResponse;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
responsePayload = [{ success: { 'lights/1/state/bri': 254 } }];
moxios.stubRequest("".concat(baseURL, "/lights/1/state"), {
status: 200,
response: responsePayload
});
return [4 /*yield*/, hue.brighten(1, 10)];
case 1:
brightenResponse = _a.sent();
t.deepEqual(brightenResponse, new hue_interfaces_js_1.HueBridgeStateChangeResponse(responsePayload));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('brightenAll', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var responsePayload, groupFlashResponse;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
responsePayload = [
{ success: { address: 'groups/0/action/bri_inc', value: 10 } }
];
moxios.stubRequest(groupActionPath(0), successfulPut(responsePayload));
return [4 /*yield*/, hue.brightenAll(10)];
case 1:
groupFlashResponse = _a.sent();
t.deepEqual(groupFlashResponse, new hue_interfaces_js_1.HueBridgeGroupActionResponse(responsePayload));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('dim', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var responsePayload, dimResponse, dimResponseDefault;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
responsePayload = [{ success: { 'lights/1/state/bri_inc': -10 } }];
moxios.stubRequest(lightStatePath(1), successfulPut(responsePayload));
return [4 /*yield*/, hue.dim(1, 10)];
case 1:
dimResponse = _a.sent();
t.deepEqual(dimResponse, new hue_interfaces_js_1.HueBridgeStateChangeResponse(responsePayload));
moxios.stubRequest(lightStatePath(1), successfulPut(responsePayload));
return [4 /*yield*/, hue.dim(1)];
case 2:
dimResponseDefault = _a.sent();
t.deepEqual(dimResponseDefault, new hue_interfaces_js_1.HueBridgeStateChangeResponse(responsePayload));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('dimAll', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var responsePayload, groupFlashResponse;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
responsePayload = [
{ success: { address: 'groups/0/action/bri_inc', value: -10 } }
];
moxios.stubRequest(groupActionPath(0), successfulPut(responsePayload));
return [4 /*yield*/, hue.dimAll(10)];
case 1:
groupFlashResponse = _a.sent();
t.deepEqual(groupFlashResponse, new hue_interfaces_js_1.HueBridgeGroupActionResponse(responsePayload));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('flash', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var responsePayload, flashResponse;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
responsePayload = [{ success: { 'lights/1/state/alert': 'select' } }];
moxios.stubRequest(lightStatePath(1), successfulPut(responsePayload));
return [4 /*yield*/, hue.flash(1)];
case 1:
flashResponse = _a.sent();
t.deepEqual(flashResponse, new hue_interfaces_js_1.HueBridgeStateChangeResponse(responsePayload));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('flashAll', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var responsePayload, groupFlashResponse;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
responsePayload = [
{ success: { address: 'groups/0/action/alert', value: 'select' } }
];
moxios.stubRequest(groupActionPath(0), successfulPut(responsePayload));
return [4 /*yield*/, hue.flashAll()];
case 1:
groupFlashResponse = _a.sent();
t.deepEqual(groupFlashResponse, new hue_interfaces_js_1.HueBridgeGroupActionResponse(responsePayload));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('longFlash', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var responsePayload, flashResponse;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
responsePayload = [{ success: { 'lights/1/state/alert': 'lselect' } }];
moxios.stubRequest(lightStatePath(1), successfulPut(responsePayload));
return [4 /*yield*/, hue.longFlash(1)];
case 1:
flashResponse = _a.sent();
t.deepEqual(flashResponse, new hue_interfaces_js_1.HueBridgeStateChangeResponse(responsePayload));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('longFlashAll', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var responsePayload, groupFlashResponse;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
responsePayload = [
{ success: { address: 'groups/0/action/alert', value: 'lselect' } }
];
moxios.stubRequest(groupActionPath(0), successfulPut(responsePayload));
return [4 /*yield*/, hue.longFlashAll()];
case 1:
groupFlashResponse = _a.sent();
t.deepEqual(groupFlashResponse, new hue_interfaces_js_1.HueBridgeGroupActionResponse(responsePayload));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('startColorLoop', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var responsePayload, colorLoopResponse;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
responsePayload = [
{ success: { 'lights/1/state/effect': 'colorloop' } }
];
moxios.stubRequest(lightStatePath(1), successfulPut(responsePayload));
return [4 /*yield*/, hue.startColorLoop(1)];
case 1:
colorLoopResponse = _a.sent();
t.deepEqual(colorLoopResponse, new hue_interfaces_js_1.HueBridgeStateChangeResponse(responsePayload));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('stopEffect', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var responsePayload, stopEffectResponse;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
responsePayload = [
{ success: { 'lights/1/state/effect': 'none' } }
];
moxios.stubRequest(lightStatePath(1), successfulPut(responsePayload));
return [4 /*yield*/, hue.stopEffect(1)];
case 1:
stopEffectResponse = _a.sent();
t.deepEqual(stopEffectResponse, new hue_interfaces_js_1.HueBridgeStateChangeResponse(responsePayload));
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('setNumberOfLamps', function (t) {
var defaultNumLamps = hue.getNumberOfLamps();
t.is(defaultNumLamps, 3);
hue.setnumberOfLamps(2);
var updatedNumLamps = hue.getNumberOfLamps();
t.is(updatedNumLamps, 2);
});
ava_1.default.serial('setTransitionTime', function (t) {
var defaultTransitionTime = hue.getTransitionTime();
t.is(defaultTransitionTime, 400);
hue.setTransitionTime(150);
var updatedTransitionTime = hue.getTransitionTime();
t.is(updatedTransitionTime, 150);
});
ava_1.default.serial('getConfig', function (t) {
t.truthy(hue.getConfig());
});
ava_1.default.serial('getLamps', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var response;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
moxios.stubRequest("".concat(baseURL, "/lights"), successfulGet(TestConstants.lamp_response));
return [4 /*yield*/, hue.getLamps()];
case 1:
response = _a.sent();
t.deepEqual(response, TestConstants.lamps);
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('getLampStates', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var response, expected;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
moxios.stubRequest("".concat(baseURL, "/lights"), successfulGet(TestConstants.lamp_response));
return [4 /*yield*/, hue.getLampStates()];
case 1:
response = _a.sent();
expected = [TestConstants.lamp_response['1'].state];
t.deepEqual(response, expected);
return [2 /*return*/];
}
});
}); });
ava_1.default.serial('getLampState', function (t) { return __awaiter(void 0, void 0, void 0, function () {
var response, expected;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
moxios.stubRequest("".concat(baseURL, "/lights/1"), successfulGet(TestConstants.lamp_response['1']));
return [4 /*yield*/, hue.getLampState(1)];
case 1:
response = _a.sent();
expected = TestConstants.lamp_response['1'].state;
t.deepEqual(response, expected);
return [2 /*return*/];
}
});
}); });
//# sourceMappingURL=hue-node.spec.js.map