Beginning tag support enhancements

Generalized tag recognition, tags are now `Homebridge.*` instead of
`Homebridge:*`, initial attempt at `IsPrimary` but probably not working
right yet.
This commit is contained in:
S'pht'Kr
2015-10-07 05:38:24 +02:00
parent d04d417344
commit af79ea4fbf

View File

@@ -83,7 +83,20 @@ ZWayServerPlatform.prototype = {
return deferred.promise;
}
,
getTagValue: function(vdev, tagStem){
if(!(vdev.tags && vdev.tags.length > 0)) return false;
var tagStem = "Homebridge." + tagStem;
if(vdev.tags.indexOf(tagStem) >= 0) return true;
var tags = vdev.tags, l = tags.length, tag;
for(var i = 0; i < l; i++){
tag = tags[i];
if(tag.indexOf(tagStem + ":") === 0){
return tag.substr(tagStem.length + 1);
}
}
return false;
}
,
accessories: function(callback) {
debug("Fetching Z-Way devices...");
@@ -110,12 +123,24 @@ ZWayServerPlatform.prototype = {
var groupedDevices = {};
for(var i = 0; i < devices.length; i++){
var vdev = devices[i];
if(vdev.tags.indexOf("Homebridge:Skip") >= 0) { debug("Tag says skip!"); continue; }
if(this.opt_in && vdev.tags.indexOf("Homebridge:Include") < 0) continue;
if(this.getTagValue("Skip")) { debug("Tag says skip!"); continue; }
if(this.opt_in && !this.getTagValue(vdev, "Include")) continue;
var gdid = vdev.id.replace(/^(.*?)_zway_(\d+-\d+)-\d.*/, '$1_$2');
var gd = groupedDevices[gdid] || (groupedDevices[gdid] = {devices: [], types: {}, extras: {}, primary: undefined});
gd.devices.push(vdev);
var tk = ZWayServerPlatform.getVDevTypeKey(vdev);
// If this is explicitly set as primary, set it now...
if(this.getTagValue("IsPrimary")){
gd.primary = gd.devices.length - 1;
if(gd.types[tk] !== undefined){
// everybody out of the way!
gd.extras[tk] = gd.extras[tk] || [];
gd.extras[tk].push(gd.types[tk]);
}
gd.types[tk] = gd.primary;
}
if(gd.types[tk] === undefined){
gd.types[tk] = gd.devices.length - 1;
} else {
@@ -136,12 +161,17 @@ ZWayServerPlatform.prototype = {
}
var accessory = null;
for(var ti = 0; ti < primaryDeviceClasses.length; ti++){
if(gd.primary !== undefined){
var pd = gd.devices[gd.primary];
var name = pd.metrics && pd.metrics.title ? pd.metrics.title : pd.id;
accessory = new ZWayServerAccessory(name, gd, that);
}
else for(var ti = 0; ti < primaryDeviceClasses.length; ti++){
if(gd.types[primaryDeviceClasses[ti]] !== undefined){
gd.primary = gd.types[primaryDeviceClasses[ti]];
var pd = gd.devices[gd.primary];
var name = pd.metrics && pd.metrics.title ? pd.metrics.title : pd.id;
debug("Using primary device with type " + primaryDeviceClasses[ti] + ", " + name + " (" + pd.id + ") as primary.");
//debug("Using primary device with type " + primaryDeviceClasses[ti] + ", " + name + " (" + pd.id + ") as primary.");
accessory = new ZWayServerAccessory(name, gd, that);
break;
}
@@ -303,7 +333,11 @@ ZWayServerAccessory.prototype = {
services.push(new Service.Switch(vdev.metrics.title, vdev.id));
break;
case "switchMultilevel":
services.push(new Service.Lightbulb(vdev.metrics.title, vdev.id));
if(this.platform.getTagValue(vdev, "ServiceType") === "Switch"){
services.push(new Service.Switch(vdev.metrics.title, vdev.id));
} else {
services.push(new Service.Lightbulb(vdev.metrics.title, vdev.id));
}
break;
case "sensorBinary.Door/Window":
services.push(new Service.GarageDoorOpener(vdev.metrics.title, vdev.id));
@@ -778,7 +812,8 @@ ZWayServerAccessory.prototype = {
// Any extra switchMultilevels? Could be a RGBW+W bulb, add them as additional services...
if(this.devDesc.extras["switchMultilevel"]) for(var i = 0; i < this.devDesc.extras["switchMultilevel"].length; i++){
var xvdev = this.devDesc.devices[this.devDesc.extras["switchMultilevel"][i]];
services = services.concat(this.getVDevServices(xvdev));
var xservice = this.getVDevServices(xvdev);
services = services.concat(xservice);
}
if(this.platform.splitServices){