@switchbot/homebridge-switchbot 2.1.0-beta.0 → 2.1.0-beta.10

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 (61) hide show
  1. package/CHANGELOG.md +7 -2
  2. package/config.schema.json +10 -0
  3. package/dist/device/bot.d.ts +2 -1
  4. package/dist/device/bot.d.ts.map +1 -1
  5. package/dist/device/bot.js +33 -8
  6. package/dist/device/bot.js.map +1 -1
  7. package/dist/device/ceilinglight.d.ts.map +1 -1
  8. package/dist/device/ceilinglight.js +15 -11
  9. package/dist/device/ceilinglight.js.map +1 -1
  10. package/dist/device/colorbulb.d.ts.map +1 -1
  11. package/dist/device/colorbulb.js +15 -10
  12. package/dist/device/colorbulb.js.map +1 -1
  13. package/dist/device/contact.d.ts.map +1 -1
  14. package/dist/device/contact.js +8 -2
  15. package/dist/device/contact.js.map +1 -1
  16. package/dist/device/curtain.d.ts.map +1 -1
  17. package/dist/device/curtain.js +17 -6
  18. package/dist/device/curtain.js.map +1 -1
  19. package/dist/device/humidifier.d.ts.map +1 -1
  20. package/dist/device/humidifier.js +12 -3
  21. package/dist/device/humidifier.js.map +1 -1
  22. package/dist/device/lock.d.ts.map +1 -1
  23. package/dist/device/lock.js +15 -4
  24. package/dist/device/lock.js.map +1 -1
  25. package/dist/device/meter.d.ts.map +1 -1
  26. package/dist/device/meter.js +8 -2
  27. package/dist/device/meter.js.map +1 -1
  28. package/dist/device/meterplus.d.ts.map +1 -1
  29. package/dist/device/meterplus.js +8 -2
  30. package/dist/device/meterplus.js.map +1 -1
  31. package/dist/device/motion.d.ts.map +1 -1
  32. package/dist/device/motion.js +8 -2
  33. package/dist/device/motion.js.map +1 -1
  34. package/dist/device/plug.d.ts.map +1 -1
  35. package/dist/device/plug.js +15 -4
  36. package/dist/device/plug.js.map +1 -1
  37. package/dist/device/striplight.d.ts.map +1 -1
  38. package/dist/device/striplight.js +15 -11
  39. package/dist/device/striplight.js.map +1 -1
  40. package/dist/platform.d.ts +0 -1
  41. package/dist/platform.d.ts.map +1 -1
  42. package/dist/platform.js +91 -93
  43. package/dist/platform.js.map +1 -1
  44. package/dist/settings.d.ts +1 -0
  45. package/dist/settings.d.ts.map +1 -1
  46. package/dist/settings.js.map +1 -1
  47. package/package.json +3 -3
  48. package/src/device/bot.ts +31 -12
  49. package/src/device/ceilinglight.ts +12 -11
  50. package/src/device/colorbulb.ts +12 -10
  51. package/src/device/contact.ts +6 -2
  52. package/src/device/curtain.ts +14 -6
  53. package/src/device/humidifier.ts +9 -3
  54. package/src/device/lock.ts +12 -4
  55. package/src/device/meter.ts +6 -2
  56. package/src/device/meterplus.ts +6 -2
  57. package/src/device/motion.ts +6 -2
  58. package/src/device/plug.ts +12 -4
  59. package/src/device/striplight.ts +12 -11
  60. package/src/platform.ts +94 -98
  61. package/src/settings.ts +1 -0
package/src/platform.ts CHANGED
@@ -42,7 +42,6 @@ export class SwitchBotPlatform implements DynamicPlatformPlugin {
42
42
  public readonly accessories: PlatformAccessory[] = [];
43
43
 
44
44
  version = require('../package.json').version || '1.12.8'; // eslint-disable-line @typescript-eslint/no-var-requires
45
- deviceStatus!: any;
46
45
  debugMode!: boolean;
47
46
  platformLogging?: string;
48
47
 
@@ -235,9 +234,11 @@ export class SwitchBotPlatform implements DynamicPlatformPlugin {
235
234
 
236
235
  // set the refresh token
237
236
  pluginConfig.credentials.token = this.config.credentials?.openToken;
238
- pluginConfig.credentials.openToken = 'Delete';
237
+ if (pluginConfig.credentials.token) {
238
+ pluginConfig.credentials.openToken = undefined;
239
+ }
239
240
 
240
- this.debugWarnLog(`Token: ${pluginConfig.credentials.token}`);
241
+ this.debugWarnLog(`token: ${pluginConfig.credentials.token}`);
241
242
 
242
243
  // save the config, ensuring we maintain pretty json
243
244
  writeFileSync(this.api.user.configPath(), JSON.stringify(currentConfig, null, 4));
@@ -279,117 +280,95 @@ export class SwitchBotPlatform implements DynamicPlatformPlugin {
279
280
  let rawData = '';
280
281
  res.on('data', (d) => {
281
282
  rawData += d;
282
- this.deviceStatus = d;
283
283
  this.debugLog(`d: ${d}`);
284
284
  });
285
285
  res.on('end', () => {
286
286
  try {
287
287
  const devicesAPI = JSON.parse(rawData);
288
288
  this.debugLog(`devicesAPI: ${superStringify(devicesAPI.body)}`);
289
-
290
289
  // SwitchBot Devices
291
- /*if (devicesAPI.body.deviceList.length !== 0) {
290
+ if (devicesAPI.body.deviceList.length !== 0) {
292
291
  this.infoLog(`Total SwitchBot Devices Found: ${devicesAPI.body.deviceList.length}`);
293
292
  } else {
294
293
  this.debugLog(`Total SwitchBot Devices Found: ${devicesAPI.body.deviceList.length}`);
295
- }*/
296
- const deviceBodyList = devicesAPI.body.deviceList;
297
- let deviceLists: any[];
298
- if (deviceBodyList) {
299
- if (deviceBodyList.length > 1) {
300
- deviceLists = deviceBodyList;
301
- this.infoLog(`Total SwitchBot Devices Found: ${deviceLists.length}`);
302
- } else {
303
- deviceLists = [deviceBodyList];
304
- this.infoLog(`Total SwitchBot Devices Found: ${deviceLists.length}`);
305
- }
306
- if (!this.config.options?.devices) {
307
- this.debugLog(`SwitchBot Device Config Not Set: ${superStringify(this.config.options?.devices)}`);
308
- const devices = deviceLists.map((v: any) => v);
309
- for (const device of devices) {
310
- if (device.deviceType) {
311
- if (device.configDeviceName) {
312
- device.deviceName = device.configDeviceName;
313
- }
314
- this.createDevice(device);
294
+ }
295
+ const deviceLists = devicesAPI.body.deviceList;
296
+ if (!this.config.options?.devices) {
297
+ this.debugLog(`SwitchBot Device Config Not Set: ${JSON.stringify(this.config.options?.devices)}`);
298
+ const devices = deviceLists.map((v: any) => v);
299
+ for (const device of devices) {
300
+ if (device.deviceType) {
301
+ if (device.configDeviceName) {
302
+ device.deviceName = device.configDeviceName;
315
303
  }
304
+ this.createDevice(device);
316
305
  }
317
- } else if (this.config.credentials?.token && this.config.options.devices) {
318
- this.debugLog(`SwitchBot Device Config Set: ${superStringify(this.config.options?.devices)}`);
319
- const deviceConfigs = this.config.options?.devices;
320
-
321
- const mergeBydeviceId = (a1: { deviceId: string }[], a2: any[]) =>
322
- a1.map((itm: { deviceId: string }) => ({
323
- ...a2.find(
324
- (item: { deviceId: string }) =>
325
- item.deviceId.toUpperCase().replace(/[^A-Z0-9]+/g, '') === itm.deviceId.toUpperCase().replace(/[^A-Z0-9]+/g, '') && item,
326
- ),
327
- ...itm,
328
- }));
329
-
330
- const devices = mergeBydeviceId(deviceLists, deviceConfigs);
331
- this.debugLog(`SwitchBot Devices: ${superStringify(devices)}`);
332
- for (const device of devices) {
333
- if (device.deviceType) {
334
- if (device.configDeviceName) {
335
- device.deviceName = device.configDeviceName;
336
- }
337
- this.createDevice(device);
306
+ }
307
+ } else if (this.config.credentials?.token && this.config.options.devices) {
308
+ this.debugLog(`SwitchBot Device Config Set: ${superStringify(this.config.options?.devices)}`);
309
+ const deviceConfigs = this.config.options?.devices;
310
+
311
+ const mergeBydeviceId = (a1: { deviceId: string }[], a2: any[]) =>
312
+ a1.map((itm: { deviceId: string }) => ({
313
+ ...a2.find(
314
+ (item: { deviceId: string }) =>
315
+ item.deviceId.toUpperCase().replace(/[^A-Z0-9]+/g, '') === itm.deviceId.toUpperCase().replace(/[^A-Z0-9]+/g, '') && item,
316
+ ),
317
+ ...itm,
318
+ }));
319
+
320
+ const devices = mergeBydeviceId(deviceLists, deviceConfigs);
321
+ this.debugLog(`SwitchBot Devices: ${superStringify(devices)}`);
322
+ for (const device of devices) {
323
+ if (device.deviceType) {
324
+ if (device.configDeviceName) {
325
+ device.deviceName = device.configDeviceName;
338
326
  }
327
+ this.createDevice(device);
339
328
  }
340
- } else {
341
- this.errorLog('SwitchBot Token Supplied, Issue with Auth.');
342
329
  }
343
330
  } else {
344
- this.errorLog(`SwitchBot Device Request Issue: ${this.deviceStatus}, Submit Bugs Here: ` + 'https://tinyurl.com/SwitchBotBug');
331
+ this.errorLog('SwitchBot Token Supplied, Issue with Auth.');
345
332
  }
333
+
346
334
  // IR Devices
347
- /*if (devicesAPI.body.infraredRemoteList.length !== 0) {
335
+ if (devicesAPI.body.infraredRemoteList.length !== 0) {
348
336
  this.infoLog(`Total IR Devices Found: ${devicesAPI.body.infraredRemoteList.length}`);
349
337
  } else {
350
338
  this.debugLog(`Total IR Devices Found: ${devicesAPI.body.infraredRemoteList.length}`);
351
- }*/
352
- const irDeviceBodyList = devicesAPI.body.infraredRemoteList;
353
- let irDeviceLists: any[];
354
- if (irDeviceBodyList) {
355
- if (irDeviceBodyList.length > 1) {
356
- irDeviceLists = irDeviceBodyList;
357
- this.infoLog(`Total IR Devices Found: ${irDeviceLists.length}`);
358
- } else {
359
- irDeviceLists = [irDeviceBodyList];
360
- this.infoLog(`Total IR Devices Found: ${irDeviceLists.length}`);
361
- }
362
- if (!this.config.options?.irdevices) {
363
- this.debugLog(`IR Device Config Not Set: ${superStringify(this.config.options?.irdevices)}`);
364
- const devices = irDeviceLists.map((v: any) => v);
365
- for (const device of devices) {
366
- if (device.remoteType) {
367
- this.createIRDevice(device);
368
- }
369
- }
370
- } else {
371
- this.debugLog(`IR Device Config Set: ${superStringify(this.config.options?.irdevices)}`);
372
- const irDeviceConfig = this.config.options?.irdevices;
373
-
374
- const mergeIRBydeviceId = (a1: { deviceId: string }[], a2: any[]) =>
375
- a1.map((itm: { deviceId: string }) => ({
376
- ...a2.find(
377
- (item: { deviceId: string }) =>
378
- item.deviceId.toUpperCase().replace(/[^A-Z0-9]+/g, '') === itm.deviceId.toUpperCase().replace(/[^A-Z0-9]+/g, '') && item,
379
- ),
380
- ...itm,
381
- }));
382
-
383
- const devices = mergeIRBydeviceId(irDeviceLists, irDeviceConfig);
384
- this.debugLog(`IR Devices: ${superStringify(devices)}`);
385
- for (const device of devices) {
386
- if (device.remoteType) {
387
- this.createIRDevice(device);
388
- }
339
+ }
340
+ if (devicesAPI.body.infraredRemoteList.length !== 0) {
341
+ this.infoLog(`Total IR Devices Found: ${devicesAPI.body.infraredRemoteList.length}`);
342
+ } else {
343
+ this.debugLog(`Total IR Devices Found: ${devicesAPI.body.infraredRemoteList.length}`);
344
+ }
345
+ const irDeviceLists = devicesAPI.body.infraredRemoteList;
346
+ if (!this.config.options?.irdevices) {
347
+ this.debugLog(`IR Device Config Not Set: ${JSON.stringify(this.config.options?.irdevices)}`);
348
+ const devices = irDeviceLists.map((v: any) => v);
349
+ for (const device of devices) {
350
+ if (device.remoteType) {
351
+ this.createIRDevice(device);
389
352
  }
390
353
  }
391
354
  } else {
392
- this.errorLog(`SwitchBot IR Device Request Issue: ${this.deviceStatus}, Submit Bugs Here: ` + 'https://tinyurl.com/SwitchBotBug');
355
+ this.debugLog(`IR Device Config Set: ${superStringify(this.config.options?.irdevices)}`);
356
+ const irDeviceConfig = this.config.options?.irdevices;
357
+
358
+ const mergeIRBydeviceId = (a1: { deviceId: string }[], a2: any[]) =>
359
+ a1.map((itm: { deviceId: string }) => ({
360
+ ...a2.find(
361
+ (item: { deviceId: string }) =>
362
+ item.deviceId.toUpperCase().replace(/[^A-Z0-9]+/g, '') === itm.deviceId.toUpperCase().replace(/[^A-Z0-9]+/g, '') && item,
363
+ ),
364
+ ...itm,
365
+ }));
366
+
367
+ const devices = mergeIRBydeviceId(irDeviceLists, irDeviceConfig);
368
+ this.debugLog(`IR Devices: ${superStringify(devices)}`);
369
+ for (const device of devices) {
370
+ this.createIRDevice(device);
371
+ }
393
372
  }
394
373
  } catch (e:any) {
395
374
  this.errorLog(`API Request: ${e}, Submit Bugs Here: ` + 'https://tinyurl.com/SwitchBotBug');
@@ -472,6 +451,7 @@ export class SwitchBotPlatform implements DynamicPlatformPlugin {
472
451
  this.createColorBulb(device);
473
452
  break;
474
453
  case 'Ceiling Light':
454
+ case 'Ceiling Light Pro':
475
455
  this.debugLog(`Discovered ${device.deviceType}: ${device.deviceId}`);
476
456
  this.createCeilingLight(device);
477
457
  break;
@@ -494,7 +474,7 @@ export class SwitchBotPlatform implements DynamicPlatformPlugin {
494
474
  }
495
475
 
496
476
  private createIRDevice(device: irdevice & devicesConfig) {
497
- switch (device.remoteType!) {
477
+ switch (device.remoteType) {
498
478
  case 'TV':
499
479
  case 'DIY TV':
500
480
  case 'Projector':
@@ -1752,18 +1732,34 @@ export class SwitchBotPlatform implements DynamicPlatformPlugin {
1752
1732
  `${device.master}, group: ${device.group}, disable_group: ${device.curtain?.disable_group}, connectionType: ${device.connectionType}`);
1753
1733
 
1754
1734
  let registerCurtain: boolean;
1755
- if (device.group && !device.curtain?.disable_group) {
1735
+ if (device.master && device.group) {
1736
+ // OpenAPI: Master Curtains in Group
1756
1737
  registerCurtain = true;
1757
- this.debugLog(`deviceName: ${device.deviceName} [Curtain Config] disable_group: ${device.curtain?.disable_group}`);
1738
+ this.debugLog(`deviceName: ${device.deviceName} [Curtain Config] device.master: ${device.master}, device.group: ${device.group}`
1739
+ + ` connectionType; ${device.connectionType}`);
1758
1740
  this.debugWarnLog(`Device: ${device.deviceName} registerCurtains: ${registerCurtain}`);
1759
- } else if (device.connectionType?.includes('BLE') || device.connectionType === 'Disabled') {
1741
+ } else if (!device.master && device.curtain?.disable_group) { //!device.group && device.connectionType === 'BLE'
1742
+ // OpenAPI: Non-Master Curtain that has Disable Grouping Checked
1743
+ registerCurtain = true;
1744
+ this.debugLog(`deviceName: ${device.deviceName} [Curtain Config] device.master: ${device.master}, disable_group: `
1745
+ + `${device.curtain?.disable_group}, connectionType; ${device.connectionType}`);
1746
+ this.debugWarnLog(`Device: ${device.deviceName} registerCurtains: ${registerCurtain}`);
1747
+ } else if (device.master && !device.group) {
1748
+ // OpenAPI: Master Curtains not in Group
1749
+ registerCurtain = true;
1750
+ this.debugLog(`deviceName: ${device.deviceName} [Curtain Config] device.master: ${device.master}, device.group: ${device.group}`
1751
+ + ` connectionType; ${device.connectionType}`);
1752
+ this.debugWarnLog(`Device: ${device.deviceName} registerCurtains: ${registerCurtain}`);
1753
+ } else if (device.connectionType === 'BLE') {
1754
+ // BLE: Curtains
1760
1755
  registerCurtain = true;
1761
1756
  this.debugLog(`deviceName: ${device.deviceName} [Curtain Config] connectionType: ${device.connectionType}`);
1762
1757
  this.debugWarnLog(`Device: ${device.deviceName} registerCurtains: ${registerCurtain}`);
1763
1758
  } else {
1764
1759
  registerCurtain = false;
1765
- this.errorLog(`deviceName: ${device.deviceName} [Curtain Config] disable_group: ${device.curtain?.disable_group}, UnGrouping ${device.master}`);
1766
- this.debugWarnLog(`Device: ${device.deviceName} registerCurtains: ${registerCurtain}`);
1760
+ this.debugErrorLog(`deviceName: ${device.deviceName} [Curtain Config] disable_group: ${device.curtain?.disable_group},`
1761
+ + ` device.master: ${device.master}, device.group: ${device.group}`);
1762
+ this.debugWarnLog(`Device: ${device.deviceName} registerCurtains: ${registerCurtain}, device.connectionType: ${device.connectionType}`);
1767
1763
  }
1768
1764
  return registerCurtain;
1769
1765
  }
@@ -1781,7 +1777,7 @@ export class SwitchBotPlatform implements DynamicPlatformPlugin {
1781
1777
  async registerDevice(device: device & devicesConfig) {
1782
1778
  device.connectionType = await this.connectionType(device);
1783
1779
  let registerDevice: boolean;
1784
- if (!device.hide_device && device.enableCloudService && device.connectionType === 'BLE/OpenAPI') {
1780
+ if (!device.hide_device && device.connectionType === 'BLE/OpenAPI') {
1785
1781
  if (device.deviceType === 'Curtain') {
1786
1782
  registerDevice = await this.registerCurtains(device);
1787
1783
  this.debugWarnLog(`Device: ${device.deviceName} Curtain registerDevice: ${registerDevice}`);
@@ -1800,7 +1796,7 @@ export class SwitchBotPlatform implements DynamicPlatformPlugin {
1800
1796
  this.debugWarnLog(`Device: ${device.deviceName} registerDevice: ${registerDevice}`);
1801
1797
  }
1802
1798
  this.debugWarnLog(`Device: ${device.deviceName} connectionType: ${device.connectionType}, will display in HomeKit`);
1803
- } else if (!device.hide_device && device.enableCloudService && device.connectionType === 'OpenAPI') {
1799
+ } else if (!device.hide_device && device.connectionType === 'OpenAPI') {
1804
1800
  if (device.deviceType === 'Curtain') {
1805
1801
  registerDevice = await this.registerCurtains(device);
1806
1802
  this.debugWarnLog(`Device: ${device.deviceName} Curtain registerDevice: ${registerDevice}`);
package/src/settings.ts CHANGED
@@ -79,6 +79,7 @@ export type bot = {
79
79
  mode?: string;
80
80
  deviceType?: string;
81
81
  doublePress?: number;
82
+ pushRatePress?: number;
82
83
  allowPush?: boolean;
83
84
  maxRetry?: number;
84
85
  };