homebridge-tsvesync 1.0.14 → 1.0.18

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 (42) hide show
  1. package/dist/__tests__/mocks/characteristic.mock.d.ts +32 -0
  2. package/dist/__tests__/mocks/characteristic.mock.d.ts.map +1 -0
  3. package/dist/__tests__/mocks/characteristic.mock.js +36 -0
  4. package/dist/__tests__/mocks/characteristic.mock.js.map +1 -0
  5. package/dist/__tests__/mocks/service.mock.d.ts +11 -0
  6. package/dist/__tests__/mocks/service.mock.d.ts.map +1 -0
  7. package/dist/__tests__/mocks/service.mock.js +19 -0
  8. package/dist/__tests__/mocks/service.mock.js.map +1 -0
  9. package/dist/__tests__/setup.d.ts +10 -0
  10. package/dist/__tests__/setup.d.ts.map +1 -0
  11. package/dist/__tests__/setup.js +82 -0
  12. package/dist/__tests__/setup.js.map +1 -0
  13. package/dist/accessories/base.accessory.d.ts +1 -9
  14. package/dist/accessories/base.accessory.d.ts.map +1 -1
  15. package/dist/accessories/base.accessory.js +30 -46
  16. package/dist/accessories/base.accessory.js.map +1 -1
  17. package/dist/platform.d.ts +2 -0
  18. package/dist/platform.d.ts.map +1 -1
  19. package/dist/platform.js +124 -16
  20. package/dist/platform.js.map +1 -1
  21. package/dist/types.d.ts +22 -0
  22. package/dist/types.d.ts.map +1 -0
  23. package/dist/types.js +3 -0
  24. package/dist/types.js.map +1 -0
  25. package/dist/utils/retry.d.ts +7 -8
  26. package/dist/utils/retry.d.ts.map +1 -1
  27. package/dist/utils/retry.js +18 -31
  28. package/dist/utils/retry.js.map +1 -1
  29. package/jest.config.js +25 -0
  30. package/package.json +10 -3
  31. package/src/__tests__/base.accessory.test.ts +322 -0
  32. package/src/__tests__/mocks/characteristic.mock.ts +31 -0
  33. package/src/__tests__/mocks/service.mock.ts +14 -0
  34. package/src/__tests__/platform.test.ts +347 -0
  35. package/src/__tests__/setup.ts +80 -0
  36. package/src/accessories/base.accessory.ts +33 -44
  37. package/src/platform.ts +134 -17
  38. package/src/types/tsvesync.d.ts +51 -0
  39. package/src/types.ts +21 -0
  40. package/src/utils/retry.ts +27 -47
  41. package/tsconfig.json +5 -4
  42. 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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"}
@@ -74,14 +74,6 @@ export declare abstract class BaseAccessory {
74
74
  /**
75
75
  * Handle device errors with appropriate recovery actions
76
76
  */
77
- protected handleDeviceError(operation: string, error: unknown): Promise<void>;
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;
77
+ protected handleDeviceError(message: string, error: Error | any): Promise<void>;
86
78
  }
87
79
  //# 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;gBAGzB,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,qBAAqB;IA6B/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;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,IAAI;IAM9B;;OAEG;IACH,SAAS,CAAC,WAAW,IAAI,IAAI;IAI7B;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAIrD;;OAEG;cACa,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBhD;;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,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BnF;;OAEG;YACW,mBAAmB;IAUjC;;OAEG;IACH,OAAO,CAAC,YAAY;CAGrB"}
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;gBAGzB,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,qBAAqB;IA6B/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;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,IAAI;IAM9B;;OAEG;IACH,SAAS,CAAC,WAAW,IAAI,IAAI;IAI7B;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAIrD;;OAEG;cACa,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BhD;;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"}
@@ -117,10 +117,14 @@ class BaseAccessory {
117
117
  if (this.needsRetry) {
118
118
  this.platform.log.debug(`[${this.accessory.displayName}] Retrying previous failed operation`);
119
119
  }
120
- const details = await this.device.getDetails();
121
- this.needsRetry = false; // Clear retry flag on success
122
- // Update the device state
123
- await this.updateDeviceSpecificStates(details);
120
+ await this.withRetry(async () => {
121
+ // First try to get device details
122
+ const details = await this.device.getDetails();
123
+ // Then update device state with the details
124
+ await this.updateDeviceSpecificStates(details);
125
+ // Clear retry flag on success
126
+ this.needsRetry = false;
127
+ }, 'sync device state');
124
128
  }
125
129
  catch (error) {
126
130
  await this.handleDeviceError('Failed to sync device state', error instanceof Error ? error : new Error(String(error)));
@@ -211,48 +215,28 @@ class BaseAccessory {
211
215
  /**
212
216
  * Handle device errors with appropriate recovery actions
213
217
  */
214
- async handleDeviceError(operation, error) {
215
- var _a, _b;
216
- const errorObj = error instanceof Error ? error : new Error(String(error));
217
- const errorDetails = errorObj;
218
- const errorCode = ((_a = errorDetails === null || errorDetails === void 0 ? void 0 : errorDetails.error) === null || _a === void 0 ? void 0 : _a.code) || (errorDetails === null || errorDetails === void 0 ? void 0 : errorDetails.code);
219
- const errorMsg = ((_b = errorDetails === null || errorDetails === void 0 ? void 0 : errorDetails.error) === null || _b === void 0 ? void 0 : _b.msg) || (errorDetails === null || errorDetails === void 0 ? void 0 : errorDetails.msg);
220
- // Log the error with context
221
- this.platform.log.error(`[${this.accessory.displayName}] ${operation}: ${JSON.stringify(errorDetails)}`);
222
- // Handle specific error codes
223
- switch (errorCode) {
224
- case 4041008: // Device not found
225
- this.platform.log.warn(`[${this.accessory.displayName}] Device not found, will attempt to rediscover`);
226
- await this.attemptReconnection();
227
- break;
228
- case -11102086: // Internal error
229
- this.platform.log.warn(`[${this.accessory.displayName}] VeSync API internal error, will retry later`);
230
- // Mark device for retry on next update cycle
231
- this.markForRetry();
232
- break;
233
- default:
234
- if (errorMsg === null || errorMsg === void 0 ? void 0 : errorMsg.includes('not found')) {
235
- await this.attemptReconnection();
236
- }
237
- }
238
- }
239
- /**
240
- * Attempt to reconnect to the device by triggering device discovery
241
- */
242
- async attemptReconnection() {
243
- try {
244
- // Attempt to refresh the device list
245
- await this.platform.discoverDevices();
246
- this.platform.log.info(`[${this.accessory.displayName}] Successfully refreshed device list`);
247
- }
248
- catch (error) {
249
- this.platform.log.error(`[${this.accessory.displayName}] Failed to reconnect: ${error}`);
250
- }
251
- }
252
- /**
253
- * Mark the device for retry on next update cycle
254
- */
255
- markForRetry() {
218
+ async handleDeviceError(message, error) {
219
+ var _a, _b, _c, _d, _e, _f;
220
+ const context = this.getLogContext();
221
+ const retryCount = this.retryManager.getRetryCount();
222
+ const wrappedError = error instanceof Error ? error : new Error(JSON.stringify(error));
223
+ // Handle device not found error
224
+ 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'))) {
225
+ this.logger.warn('Device not found', context, wrappedError);
226
+ return;
227
+ }
228
+ // Handle rate limit error
229
+ 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'))) {
230
+ this.logger.warn(`Hit API rate limit (attempt ${retryCount})`, context, wrappedError);
231
+ return;
232
+ }
233
+ // Handle network errors
234
+ 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') {
235
+ this.logger.warn('Network error', context, wrappedError);
236
+ return;
237
+ }
238
+ // Handle other errors
239
+ this.logger.error(message, context, wrappedError);
256
240
  this.needsRetry = true;
257
241
  }
258
242
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base.accessory.js","sourceRoot":"","sources":["../../src/accessories/base.accessory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.accessory.js","sourceRoot":"","sources":["../../src/accessories/base.accessory.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,8 @@ export declare class TSVESyncPlatform implements DynamicPlatformPlugin {
17
17
  private readonly updateInterval;
18
18
  private readonly debug;
19
19
  private lastLogin;
20
+ private lastLoginAttempt;
21
+ private loginBackoffTime;
20
22
  constructor(log: Logger, config: PlatformConfig, api: API);
21
23
  /**
22
24
  * This function is invoked when homebridge restores cached accessories from disk at startup.
@@ -1 +1 @@
1
- {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAM5H;;;;GAIG;AACH,qBAAa,gBAAiB,YAAW,qBAAqB;aAe1C,GAAG,EAAE,MAAM;aACX,MAAM,EAAE,cAAc;aACtB,GAAG,EAAE,GAAG;IAhB1B,SAAgB,OAAO,EAAE,OAAO,OAAO,CAAwB;IAC/D,SAAgB,cAAc,EAAE,OAAO,cAAc,CAA+B;IAGpF,SAAgB,WAAW,EAAE,iBAAiB,EAAE,CAAM;IACtD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyC;IAE3E,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,oBAAoB,CAAC,CAAiB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,OAAO,CAAC,SAAS,CAAqB;gBAGpB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,GAAG;IAqD1B;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,iBAAiB;IAK/C;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;OAEG;YACW,WAAW;IAyBzB;;;OAGG;IACU,yBAAyB,CAAC,cAAc,UAAQ;IAoD7D;;OAEG;YACW,kBAAkB;IAIhC;;OAEG;IACG,eAAe;CAyEtB"}
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAO5H;;;;GAIG;AACH,qBAAa,gBAAiB,YAAW,qBAAqB;aAiB1C,GAAG,EAAE,MAAM;aACX,MAAM,EAAE,cAAc;aACtB,GAAG,EAAE,GAAG;IAlB1B,SAAgB,OAAO,EAAE,OAAO,OAAO,CAAwB;IAC/D,SAAgB,cAAc,EAAE,OAAO,cAAc,CAA+B;IAGpF,SAAgB,WAAW,EAAE,iBAAiB,EAAE,CAAM;IACtD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyC;IAE3E,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,oBAAoB,CAAC,CAAiB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,gBAAgB,CAAQ;gBAGd,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,GAAG;IAyD1B;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,iBAAiB;IAK/C;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;OAEG;YACW,WAAW;IAyEzB;;;OAGG;IACU,yBAAyB,CAAC,cAAc,UAAQ;IAkH7D;;OAEG;YACW,kBAAkB;IAIhC;;OAEG;IACG,eAAe;CAyEtB"}
package/dist/platform.js CHANGED
@@ -20,6 +20,8 @@ class TSVESyncPlatform {
20
20
  this.accessories = [];
21
21
  this.deviceAccessories = new Map();
22
22
  this.lastLogin = new Date(0); // Track last successful login
23
+ this.lastLoginAttempt = new Date(0);
24
+ this.loginBackoffTime = 1000; // Start with 1 second
23
25
  // Validate configuration
24
26
  if (!config.username || !config.password) {
25
27
  log.error('Missing required configuration. Please check your config.json');
@@ -28,14 +30,16 @@ class TSVESyncPlatform {
28
30
  // Get config values with defaults
29
31
  this.updateInterval = config.updateInterval || 30;
30
32
  this.debug = config.debug || false;
31
- // Initialize VeSync client
32
- this.client = new tsvesync_1.VeSync(config.username, config.password, Intl.DateTimeFormat().resolvedOptions().timeZone, this.debug);
33
+ // Initialize VeSync client with all configuration
34
+ this.client = new tsvesync_1.VeSync(config.username, config.password, Intl.DateTimeFormat().resolvedOptions().timeZone, this.debug, true, // redact sensitive info
35
+ config.apiUrl, this.log);
33
36
  if (this.debug) {
34
37
  this.log.debug('Initialized platform with config:', {
35
38
  name: config.name,
36
39
  username: config.username,
37
40
  updateInterval: this.updateInterval,
38
41
  debug: this.debug,
42
+ apiUrl: config.apiUrl,
39
43
  });
40
44
  }
41
45
  this.log.info('Finished initializing platform:', this.config.name);
@@ -99,6 +103,7 @@ class TSVESyncPlatform {
99
103
  * Ensure client is logged in, but avoid unnecessary logins
100
104
  */
101
105
  async ensureLogin(forceLogin = false) {
106
+ var _a, _b;
102
107
  try {
103
108
  // If not forcing login and last login was less than 23 hours ago, try using existing session
104
109
  const loginAge = Date.now() - this.lastLogin.getTime();
@@ -108,16 +113,58 @@ class TSVESyncPlatform {
108
113
  }
109
114
  return true;
110
115
  }
116
+ // Check if we need to wait due to backoff
117
+ const timeSinceLastAttempt = Date.now() - this.lastLoginAttempt.getTime();
118
+ if (timeSinceLastAttempt < this.loginBackoffTime) {
119
+ const waitTime = this.loginBackoffTime - timeSinceLastAttempt;
120
+ if (this.debug) {
121
+ this.log.debug(`Waiting ${waitTime}ms before next login attempt`);
122
+ }
123
+ await new Promise(resolve => setTimeout(resolve, waitTime));
124
+ }
111
125
  // Need to login again
112
126
  if (this.debug) {
113
127
  this.log.debug(forceLogin ? 'Forcing new login to VeSync API' : 'Logging in to VeSync API');
114
128
  }
115
- await this.client.login();
129
+ this.lastLoginAttempt = new Date();
130
+ const loginResult = await this.client.login();
131
+ if (!loginResult) {
132
+ this.log.error('Login failed - invalid credentials or API error');
133
+ this.loginBackoffTime = Math.min(this.loginBackoffTime * 2, 300000);
134
+ return false;
135
+ }
116
136
  this.lastLogin = new Date();
137
+ // Reset backoff on successful login
138
+ this.loginBackoffTime = 1000;
117
139
  return true;
118
140
  }
119
141
  catch (error) {
120
- this.log.error('Failed to login:', error);
142
+ // Handle specific "Not logged in" error
143
+ const errorObj = error;
144
+ const errorMsg = ((_a = errorObj === null || errorObj === void 0 ? void 0 : errorObj.error) === null || _a === void 0 ? void 0 : _a.msg) || (errorObj === null || errorObj === void 0 ? void 0 : errorObj.msg) || String(error);
145
+ if (errorMsg.includes('Not logged in')) {
146
+ if (this.debug) {
147
+ this.log.debug('Session expired, forcing new login');
148
+ }
149
+ // Clear last login time to force a new login on next attempt
150
+ this.lastLogin = new Date(0);
151
+ // Use minimal backoff for session expiry
152
+ this.loginBackoffTime = Math.min(this.loginBackoffTime, 5000);
153
+ return false;
154
+ }
155
+ // Increase backoff time exponentially, max 5 minutes
156
+ this.loginBackoffTime = Math.min(this.loginBackoffTime * 2, 300000);
157
+ const errorCode = ((_b = errorObj === null || errorObj === void 0 ? void 0 : errorObj.error) === null || _b === void 0 ? void 0 : _b.code) || (errorObj === null || errorObj === void 0 ? void 0 : errorObj.code);
158
+ if (errorCode === 'ECONNRESET' || errorCode === 'ETIMEDOUT' || errorMsg.includes('timeout')) {
159
+ this.log.warn('Network error during login, will retry with backoff:', errorMsg);
160
+ }
161
+ else if (errorMsg.includes('rate limit')) {
162
+ this.log.warn('Hit API rate limit, will retry with longer backoff');
163
+ this.loginBackoffTime = Math.max(this.loginBackoffTime, 60000); // At least 1 minute for rate limits
164
+ }
165
+ else {
166
+ this.log.error('Failed to login:', errorMsg);
167
+ }
121
168
  return false;
122
169
  }
123
170
  }
@@ -126,19 +173,63 @@ class TSVESyncPlatform {
126
173
  * @param isPolledUpdate Whether this update is from the polling interval
127
174
  */
128
175
  async updateDeviceStatesFromAPI(isPolledUpdate = false) {
176
+ var _a, _b;
129
177
  try {
130
178
  if (this.debug) {
131
179
  this.log.debug(isPolledUpdate ? 'Polling device states' : 'Updating device states on demand');
132
180
  }
133
181
  // Try using cached login first
134
- if (!await this.ensureLogin()) {
135
- return;
182
+ let loginSuccess = await this.ensureLogin();
183
+ if (!loginSuccess) {
184
+ // If first login fails, try one more time with force login
185
+ this.log.debug('Initial login failed, attempting forced login...');
186
+ loginSuccess = await this.ensureLogin(true);
187
+ if (!loginSuccess) {
188
+ this.log.error('Failed to login after retry, will attempt again later');
189
+ return;
190
+ }
136
191
  }
137
- // Get fresh device list
138
- let success = await this.client.getDevices();
139
- // If getting devices failed, try forcing a new login
192
+ // Get fresh device list with retries
193
+ let success = false;
194
+ let retryCount = 0;
195
+ const maxRetries = 3;
196
+ while (!success && retryCount < maxRetries) {
197
+ try {
198
+ success = await this.client.getDevices();
199
+ if (!success) {
200
+ if (retryCount < maxRetries - 1) {
201
+ this.log.debug(`Failed to get devices (attempt ${retryCount + 1}/${maxRetries}), retrying...`);
202
+ await new Promise(resolve => setTimeout(resolve, Math.pow(2, retryCount) * 1000));
203
+ }
204
+ else {
205
+ this.log.error('Failed to get devices after all retries');
206
+ }
207
+ }
208
+ }
209
+ catch (error) {
210
+ const errorObj = error;
211
+ const errorMsg = ((_a = errorObj === null || errorObj === void 0 ? void 0 : errorObj.error) === null || _a === void 0 ? void 0 : _a.msg) || (errorObj === null || errorObj === void 0 ? void 0 : errorObj.msg) || String(error);
212
+ if (errorMsg.includes('Not logged in')) {
213
+ this.log.debug('Session expired while getting devices, attempting re-login...');
214
+ if (await this.ensureLogin(true)) {
215
+ // Reset retry count if we successfully logged in again
216
+ retryCount = 0;
217
+ continue;
218
+ }
219
+ }
220
+ if (retryCount < maxRetries - 1) {
221
+ this.log.warn(`Error getting devices (attempt ${retryCount + 1}/${maxRetries}): ${errorMsg}, retrying...`);
222
+ await new Promise(resolve => setTimeout(resolve, Math.pow(2, retryCount) * 1000));
223
+ }
224
+ else {
225
+ throw error;
226
+ }
227
+ }
228
+ retryCount++;
229
+ }
230
+ // If getting devices failed after retries, try forcing a new login
140
231
  if (!success) {
141
- this.log.debug('Failed to get devices, trying to re-login...');
232
+ this.log.debug('Failed to get devices after retries, trying to re-login...');
142
233
  if (!await this.ensureLogin(true)) {
143
234
  this.log.error('Failed to re-login');
144
235
  return;
@@ -158,16 +249,33 @@ class TSVESyncPlatform {
158
249
  for (const accessory of this.accessories) {
159
250
  const device = devices.find(d => this.api.hap.uuid.generate(d.cid) === accessory.UUID);
160
251
  if (device) {
161
- // Create fresh device context
162
- const context = this.createDeviceContext(device);
163
- accessory.context.device = context;
164
- // Update platform accessories to persist changes
165
- this.api.updatePlatformAccessories([accessory]);
252
+ try {
253
+ // Create fresh device context
254
+ const context = this.createDeviceContext(device);
255
+ // Only update if there are actual changes
256
+ if (JSON.stringify(accessory.context.device) !== JSON.stringify(context)) {
257
+ accessory.context.device = context;
258
+ // Update platform accessories to persist changes
259
+ this.api.updatePlatformAccessories([accessory]);
260
+ if (this.debug) {
261
+ this.log.debug(`Updated state for device: ${device.deviceName}`);
262
+ }
263
+ }
264
+ }
265
+ catch (error) {
266
+ this.log.error(`Failed to update device state for ${device.deviceName}:`, error);
267
+ }
166
268
  }
167
269
  }
168
270
  }
169
271
  catch (error) {
170
- this.log.error('Failed to update device states:', error);
272
+ const errorObj = error;
273
+ const errorMsg = ((_b = errorObj === null || errorObj === void 0 ? void 0 : errorObj.error) === null || _b === void 0 ? void 0 : _b.msg) || (errorObj === null || errorObj === void 0 ? void 0 : errorObj.msg) || String(error);
274
+ this.log.error('Failed to update device states:', errorMsg);
275
+ // If this was a polled update, we'll let the next poll try again
276
+ if (!isPolledUpdate) {
277
+ throw error; // Re-throw for non-polled updates to handle at caller
278
+ }
171
279
  }
172
280
  }
173
281
  /**