homebridge-tsvesync 1.0.15 → 1.0.19
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/__tests__/mocks/characteristic.mock.d.ts +32 -0
- package/dist/__tests__/mocks/characteristic.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/characteristic.mock.js +36 -0
- package/dist/__tests__/mocks/characteristic.mock.js.map +1 -0
- package/dist/__tests__/mocks/service.mock.d.ts +11 -0
- package/dist/__tests__/mocks/service.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/service.mock.js +19 -0
- package/dist/__tests__/mocks/service.mock.js.map +1 -0
- package/dist/__tests__/setup.d.ts +10 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +82 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/accessories/air-purifier.accessory.d.ts +2 -3
- package/dist/accessories/air-purifier.accessory.d.ts.map +1 -1
- package/dist/accessories/air-purifier.accessory.js +38 -12
- package/dist/accessories/air-purifier.accessory.js.map +1 -1
- package/dist/accessories/base.accessory.d.ts +14 -10
- package/dist/accessories/base.accessory.d.ts.map +1 -1
- package/dist/accessories/base.accessory.js +94 -44
- package/dist/accessories/base.accessory.js.map +1 -1
- package/dist/accessories/fan.accessory.d.ts.map +1 -1
- package/dist/accessories/fan.accessory.js +38 -2
- package/dist/accessories/fan.accessory.js.map +1 -1
- package/dist/accessories/humidifier.accessory.d.ts.map +1 -1
- package/dist/accessories/humidifier.accessory.js +54 -2
- package/dist/accessories/humidifier.accessory.js.map +1 -1
- package/dist/platform.d.ts +13 -0
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +200 -25
- package/dist/platform.js.map +1 -1
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/retry.d.ts +7 -8
- package/dist/utils/retry.d.ts.map +1 -1
- package/dist/utils/retry.js +18 -31
- package/dist/utils/retry.js.map +1 -1
- package/jest.config.js +25 -0
- package/package.json +10 -3
- package/src/__tests__/base.accessory.test.ts +322 -0
- package/src/__tests__/mocks/characteristic.mock.ts +31 -0
- package/src/__tests__/mocks/service.mock.ts +14 -0
- package/src/__tests__/platform.test.ts +347 -0
- package/src/__tests__/setup.ts +80 -0
- package/src/accessories/air-purifier.accessory.ts +37 -12
- package/src/accessories/base.accessory.ts +101 -47
- package/src/accessories/fan.accessory.ts +38 -2
- package/src/accessories/humidifier.accessory.ts +50 -2
- package/src/platform.ts +222 -29
- package/src/types/tsvesync.d.ts +51 -0
- package/src/types.ts +21 -0
- package/src/utils/retry.ts +27 -47
- package/tsconfig.json +5 -4
- package/tsconfig.test.json +12 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare class MockCharacteristic {
|
|
2
|
+
static readonly On = "On";
|
|
3
|
+
static readonly Active = "Active";
|
|
4
|
+
static readonly Name = "Name";
|
|
5
|
+
static readonly Model = "Model";
|
|
6
|
+
static readonly Manufacturer = "Manufacturer";
|
|
7
|
+
static readonly SerialNumber = "SerialNumber";
|
|
8
|
+
static readonly FirmwareRevision = "FirmwareRevision";
|
|
9
|
+
static readonly RotationSpeed = "RotationSpeed";
|
|
10
|
+
static readonly CurrentAirPurifierState = "CurrentAirPurifierState";
|
|
11
|
+
static readonly TargetAirPurifierState = "TargetAirPurifierState";
|
|
12
|
+
static readonly CurrentFanState = "CurrentFanState";
|
|
13
|
+
static readonly TargetFanState = "TargetFanState";
|
|
14
|
+
static readonly FilterChangeIndication = "FilterChangeIndication";
|
|
15
|
+
static readonly FilterLifeLevel = "FilterLifeLevel";
|
|
16
|
+
static readonly AirQuality = "AirQuality";
|
|
17
|
+
static readonly PM2_5Density = "PM2_5Density";
|
|
18
|
+
static readonly CurrentRelativeHumidity = "CurrentRelativeHumidity";
|
|
19
|
+
static readonly TargetRelativeHumidity = "TargetRelativeHumidity";
|
|
20
|
+
static readonly WaterLevel = "WaterLevel";
|
|
21
|
+
static readonly LockPhysicalControls = "LockPhysicalControls";
|
|
22
|
+
static readonly SwingMode = "SwingMode";
|
|
23
|
+
static readonly Brightness = "Brightness";
|
|
24
|
+
static readonly ColorTemperature = "ColorTemperature";
|
|
25
|
+
static readonly Hue = "Hue";
|
|
26
|
+
static readonly Saturation = "Saturation";
|
|
27
|
+
static readonly OutletInUse = "OutletInUse";
|
|
28
|
+
static readonly Voltage = "Voltage";
|
|
29
|
+
static readonly ElectricCurrent = "ElectricCurrent";
|
|
30
|
+
static readonly PowerMeterVisible = "PowerMeterVisible";
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=characteristic.mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"characteristic.mock.d.ts","sourceRoot":"","sources":["../../../src/__tests__/mocks/characteristic.mock.ts"],"names":[],"mappings":"AAAA,qBAAa,kBAAkB;IAC7B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,MAAM,YAAY;IAClC,MAAM,CAAC,QAAQ,CAAC,IAAI,UAAU;IAC9B,MAAM,CAAC,QAAQ,CAAC,KAAK,WAAW;IAChC,MAAM,CAAC,QAAQ,CAAC,YAAY,kBAAkB;IAC9C,MAAM,CAAC,QAAQ,CAAC,YAAY,kBAAkB;IAC9C,MAAM,CAAC,QAAQ,CAAC,gBAAgB,sBAAsB;IACtD,MAAM,CAAC,QAAQ,CAAC,aAAa,mBAAmB;IAChD,MAAM,CAAC,QAAQ,CAAC,uBAAuB,6BAA6B;IACpE,MAAM,CAAC,QAAQ,CAAC,sBAAsB,4BAA4B;IAClE,MAAM,CAAC,QAAQ,CAAC,eAAe,qBAAqB;IACpD,MAAM,CAAC,QAAQ,CAAC,cAAc,oBAAoB;IAClD,MAAM,CAAC,QAAQ,CAAC,sBAAsB,4BAA4B;IAClE,MAAM,CAAC,QAAQ,CAAC,eAAe,qBAAqB;IACpD,MAAM,CAAC,QAAQ,CAAC,UAAU,gBAAgB;IAC1C,MAAM,CAAC,QAAQ,CAAC,YAAY,kBAAkB;IAC9C,MAAM,CAAC,QAAQ,CAAC,uBAAuB,6BAA6B;IACpE,MAAM,CAAC,QAAQ,CAAC,sBAAsB,4BAA4B;IAClE,MAAM,CAAC,QAAQ,CAAC,UAAU,gBAAgB;IAC1C,MAAM,CAAC,QAAQ,CAAC,oBAAoB,0BAA0B;IAC9D,MAAM,CAAC,QAAQ,CAAC,SAAS,eAAe;IACxC,MAAM,CAAC,QAAQ,CAAC,UAAU,gBAAgB;IAC1C,MAAM,CAAC,QAAQ,CAAC,gBAAgB,sBAAsB;IACtD,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,UAAU,gBAAgB;IAC1C,MAAM,CAAC,QAAQ,CAAC,WAAW,iBAAiB;IAC5C,MAAM,CAAC,QAAQ,CAAC,OAAO,aAAa;IACpC,MAAM,CAAC,QAAQ,CAAC,eAAe,qBAAqB;IACpD,MAAM,CAAC,QAAQ,CAAC,iBAAiB,uBAAuB;CACzD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MockCharacteristic = void 0;
|
|
4
|
+
class MockCharacteristic {
|
|
5
|
+
}
|
|
6
|
+
exports.MockCharacteristic = MockCharacteristic;
|
|
7
|
+
MockCharacteristic.On = 'On';
|
|
8
|
+
MockCharacteristic.Active = 'Active';
|
|
9
|
+
MockCharacteristic.Name = 'Name';
|
|
10
|
+
MockCharacteristic.Model = 'Model';
|
|
11
|
+
MockCharacteristic.Manufacturer = 'Manufacturer';
|
|
12
|
+
MockCharacteristic.SerialNumber = 'SerialNumber';
|
|
13
|
+
MockCharacteristic.FirmwareRevision = 'FirmwareRevision';
|
|
14
|
+
MockCharacteristic.RotationSpeed = 'RotationSpeed';
|
|
15
|
+
MockCharacteristic.CurrentAirPurifierState = 'CurrentAirPurifierState';
|
|
16
|
+
MockCharacteristic.TargetAirPurifierState = 'TargetAirPurifierState';
|
|
17
|
+
MockCharacteristic.CurrentFanState = 'CurrentFanState';
|
|
18
|
+
MockCharacteristic.TargetFanState = 'TargetFanState';
|
|
19
|
+
MockCharacteristic.FilterChangeIndication = 'FilterChangeIndication';
|
|
20
|
+
MockCharacteristic.FilterLifeLevel = 'FilterLifeLevel';
|
|
21
|
+
MockCharacteristic.AirQuality = 'AirQuality';
|
|
22
|
+
MockCharacteristic.PM2_5Density = 'PM2_5Density';
|
|
23
|
+
MockCharacteristic.CurrentRelativeHumidity = 'CurrentRelativeHumidity';
|
|
24
|
+
MockCharacteristic.TargetRelativeHumidity = 'TargetRelativeHumidity';
|
|
25
|
+
MockCharacteristic.WaterLevel = 'WaterLevel';
|
|
26
|
+
MockCharacteristic.LockPhysicalControls = 'LockPhysicalControls';
|
|
27
|
+
MockCharacteristic.SwingMode = 'SwingMode';
|
|
28
|
+
MockCharacteristic.Brightness = 'Brightness';
|
|
29
|
+
MockCharacteristic.ColorTemperature = 'ColorTemperature';
|
|
30
|
+
MockCharacteristic.Hue = 'Hue';
|
|
31
|
+
MockCharacteristic.Saturation = 'Saturation';
|
|
32
|
+
MockCharacteristic.OutletInUse = 'OutletInUse';
|
|
33
|
+
MockCharacteristic.Voltage = 'Voltage';
|
|
34
|
+
MockCharacteristic.ElectricCurrent = 'ElectricCurrent';
|
|
35
|
+
MockCharacteristic.PowerMeterVisible = 'PowerMeterVisible';
|
|
36
|
+
//# sourceMappingURL=characteristic.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"characteristic.mock.js","sourceRoot":"","sources":["../../../src/__tests__/mocks/characteristic.mock.ts"],"names":[],"mappings":";;;AAAA,MAAa,kBAAkB;;AAA/B,gDA8BC;AA7BiB,qBAAE,GAAG,IAAI,CAAC;AACV,yBAAM,GAAG,QAAQ,CAAC;AAClB,uBAAI,GAAG,MAAM,CAAC;AACd,wBAAK,GAAG,OAAO,CAAC;AAChB,+BAAY,GAAG,cAAc,CAAC;AAC9B,+BAAY,GAAG,cAAc,CAAC;AAC9B,mCAAgB,GAAG,kBAAkB,CAAC;AACtC,gCAAa,GAAG,eAAe,CAAC;AAChC,0CAAuB,GAAG,yBAAyB,CAAC;AACpD,yCAAsB,GAAG,wBAAwB,CAAC;AAClD,kCAAe,GAAG,iBAAiB,CAAC;AACpC,iCAAc,GAAG,gBAAgB,CAAC;AAClC,yCAAsB,GAAG,wBAAwB,CAAC;AAClD,kCAAe,GAAG,iBAAiB,CAAC;AACpC,6BAAU,GAAG,YAAY,CAAC;AAC1B,+BAAY,GAAG,cAAc,CAAC;AAC9B,0CAAuB,GAAG,yBAAyB,CAAC;AACpD,yCAAsB,GAAG,wBAAwB,CAAC;AAClD,6BAAU,GAAG,YAAY,CAAC;AAC1B,uCAAoB,GAAG,sBAAsB,CAAC;AAC9C,4BAAS,GAAG,WAAW,CAAC;AACxB,6BAAU,GAAG,YAAY,CAAC;AAC1B,mCAAgB,GAAG,kBAAkB,CAAC;AACtC,sBAAG,GAAG,KAAK,CAAC;AACZ,6BAAU,GAAG,YAAY,CAAC;AAC1B,8BAAW,GAAG,aAAa,CAAC;AAC5B,0BAAO,GAAG,SAAS,CAAC;AACpB,kCAAe,GAAG,iBAAiB,CAAC;AACpC,oCAAiB,GAAG,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/// <reference types="jest" />
|
|
2
|
+
export declare class MockService {
|
|
3
|
+
readonly UUID: string;
|
|
4
|
+
constructor(UUID: string);
|
|
5
|
+
getCharacteristic(): {
|
|
6
|
+
on: jest.Mock<any, any, any>;
|
|
7
|
+
updateValue: jest.Mock<any, any, any>;
|
|
8
|
+
};
|
|
9
|
+
setCharacteristic(): this;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=service.mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.mock.d.ts","sourceRoot":"","sources":["../../../src/__tests__/mocks/service.mock.ts"],"names":[],"mappings":";AAAA,qBAAa,WAAW;aACM,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;IAExC,iBAAiB;;;;IAOjB,iBAAiB;CAGlB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MockService = void 0;
|
|
4
|
+
class MockService {
|
|
5
|
+
constructor(UUID) {
|
|
6
|
+
this.UUID = UUID;
|
|
7
|
+
}
|
|
8
|
+
getCharacteristic() {
|
|
9
|
+
return {
|
|
10
|
+
on: jest.fn().mockReturnThis(),
|
|
11
|
+
updateValue: jest.fn(),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
setCharacteristic() {
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.MockService = MockService;
|
|
19
|
+
//# sourceMappingURL=service.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.mock.js","sourceRoot":"","sources":["../../../src/__tests__/mocks/service.mock.ts"],"names":[],"mappings":";;;AAAA,MAAa,WAAW;IACtB,YAA4B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAE5C,iBAAiB;QACf,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;YAC9B,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE;SACvB,CAAC;IACJ,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAbD,kCAaC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="jest" />
|
|
2
|
+
export declare const TEST_CONFIG: {
|
|
3
|
+
username: string | undefined;
|
|
4
|
+
password: string | undefined;
|
|
5
|
+
apiUrl: string | undefined;
|
|
6
|
+
};
|
|
7
|
+
export declare const canRunIntegrationTests: () => boolean;
|
|
8
|
+
export declare const skipWithoutCredentials: () => jest.It;
|
|
9
|
+
export declare const resetApiUrl: () => void;
|
|
10
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":";AAwCA,eAAO,MAAM,WAAW;;;;CAIvB,CAAC;AAaF,eAAO,MAAM,sBAAsB,QAAO,OAMzC,CAAC;AAGF,eAAO,MAAM,sBAAsB,eAKlC,CAAC;AAGF,eAAO,MAAM,WAAW,YAKvB,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.resetApiUrl = exports.skipWithoutCredentials = exports.canRunIntegrationTests = exports.TEST_CONFIG = void 0;
|
|
7
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const helpers_1 = require("tsvesync/src/lib/helpers");
|
|
10
|
+
// Load test environment variables
|
|
11
|
+
const envPath = path_1.default.resolve(__dirname, '../../.env.test');
|
|
12
|
+
if (process.env.DEBUG) {
|
|
13
|
+
console.log('Loading environment variables from:', envPath);
|
|
14
|
+
}
|
|
15
|
+
const result = dotenv_1.default.config({ path: envPath });
|
|
16
|
+
if (process.env.DEBUG) {
|
|
17
|
+
if (result.error) {
|
|
18
|
+
console.log('Error loading .env.test:', result.error);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
console.log('Environment variables loaded:', {
|
|
22
|
+
VESYNC_TEST_USERNAME: process.env.VESYNC_TEST_USERNAME,
|
|
23
|
+
VESYNC_TEST_PASSWORD: process.env.VESYNC_TEST_PASSWORD ? '***' : undefined,
|
|
24
|
+
VESYNC_API_URL: process.env.VESYNC_API_URL,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Helper to check if a string is not empty or commented out
|
|
29
|
+
const isValidEnvVar = (value) => {
|
|
30
|
+
return !!value && !value.startsWith('#');
|
|
31
|
+
};
|
|
32
|
+
// Set API URL if provided in environment variables
|
|
33
|
+
const apiUrl = process.env.VESYNC_API_URL;
|
|
34
|
+
if (process.env.DEBUG) {
|
|
35
|
+
console.log('API URL from env:', apiUrl);
|
|
36
|
+
}
|
|
37
|
+
if (isValidEnvVar(apiUrl)) {
|
|
38
|
+
if (process.env.DEBUG) {
|
|
39
|
+
console.log('Setting API URL to:', apiUrl);
|
|
40
|
+
}
|
|
41
|
+
(0, helpers_1.setApiBaseUrl)(apiUrl);
|
|
42
|
+
}
|
|
43
|
+
exports.TEST_CONFIG = {
|
|
44
|
+
username: isValidEnvVar(process.env.VESYNC_TEST_USERNAME) ? process.env.VESYNC_TEST_USERNAME : undefined,
|
|
45
|
+
password: isValidEnvVar(process.env.VESYNC_TEST_PASSWORD) ? process.env.VESYNC_TEST_PASSWORD : undefined,
|
|
46
|
+
apiUrl: isValidEnvVar(process.env.VESYNC_API_URL) ? process.env.VESYNC_API_URL : undefined,
|
|
47
|
+
};
|
|
48
|
+
if (process.env.DEBUG) {
|
|
49
|
+
console.log('Test config:', {
|
|
50
|
+
hasUsername: !!exports.TEST_CONFIG.username,
|
|
51
|
+
hasPassword: !!exports.TEST_CONFIG.password,
|
|
52
|
+
apiUrl: exports.TEST_CONFIG.apiUrl,
|
|
53
|
+
username: exports.TEST_CONFIG.username,
|
|
54
|
+
password: exports.TEST_CONFIG.password ? '***' : undefined,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
// Helper to check if we can run integration tests
|
|
58
|
+
const canRunIntegrationTests = () => {
|
|
59
|
+
const canRun = !!(exports.TEST_CONFIG.username && exports.TEST_CONFIG.password);
|
|
60
|
+
if (process.env.DEBUG) {
|
|
61
|
+
console.log('Can run integration tests:', canRun);
|
|
62
|
+
}
|
|
63
|
+
return canRun;
|
|
64
|
+
};
|
|
65
|
+
exports.canRunIntegrationTests = canRunIntegrationTests;
|
|
66
|
+
// Helper to skip tests that require real credentials
|
|
67
|
+
const skipWithoutCredentials = () => {
|
|
68
|
+
if (!(0, exports.canRunIntegrationTests)()) {
|
|
69
|
+
return test.skip;
|
|
70
|
+
}
|
|
71
|
+
return test;
|
|
72
|
+
};
|
|
73
|
+
exports.skipWithoutCredentials = skipWithoutCredentials;
|
|
74
|
+
// Export a function to reset API URL for mocked tests
|
|
75
|
+
const resetApiUrl = () => {
|
|
76
|
+
if (process.env.DEBUG) {
|
|
77
|
+
console.log('Resetting API URL to default');
|
|
78
|
+
}
|
|
79
|
+
(0, helpers_1.setApiBaseUrl)('https://smartapi.vesync.com');
|
|
80
|
+
};
|
|
81
|
+
exports.resetApiUrl = resetApiUrl;
|
|
82
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,11 +41,10 @@ export declare class AirPurifierAccessory extends BaseAccessory {
|
|
|
41
41
|
private setTargetAirPurifierState;
|
|
42
42
|
private getAirQuality;
|
|
43
43
|
private getPM25Density;
|
|
44
|
-
private getRotationSpeed;
|
|
45
44
|
/**
|
|
46
|
-
*
|
|
45
|
+
* Get rotation speed
|
|
47
46
|
*/
|
|
48
|
-
private
|
|
47
|
+
private getRotationSpeed;
|
|
49
48
|
private getLockPhysicalControls;
|
|
50
49
|
private setLockPhysicalControls;
|
|
51
50
|
private getFilterChangeIndication;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"air-purifier.accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/air-purifier.accessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE9E,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;gBAG3C,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,iBAAiB;IAO3B;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,IAAI;IAmF9B;;OAEG;IACH,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;IAcrD;;OAEG;cACa,0BAA0B,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCvE;;OAEG;YACW,eAAe;IAc7B;;OAEG;YACW,oBAAoB;IAYlC;;OAEG;YACW,sBAAsB;
|
|
1
|
+
{"version":3,"file":"air-purifier.accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/air-purifier.accessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE9E,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;gBAG3C,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,iBAAiB;IAO3B;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,IAAI;IAmF9B;;OAEG;IACH,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;IAcrD;;OAEG;cACa,0BAA0B,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCvE;;OAEG;YACW,eAAe;IAc7B;;OAEG;YACW,oBAAoB;IAYlC;;OAEG;YACW,sBAAsB;IA8BpC;;OAEG;YACW,kBAAkB;YAYlB,SAAS;YAIT,SAAS;YAeT,0BAA0B;YAI1B,yBAAyB;YAIzB,yBAAyB;YAezB,aAAa;YAMb,cAAc;IAe5B;;OAEG;YACW,gBAAgB;YAiBhB,uBAAuB;YAIvB,uBAAuB;YAmBvB,yBAAyB;YAIzB,kBAAkB;cAIhB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKlE"}
|
|
@@ -123,7 +123,31 @@ class AirPurifierAccessory extends base_accessory_1.BaseAccessory {
|
|
|
123
123
|
* Handle set rotation speed
|
|
124
124
|
*/
|
|
125
125
|
async handleSetRotationSpeed(value) {
|
|
126
|
-
const
|
|
126
|
+
const percentage = value;
|
|
127
|
+
if (percentage === 0) {
|
|
128
|
+
// Turn off the device instead of setting speed to 0
|
|
129
|
+
await this.withRetry(async () => {
|
|
130
|
+
await this.device.turnOff();
|
|
131
|
+
}, 'turn off device');
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
// Convert HomeKit percentage (0-100) to device speed (1-5)
|
|
135
|
+
let speed;
|
|
136
|
+
if (percentage <= 20) {
|
|
137
|
+
speed = 1; // Sleep
|
|
138
|
+
}
|
|
139
|
+
else if (percentage <= 40) {
|
|
140
|
+
speed = 2; // Low
|
|
141
|
+
}
|
|
142
|
+
else if (percentage <= 60) {
|
|
143
|
+
speed = 3; // Medium
|
|
144
|
+
}
|
|
145
|
+
else if (percentage <= 80) {
|
|
146
|
+
speed = 4; // High
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
speed = 5; // Turbo
|
|
150
|
+
}
|
|
127
151
|
await this.withRetry(async () => {
|
|
128
152
|
await this.device.changeFanSpeed(speed);
|
|
129
153
|
}, 'set rotation speed');
|
|
@@ -195,21 +219,23 @@ class AirPurifierAccessory extends base_accessory_1.BaseAccessory {
|
|
|
195
219
|
// Return 0 if no valid value is available
|
|
196
220
|
return 0;
|
|
197
221
|
}
|
|
222
|
+
/**
|
|
223
|
+
* Get rotation speed
|
|
224
|
+
*/
|
|
198
225
|
async getRotationSpeed() {
|
|
199
|
-
if (this.device.speed === undefined || this.device.speed === null
|
|
226
|
+
if (this.device.speed === undefined || this.device.speed === null) {
|
|
200
227
|
return 0;
|
|
201
228
|
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
return
|
|
229
|
+
// Convert device speed (1-5) to HomeKit percentage (0-100)
|
|
230
|
+
switch (this.device.speed) {
|
|
231
|
+
case 0: return 0; // Off
|
|
232
|
+
case 1: return 20; // Sleep
|
|
233
|
+
case 2: return 40; // Low
|
|
234
|
+
case 3: return 60; // Medium
|
|
235
|
+
case 4: return 80; // High
|
|
236
|
+
case 5: return 100; // Turbo
|
|
237
|
+
default: return 0;
|
|
210
238
|
}
|
|
211
|
-
// Convert from 0-100 to 1-maxSpeed
|
|
212
|
-
return Math.max(1, Math.round((value / 100) * this.device.maxSpeed));
|
|
213
239
|
}
|
|
214
240
|
async getLockPhysicalControls() {
|
|
215
241
|
return this.device.childLock ? 1 : 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"air-purifier.accessory.js","sourceRoot":"","sources":["../../src/accessories/air-purifier.accessory.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"air-purifier.accessory.js","sourceRoot":"","sources":["../../src/accessories/air-purifier.accessory.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,10 @@ export declare abstract class BaseAccessory {
|
|
|
10
10
|
private readonly retryManager;
|
|
11
11
|
private readonly logger;
|
|
12
12
|
private needsRetry;
|
|
13
|
+
private isInitialized;
|
|
14
|
+
private initializationPromise;
|
|
15
|
+
private initializationResolver;
|
|
16
|
+
private isInitializing;
|
|
13
17
|
constructor(platform: TSVESyncPlatform, accessory: PlatformAccessory, device: VeSyncDeviceWithPower);
|
|
14
18
|
/**
|
|
15
19
|
* Get base context for logging
|
|
@@ -35,6 +39,14 @@ export declare abstract class BaseAccessory {
|
|
|
35
39
|
* Get the device type for polling configuration
|
|
36
40
|
*/
|
|
37
41
|
protected getDeviceType(): string;
|
|
42
|
+
/**
|
|
43
|
+
* Initialize the accessory
|
|
44
|
+
*/
|
|
45
|
+
initialize(): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Initialize the device state
|
|
48
|
+
*/
|
|
49
|
+
private initializeDeviceState;
|
|
38
50
|
/**
|
|
39
51
|
* Set up the accessory services and start polling
|
|
40
52
|
*/
|
|
@@ -54,7 +66,7 @@ export declare abstract class BaseAccessory {
|
|
|
54
66
|
/**
|
|
55
67
|
* Sync the device state with VeSync
|
|
56
68
|
*/
|
|
57
|
-
|
|
69
|
+
syncDeviceState(): Promise<void>;
|
|
58
70
|
/**
|
|
59
71
|
* Helper method to convert air quality values to HomeKit format
|
|
60
72
|
*/
|
|
@@ -74,14 +86,6 @@ export declare abstract class BaseAccessory {
|
|
|
74
86
|
/**
|
|
75
87
|
* Handle device errors with appropriate recovery actions
|
|
76
88
|
*/
|
|
77
|
-
protected handleDeviceError(
|
|
78
|
-
/**
|
|
79
|
-
* Attempt to reconnect to the device by triggering device discovery
|
|
80
|
-
*/
|
|
81
|
-
private attemptReconnection;
|
|
82
|
-
/**
|
|
83
|
-
* Mark the device for retry on next update cycle
|
|
84
|
-
*/
|
|
85
|
-
private markForRetry;
|
|
89
|
+
protected handleDeviceError(message: string, error: Error | any): Promise<void>;
|
|
86
90
|
}
|
|
87
91
|
//# sourceMappingURL=base.accessory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/base.accessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAKlF,8BAAsB,aAAa;IACjC,SAAS,CAAC,OAAO,EAAG,OAAO,CAAC;IAC5B,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAC9C,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IAChD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,UAAU,CAAS;
|
|
1
|
+
{"version":3,"file":"base.accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/base.accessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAKlF,8BAAsB,aAAa;IACjC,SAAS,CAAC,OAAO,EAAG,OAAO,CAAC;IAC5B,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAC9C,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IAChD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,qBAAqB,CAAgB;IAC7C,OAAO,CAAC,sBAAsB,CAAc;IAC5C,OAAO,CAAC,cAAc,CAAS;gBAG7B,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,qBAAqB;IAkC/B;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;cACa,SAAS,CAAC,CAAC,EACzB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,CAAC,CAAC;IAsBb;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,YAAY,IAAI,IAAI;IAEvC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,0BAA0B,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1E;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,qBAAqB,IAAI,kBAAkB;IAE9D;;OAEG;IACH,SAAS,CAAC,aAAa,IAAI,MAAM;IAgBjC;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBxC;;OAEG;YACW,qBAAqB;IAgBnC;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,IAAI;IAwB9B;;OAEG;IACH,SAAS,CAAC,WAAW,IAAI,IAAI;IAI7B;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAIrD;;OAEG;IACU,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAmC7C;;OAEG;IACH,SAAS,CAAC,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQ1D;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAC3B,cAAc,EAAE,GAAG,EACnB,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,EAC1C,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,EACrD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,OAAO,CAAC,EAAE,OAAO,GAChB,IAAI;IAwDP;;OAEG;IACH,SAAS,CAAC,yBAAyB,CACjC,cAAc,EAAE,GAAG,EACnB,KAAK,EAAE,mBAAmB,GACzB,IAAI;IAUP;;OAEG;cACa,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB9E;;OAEG;cACa,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CA2BtF"}
|
|
@@ -7,16 +7,22 @@ const logger_1 = require("../utils/logger");
|
|
|
7
7
|
class BaseAccessory {
|
|
8
8
|
constructor(platform, accessory, device) {
|
|
9
9
|
this.needsRetry = false;
|
|
10
|
+
this.isInitialized = false;
|
|
11
|
+
this.isInitializing = false;
|
|
10
12
|
this.platform = platform;
|
|
11
13
|
this.accessory = accessory;
|
|
12
14
|
this.device = device;
|
|
15
|
+
// Create initialization promise
|
|
16
|
+
this.initializationPromise = new Promise((resolve) => {
|
|
17
|
+
this.initializationResolver = resolve;
|
|
18
|
+
});
|
|
13
19
|
// Initialize managers
|
|
14
20
|
this.logger = new logger_1.PluginLogger(this.platform.log, this.platform.config.debug);
|
|
15
21
|
this.pollingManager = new polling_manager_1.PollingManager(this.getDeviceType(), this.platform.log, this.platform.config.polling);
|
|
16
22
|
this.retryManager = new retry_1.RetryManager(this.platform.log, this.platform.config.retry);
|
|
17
23
|
// Set up the accessory
|
|
18
24
|
this.setupAccessory();
|
|
19
|
-
this.logger.info('Accessory
|
|
25
|
+
this.logger.info('Accessory created', this.getLogContext());
|
|
20
26
|
}
|
|
21
27
|
/**
|
|
22
28
|
* Get base context for logging
|
|
@@ -72,6 +78,48 @@ class BaseAccessory {
|
|
|
72
78
|
}
|
|
73
79
|
return 'default';
|
|
74
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Initialize the accessory
|
|
83
|
+
*/
|
|
84
|
+
async initialize() {
|
|
85
|
+
if (this.isInitializing) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
this.isInitializing = true;
|
|
89
|
+
try {
|
|
90
|
+
// Initialize the device state
|
|
91
|
+
await this.initializeDeviceState();
|
|
92
|
+
this.isInitialized = true;
|
|
93
|
+
this.logger.info('Accessory initialized', this.getLogContext());
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
97
|
+
this.logger.error('Failed to initialize device state', this.getLogContext(), err);
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
this.isInitializing = false;
|
|
101
|
+
// Signal initialization completion regardless of success
|
|
102
|
+
this.initializationResolver();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Initialize the device state
|
|
107
|
+
*/
|
|
108
|
+
async initializeDeviceState() {
|
|
109
|
+
try {
|
|
110
|
+
// Wait for platform to be ready
|
|
111
|
+
if (typeof this.platform.isReady === 'function') {
|
|
112
|
+
await this.platform.isReady();
|
|
113
|
+
}
|
|
114
|
+
// Attempt to get initial device state
|
|
115
|
+
await this.syncDeviceState();
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
119
|
+
this.logger.warn('Failed to get initial device state, will retry during polling', this.getLogContext());
|
|
120
|
+
throw err;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
75
123
|
/**
|
|
76
124
|
* Set up the accessory services and start polling
|
|
77
125
|
*/
|
|
@@ -94,7 +142,25 @@ class BaseAccessory {
|
|
|
94
142
|
*/
|
|
95
143
|
startPolling() {
|
|
96
144
|
this.pollingManager.startPolling(async () => {
|
|
97
|
-
|
|
145
|
+
try {
|
|
146
|
+
// Wait for initialization before starting polling
|
|
147
|
+
await this.initializationPromise;
|
|
148
|
+
// Wait for platform to be ready
|
|
149
|
+
if (typeof this.platform.isReady === 'function') {
|
|
150
|
+
await this.platform.isReady();
|
|
151
|
+
}
|
|
152
|
+
if (!this.isInitialized) {
|
|
153
|
+
// If not initialized, try to initialize first
|
|
154
|
+
await this.initializeDeviceState();
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
await this.syncDeviceState();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
162
|
+
this.logger.error('Failed during polling', this.getLogContext(), err);
|
|
163
|
+
}
|
|
98
164
|
});
|
|
99
165
|
}
|
|
100
166
|
/**
|
|
@@ -120,6 +186,9 @@ class BaseAccessory {
|
|
|
120
186
|
await this.withRetry(async () => {
|
|
121
187
|
// First try to get device details
|
|
122
188
|
const details = await this.device.getDetails();
|
|
189
|
+
if (!details) {
|
|
190
|
+
throw new Error('Failed to get device details');
|
|
191
|
+
}
|
|
123
192
|
// Then update device state with the details
|
|
124
193
|
await this.updateDeviceSpecificStates(details);
|
|
125
194
|
// Clear retry flag on success
|
|
@@ -127,6 +196,10 @@ class BaseAccessory {
|
|
|
127
196
|
}, 'sync device state');
|
|
128
197
|
}
|
|
129
198
|
catch (error) {
|
|
199
|
+
// Set initialization state to false on error to force re-initialization
|
|
200
|
+
if (!this.isInitialized) {
|
|
201
|
+
this.logger.warn('Device not initialized, will retry initialization', this.getLogContext());
|
|
202
|
+
}
|
|
130
203
|
await this.handleDeviceError('Failed to sync device state', error instanceof Error ? error : new Error(String(error)));
|
|
131
204
|
}
|
|
132
205
|
}
|
|
@@ -215,51 +288,28 @@ class BaseAccessory {
|
|
|
215
288
|
/**
|
|
216
289
|
* Handle device errors with appropriate recovery actions
|
|
217
290
|
*/
|
|
218
|
-
async handleDeviceError(
|
|
219
|
-
var _a, _b;
|
|
220
|
-
const
|
|
221
|
-
const
|
|
222
|
-
const
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
switch (errorCode) {
|
|
228
|
-
case 4041008: // Device not found
|
|
229
|
-
this.platform.log.warn(`[${this.accessory.displayName}] Device not found, will attempt to rediscover`);
|
|
230
|
-
await this.attemptReconnection();
|
|
231
|
-
break;
|
|
232
|
-
case -11102086: // Internal error
|
|
233
|
-
this.platform.log.warn(`[${this.accessory.displayName}] VeSync API internal error, will retry later`);
|
|
234
|
-
this.markForRetry();
|
|
235
|
-
break;
|
|
236
|
-
default:
|
|
237
|
-
if ((errorMsg === null || errorMsg === void 0 ? void 0 : errorMsg.includes('not found')) || (errorMsg === null || errorMsg === void 0 ? void 0 : errorMsg.includes('undefined')) || !errorMsg) {
|
|
238
|
-
this.platform.log.warn(`[${this.accessory.displayName}] Connection issue detected, attempting to reconnect`);
|
|
239
|
-
await this.attemptReconnection();
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
this.markForRetry();
|
|
243
|
-
}
|
|
291
|
+
async handleDeviceError(message, error) {
|
|
292
|
+
var _a, _b, _c, _d, _e, _f;
|
|
293
|
+
const context = this.getLogContext();
|
|
294
|
+
const retryCount = this.retryManager.getRetryCount();
|
|
295
|
+
const wrappedError = error instanceof Error ? error : new Error(JSON.stringify(error));
|
|
296
|
+
// Handle device not found error
|
|
297
|
+
if (((_a = error === null || error === void 0 ? void 0 : error.error) === null || _a === void 0 ? void 0 : _a.code) === 4041008 || ((_c = (_b = error === null || error === void 0 ? void 0 : error.error) === null || _b === void 0 ? void 0 : _b.msg) === null || _c === void 0 ? void 0 : _c.includes('Device not found'))) {
|
|
298
|
+
this.logger.warn('Device not found', context, wrappedError);
|
|
299
|
+
return;
|
|
244
300
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
async attemptReconnection() {
|
|
250
|
-
try {
|
|
251
|
-
// Attempt to refresh the device list
|
|
252
|
-
await this.platform.discoverDevices();
|
|
253
|
-
this.platform.log.info(`[${this.accessory.displayName}] Successfully refreshed device list`);
|
|
301
|
+
// Handle rate limit error
|
|
302
|
+
if (((_d = error === null || error === void 0 ? void 0 : error.message) === null || _d === void 0 ? void 0 : _d.includes('rate limit')) || ((_e = error === null || error === void 0 ? void 0 : error.message) === null || _e === void 0 ? void 0 : _e.includes('429'))) {
|
|
303
|
+
this.logger.warn(`Hit API rate limit (attempt ${retryCount})`, context, wrappedError);
|
|
304
|
+
return;
|
|
254
305
|
}
|
|
255
|
-
|
|
256
|
-
|
|
306
|
+
// Handle network errors
|
|
307
|
+
if (((_f = error === null || error === void 0 ? void 0 : error.code) === null || _f === void 0 ? void 0 : _f.startsWith('ECONN')) || (error === null || error === void 0 ? void 0 : error.code) === 'ETIMEDOUT') {
|
|
308
|
+
this.logger.warn('Network error', context, wrappedError);
|
|
309
|
+
return;
|
|
257
310
|
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
* Mark the device for retry on next update cycle
|
|
261
|
-
*/
|
|
262
|
-
markForRetry() {
|
|
311
|
+
// Handle other errors
|
|
312
|
+
this.logger.error(message, context, wrappedError);
|
|
263
313
|
this.needsRetry = true;
|
|
264
314
|
}
|
|
265
315
|
}
|