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; 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" } ] }