mirror of
https://github.com/mtan93/homebridge.git
synced 2026-05-14 14:18:53 +01:00
Use WIP version of HAP-NodeJS refactor
This commit is contained in:
+1
-1
@@ -68,7 +68,7 @@ WeMoAccessory.prototype = {
|
|||||||
if (!err) {
|
if (!err) {
|
||||||
var binaryState = parseInt(result)
|
var binaryState = parseInt(result)
|
||||||
that.log("power state for " + that.wemoName + " is: " + binaryState)
|
that.log("power state for " + that.wemoName + " is: " + binaryState)
|
||||||
callback(binaryState)
|
callback(binaryState > 0 ? 1 : 0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
that.log(err)
|
that.log(err)
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
var storage = require('node-persist');
|
var storage = require('node-persist');
|
||||||
var crypto = require('crypto');
|
var uuid = require('HAP-NodeJS').uuid;
|
||||||
|
var Bridge = require('HAP-NodeJS').Bridge;
|
||||||
|
var Accessory = require('HAP-NodeJS').Accessory;
|
||||||
|
var accessoryLoader = require('HAP-NodeJS').AccessoryLoader;
|
||||||
|
|
||||||
console.log("Starting HomeBridge server...");
|
console.log("Starting HomeBridge server...");
|
||||||
|
|
||||||
@@ -15,23 +18,34 @@ if (!fs.existsSync(configPath)) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Initialize persistent storage
|
// Initialize persistent storage
|
||||||
storage.initSync();
|
//storage.initSync();
|
||||||
|
|
||||||
|
// Start by creating our Bridge which will host all loaded Accessories
|
||||||
|
var bridge = new Bridge('HomeBridge', uuid.generate("HomeBridge"));
|
||||||
|
|
||||||
// Load up the configuration file
|
// Load up the configuration file
|
||||||
var config = JSON.parse(fs.readFileSync(configPath));
|
var config = JSON.parse(fs.readFileSync(configPath));
|
||||||
|
|
||||||
// Just to prevent them getting garbage collected
|
// keep track of async calls we're waiting for callbacks on before we can start up
|
||||||
var accessories = [];
|
var asyncCalls = 0;
|
||||||
|
|
||||||
function startup() {
|
function startup() {
|
||||||
if (config.platforms) loadPlatforms();
|
// if (config.platforms) loadPlatforms();
|
||||||
if (config.accessories) loadAccessories();
|
if (config.accessories) loadAccessories();
|
||||||
|
|
||||||
|
bridge.publish({
|
||||||
|
username: "CC:22:3D:E3:CE:27",
|
||||||
|
port: 51826,
|
||||||
|
pincode: "031-45-154",
|
||||||
|
category: Accessory.Categories.OTHER
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadAccessories() {
|
function loadAccessories() {
|
||||||
|
|
||||||
// Instantiate all accessories in the config
|
// Instantiate all accessories in the config
|
||||||
console.log("Loading " + config.accessories.length + " accessories...");
|
console.log("Loading " + config.accessories.length + " accessories...");
|
||||||
|
|
||||||
for (var i=0; i<config.accessories.length; i++) {
|
for (var i=0; i<config.accessories.length; i++) {
|
||||||
|
|
||||||
var accessoryConfig = config.accessories[i];
|
var accessoryConfig = config.accessories[i];
|
||||||
@@ -46,15 +60,21 @@ function loadAccessories() {
|
|||||||
var log = function(name) { return function(s) { console.log("[" + name + "] " + s); }; }(name);
|
var log = function(name) { return function(s) { console.log("[" + name + "] " + s); }; }(name);
|
||||||
|
|
||||||
log("Initializing " + accessoryName + " accessory...");
|
log("Initializing " + accessoryName + " accessory...");
|
||||||
var accessory = new accessoryConstructor(log, accessoryConfig);
|
|
||||||
accessories.push(accessory);
|
var accessoryInstance = new accessoryConstructor(log, accessoryConfig);
|
||||||
|
|
||||||
// Extract the raw "services" for this accessory which is a big array of objects describing the various
|
// Extract the raw "services" for this accessory which is a big array of objects describing the various
|
||||||
// hooks in and out of HomeKit for the HAP-NodeJS server.
|
// hooks in and out of HomeKit for the HAP-NodeJS server.
|
||||||
var services = accessory.getServices();
|
var services = accessoryInstance.getServices();
|
||||||
|
|
||||||
// Create the HAP server for this accessory
|
// Create the actual HAP-NodeJS "Accessory" instance
|
||||||
createHAPServer(name, services, accessory.transportCategory);
|
var accessory = accessoryLoader.parseAccessoryJSON({
|
||||||
|
displayName: name,
|
||||||
|
services: services
|
||||||
|
});
|
||||||
|
|
||||||
|
// add it to the bridge
|
||||||
|
bridge.addBridgedAccessory(accessory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,94 +116,4 @@ function loadPlatforms() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Creates the actual HAP servers which listen on different sockets
|
|
||||||
//
|
|
||||||
|
|
||||||
// Pull in required HAP-NodeJS stuff
|
|
||||||
var accessory_Factor = new require("HAP-NodeJS/Accessory.js");
|
|
||||||
var accessoryController_Factor = new require("HAP-NodeJS/AccessoryController.js");
|
|
||||||
var service_Factor = new require("HAP-NodeJS/Service.js");
|
|
||||||
var characteristic_Factor = new require("HAP-NodeJS/Characteristic.js");
|
|
||||||
|
|
||||||
// Each accessory has its own little server. We'll need to allocate some ports for these servers
|
|
||||||
var nextPort = 51826;
|
|
||||||
var nextServer = 0;
|
|
||||||
var accessoryServers = [];
|
|
||||||
var accessoryControllers = [];
|
|
||||||
var usernames = {};
|
|
||||||
|
|
||||||
function createHAPServer(name, services, transportCategory) {
|
|
||||||
var accessoryController = new accessoryController_Factor.AccessoryController();
|
|
||||||
|
|
||||||
//loop through services
|
|
||||||
for (var j = 0; j < services.length; j++) {
|
|
||||||
var service = new service_Factor.Service(services[j].sType);
|
|
||||||
|
|
||||||
//loop through characteristics
|
|
||||||
for (var k = 0; k < services[j].characteristics.length; k++) {
|
|
||||||
var options = {
|
|
||||||
onRead: services[j].characteristics[k].onRead,
|
|
||||||
onRegister: services[j].characteristics[k].onRegister,
|
|
||||||
type: services[j].characteristics[k].cType,
|
|
||||||
perms: services[j].characteristics[k].perms,
|
|
||||||
format: services[j].characteristics[k].format,
|
|
||||||
initialValue: services[j].characteristics[k].initialValue,
|
|
||||||
supportEvents: services[j].characteristics[k].supportEvents,
|
|
||||||
supportBonjour: services[j].characteristics[k].supportBonjour,
|
|
||||||
manfDescription: services[j].characteristics[k].manfDescription,
|
|
||||||
designedMaxLength: services[j].characteristics[k].designedMaxLength,
|
|
||||||
designedMinValue: services[j].characteristics[k].designedMinValue,
|
|
||||||
designedMaxValue: services[j].characteristics[k].designedMaxValue,
|
|
||||||
designedMinStep: services[j].characteristics[k].designedMinStep,
|
|
||||||
unit: services[j].characteristics[k].unit
|
|
||||||
};
|
|
||||||
|
|
||||||
var characteristic = new characteristic_Factor.Characteristic(options, services[j].characteristics[k].onUpdate);
|
|
||||||
|
|
||||||
service.addCharacteristic(characteristic);
|
|
||||||
}
|
|
||||||
accessoryController.addService(service);
|
|
||||||
}
|
|
||||||
|
|
||||||
// create a unique "username" for this accessory based on the default display name
|
|
||||||
var username = createUsername(name);
|
|
||||||
|
|
||||||
if (usernames[username]) {
|
|
||||||
console.log("Cannot create another accessory with the same name '" + name + "'. The 'name' property must be unique for each accessory.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// remember that we used this name already
|
|
||||||
usernames[username] = name;
|
|
||||||
|
|
||||||
// increment ports for each accessory
|
|
||||||
nextPort = nextPort + (nextServer*2);
|
|
||||||
|
|
||||||
// hardcode the PIN to something random (same PIN as HAP-NodeJS sample accessories)
|
|
||||||
var pincode = "031-45-154";
|
|
||||||
|
|
||||||
var accessory = new accessory_Factor.Accessory(name, username, storage, parseInt(nextPort), pincode, accessoryController, transportCategory);
|
|
||||||
accessoryServers[nextServer] = accessory;
|
|
||||||
accessoryControllers[nextServer] = accessoryController;
|
|
||||||
accessory.publishAccessory();
|
|
||||||
|
|
||||||
nextServer++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Creates a unique "username" for HomeKit from a hash of the given string
|
|
||||||
function createUsername(str) {
|
|
||||||
|
|
||||||
// Hash str into something like "098F6BCD4621D373CADE4E832627B4F6"
|
|
||||||
var hash = crypto.createHash('md5').update(str).digest("hex").toUpperCase();
|
|
||||||
|
|
||||||
// Turn it into a MAC-address-looking "username" for HomeKit
|
|
||||||
return hash[0] + hash[1] + ":" +
|
|
||||||
hash[2] + hash[3] + ":" +
|
|
||||||
hash[4] + hash[5] + ":" +
|
|
||||||
hash[6] + hash[7] + ":" +
|
|
||||||
hash[8] + hash[9] + ":" +
|
|
||||||
hash[10] + hash[11];
|
|
||||||
}
|
|
||||||
|
|
||||||
startup();
|
startup();
|
||||||
|
|||||||
+1
-1
@@ -14,7 +14,7 @@
|
|||||||
"ad2usb": "git+https://github.com/alistairg/node-ad2usb.git#local",
|
"ad2usb": "git+https://github.com/alistairg/node-ad2usb.git#local",
|
||||||
"carwingsjs": "0.0.x",
|
"carwingsjs": "0.0.x",
|
||||||
"elkington": "kevinohara80/elkington",
|
"elkington": "kevinohara80/elkington",
|
||||||
"hap-nodejs": "git+https://github.com/khaost/HAP-NodeJS#2a1bc8d99a2009317ab5da93faebea34c89f197c",
|
"hap-nodejs": "git+https://github.com/nfarina/HAP-NodeJS#aaa5770488d698d777e7d7706909c3afa888b031",
|
||||||
"harmonyhubjs-client": "^1.1.4",
|
"harmonyhubjs-client": "^1.1.4",
|
||||||
"harmonyhubjs-discover": "git+https://github.com/swissmanu/harmonyhubjs-discover.git",
|
"harmonyhubjs-discover": "git+https://github.com/swissmanu/harmonyhubjs-discover.git",
|
||||||
"mdns": "^2.2.4",
|
"mdns": "^2.2.4",
|
||||||
|
|||||||
Reference in New Issue
Block a user