@switchbot/homebridge-switchbot 5.0.0-beta.37 → 5.0.0-beta.39
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/dist/homebridge-ui/server.js +12 -8
- package/dist/homebridge-ui/server.js.map +1 -1
- package/dist/platform-hap.d.ts +5 -0
- package/dist/platform-hap.d.ts.map +1 -1
- package/dist/platform-hap.js +128 -1
- package/dist/platform-hap.js.map +1 -1
- package/dist/platform-matter.d.ts +5 -0
- package/dist/platform-matter.d.ts.map +1 -1
- package/dist/platform-matter.js +87 -2
- package/dist/platform-matter.js.map +1 -1
- package/docs/variables/default.html +1 -1
- package/package.json +1 -1
- package/src/homebridge-ui/server.ts +12 -8
- package/src/platform-hap.ts +136 -1
- package/src/platform-matter.ts +94 -5
|
@@ -9,7 +9,10 @@ class PluginUiServer extends HomebridgePluginUiServer {
|
|
|
9
9
|
*/
|
|
10
10
|
this.onRequest('getCachedAccessories', () => {
|
|
11
11
|
try {
|
|
12
|
-
|
|
12
|
+
// Some Homebridge versions store cached accessories with the scoped
|
|
13
|
+
// plugin name ("@switchbot/homebridge-switchbot"); others may use
|
|
14
|
+
// the unscoped id ("homebridge-switchbot"). Check both.
|
|
15
|
+
const pluginNames = ['@switchbot/homebridge-switchbot', 'homebridge-switchbot'];
|
|
13
16
|
const devicesToReturn = [];
|
|
14
17
|
// The path and file of the cached accessories
|
|
15
18
|
const accFile = `${this.homebridgeStoragePath}/accessories/cachedAccessories`;
|
|
@@ -17,11 +20,12 @@ class PluginUiServer extends HomebridgePluginUiServer {
|
|
|
17
20
|
if (fs.existsSync(accFile)) {
|
|
18
21
|
// read the cached accessories file
|
|
19
22
|
const cachedAccessories = JSON.parse(fs.readFileSync(accFile, 'utf8'));
|
|
20
|
-
cachedAccessories.forEach((
|
|
21
|
-
//
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
cachedAccessories.forEach((entry) => {
|
|
24
|
+
// entry shape varies by UI version
|
|
25
|
+
const pluginName = entry.plugin || entry?.accessory?.plugin || entry?.accessory?.pluginName;
|
|
26
|
+
const acc = entry.accessory ?? entry;
|
|
27
|
+
if (pluginNames.includes(pluginName)) {
|
|
28
|
+
devicesToReturn.push(acc);
|
|
25
29
|
}
|
|
26
30
|
});
|
|
27
31
|
}
|
|
@@ -36,7 +40,7 @@ class PluginUiServer extends HomebridgePluginUiServer {
|
|
|
36
40
|
// Provide Matter cached accessories if Homebridge stores them separately.
|
|
37
41
|
this.onRequest('getCachedMatterAccessories', () => {
|
|
38
42
|
try {
|
|
39
|
-
const
|
|
43
|
+
const pluginNames = ['@switchbot/homebridge-switchbot', 'homebridge-switchbot'];
|
|
40
44
|
const devicesToReturn = [];
|
|
41
45
|
const accFile = `${this.homebridgeStoragePath}/accessories/cachedAccessories`;
|
|
42
46
|
const matterFile = `${this.homebridgeStoragePath}/accessories/cachedMatterAccessories`;
|
|
@@ -50,7 +54,7 @@ class PluginUiServer extends HomebridgePluginUiServer {
|
|
|
50
54
|
// Entry shape varies between Homebridge versions; try common locations
|
|
51
55
|
const pluginName = entry.plugin || entry?.accessory?.plugin || entry?.accessory?.pluginName;
|
|
52
56
|
const acc = entry.accessory ?? entry;
|
|
53
|
-
if (pluginName
|
|
57
|
+
if (pluginNames.includes(pluginName)) {
|
|
54
58
|
devicesToReturn.push(acc);
|
|
55
59
|
}
|
|
56
60
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/homebridge-ui/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AAExB,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAA;AAEtE,MAAM,cAAe,SAAQ,wBAAwB;IACnD;QACE,KAAK,EAAE,CAAA;QACP;;;UAGE;QACF,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,GAAG,EAAE;YAC1C,IAAI,CAAC;gBACH,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/homebridge-ui/server.ts"],"names":[],"mappings":"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"}
|
package/dist/platform-hap.d.ts
CHANGED
|
@@ -60,6 +60,11 @@ export declare class SwitchBotHAPPlatform implements DynamicPlatformPlugin {
|
|
|
60
60
|
*/
|
|
61
61
|
verifyConfig(): Promise<void>;
|
|
62
62
|
discoverDevices(): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Restore cached accessories by reinstantiating their device classes
|
|
65
|
+
* This ensures webhook handlers and other functionality are properly set up
|
|
66
|
+
*/
|
|
67
|
+
private restoreCachedAccessories;
|
|
63
68
|
private handleManualConfig;
|
|
64
69
|
/**
|
|
65
70
|
* Check if an API status code indicates success
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-hap.d.ts","sourceRoot":"","sources":["../src/platform-hap.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"platform-hap.d.ts","sourceRoot":"","sources":["../src/platform-hap.ts"],"names":[],"mappings":"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"}
|
package/dist/platform-hap.js
CHANGED
|
@@ -444,6 +444,7 @@ export class SwitchBotHAPPlatform {
|
|
|
444
444
|
let retryCount = 0;
|
|
445
445
|
const maxRetries = this.platformMaxRetries ?? 5;
|
|
446
446
|
const delayBetweenRetries = this.platformDelayBetweenRetries || 5000;
|
|
447
|
+
let rateLimitExceeded = false;
|
|
447
448
|
this.debugWarnLog(`Retry Count: ${retryCount}`);
|
|
448
449
|
this.debugWarnLog(`Max Retries: ${this.platformMaxRetries}`);
|
|
449
450
|
this.debugWarnLog(`Delay Between Retries: ${this.platformDelayBetweenRetries}`);
|
|
@@ -458,6 +459,13 @@ export class SwitchBotHAPPlatform {
|
|
|
458
459
|
break;
|
|
459
460
|
}
|
|
460
461
|
else {
|
|
462
|
+
// Check if rate limit exceeded (429)
|
|
463
|
+
if (statusCode === 429) {
|
|
464
|
+
rateLimitExceeded = true;
|
|
465
|
+
this.warnLog('OpenAPI rate limit (429) exceeded. Falling back to manual device configuration.');
|
|
466
|
+
this.warnLog('Webhook functionality will still work if devices are configured manually.');
|
|
467
|
+
break;
|
|
468
|
+
}
|
|
461
469
|
await this.handleErrorResponse(statusCode, retryCount, maxRetries, delayBetweenRetries);
|
|
462
470
|
retryCount++;
|
|
463
471
|
}
|
|
@@ -468,8 +476,109 @@ export class SwitchBotHAPPlatform {
|
|
|
468
476
|
this.debugErrorLog(`Failed to Discover Devices, Error: ${e.message ?? e}`);
|
|
469
477
|
}
|
|
470
478
|
}
|
|
479
|
+
// If rate limit exceeded or retries exhausted, try to load from manual config or cached accessories
|
|
480
|
+
if (rateLimitExceeded || retryCount >= maxRetries) {
|
|
481
|
+
const hasCachedAccessories = this.accessories.length > 0;
|
|
482
|
+
const hasManualConfig = this.config.options?.devices || this.config.options?.irdevices;
|
|
483
|
+
if (hasManualConfig || hasCachedAccessories) {
|
|
484
|
+
if (hasCachedAccessories) {
|
|
485
|
+
this.warnLog(`Found ${this.accessories.length} cached accessories from previous sessions.`);
|
|
486
|
+
this.warnLog('Reinstantiating device classes to enable webhook handlers...');
|
|
487
|
+
await this.restoreCachedAccessories();
|
|
488
|
+
}
|
|
489
|
+
if (hasManualConfig) {
|
|
490
|
+
this.warnLog('Attempting to load devices from manual configuration...');
|
|
491
|
+
await this.handleManualConfig();
|
|
492
|
+
}
|
|
493
|
+
if (hasCachedAccessories) {
|
|
494
|
+
this.infoLog('Cached accessories restored. Webhook functionality is active.');
|
|
495
|
+
this.infoLog('Device discovery will resume when API rate limit resets.');
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
else {
|
|
499
|
+
this.errorLog('OpenAPI unavailable and no cached accessories or manual device configuration found.');
|
|
500
|
+
this.errorLog('Please configure devices manually in the plugin settings to use webhook functionality.');
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Restore cached accessories by reinstantiating their device classes
|
|
506
|
+
* This ensures webhook handlers and other functionality are properly set up
|
|
507
|
+
*/
|
|
508
|
+
async restoreCachedAccessories() {
|
|
509
|
+
this.debugLog('Restoring cached accessories and setting up webhook handlers...');
|
|
510
|
+
for (const accessory of this.accessories) {
|
|
511
|
+
try {
|
|
512
|
+
const device = accessory.context.device;
|
|
513
|
+
const deviceType = accessory.context.deviceType || device?.deviceType;
|
|
514
|
+
const deviceId = accessory.context.deviceId || device?.deviceId;
|
|
515
|
+
if (!device || !deviceType || !deviceId) {
|
|
516
|
+
this.debugWarnLog(`Skipping cached accessory ${accessory.displayName} - missing context data`);
|
|
517
|
+
continue;
|
|
518
|
+
}
|
|
519
|
+
this.debugLog(`Reinstantiating ${deviceType} for cached accessory: ${accessory.displayName}`);
|
|
520
|
+
// Reinstantiate the device class based on deviceType
|
|
521
|
+
const deviceTypeHandlers = {
|
|
522
|
+
'Humidifier': Humidifier,
|
|
523
|
+
'Humidifier2': Humidifier,
|
|
524
|
+
'Hub 2': Hub,
|
|
525
|
+
'Hub 3': Hub,
|
|
526
|
+
'Bot': Bot,
|
|
527
|
+
'Relay Switch 1': RelaySwitch,
|
|
528
|
+
'Relay Switch 1PM': RelaySwitch,
|
|
529
|
+
'Meter': Meter,
|
|
530
|
+
'MeterPlus': MeterPlus,
|
|
531
|
+
'Meter Plus (JP)': MeterPlus,
|
|
532
|
+
'MeterPro': MeterPro,
|
|
533
|
+
'MeterPro(CO2)': MeterPro,
|
|
534
|
+
'WoIOSensor': IOSensor,
|
|
535
|
+
'Water Detector': WaterDetector,
|
|
536
|
+
'Motion Sensor': Motion,
|
|
537
|
+
'Contact Sensor': Contact,
|
|
538
|
+
'Curtain': Curtain,
|
|
539
|
+
'Curtain3': Curtain,
|
|
540
|
+
'WoRollerShade': Curtain,
|
|
541
|
+
'Roller Shade': Curtain,
|
|
542
|
+
'Blind Tilt': BlindTilt,
|
|
543
|
+
'Plug': Plug,
|
|
544
|
+
'Plug Mini (US)': Plug,
|
|
545
|
+
'Plug Mini (JP)': Plug,
|
|
546
|
+
'Smart Lock': Lock,
|
|
547
|
+
'Smart Lock Pro': Lock,
|
|
548
|
+
'Color Bulb': ColorBulb,
|
|
549
|
+
'K10+': RobotVacuumCleaner,
|
|
550
|
+
'K10+ Pro': RobotVacuumCleaner,
|
|
551
|
+
'WoSweeper': RobotVacuumCleaner,
|
|
552
|
+
'WoSweeperMini': RobotVacuumCleaner,
|
|
553
|
+
'Robot Vacuum Cleaner S1': RobotVacuumCleaner,
|
|
554
|
+
'Robot Vacuum Cleaner S1 Plus': RobotVacuumCleaner,
|
|
555
|
+
'Robot Vacuum Cleaner S10': RobotVacuumCleaner,
|
|
556
|
+
'Ceiling Light': CeilingLight,
|
|
557
|
+
'Ceiling Light Pro': CeilingLight,
|
|
558
|
+
'Strip Light': StripLight,
|
|
559
|
+
'Battery Circulator Fan': Fan,
|
|
560
|
+
'Air Purifier PM2.5': AirPurifier,
|
|
561
|
+
'Air Purifier Table PM2.5': AirPurifier,
|
|
562
|
+
'Air Purifier VOC': AirPurifier,
|
|
563
|
+
'Air Purifier Table VOC': AirPurifier,
|
|
564
|
+
};
|
|
565
|
+
const DeviceClass = deviceTypeHandlers[deviceType];
|
|
566
|
+
if (DeviceClass) {
|
|
567
|
+
new DeviceClass(this, accessory, device);
|
|
568
|
+
this.debugSuccessLog(`Successfully restored ${deviceType}: ${accessory.displayName}`);
|
|
569
|
+
}
|
|
570
|
+
else {
|
|
571
|
+
this.debugLog(`No handler for device type: ${deviceType}`);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
catch (e) {
|
|
575
|
+
this.errorLog(`Failed to restore cached accessory ${accessory.displayName}, Error: ${e.message ?? e}`);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
this.infoLog(`Restored ${this.accessories.length} cached accessories with webhook support`);
|
|
471
579
|
}
|
|
472
580
|
async handleManualConfig() {
|
|
581
|
+
// Handle regular devices
|
|
473
582
|
if (this.config.options?.devices) {
|
|
474
583
|
this.debugLog(`SwitchBot Device Manual Config Set: ${JSON.stringify(this.config.options?.devices)}`);
|
|
475
584
|
const devices = this.config.options.devices.map((v) => v);
|
|
@@ -488,7 +597,25 @@ export class SwitchBotHAPPlatform {
|
|
|
488
597
|
}
|
|
489
598
|
}
|
|
490
599
|
}
|
|
491
|
-
|
|
600
|
+
// Handle IR devices
|
|
601
|
+
if (this.config.options?.irdevices) {
|
|
602
|
+
this.debugLog(`SwitchBot IR Device Manual Config Set: ${JSON.stringify(this.config.options?.irdevices)}`);
|
|
603
|
+
const irdevices = this.config.options.irdevices.map((v) => v);
|
|
604
|
+
for (const irdevice of irdevices) {
|
|
605
|
+
irdevice.remoteType = irdevice.configRemoteType !== undefined ? irdevice.configRemoteType : 'Unknown';
|
|
606
|
+
irdevice.deviceName = irdevice.configDeviceName !== undefined ? irdevice.configDeviceName : 'Unknown';
|
|
607
|
+
try {
|
|
608
|
+
this.debugLog(`IR deviceId: ${irdevice.deviceId}`);
|
|
609
|
+
if (irdevice.remoteType) {
|
|
610
|
+
await this.createIRDevice(irdevice);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
catch (error) {
|
|
614
|
+
this.errorLog(`failed to create IR device, Error: ${error}`);
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
if (!this.config.options?.devices && !this.config.options?.irdevices) {
|
|
492
619
|
this.errorLog('Neither SwitchBot Token or Device Config are set.');
|
|
493
620
|
}
|
|
494
621
|
}
|