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.
- package/.cursorrules +177 -0
- package/README.md +3 -1
- package/dist/accessories/air-purifier.accessory.d.ts +25 -0
- package/dist/accessories/air-purifier.accessory.d.ts.map +1 -0
- package/dist/accessories/air-purifier.accessory.js +170 -0
- package/dist/accessories/air-purifier.accessory.js.map +1 -0
- package/dist/accessories/base.accessory.d.ts +78 -0
- package/dist/accessories/base.accessory.d.ts.map +1 -0
- package/dist/accessories/base.accessory.js +231 -0
- package/dist/accessories/base.accessory.js.map +1 -0
- package/dist/accessories/fan.accessory.d.ts +22 -0
- package/dist/accessories/fan.accessory.d.ts.map +1 -0
- package/dist/accessories/fan.accessory.js +166 -0
- package/dist/accessories/fan.accessory.js.map +1 -0
- package/dist/accessories/humidifier.accessory.d.ts +25 -0
- package/dist/accessories/humidifier.accessory.d.ts.map +1 -0
- package/dist/accessories/humidifier.accessory.js +162 -0
- package/dist/accessories/humidifier.accessory.js.map +1 -0
- package/dist/accessories/light.accessory.d.ts +24 -0
- package/dist/accessories/light.accessory.d.ts.map +1 -0
- package/dist/accessories/light.accessory.js +169 -0
- package/dist/accessories/light.accessory.js.map +1 -0
- package/dist/accessories/outlet.accessory.d.ts +20 -0
- package/dist/accessories/outlet.accessory.d.ts.map +1 -0
- package/dist/accessories/outlet.accessory.js +145 -0
- package/dist/accessories/outlet.accessory.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +19 -3
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +117 -50
- package/dist/platform.js.map +1 -1
- package/dist/types/device.types.d.ts +69 -0
- package/dist/types/device.types.d.ts.map +1 -0
- package/dist/types/device.types.js +3 -0
- package/dist/types/device.types.js.map +1 -0
- package/dist/types/polling.types.d.ts +10 -0
- package/dist/types/polling.types.d.ts.map +1 -0
- package/dist/types/polling.types.js +49 -0
- package/dist/types/polling.types.js.map +1 -0
- package/dist/utils/device-factory.d.ts +16 -0
- package/dist/utils/device-factory.d.ts.map +1 -0
- package/dist/utils/device-factory.js +104 -0
- package/dist/utils/device-factory.js.map +1 -0
- package/dist/utils/logger.d.ts +53 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +107 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/polling-manager.d.ts +46 -0
- package/dist/utils/polling-manager.d.ts.map +1 -0
- package/dist/utils/polling-manager.js +107 -0
- package/dist/utils/polling-manager.js.map +1 -0
- package/dist/utils/retry.d.ts +24 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +53 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +3 -3
- package/src/accessories/air-purifier.accessory.ts +279 -0
- package/src/accessories/base.accessory.ts +332 -0
- package/src/accessories/fan.accessory.ts +243 -0
- package/src/accessories/humidifier.accessory.ts +257 -0
- package/src/accessories/light.accessory.ts +255 -0
- package/src/accessories/outlet.accessory.ts +205 -0
- package/src/index.ts +3 -0
- package/src/platform.ts +140 -58
- package/src/types/device.types.ts +79 -0
- package/src/types/polling.types.ts +59 -0
- package/src/utils/device-factory.ts +141 -0
- package/src/utils/logger.ts +130 -0
- package/src/utils/polling-manager.ts +138 -0
- package/src/utils/retry.ts +77 -0
- package/dist/platformAccessory.d.ts +0 -21
- package/dist/platformAccessory.d.ts.map +0 -1
- package/dist/platformAccessory.js +0 -139
- package/dist/platformAccessory.js.map +0 -1
- package/package/LICENSE +0 -21
- package/package/README.md +0 -227
- package/package/api/vesync/VeSync.yaml +0 -33
- package/package/api/vesyncbulb/ESL100.yaml +0 -74
- package/package/api/vesyncbulb/ESL100CW.yaml +0 -123
- package/package/api/vesyncbulb/ESL100MC.yaml +0 -169
- package/package/api/vesyncbulb/XYD0001.yaml +0 -193
- package/package/api/vesyncfan/Classic200S.yaml +0 -280
- package/package/api/vesyncfan/Classic300S.yaml +0 -278
- package/package/api/vesyncfan/Core200S.yaml +0 -256
- package/package/api/vesyncfan/Core300S.yaml +0 -281
- package/package/api/vesyncfan/Core400S.yaml +0 -281
- package/package/api/vesyncfan/Core600S.yaml +0 -281
- package/package/api/vesyncfan/Dual200S.yaml +0 -278
- package/package/api/vesyncfan/LAP-C201S-AUSR.yaml +0 -256
- package/package/api/vesyncfan/LAP-C202S-WUSR.yaml +0 -256
- package/package/api/vesyncfan/LAP-C301S-WAAA.yaml +0 -281
- package/package/api/vesyncfan/LAP-C301S-WJP.yaml +0 -281
- package/package/api/vesyncfan/LAP-C302S-WUSB.yaml +0 -281
- package/package/api/vesyncfan/LAP-C401S-WAAA.yaml +0 -281
- package/package/api/vesyncfan/LAP-C401S-WJP.yaml +0 -281
- package/package/api/vesyncfan/LAP-C401S-WUSR.yaml +0 -281
- package/package/api/vesyncfan/LAP-C601S-WEU.yaml +0 -281
- package/package/api/vesyncfan/LAP-C601S-WUS.yaml +0 -281
- package/package/api/vesyncfan/LAP-C601S-WUSR.yaml +0 -281
- package/package/api/vesyncfan/LAP-EL551S-AEUR.yaml +0 -167
- package/package/api/vesyncfan/LAP-EL551S-AUS.yaml +0 -167
- package/package/api/vesyncfan/LAP-EL551S-WEU.yaml +0 -167
- package/package/api/vesyncfan/LAP-EL551S-WUS.yaml +0 -167
- package/package/api/vesyncfan/LAP-V102S-AASR.yaml +0 -167
- package/package/api/vesyncfan/LAP-V102S-AUSR.yaml +0 -167
- package/package/api/vesyncfan/LAP-V102S-WEU.yaml +0 -167
- package/package/api/vesyncfan/LAP-V102S-WJP.yaml +0 -167
- package/package/api/vesyncfan/LAP-V102S-WUS.yaml +0 -167
- package/package/api/vesyncfan/LAP-V201-AUSR.yaml +0 -167
- package/package/api/vesyncfan/LAP-V201S-AASR.yaml +0 -167
- package/package/api/vesyncfan/LAP-V201S-AEUR.yaml +0 -167
- package/package/api/vesyncfan/LAP-V201S-AUSR.yaml +0 -167
- package/package/api/vesyncfan/LAP-V201S-WEU.yaml +0 -167
- package/package/api/vesyncfan/LAP-V201S-WJP.yaml +0 -167
- package/package/api/vesyncfan/LAP-V201S-WUS.yaml +0 -167
- package/package/api/vesyncfan/LEH-S601S-WUS.yaml +0 -303
- package/package/api/vesyncfan/LEH-S601S-WUSR.yaml +0 -82
- package/package/api/vesyncfan/LTF-F422S-KEU.yaml +0 -165
- package/package/api/vesyncfan/LTF-F422S-WUS.yaml +0 -165
- package/package/api/vesyncfan/LTF-F422S-WUSR.yaml +0 -167
- package/package/api/vesyncfan/LTF-F422_WJP.yaml +0 -165
- package/package/api/vesyncfan/LUH-A601S-AUSW.yaml +0 -82
- package/package/api/vesyncfan/LUH-A601S-WUSB.yaml +0 -305
- package/package/api/vesyncfan/LUH-A602S-WEU.yaml +0 -305
- package/package/api/vesyncfan/LUH-A602S-WEUR.yaml +0 -305
- package/package/api/vesyncfan/LUH-A602S-WJP.yaml +0 -305
- package/package/api/vesyncfan/LUH-A602S-WUS.yaml +0 -305
- package/package/api/vesyncfan/LUH-A602S-WUSC.yaml +0 -305
- package/package/api/vesyncfan/LUH-A602S-WUSR.yaml +0 -305
- package/package/api/vesyncfan/LUH-D301S-WEU.yaml +0 -305
- package/package/api/vesyncfan/LUH-D301S-WJP.yaml +0 -305
- package/package/api/vesyncfan/LUH-D301S-WUSR.yaml +0 -305
- package/package/api/vesyncfan/LUH-M101S-WUS.yaml +0 -278
- package/package/api/vesyncfan/LUH-O451S-WEU.yaml +0 -278
- package/package/api/vesyncfan/LUH-O451S-WUS.yaml +0 -278
- package/package/api/vesyncfan/LUH-O451S-WUSR.yaml +0 -305
- package/package/api/vesyncfan/LUH-O601S-KUS.yaml +0 -305
- package/package/api/vesyncfan/LUH-O601S-WUS.yaml +0 -305
- package/package/api/vesyncfan/LV-PUR131S.yaml +0 -108
- package/package/api/vesyncfan/LV-RH131S.yaml +0 -108
- package/package/api/vesyncoutlet/ESO15-TB.yaml +0 -124
- package/package/api/vesyncoutlet/ESW01-EU.yaml +0 -122
- package/package/api/vesyncoutlet/ESW03-USA.yaml +0 -122
- package/package/api/vesyncoutlet/ESW15-USA.yaml +0 -156
- package/package/api/vesyncoutlet/wifi-switch-1.3.yaml +0 -60
- package/package/api/vesyncswitch/ESWD16.yaml +0 -128
- package/package/api/vesyncswitch/ESWL01.yaml +0 -56
- package/package/api/vesyncswitch/ESWL03.yaml +0 -56
- package/package/package.json +0 -53
- package/package/src/lib/helpers.ts +0 -290
- package/package/src/lib/vesync.ts +0 -530
- package/package/src/lib/vesyncBaseDevice.ts +0 -114
- package/package/src/lib/vesyncBulb.ts +0 -252
- package/package/src/lib/vesyncBulbImpl.ts +0 -215
- package/package/src/lib/vesyncFan.ts +0 -447
- package/package/src/lib/vesyncFanImpl.ts +0 -848
- package/package/src/lib/vesyncOutlet.ts +0 -148
- package/package/src/lib/vesyncOutletImpl.ts +0 -284
- package/package/src/lib/vesyncSwitch.ts +0 -546
- package/package/src/lib/vesyncSwitchImpl.ts +0 -408
- package/src/platformAccessory.ts +0 -166
- package/src/tsvesync.d.ts +0 -26
- 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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"}
|