homebridge-smartthings-oauth 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.devcontainer/Dockerfile +16 -0
- package/.devcontainer/devcontainer.json +36 -0
- package/LICENSE +176 -0
- package/README.md +114 -0
- package/config.schema.json +134 -0
- package/dist/auth/auth.d.ts +23 -0
- package/dist/auth/auth.d.ts.map +1 -0
- package/dist/auth/auth.js +168 -0
- package/dist/auth/auth.js.map +1 -0
- package/dist/auth/tokenManager.d.ts +36 -0
- package/dist/auth/tokenManager.d.ts.map +1 -0
- package/dist/auth/tokenManager.js +180 -0
- package/dist/auth/tokenManager.js.map +1 -0
- package/dist/basePlatformAccessory.d.ts +49 -0
- package/dist/basePlatformAccessory.d.ts.map +1 -0
- package/dist/basePlatformAccessory.js +209 -0
- package/dist/basePlatformAccessory.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/keyValues.d.ts +4 -0
- package/dist/keyValues.d.ts.map +1 -0
- package/dist/keyValues.js +12 -0
- package/dist/keyValues.js.map +1 -0
- package/dist/multiServiceAccessory.d.ts +60 -0
- package/dist/multiServiceAccessory.d.ts.map +1 -0
- package/dist/multiServiceAccessory.js +398 -0
- package/dist/multiServiceAccessory.js.map +1 -0
- package/dist/platform.d.ts +42 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +302 -0
- package/dist/platform.js.map +1 -0
- package/dist/services/airConditionerService.d.ts +52 -0
- package/dist/services/airConditionerService.d.ts.map +1 -0
- package/dist/services/airConditionerService.js +438 -0
- package/dist/services/airConditionerService.js.map +1 -0
- package/dist/services/baseService.d.ts +21 -0
- package/dist/services/baseService.d.ts.map +1 -0
- package/dist/services/baseService.js +63 -0
- package/dist/services/baseService.js.map +1 -0
- package/dist/services/batteryService.d.ts +10 -0
- package/dist/services/batteryService.d.ts.map +1 -0
- package/dist/services/batteryService.js +71 -0
- package/dist/services/batteryService.js.map +1 -0
- package/dist/services/carbonMonoxideDetector.d.ts +11 -0
- package/dist/services/carbonMonoxideDetector.d.ts.map +1 -0
- package/dist/services/carbonMonoxideDetector.js +28 -0
- package/dist/services/carbonMonoxideDetector.js.map +1 -0
- package/dist/services/contactSensorService.d.ts +10 -0
- package/dist/services/contactSensorService.d.ts.map +1 -0
- package/dist/services/contactSensorService.js +28 -0
- package/dist/services/contactSensorService.js.map +1 -0
- package/dist/services/doorService.d.ts +16 -0
- package/dist/services/doorService.d.ts.map +1 -0
- package/dist/services/doorService.js +138 -0
- package/dist/services/doorService.js.map +1 -0
- package/dist/services/fanSpeedService.d.ts +15 -0
- package/dist/services/fanSpeedService.d.ts.map +1 -0
- package/dist/services/fanSpeedService.js +153 -0
- package/dist/services/fanSpeedService.js.map +1 -0
- package/dist/services/fanSwitchLevelService.d.ts +14 -0
- package/dist/services/fanSwitchLevelService.d.ts.map +1 -0
- package/dist/services/fanSwitchLevelService.js +121 -0
- package/dist/services/fanSwitchLevelService.js.map +1 -0
- package/dist/services/humidityService.d.ts +10 -0
- package/dist/services/humidityService.d.ts.map +1 -0
- package/dist/services/humidityService.js +23 -0
- package/dist/services/humidityService.js.map +1 -0
- package/dist/services/leakDetector.d.ts +10 -0
- package/dist/services/leakDetector.d.ts.map +1 -0
- package/dist/services/leakDetector.js +27 -0
- package/dist/services/leakDetector.js.map +1 -0
- package/dist/services/lightSensorService.d.ts +10 -0
- package/dist/services/lightSensorService.d.ts.map +1 -0
- package/dist/services/lightSensorService.js +24 -0
- package/dist/services/lightSensorService.js.map +1 -0
- package/dist/services/lightService.d.ts +26 -0
- package/dist/services/lightService.d.ts.map +1 -0
- package/dist/services/lightService.js +340 -0
- package/dist/services/lightService.js.map +1 -0
- package/dist/services/lockService.d.ts +16 -0
- package/dist/services/lockService.d.ts.map +1 -0
- package/dist/services/lockService.js +128 -0
- package/dist/services/lockService.js.map +1 -0
- package/dist/services/motionService.d.ts +10 -0
- package/dist/services/motionService.d.ts.map +1 -0
- package/dist/services/motionService.js +23 -0
- package/dist/services/motionService.js.map +1 -0
- package/dist/services/occupancySensorService.d.ts +10 -0
- package/dist/services/occupancySensorService.d.ts.map +1 -0
- package/dist/services/occupancySensorService.js +23 -0
- package/dist/services/occupancySensorService.js.map +1 -0
- package/dist/services/sensorService.d.ts +15 -0
- package/dist/services/sensorService.d.ts.map +1 -0
- package/dist/services/sensorService.js +69 -0
- package/dist/services/sensorService.js.map +1 -0
- package/dist/services/smartThingsCommand.d.ts +7 -0
- package/dist/services/smartThingsCommand.d.ts.map +1 -0
- package/dist/services/smartThingsCommand.js +12 -0
- package/dist/services/smartThingsCommand.js.map +1 -0
- package/dist/services/smokeDetector.d.ts +10 -0
- package/dist/services/smokeDetector.d.ts.map +1 -0
- package/dist/services/smokeDetector.js +27 -0
- package/dist/services/smokeDetector.js.map +1 -0
- package/dist/services/statelessProgrammableSwitchService.d.ts +12 -0
- package/dist/services/statelessProgrammableSwitchService.d.ts.map +1 -0
- package/dist/services/statelessProgrammableSwitchService.js +94 -0
- package/dist/services/statelessProgrammableSwitchService.js.map +1 -0
- package/dist/services/switchService.d.ts +12 -0
- package/dist/services/switchService.d.ts.map +1 -0
- package/dist/services/switchService.js +72 -0
- package/dist/services/switchService.js.map +1 -0
- package/dist/services/temperatureService.d.ts +11 -0
- package/dist/services/temperatureService.d.ts.map +1 -0
- package/dist/services/temperatureService.js +32 -0
- package/dist/services/temperatureService.js.map +1 -0
- package/dist/services/thermostatService.d.ts +22 -0
- package/dist/services/thermostatService.d.ts.map +1 -0
- package/dist/services/thermostatService.js +273 -0
- package/dist/services/thermostatService.js.map +1 -0
- package/dist/services/valveService.d.ts +12 -0
- package/dist/services/valveService.d.ts.map +1 -0
- package/dist/services/valveService.js +59 -0
- package/dist/services/valveService.js.map +1 -0
- package/dist/services/windowCoveringService.d.ts +36 -0
- package/dist/services/windowCoveringService.d.ts.map +1 -0
- package/dist/services/windowCoveringService.js +158 -0
- package/dist/services/windowCoveringService.js.map +1 -0
- package/dist/settings.d.ts +9 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +12 -0
- package/dist/settings.js.map +1 -0
- package/dist/webhook/subscriptionHandler.d.ts +32 -0
- package/dist/webhook/subscriptionHandler.d.ts.map +1 -0
- package/dist/webhook/subscriptionHandler.js +68 -0
- package/dist/webhook/subscriptionHandler.js.map +1 -0
- package/dist/webhook/webhookServer.d.ts +19 -0
- package/dist/webhook/webhookServer.d.ts.map +1 -0
- package/dist/webhook/webhookServer.js +125 -0
- package/dist/webhook/webhookServer.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MultiServiceAccessory = void 0;
|
|
4
|
+
// import { BasePlatformAccessory } from './basePlatformAccessory';
|
|
5
|
+
const motionService_1 = require("./services/motionService");
|
|
6
|
+
const batteryService_1 = require("./services/batteryService");
|
|
7
|
+
const temperatureService_1 = require("./services/temperatureService");
|
|
8
|
+
const humidityService_1 = require("./services/humidityService");
|
|
9
|
+
const lightSensorService_1 = require("./services/lightSensorService");
|
|
10
|
+
const contactSensorService_1 = require("./services/contactSensorService");
|
|
11
|
+
const lockService_1 = require("./services/lockService");
|
|
12
|
+
const doorService_1 = require("./services/doorService");
|
|
13
|
+
const switchService_1 = require("./services/switchService");
|
|
14
|
+
const lightService_1 = require("./services/lightService");
|
|
15
|
+
const fanSwitchLevelService_1 = require("./services/fanSwitchLevelService");
|
|
16
|
+
const occupancySensorService_1 = require("./services/occupancySensorService");
|
|
17
|
+
const leakDetector_1 = require("./services/leakDetector");
|
|
18
|
+
const smokeDetector_1 = require("./services/smokeDetector");
|
|
19
|
+
const carbonMonoxideDetector_1 = require("./services/carbonMonoxideDetector");
|
|
20
|
+
const valveService_1 = require("./services/valveService");
|
|
21
|
+
const fanSpeedService_1 = require("./services/fanSpeedService");
|
|
22
|
+
const windowCoveringService_1 = require("./services/windowCoveringService");
|
|
23
|
+
const thermostatService_1 = require("./services/thermostatService");
|
|
24
|
+
const statelessProgrammableSwitchService_1 = require("./services/statelessProgrammableSwitchService");
|
|
25
|
+
const airConditionerService_1 = require("./services/airConditionerService");
|
|
26
|
+
const smartThingsCommand_1 = require("./services/smartThingsCommand");
|
|
27
|
+
// type DeviceStatus = {
|
|
28
|
+
// timestamp: number;
|
|
29
|
+
// //status: Record<string, unknown>;
|
|
30
|
+
// status: any;
|
|
31
|
+
// };
|
|
32
|
+
/**
|
|
33
|
+
* Platform Accessory
|
|
34
|
+
* An instance of this class is created for each accessory your platform registers
|
|
35
|
+
* Each accessory may expose multiple services of different service types.
|
|
36
|
+
*/
|
|
37
|
+
// export class MultiServiceAccessory extends BasePlatformAccessory {
|
|
38
|
+
class MultiServiceAccessory {
|
|
39
|
+
get id() {
|
|
40
|
+
return this.accessory.UUID;
|
|
41
|
+
}
|
|
42
|
+
constructor(platform, accessory) {
|
|
43
|
+
// service: Service;
|
|
44
|
+
//capabilities;
|
|
45
|
+
this.components = [];
|
|
46
|
+
/**
|
|
47
|
+
* These are just used to create a working example
|
|
48
|
+
* You should implement your own code to track the state of your accessory
|
|
49
|
+
*/
|
|
50
|
+
this.services = [];
|
|
51
|
+
this.online = true;
|
|
52
|
+
//protected deviceStatus: DeviceStatus = { timestamp: 0, status: undefined };
|
|
53
|
+
this.deviceStatusTimestamp = 0;
|
|
54
|
+
this.failureCount = 0;
|
|
55
|
+
this.giveUpTime = 0;
|
|
56
|
+
this.commandInProgress = false;
|
|
57
|
+
this.lastCommandCompleted = 0;
|
|
58
|
+
this.statusQueryInProgress = false;
|
|
59
|
+
this.lastStatusResult = true;
|
|
60
|
+
this.accessory = accessory;
|
|
61
|
+
this.platform = platform;
|
|
62
|
+
this.name = accessory.context.device.label;
|
|
63
|
+
this.log = platform.log;
|
|
64
|
+
this.baseURL = platform.config.BaseURL;
|
|
65
|
+
this.key = platform.config.AccessToken;
|
|
66
|
+
this.api = platform.api;
|
|
67
|
+
this.commandURL = 'devices/' + accessory.context.device.deviceId + '/commands';
|
|
68
|
+
this.statusURL = 'devices/' + accessory.context.device.deviceId + '/status';
|
|
69
|
+
this.healthURL = 'devices/' + accessory.context.device.deviceId + '/health';
|
|
70
|
+
this.characteristic = platform.Characteristic;
|
|
71
|
+
// set accessory information
|
|
72
|
+
accessory.getService(platform.Service.AccessoryInformation)
|
|
73
|
+
.setCharacteristic(platform.Characteristic.Manufacturer, accessory.context.device.manufacturerName)
|
|
74
|
+
.setCharacteristic(platform.Characteristic.Model, 'Default-Model')
|
|
75
|
+
.setCharacteristic(platform.Characteristic.SerialNumber, 'Default-Serial');
|
|
76
|
+
// Use platform's axios instance to benefit from token refresh handling
|
|
77
|
+
this.axInstance = platform.axInstance;
|
|
78
|
+
// Initialize device health check
|
|
79
|
+
this.checkDeviceHealth().catch(error => {
|
|
80
|
+
this.log.error(`Error checking device health for ${this.name}:`, error);
|
|
81
|
+
this.online = false;
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async checkDeviceHealth() {
|
|
85
|
+
try {
|
|
86
|
+
const response = await this.axInstance.get(this.healthURL);
|
|
87
|
+
this.online = response.data.state === 'ONLINE';
|
|
88
|
+
this.log.debug(`Device ${this.name} is ${this.online ? 'online' : 'offline'}`);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
this.log.error(`Failed to check device health for ${this.name}:`, error);
|
|
92
|
+
this.online = false;
|
|
93
|
+
throw error; // Re-throw to be caught by the constructor
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
registerServiceIfMatchesCapabilities(componentId, component, capabilitiesToCover, capabilities, optionalCapabilities, serviceConstructor) {
|
|
97
|
+
// this.log.debug(`Testing ${serviceConstructor.name} for capabilities ${capabilitiesToCover}`);
|
|
98
|
+
// ignore services which cannot cover all required capabilities
|
|
99
|
+
if (!capabilities.every(e => capabilitiesToCover.includes(e))) {
|
|
100
|
+
// this.log.debug(`Ignoring ${serviceConstructor.name}`);
|
|
101
|
+
return capabilitiesToCover;
|
|
102
|
+
}
|
|
103
|
+
const allCapabilities = capabilities.concat(optionalCapabilities.filter(e => capabilitiesToCover.includes(e)));
|
|
104
|
+
this.log.debug(`Creating instance of ${serviceConstructor.name} for capabilities ${allCapabilities}`);
|
|
105
|
+
const serviceInstance = new serviceConstructor(this.platform, this.accessory, componentId, allCapabilities, this, this.name, component);
|
|
106
|
+
this.services.push(serviceInstance);
|
|
107
|
+
this.log.debug(`Registered ${serviceConstructor.name} for capabilities ${allCapabilities}`);
|
|
108
|
+
// remove covered capabilities and return unused
|
|
109
|
+
return capabilitiesToCover.filter(e => !allCapabilities.includes(e));
|
|
110
|
+
}
|
|
111
|
+
addComponent(componentId, capabilities) {
|
|
112
|
+
const component = {
|
|
113
|
+
componentId,
|
|
114
|
+
capabilities,
|
|
115
|
+
status: {},
|
|
116
|
+
};
|
|
117
|
+
this.components.push(component);
|
|
118
|
+
let capabilitiesToCover = [...capabilities];
|
|
119
|
+
// Start with comboServices and remove used capabilities to avoid duplicated sensors.
|
|
120
|
+
// For example, there is no need to expose a temperature sensor in case of a thermostat which already exposes that charateristic.
|
|
121
|
+
MultiServiceAccessory.comboCapabilityMap
|
|
122
|
+
.sort((a, b) => a.capabilities.length > b.capabilities.length ? -1 : 1) // services with larger capability set first
|
|
123
|
+
.forEach(entry => {
|
|
124
|
+
capabilitiesToCover = this.registerServiceIfMatchesCapabilities(componentId, component, capabilitiesToCover, entry.capabilities, entry.optionalCapabilities || [], entry.service);
|
|
125
|
+
});
|
|
126
|
+
Object.keys(MultiServiceAccessory.capabilityMap).forEach((capability) => {
|
|
127
|
+
const service = MultiServiceAccessory.capabilityMap[capability];
|
|
128
|
+
capabilitiesToCover = this.registerServiceIfMatchesCapabilities(componentId, component, capabilitiesToCover, [capability], [], service);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
isOnline() {
|
|
132
|
+
return this.online;
|
|
133
|
+
}
|
|
134
|
+
// Find return if a capability is supported by the multi-service accessory
|
|
135
|
+
static capabilitySupported(capability) {
|
|
136
|
+
if (Object.keys(MultiServiceAccessory.capabilityMap).find(c => c === capability)) {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// public async refreshStatus(): Promise<boolean> {
|
|
144
|
+
// return super.refreshStatus();
|
|
145
|
+
// }
|
|
146
|
+
// Called by subclasses to refresh the status for the device. Will only refresh if it has been more than
|
|
147
|
+
// 4 seconds since last refresh
|
|
148
|
+
//
|
|
149
|
+
async refreshStatus() {
|
|
150
|
+
return new Promise((resolve) => {
|
|
151
|
+
this.log.debug(`Refreshing status for ${this.name} - current timestamp is ${this.deviceStatusTimestamp}`);
|
|
152
|
+
if (Date.now() - this.deviceStatusTimestamp > 5000) {
|
|
153
|
+
// If there is already a call to smartthings to update status for this device, don't issue another one until
|
|
154
|
+
// we return from that.
|
|
155
|
+
if (this.statusQueryInProgress) {
|
|
156
|
+
this.log.debug(`Status query already in progress for ${this.name}. Waiting...`);
|
|
157
|
+
this.waitFor(() => !this.statusQueryInProgress).then(() => resolve(this.lastStatusResult));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
this.log.debug(`Calling Smartthings to get an update for ${this.name}`);
|
|
161
|
+
this.statusQueryInProgress = true;
|
|
162
|
+
this.failureCount = 0;
|
|
163
|
+
this.waitFor(() => this.commandInProgress === false).then(() => {
|
|
164
|
+
this.lastStatusResult = true;
|
|
165
|
+
this.axInstance.get(this.statusURL).then((res) => {
|
|
166
|
+
const componentsStatus = res.data.components;
|
|
167
|
+
this.components.forEach(component => {
|
|
168
|
+
if (componentsStatus[component.componentId] !== undefined) {
|
|
169
|
+
component.status = componentsStatus[component.componentId];
|
|
170
|
+
this.deviceStatusTimestamp = Date.now();
|
|
171
|
+
this.log.debug(`Updated status for ${this.name}-${component.componentId}: ${JSON.stringify(component.status)}`);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
this.log.error(`Failed to get status for ${this.name}-${component.componentId}`);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
this.statusQueryInProgress = false;
|
|
178
|
+
resolve(true);
|
|
179
|
+
// if (res.data.components.main !== undefined) {
|
|
180
|
+
// this.deviceStatus.status = res.data.components.main;
|
|
181
|
+
// this.deviceStatus.timestamp = Date.now();
|
|
182
|
+
// this.log.debug(`Updated status for ${this.name}: ${JSON.stringify(this.deviceStatus.status)}`);
|
|
183
|
+
// this.statusQueryInProgress = false;
|
|
184
|
+
// resolve(true);
|
|
185
|
+
// } else {
|
|
186
|
+
// this.log.debug(`No status returned for ${this.name}`);
|
|
187
|
+
// this.statusQueryInProgress = false;
|
|
188
|
+
// resolve(this.lastStatusResult = false);
|
|
189
|
+
// }
|
|
190
|
+
}).catch(error => {
|
|
191
|
+
this.failureCount++;
|
|
192
|
+
this.log.error(`Failed to request status from ${this.name}: ${error}. This is failure number ${this.failureCount}`);
|
|
193
|
+
if (this.failureCount >= 5) {
|
|
194
|
+
this.log.error(`Exceeded allowed failures for ${this.name}. Device is offline`);
|
|
195
|
+
this.giveUpTime = Date.now();
|
|
196
|
+
this.online = false;
|
|
197
|
+
}
|
|
198
|
+
this.statusQueryInProgress = false;
|
|
199
|
+
resolve(this.lastStatusResult = false);
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
resolve(true);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
forceNextStatusRefresh() {
|
|
209
|
+
this.deviceStatusTimestamp = 0;
|
|
210
|
+
}
|
|
211
|
+
// public startPollingState(pollSeconds: number, getValue: () => Promise<CharacteristicValue>, service: Service,
|
|
212
|
+
// chracteristic: WithUUID<new () => Characteristic>, targetStateCharacteristic?: WithUUID<new () => Characteristic>,
|
|
213
|
+
// getTargetState?: () => Promise<CharacteristicValue>) {
|
|
214
|
+
// return super.startPollingState(pollSeconds, getValue, service, chracteristic, targetStateCharacteristic, getTargetState);
|
|
215
|
+
// }
|
|
216
|
+
startPollingState(pollSeconds, getValue, service, chracteristic, targetStateCharacteristic, getTargetState) {
|
|
217
|
+
if (this.platform.config.WebhookToken && this.platform.config.WebhookToken !== '') {
|
|
218
|
+
return; // Don't poll if we have a webhook token
|
|
219
|
+
}
|
|
220
|
+
if (pollSeconds > 0) {
|
|
221
|
+
return setInterval(() => {
|
|
222
|
+
// If we are in the middle of a commmand call, or it hasn't been at least 10 seconds, we don't want to poll.
|
|
223
|
+
if (this.commandInProgress || Date.now() - this.lastCommandCompleted < 20 * 1000) {
|
|
224
|
+
// Skip polling until command is complete
|
|
225
|
+
this.log.debug(`Command in progress, skipping polling for ${this.name}`);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (this.online) {
|
|
229
|
+
this.log.debug(`${this.name} polling...`);
|
|
230
|
+
// this.commandInProgress = true;
|
|
231
|
+
getValue().then((v) => {
|
|
232
|
+
service.updateCharacteristic(chracteristic, v);
|
|
233
|
+
this.log.debug(`${this.name} value updated.`);
|
|
234
|
+
}).catch(() => {
|
|
235
|
+
this.log.warn(`Poll failure on ${this.name}`);
|
|
236
|
+
return;
|
|
237
|
+
});
|
|
238
|
+
// Update target if we have to
|
|
239
|
+
if (targetStateCharacteristic && getTargetState) {
|
|
240
|
+
//service.updateCharacteristic(targetStateCharacteristic, getTargetState());
|
|
241
|
+
getTargetState().then(value => service.updateCharacteristic(targetStateCharacteristic, value));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
// If we failed this accessory due to errors. Reset the failure count and online status after 10 minutes.
|
|
246
|
+
if (this.giveUpTime > 0 && (Date.now() - this.giveUpTime > (10 * 60 * 1000))) {
|
|
247
|
+
this.axInstance.get(this.healthURL)
|
|
248
|
+
.then(res => {
|
|
249
|
+
if (res.data.state === 'ONLINE') {
|
|
250
|
+
this.online = true;
|
|
251
|
+
this.giveUpTime = 0;
|
|
252
|
+
this.failureCount = 0;
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}, pollSeconds * 1000 + Math.floor(Math.random() * 1000)); // Add a random delay to avoid collisions
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
async sendCommand(capability, command, args) {
|
|
261
|
+
const cmd = new smartThingsCommand_1.Command(capability, command, args);
|
|
262
|
+
return this.sendCommands([cmd]);
|
|
263
|
+
}
|
|
264
|
+
async sendCommands(commands) {
|
|
265
|
+
const commandBody = JSON.stringify({ commands: commands });
|
|
266
|
+
return new Promise((resolve) => {
|
|
267
|
+
this.waitFor(() => !this.commandInProgress).then(() => {
|
|
268
|
+
this.commandInProgress = true;
|
|
269
|
+
this.axInstance.post(this.commandURL, commandBody).then(() => {
|
|
270
|
+
this.log.debug(`${JSON.stringify(commands)} successful for ${this.name}`);
|
|
271
|
+
this.deviceStatusTimestamp = 0; // Force a refresh on next poll after a state change
|
|
272
|
+
this.commandInProgress = false;
|
|
273
|
+
resolve(true);
|
|
274
|
+
// Force a small delay so that status fetch is correct
|
|
275
|
+
// setTimeout(() => {
|
|
276
|
+
// this.log.debug(`Delay complete for ${this.name}`);
|
|
277
|
+
// this.commandInProgress = false;
|
|
278
|
+
// resolve(true);
|
|
279
|
+
// }, 1500);
|
|
280
|
+
}).catch((error) => {
|
|
281
|
+
this.commandInProgress = false;
|
|
282
|
+
this.log.error(`${JSON.stringify(commands)} failed for ${this.name}: ${error}`);
|
|
283
|
+
resolve(false);
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
// Wait for the condition to be true. Will check every 500 ms
|
|
289
|
+
async waitFor(condition) {
|
|
290
|
+
if (condition()) {
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
this.log.debug(`${this.name} command or request is waiting...`);
|
|
294
|
+
return new Promise(resolve => {
|
|
295
|
+
const interval = setInterval(() => {
|
|
296
|
+
if (condition()) {
|
|
297
|
+
this.log.debug(`${this.name} command or request is proceeding.`);
|
|
298
|
+
clearInterval(interval);
|
|
299
|
+
resolve();
|
|
300
|
+
}
|
|
301
|
+
this.log.debug(`${this.name} still waiting...`);
|
|
302
|
+
}, 250);
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
processEvent(event) {
|
|
306
|
+
this.log.debug(`Received events for ${this.name}`);
|
|
307
|
+
const service = this.services.find(s => s.componentId === event.componentId && s.capabilities.find(c => c === event.capability));
|
|
308
|
+
if (service) {
|
|
309
|
+
this.log.debug(`Event for ${this.name}:${event.componentId} - ${event.value}`);
|
|
310
|
+
service.processEvent(event);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
exports.MultiServiceAccessory = MultiServiceAccessory;
|
|
315
|
+
// Order of these matters. Make sure secondary capabilities like 'battery' and 'contactSensor' are at the end.
|
|
316
|
+
MultiServiceAccessory.capabilityMap = {
|
|
317
|
+
'doorControl': doorService_1.DoorService,
|
|
318
|
+
'lock': lockService_1.LockService,
|
|
319
|
+
'switch': switchService_1.SwitchService,
|
|
320
|
+
'windowShadeLevel': windowCoveringService_1.WindowCoveringService,
|
|
321
|
+
'windowShade': windowCoveringService_1.WindowCoveringService,
|
|
322
|
+
'motionSensor': motionService_1.MotionService,
|
|
323
|
+
'waterSensor': leakDetector_1.LeakDetectorService,
|
|
324
|
+
'smokeDetector': smokeDetector_1.SmokeDetectorService,
|
|
325
|
+
'carbonMonoxideDetector': carbonMonoxideDetector_1.CarbonMonoxideDetectorService,
|
|
326
|
+
'presenceSensor': occupancySensorService_1.OccupancySensorService,
|
|
327
|
+
'temperatureMeasurement': temperatureService_1.TemperatureService,
|
|
328
|
+
'relativeHumidityMeasurement': humidityService_1.HumidityService,
|
|
329
|
+
'illuminanceMeasurement': lightSensorService_1.LightSensorService,
|
|
330
|
+
'contactSensor': contactSensorService_1.ContactSensorService,
|
|
331
|
+
'button': statelessProgrammableSwitchService_1.StatelessProgrammableSwitchService,
|
|
332
|
+
'battery': batteryService_1.BatteryService,
|
|
333
|
+
'valve': valveService_1.ValveService,
|
|
334
|
+
};
|
|
335
|
+
// Maps combinations of supported capabilities to a service
|
|
336
|
+
MultiServiceAccessory.comboCapabilityMap = [
|
|
337
|
+
{
|
|
338
|
+
capabilities: [
|
|
339
|
+
'switch',
|
|
340
|
+
'airConditionerMode',
|
|
341
|
+
'airConditionerFanMode',
|
|
342
|
+
'thermostatCoolingSetpoint',
|
|
343
|
+
'temperatureMeasurement',
|
|
344
|
+
],
|
|
345
|
+
optionalCapabilities: [
|
|
346
|
+
'fanOscillationMode',
|
|
347
|
+
'relativeHumidityMeasurement',
|
|
348
|
+
'custom.airConditionerOptionalMode',
|
|
349
|
+
],
|
|
350
|
+
service: airConditionerService_1.AirConditionerService,
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
capabilities: ['switch', 'fanSpeed', 'switchLevel'],
|
|
354
|
+
service: fanSwitchLevelService_1.FanSwitchLevelService,
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
capabilities: ['switch', 'fanSpeed'],
|
|
358
|
+
service: fanSpeedService_1.FanSpeedService,
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
capabilities: ['switch', 'switchLevel'],
|
|
362
|
+
service: lightService_1.LightService,
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
capabilities: ['switch', 'colorControl'],
|
|
366
|
+
service: lightService_1.LightService,
|
|
367
|
+
},
|
|
368
|
+
{
|
|
369
|
+
capabilities: ['switch', 'colorTemperature'],
|
|
370
|
+
service: lightService_1.LightService,
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
capabilities: ['switch', 'valve'],
|
|
374
|
+
service: valveService_1.ValveService,
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
capabilities: ['temperatureMeasurement',
|
|
378
|
+
'thermostatMode',
|
|
379
|
+
'thermostatHeatingSetpoint',
|
|
380
|
+
'thermostatCoolingSetpoint'],
|
|
381
|
+
service: thermostatService_1.ThermostatService,
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
// There is a heater out there that just supports thermostatMode and thermostatHeatingSetpoint
|
|
385
|
+
capabilities: ['temperatureMeasurement',
|
|
386
|
+
'thermostatHeatingSetpoint'],
|
|
387
|
+
service: thermostatService_1.ThermostatService,
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
capabilities: ['windowShade', 'windowShadeLevel'],
|
|
391
|
+
service: windowCoveringService_1.WindowCoveringService,
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
capabilities: ['windowShade', 'switchLevel'],
|
|
395
|
+
service: windowCoveringService_1.WindowCoveringService,
|
|
396
|
+
},
|
|
397
|
+
];
|
|
398
|
+
//# sourceMappingURL=multiServiceAccessory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multiServiceAccessory.js","sourceRoot":"","sources":["../src/multiServiceAccessory.ts"],"names":[],"mappings":";;;AAIA,mEAAmE;AACnE,4DAAyD;AACzD,8DAA2D;AAC3D,sEAAmE;AACnE,gEAA6D;AAC7D,sEAAmE;AACnE,0EAAuE;AACvE,wDAAqD;AACrD,wDAAqD;AACrD,4DAAyD;AACzD,0DAAuD;AACvD,4EAAyE;AACzE,8EAA2E;AAC3E,0DAA8D;AAC9D,4DAAgE;AAChE,8EAAkF;AAClF,0DAAuD;AAEvD,gEAA6D;AAC7D,4EAAyE;AACzE,oEAAiE;AACjE,sGAAmG;AACnG,4EAAyE;AACzE,sEAAwD;AACxD,wBAAwB;AACxB,uBAAuB;AACvB,uCAAuC;AACvC,iBAAiB;AACjB,KAAK;AAEL;;;;GAIG;AACH,qEAAqE;AACrE,MAAa,qBAAqB;IA4HhC,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED,YACE,QAAwC,EACxC,SAA4B;QAjI9B,qBAAqB;QACrB,eAAe;QACf,eAAU,GAIJ,EAAE,CAAC;QAET;;;WAGG;QAEK,aAAQ,GAAkB,EAAE,CAAC;QAmG3B,WAAM,GAAG,IAAI,CAAC;QACxB,6EAA6E;QACnE,0BAAqB,GAAG,CAAC,CAAC;QAC1B,iBAAY,GAAG,CAAC,CAAC;QACjB,eAAU,GAAG,CAAC,CAAC;QACf,sBAAiB,GAAG,KAAK,CAAC;QAC1B,yBAAoB,GAAG,CAAC,CAAC;QAEzB,0BAAqB,GAAG,KAAK,CAAC;QAC9B,qBAAgB,GAAG,IAAI,CAAC;QAUhC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3C,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;QAExB,IAAI,CAAC,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC;QAC/E,IAAI,CAAC,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC5E,IAAI,CAAC,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC5E,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;QAE9C,4BAA4B;QAC5B,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAE;aACzD,iBAAiB,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC;aAClG,iBAAiB,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,eAAe,CAAC;aACjE,iBAAiB,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;QAE7E,uEAAuE;QACvE,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;QAEtC,iCAAiC;QACjC,IAAI,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACrC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oCAAoC,IAAI,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;YACxE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC;YAC/C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;SAChF;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qCAAqC,IAAI,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;YACzE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,MAAM,KAAK,CAAC,CAAC,2CAA2C;SACzD;IACH,CAAC;IAEO,oCAAoC,CAC1C,WAAmB,EACnB,SAAc,EACd,mBAA6B,EAC7B,YAAsB,EACtB,oBAA8B,EAC9B,kBAAuB;QAEvB,gGAAgG;QAChG,+DAA+D;QAC/D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;YAC7D,yDAAyD;YACzD,OAAO,mBAAmB,CAAC;SAC5B;QAED,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/G,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,wBAAwB,kBAAkB,CAAC,IAAI,qBAAqB,eAAe,EAAE,CAAC,CAAC;QACtG,MAAM,eAAe,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACxI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAEpC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,kBAAkB,CAAC,IAAI,qBAAqB,eAAe,EAAE,CAAC,CAAC;QAC5F,gDAAgD;QAChD,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAEM,YAAY,CAAC,WAAmB,EAAE,YAAsB;QAC7D,MAAM,SAAS,GAAG;YAChB,WAAW;YACX,YAAY;YACZ,MAAM,EAAE,EAAE;SACX,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAGhC,IAAI,mBAAmB,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;QAE5C,qFAAqF;QACrF,iIAAiI;QACjI,qBAAqB,CAAC,kBAAkB;aACrC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,4CAA4C;aACnH,OAAO,CAAC,KAAK,CAAC,EAAE;YACf,mBAAmB,GAAG,IAAI,CAAC,oCAAoC,CAC7D,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,oBAAoB,IAAI,EAAE,EAChC,KAAK,CAAC,OAAO,CACd,CAAC;QACJ,CAAC,CAAC,CAAC;QAEL,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;YACtE,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAChE,mBAAmB,GAAG,IAAI,CAAC,oCAAoC,CAC7D,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,CAAC,UAAU,CAAC,EACZ,EAAE,EACF,OAAO,CACR,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,0EAA0E;IACnE,MAAM,CAAC,mBAAmB,CAAC,UAAkB;QAClD,IAAI,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,EAAE;YAChF,OAAO,IAAI,CAAC;SACb;aAAM;YACL,OAAO,KAAK,CAAC;SACd;IACH,CAAC;IAED,mDAAmD;IACnD,kCAAkC;IAClC,IAAI;IAEJ,yGAAyG;IACzG,+BAA+B;IAC/B,EAAE;IACF,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,IAAI,2BAA2B,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;YAC1G,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,qBAAqB,GAAG,IAAI,EAAE;gBAClD,4GAA4G;gBAC5G,uBAAuB;gBACvB,IAAI,IAAI,CAAC,qBAAqB,EAAE;oBAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,wCAAwC,IAAI,CAAC,IAAI,eAAe,CAAC,CAAC;oBACjF,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;oBAC3F,OAAO;iBACR;gBACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4CAA4C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;gBAClC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;gBACtB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;oBAC7D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;oBAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;wBAC/C,MAAM,gBAAgB,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;wBAC7C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;4BAClC,IAAI,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,SAAS,EAAE;gCACzD,SAAS,CAAC,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;gCAC3D,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gCACxC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,WAAW,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;6BACjH;iCAAM;gCACL,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;6BAClF;wBACH,CAAC,CAAC,CAAC;wBACH,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;wBACnC,OAAO,CAAC,IAAI,CAAC,CAAC;wBACd,gDAAgD;wBAChD,yDAAyD;wBACzD,8CAA8C;wBAC9C,oGAAoG;wBACpG,wCAAwC;wBACxC,mBAAmB;wBACnB,WAAW;wBACX,2DAA2D;wBAC3D,wCAAwC;wBACxC,4CAA4C;wBAC5C,IAAI;oBACN,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;wBACf,IAAI,CAAC,YAAY,EAAE,CAAC;wBACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,IAAI,KAAK,KAAK,6BAA6B,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;wBACrH,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,EAAE;4BAC1B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,IAAI,sBAAsB,CAAC,CAAC;4BACjF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;4BAC7B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;yBACrB;wBACD,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;wBACnC,OAAO,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAAC;oBACzC,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;aACJ;iBAAM;gBACL,OAAO,CAAC,IAAI,CAAC,CAAC;aACf;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,sBAAsB;QAC3B,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;IACjC,CAAC;IAGD,gHAAgH;IAChH,uHAAuH;IACvH,2DAA2D;IAC3D,8HAA8H;IAC9H,IAAI;IAEJ,iBAAiB,CAAC,WAAmB,EAAE,QAA4C,EAAE,OAAgB,EACnG,aAAiD,EAAE,yBAA8D,EACjH,cAAmD;QAEnD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,KAAK,EAAE,EAAE;YACjF,OAAO,CAAE,wCAAwC;SAClD;QAED,IAAI,WAAW,GAAG,CAAC,EAAE;YACnB,OAAO,WAAW,CAAC,GAAG,EAAE;gBACtB,4GAA4G;gBAC5G,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,oBAAoB,GAAG,EAAE,GAAG,IAAI,EAAE;oBAChF,yCAAyC;oBACzC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,6CAA6C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBACzE,OAAO;iBACR;gBACD,IAAI,IAAI,CAAC,MAAM,EAAE;oBACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,aAAa,CAAC,CAAC;oBAC1C,iCAAiC;oBACjC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;wBACpB,OAAO,CAAC,oBAAoB,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;wBAC/C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,iBAAiB,CAAC,CAAC;oBAChD,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;wBACZ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;wBAC9C,OAAO;oBACT,CAAC,CAAC,CAAC;oBACH,8BAA8B;oBAC9B,IAAI,yBAAyB,IAAI,cAAc,EAAE;wBAC/C,4EAA4E;wBAC5E,cAAc,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC,CAAC;qBAChG;iBACF;qBAAM;oBACL,yGAAyG;oBACzG,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE;wBAC5E,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;6BAChC,IAAI,CAAC,GAAG,CAAC,EAAE;4BACV,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;gCAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gCACnB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;gCACpB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;6BACvB;wBACH,CAAC,CAAC,CAAC;qBACN;iBACF;YACH,CAAC,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAE,yCAAyC;SACtG;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAkB,EAAE,OAAe,EAAE,IAAgB;QACrE,MAAM,GAAG,GAAG,IAAI,4BAAO,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAmB;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBACpD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;oBAC3D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,mBAAmB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC1E,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC,oDAAoD;oBACpF,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;oBAC/B,OAAO,CAAC,IAAI,CAAC,CAAC;oBACd,sDAAsD;oBACtD,qBAAqB;oBACrB,uDAAuD;oBACvD,oCAAoC;oBACpC,mBAAmB;oBACnB,YAAY;gBACd,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oBACjB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;oBAC/B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;oBAChF,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,8DAA8D;IACtD,KAAK,CAAC,OAAO,CAAC,SAAwB;QAC5C,IAAI,SAAS,EAAE,EAAE;YACf,OAAO;SACR;QAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,mCAAmC,CAAC,CAAC;QAChE,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAC3B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;gBAChC,IAAI,SAAS,EAAE,EAAE;oBACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,oCAAoC,CAAC,CAAC;oBACjE,aAAa,CAAC,QAAQ,CAAC,CAAC;oBACxB,OAAO,EAAE,CAAC;iBACX;gBACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,mBAAmB,CAAC,CAAC;YAClD,CAAC,EAAE,GAAG,CAAC,CAAC;QACV,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,YAAY,CAAC,KAAiB;QACnC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAEnD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QAEjI,IAAI,OAAO,EAAE;YACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/E,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;SAC7B;IAEH,CAAC;;AAlbH,sDAobC;AApaC,+GAA+G;AAChG,mCAAa,GAAG;IAC7B,aAAa,EAAE,yBAAW;IAC1B,MAAM,EAAE,yBAAW;IACnB,QAAQ,EAAE,6BAAa;IACvB,kBAAkB,EAAE,6CAAqB;IACzC,aAAa,EAAE,6CAAqB;IACpC,cAAc,EAAE,6BAAa;IAC7B,aAAa,EAAE,kCAAmB;IAClC,eAAe,EAAE,oCAAoB;IACrC,wBAAwB,EAAE,sDAA6B;IACvD,gBAAgB,EAAE,+CAAsB;IACxC,wBAAwB,EAAE,uCAAkB;IAC5C,6BAA6B,EAAE,iCAAe;IAC9C,wBAAwB,EAAE,uCAAkB;IAC5C,eAAe,EAAE,2CAAoB;IACrC,QAAQ,EAAE,uEAAkC;IAC5C,SAAS,EAAE,+BAAc;IACzB,OAAO,EAAE,2BAAY;CACtB,AAlB2B,CAkB1B;AAEF,2DAA2D;AAC5C,wCAAkB,GAAG;IAClC;QACE,YAAY,EAAE;YACZ,QAAQ;YACR,oBAAoB;YACpB,uBAAuB;YACvB,2BAA2B;YAC3B,wBAAwB;SACzB;QACD,oBAAoB,EAAE;YACpB,oBAAoB;YACpB,6BAA6B;YAC7B,mCAAmC;SACpC;QACD,OAAO,EAAE,6CAAqB;KAC/B;IACD;QACE,YAAY,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC;QACnD,OAAO,EAAE,6CAAqB;KAC/B;IACD;QACE,YAAY,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;QACpC,OAAO,EAAE,iCAAe;KACzB;IACD;QACE,YAAY,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;QACvC,OAAO,EAAE,2BAAY;KACtB;IACD;QACE,YAAY,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC;QACxC,OAAO,EAAE,2BAAY;KACtB;IACD;QACE,YAAY,EAAE,CAAC,QAAQ,EAAE,kBAAkB,CAAC;QAC5C,OAAO,EAAE,2BAAY;KACtB;IACD;QACE,YAAY,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;QACjC,OAAO,EAAE,2BAAY;KACtB;IACD;QACE,YAAY,EAAE,CAAC,wBAAwB;YACrC,gBAAgB;YAChB,2BAA2B;YAC3B,2BAA2B,CAAC;QAC9B,OAAO,EAAE,qCAAiB;KAC3B;IACD;QACE,8FAA8F;QAC9F,YAAY,EAAE,CAAC,wBAAwB;YACrC,2BAA2B,CAAC;QAC9B,OAAO,EAAE,qCAAiB;KAC3B;IACD;QACE,YAAY,EAAE,CAAC,aAAa,EAAE,kBAAkB,CAAC;QACjD,OAAO,EAAE,6CAAqB;KAC/B;IACD;QACE,YAAY,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC;QAC5C,OAAO,EAAE,6CAAqB;KAC/B;CACF,AA7DgC,CA6D/B"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { API, DynamicPlatformPlugin, Logger, PlatformAccessory, PlatformConfig, Service, Characteristic } from 'homebridge';
|
|
2
|
+
import axios = require('axios');
|
|
3
|
+
import { MultiServiceAccessory } from './multiServiceAccessory';
|
|
4
|
+
import { SmartThingsAuth } from './auth/auth';
|
|
5
|
+
/**
|
|
6
|
+
* HomebridgePlatform
|
|
7
|
+
* This class is the main constructor for your plugin, this is where you should
|
|
8
|
+
* parse the user config and discover/register accessories with Homebridge.
|
|
9
|
+
*/
|
|
10
|
+
export declare class IKHomeBridgeHomebridgePlatform implements DynamicPlatformPlugin {
|
|
11
|
+
readonly log: Logger;
|
|
12
|
+
readonly config: PlatformConfig;
|
|
13
|
+
readonly api: API;
|
|
14
|
+
readonly Service: typeof Service;
|
|
15
|
+
readonly Characteristic: typeof Characteristic;
|
|
16
|
+
readonly accessories: PlatformAccessory[];
|
|
17
|
+
private locationIDsToIgnore;
|
|
18
|
+
private roomsIDsToIgnore;
|
|
19
|
+
auth: SmartThingsAuth;
|
|
20
|
+
private headerDict;
|
|
21
|
+
readonly axInstance: axios.AxiosInstance;
|
|
22
|
+
private accessoryObjects;
|
|
23
|
+
private subscriptionHandler;
|
|
24
|
+
constructor(log: Logger, config: PlatformConfig, api: API);
|
|
25
|
+
/**
|
|
26
|
+
* This function is invoked when homebridge restores cached accessories from disk at startup.
|
|
27
|
+
* It should be used to setup event handlers for characteristics and update respective values.
|
|
28
|
+
*/
|
|
29
|
+
configureAccessory(accessory: PlatformAccessory): void;
|
|
30
|
+
getLocationsToIgnore(): Promise<boolean>;
|
|
31
|
+
getOnlineDevices(): Promise<Array<object>>;
|
|
32
|
+
unregisterDevices(devices: any, all?: boolean): void;
|
|
33
|
+
/**
|
|
34
|
+
* This is an example method showing how to register discovered accessories.
|
|
35
|
+
* Accessories must only be registered once, previously created accessories
|
|
36
|
+
* must not be registered again to prevent "duplicate UUID" errors.
|
|
37
|
+
*/
|
|
38
|
+
discoverDevices(devices: any): void;
|
|
39
|
+
findSupportedCapability(device: any): boolean;
|
|
40
|
+
createAccessoryObject(device: any, accessory: any): MultiServiceAccessory;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI5H,OAAO,KAAK,GAAG,QAAQ,OAAO,CAAC,CAAC;AAEhC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C;;;;GAIG;AACH,qBAAa,8BAA+B,YAAW,qBAAqB;aAwBxD,GAAG,EAAE,MAAM;aACX,MAAM,EAAE,cAAc;aACtB,GAAG,EAAE,GAAG;IAzB1B,SAAgB,OAAO,EAAE,OAAO,OAAO,CAAwB;IAC/D,SAAgB,cAAc,EAAE,OAAO,cAAc,CAA+B;IAGpF,SAAgB,WAAW,EAAE,iBAAiB,EAAE,CAAM;IAEtD,OAAO,CAAC,mBAAmB,CAAgB;IAC3C,OAAO,CAAC,gBAAgB,CAAgB;IACjC,IAAI,EAAE,eAAe,CAAC;IAE7B,OAAO,CAAC,UAAU,CAEhB;IAEF,SAAgB,UAAU,sBAGvB;IAEH,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,mBAAmB,CAA8C;gBAGvD,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,GAAG;IAqH1B;;;OAGG;IACH,kBAAkB,CAAC,SAAS,EAAE,iBAAiB;IAO/C,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IAkBxC,gBAAgB,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IA8C1C,iBAAiB,CAAC,OAAO,KAAA,EAAE,GAAG,UAAQ;IA0BtC;;;;OAIG;IACH,eAAe,CAAC,OAAO,KAAA;IAqDvB,uBAAuB,CAAC,MAAM,KAAA,GAAG,OAAO;IAqBxC,qBAAqB,CAAC,MAAM,KAAA,EAAE,SAAS,KAAA,GAAG,qBAAqB;CAiBhE"}
|