-
Notifications
You must be signed in to change notification settings - Fork 1
/
harmony_tools.js
109 lines (106 loc) · 5.55 KB
/
harmony_tools.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/**
* @fileoverview Collection of functions that deal with connecting to Harmony Hubs
* @author Donald Elrod
* @version 1.0.0
*/
var harmony = require('harmonyhubjs-client');
var HarmonyDevice = require('./Devices/HarmonyDevice');
/**
* Collection of functions that deal with connecting to Harmony Hubs
* @exports harmony_tools
*/
module.exports = {
/**
* Processes Harmony Hubs during program setup, this function will connect to all
* Harmony hubs in the modules file and add the devices they control to both the modules object and the devices array
* @param {Object} modules modules object from the main script, will store harmony functions in it
* @param {Object[]} devices devices array from the main script, will add harmony devices to the array
* @param {Object} type the Harmony object loaded from the modules.json file (this is obtained during the initial forEach loop in the processModules function in server.js)
*/
processHarmonyHubs: function(modules, devices, type) {
modules.harmony = {};
modules.harmony.devices = [];
modules.harmony.hubs = [];
type.details.forEach( (harmonyHost, hi) => {
var hubInd = hi;
harmony(harmonyHost.host).then(function(hub) {
hub.hubName = harmonyHost.hubName;
modules.harmony.hubs.push(hub);
//console.log(modules.harmony.hubs[hubInd]);
//modules.harmony.hubs[hubInd].name = harmonyHost.hubName;
/*modules.harmony.hubs[hubInd]*/
hub.getAvailableCommands().then(function(rawCommands) {
var tempHarmonyDevice;
var harmonyDevices = []; //what will be set to modules.harmony.devices
rawCommands.device.forEach(function(rawDevice) {
tempHarmonyDevice = {
name: rawDevice.label,
deviceID: devices.length,
deviceProto: 'HarmonyDevice',
deviceKind: 'Harmony - ' + rawDevice.type,
deviceType: rawDevice.type,
ip: "",
pollable: false,
groups: ["harmony"],
controlPort: rawDevice.ControlPort,
manufacturer: rawDevice.manufacturer,
harmonyProfile: rawDevice.deviceProfileUri,
deviceModel: rawDevice.model,
isManualPower: rawDevice.isManualPower,
controlGroups: [],
lastState: false,
belongsToHub: harmonyHost.hubName,
hubInd: hubInd
};
rawDevice.controlGroup.forEach(function(cg) {
tempCG = {
name: cg.name,
controls: []
};
cg.function.forEach(function(ctrl) {
tempCG.controls.push({
name: ctrl.name,
command: ctrl.action,
formattedCommand: ctrl.action.replace(/\:/g, '::')
});
});
tempHarmonyDevice.controlGroups.push(tempCG);
});
harmonyDevices.push(tempHarmonyDevice);
var inDevices = false;
devices.forEach(function(d) {
if (d.name === tempHarmonyDevice.name)
inDevices = true;
});
//only push to devices if the device is new, so harmony devices can be
//stored and further customized in the program
//devices are saved to devices.json after being added once
if (!inDevices) {
let newHarmonyDevice = new HarmonyDevice(tempHarmonyDevice, hub);
devices.push(newHarmonyDevice);
}
});
harmonyDevices.forEach(function (harmDev) {
modules.harmony.devices.push(harmDev);
});
});
//hubInd++;
}).catch( (err) => {
console.log(err);
console.log("unable to connect to harmony hub");
});
console.log('Harmony Hub connected successfully');
});
},
/**
* Sends the formatted command to the connected Harmony Hub
* @param {Object} modules modules object from server.js
* @param {string} formattedCommand Harmony-specific command string, tells the hub what button to emulate
*/
sendHarmonyCommand: function(modules, formattedCommand, hubName) {
var hub = modules.harmony.hubs.filter(h => {
return h.hubName === hubName;
}).pop();//[hubInd];
hub.send('holdAction', 'action=' + formattedCommand + ':status=press');
}
};