homebridge-tsvesync 1.0.7 → 1.0.9

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 (165) hide show
  1. package/.cursorrules +177 -0
  2. package/README.md +3 -1
  3. package/dist/accessories/air-purifier.accessory.d.ts +25 -0
  4. package/dist/accessories/air-purifier.accessory.d.ts.map +1 -0
  5. package/dist/accessories/air-purifier.accessory.js +170 -0
  6. package/dist/accessories/air-purifier.accessory.js.map +1 -0
  7. package/dist/accessories/base.accessory.d.ts +78 -0
  8. package/dist/accessories/base.accessory.d.ts.map +1 -0
  9. package/dist/accessories/base.accessory.js +231 -0
  10. package/dist/accessories/base.accessory.js.map +1 -0
  11. package/dist/accessories/fan.accessory.d.ts +22 -0
  12. package/dist/accessories/fan.accessory.d.ts.map +1 -0
  13. package/dist/accessories/fan.accessory.js +166 -0
  14. package/dist/accessories/fan.accessory.js.map +1 -0
  15. package/dist/accessories/humidifier.accessory.d.ts +25 -0
  16. package/dist/accessories/humidifier.accessory.d.ts.map +1 -0
  17. package/dist/accessories/humidifier.accessory.js +162 -0
  18. package/dist/accessories/humidifier.accessory.js.map +1 -0
  19. package/dist/accessories/light.accessory.d.ts +24 -0
  20. package/dist/accessories/light.accessory.d.ts.map +1 -0
  21. package/dist/accessories/light.accessory.js +169 -0
  22. package/dist/accessories/light.accessory.js.map +1 -0
  23. package/dist/accessories/outlet.accessory.d.ts +20 -0
  24. package/dist/accessories/outlet.accessory.d.ts.map +1 -0
  25. package/dist/accessories/outlet.accessory.js +145 -0
  26. package/dist/accessories/outlet.accessory.js.map +1 -0
  27. package/dist/index.d.ts +3 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/platform.d.ts +19 -3
  31. package/dist/platform.d.ts.map +1 -1
  32. package/dist/platform.js +117 -50
  33. package/dist/platform.js.map +1 -1
  34. package/dist/types/device.types.d.ts +69 -0
  35. package/dist/types/device.types.d.ts.map +1 -0
  36. package/dist/types/device.types.js +3 -0
  37. package/dist/types/device.types.js.map +1 -0
  38. package/dist/types/polling.types.d.ts +10 -0
  39. package/dist/types/polling.types.d.ts.map +1 -0
  40. package/dist/types/polling.types.js +49 -0
  41. package/dist/types/polling.types.js.map +1 -0
  42. package/dist/utils/device-factory.d.ts +16 -0
  43. package/dist/utils/device-factory.d.ts.map +1 -0
  44. package/dist/utils/device-factory.js +104 -0
  45. package/dist/utils/device-factory.js.map +1 -0
  46. package/dist/utils/logger.d.ts +53 -0
  47. package/dist/utils/logger.d.ts.map +1 -0
  48. package/dist/utils/logger.js +107 -0
  49. package/dist/utils/logger.js.map +1 -0
  50. package/dist/utils/polling-manager.d.ts +46 -0
  51. package/dist/utils/polling-manager.d.ts.map +1 -0
  52. package/dist/utils/polling-manager.js +107 -0
  53. package/dist/utils/polling-manager.js.map +1 -0
  54. package/dist/utils/retry.d.ts +24 -0
  55. package/dist/utils/retry.d.ts.map +1 -0
  56. package/dist/utils/retry.js +53 -0
  57. package/dist/utils/retry.js.map +1 -0
  58. package/package.json +3 -3
  59. package/src/accessories/air-purifier.accessory.ts +279 -0
  60. package/src/accessories/base.accessory.ts +332 -0
  61. package/src/accessories/fan.accessory.ts +243 -0
  62. package/src/accessories/humidifier.accessory.ts +257 -0
  63. package/src/accessories/light.accessory.ts +255 -0
  64. package/src/accessories/outlet.accessory.ts +205 -0
  65. package/src/index.ts +3 -0
  66. package/src/platform.ts +140 -58
  67. package/src/types/device.types.ts +79 -0
  68. package/src/types/polling.types.ts +59 -0
  69. package/src/utils/device-factory.ts +141 -0
  70. package/src/utils/logger.ts +130 -0
  71. package/src/utils/polling-manager.ts +138 -0
  72. package/src/utils/retry.ts +77 -0
  73. package/dist/platformAccessory.d.ts +0 -21
  74. package/dist/platformAccessory.d.ts.map +0 -1
  75. package/dist/platformAccessory.js +0 -139
  76. package/dist/platformAccessory.js.map +0 -1
  77. package/package/LICENSE +0 -21
  78. package/package/README.md +0 -227
  79. package/package/api/vesync/VeSync.yaml +0 -33
  80. package/package/api/vesyncbulb/ESL100.yaml +0 -74
  81. package/package/api/vesyncbulb/ESL100CW.yaml +0 -123
  82. package/package/api/vesyncbulb/ESL100MC.yaml +0 -169
  83. package/package/api/vesyncbulb/XYD0001.yaml +0 -193
  84. package/package/api/vesyncfan/Classic200S.yaml +0 -280
  85. package/package/api/vesyncfan/Classic300S.yaml +0 -278
  86. package/package/api/vesyncfan/Core200S.yaml +0 -256
  87. package/package/api/vesyncfan/Core300S.yaml +0 -281
  88. package/package/api/vesyncfan/Core400S.yaml +0 -281
  89. package/package/api/vesyncfan/Core600S.yaml +0 -281
  90. package/package/api/vesyncfan/Dual200S.yaml +0 -278
  91. package/package/api/vesyncfan/LAP-C201S-AUSR.yaml +0 -256
  92. package/package/api/vesyncfan/LAP-C202S-WUSR.yaml +0 -256
  93. package/package/api/vesyncfan/LAP-C301S-WAAA.yaml +0 -281
  94. package/package/api/vesyncfan/LAP-C301S-WJP.yaml +0 -281
  95. package/package/api/vesyncfan/LAP-C302S-WUSB.yaml +0 -281
  96. package/package/api/vesyncfan/LAP-C401S-WAAA.yaml +0 -281
  97. package/package/api/vesyncfan/LAP-C401S-WJP.yaml +0 -281
  98. package/package/api/vesyncfan/LAP-C401S-WUSR.yaml +0 -281
  99. package/package/api/vesyncfan/LAP-C601S-WEU.yaml +0 -281
  100. package/package/api/vesyncfan/LAP-C601S-WUS.yaml +0 -281
  101. package/package/api/vesyncfan/LAP-C601S-WUSR.yaml +0 -281
  102. package/package/api/vesyncfan/LAP-EL551S-AEUR.yaml +0 -167
  103. package/package/api/vesyncfan/LAP-EL551S-AUS.yaml +0 -167
  104. package/package/api/vesyncfan/LAP-EL551S-WEU.yaml +0 -167
  105. package/package/api/vesyncfan/LAP-EL551S-WUS.yaml +0 -167
  106. package/package/api/vesyncfan/LAP-V102S-AASR.yaml +0 -167
  107. package/package/api/vesyncfan/LAP-V102S-AUSR.yaml +0 -167
  108. package/package/api/vesyncfan/LAP-V102S-WEU.yaml +0 -167
  109. package/package/api/vesyncfan/LAP-V102S-WJP.yaml +0 -167
  110. package/package/api/vesyncfan/LAP-V102S-WUS.yaml +0 -167
  111. package/package/api/vesyncfan/LAP-V201-AUSR.yaml +0 -167
  112. package/package/api/vesyncfan/LAP-V201S-AASR.yaml +0 -167
  113. package/package/api/vesyncfan/LAP-V201S-AEUR.yaml +0 -167
  114. package/package/api/vesyncfan/LAP-V201S-AUSR.yaml +0 -167
  115. package/package/api/vesyncfan/LAP-V201S-WEU.yaml +0 -167
  116. package/package/api/vesyncfan/LAP-V201S-WJP.yaml +0 -167
  117. package/package/api/vesyncfan/LAP-V201S-WUS.yaml +0 -167
  118. package/package/api/vesyncfan/LEH-S601S-WUS.yaml +0 -303
  119. package/package/api/vesyncfan/LEH-S601S-WUSR.yaml +0 -82
  120. package/package/api/vesyncfan/LTF-F422S-KEU.yaml +0 -165
  121. package/package/api/vesyncfan/LTF-F422S-WUS.yaml +0 -165
  122. package/package/api/vesyncfan/LTF-F422S-WUSR.yaml +0 -167
  123. package/package/api/vesyncfan/LTF-F422_WJP.yaml +0 -165
  124. package/package/api/vesyncfan/LUH-A601S-AUSW.yaml +0 -82
  125. package/package/api/vesyncfan/LUH-A601S-WUSB.yaml +0 -305
  126. package/package/api/vesyncfan/LUH-A602S-WEU.yaml +0 -305
  127. package/package/api/vesyncfan/LUH-A602S-WEUR.yaml +0 -305
  128. package/package/api/vesyncfan/LUH-A602S-WJP.yaml +0 -305
  129. package/package/api/vesyncfan/LUH-A602S-WUS.yaml +0 -305
  130. package/package/api/vesyncfan/LUH-A602S-WUSC.yaml +0 -305
  131. package/package/api/vesyncfan/LUH-A602S-WUSR.yaml +0 -305
  132. package/package/api/vesyncfan/LUH-D301S-WEU.yaml +0 -305
  133. package/package/api/vesyncfan/LUH-D301S-WJP.yaml +0 -305
  134. package/package/api/vesyncfan/LUH-D301S-WUSR.yaml +0 -305
  135. package/package/api/vesyncfan/LUH-M101S-WUS.yaml +0 -278
  136. package/package/api/vesyncfan/LUH-O451S-WEU.yaml +0 -278
  137. package/package/api/vesyncfan/LUH-O451S-WUS.yaml +0 -278
  138. package/package/api/vesyncfan/LUH-O451S-WUSR.yaml +0 -305
  139. package/package/api/vesyncfan/LUH-O601S-KUS.yaml +0 -305
  140. package/package/api/vesyncfan/LUH-O601S-WUS.yaml +0 -305
  141. package/package/api/vesyncfan/LV-PUR131S.yaml +0 -108
  142. package/package/api/vesyncfan/LV-RH131S.yaml +0 -108
  143. package/package/api/vesyncoutlet/ESO15-TB.yaml +0 -124
  144. package/package/api/vesyncoutlet/ESW01-EU.yaml +0 -122
  145. package/package/api/vesyncoutlet/ESW03-USA.yaml +0 -122
  146. package/package/api/vesyncoutlet/ESW15-USA.yaml +0 -156
  147. package/package/api/vesyncoutlet/wifi-switch-1.3.yaml +0 -60
  148. package/package/api/vesyncswitch/ESWD16.yaml +0 -128
  149. package/package/api/vesyncswitch/ESWL01.yaml +0 -56
  150. package/package/api/vesyncswitch/ESWL03.yaml +0 -56
  151. package/package/package.json +0 -53
  152. package/package/src/lib/helpers.ts +0 -290
  153. package/package/src/lib/vesync.ts +0 -530
  154. package/package/src/lib/vesyncBaseDevice.ts +0 -114
  155. package/package/src/lib/vesyncBulb.ts +0 -252
  156. package/package/src/lib/vesyncBulbImpl.ts +0 -215
  157. package/package/src/lib/vesyncFan.ts +0 -447
  158. package/package/src/lib/vesyncFanImpl.ts +0 -848
  159. package/package/src/lib/vesyncOutlet.ts +0 -148
  160. package/package/src/lib/vesyncOutletImpl.ts +0 -284
  161. package/package/src/lib/vesyncSwitch.ts +0 -546
  162. package/package/src/lib/vesyncSwitchImpl.ts +0 -408
  163. package/src/platformAccessory.ts +0 -166
  164. package/src/tsvesync.d.ts +0 -26
  165. package/tsvesync-1.0.11.tgz +0 -0
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseAccessory = void 0;
4
+ const polling_manager_1 = require("../utils/polling-manager");
5
+ const retry_1 = require("../utils/retry");
6
+ const logger_1 = require("../utils/logger");
7
+ class BaseAccessory {
8
+ constructor(platform, accessory, device) {
9
+ this.platform = platform;
10
+ this.accessory = accessory;
11
+ this.device = device;
12
+ // Initialize managers
13
+ this.logger = new logger_1.PluginLogger(this.platform.log, this.platform.config.debug);
14
+ this.pollingManager = new polling_manager_1.PollingManager(this.getDeviceType(), this.platform.log, this.platform.config.polling);
15
+ this.retryManager = new retry_1.RetryManager(this.platform.log, this.platform.config.retry);
16
+ // Set up the accessory
17
+ this.setupAccessory();
18
+ this.logger.info('Accessory initialized', this.getLogContext());
19
+ }
20
+ /**
21
+ * Get base context for logging
22
+ */
23
+ getLogContext(operation, characteristic, value) {
24
+ return {
25
+ deviceName: this.device.deviceName,
26
+ deviceType: this.getDeviceType(),
27
+ operation,
28
+ characteristic,
29
+ value,
30
+ };
31
+ }
32
+ /**
33
+ * Execute an operation with retry logic
34
+ */
35
+ async withRetry(operation, operationName) {
36
+ const context = this.getLogContext(operationName);
37
+ this.logger.operationStart(context);
38
+ try {
39
+ const result = await this.retryManager.execute(operation, {
40
+ deviceName: this.device.deviceName,
41
+ operation: operationName,
42
+ });
43
+ this.logger.operationEnd(context);
44
+ return result;
45
+ }
46
+ catch (error) {
47
+ this.logger.operationEnd(context, error);
48
+ throw error;
49
+ }
50
+ }
51
+ /**
52
+ * Get the device type for polling configuration
53
+ */
54
+ getDeviceType() {
55
+ // Default implementation - override in subclasses if needed
56
+ if (this.device.deviceType.toLowerCase().includes('air')) {
57
+ return 'airPurifier';
58
+ }
59
+ else if (this.device.deviceType.toLowerCase().includes('humidifier')) {
60
+ return 'humidifier';
61
+ }
62
+ else if (this.device.deviceType.toLowerCase().includes('fan')) {
63
+ return 'fan';
64
+ }
65
+ else if (this.device.deviceType.toLowerCase().includes('bulb')) {
66
+ return 'light';
67
+ }
68
+ else if (this.device.deviceType.toLowerCase().includes('outlet')) {
69
+ return 'outlet';
70
+ }
71
+ return 'default';
72
+ }
73
+ /**
74
+ * Set up the accessory services and start polling
75
+ */
76
+ setupAccessory() {
77
+ // Set accessory information
78
+ const infoService = this.accessory.getService(this.platform.Service.AccessoryInformation);
79
+ if (infoService) {
80
+ infoService
81
+ .setCharacteristic(this.platform.Characteristic.Manufacturer, 'VeSync')
82
+ .setCharacteristic(this.platform.Characteristic.Model, this.device.deviceType)
83
+ .setCharacteristic(this.platform.Characteristic.SerialNumber, this.device.uuid);
84
+ }
85
+ // Set up device-specific service
86
+ this.setupService();
87
+ // Start polling for updates
88
+ this.startPolling();
89
+ }
90
+ /**
91
+ * Start polling for device updates
92
+ */
93
+ startPolling() {
94
+ this.pollingManager.startPolling(async () => {
95
+ await this.syncDeviceState();
96
+ });
97
+ }
98
+ /**
99
+ * Stop polling for device updates
100
+ */
101
+ stopPolling() {
102
+ this.pollingManager.stopPolling();
103
+ }
104
+ /**
105
+ * Update the polling manager with the device's active state
106
+ */
107
+ updatePollingState(isActive) {
108
+ this.pollingManager.updateDeviceState(isActive);
109
+ }
110
+ /**
111
+ * Sync the device state with VeSync
112
+ */
113
+ async syncDeviceState() {
114
+ const context = this.getLogContext('sync device state');
115
+ try {
116
+ await this.withRetry(async () => {
117
+ await this.device.getDetails();
118
+ const details = {
119
+ deviceStatus: this.device.deviceStatus,
120
+ // Add any other properties needed from the device
121
+ };
122
+ // Update polling state based on device status
123
+ const isActive = details.deviceStatus === 'on';
124
+ this.updatePollingState(isActive);
125
+ this.logger.pollingEvent({
126
+ ...context,
127
+ interval: this.pollingManager.getCurrentInterval(),
128
+ active: isActive,
129
+ });
130
+ // Update device-specific states
131
+ this.updateDeviceSpecificStates(details);
132
+ }, 'sync device state');
133
+ }
134
+ catch (error) {
135
+ this.logger.error('Failed to sync device state', context, error);
136
+ throw error; // Let polling manager handle the error
137
+ }
138
+ }
139
+ /**
140
+ * Helper method to convert air quality values to HomeKit format
141
+ */
142
+ convertAirQualityToHomeKit(pm25) {
143
+ if (pm25 <= 12)
144
+ return 1; // EXCELLENT
145
+ if (pm25 <= 35)
146
+ return 2; // GOOD
147
+ if (pm25 <= 55)
148
+ return 3; // FAIR
149
+ if (pm25 <= 150)
150
+ return 4; // INFERIOR
151
+ return 5; // POOR
152
+ }
153
+ /**
154
+ * Helper method to set up a characteristic with get/set handlers
155
+ */
156
+ setupCharacteristic(characteristic, onGet, onSet, props, service) {
157
+ const targetService = service || this.service;
158
+ const char = targetService.getCharacteristic(characteristic);
159
+ if (onGet) {
160
+ char.onGet(async () => {
161
+ const context = this.getLogContext('get characteristic', characteristic.name);
162
+ try {
163
+ const value = await this.withRetry(onGet, `get ${characteristic.name}`);
164
+ this.logger.stateChange({ ...context, value });
165
+ return value;
166
+ }
167
+ catch (error) {
168
+ this.logger.error('Failed to get characteristic value', context, error);
169
+ throw error;
170
+ }
171
+ });
172
+ }
173
+ if (onSet) {
174
+ char.onSet(async (value) => {
175
+ const context = this.getLogContext('set characteristic', characteristic.name, value);
176
+ try {
177
+ await this.withRetry(() => onSet(value), `set ${characteristic.name} to ${value}`);
178
+ this.logger.stateChange(context);
179
+ }
180
+ catch (error) {
181
+ this.logger.error('Failed to set characteristic value', context, error);
182
+ throw error;
183
+ }
184
+ });
185
+ }
186
+ if (props) {
187
+ char.setProps(props);
188
+ }
189
+ }
190
+ /**
191
+ * Helper method to update a characteristic value
192
+ */
193
+ updateCharacteristicValue(characteristic, value) {
194
+ this.service.updateCharacteristic(characteristic, value);
195
+ this.logger.stateChange({
196
+ ...this.getLogContext('update characteristic', characteristic.name, value),
197
+ deviceName: this.device.deviceName,
198
+ deviceType: this.getDeviceType(),
199
+ });
200
+ }
201
+ /**
202
+ * Persist device state to accessory context
203
+ */
204
+ async persistDeviceState(key, value) {
205
+ var _a;
206
+ try {
207
+ this.accessory.context.device = {
208
+ ...this.accessory.context.device,
209
+ details: {
210
+ ...(_a = this.accessory.context.device) === null || _a === void 0 ? void 0 : _a.details,
211
+ [key]: value
212
+ }
213
+ };
214
+ await this.platform.api.updatePlatformAccessories([this.accessory]);
215
+ this.logger.debug(`Updated ${key} to ${value}`, this.getLogContext('persist state'));
216
+ }
217
+ catch (error) {
218
+ this.handleDeviceError(`persist ${key} state`, error);
219
+ }
220
+ }
221
+ /**
222
+ * Handle device errors consistently
223
+ */
224
+ handleDeviceError(operation, error) {
225
+ const errorObj = error instanceof Error ? error : new Error(String(error));
226
+ this.logger.error(`Failed to ${operation}`, this.getLogContext(operation), errorObj);
227
+ throw errorObj;
228
+ }
229
+ }
230
+ exports.BaseAccessory = BaseAccessory;
231
+ //# sourceMappingURL=base.accessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.accessory.js","sourceRoot":"","sources":["../../src/accessories/base.accessory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { PlatformAccessory } from 'homebridge';
2
+ import { BaseAccessory } from './base.accessory';
3
+ import { TSVESyncPlatform } from '../platform';
4
+ import { DeviceCapabilities, VeSyncFan } from '../types/device.types';
5
+ export declare class FanAccessory extends BaseAccessory {
6
+ protected readonly device: VeSyncFan;
7
+ constructor(platform: TSVESyncPlatform, accessory: PlatformAccessory, device: VeSyncFan);
8
+ protected setupService(): void;
9
+ protected updateDeviceSpecificStates(details: any): void;
10
+ protected getDeviceCapabilities(): DeviceCapabilities;
11
+ private getActive;
12
+ private setActive;
13
+ private getRotationSpeed;
14
+ private setRotationSpeed;
15
+ private getRotationDirection;
16
+ private setRotationDirection;
17
+ private getSwingMode;
18
+ private setSwingMode;
19
+ private getLockPhysicalControls;
20
+ private setLockPhysicalControls;
21
+ }
22
+ //# sourceMappingURL=fan.accessory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fan.accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/fan.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,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAMtE,qBAAa,YAAa,SAAQ,aAAa;IAC7C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;gBAGnC,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,SAAS;IAMnB,SAAS,CAAC,YAAY,IAAI,IAAI;IAuD9B,SAAS,CAAC,0BAA0B,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IA4CxD,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;YAcvC,SAAS;YAIT,SAAS;YAeT,gBAAgB;YAIhB,gBAAgB;YAehB,oBAAoB;YAMpB,oBAAoB;YAmBpB,YAAY;YAIZ,YAAY;YAmBZ,uBAAuB;YAIvB,uBAAuB;CAkBtC"}
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FanAccessory = void 0;
4
+ const base_accessory_1 = require("./base.accessory");
5
+ // Constants for fan direction
6
+ const CLOCKWISE = 0;
7
+ const COUNTER_CLOCKWISE = 1;
8
+ class FanAccessory extends base_accessory_1.BaseAccessory {
9
+ constructor(platform, accessory, device) {
10
+ super(platform, accessory, device);
11
+ this.device = device;
12
+ }
13
+ setupService() {
14
+ // Get or create the fan service
15
+ this.service = this.accessory.getService(this.platform.Service.Fanv2) ||
16
+ this.accessory.addService(this.platform.Service.Fanv2);
17
+ // Set up required characteristics
18
+ this.setupCharacteristic(this.platform.Characteristic.Active, this.getActive.bind(this), this.setActive.bind(this));
19
+ // Set up optional characteristics based on device capabilities
20
+ const capabilities = this.getDeviceCapabilities();
21
+ if (capabilities.hasSpeed) {
22
+ this.setupCharacteristic(this.platform.Characteristic.RotationSpeed, this.getRotationSpeed.bind(this), this.setRotationSpeed.bind(this));
23
+ }
24
+ // Add rotation direction (if supported by the device)
25
+ if ('setRotationDirection' in this.device) {
26
+ this.setupCharacteristic(this.platform.Characteristic.RotationDirection, this.getRotationDirection.bind(this), this.setRotationDirection.bind(this));
27
+ }
28
+ if (capabilities.hasSwingMode) {
29
+ this.setupCharacteristic(this.platform.Characteristic.SwingMode, this.getSwingMode.bind(this), this.setSwingMode.bind(this));
30
+ }
31
+ if (capabilities.hasChildLock) {
32
+ this.setupCharacteristic(this.platform.Characteristic.LockPhysicalControls, this.getLockPhysicalControls.bind(this), this.setLockPhysicalControls.bind(this));
33
+ }
34
+ // Add Name characteristic
35
+ this.setupCharacteristic(this.platform.Characteristic.Name, async () => this.device.deviceName);
36
+ }
37
+ updateDeviceSpecificStates(details) {
38
+ const capabilities = this.getDeviceCapabilities();
39
+ // Update speed if available
40
+ if (capabilities.hasSpeed && details.speed !== undefined) {
41
+ const normalizedSpeed = (details.speed / this.device.maxSpeed) * 100;
42
+ this.updateCharacteristicValue(this.platform.Characteristic.RotationSpeed, normalizedSpeed);
43
+ }
44
+ // Update rotation direction if available
45
+ if ('rotationDirection' in details) {
46
+ this.updateCharacteristicValue(this.platform.Characteristic.RotationDirection, details.rotationDirection === 'clockwise' ? CLOCKWISE : COUNTER_CLOCKWISE);
47
+ }
48
+ // Update swing mode if available
49
+ if (capabilities.hasSwingMode && details.swingMode !== undefined) {
50
+ this.updateCharacteristicValue(this.platform.Characteristic.SwingMode, details.swingMode ? 1 : 0);
51
+ }
52
+ // Update child lock if available
53
+ if (capabilities.hasChildLock && details.childLock !== undefined) {
54
+ this.updateCharacteristicValue(this.platform.Characteristic.LockPhysicalControls, details.childLock ? 1 : 0);
55
+ }
56
+ // Update active state
57
+ const isActive = details.deviceStatus === 'on';
58
+ this.updateCharacteristicValue(this.platform.Characteristic.Active, isActive ? 1 : 0);
59
+ }
60
+ getDeviceCapabilities() {
61
+ return {
62
+ hasBrightness: false,
63
+ hasColorTemp: false,
64
+ hasColor: false,
65
+ hasSpeed: true,
66
+ hasHumidity: false,
67
+ hasAirQuality: false,
68
+ hasWaterLevel: false,
69
+ hasChildLock: true,
70
+ hasSwingMode: true,
71
+ };
72
+ }
73
+ async getActive() {
74
+ return this.device.deviceStatus === 'on' ? 1 : 0;
75
+ }
76
+ async setActive(value) {
77
+ try {
78
+ const isOn = value === 1;
79
+ const success = isOn ? await this.device.turnOn() : await this.device.turnOff();
80
+ if (!success) {
81
+ throw new Error(`Failed to turn ${isOn ? 'on' : 'off'} device`);
82
+ }
83
+ await this.persistDeviceState('deviceStatus', isOn ? 'on' : 'off');
84
+ }
85
+ catch (error) {
86
+ this.handleDeviceError('set active state', error);
87
+ }
88
+ }
89
+ async getRotationSpeed() {
90
+ return (this.device.speed / this.device.maxSpeed) * 100;
91
+ }
92
+ async setRotationSpeed(value) {
93
+ try {
94
+ const speed = Math.round((value / 100) * this.device.maxSpeed);
95
+ const success = await this.device.setSpeed(speed);
96
+ if (!success) {
97
+ throw new Error(`Failed to set speed to ${speed}`);
98
+ }
99
+ await this.persistDeviceState('speed', speed);
100
+ }
101
+ catch (error) {
102
+ this.handleDeviceError('set rotation speed', error);
103
+ }
104
+ }
105
+ async getRotationDirection() {
106
+ return 'rotationDirection' in this.device && this.device.rotationDirection === 'clockwise'
107
+ ? CLOCKWISE
108
+ : COUNTER_CLOCKWISE;
109
+ }
110
+ async setRotationDirection(value) {
111
+ try {
112
+ if (!('setRotationDirection' in this.device)) {
113
+ throw new Error('Device does not support rotation direction');
114
+ }
115
+ const direction = value === CLOCKWISE ? 'clockwise' : 'counterclockwise';
116
+ const success = await this.device.setRotationDirection(direction);
117
+ if (!success) {
118
+ throw new Error(`Failed to set rotation direction to ${direction}`);
119
+ }
120
+ await this.persistDeviceState('rotationDirection', direction);
121
+ }
122
+ catch (error) {
123
+ this.handleDeviceError('set rotation direction', error);
124
+ }
125
+ }
126
+ async getSwingMode() {
127
+ return this.device.swingMode ? 1 : 0;
128
+ }
129
+ async setSwingMode(value) {
130
+ try {
131
+ if (!this.device.setSwingMode) {
132
+ throw new Error('Device does not support swing mode');
133
+ }
134
+ const enabled = value === 1;
135
+ const success = await this.device.setSwingMode(enabled);
136
+ if (!success) {
137
+ throw new Error(`Failed to ${enabled ? 'enable' : 'disable'} swing mode`);
138
+ }
139
+ await this.persistDeviceState('swingMode', enabled);
140
+ }
141
+ catch (error) {
142
+ this.handleDeviceError('set swing mode', error);
143
+ }
144
+ }
145
+ async getLockPhysicalControls() {
146
+ return this.device.childLock ? 1 : 0;
147
+ }
148
+ async setLockPhysicalControls(value) {
149
+ try {
150
+ if (!this.device.setChildLock) {
151
+ throw new Error('Device does not support child lock');
152
+ }
153
+ const enabled = value === 1;
154
+ const success = await this.device.setChildLock(enabled);
155
+ if (!success) {
156
+ throw new Error(`Failed to ${enabled ? 'enable' : 'disable'} child lock`);
157
+ }
158
+ await this.persistDeviceState('childLock', enabled);
159
+ }
160
+ catch (error) {
161
+ this.handleDeviceError('set child lock', error);
162
+ }
163
+ }
164
+ }
165
+ exports.FanAccessory = FanAccessory;
166
+ //# sourceMappingURL=fan.accessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fan.accessory.js","sourceRoot":"","sources":["../../src/accessories/fan.accessory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { PlatformAccessory } from 'homebridge';
2
+ import { BaseAccessory } from './base.accessory';
3
+ import { TSVESyncPlatform } from '../platform';
4
+ import { DeviceCapabilities, VeSyncHumidifier } from '../types/device.types';
5
+ export declare class HumidifierAccessory extends BaseAccessory {
6
+ protected readonly device: VeSyncHumidifier;
7
+ constructor(platform: TSVESyncPlatform, accessory: PlatformAccessory, device: VeSyncHumidifier);
8
+ protected setupService(): void;
9
+ protected updateDeviceSpecificStates(details: any): void;
10
+ protected getDeviceCapabilities(): DeviceCapabilities;
11
+ private getActive;
12
+ private setActive;
13
+ private getCurrentState;
14
+ private getTargetState;
15
+ private setTargetState;
16
+ private getCurrentHumidity;
17
+ private getTargetHumidity;
18
+ private setTargetHumidity;
19
+ private getRotationSpeed;
20
+ private setRotationSpeed;
21
+ private getWaterLevel;
22
+ private getLockPhysicalControls;
23
+ private setLockPhysicalControls;
24
+ }
25
+ //# sourceMappingURL=humidifier.accessory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humidifier.accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/humidifier.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,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE7E,qBAAa,mBAAoB,SAAQ,aAAa;IACpD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;gBAG1C,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,gBAAgB;IAM1B,SAAS,CAAC,YAAY,IAAI,IAAI;IAmE9B,SAAS,CAAC,0BAA0B,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAyDxD,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;YAcvC,SAAS;YAIT,SAAS;YAeT,eAAe;YAIf,cAAc;YAId,cAAc;YAOd,kBAAkB;YAIlB,iBAAiB;YAIjB,iBAAiB;YAcjB,gBAAgB;YAIhB,gBAAgB;YAehB,aAAa;YAIb,uBAAuB;YAIvB,uBAAuB;CAkBtC"}
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HumidifierAccessory = void 0;
4
+ const base_accessory_1 = require("./base.accessory");
5
+ class HumidifierAccessory extends base_accessory_1.BaseAccessory {
6
+ constructor(platform, accessory, device) {
7
+ super(platform, accessory, device);
8
+ this.device = device;
9
+ }
10
+ setupService() {
11
+ // Get or create the humidifier service
12
+ this.service = this.accessory.getService(this.platform.Service.HumidifierDehumidifier) ||
13
+ this.accessory.addService(this.platform.Service.HumidifierDehumidifier);
14
+ // Set up required characteristics
15
+ this.setupCharacteristic(this.platform.Characteristic.Active, this.getActive.bind(this), this.setActive.bind(this));
16
+ this.setupCharacteristic(this.platform.Characteristic.CurrentHumidifierDehumidifierState, this.getCurrentState.bind(this));
17
+ this.setupCharacteristic(this.platform.Characteristic.TargetHumidifierDehumidifierState, this.getTargetState.bind(this), this.setTargetState.bind(this));
18
+ this.setupCharacteristic(this.platform.Characteristic.CurrentRelativeHumidity, this.getCurrentHumidity.bind(this));
19
+ this.setupCharacteristic(this.platform.Characteristic.RelativeHumidityHumidifierThreshold, this.getTargetHumidity.bind(this), this.setTargetHumidity.bind(this));
20
+ // Set up optional characteristics based on device capabilities
21
+ const capabilities = this.getDeviceCapabilities();
22
+ if (capabilities.hasSpeed) {
23
+ this.setupCharacteristic(this.platform.Characteristic.RotationSpeed, this.getRotationSpeed.bind(this), this.setRotationSpeed.bind(this));
24
+ }
25
+ if (capabilities.hasWaterLevel) {
26
+ this.setupCharacteristic(this.platform.Characteristic.WaterLevel, this.getWaterLevel.bind(this));
27
+ }
28
+ if (capabilities.hasChildLock) {
29
+ this.setupCharacteristic(this.platform.Characteristic.LockPhysicalControls, this.getLockPhysicalControls.bind(this), this.setLockPhysicalControls.bind(this));
30
+ }
31
+ // Add Name characteristic
32
+ this.setupCharacteristic(this.platform.Characteristic.Name, async () => this.device.deviceName);
33
+ }
34
+ updateDeviceSpecificStates(details) {
35
+ const capabilities = this.getDeviceCapabilities();
36
+ // Update humidity states
37
+ if (details.humidity !== undefined) {
38
+ this.updateCharacteristicValue(this.platform.Characteristic.CurrentRelativeHumidity, details.humidity);
39
+ }
40
+ if (details.targetHumidity !== undefined) {
41
+ this.updateCharacteristicValue(this.platform.Characteristic.RelativeHumidityHumidifierThreshold, details.targetHumidity);
42
+ }
43
+ // Update speed if available
44
+ if (capabilities.hasSpeed && details.speed !== undefined) {
45
+ const normalizedSpeed = (details.speed / this.device.maxSpeed) * 100;
46
+ this.updateCharacteristicValue(this.platform.Characteristic.RotationSpeed, normalizedSpeed);
47
+ }
48
+ // Update water level if available
49
+ if (capabilities.hasWaterLevel && details.waterLevel !== undefined) {
50
+ this.updateCharacteristicValue(this.platform.Characteristic.WaterLevel, details.waterLevel);
51
+ }
52
+ // Update child lock if available
53
+ if (capabilities.hasChildLock && details.childLock !== undefined) {
54
+ this.updateCharacteristicValue(this.platform.Characteristic.LockPhysicalControls, details.childLock ? 1 : 0);
55
+ }
56
+ // Update active state
57
+ const isActive = details.deviceStatus === 'on';
58
+ this.updateCharacteristicValue(this.platform.Characteristic.Active, isActive ? 1 : 0);
59
+ // Update current state
60
+ this.updateCharacteristicValue(this.platform.Characteristic.CurrentHumidifierDehumidifierState, isActive ? 2 : 0 // 0 = INACTIVE, 2 = HUMIDIFYING
61
+ );
62
+ }
63
+ getDeviceCapabilities() {
64
+ return {
65
+ hasBrightness: false,
66
+ hasColorTemp: false,
67
+ hasColor: false,
68
+ hasSpeed: true,
69
+ hasHumidity: true,
70
+ hasAirQuality: false,
71
+ hasWaterLevel: true,
72
+ hasChildLock: true,
73
+ hasSwingMode: false,
74
+ };
75
+ }
76
+ async getActive() {
77
+ return this.device.deviceStatus === 'on' ? 1 : 0;
78
+ }
79
+ async setActive(value) {
80
+ try {
81
+ const isOn = value === 1;
82
+ const success = isOn ? await this.device.turnOn() : await this.device.turnOff();
83
+ if (!success) {
84
+ throw new Error(`Failed to turn ${isOn ? 'on' : 'off'} device`);
85
+ }
86
+ await this.persistDeviceState('deviceStatus', isOn ? 'on' : 'off');
87
+ }
88
+ catch (error) {
89
+ this.handleDeviceError('set active state', error);
90
+ }
91
+ }
92
+ async getCurrentState() {
93
+ return this.device.deviceStatus === 'on' ? 2 : 0; // 0 = INACTIVE, 2 = HUMIDIFYING
94
+ }
95
+ async getTargetState() {
96
+ return 1; // 1 = HUMIDIFIER (we only support humidifier mode)
97
+ }
98
+ async setTargetState(value) {
99
+ // No-op as we only support humidifier mode
100
+ if (value !== 1) {
101
+ throw new Error('Only humidifier mode is supported');
102
+ }
103
+ }
104
+ async getCurrentHumidity() {
105
+ return this.device.humidity;
106
+ }
107
+ async getTargetHumidity() {
108
+ return this.device.targetHumidity;
109
+ }
110
+ async setTargetHumidity(value) {
111
+ try {
112
+ const success = await this.device.setTargetHumidity(value);
113
+ if (!success) {
114
+ throw new Error(`Failed to set target humidity to ${value}`);
115
+ }
116
+ await this.persistDeviceState('targetHumidity', value);
117
+ }
118
+ catch (error) {
119
+ this.handleDeviceError('set target humidity', error);
120
+ }
121
+ }
122
+ async getRotationSpeed() {
123
+ return (this.device.speed / this.device.maxSpeed) * 100;
124
+ }
125
+ async setRotationSpeed(value) {
126
+ try {
127
+ const speed = Math.round((value / 100) * this.device.maxSpeed);
128
+ const success = await this.device.setSpeed(speed);
129
+ if (!success) {
130
+ throw new Error(`Failed to set speed to ${speed}`);
131
+ }
132
+ await this.persistDeviceState('speed', speed);
133
+ }
134
+ catch (error) {
135
+ this.handleDeviceError('set rotation speed', error);
136
+ }
137
+ }
138
+ async getWaterLevel() {
139
+ return this.device.waterLevel || 0;
140
+ }
141
+ async getLockPhysicalControls() {
142
+ return this.device.childLock ? 1 : 0;
143
+ }
144
+ async setLockPhysicalControls(value) {
145
+ try {
146
+ if (!this.device.setChildLock) {
147
+ throw new Error('Device does not support child lock');
148
+ }
149
+ const enabled = value === 1;
150
+ const success = await this.device.setChildLock(enabled);
151
+ if (!success) {
152
+ throw new Error(`Failed to ${enabled ? 'enable' : 'disable'} child lock`);
153
+ }
154
+ await this.persistDeviceState('childLock', enabled);
155
+ }
156
+ catch (error) {
157
+ this.handleDeviceError('set child lock', error);
158
+ }
159
+ }
160
+ }
161
+ exports.HumidifierAccessory = HumidifierAccessory;
162
+ //# sourceMappingURL=humidifier.accessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humidifier.accessory.js","sourceRoot":"","sources":["../../src/accessories/humidifier.accessory.ts"],"names":[],"mappings":"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"}