From 82cbd9fece981fe2c1302efe8514e4e4574b5840 Mon Sep 17 00:00:00 2001 From: Jon Maddox Date: Tue, 12 May 2015 01:22:55 -0400 Subject: [PATCH 1/4] include wink-js node package --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 1b91205..5d27054 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "carwingsjs": "0.0.x", "sonos": "0.8.x", - "wemo": "0.2.x" + "wemo": "0.2.x", + "wink-js": "0.0.5" } } From 70dff1c6e2dc2b5dfb31449f8e445b331a1601bd Mon Sep 17 00:00:00 2001 From: Jon Maddox Date: Tue, 12 May 2015 01:22:59 -0400 Subject: [PATCH 2/4] add Wink accessory shim --- accessories/Wink.js | 187 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 accessories/Wink.js diff --git a/accessories/Wink.js b/accessories/Wink.js new file mode 100644 index 0000000..0c60dda --- /dev/null +++ b/accessories/Wink.js @@ -0,0 +1,187 @@ +var types = require("../lib/HAP-NodeJS/accessories/types.js"); +var wink = require('wink-js'); + +function WinkAccessory(log, config) { + this.log = log; + + // auth info + this.client_id = config["client_id"]; + this.client_secret = config["client_secret"]; + this.username = config["username"]; + this.password = config["password"]; + + // device info + this.name = config["name"]; + this.device = null; + + this.log("Searching for Wink device with exact name '" + this.name + "'..."); + this.search(); +} + +WinkAccessory.prototype = { + + search: function() { + var that = this; + + wink.init({ + "client_id": this.client_id, + "client_secret": this.client_secret, + "username": this.username, + "password": this.password + }, function(auth_return) { + if ( auth_return === undefined ) { + that.log("There was a problem authenticating with Wink."); + } else { + // success + wink.user().device(that.name, function(device) { + that.device = device + }); + } + }); + + }, + + setPowerState: function(powerOn) { + if (!this.device) { + this.log("No '"+this.name+"' device found (yet?)"); + return; + } + + var that = this; + + if (powerOn) { + this.log("Setting power state on the '"+this.name+"' to on"); + this.device.power.on(function(response) { + if (response === undefined) { + that.log("Error setting power state on the '"+that.name+"'") + } else { + that.log("Successfully set power state on the '"+that.name+"' to on"); + } + }); + }else{ + this.log("Setting power state on the '"+this.name+"' to off"); + this.device.power.off(function(response) { + if (response === undefined) { + that.log("Error setting power state on the '"+that.name+"'") + } else { + that.log("Successfully set power state on the '"+that.name+"' to off"); + } + }); + } + + }, + + setBrightness: function(level) { + if (!this.device) { + this.log("No '"+this.name+"' device found (yet?)"); + return; + } + + var that = this; + + this.log("Setting brightness on the '"+this.name+"' to on"); + this.device.brightness(level, function(response) { + if (response === undefined) { + that.log("Error setting brightness on the '"+that.name+"'") + } else { + that.log("Successfully set brightness on the '"+that.name+"' to " + level); + } + }); + }, + + getServices: function() { + var that = this; + return [{ + sType: types.ACCESSORY_INFORMATION_STYPE, + characteristics: [{ + cType: types.NAME_CTYPE, + onUpdate: null, + perms: ["pr"], + format: "string", + initialValue: this.name, + supportEvents: false, + supportBonjour: false, + manfDescription: "Name of the accessory", + designedMaxLength: 255 + },{ + cType: types.MANUFACTURER_CTYPE, + onUpdate: null, + perms: ["pr"], + format: "string", + initialValue: "Wink", + supportEvents: false, + supportBonjour: false, + manfDescription: "Manufacturer", + designedMaxLength: 255 + },{ + cType: types.MODEL_CTYPE, + onUpdate: null, + perms: ["pr"], + format: "string", + initialValue: "Rev-1", + supportEvents: false, + supportBonjour: false, + manfDescription: "Model", + designedMaxLength: 255 + },{ + cType: types.SERIAL_NUMBER_CTYPE, + onUpdate: null, + perms: ["pr"], + format: "string", + initialValue: "A1S2NASF88EW", + supportEvents: false, + supportBonjour: false, + manfDescription: "SN", + designedMaxLength: 255 + },{ + cType: types.IDENTIFY_CTYPE, + onUpdate: null, + perms: ["pw"], + format: "bool", + initialValue: false, + supportEvents: false, + supportBonjour: false, + manfDescription: "Identify Accessory", + designedMaxLength: 1 + }] + },{ + sType: types.LIGHTBULB_STYPE, + characteristics: [{ + cType: types.NAME_CTYPE, + onUpdate: null, + perms: ["pr"], + format: "string", + initialValue: this.name, + supportEvents: true, + supportBonjour: false, + manfDescription: "Name of service", + designedMaxLength: 255 + },{ + cType: types.POWER_STATE_CTYPE, + onUpdate: function(value) { that.setPowerState(value); }, + perms: ["pw","pr","ev"], + format: "bool", + initialValue: 0, + supportEvents: true, + supportBonjour: false, + manfDescription: "Change the power state of the Bulb", + designedMaxLength: 1 + },{ + cType: types.BRIGHTNESS_CTYPE, + onUpdate: function(value) { that.setBrightness(value); }, + perms: ["pw","pr","ev"], + format: "int", + initialValue: 0, + supportEvents: true, + supportBonjour: false, + manfDescription: "Adjust Brightness of Light", + designedMinValue: 0, + designedMaxValue: 100, + designedMinStep: 1, + unit: "%" + }] + }]; + } +}; + +module.exports.accessory = WinkAccessory; From 05cce9c34c38f4c812403b5c2f20dd47693d2857 Mon Sep 17 00:00:00 2001 From: Jon Maddox Date: Tue, 12 May 2015 01:23:11 -0400 Subject: [PATCH 3/4] add Wink accessory sample --- config-sample.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/config-sample.json b/config-sample.json index ef9d467..0b9ca0f 100644 --- a/config-sample.json +++ b/config-sample.json @@ -58,6 +58,15 @@ "device_id": "E1", "protocol": "pl", "can_dim": true + }, + { + "accessory": "Wink", + "client_id": "YOUR_WINK_API_CLIENT_ID", + "client_secret": "YOUR_WINK_API_CLIENT_SECRET", + "username": "your@email.com", + "password": "WINK_PASSWORD", + "name": "Family Room Lamp", + "description": "Lamp on the left side of the room" } ] } From 5584c73f9490d66a295c29cfd4e6da6626b1388e Mon Sep 17 00:00:00 2001 From: Jon Maddox Date: Tue, 12 May 2015 01:27:04 -0400 Subject: [PATCH 4/4] add Wink to the README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cb57da9..b48fc08 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Since Siri supports devices added through HomeKit, this means that with HomeBrid * _Siri, turn off the Speakers._ ([Sonos](http://www.sonos.com)) * _Siri, turn on the Dehumidifier._ ([WeMo](http://www.belkin.com/us/Products/home-automation/c/wemo-home-automation/)) * _Siri, turn on Away Mode._ ([Xfinity Home](http://www.comcast.com/home-security.html)) - * _Siri, turn on the living room lights._ ([X10 via rest-mochad](http://github.com/edc1591/rest-mochad)) + * _Siri, turn on the living room lights._ ([X10 via rest-mochad](http://github.com/edc1591/rest-mochad) or [Wink via wink-js](https://github.com/winfinit/wink-js)) If you would like to support any other devices, please write a shim and create a pull request and I'd be happy to add it to this official list.