diff --git a/lib/api.js b/lib/api.js index d2aa1b3..41aea23 100644 --- a/lib/api.js +++ b/lib/api.js @@ -85,6 +85,18 @@ API.prototype.registerAccessory = function(pluginName, accessoryName, constructo } } +API.prototype.publishCameraAccessories = function(pluginName, accessories) { + for (var index in accessories) { + var accessory = accessories[index]; + if (!(accessory instanceof PlatformAccessory)) { + throw new Error(pluginName + " attempt to register an accessory that isn\'t PlatformAccessory!"); + } + accessory._associatedPlugin = pluginName; + } + + this.emit('publishCameraAccessories', accessories); +} + API.prototype.platform = function(name) { // if you passed the "short form" name like "Lockitron" instead of "homebridge-lockitron.Lockitron", diff --git a/lib/platformAccessory.js b/lib/platformAccessory.js index 1680823..0084c69 100644 --- a/lib/platformAccessory.js +++ b/lib/platformAccessory.js @@ -130,6 +130,14 @@ PlatformAccessory.prototype.updateReachability = function(reachable) { } } +PlatformAccessory.prototype.configureCameraSource = function(cameraSource) { + this.cameraSource = cameraSource; + for (var index in cameraSource.services) { + var service = cameraSource.services[index]; + this.addService(service); + } +} + PlatformAccessory.prototype._prepareAssociatedHAPAccessory = function () { this._associatedHAPAccessory = new Accessory(this.displayName, this.UUID); this._associatedHAPAccessory._sideloadServices(this.services); diff --git a/lib/server.js b/lib/server.js index 2bf84c1..2e3013f 100644 --- a/lib/server.js +++ b/lib/server.js @@ -15,6 +15,7 @@ var PlatformAccessory = require("./platformAccessory").PlatformAccessory; var BridgeSetupManager = require("./bridgeSetupManager").BridgeSetupManager; var log = require("./logger")._system; var Logger = require('./logger').Logger; +var mac = require("./util/mac"); 'use strict'; @@ -40,6 +41,10 @@ function Server(insecureAccess) { this._handleUnregisterPlatformAccessories(accessories); }.bind(this)); + this._api.on('publishCameraAccessories', function(accessories) { + this._handlePublishCameraAccessories(accessories); + }.bind(this)); + this._plugins = this._loadPlugins(); // plugins[name] = Plugin instance this._config = this._loadConfig(); this._cachedPlatformAccessories = this._loadCachedPlatformAccessories(); @@ -97,14 +102,16 @@ Server.prototype._publish = function() { info.setCharacteristic(Characteristic.SerialNumber, bridgeConfig.serialNumber); this._printPin(bridgeConfig.pin); + + this._bridge.on('listening', function(port) { + log.info("Homebridge is running on port %s.", port); + }); + this._bridge.publish({ username: bridgeConfig.username || "CC:22:3D:E3:CE:30", - port: bridgeConfig.port || 51826, pincode: bridgeConfig.pin || "031-45-154", category: Accessory.Categories.BRIDGE }, this._allowInsecureAccess); - - log.info("Homebridge is running on port %s.", bridgeConfig.port || 51826); } Server.prototype._loadPlugins = function(accessories, platforms) { @@ -165,7 +172,6 @@ Server.prototype._loadConfig = function() { config.bridge = { "name": "Homebridge", "username": "CC:22:3D:E3:CE:30", - "port": 51826, "pin": "031-45-154" }; @@ -454,6 +460,21 @@ Server.prototype._handleUnregisterPlatformAccessories = function(accessories) { this._updateCachedAccessories(); } +Server.prototype._handlePublishCameraAccessories = function(accessories) { + for (var index in accessories) { + var accessory = accessories[index]; + + accessory._prepareAssociatedHAPAccessory(); + var hapAccessory = accessory._associatedHAPAccessory; + + hapAccessory.publish({ + username: mac.generate(accessory.uuid), + pincode: bridgeConfig.pin || "031-45-154", + category: accessory.category + }, this._allowInsecureAccess); + } +} + Server.prototype._updateCachedAccessories = function() { var serializedAccessories = []; diff --git a/lib/util/mac.js b/lib/util/mac.js new file mode 100644 index 0000000..89eee74 --- /dev/null +++ b/lib/util/mac.js @@ -0,0 +1,18 @@ +var crypto = require('crypto'); + +'use strict'; + +module.exports = { + generate: generate +} + +function generate(data) { + var sha1sum = crypto.createHash('sha1'); + sha1sum.update(data); + var s = sha1sum.digest('hex'); + var i = -1; + return 'xx:xx:xx:xx:xx:xx'.replace(/[x]/g, function(c) { + i += 1; + return s[i]; + }).toUpperCase(); +}; \ No newline at end of file diff --git a/package.json b/package.json index 4c7b2ef..154e1fe 100644 --- a/package.json +++ b/package.json @@ -20,13 +20,13 @@ "homebridge": "bin/homebridge" }, "engines": { - "node": ">=0.12.0" + "node": ">=4.3.2" }, "preferGlobal": true, "dependencies": { "chalk": "^1.1.1", "commander": "2.8.1", - "hap-nodejs": "0.4.0", + "hap-nodejs": "0.4.4", "semver": "5.0.3", "node-persist": "^0.0.8" }