alexa-app-savant
Version:
alexa-app app for Savant automation systems
101 lines (95 loc) • 4.62 kB
JavaScript
const
savantLib = require('../lib/savantLib'),
didYouMean = require('didyoumean'),
action = require('../lib/actionLib'),
eventAnalytics = require('./eventAnalytics'),
_ = require('lodash'),
q = require('q');
function serviceMatcher(cleanZones,serviceIn){
var a = new eventAnalytics.event();
var defer = q.defer();
var serviceArray = [];
for (var key in cleanZones[0]){ //do each zone
var cleanZone = cleanZones[0][key];
var zoneServices = systemServices[cleanZone];
console.log("Trying to match service "+serviceIn+" in "+cleanZone);
//get index of service array for matched service
//map(create array of all zone alises), Didyoumean(compare request against array), findkey(match request to zone returning an index if matched)
var foundServiceAliasIndex = _.findKey(zoneServices, ["Alias", didYouMean(serviceIn, _.map(zoneServices, "Alias"))]);
var foundServiceComponentIndex = _.findKey(zoneServices, ["Source Component", didYouMean(serviceIn, _.map(zoneServices, "Source Component"))]);
// get service array if an index was found
if (foundServiceAliasIndex){ var foundService = zoneServices[foundServiceAliasIndex] }
if (foundServiceComponentIndex){ var foundService = zoneServices[foundServiceComponentIndex] }
//if we found a service save array into serviceObj
if (foundService){
serviceArray.push([foundService["Zone"],foundService["Source Component"],foundService["Source Logical Component"],foundService["Service Variant ID"],foundService["Service Type"],foundService["Alias"]]);
} else {
a.sendError("serviceMatcher Fail: "+serviceIn);
defer.reject('I didnt understand what service you wanted, please try again.');
return defer.promise;
}
}
var ret = {"serviceArray":serviceArray,"cleanZones":cleanZones}
//console.log("ret.serviceArray: "+ret.serviceArray)
//console.log("ret.cleanZones: "+ret.cleanZones)
defer.resolve(ret);
a.sendTime(["Matching","serviceMatcher"]);
return defer.promise
}
function activeServiceNameMatcher(serviceIn){
var a = new eventAnalytics.event();
var defer = q.defer();
var stateRequest = '';
var activeServicesArray = [];
var serviceName = didYouMean(serviceIn,appDictionaryServiceNameArray);
if (serviceName === null) {//we did not find a match in alias or profile names
a.sendError("activeServiceNameMatcher Fail: "+serviceIn);
defer.reject('I didnt understand what service you wanted, please try again.');
return defer.promise;
}
console.log('Trying to match request: '+serviceName);
for (var key in appDictionaryArray){//build ActiveService states
stateRequest = stateRequest.concat('"'+appDictionaryArray[key]+'.ActiveService'+'" ')
}
stateRequest = stateRequest.substring(1);
stateRequest = stateRequest.substring(0,stateRequest.length-2);
savantLib.readMultipleState(stateRequest, function (activeServices,stateIn){//get ActiveServies
//console.log('activeServices: '+activeServices);
for (var key in activeServices){//break services into array
activeServicesArray.push(activeServices[key].split("-"));
}
for (var key in activeServicesArray){
var zone = activeServicesArray[key][0];
var zoneServices = systemServices[zone];
for (var key2 in zoneServices){
//console.log("zoneServices[key2][Alias]: "+zoneServices[key2]["Alias"])
//console.log("zoneServices[key2][Source Component]: "+zoneServices[key2]["Source Component"])
//console.log("serviceName: "+serviceName);
if (
(zoneServices[key2]["Alias"] === serviceName && zoneServices[key2]["Source Component"] === activeServicesArray[key][1]) ||
(zoneServices[key2]["Source Component"] === serviceName && zoneServices[key2]["Source Component"] === activeServicesArray[key][1])
){
console.log('Found requested active service in : '+zoneServices[key2]["Zone"]);
if (!cleanZones){
var cleanZones= [[],[]];
}
cleanZones[0].push(zone);
cleanZones[1].push(zone);
}
}
}
if (!cleanZones){//we did not match an active service
a.sendError(["activeServiceNameMatcher Match not active: "+serviceName]);
defer.reject(serviceName +' is not active anywhere');
return defer.promise;
}else{// we matched an active service, return cleanZones
defer.resolve(cleanZones);
}
});
a.sendTime(["Matching","activeServiceNameMatcher"]);
return defer.promise;
}
module.exports = {
serviceMatcher:serviceMatcher,
activeServiceNameMatcher:activeServiceNameMatcher
}