UNPKG

hue-hacking-node

Version:

Utility to control Philips Hue light bulbs

602 lines 26.3 kB
"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