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,273 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ThermostatService = void 0;
|
|
4
|
+
const baseService_1 = require("./baseService");
|
|
5
|
+
class ThermostatService extends baseService_1.BaseService {
|
|
6
|
+
constructor(platform, accessory, componentId, capabilities, multiServiceAccessory, name, deviceStatus) {
|
|
7
|
+
super(platform, accessory, componentId, capabilities, multiServiceAccessory, name, deviceStatus);
|
|
8
|
+
this.units = 'C';
|
|
9
|
+
this.supportsOperatingState = false;
|
|
10
|
+
this.setServiceType(platform.Service.Thermostat);
|
|
11
|
+
// Set the event handlers
|
|
12
|
+
this.log.debug(`Adding ThermostatService to ${this.name}`);
|
|
13
|
+
const component = this.multiServiceAccessory.components.find((c) => c.componentId === componentId);
|
|
14
|
+
if (component && component.capabilities.find((cap) => cap === 'thermostatOperatingState')) {
|
|
15
|
+
//if (this.multiServiceAccessory.capabilities.find((c) => c.id === 'thermostatOperatingState')) {
|
|
16
|
+
this.supportsOperatingState = true;
|
|
17
|
+
}
|
|
18
|
+
this.service.getCharacteristic(platform.Characteristic.CurrentHeatingCoolingState)
|
|
19
|
+
.onGet(this.getCurrentHeatingCoolingState.bind(this));
|
|
20
|
+
this.service.getCharacteristic(platform.Characteristic.TargetHeatingCoolingState)
|
|
21
|
+
.onGet(this.getTargetHeatingCoolingState.bind(this))
|
|
22
|
+
.onSet(this.setTargetHeatingCoolingState.bind(this));
|
|
23
|
+
this.service.getCharacteristic(platform.Characteristic.CurrentTemperature)
|
|
24
|
+
.onGet(this.getCurrentTemperature.bind(this));
|
|
25
|
+
this.service.getCharacteristic(platform.Characteristic.TargetTemperature)
|
|
26
|
+
.onGet(this.getTargetTemperature.bind(this))
|
|
27
|
+
.onSet(this.setTargetTemperature.bind(this));
|
|
28
|
+
this.service.getCharacteristic(platform.Characteristic.TemperatureDisplayUnits)
|
|
29
|
+
.onGet(this.getTemperatureDisplayUnits.bind(this))
|
|
30
|
+
.onSet(this.setTemperatureDisplayUnits.bind(this));
|
|
31
|
+
this.targetHeatingCoolingState = platform.Characteristic.TargetHeatingCoolingState.OFF;
|
|
32
|
+
this.targetTemperature = 20;
|
|
33
|
+
// TODO: get the current mode and set targetHeatingCoolingState
|
|
34
|
+
// set targets
|
|
35
|
+
this.getCurrentHeatingCoolingState().then((value) => this.targetHeatingCoolingState = value);
|
|
36
|
+
this.getCurrentTemperature().then((value) => this.targetTemperature = value);
|
|
37
|
+
let pollSensors = 10; // default to 10 seconds
|
|
38
|
+
if (this.platform.config.PollSensorsSeconds !== undefined) {
|
|
39
|
+
pollSensors = this.platform.config.PollSensorsSeconds;
|
|
40
|
+
}
|
|
41
|
+
if (pollSensors > 0) {
|
|
42
|
+
multiServiceAccessory.startPollingState(pollSensors, this.getCurrentHeatingCoolingState.bind(this), this.service, platform.Characteristic.CurrentHeatingCoolingState, platform.Characteristic.TargetHeatingCoolingState, this.getTargetHeatingCoolingState.bind(this));
|
|
43
|
+
multiServiceAccessory.startPollingState(pollSensors, this.getCurrentTemperature.bind(this), this.service, platform.Characteristic.CurrentTemperature, platform.Characteristic.TargetTemperature, this.getTargetTemperature.bind(this));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// TARGET STATE CALLBACKS
|
|
47
|
+
async getTargetHeatingCoolingState() {
|
|
48
|
+
this.log.debug('Received getTargetHeatingCoolingState for ' + this.name);
|
|
49
|
+
return new Promise((resolve) => {
|
|
50
|
+
// If we don't have the capability of thermostatMode, then just return AUTO
|
|
51
|
+
if (this.capabilities.find((c) => c === 'thermostatMode') === undefined) {
|
|
52
|
+
resolve(this.targetHeatingCoolingState = this.platform.Characteristic.TargetHeatingCoolingState.AUTO);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
this.getStatus().then(success => {
|
|
56
|
+
let state;
|
|
57
|
+
if (success) {
|
|
58
|
+
state = this.deviceStatus.status.thermostatMode.thermostatMode.value;
|
|
59
|
+
if (state === null || state === undefined) {
|
|
60
|
+
this.log.error(`Received invalid heating / cooling state from ${this.name}`);
|
|
61
|
+
resolve(this.targetHeatingCoolingState);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
switch (state) {
|
|
65
|
+
case 'cool':
|
|
66
|
+
resolve(this.targetHeatingCoolingState = this.platform.Characteristic.TargetHeatingCoolingState.COOL);
|
|
67
|
+
return;
|
|
68
|
+
case 'heat':
|
|
69
|
+
resolve(this.targetHeatingCoolingState = this.platform.Characteristic.TargetHeatingCoolingState.HEAT);
|
|
70
|
+
return;
|
|
71
|
+
case 'auto':
|
|
72
|
+
resolve(this.targetHeatingCoolingState = this.platform.Characteristic.TargetHeatingCoolingState.AUTO);
|
|
73
|
+
return;
|
|
74
|
+
default:
|
|
75
|
+
resolve(this.targetHeatingCoolingState = this.platform.Characteristic.TargetHeatingCoolingState.OFF);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
resolve(this.targetHeatingCoolingState);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// Set the target state of the thermostat
|
|
87
|
+
async setTargetHeatingCoolingState(value) {
|
|
88
|
+
this.log.debug('Received setTargetHeatingCoolingState(' + value + ') event for ' + this.name);
|
|
89
|
+
if (!this.multiServiceAccessory.isOnline) {
|
|
90
|
+
this.log.error(this.name + ' is offline');
|
|
91
|
+
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
92
|
+
}
|
|
93
|
+
this.targetHeatingCoolingState = value;
|
|
94
|
+
if (this.capabilities.find((c) => c === 'thermostatMode') === undefined) {
|
|
95
|
+
this.log.debug(`Thermostat ${this.name} does not support thermostatMode. Ignoring request`);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
let cmd = '';
|
|
99
|
+
switch (value) {
|
|
100
|
+
case this.platform.Characteristic.TargetHeatingCoolingState.AUTO:
|
|
101
|
+
cmd = 'auto';
|
|
102
|
+
break;
|
|
103
|
+
case this.platform.Characteristic.TargetHeatingCoolingState.COOL:
|
|
104
|
+
cmd = 'cool';
|
|
105
|
+
break;
|
|
106
|
+
case this.platform.Characteristic.TargetHeatingCoolingState.HEAT:
|
|
107
|
+
cmd = 'heat';
|
|
108
|
+
break;
|
|
109
|
+
default:
|
|
110
|
+
cmd = 'off';
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
this.multiServiceAccessory.sendCommand('thermostatMode', cmd).then((success) => {
|
|
114
|
+
if (success) {
|
|
115
|
+
this.log.debug('setTargetHeatingCoolingState(' + value + ') SUCCESSFUL for ' + this.name);
|
|
116
|
+
//this.deviceStatus.timestamp = 0; // Force a refresh next query.
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
this.log.error(`Command failed for ${this.name}`);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
// CURRENT STATE
|
|
124
|
+
async getCurrentHeatingCoolingState() {
|
|
125
|
+
// if you need to return an error to show the device as "Not Responding" in the Home app:
|
|
126
|
+
// throw new this.platform.api.hap.HapStatusError(this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE);
|
|
127
|
+
this.log.debug('Received getCurrentHeatingCoolingState() event for ' + this.name);
|
|
128
|
+
return new Promise((resolve, reject) => {
|
|
129
|
+
if (this.capabilities.find((c) => c === 'thermostatMode') === undefined) {
|
|
130
|
+
this.log.debug(`Thermostat ${this.name} does not support thermostatMode. Returning OFF`);
|
|
131
|
+
resolve(this.platform.Characteristic.CurrentHeatingCoolingState.OFF);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
this.getStatus().then(success => {
|
|
135
|
+
if (success) {
|
|
136
|
+
let thermostatMode;
|
|
137
|
+
try {
|
|
138
|
+
thermostatMode = this.deviceStatus.status.thermostatMode.thermostatMode.value;
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
this.log.warn(`Missing thermostatMode from ${this.name}`);
|
|
142
|
+
resolve(this.targetHeatingCoolingState);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
this.log.debug(`thermostatMode value from ${this.name}: ${thermostatMode}`);
|
|
146
|
+
switch (thermostatMode) {
|
|
147
|
+
case 'cool':
|
|
148
|
+
resolve(this.platform.Characteristic.CurrentHeatingCoolingState.COOL);
|
|
149
|
+
break;
|
|
150
|
+
case 'heat':
|
|
151
|
+
resolve(this.platform.Characteristic.CurrentHeatingCoolingState.HEAT);
|
|
152
|
+
break;
|
|
153
|
+
default:
|
|
154
|
+
resolve(this.platform.Characteristic.CurrentHeatingCoolingState.OFF);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
reject(new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */));
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
// CURRENT TEMP
|
|
164
|
+
async getCurrentTemperature() {
|
|
165
|
+
this.log.debug('Received getCurrentTemperature for ' + this.name);
|
|
166
|
+
return new Promise((resolve) => {
|
|
167
|
+
this.getStatus().then((success) => {
|
|
168
|
+
if (success) {
|
|
169
|
+
if (this.deviceStatus.status.temperatureMeasurement.temperature.value === null ||
|
|
170
|
+
this.deviceStatus.status.temperatureMeasurement.temperature.value === undefined ||
|
|
171
|
+
this.deviceStatus.status.temperatureMeasurement.temperature.unit === null ||
|
|
172
|
+
this.deviceStatus.status.temperatureMeasurement.temperature.value === undefined) {
|
|
173
|
+
this.log.warn(`${this.name} returned bad value for status`);
|
|
174
|
+
throw ('Bad Value');
|
|
175
|
+
}
|
|
176
|
+
if (this.deviceStatus.status.temperatureMeasurement.temperature.unit === 'F') {
|
|
177
|
+
this.log.debug('Converting temp to celcius');
|
|
178
|
+
this.units = 'F';
|
|
179
|
+
resolve((this.deviceStatus.status.temperatureMeasurement.temperature.value - 32) * (5 / 9)); // Convert to Celcius
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
this.units = 'C';
|
|
183
|
+
resolve(this.deviceStatus.status.temperatureMeasurement.temperature.value);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
// reject (new this.platform.api.hap.HapStatusError(this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE));
|
|
188
|
+
// For some reason, when homekit makes this call and it fails, Homebridge crashes. So we will simply return zero.
|
|
189
|
+
this.log.warn(`Failed to get status for ${this.name}`);
|
|
190
|
+
resolve(0);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
// TARGET TEMP
|
|
196
|
+
async getTargetTemperature() {
|
|
197
|
+
this.log.debug('Received GetTargetTemperature for ' + this.name);
|
|
198
|
+
let temp;
|
|
199
|
+
if (await this.getTargetHeatingCoolingState() === this.platform.Characteristic.TargetHeatingCoolingState.COOL) {
|
|
200
|
+
temp = this.deviceStatus.status.thermostatCoolingSetpoint.coolingSetpoint.value;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
temp = this.deviceStatus.status.thermostatHeatingSetpoint.heatingSetpoint.value;
|
|
204
|
+
}
|
|
205
|
+
if (temp === null || temp === undefined) {
|
|
206
|
+
throw (new this.platform.api.hap.HapStatusError(-70409 /* this.platform.api.hap.HAPStatus.RESOURCE_DOES_NOT_EXIST */));
|
|
207
|
+
}
|
|
208
|
+
if (this.units === 'F') {
|
|
209
|
+
temp = (temp - 32) * (5 / 9); // Convert to C
|
|
210
|
+
}
|
|
211
|
+
this.targetTemperature = temp;
|
|
212
|
+
return temp;
|
|
213
|
+
}
|
|
214
|
+
async setTargetTemperature(value) {
|
|
215
|
+
this.log.debug('Received setTargetTemperature(' + value + ') event for ' + this.name);
|
|
216
|
+
this.targetTemperature = value;
|
|
217
|
+
let capability = '';
|
|
218
|
+
let command = '';
|
|
219
|
+
if (this.targetHeatingCoolingState === this.platform.Characteristic.TargetHeatingCoolingState.COOL) {
|
|
220
|
+
capability = 'thermostatCoolingSetpoint';
|
|
221
|
+
command = 'setCoolingSetpoint';
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
capability = 'thermostatHeatingSetpoint';
|
|
225
|
+
command = 'setHeatingSetpoint';
|
|
226
|
+
}
|
|
227
|
+
// If the thermostat's units is Farenheit, then we need to convert from celcius
|
|
228
|
+
const convertedTemp = this.units === 'F' ? (value * (9 / 5)) + 32 : value;
|
|
229
|
+
this.multiServiceAccessory.sendCommand(capability, command, [convertedTemp]);
|
|
230
|
+
}
|
|
231
|
+
// DISPLAY UNITS
|
|
232
|
+
getTemperatureDisplayUnits() {
|
|
233
|
+
this.log.debug('Received getTemperatureDislayUnits for ' + this.name);
|
|
234
|
+
if (this.units === 'C') {
|
|
235
|
+
return this.platform.Characteristic.TemperatureDisplayUnits.CELSIUS;
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
return this.platform.Characteristic.TemperatureDisplayUnits.FAHRENHEIT;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
setTemperatureDisplayUnits(value) {
|
|
242
|
+
// Nothing to do as there is no way to send this off to Smartthings
|
|
243
|
+
this.log.debug(`Received request to set display units to ${value}. No equivalent in Smartthings...`);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
processEvent(event) {
|
|
247
|
+
this.log.debug(`Updating ${event.attribute} for ${this.name} from event to ${event.value}`);
|
|
248
|
+
let characteristic = this.platform.Characteristic.TargetTemperature;
|
|
249
|
+
let value;
|
|
250
|
+
if (event.attribute === 'heatingSetpoint' || event.attribute === 'coolingSetpoint') {
|
|
251
|
+
value = this.units === 'F' ? (event.value - 32) * (5 / 9) : event.value;
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
characteristic = this.platform.Characteristic.TargetHeatingCoolingState;
|
|
255
|
+
switch (event.value) {
|
|
256
|
+
case 'cool':
|
|
257
|
+
value = this.platform.Characteristic.TargetHeatingCoolingState.COOL;
|
|
258
|
+
break;
|
|
259
|
+
case 'heat':
|
|
260
|
+
value = this.platform.Characteristic.TargetHeatingCoolingState.HEAT;
|
|
261
|
+
break;
|
|
262
|
+
case 'auto':
|
|
263
|
+
value = this.platform.Characteristic.TargetHeatingCoolingState.AUTO;
|
|
264
|
+
break;
|
|
265
|
+
default:
|
|
266
|
+
value = this.platform.Characteristic.TargetHeatingCoolingState.OFF;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
this.service.updateCharacteristic(characteristic, value);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
exports.ThermostatService = ThermostatService;
|
|
273
|
+
//# sourceMappingURL=thermostatService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thermostatService.js","sourceRoot":"","sources":["../../src/services/thermostatService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PlatformAccessory, CharacteristicValue } from 'homebridge';
|
|
2
|
+
import { IKHomeBridgeHomebridgePlatform } from '../platform';
|
|
3
|
+
import { BaseService } from './baseService';
|
|
4
|
+
import { MultiServiceAccessory } from '../multiServiceAccessory';
|
|
5
|
+
import { ShortEvent } from '../webhook/subscriptionHandler';
|
|
6
|
+
export declare class ValveService extends BaseService {
|
|
7
|
+
constructor(platform: IKHomeBridgeHomebridgePlatform, accessory: PlatformAccessory, componentId: string, capabilities: string[], multiServiceAccessory: MultiServiceAccessory, name: string, deviceStatus: any);
|
|
8
|
+
getValveState(): Promise<number>;
|
|
9
|
+
setValveState(value: CharacteristicValue): Promise<void>;
|
|
10
|
+
processEvent(event: ShortEvent): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=valveService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valveService.d.ts","sourceRoot":"","sources":["../../src/services/valveService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,qBAAa,YAAa,SAAQ,WAAW;gBAE/B,QAAQ,EAAE,8BAA8B,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,EAC7H,qBAAqB,EAAE,qBAAqB,EAC5C,IAAI,EAAE,MAAM,EAAE,YAAY,KAAA;IAetB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAkBhC,aAAa,CAAC,KAAK,EAAE,mBAAmB;IAmBvC,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;CAO7C"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ValveService = void 0;
|
|
4
|
+
const baseService_1 = require("./baseService");
|
|
5
|
+
class ValveService extends baseService_1.BaseService {
|
|
6
|
+
constructor(platform, accessory, componentId, capabilities, multiServiceAccessory, name, deviceStatus) {
|
|
7
|
+
super(platform, accessory, componentId, capabilities, multiServiceAccessory, name, deviceStatus);
|
|
8
|
+
this.setServiceType(platform.Service.Valve);
|
|
9
|
+
// Set the event handlers
|
|
10
|
+
this.log.debug(`Adding ValveService to ${this.name}`);
|
|
11
|
+
this.service.getCharacteristic(platform.Characteristic.Active) // Always return true for active
|
|
12
|
+
.onGet(this.getValveState.bind(this))
|
|
13
|
+
.onSet(this.setValveState.bind(this));
|
|
14
|
+
this.service.getCharacteristic(platform.Characteristic.ValveType).onGet(() => platform.Characteristic.ValveType.IRRIGATION);
|
|
15
|
+
this.service.getCharacteristic(platform.Characteristic.InUse)
|
|
16
|
+
.onGet(this.getValveState.bind(this));
|
|
17
|
+
}
|
|
18
|
+
// Return the current target state
|
|
19
|
+
async getValveState() {
|
|
20
|
+
// If it has been more than 10 seconds since we've sent a transition command,
|
|
21
|
+
// reset the target state to the current state.
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
this.getStatus().then(success => {
|
|
24
|
+
if (!success) {
|
|
25
|
+
reject(new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const valveState = this.deviceStatus.status.valve.valve.value;
|
|
29
|
+
this.log.debug(`Received valve value of ${valveState} from Smartthings`);
|
|
30
|
+
resolve(valveState === 'open' ? this.platform.Characteristic.Active.ACTIVE : this.platform.Characteristic.Active.INACTIVE);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
// Set the target state of the valve
|
|
35
|
+
async setValveState(value) {
|
|
36
|
+
this.log.debug('Received setValveState(' + value + ') event for ' + this.name);
|
|
37
|
+
if (!this.multiServiceAccessory.isOnline) {
|
|
38
|
+
this.log.error(this.name + ' is offline');
|
|
39
|
+
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
40
|
+
}
|
|
41
|
+
const command = value === this.platform.Characteristic.Active.ACTIVE ? 'open' : 'close';
|
|
42
|
+
this.multiServiceAccessory.sendCommand('valve', command).then((success) => {
|
|
43
|
+
if (success) {
|
|
44
|
+
this.log.debug('onSet(' + value + ') SUCCESSFUL for ' + this.name);
|
|
45
|
+
this.multiServiceAccessory.forceNextStatusRefresh();
|
|
46
|
+
// this.deviceStatus.timestamp = 0; // Force refresh
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
this.log.error(`Command failed for ${this.name}`);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
processEvent(event) {
|
|
54
|
+
this.log.debug(`Event updating valve capability for ${this.name} to ${event.value}`);
|
|
55
|
+
this.service.updateCharacteristic(this.platform.Characteristic.Active, event.value === 'open' ? this.platform.Characteristic.Active.ACTIVE : this.platform.Characteristic.Active.INACTIVE);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.ValveService = ValveService;
|
|
59
|
+
//# sourceMappingURL=valveService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valveService.js","sourceRoot":"","sources":["../../src/services/valveService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { PlatformAccessory, CharacteristicValue } from 'homebridge';
|
|
2
|
+
import { IKHomeBridgeHomebridgePlatform } from '../platform';
|
|
3
|
+
import { BaseService } from './baseService';
|
|
4
|
+
import { MultiServiceAccessory } from '../multiServiceAccessory';
|
|
5
|
+
import { ShortEvent } from '../webhook/subscriptionHandler';
|
|
6
|
+
export declare class WindowCoveringService extends BaseService {
|
|
7
|
+
private targetPosition;
|
|
8
|
+
private timer;
|
|
9
|
+
private states;
|
|
10
|
+
private currentPositionState;
|
|
11
|
+
private useWindowShadeLevel;
|
|
12
|
+
constructor(platform: IKHomeBridgeHomebridgePlatform, accessory: PlatformAccessory, componentId: string, capabilities: string[], multiServiceAccessory: MultiServiceAccessory, name: string, deviceStatus: any);
|
|
13
|
+
/**
|
|
14
|
+
* Handle "SET" requests from HomeKit
|
|
15
|
+
* These are sent when the user changes the state of an accessory, for example, turning on a Light bulb.
|
|
16
|
+
*/
|
|
17
|
+
setTargetPosition(value: CharacteristicValue): Promise<void>;
|
|
18
|
+
getTargetPosition(): Promise<CharacteristicValue>;
|
|
19
|
+
getCurrentPositionState(): Promise<CharacteristicValue>;
|
|
20
|
+
/**
|
|
21
|
+
* Handle the "GET" requests from HomeKit
|
|
22
|
+
* These are sent when HomeKit wants to know the current state of the accessory, for example, checking if a Light bulb is on.
|
|
23
|
+
*
|
|
24
|
+
* GET requests should return as fast as possbile. A long delay here will result in
|
|
25
|
+
* HomeKit being unresponsive and a bad user experience in general.
|
|
26
|
+
*
|
|
27
|
+
* If your device takes time to respond you should update the status of your device
|
|
28
|
+
* asynchronously instead using the `updateCharacteristic` method instead.
|
|
29
|
+
|
|
30
|
+
* @example
|
|
31
|
+
* this.service.updateCharacteristic(this.platform.Characteristic.On, true)
|
|
32
|
+
*/
|
|
33
|
+
getCurrentPosition(): Promise<CharacteristicValue>;
|
|
34
|
+
processEvent(event: ShortEvent): void;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=windowCoveringService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windowCoveringService.d.ts","sourceRoot":"","sources":["../../src/services/windowCoveringService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,KAAK,CAAC;IACd,OAAO,CAAC,MAAM,CAIZ;IAEF,OAAO,CAAC,oBAAoB,CAAuB;IAEnD,OAAO,CAAC,mBAAmB,CAAS;gBAExB,QAAQ,EAAE,8BAA8B,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,EAC7H,qBAAqB,EAAE,qBAAqB,EAC5C,IAAI,EAAE,MAAM,EAAE,YAAY,KAAA;IAgC5B;;;OAGG;IACG,iBAAiB,CAAC,KAAK,EAAE,mBAAmB;IA8B5C,iBAAiB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAMjD,uBAAuB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAyB7D;;;;;;;;;;;;OAYG;IACG,kBAAkB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IA8BjD,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;CAyB7C"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WindowCoveringService = void 0;
|
|
4
|
+
const baseService_1 = require("./baseService");
|
|
5
|
+
class WindowCoveringService extends baseService_1.BaseService {
|
|
6
|
+
constructor(platform, accessory, componentId, capabilities, multiServiceAccessory, name, deviceStatus) {
|
|
7
|
+
super(platform, accessory, componentId, capabilities, multiServiceAccessory, name, deviceStatus);
|
|
8
|
+
this.targetPosition = 0;
|
|
9
|
+
this.states = {
|
|
10
|
+
decreasing: this.platform.Characteristic.PositionState.DECREASING,
|
|
11
|
+
increasing: this.platform.Characteristic.PositionState.INCREASING,
|
|
12
|
+
stopped: this.platform.Characteristic.PositionState.STOPPED,
|
|
13
|
+
};
|
|
14
|
+
this.currentPositionState = this.states.stopped;
|
|
15
|
+
this.useWindowShadeLevel = false;
|
|
16
|
+
this.setServiceType(platform.Service.WindowCovering);
|
|
17
|
+
// Set the event handlers
|
|
18
|
+
this.log.debug(`Adding WindowCoveringService to ${this.name}`);
|
|
19
|
+
this.service.getCharacteristic(platform.Characteristic.CurrentPosition)
|
|
20
|
+
.onGet(this.getCurrentPosition.bind(this));
|
|
21
|
+
this.service.getCharacteristic(platform.Characteristic.PositionState)
|
|
22
|
+
.onGet(this.getCurrentPositionState.bind(this));
|
|
23
|
+
this.service.getCharacteristic(platform.Characteristic.TargetPosition)
|
|
24
|
+
.onGet(this.getTargetPosition.bind(this))
|
|
25
|
+
.onSet(this.setTargetPosition.bind(this));
|
|
26
|
+
let pollWindowShadesSeconds = 10; // default to 10 seconds
|
|
27
|
+
if (this.platform.config.PollWindowShadesSeconds !== undefined) {
|
|
28
|
+
pollWindowShadesSeconds = this.platform.config.PollSwitchesAndLightsSeconds;
|
|
29
|
+
}
|
|
30
|
+
if (pollWindowShadesSeconds > 0) {
|
|
31
|
+
multiServiceAccessory.startPollingState(pollWindowShadesSeconds, this.getCurrentPosition.bind(this), this.service, platform.Characteristic.CurrentPosition, platform.Characteristic.TargetPosition, this.getTargetPosition.bind(this));
|
|
32
|
+
multiServiceAccessory.startPollingState(pollWindowShadesSeconds, this.getCurrentPositionState.bind(this), this.service, platform.Characteristic.PositionState);
|
|
33
|
+
}
|
|
34
|
+
if (this.capabilities.includes('windowShadeLevel')) {
|
|
35
|
+
this.useWindowShadeLevel = true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Handle "SET" requests from HomeKit
|
|
40
|
+
* These are sent when the user changes the state of an accessory, for example, turning on a Light bulb.
|
|
41
|
+
*/
|
|
42
|
+
async setTargetPosition(value) {
|
|
43
|
+
this.log.debug('Received setTargetPosition(' + value + ') event for ' + this.name);
|
|
44
|
+
this.targetPosition = value;
|
|
45
|
+
if (!this.multiServiceAccessory.isOnline()) {
|
|
46
|
+
this.log.error(this.name + ' is offline');
|
|
47
|
+
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
48
|
+
}
|
|
49
|
+
let capability = 'switchLevel';
|
|
50
|
+
let command = 'setLevel';
|
|
51
|
+
if (this.useWindowShadeLevel) {
|
|
52
|
+
capability = 'windowShadeLevel';
|
|
53
|
+
command = 'setShadeLevel';
|
|
54
|
+
}
|
|
55
|
+
this.multiServiceAccessory.sendCommand(capability, command, [value])
|
|
56
|
+
.then(() => {
|
|
57
|
+
this.log.debug('onSet(' + value + ') SUCCESSFUL for ' + this.name);
|
|
58
|
+
this.multiServiceAccessory.forceNextStatusRefresh();
|
|
59
|
+
})
|
|
60
|
+
.catch(reason => {
|
|
61
|
+
this.log.error('onSet(' + value + ') FAILED for ' + this.name + ': reason ' + reason);
|
|
62
|
+
throw (new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */));
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
async getTargetPosition() {
|
|
66
|
+
return new Promise(resolve => {
|
|
67
|
+
resolve(this.targetPosition);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async getCurrentPositionState() {
|
|
71
|
+
this.log.debug('Received getCurrentPositionState() event for ' + this.name);
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
this.getStatus().then(success => {
|
|
74
|
+
if (success) {
|
|
75
|
+
const state = this.deviceStatus.status.windowShade.windowShade;
|
|
76
|
+
if (state === 'opening') {
|
|
77
|
+
this.currentPositionState = this.states.decreasing;
|
|
78
|
+
}
|
|
79
|
+
else if (state === 'closing') {
|
|
80
|
+
this.currentPositionState = this.states.increasing;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
this.currentPositionState = this.states.stopped;
|
|
84
|
+
}
|
|
85
|
+
this.log.debug(`getCurrentPositionState() SUCCESSFUL for ${this.name} return value ${state}, ` +
|
|
86
|
+
`setting to ${this.currentPositionState}`);
|
|
87
|
+
resolve(this.currentPositionState);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
this.log.error('getCurrentPositionState() FAILED for ' + this.name);
|
|
91
|
+
reject(new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */));
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Handle the "GET" requests from HomeKit
|
|
98
|
+
* These are sent when HomeKit wants to know the current state of the accessory, for example, checking if a Light bulb is on.
|
|
99
|
+
*
|
|
100
|
+
* GET requests should return as fast as possbile. A long delay here will result in
|
|
101
|
+
* HomeKit being unresponsive and a bad user experience in general.
|
|
102
|
+
*
|
|
103
|
+
* If your device takes time to respond you should update the status of your device
|
|
104
|
+
* asynchronously instead using the `updateCharacteristic` method instead.
|
|
105
|
+
|
|
106
|
+
* @example
|
|
107
|
+
* this.service.updateCharacteristic(this.platform.Characteristic.On, true)
|
|
108
|
+
*/
|
|
109
|
+
async getCurrentPosition() {
|
|
110
|
+
// if you need to return an error to show the device as "Not Responding" in the Home app:
|
|
111
|
+
// throw new this.platform.api.hap.HapStatusError(this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE);
|
|
112
|
+
return new Promise((resolve, reject) => {
|
|
113
|
+
if (!this.multiServiceAccessory.isOnline()) {
|
|
114
|
+
this.log.error(this.name + ' is offline');
|
|
115
|
+
return reject(new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */));
|
|
116
|
+
}
|
|
117
|
+
this.getStatus().then(success => {
|
|
118
|
+
if (success) {
|
|
119
|
+
let position = 0;
|
|
120
|
+
if (this.useWindowShadeLevel) {
|
|
121
|
+
position = this.deviceStatus.status.windowShadeLevel.shadeLevel.value;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
position = this.deviceStatus.status.switchLevel.level.value;
|
|
125
|
+
}
|
|
126
|
+
this.log.debug('onGet() SUCCESSFUL for ' + this.name + '. value = ' + position);
|
|
127
|
+
resolve(position);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
this.log.error('onGet() FAILED for ' + this.name + '. Undefined value');
|
|
131
|
+
reject(new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */));
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
processEvent(event) {
|
|
137
|
+
if (event.capability === 'windowShadeLevel' || event.capability === 'switchLevel') {
|
|
138
|
+
this.log.debug(`Event updating windowShadeLevel capability for ${this.name} to ${event.value}`);
|
|
139
|
+
this.service.updateCharacteristic(this.platform.Characteristic.CurrentPosition, event.value);
|
|
140
|
+
}
|
|
141
|
+
else if (event.capability === 'windowShade') {
|
|
142
|
+
this.log.debug(`Event updating windowShade capability for ${this.name} to ${event.value}`);
|
|
143
|
+
if (event.value === 'opening') {
|
|
144
|
+
this.currentPositionState = this.states.decreasing;
|
|
145
|
+
}
|
|
146
|
+
else if (event.value === 'closing') {
|
|
147
|
+
this.currentPositionState = this.states.increasing;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
this.currentPositionState = this.states.stopped;
|
|
151
|
+
}
|
|
152
|
+
this.log.debug(`From event, setting characteristic to ${this.currentPositionState}`);
|
|
153
|
+
this.service.updateCharacteristic(this.platform.Characteristic.PositionState, this.currentPositionState);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.WindowCoveringService = WindowCoveringService;
|
|
158
|
+
//# sourceMappingURL=windowCoveringService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windowCoveringService.js","sourceRoot":"","sources":["../../src/services/windowCoveringService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This is the name of the platform that users will use to register the plugin in the Homebridge config.json
|
|
3
|
+
*/
|
|
4
|
+
export declare const PLATFORM_NAME = "HomeBridgeSmartThings";
|
|
5
|
+
/**
|
|
6
|
+
* This must match the name of your plugin as defined the package.json
|
|
7
|
+
*/
|
|
8
|
+
export declare const PLUGIN_NAME = "homebridge-smartthings-ik";
|
|
9
|
+
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,aAAa,0BAA0B,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,WAAW,8BAA8B,CAAC"}
|
package/dist/settings.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PLUGIN_NAME = exports.PLATFORM_NAME = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* This is the name of the platform that users will use to register the plugin in the Homebridge config.json
|
|
6
|
+
*/
|
|
7
|
+
exports.PLATFORM_NAME = 'HomeBridgeSmartThings';
|
|
8
|
+
/**
|
|
9
|
+
* This must match the name of your plugin as defined the package.json
|
|
10
|
+
*/
|
|
11
|
+
exports.PLUGIN_NAME = 'homebridge-smartthings-ik';
|
|
12
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,aAAa,GAAG,uBAAuB,CAAC;AAErD;;GAEG;AACU,QAAA,WAAW,GAAG,2BAA2B,CAAC"}
|