From 8eb464766f4ae2fb7b4d3e6985ec5d780cf32df1 Mon Sep 17 00:00:00 2001 From: Jon Maddox Date: Fri, 12 Jun 2015 11:43:03 -0400 Subject: [PATCH 1/2] add a shim for http requests --- accessories/Http.js | 160 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 accessories/Http.js diff --git a/accessories/Http.js b/accessories/Http.js new file mode 100644 index 0000000..bca9cfa --- /dev/null +++ b/accessories/Http.js @@ -0,0 +1,160 @@ +var types = require("../lib/HAP-NodeJS/accessories/types.js"); +var request = require("request"); + +function HttpAccessory(log, config) { + this.log = log; + + // url info + this.on_url = config["on_url"]; + this.off_url = config["off_url"]; + this.brightness_url = config["brightness_url"]; + this.http_method = config["http_method"]; + + // device info + this.name = config["name"]; +} + +HttpAccessory.prototype = { + + httpRequest: function(url, method, callback) { + request({ + url: url, + method: method + }, + function (error, response, body) { + callback(error, response, body) + }) + }, + + setPowerState: function(powerOn) { + var url; + + if (powerOn) { + url = this.on_url + this.log("Setting power state on the '"+this.name+"' to on"); + }else{ + url = this.off_url + this.log("Setting power state on the '"+this.name+"' to off"); + } + + this.httpRequest(url, this.http_method, function(error, response, body){ + if (error) { + return console.error('http power function failed:', error); + }else{ + return console.log('http power function succeeded!'); + } + }); + + }, + + setBrightness: function(level) { + var url = this.brightness_url.replace("%b", level) + + this.log("Setting brightness on the '"+this.name+"' to " + level); + + this.httpRequest(url, this.http_method, function(error, response, body){ + if (error) { + return console.error('http brightness function failed:', error); + }else{ + return console.log('http brightness function succeeded!'); + } + }); + + }, + + 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: "Http", + 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", + 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", + designedMinValue: 0, + designedMaxValue: 100, + designedMinStep: 1, + unit: "%" + }] + }]; + } +}; + +module.exports.accessory = HttpAccessory; From 7321276121f052e5fd4b7a433f7f047169108432 Mon Sep 17 00:00:00 2001 From: Jon Maddox Date: Fri, 12 Jun 2015 11:43:13 -0400 Subject: [PATCH 2/2] example HTTP accessory --- config-sample.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config-sample.json b/config-sample.json index a9cc9ec..7ff4ddc 100644 --- a/config-sample.json +++ b/config-sample.json @@ -81,6 +81,14 @@ "device_id": "E1", "protocol": "pl", "can_dim": true + }, + { + "accessory": "Http", + "name": "Kitchen Lamp", + "on_url": "https://192.168.1.22:3030/devices/23222/on", + "off_url": "https://192.168.1.22:3030/devices/23222/off", + "brightness_url": "https://192.168.1.22:3030/devices/23222/brightness/%b", + "http_method": "POST" } ] }