Files
homebridge/lib/bridgeSetupManager.js

96 lines
3.0 KiB
JavaScript

var inherits = require('util').inherits;
var EventEmitter = require('events').EventEmitter;
var Service = require("hap-nodejs").Service;
var Characteristic = require("hap-nodejs").Characteristic;
var SetupSession = require("./bridgeSetupSession").SetupSession;
'use strict';
module.exports = {
BridgeSetupManager: BridgeSetupManager
}
function BridgeSetupManager() {
this.session;
this.service = new Service(null, "49FB9D4D-0FEA-4BF1-8FA6-E7B18AB86DCE");
this.stateCharacteristic = new Characteristic("State", "77474A2F-FA98-485E-97BE-4762458774D8", {
format: Characteristic.Formats.UINT8,
minValue: 0,
maxValue: 1,
minStep: 1,
perms: [Characteristic.Perms.READ, Characteristic.Perms.NOTIFY]
});
this.stateCharacteristic.value = 0;
this.service.addCharacteristic(this.stateCharacteristic);
this.versionCharacteristic = new Characteristic("Version", "FD9FE4CC-D06F-4FFE-96C6-595D464E1026", {
format: Characteristic.Formats.STRING,
perms: [Characteristic.Perms.READ, Characteristic.Perms.NOTIFY]
});
this.versionCharacteristic.value = "1.0";
this.service.addCharacteristic(this.versionCharacteristic);
this.controlPointCharacteristic = new Characteristic("Control Point", "5819A4C2-E1B0-4C9D-B761-3EB1AFF43073", {
format: Characteristic.Formats.DATA,
perms: [Characteristic.Perms.READ, Characteristic.Perms.WRITE, Characteristic.Perms.NOTIFY]
})
this.controlPointCharacteristic.on('get', function(callback, context) {
this.handleReadRequest(callback, context);
}.bind(this));
this.controlPointCharacteristic.on('set', function(newValue, callback, context) {
this.handleWriteRequest(newValue, callback, context);
}.bind(this));
this.controlPointCharacteristic.value = null;
this.service.addCharacteristic(this.controlPointCharacteristic);
}
inherits(BridgeSetupManager, EventEmitter);
BridgeSetupManager.prototype.handleReadRequest = function(callback, context) {
if (!context) {
return;
}
if (!this.session) {
callback(null, null);
} else {
this.session.handleReadRequest(callback);
}
}
BridgeSetupManager.prototype.handleWriteRequest = function(value, callback, context) {
if (!context) {
callback();
return;
}
var data = new Buffer(value, 'base64');
var request = JSON.parse(data.toString());
callback();
if (!this.session || this.session.sessionUUID !== request.sid) {
if (this.session) {
this.session.removeAllListeners();
this.session.validSession = false;
}
this.session = new SetupSession(this.stateCharacteristic, this.controlPointCharacteristic);
this.session.configurablePlatformPlugins = this.configurablePlatformPlugins;
this.session.on('newConfig', function(type, name, replace, config) {
this.emit('newConfig', type, name, replace, config);
}.bind(this));
this.session.on('requestCurrentConfig', function(callback) {
this.emit('requestCurrentConfig', callback);
}.bind(this));
this.session.on('end', function() {
this.session = null;
}.bind(this));
}
this.session.handleWriteRequest(request);
}