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.
Files changed (142) hide show
  1. package/.devcontainer/Dockerfile +16 -0
  2. package/.devcontainer/devcontainer.json +36 -0
  3. package/LICENSE +176 -0
  4. package/README.md +114 -0
  5. package/config.schema.json +134 -0
  6. package/dist/auth/auth.d.ts +23 -0
  7. package/dist/auth/auth.d.ts.map +1 -0
  8. package/dist/auth/auth.js +168 -0
  9. package/dist/auth/auth.js.map +1 -0
  10. package/dist/auth/tokenManager.d.ts +36 -0
  11. package/dist/auth/tokenManager.d.ts.map +1 -0
  12. package/dist/auth/tokenManager.js +180 -0
  13. package/dist/auth/tokenManager.js.map +1 -0
  14. package/dist/basePlatformAccessory.d.ts +49 -0
  15. package/dist/basePlatformAccessory.d.ts.map +1 -0
  16. package/dist/basePlatformAccessory.js +209 -0
  17. package/dist/basePlatformAccessory.js.map +1 -0
  18. package/dist/index.d.ts +7 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +7 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/keyValues.d.ts +4 -0
  23. package/dist/keyValues.d.ts.map +1 -0
  24. package/dist/keyValues.js +12 -0
  25. package/dist/keyValues.js.map +1 -0
  26. package/dist/multiServiceAccessory.d.ts +60 -0
  27. package/dist/multiServiceAccessory.d.ts.map +1 -0
  28. package/dist/multiServiceAccessory.js +398 -0
  29. package/dist/multiServiceAccessory.js.map +1 -0
  30. package/dist/platform.d.ts +42 -0
  31. package/dist/platform.d.ts.map +1 -0
  32. package/dist/platform.js +302 -0
  33. package/dist/platform.js.map +1 -0
  34. package/dist/services/airConditionerService.d.ts +52 -0
  35. package/dist/services/airConditionerService.d.ts.map +1 -0
  36. package/dist/services/airConditionerService.js +438 -0
  37. package/dist/services/airConditionerService.js.map +1 -0
  38. package/dist/services/baseService.d.ts +21 -0
  39. package/dist/services/baseService.d.ts.map +1 -0
  40. package/dist/services/baseService.js +63 -0
  41. package/dist/services/baseService.js.map +1 -0
  42. package/dist/services/batteryService.d.ts +10 -0
  43. package/dist/services/batteryService.d.ts.map +1 -0
  44. package/dist/services/batteryService.js +71 -0
  45. package/dist/services/batteryService.js.map +1 -0
  46. package/dist/services/carbonMonoxideDetector.d.ts +11 -0
  47. package/dist/services/carbonMonoxideDetector.d.ts.map +1 -0
  48. package/dist/services/carbonMonoxideDetector.js +28 -0
  49. package/dist/services/carbonMonoxideDetector.js.map +1 -0
  50. package/dist/services/contactSensorService.d.ts +10 -0
  51. package/dist/services/contactSensorService.d.ts.map +1 -0
  52. package/dist/services/contactSensorService.js +28 -0
  53. package/dist/services/contactSensorService.js.map +1 -0
  54. package/dist/services/doorService.d.ts +16 -0
  55. package/dist/services/doorService.d.ts.map +1 -0
  56. package/dist/services/doorService.js +138 -0
  57. package/dist/services/doorService.js.map +1 -0
  58. package/dist/services/fanSpeedService.d.ts +15 -0
  59. package/dist/services/fanSpeedService.d.ts.map +1 -0
  60. package/dist/services/fanSpeedService.js +153 -0
  61. package/dist/services/fanSpeedService.js.map +1 -0
  62. package/dist/services/fanSwitchLevelService.d.ts +14 -0
  63. package/dist/services/fanSwitchLevelService.d.ts.map +1 -0
  64. package/dist/services/fanSwitchLevelService.js +121 -0
  65. package/dist/services/fanSwitchLevelService.js.map +1 -0
  66. package/dist/services/humidityService.d.ts +10 -0
  67. package/dist/services/humidityService.d.ts.map +1 -0
  68. package/dist/services/humidityService.js +23 -0
  69. package/dist/services/humidityService.js.map +1 -0
  70. package/dist/services/leakDetector.d.ts +10 -0
  71. package/dist/services/leakDetector.d.ts.map +1 -0
  72. package/dist/services/leakDetector.js +27 -0
  73. package/dist/services/leakDetector.js.map +1 -0
  74. package/dist/services/lightSensorService.d.ts +10 -0
  75. package/dist/services/lightSensorService.d.ts.map +1 -0
  76. package/dist/services/lightSensorService.js +24 -0
  77. package/dist/services/lightSensorService.js.map +1 -0
  78. package/dist/services/lightService.d.ts +26 -0
  79. package/dist/services/lightService.d.ts.map +1 -0
  80. package/dist/services/lightService.js +340 -0
  81. package/dist/services/lightService.js.map +1 -0
  82. package/dist/services/lockService.d.ts +16 -0
  83. package/dist/services/lockService.d.ts.map +1 -0
  84. package/dist/services/lockService.js +128 -0
  85. package/dist/services/lockService.js.map +1 -0
  86. package/dist/services/motionService.d.ts +10 -0
  87. package/dist/services/motionService.d.ts.map +1 -0
  88. package/dist/services/motionService.js +23 -0
  89. package/dist/services/motionService.js.map +1 -0
  90. package/dist/services/occupancySensorService.d.ts +10 -0
  91. package/dist/services/occupancySensorService.d.ts.map +1 -0
  92. package/dist/services/occupancySensorService.js +23 -0
  93. package/dist/services/occupancySensorService.js.map +1 -0
  94. package/dist/services/sensorService.d.ts +15 -0
  95. package/dist/services/sensorService.d.ts.map +1 -0
  96. package/dist/services/sensorService.js +69 -0
  97. package/dist/services/sensorService.js.map +1 -0
  98. package/dist/services/smartThingsCommand.d.ts +7 -0
  99. package/dist/services/smartThingsCommand.d.ts.map +1 -0
  100. package/dist/services/smartThingsCommand.js +12 -0
  101. package/dist/services/smartThingsCommand.js.map +1 -0
  102. package/dist/services/smokeDetector.d.ts +10 -0
  103. package/dist/services/smokeDetector.d.ts.map +1 -0
  104. package/dist/services/smokeDetector.js +27 -0
  105. package/dist/services/smokeDetector.js.map +1 -0
  106. package/dist/services/statelessProgrammableSwitchService.d.ts +12 -0
  107. package/dist/services/statelessProgrammableSwitchService.d.ts.map +1 -0
  108. package/dist/services/statelessProgrammableSwitchService.js +94 -0
  109. package/dist/services/statelessProgrammableSwitchService.js.map +1 -0
  110. package/dist/services/switchService.d.ts +12 -0
  111. package/dist/services/switchService.d.ts.map +1 -0
  112. package/dist/services/switchService.js +72 -0
  113. package/dist/services/switchService.js.map +1 -0
  114. package/dist/services/temperatureService.d.ts +11 -0
  115. package/dist/services/temperatureService.d.ts.map +1 -0
  116. package/dist/services/temperatureService.js +32 -0
  117. package/dist/services/temperatureService.js.map +1 -0
  118. package/dist/services/thermostatService.d.ts +22 -0
  119. package/dist/services/thermostatService.d.ts.map +1 -0
  120. package/dist/services/thermostatService.js +273 -0
  121. package/dist/services/thermostatService.js.map +1 -0
  122. package/dist/services/valveService.d.ts +12 -0
  123. package/dist/services/valveService.d.ts.map +1 -0
  124. package/dist/services/valveService.js +59 -0
  125. package/dist/services/valveService.js.map +1 -0
  126. package/dist/services/windowCoveringService.d.ts +36 -0
  127. package/dist/services/windowCoveringService.d.ts.map +1 -0
  128. package/dist/services/windowCoveringService.js +158 -0
  129. package/dist/services/windowCoveringService.js.map +1 -0
  130. package/dist/settings.d.ts +9 -0
  131. package/dist/settings.d.ts.map +1 -0
  132. package/dist/settings.js +12 -0
  133. package/dist/settings.js.map +1 -0
  134. package/dist/webhook/subscriptionHandler.d.ts +32 -0
  135. package/dist/webhook/subscriptionHandler.d.ts.map +1 -0
  136. package/dist/webhook/subscriptionHandler.js +68 -0
  137. package/dist/webhook/subscriptionHandler.js.map +1 -0
  138. package/dist/webhook/webhookServer.d.ts +19 -0
  139. package/dist/webhook/webhookServer.d.ts.map +1 -0
  140. package/dist/webhook/webhookServer.js +125 -0
  141. package/dist/webhook/webhookServer.js.map +1 -0
  142. package/package.json +57 -0
@@ -0,0 +1,302 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IKHomeBridgeHomebridgePlatform = void 0;
4
+ const axios_1 = require("axios");
5
+ const settings_1 = require("./settings");
6
+ const axios = require("axios");
7
+ //import { BasePlatformAccessory } from './basePlatformAccessory';
8
+ const multiServiceAccessory_1 = require("./multiServiceAccessory");
9
+ const subscriptionHandler_1 = require("./webhook/subscriptionHandler");
10
+ const auth_1 = require("./auth/auth");
11
+ const webhookServer_1 = require("./webhook/webhookServer");
12
+ /**
13
+ * HomebridgePlatform
14
+ * This class is the main constructor for your plugin, this is where you should
15
+ * parse the user config and discover/register accessories with Homebridge.
16
+ */
17
+ class IKHomeBridgeHomebridgePlatform {
18
+ constructor(log, config, api) {
19
+ this.log = log;
20
+ this.config = config;
21
+ this.api = api;
22
+ this.Service = this.api.hap.Service;
23
+ this.Characteristic = this.api.hap.Characteristic;
24
+ // this is used to track restored cached accessories
25
+ this.accessories = [];
26
+ this.locationIDsToIgnore = [];
27
+ this.roomsIDsToIgnore = [];
28
+ this.headerDict = {
29
+ 'Authorization': 'Bearer: ' + this.config.AccessToken,
30
+ };
31
+ this.axInstance = axios.default.create({
32
+ baseURL: this.config.BaseURL,
33
+ headers: this.headerDict,
34
+ });
35
+ this.accessoryObjects = [];
36
+ this.subscriptionHandler = undefined;
37
+ this.log.debug('Finished initializing platform:', this.config.name);
38
+ // Initialize webhook server first
39
+ const webhookServer = new webhookServer_1.WebhookServer(this, this.log);
40
+ // Initialize OAuth2 authentication
41
+ this.auth = new auth_1.SmartThingsAuth(this.config.client_id, this.config.client_secret, this.log, this, this.api.user.storagePath(), webhookServer);
42
+ // Update axios instance with token refresh interceptor
43
+ this.axInstance.interceptors.request.use(async (config) => {
44
+ const token = this.auth.getAccessToken();
45
+ if (token) {
46
+ if (!config.headers) {
47
+ config.headers = new axios_1.AxiosHeaders();
48
+ }
49
+ config.headers.Authorization = `Bearer ${token}`;
50
+ }
51
+ return config;
52
+ });
53
+ // Add response interceptor to handle 401 errors
54
+ this.axInstance.interceptors.response.use((response) => response, async (error) => {
55
+ var _a;
56
+ const originalRequest = error.config;
57
+ // If the error is 401 and we haven't tried to refresh the token yet
58
+ if (((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) === 401 && !originalRequest._retry) {
59
+ originalRequest._retry = true;
60
+ try {
61
+ // Get the current refresh token
62
+ const refreshToken = this.auth.tokenManager.getRefreshToken();
63
+ if (!refreshToken) {
64
+ this.log.error('Cannot refresh token: No refresh token available.');
65
+ this.auth.startAuthFlow(); // Start auth flow if no refresh token
66
+ return Promise.reject(new Error('No refresh token available for automatic refresh.'));
67
+ }
68
+ // Attempt to refresh the token using the specific token
69
+ await this.auth.refreshTokens(refreshToken);
70
+ // Update the Authorization header with the new token
71
+ const newToken = this.auth.getAccessToken();
72
+ if (newToken) {
73
+ if (!originalRequest.headers) {
74
+ originalRequest.headers = new axios_1.AxiosHeaders();
75
+ }
76
+ originalRequest.headers.Authorization = `Bearer ${newToken}`;
77
+ // Retry the original request with the new token
78
+ return this.axInstance(originalRequest);
79
+ }
80
+ }
81
+ catch (refreshError) {
82
+ this.log.error('Token refresh failed:', refreshError);
83
+ // Start new auth flow if refresh fails
84
+ this.auth.startAuthFlow();
85
+ return Promise.reject(refreshError);
86
+ }
87
+ }
88
+ return Promise.reject(error);
89
+ });
90
+ // When this event is fired it means Homebridge has restored all cached accessories from disk.
91
+ // Dynamic Platform plugins should only register new accessories after this event was fired,
92
+ // in order to ensure they weren't added to homebridge already. This event can also be used
93
+ // to start discovery of new accessories.
94
+ this.api.on('didFinishLaunching', async () => {
95
+ log.debug('Executed didFinishLaunching callback');
96
+ try {
97
+ // Initialize OAuth2 flow if needed and wait for it to complete
98
+ const authFlowStarted = await this.auth.initialize();
99
+ // Only proceed with device discovery if auth flow wasn't started and we have a valid token
100
+ if (!authFlowStarted && this.auth.getAccessToken()) {
101
+ // If locations or rooms to ignore are configured, then
102
+ // load request those from Smartthings to build the id lists.
103
+ if (this.config.IgnoreLocations) {
104
+ await this.getLocationsToIgnore();
105
+ }
106
+ const devices = await this.getOnlineDevices();
107
+ if (this.config.UnregisterAll) {
108
+ this.unregisterDevices(devices, true);
109
+ }
110
+ this.discoverDevices(devices);
111
+ this.unregisterDevices(devices);
112
+ // Start subscription service if we have a webhook token
113
+ if (config.WebhookToken && config.WebhookToken !== '') {
114
+ this.subscriptionHandler = new subscriptionHandler_1.SubscriptionHandler(this, this.accessoryObjects, webhookServer);
115
+ this.subscriptionHandler.startService();
116
+ }
117
+ }
118
+ else if (authFlowStarted) {
119
+ // If auth flow was started, log the waiting message
120
+ this.log.info('Waiting for SmartThings authentication to complete...');
121
+ }
122
+ else {
123
+ // Handle case where auth flow wasn't started but token is somehow still invalid (shouldn't happen often)
124
+ this.log.error('Authentication failed or token invalid after initialization.');
125
+ }
126
+ }
127
+ catch (error) {
128
+ this.log.error('Error during platform initialization:', error);
129
+ }
130
+ });
131
+ }
132
+ /**
133
+ * This function is invoked when homebridge restores cached accessories from disk at startup.
134
+ * It should be used to setup event handlers for characteristics and update respective values.
135
+ */
136
+ configureAccessory(accessory) {
137
+ this.log.info('Loading accessory from cache:', accessory.displayName);
138
+ // add the restored accessory to the accessories cache so we can track if it has already been registered
139
+ this.accessories.push(accessory);
140
+ }
141
+ getLocationsToIgnore() {
142
+ this.log.info('Loading locations for exclusion');
143
+ return new Promise((resolve) => {
144
+ this.axInstance.get('locations').then(res => {
145
+ res.data.items.forEach(location => {
146
+ if (this.config.IgnoreLocations.find(l => l.toLowerCase() === location.name.toLowerCase())) {
147
+ this.locationIDsToIgnore.push(location.locationId);
148
+ }
149
+ });
150
+ this.log.info(`Found ${this.locationIDsToIgnore.length} locations to ignore`);
151
+ resolve(true);
152
+ }).catch(reason => {
153
+ this.log.error('Could not load locations: ' + reason + '. You must have r:locations permissions set on the token');
154
+ resolve(true);
155
+ });
156
+ });
157
+ }
158
+ getOnlineDevices() {
159
+ this.log.debug('Discovering devices...');
160
+ const command = 'devices';
161
+ const devices = [];
162
+ return new Promise((resolve, reject) => {
163
+ this.axInstance.get(command).then((res) => {
164
+ res.data.items.forEach((device) => {
165
+ // If an apostrophe is included in the name of the device in SmartThings, it comes over as a Right Single
166
+ // quote which will not match with a single quote in the config. This replaces it so it will match
167
+ if (!device.label) {
168
+ device.label = 'Missing Name';
169
+ }
170
+ let deviceName = '';
171
+ try {
172
+ // deviceName = device.label.toString().replaceAll(String.fromCharCode(8217), '\'');
173
+ deviceName = device.label;
174
+ }
175
+ catch (error) {
176
+ this.log.warn(`Error getting device name for ${device.label}: ${error}`);
177
+ deviceName = device.label;
178
+ }
179
+ if (this.config.IgnoreDevices &&
180
+ //this.config.IgnoreDevices.find(d => d.replaceAll(String.fromCharCode(8217), '\'').toLowerCase() === deviceName.toLowerCase())) {
181
+ this.config.IgnoreDevices.find(d => d.toLowerCase() === deviceName.toLowerCase())) {
182
+ this.log.info(`Ignoring ${device.label} because it is in the Ignore Devices list`);
183
+ return;
184
+ }
185
+ if (!this.locationIDsToIgnore.find(locationID => device.locationId === locationID)) {
186
+ this.log.debug('Pushing ' + device.label);
187
+ devices.push(device);
188
+ }
189
+ else {
190
+ this.log.info(`Ignoring ${device.label} because it is in a location to ignore (${device.locationId})`);
191
+ }
192
+ });
193
+ this.log.debug('Stored all devices.');
194
+ resolve(devices);
195
+ }).catch(error => {
196
+ this.log.error('Error getting devices from Smartthings: ' + error);
197
+ reject();
198
+ });
199
+ });
200
+ }
201
+ unregisterDevices(devices, all = false) {
202
+ const accessoriesToRemove = [];
203
+ //
204
+ // Loop through each accessory. If they are not present in the list
205
+ // of current devices, then unregister them.
206
+ //
207
+ this.accessories.forEach(accessory => {
208
+ if (all) {
209
+ this.log.info('Unregistering all devices');
210
+ this.log.info('Will unregister ' + accessory.context.device.label);
211
+ accessoriesToRemove.push(accessory);
212
+ }
213
+ if (!devices.find(device => {
214
+ return device.deviceId === accessory.UUID;
215
+ })) {
216
+ this.log.info('Will unregister ' + accessory.context.device.label);
217
+ accessoriesToRemove.push(accessory);
218
+ }
219
+ });
220
+ if (accessoriesToRemove.length > 0) {
221
+ this.api.unregisterPlatformAccessories(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, accessoriesToRemove);
222
+ }
223
+ }
224
+ /**
225
+ * This is an example method showing how to register discovered accessories.
226
+ * Accessories must only be registered once, previously created accessories
227
+ * must not be registered again to prevent "duplicate UUID" errors.
228
+ */
229
+ discoverDevices(devices) {
230
+ //
231
+ // for now, unregister all accessories first
232
+ // REMOVE ME
233
+ // this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, this.accessories);
234
+ devices.forEach((device) => {
235
+ this.log.debug('DEVICE DATA: ' + JSON.stringify(device));
236
+ if (this.findSupportedCapability(device)) {
237
+ const existingAccessory = this.accessories.find(accessory => accessory.UUID === device.deviceId);
238
+ if (existingAccessory) {
239
+ // the accessory already exists
240
+ this.log.info('Restoring existing accessory from cache:', existingAccessory.displayName);
241
+ // if you need to update the accessory.context then you should run `api.updatePlatformAccessories`. eg.:
242
+ // existingAccessory.context.device = device;
243
+ // this.api.updatePlatformAccessories([existingAccessory]);
244
+ // create the accessory handler for the restored accessory
245
+ // this is imported from `platformAccessory.ts`
246
+ this.accessoryObjects.push(this.createAccessoryObject(device, existingAccessory));
247
+ // it is possible to remove platform accessories at any time using `api.unregisterPlatformAccessories`, eg.:
248
+ // remove platform accessories when no longer present
249
+ // this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [existingAccessory]);
250
+ // this.log.info('Removing existing accessory from cache:', existingAccessory.displayName);
251
+ }
252
+ else {
253
+ // the accessory does not yet exist, so we need to create it
254
+ this.log.info('Registering new accessory: ' + device.label);
255
+ // create a new accessory
256
+ const accessory = new this.api.platformAccessory(device.label, device.deviceId);
257
+ // store a copy of the device object in the `accessory.context`
258
+ // the `context` property can be used to store any data about the accessory you may need
259
+ accessory.context.device = device;
260
+ // create the accessory handler for the newly create accessory
261
+ // this is imported from `platformAccessory.ts`
262
+ this.accessoryObjects.push(this.createAccessoryObject(device, accessory));
263
+ // link the accessory to your platform
264
+ this.api.registerPlatformAccessories(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, [accessory]);
265
+ }
266
+ }
267
+ });
268
+ }
269
+ findSupportedCapability(device) {
270
+ // Look at capabilities on main component
271
+ // const component = device.components.find(c => c.id === 'main');
272
+ // if (component) {
273
+ // return (component.capabilities.find((ca) => MultiServiceAccessory.capabilitySupported(ca.id)));
274
+ // } else {
275
+ // return (device.components[0].capabilities.find((ca) => MultiServiceAccessory.capabilitySupported(ca.id)));
276
+ // }
277
+ // Look at capabiliiies on all components
278
+ let found = false;
279
+ device.components.forEach(component => {
280
+ if (!found && component.capabilities.find((ca) => multiServiceAccessory_1.MultiServiceAccessory.capabilitySupported(ca.id))) {
281
+ found = true;
282
+ }
283
+ });
284
+ return found;
285
+ }
286
+ createAccessoryObject(device, accessory) {
287
+ // const component = device.components.find(c => c.id === 'main');
288
+ // let capabilities;
289
+ // if (component) {
290
+ // capabilities = component.capabilities;
291
+ // } else {
292
+ // capabilities = device.components[0].capabilities;
293
+ // }
294
+ const acc = new multiServiceAccessory_1.MultiServiceAccessory(this, accessory);
295
+ device.components.forEach(component => {
296
+ acc.addComponent(component.id, component.capabilities.map((c) => c.id));
297
+ });
298
+ return acc;
299
+ }
300
+ }
301
+ exports.IKHomeBridgeHomebridgePlatform = IKHomeBridgeHomebridgePlatform;
302
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { PlatformAccessory } from 'homebridge';
2
+ import { IKHomeBridgeHomebridgePlatform } from '../platform';
3
+ import { MultiServiceAccessory } from '../multiServiceAccessory';
4
+ import { ShortEvent } from '../webhook/subscriptionHandler';
5
+ import { BaseService } from './baseService';
6
+ export declare class AirConditionerService extends BaseService {
7
+ private temperatureUnit;
8
+ private thermostatService;
9
+ private fanService;
10
+ private humidityService;
11
+ private optionalModeSwitchService;
12
+ private optionalMode;
13
+ private lightService;
14
+ constructor(platform: IKHomeBridgeHomebridgePlatform, accessory: PlatformAccessory, componentId: string, capabilities: string[], multiServiceAccessory: MultiServiceAccessory, name: string, deviceStatus: any);
15
+ private isCapabilitySupported;
16
+ private setupThermostat;
17
+ private setupFan;
18
+ private setupOptionalModeSwitch;
19
+ private setupHumiditySensor;
20
+ private setupLightSwitch;
21
+ private getHumidityLevel;
22
+ private levelToFanMode;
23
+ private fanModeToLevel;
24
+ private fanOscillationModeToSwingMode;
25
+ private getLightSwitchState;
26
+ private setLightSwitchState;
27
+ private getLightBrightness;
28
+ private setLightBrightness;
29
+ private setOptionalModeSwitchState;
30
+ private getOptionalModeSwitchState;
31
+ private setSwitchState;
32
+ private getSwitchState;
33
+ private setFanLevel;
34
+ private getFanLevel;
35
+ private setSwingMode;
36
+ private getSwingMode;
37
+ private airConditionerModeToTargetHeatingCoolingState;
38
+ private targetHeatingCoolingStateToAirConditionerMode;
39
+ private getTargetHeatingCoolingState;
40
+ private setTargetHeatingCoolingState;
41
+ private getCurrentHeatingCoolingState;
42
+ private getCurrentTemperature;
43
+ private getTargetTemperature;
44
+ private setTargetTemperature;
45
+ private getTemperatureDisplayUnits;
46
+ private toCelsius;
47
+ private fromCelsius;
48
+ private sendCommandsOrFail;
49
+ private getDeviceStatus;
50
+ processEvent(event: ShortEvent): void;
51
+ }
52
+ //# sourceMappingURL=airConditionerService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"airConditionerService.d.ts","sourceRoot":"","sources":["../../src/services/airConditionerService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAgC,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA0C5C,qBAAa,qBAAsB,SAAQ,WAAW;IAEpD,OAAO,CAAC,eAAe,CAA4C;IAEnE,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,yBAAyB,CAAsB;IACvD,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,YAAY,CAAsB;gBAE9B,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,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,eAAe;IAmCvB,OAAO,CAAC,QAAQ;IA4BhB,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,gBAAgB;YAmBV,gBAAgB;IAK9B,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,6BAA6B;YAUvB,mBAAmB;YAKnB,mBAAmB;YAMnB,kBAAkB;YAKlB,kBAAkB;YAKlB,0BAA0B;YAU1B,0BAA0B;YAO1B,cAAc;YAwBd,cAAc;IAK5B,OAAO,CAAC,WAAW;YAOL,WAAW;IAYzB,OAAO,CAAC,YAAY;YAQN,YAAY;IAQ1B,OAAO,CAAC,6CAA6C;IAgBrD,OAAO,CAAC,6CAA6C;YAcvC,4BAA4B;YAe5B,4BAA4B;YAoB5B,6BAA6B;YAyB7B,qBAAqB;YAkBrB,oBAAoB;IAYlC,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,0BAA0B;IAQlC,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,WAAW;YAIL,kBAAkB;YAYlB,eAAe;IAQtB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;CA2C7C"}