From 70dff1c6e2dc2b5dfb31449f8e445b331a1601bd Mon Sep 17 00:00:00 2001 From: Jon Maddox Date: Tue, 12 May 2015 01:22:59 -0400 Subject: [PATCH] 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;