homebridge-tsvesync 1.0.54 → 1.0.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/accessories/fan.accessory.d.ts +1 -0
- package/dist/accessories/fan.accessory.d.ts.map +1 -1
- package/dist/accessories/fan.accessory.js +44 -92
- package/dist/accessories/fan.accessory.js.map +1 -1
- package/dist/accessories/humidifier.accessory.d.ts +12 -0
- package/dist/accessories/humidifier.accessory.d.ts.map +1 -1
- package/dist/accessories/humidifier.accessory.js +130 -87
- package/dist/accessories/humidifier.accessory.js.map +1 -1
- package/dist/types/device.types.d.ts +37 -1
- package/dist/types/device.types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/accessories/fan.accessory.ts +47 -57
- package/src/accessories/humidifier.accessory.ts +190 -70
- package/src/types/device.types.ts +39 -1
|
@@ -5,6 +5,7 @@ import { DeviceCapabilities, VeSyncFan } from '../types/device.types';
|
|
|
5
5
|
export declare class FanAccessory extends BaseAccessory {
|
|
6
6
|
protected readonly device: VeSyncFan;
|
|
7
7
|
private readonly capabilities;
|
|
8
|
+
private readonly speedLevels;
|
|
8
9
|
constructor(platform: TSVESyncPlatform, accessory: PlatformAccessory, device: VeSyncFan);
|
|
9
10
|
protected setupService(): void;
|
|
10
11
|
/**
|
|
@@ -1 +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;
|
|
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;AAqCtE,qBAAa,YAAa,SAAQ,aAAa;IAC7C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAW;gBAGrC,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,SAAS;IAQnB,SAAS,CAAC,YAAY,IAAI,IAAI;IAwD9B;;OAEG;cACa,0BAA0B,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAsDvE,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;YAcvC,SAAS;YAIT,SAAS;YAiBT,sBAAsB;YAkBtB,gBAAgB;YAiBhB,oBAAoB;YAMpB,oBAAoB;YAmBpB,YAAY;YAIZ,YAAY;YAmBZ,uBAAuB;YAIvB,uBAAuB;IAmBrC,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,aAAa;YASP,OAAO;YAIP,OAAO;CActB"}
|
|
@@ -10,11 +10,36 @@ const MODE_NORMAL = 0;
|
|
|
10
10
|
const MODE_AUTO = 1;
|
|
11
11
|
const MODE_SLEEP = 2;
|
|
12
12
|
const MODE_TURBO = 3;
|
|
13
|
+
// Fan speed levels for different device types
|
|
14
|
+
const FAN_SPEED_LEVELS = {
|
|
15
|
+
'LTF-F422S-KEU': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
|
|
16
|
+
'LTF-F422S-WUSR': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
|
|
17
|
+
'LTF-F422_WJP': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
|
|
18
|
+
'LTF-F422S-WUS': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
|
|
19
|
+
'Core200S': [1, 2, 3],
|
|
20
|
+
'Core300S': [1, 2, 3, 4],
|
|
21
|
+
'Core400S': [1, 2, 3, 4],
|
|
22
|
+
'Core600S': [1, 2, 3, 4],
|
|
23
|
+
'LAP-C201S-AUSR': [1, 2, 3],
|
|
24
|
+
'LAP-C202S-WUSR': [1, 2, 3],
|
|
25
|
+
'LAP-C301S-WJP': [1, 2, 3, 4],
|
|
26
|
+
'LAP-C302S-WUSB': [1, 2, 3, 4],
|
|
27
|
+
'LAP-C301S-WAAA': [1, 2, 3, 4],
|
|
28
|
+
'LAP-C401S-WJP': [1, 2, 3, 4],
|
|
29
|
+
'LAP-C401S-WUSR': [1, 2, 3, 4],
|
|
30
|
+
'LAP-C401S-WAAA': [1, 2, 3, 4],
|
|
31
|
+
'LAP-C601S-WUS': [1, 2, 3, 4],
|
|
32
|
+
'LAP-C601S-WUSR': [1, 2, 3, 4],
|
|
33
|
+
'LAP-C601S-WEU': [1, 2, 3, 4],
|
|
34
|
+
'LV-PUR131S': [1, 2, 3],
|
|
35
|
+
'LV-RH131S': [1, 2, 3]
|
|
36
|
+
};
|
|
13
37
|
class FanAccessory extends base_accessory_1.BaseAccessory {
|
|
14
38
|
constructor(platform, accessory, device) {
|
|
15
39
|
super(platform, accessory, device);
|
|
16
40
|
this.device = device;
|
|
17
41
|
this.capabilities = this.getDeviceCapabilities();
|
|
42
|
+
this.speedLevels = FAN_SPEED_LEVELS[this.device.deviceType] || [1, 2, 3, 4];
|
|
18
43
|
}
|
|
19
44
|
setupService() {
|
|
20
45
|
// Get or create the fan service
|
|
@@ -50,46 +75,14 @@ class FanAccessory extends base_accessory_1.BaseAccessory {
|
|
|
50
75
|
this.updateCharacteristicValue(this.platform.Characteristic.Active, isActive ? 1 : 0);
|
|
51
76
|
// Update current state (INACTIVE = 0, IDLE = 1, BLOWING_AIR = 2)
|
|
52
77
|
this.updateCharacteristicValue(this.platform.Characteristic.CurrentFanState, isActive ? 2 : 0);
|
|
53
|
-
// Update rotation speed
|
|
78
|
+
// Update rotation speed
|
|
54
79
|
let rotationSpeed = 0;
|
|
55
80
|
if (isActive && fanDetails.speed !== undefined) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
rotationSpeed = 17;
|
|
62
|
-
break; // 17%
|
|
63
|
-
case 3:
|
|
64
|
-
rotationSpeed = 25;
|
|
65
|
-
break; // 25%
|
|
66
|
-
case 4:
|
|
67
|
-
rotationSpeed = 33;
|
|
68
|
-
break; // 33%
|
|
69
|
-
case 5:
|
|
70
|
-
rotationSpeed = 42;
|
|
71
|
-
break; // 42%
|
|
72
|
-
case 6:
|
|
73
|
-
rotationSpeed = 50;
|
|
74
|
-
break; // 50%
|
|
75
|
-
case 7:
|
|
76
|
-
rotationSpeed = 58;
|
|
77
|
-
break; // 58%
|
|
78
|
-
case 8:
|
|
79
|
-
rotationSpeed = 67;
|
|
80
|
-
break; // 67%
|
|
81
|
-
case 9:
|
|
82
|
-
rotationSpeed = 75;
|
|
83
|
-
break; // 75%
|
|
84
|
-
case 10:
|
|
85
|
-
rotationSpeed = 83;
|
|
86
|
-
break; // 83%
|
|
87
|
-
case 11:
|
|
88
|
-
rotationSpeed = 92;
|
|
89
|
-
break; // 92%
|
|
90
|
-
case 12:
|
|
91
|
-
rotationSpeed = 100;
|
|
92
|
-
break; // 100%
|
|
81
|
+
const speedIndex = this.speedLevels.indexOf(fanDetails.speed);
|
|
82
|
+
if (speedIndex !== -1) {
|
|
83
|
+
const maxLevel = this.speedLevels.length;
|
|
84
|
+
const levelSize = 100 / maxLevel;
|
|
85
|
+
rotationSpeed = Math.round((speedIndex + 1) * levelSize);
|
|
93
86
|
}
|
|
94
87
|
}
|
|
95
88
|
this.updateCharacteristicValue(this.platform.Characteristic.RotationSpeed, rotationSpeed);
|
|
@@ -141,67 +134,26 @@ class FanAccessory extends base_accessory_1.BaseAccessory {
|
|
|
141
134
|
await this.device.turnOff();
|
|
142
135
|
return;
|
|
143
136
|
}
|
|
144
|
-
// Convert HomeKit percentage
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
else if (percentage <= 17) {
|
|
150
|
-
speed = 2; // Speed 2 (17%)
|
|
151
|
-
}
|
|
152
|
-
else if (percentage <= 25) {
|
|
153
|
-
speed = 3; // Speed 3 (25%)
|
|
154
|
-
}
|
|
155
|
-
else if (percentage <= 33) {
|
|
156
|
-
speed = 4; // Speed 4 (33%)
|
|
157
|
-
}
|
|
158
|
-
else if (percentage <= 42) {
|
|
159
|
-
speed = 5; // Speed 5 (42%)
|
|
160
|
-
}
|
|
161
|
-
else if (percentage <= 50) {
|
|
162
|
-
speed = 6; // Speed 6 (50%)
|
|
163
|
-
}
|
|
164
|
-
else if (percentage <= 58) {
|
|
165
|
-
speed = 7; // Speed 7 (58%)
|
|
166
|
-
}
|
|
167
|
-
else if (percentage <= 67) {
|
|
168
|
-
speed = 8; // Speed 8 (67%)
|
|
169
|
-
}
|
|
170
|
-
else if (percentage <= 75) {
|
|
171
|
-
speed = 9; // Speed 9 (75%)
|
|
172
|
-
}
|
|
173
|
-
else if (percentage <= 83) {
|
|
174
|
-
speed = 10; // Speed 10 (83%)
|
|
175
|
-
}
|
|
176
|
-
else if (percentage <= 92) {
|
|
177
|
-
speed = 11; // Speed 11 (92%)
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
speed = 12; // Speed 12 (100%)
|
|
181
|
-
}
|
|
137
|
+
// Convert HomeKit percentage to device speed level
|
|
138
|
+
const maxLevel = this.speedLevels.length;
|
|
139
|
+
const levelSize = 100 / maxLevel;
|
|
140
|
+
const levelIndex = Math.min(Math.floor(percentage / levelSize), maxLevel - 1);
|
|
141
|
+
const speed = this.speedLevels[levelIndex];
|
|
182
142
|
await this.device.changeFanSpeed(speed);
|
|
183
143
|
}
|
|
184
144
|
async getRotationSpeed() {
|
|
185
145
|
if (this.device.speed === undefined || this.device.speed === null) {
|
|
186
146
|
return 0;
|
|
187
147
|
}
|
|
188
|
-
// Convert device speed
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
case 3: return 25; // 3 (25%)
|
|
194
|
-
case 4: return 33; // 4 (33%)
|
|
195
|
-
case 5: return 42; // 5 (42%)
|
|
196
|
-
case 6: return 50; // 6 (50%)
|
|
197
|
-
case 7: return 58; // 7 (58%)
|
|
198
|
-
case 8: return 67; // 8 (67%)
|
|
199
|
-
case 9: return 75; // 9 (75%)
|
|
200
|
-
case 10: return 83; // 10 (83%)
|
|
201
|
-
case 11: return 92; // 11 (92%)
|
|
202
|
-
case 12: return 100; // 12 (100%)
|
|
203
|
-
default: return 0; // Off
|
|
148
|
+
// Convert device speed to HomeKit percentage
|
|
149
|
+
const currentSpeed = this.device.speed;
|
|
150
|
+
const speedIndex = this.speedLevels.indexOf(currentSpeed);
|
|
151
|
+
if (speedIndex === -1) {
|
|
152
|
+
return 0;
|
|
204
153
|
}
|
|
154
|
+
const maxLevel = this.speedLevels.length;
|
|
155
|
+
const levelSize = 100 / maxLevel;
|
|
156
|
+
return Math.round((speedIndex + 1) * levelSize);
|
|
205
157
|
}
|
|
206
158
|
async getRotationDirection() {
|
|
207
159
|
return 'oscillation' in this.device && this.device.oscillation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fan.accessory.js","sourceRoot":"","sources":["../../src/accessories/fan.accessory.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fan.accessory.js","sourceRoot":"","sources":["../../src/accessories/fan.accessory.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { DeviceCapabilities, VeSyncHumidifier } from '../types/device.types';
|
|
|
5
5
|
export declare class HumidifierAccessory extends BaseAccessory {
|
|
6
6
|
protected readonly device: VeSyncHumidifier;
|
|
7
7
|
private readonly capabilities;
|
|
8
|
+
private readonly mistLevels;
|
|
8
9
|
constructor(platform: TSVESyncPlatform, accessory: PlatformAccessory, device: VeSyncHumidifier);
|
|
9
10
|
protected setupService(): void;
|
|
10
11
|
/**
|
|
@@ -14,7 +15,18 @@ export declare class HumidifierAccessory extends BaseAccessory {
|
|
|
14
15
|
protected getDeviceCapabilities(): DeviceCapabilities;
|
|
15
16
|
private getActive;
|
|
16
17
|
private setActive;
|
|
18
|
+
private getCurrentState;
|
|
19
|
+
private getTargetState;
|
|
20
|
+
private setTargetState;
|
|
21
|
+
private getCurrentHumidity;
|
|
22
|
+
private getTargetHumidity;
|
|
23
|
+
private setTargetHumidity;
|
|
24
|
+
private getWaterLevel;
|
|
25
|
+
private convertMistLevelToPercentage;
|
|
26
|
+
private convertPercentageToMistLevel;
|
|
17
27
|
private getRotationSpeed;
|
|
18
28
|
private handleSetRotationSpeed;
|
|
29
|
+
private getLockPhysicalControls;
|
|
30
|
+
private setLockPhysicalControls;
|
|
19
31
|
}
|
|
20
32
|
//# sourceMappingURL=humidifier.accessory.d.ts.map
|
|
@@ -1 +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;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;
|
|
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;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAW;gBAGpC,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,gBAAgB;IAW1B,SAAS,CAAC,YAAY,IAAI,IAAI;IAmE9B;;OAEG;cACa,0BAA0B,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAyEvE,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;YAcvC,SAAS;YAIT,SAAS;YAeT,eAAe;YAWf,cAAc;YAId,cAAc;YAId,kBAAkB;YAIlB,iBAAiB;YAIjB,iBAAiB;YAiBjB,aAAa;IAI3B,OAAO,CAAC,4BAA4B;IAKpC,OAAO,CAAC,4BAA4B;YAMtB,gBAAgB;YAIhB,sBAAsB;YAsBtB,uBAAuB;YAIvB,uBAAuB;CActC"}
|
|
@@ -7,6 +7,9 @@ class HumidifierAccessory extends base_accessory_1.BaseAccessory {
|
|
|
7
7
|
super(platform, accessory, device);
|
|
8
8
|
this.device = device;
|
|
9
9
|
this.capabilities = this.getDeviceCapabilities();
|
|
10
|
+
// Get mist levels from device config
|
|
11
|
+
const config = device.details.configuration;
|
|
12
|
+
this.mistLevels = (config === null || config === void 0 ? void 0 : config.levels) || [1, 2, 3, 4, 5, 6, 7, 8, 9];
|
|
10
13
|
}
|
|
11
14
|
setupService() {
|
|
12
15
|
// Get or create the humidifier service
|
|
@@ -14,8 +17,22 @@ class HumidifierAccessory extends base_accessory_1.BaseAccessory {
|
|
|
14
17
|
this.accessory.addService(this.platform.Service.HumidifierDehumidifier);
|
|
15
18
|
// Set up required characteristics
|
|
16
19
|
this.setupCharacteristic(this.platform.Characteristic.Active, this.getActive.bind(this), this.setActive.bind(this));
|
|
17
|
-
// Set up
|
|
20
|
+
// Set up current and target state
|
|
21
|
+
this.setupCharacteristic(this.platform.Characteristic.CurrentHumidifierDehumidifierState, this.getCurrentState.bind(this));
|
|
22
|
+
this.setupCharacteristic(this.platform.Characteristic.TargetHumidifierDehumidifierState, this.getTargetState.bind(this), this.setTargetState.bind(this));
|
|
23
|
+
// Set up humidity control
|
|
24
|
+
this.setupCharacteristic(this.platform.Characteristic.CurrentRelativeHumidity, this.getCurrentHumidity.bind(this));
|
|
25
|
+
this.setupCharacteristic(this.platform.Characteristic.RelativeHumidityHumidifierThreshold, this.getTargetHumidity.bind(this), this.setTargetHumidity.bind(this));
|
|
26
|
+
// Set up water level if supported
|
|
27
|
+
if (this.capabilities.hasWaterLevel) {
|
|
28
|
+
this.setupCharacteristic(this.platform.Characteristic.WaterLevel, this.getWaterLevel.bind(this));
|
|
29
|
+
}
|
|
30
|
+
// Set up speed control (maps to mist level)
|
|
18
31
|
this.setupCharacteristic(this.platform.Characteristic.RotationSpeed, this.getRotationSpeed.bind(this), this.handleSetRotationSpeed.bind(this));
|
|
32
|
+
// Set up child lock if supported
|
|
33
|
+
if (this.capabilities.hasChildLock) {
|
|
34
|
+
this.setupCharacteristic(this.platform.Characteristic.LockPhysicalControls, this.getLockPhysicalControls.bind(this), this.setLockPhysicalControls.bind(this));
|
|
35
|
+
}
|
|
19
36
|
// Add Name characteristic
|
|
20
37
|
this.setupCharacteristic(this.platform.Characteristic.Name, async () => this.device.deviceName);
|
|
21
38
|
}
|
|
@@ -23,49 +40,45 @@ class HumidifierAccessory extends base_accessory_1.BaseAccessory {
|
|
|
23
40
|
* Update device states based on the latest details
|
|
24
41
|
*/
|
|
25
42
|
async updateDeviceSpecificStates(details) {
|
|
26
|
-
const humidifierDetails = details;
|
|
43
|
+
const humidifierDetails = this.device.details;
|
|
27
44
|
// Update active state
|
|
28
|
-
const isActive =
|
|
45
|
+
const isActive = this.device.deviceStatus === 'on';
|
|
29
46
|
this.updateCharacteristicValue(this.platform.Characteristic.Active, isActive ? 1 : 0);
|
|
30
|
-
// Update current state
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
let rotationSpeed = 0;
|
|
37
|
-
if (isActive && humidifierDetails.speed !== undefined) {
|
|
38
|
-
switch (humidifierDetails.speed) {
|
|
39
|
-
case 1:
|
|
40
|
-
rotationSpeed = 11;
|
|
41
|
-
break;
|
|
42
|
-
case 2:
|
|
43
|
-
rotationSpeed = 22;
|
|
44
|
-
break;
|
|
45
|
-
case 3:
|
|
46
|
-
rotationSpeed = 33;
|
|
47
|
-
break;
|
|
48
|
-
case 4:
|
|
49
|
-
rotationSpeed = 44;
|
|
50
|
-
break;
|
|
51
|
-
case 5:
|
|
52
|
-
rotationSpeed = 55;
|
|
47
|
+
// Update current state based on device state
|
|
48
|
+
let currentState = 0; // INACTIVE
|
|
49
|
+
if (isActive) {
|
|
50
|
+
switch (this.device.currentState) {
|
|
51
|
+
case 'idle':
|
|
52
|
+
currentState = 1; // IDLE
|
|
53
53
|
break;
|
|
54
|
-
case
|
|
55
|
-
|
|
56
|
-
break;
|
|
57
|
-
case 7:
|
|
58
|
-
rotationSpeed = 77;
|
|
59
|
-
break;
|
|
60
|
-
case 8:
|
|
61
|
-
rotationSpeed = 88;
|
|
62
|
-
break;
|
|
63
|
-
case 9:
|
|
64
|
-
rotationSpeed = 100;
|
|
54
|
+
case 'humidifying':
|
|
55
|
+
currentState = 2; // HUMIDIFYING
|
|
65
56
|
break;
|
|
57
|
+
default:
|
|
58
|
+
currentState = 0; // INACTIVE
|
|
66
59
|
}
|
|
67
60
|
}
|
|
61
|
+
this.updateCharacteristicValue(this.platform.Characteristic.CurrentHumidifierDehumidifierState, currentState);
|
|
62
|
+
// Update target state (always humidifier mode)
|
|
63
|
+
this.updateCharacteristicValue(this.platform.Characteristic.TargetHumidifierDehumidifierState, 1 // 1 = HUMIDIFIER
|
|
64
|
+
);
|
|
65
|
+
// Update current humidity
|
|
66
|
+
this.updateCharacteristicValue(this.platform.Characteristic.CurrentRelativeHumidity, humidifierDetails.humidity);
|
|
67
|
+
// Update target humidity
|
|
68
|
+
if (humidifierDetails.targetHumidity !== undefined) {
|
|
69
|
+
this.updateCharacteristicValue(this.platform.Characteristic.RelativeHumidityHumidifierThreshold, humidifierDetails.targetHumidity);
|
|
70
|
+
}
|
|
71
|
+
// Update water level if available
|
|
72
|
+
if (this.capabilities.hasWaterLevel) {
|
|
73
|
+
this.updateCharacteristicValue(this.platform.Characteristic.WaterLevel, this.device.waterLevel);
|
|
74
|
+
}
|
|
75
|
+
// Update rotation speed (mist level)
|
|
76
|
+
const rotationSpeed = this.convertMistLevelToPercentage(humidifierDetails.mist_level);
|
|
68
77
|
this.updateCharacteristicValue(this.platform.Characteristic.RotationSpeed, rotationSpeed);
|
|
78
|
+
// Update child lock if available
|
|
79
|
+
if (this.capabilities.hasChildLock && humidifierDetails.child_lock !== undefined) {
|
|
80
|
+
this.updateCharacteristicValue(this.platform.Characteristic.LockPhysicalControls, humidifierDetails.child_lock ? 1 : 0);
|
|
81
|
+
}
|
|
69
82
|
}
|
|
70
83
|
getDeviceCapabilities() {
|
|
71
84
|
return {
|
|
@@ -90,70 +103,100 @@ class HumidifierAccessory extends base_accessory_1.BaseAccessory {
|
|
|
90
103
|
if (!success) {
|
|
91
104
|
throw new Error(`Failed to turn ${isOn ? 'on' : 'off'} device`);
|
|
92
105
|
}
|
|
93
|
-
// Update device state and characteristics
|
|
94
|
-
await this.updateDeviceSpecificStates(this.device);
|
|
95
106
|
await this.persistDeviceState('deviceStatus', isOn ? 'on' : 'off');
|
|
96
107
|
}
|
|
97
108
|
catch (error) {
|
|
98
109
|
this.handleDeviceError('set active state', error);
|
|
99
110
|
}
|
|
100
111
|
}
|
|
101
|
-
async
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
case 2: return 22;
|
|
110
|
-
case 3: return 33;
|
|
111
|
-
case 4: return 44;
|
|
112
|
-
case 5: return 55;
|
|
113
|
-
case 6: return 66;
|
|
114
|
-
case 7: return 77;
|
|
115
|
-
case 8: return 88;
|
|
116
|
-
case 9: return 100;
|
|
117
|
-
default: return 0;
|
|
112
|
+
async getCurrentState() {
|
|
113
|
+
switch (this.device.currentState) {
|
|
114
|
+
case 'idle':
|
|
115
|
+
return 1; // IDLE
|
|
116
|
+
case 'humidifying':
|
|
117
|
+
return 2; // HUMIDIFYING
|
|
118
|
+
default:
|
|
119
|
+
return 0; // INACTIVE
|
|
118
120
|
}
|
|
119
121
|
}
|
|
120
|
-
async
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
122
|
+
async getTargetState() {
|
|
123
|
+
return 1; // Always HUMIDIFIER mode
|
|
124
|
+
}
|
|
125
|
+
async setTargetState(value) {
|
|
126
|
+
// No-op as we only support humidifier mode
|
|
127
|
+
}
|
|
128
|
+
async getCurrentHumidity() {
|
|
129
|
+
return this.device.humidity;
|
|
130
|
+
}
|
|
131
|
+
async getTargetHumidity() {
|
|
132
|
+
var _a;
|
|
133
|
+
return (_a = this.device.details.targetHumidity) !== null && _a !== void 0 ? _a : 45; // Default to 45% if not set
|
|
134
|
+
}
|
|
135
|
+
async setTargetHumidity(value) {
|
|
136
|
+
try {
|
|
137
|
+
const humidity = value;
|
|
138
|
+
// VeSync humidifiers accept range 30-80%
|
|
139
|
+
const clampedHumidity = Math.max(30, Math.min(80, humidity));
|
|
140
|
+
const success = await this.device.setHumidity(clampedHumidity);
|
|
141
|
+
if (!success) {
|
|
142
|
+
throw new Error(`Failed to set target humidity to ${clampedHumidity}`);
|
|
143
|
+
}
|
|
144
|
+
await this.persistDeviceState('targetHumidity', clampedHumidity);
|
|
140
145
|
}
|
|
141
|
-
|
|
142
|
-
|
|
146
|
+
catch (error) {
|
|
147
|
+
this.handleDeviceError('set target humidity', error);
|
|
143
148
|
}
|
|
144
|
-
|
|
145
|
-
|
|
149
|
+
}
|
|
150
|
+
async getWaterLevel() {
|
|
151
|
+
return this.device.waterLevel;
|
|
152
|
+
}
|
|
153
|
+
convertMistLevelToPercentage(level) {
|
|
154
|
+
if (!level)
|
|
155
|
+
return 0;
|
|
156
|
+
return Math.round((level / this.mistLevels.length) * 100);
|
|
157
|
+
}
|
|
158
|
+
convertPercentageToMistLevel(percentage) {
|
|
159
|
+
if (percentage === 0)
|
|
160
|
+
return 0;
|
|
161
|
+
const level = Math.ceil((percentage / 100) * this.mistLevels.length);
|
|
162
|
+
return Math.min(level, this.mistLevels.length);
|
|
163
|
+
}
|
|
164
|
+
async getRotationSpeed() {
|
|
165
|
+
return this.convertMistLevelToPercentage(this.device.details.mist_level);
|
|
166
|
+
}
|
|
167
|
+
async handleSetRotationSpeed(value) {
|
|
168
|
+
try {
|
|
169
|
+
const percentage = value;
|
|
170
|
+
if (percentage === 0) {
|
|
171
|
+
await this.device.turnOff();
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const mistLevel = this.convertPercentageToMistLevel(percentage);
|
|
175
|
+
const success = await this.device.setMistLevel(mistLevel);
|
|
176
|
+
if (!success) {
|
|
177
|
+
throw new Error(`Failed to set mist level to ${mistLevel}`);
|
|
178
|
+
}
|
|
179
|
+
await this.persistDeviceState('mist_level', mistLevel);
|
|
146
180
|
}
|
|
147
|
-
|
|
148
|
-
|
|
181
|
+
catch (error) {
|
|
182
|
+
this.handleDeviceError('set mist level', error);
|
|
149
183
|
}
|
|
150
|
-
|
|
151
|
-
|
|
184
|
+
}
|
|
185
|
+
async getLockPhysicalControls() {
|
|
186
|
+
return this.device.details.child_lock ? 1 : 0;
|
|
187
|
+
}
|
|
188
|
+
async setLockPhysicalControls(value) {
|
|
189
|
+
try {
|
|
190
|
+
const enabled = value === 1;
|
|
191
|
+
const success = await this.device.setChildLock(enabled);
|
|
192
|
+
if (!success) {
|
|
193
|
+
throw new Error(`Failed to ${enabled ? 'enable' : 'disable'} child lock`);
|
|
194
|
+
}
|
|
195
|
+
await this.persistDeviceState('child_lock', enabled);
|
|
152
196
|
}
|
|
153
|
-
|
|
154
|
-
|
|
197
|
+
catch (error) {
|
|
198
|
+
this.handleDeviceError('set child lock', error);
|
|
155
199
|
}
|
|
156
|
-
await this.device.changeFanSpeed(speed);
|
|
157
200
|
}
|
|
158
201
|
}
|
|
159
202
|
exports.HumidifierAccessory = HumidifierAccessory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"humidifier.accessory.js","sourceRoot":"","sources":["../../src/accessories/humidifier.accessory.ts"],"names":[],"mappings":";;;AACA,qDAAiD;AAIjD,MAAa,mBAAoB,SAAQ,8BAAa;
|
|
1
|
+
{"version":3,"file":"humidifier.accessory.js","sourceRoot":"","sources":["../../src/accessories/humidifier.accessory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { VeSyncBaseDevice } from 'tsvesync';
|
|
2
|
+
export interface FanConfig {
|
|
3
|
+
module: 'VeSyncAirBypass' | 'VeSyncHumidifier' | 'VeSyncWarmHumidifier' | 'VeSyncTowerFan' | 'VeSyncAirBaseV2';
|
|
4
|
+
features: string[];
|
|
5
|
+
levels?: number[];
|
|
6
|
+
}
|
|
2
7
|
export interface DeviceCapabilities {
|
|
3
8
|
hasBrightness: boolean;
|
|
4
9
|
hasColorTemp: boolean;
|
|
@@ -56,7 +61,38 @@ export interface VeSyncDeviceWithControls extends VeSyncDeviceWithPower {
|
|
|
56
61
|
}
|
|
57
62
|
export interface VeSyncAirPurifier extends VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithAirQuality, VeSyncDeviceWithControls {
|
|
58
63
|
}
|
|
59
|
-
export interface VeSyncHumidifier extends
|
|
64
|
+
export interface VeSyncHumidifier extends VeSyncBaseDevice {
|
|
65
|
+
deviceType: string;
|
|
66
|
+
deviceStatus: string;
|
|
67
|
+
humidity: number;
|
|
68
|
+
details: {
|
|
69
|
+
mode: string;
|
|
70
|
+
humidity: number;
|
|
71
|
+
mist_level: number;
|
|
72
|
+
mist_virtual_level: number;
|
|
73
|
+
water_lacks: boolean;
|
|
74
|
+
water_level: number;
|
|
75
|
+
water_tank_lifted: boolean;
|
|
76
|
+
humidity_high: boolean;
|
|
77
|
+
display: boolean;
|
|
78
|
+
automatic_stop: boolean;
|
|
79
|
+
oscillation_enabled: boolean;
|
|
80
|
+
configuration: Record<string, any>;
|
|
81
|
+
connection_status: string | null;
|
|
82
|
+
targetHumidity?: number;
|
|
83
|
+
child_lock?: boolean;
|
|
84
|
+
};
|
|
85
|
+
currentState: string;
|
|
86
|
+
waterLevel: number;
|
|
87
|
+
waterTankLifted: boolean;
|
|
88
|
+
oscillationEnabled: boolean;
|
|
89
|
+
turnOn(): Promise<boolean>;
|
|
90
|
+
turnOff(): Promise<boolean>;
|
|
91
|
+
setMistLevel(level: number): Promise<boolean>;
|
|
92
|
+
setHumidity(humidity: number): Promise<boolean>;
|
|
93
|
+
setMode(mode: string): Promise<boolean>;
|
|
94
|
+
setDisplay(enabled: boolean): Promise<boolean>;
|
|
95
|
+
setChildLock(enabled: boolean): Promise<boolean>;
|
|
60
96
|
}
|
|
61
97
|
export interface VeSyncFan extends VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithRotation {
|
|
62
98
|
oscillationState: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.types.d.ts","sourceRoot":"","sources":["../../src/types/device.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,qBAAsB,SAAQ,gBAAgB;IAC7D,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,0BAA2B,SAAQ,qBAAqB;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,qBAAsB,SAAQ,0BAA0B;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,QAAQ,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IACrE,iBAAiB,EAAE,WAAW,GAAG,kBAAkB,CAAC;IACpD,oBAAoB,CAAC,SAAS,EAAE,WAAW,GAAG,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrF;AAED,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,0BAA2B,SAAQ,qBAAqB;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IACrE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,YAAY,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACnD;AAGD,MAAM,WAAW,iBAAkB,SAAQ,qBAAqB,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,wBAAwB;CAAG;AAEhJ,MAAM,WAAW,gBAAiB,SAAQ,
|
|
1
|
+
{"version":3,"file":"device.types.d.ts","sourceRoot":"","sources":["../../src/types/device.types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "homebridge-tsvesync",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.59",
|
|
4
4
|
"description": "Homebridge plugin for VeSync devices including Levoit air purifiers, humidifiers, and Etekcity smart outlets",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
"axios": "^1.6.5",
|
|
99
99
|
"dotenv": "^16.3.1",
|
|
100
100
|
"js-yaml": "^4.1.0",
|
|
101
|
-
"tsvesync": "1.0.
|
|
101
|
+
"tsvesync": "1.0.59"
|
|
102
102
|
},
|
|
103
103
|
"devDependencies": {
|
|
104
104
|
"@types/jest": "^29.5.11",
|
|
@@ -13,9 +13,35 @@ const MODE_AUTO = 1;
|
|
|
13
13
|
const MODE_SLEEP = 2;
|
|
14
14
|
const MODE_TURBO = 3;
|
|
15
15
|
|
|
16
|
+
// Fan speed levels for different device types
|
|
17
|
+
const FAN_SPEED_LEVELS: { [key: string]: number[] } = {
|
|
18
|
+
'LTF-F422S-KEU': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
|
|
19
|
+
'LTF-F422S-WUSR': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
|
|
20
|
+
'LTF-F422_WJP': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
|
|
21
|
+
'LTF-F422S-WUS': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
|
|
22
|
+
'Core200S': [1, 2, 3],
|
|
23
|
+
'Core300S': [1, 2, 3, 4],
|
|
24
|
+
'Core400S': [1, 2, 3, 4],
|
|
25
|
+
'Core600S': [1, 2, 3, 4],
|
|
26
|
+
'LAP-C201S-AUSR': [1, 2, 3],
|
|
27
|
+
'LAP-C202S-WUSR': [1, 2, 3],
|
|
28
|
+
'LAP-C301S-WJP': [1, 2, 3, 4],
|
|
29
|
+
'LAP-C302S-WUSB': [1, 2, 3, 4],
|
|
30
|
+
'LAP-C301S-WAAA': [1, 2, 3, 4],
|
|
31
|
+
'LAP-C401S-WJP': [1, 2, 3, 4],
|
|
32
|
+
'LAP-C401S-WUSR': [1, 2, 3, 4],
|
|
33
|
+
'LAP-C401S-WAAA': [1, 2, 3, 4],
|
|
34
|
+
'LAP-C601S-WUS': [1, 2, 3, 4],
|
|
35
|
+
'LAP-C601S-WUSR': [1, 2, 3, 4],
|
|
36
|
+
'LAP-C601S-WEU': [1, 2, 3, 4],
|
|
37
|
+
'LV-PUR131S': [1, 2, 3],
|
|
38
|
+
'LV-RH131S': [1, 2, 3]
|
|
39
|
+
};
|
|
40
|
+
|
|
16
41
|
export class FanAccessory extends BaseAccessory {
|
|
17
42
|
protected readonly device: VeSyncFan;
|
|
18
43
|
private readonly capabilities: DeviceCapabilities;
|
|
44
|
+
private readonly speedLevels: number[];
|
|
19
45
|
|
|
20
46
|
constructor(
|
|
21
47
|
platform: TSVESyncPlatform,
|
|
@@ -25,6 +51,7 @@ export class FanAccessory extends BaseAccessory {
|
|
|
25
51
|
super(platform, accessory, device);
|
|
26
52
|
this.device = device;
|
|
27
53
|
this.capabilities = this.getDeviceCapabilities();
|
|
54
|
+
this.speedLevels = FAN_SPEED_LEVELS[this.device.deviceType] || [1, 2, 3, 4];
|
|
28
55
|
}
|
|
29
56
|
|
|
30
57
|
protected setupService(): void {
|
|
@@ -107,22 +134,14 @@ export class FanAccessory extends BaseAccessory {
|
|
|
107
134
|
isActive ? 2 : 0
|
|
108
135
|
);
|
|
109
136
|
|
|
110
|
-
// Update rotation speed
|
|
137
|
+
// Update rotation speed
|
|
111
138
|
let rotationSpeed = 0;
|
|
112
139
|
if (isActive && fanDetails.speed !== undefined) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
case 5: rotationSpeed = 42; break; // 42%
|
|
119
|
-
case 6: rotationSpeed = 50; break; // 50%
|
|
120
|
-
case 7: rotationSpeed = 58; break; // 58%
|
|
121
|
-
case 8: rotationSpeed = 67; break; // 67%
|
|
122
|
-
case 9: rotationSpeed = 75; break; // 75%
|
|
123
|
-
case 10: rotationSpeed = 83; break; // 83%
|
|
124
|
-
case 11: rotationSpeed = 92; break; // 92%
|
|
125
|
-
case 12: rotationSpeed = 100; break; // 100%
|
|
140
|
+
const speedIndex = this.speedLevels.indexOf(fanDetails.speed);
|
|
141
|
+
if (speedIndex !== -1) {
|
|
142
|
+
const maxLevel = this.speedLevels.length;
|
|
143
|
+
const levelSize = 100 / maxLevel;
|
|
144
|
+
rotationSpeed = Math.round((speedIndex + 1) * levelSize);
|
|
126
145
|
}
|
|
127
146
|
}
|
|
128
147
|
this.updateCharacteristicValue(
|
|
@@ -192,33 +211,11 @@ export class FanAccessory extends BaseAccessory {
|
|
|
192
211
|
return;
|
|
193
212
|
}
|
|
194
213
|
|
|
195
|
-
// Convert HomeKit percentage
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
speed = 2; // Speed 2 (17%)
|
|
201
|
-
} else if (percentage <= 25) {
|
|
202
|
-
speed = 3; // Speed 3 (25%)
|
|
203
|
-
} else if (percentage <= 33) {
|
|
204
|
-
speed = 4; // Speed 4 (33%)
|
|
205
|
-
} else if (percentage <= 42) {
|
|
206
|
-
speed = 5; // Speed 5 (42%)
|
|
207
|
-
} else if (percentage <= 50) {
|
|
208
|
-
speed = 6; // Speed 6 (50%)
|
|
209
|
-
} else if (percentage <= 58) {
|
|
210
|
-
speed = 7; // Speed 7 (58%)
|
|
211
|
-
} else if (percentage <= 67) {
|
|
212
|
-
speed = 8; // Speed 8 (67%)
|
|
213
|
-
} else if (percentage <= 75) {
|
|
214
|
-
speed = 9; // Speed 9 (75%)
|
|
215
|
-
} else if (percentage <= 83) {
|
|
216
|
-
speed = 10; // Speed 10 (83%)
|
|
217
|
-
} else if (percentage <= 92) {
|
|
218
|
-
speed = 11; // Speed 11 (92%)
|
|
219
|
-
} else {
|
|
220
|
-
speed = 12; // Speed 12 (100%)
|
|
221
|
-
}
|
|
214
|
+
// Convert HomeKit percentage to device speed level
|
|
215
|
+
const maxLevel = this.speedLevels.length;
|
|
216
|
+
const levelSize = 100 / maxLevel;
|
|
217
|
+
const levelIndex = Math.min(Math.floor(percentage / levelSize), maxLevel - 1);
|
|
218
|
+
const speed = this.speedLevels[levelIndex];
|
|
222
219
|
|
|
223
220
|
await this.device.changeFanSpeed(speed);
|
|
224
221
|
}
|
|
@@ -228,23 +225,16 @@ export class FanAccessory extends BaseAccessory {
|
|
|
228
225
|
return 0;
|
|
229
226
|
}
|
|
230
227
|
|
|
231
|
-
// Convert device speed
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
case 3: return 25; // 3 (25%)
|
|
237
|
-
case 4: return 33; // 4 (33%)
|
|
238
|
-
case 5: return 42; // 5 (42%)
|
|
239
|
-
case 6: return 50; // 6 (50%)
|
|
240
|
-
case 7: return 58; // 7 (58%)
|
|
241
|
-
case 8: return 67; // 8 (67%)
|
|
242
|
-
case 9: return 75; // 9 (75%)
|
|
243
|
-
case 10: return 83; // 10 (83%)
|
|
244
|
-
case 11: return 92; // 11 (92%)
|
|
245
|
-
case 12: return 100; // 12 (100%)
|
|
246
|
-
default: return 0; // Off
|
|
228
|
+
// Convert device speed to HomeKit percentage
|
|
229
|
+
const currentSpeed = this.device.speed;
|
|
230
|
+
const speedIndex = this.speedLevels.indexOf(currentSpeed);
|
|
231
|
+
if (speedIndex === -1) {
|
|
232
|
+
return 0;
|
|
247
233
|
}
|
|
234
|
+
|
|
235
|
+
const maxLevel = this.speedLevels.length;
|
|
236
|
+
const levelSize = 100 / maxLevel;
|
|
237
|
+
return Math.round((speedIndex + 1) * levelSize);
|
|
248
238
|
}
|
|
249
239
|
|
|
250
240
|
private async getRotationDirection(): Promise<CharacteristicValue> {
|
|
@@ -6,6 +6,7 @@ import { DeviceCapabilities, VeSyncHumidifier } from '../types/device.types';
|
|
|
6
6
|
export class HumidifierAccessory extends BaseAccessory {
|
|
7
7
|
protected readonly device: VeSyncHumidifier;
|
|
8
8
|
private readonly capabilities: DeviceCapabilities;
|
|
9
|
+
private readonly mistLevels: number[];
|
|
9
10
|
|
|
10
11
|
constructor(
|
|
11
12
|
platform: TSVESyncPlatform,
|
|
@@ -15,6 +16,10 @@ export class HumidifierAccessory extends BaseAccessory {
|
|
|
15
16
|
super(platform, accessory, device);
|
|
16
17
|
this.device = device;
|
|
17
18
|
this.capabilities = this.getDeviceCapabilities();
|
|
19
|
+
|
|
20
|
+
// Get mist levels from device config
|
|
21
|
+
const config = device.details.configuration;
|
|
22
|
+
this.mistLevels = config?.levels || [1, 2, 3, 4, 5, 6, 7, 8, 9];
|
|
18
23
|
}
|
|
19
24
|
|
|
20
25
|
protected setupService(): void {
|
|
@@ -29,13 +34,54 @@ export class HumidifierAccessory extends BaseAccessory {
|
|
|
29
34
|
this.setActive.bind(this)
|
|
30
35
|
);
|
|
31
36
|
|
|
32
|
-
// Set up
|
|
37
|
+
// Set up current and target state
|
|
38
|
+
this.setupCharacteristic(
|
|
39
|
+
this.platform.Characteristic.CurrentHumidifierDehumidifierState,
|
|
40
|
+
this.getCurrentState.bind(this)
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
this.setupCharacteristic(
|
|
44
|
+
this.platform.Characteristic.TargetHumidifierDehumidifierState,
|
|
45
|
+
this.getTargetState.bind(this),
|
|
46
|
+
this.setTargetState.bind(this)
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
// Set up humidity control
|
|
50
|
+
this.setupCharacteristic(
|
|
51
|
+
this.platform.Characteristic.CurrentRelativeHumidity,
|
|
52
|
+
this.getCurrentHumidity.bind(this)
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
this.setupCharacteristic(
|
|
56
|
+
this.platform.Characteristic.RelativeHumidityHumidifierThreshold,
|
|
57
|
+
this.getTargetHumidity.bind(this),
|
|
58
|
+
this.setTargetHumidity.bind(this)
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
// Set up water level if supported
|
|
62
|
+
if (this.capabilities.hasWaterLevel) {
|
|
63
|
+
this.setupCharacteristic(
|
|
64
|
+
this.platform.Characteristic.WaterLevel,
|
|
65
|
+
this.getWaterLevel.bind(this)
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Set up speed control (maps to mist level)
|
|
33
70
|
this.setupCharacteristic(
|
|
34
71
|
this.platform.Characteristic.RotationSpeed,
|
|
35
72
|
this.getRotationSpeed.bind(this),
|
|
36
73
|
this.handleSetRotationSpeed.bind(this)
|
|
37
74
|
);
|
|
38
75
|
|
|
76
|
+
// Set up child lock if supported
|
|
77
|
+
if (this.capabilities.hasChildLock) {
|
|
78
|
+
this.setupCharacteristic(
|
|
79
|
+
this.platform.Characteristic.LockPhysicalControls,
|
|
80
|
+
this.getLockPhysicalControls.bind(this),
|
|
81
|
+
this.setLockPhysicalControls.bind(this)
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
39
85
|
// Add Name characteristic
|
|
40
86
|
this.setupCharacteristic(
|
|
41
87
|
this.platform.Characteristic.Name,
|
|
@@ -47,49 +93,76 @@ export class HumidifierAccessory extends BaseAccessory {
|
|
|
47
93
|
* Update device states based on the latest details
|
|
48
94
|
*/
|
|
49
95
|
protected async updateDeviceSpecificStates(details: any): Promise<void> {
|
|
50
|
-
const humidifierDetails = details
|
|
51
|
-
deviceStatus: string;
|
|
52
|
-
speed: number;
|
|
53
|
-
};
|
|
96
|
+
const humidifierDetails = this.device.details;
|
|
54
97
|
|
|
55
98
|
// Update active state
|
|
56
|
-
const isActive =
|
|
99
|
+
const isActive = this.device.deviceStatus === 'on';
|
|
57
100
|
this.updateCharacteristicValue(
|
|
58
101
|
this.platform.Characteristic.Active,
|
|
59
102
|
isActive ? 1 : 0
|
|
60
103
|
);
|
|
61
104
|
|
|
62
|
-
// Update current state
|
|
105
|
+
// Update current state based on device state
|
|
106
|
+
let currentState = 0; // INACTIVE
|
|
107
|
+
if (isActive) {
|
|
108
|
+
switch (this.device.currentState) {
|
|
109
|
+
case 'idle':
|
|
110
|
+
currentState = 1; // IDLE
|
|
111
|
+
break;
|
|
112
|
+
case 'humidifying':
|
|
113
|
+
currentState = 2; // HUMIDIFYING
|
|
114
|
+
break;
|
|
115
|
+
default:
|
|
116
|
+
currentState = 0; // INACTIVE
|
|
117
|
+
}
|
|
118
|
+
}
|
|
63
119
|
this.updateCharacteristicValue(
|
|
64
120
|
this.platform.Characteristic.CurrentHumidifierDehumidifierState,
|
|
65
|
-
|
|
121
|
+
currentState
|
|
66
122
|
);
|
|
67
123
|
|
|
68
|
-
// Update target state (
|
|
124
|
+
// Update target state (always humidifier mode)
|
|
69
125
|
this.updateCharacteristicValue(
|
|
70
126
|
this.platform.Characteristic.TargetHumidifierDehumidifierState,
|
|
71
|
-
1 //
|
|
127
|
+
1 // 1 = HUMIDIFIER
|
|
72
128
|
);
|
|
73
129
|
|
|
74
|
-
// Update
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
case 9: rotationSpeed = 100; break;
|
|
87
|
-
}
|
|
130
|
+
// Update current humidity
|
|
131
|
+
this.updateCharacteristicValue(
|
|
132
|
+
this.platform.Characteristic.CurrentRelativeHumidity,
|
|
133
|
+
humidifierDetails.humidity
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
// Update target humidity
|
|
137
|
+
if (humidifierDetails.targetHumidity !== undefined) {
|
|
138
|
+
this.updateCharacteristicValue(
|
|
139
|
+
this.platform.Characteristic.RelativeHumidityHumidifierThreshold,
|
|
140
|
+
humidifierDetails.targetHumidity
|
|
141
|
+
);
|
|
88
142
|
}
|
|
143
|
+
|
|
144
|
+
// Update water level if available
|
|
145
|
+
if (this.capabilities.hasWaterLevel) {
|
|
146
|
+
this.updateCharacteristicValue(
|
|
147
|
+
this.platform.Characteristic.WaterLevel,
|
|
148
|
+
this.device.waterLevel
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Update rotation speed (mist level)
|
|
153
|
+
const rotationSpeed = this.convertMistLevelToPercentage(humidifierDetails.mist_level);
|
|
89
154
|
this.updateCharacteristicValue(
|
|
90
155
|
this.platform.Characteristic.RotationSpeed,
|
|
91
156
|
rotationSpeed
|
|
92
157
|
);
|
|
158
|
+
|
|
159
|
+
// Update child lock if available
|
|
160
|
+
if (this.capabilities.hasChildLock && humidifierDetails.child_lock !== undefined) {
|
|
161
|
+
this.updateCharacteristicValue(
|
|
162
|
+
this.platform.Characteristic.LockPhysicalControls,
|
|
163
|
+
humidifierDetails.child_lock ? 1 : 0
|
|
164
|
+
);
|
|
165
|
+
}
|
|
93
166
|
}
|
|
94
167
|
|
|
95
168
|
protected getDeviceCapabilities(): DeviceCapabilities {
|
|
@@ -119,66 +192,113 @@ export class HumidifierAccessory extends BaseAccessory {
|
|
|
119
192
|
throw new Error(`Failed to turn ${isOn ? 'on' : 'off'} device`);
|
|
120
193
|
}
|
|
121
194
|
|
|
122
|
-
// Update device state and characteristics
|
|
123
|
-
await this.updateDeviceSpecificStates(this.device);
|
|
124
195
|
await this.persistDeviceState('deviceStatus', isOn ? 'on' : 'off');
|
|
125
196
|
} catch (error) {
|
|
126
197
|
this.handleDeviceError('set active state', error);
|
|
127
198
|
}
|
|
128
199
|
}
|
|
129
200
|
|
|
130
|
-
private async
|
|
131
|
-
|
|
132
|
-
|
|
201
|
+
private async getCurrentState(): Promise<CharacteristicValue> {
|
|
202
|
+
switch (this.device.currentState) {
|
|
203
|
+
case 'idle':
|
|
204
|
+
return 1; // IDLE
|
|
205
|
+
case 'humidifying':
|
|
206
|
+
return 2; // HUMIDIFYING
|
|
207
|
+
default:
|
|
208
|
+
return 0; // INACTIVE
|
|
133
209
|
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
private async getTargetState(): Promise<CharacteristicValue> {
|
|
213
|
+
return 1; // Always HUMIDIFIER mode
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
private async setTargetState(value: CharacteristicValue): Promise<void> {
|
|
217
|
+
// No-op as we only support humidifier mode
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
private async getCurrentHumidity(): Promise<CharacteristicValue> {
|
|
221
|
+
return this.device.humidity;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
private async getTargetHumidity(): Promise<CharacteristicValue> {
|
|
225
|
+
return this.device.details.targetHumidity ?? 45; // Default to 45% if not set
|
|
226
|
+
}
|
|
134
227
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
228
|
+
private async setTargetHumidity(value: CharacteristicValue): Promise<void> {
|
|
229
|
+
try {
|
|
230
|
+
const humidity = value as number;
|
|
231
|
+
// VeSync humidifiers accept range 30-80%
|
|
232
|
+
const clampedHumidity = Math.max(30, Math.min(80, humidity));
|
|
233
|
+
|
|
234
|
+
const success = await this.device.setHumidity(clampedHumidity);
|
|
235
|
+
if (!success) {
|
|
236
|
+
throw new Error(`Failed to set target humidity to ${clampedHumidity}`);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
await this.persistDeviceState('targetHumidity', clampedHumidity);
|
|
240
|
+
} catch (error) {
|
|
241
|
+
this.handleDeviceError('set target humidity', error);
|
|
148
242
|
}
|
|
149
243
|
}
|
|
150
244
|
|
|
245
|
+
private async getWaterLevel(): Promise<CharacteristicValue> {
|
|
246
|
+
return this.device.waterLevel;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
private convertMistLevelToPercentage(level: number): number {
|
|
250
|
+
if (!level) return 0;
|
|
251
|
+
return Math.round((level / this.mistLevels.length) * 100);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
private convertPercentageToMistLevel(percentage: number): number {
|
|
255
|
+
if (percentage === 0) return 0;
|
|
256
|
+
const level = Math.ceil((percentage / 100) * this.mistLevels.length);
|
|
257
|
+
return Math.min(level, this.mistLevels.length);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
private async getRotationSpeed(): Promise<CharacteristicValue> {
|
|
261
|
+
return this.convertMistLevelToPercentage(this.device.details.mist_level);
|
|
262
|
+
}
|
|
263
|
+
|
|
151
264
|
private async handleSetRotationSpeed(value: CharacteristicValue): Promise<void> {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
265
|
+
try {
|
|
266
|
+
const percentage = value as number;
|
|
267
|
+
|
|
268
|
+
if (percentage === 0) {
|
|
269
|
+
await this.device.turnOff();
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
159
272
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
} else if (percentage <= 55) {
|
|
171
|
-
speed = 5;
|
|
172
|
-
} else if (percentage <= 66) {
|
|
173
|
-
speed = 6;
|
|
174
|
-
} else if (percentage <= 77) {
|
|
175
|
-
speed = 7;
|
|
176
|
-
} else if (percentage <= 88) {
|
|
177
|
-
speed = 8;
|
|
178
|
-
} else {
|
|
179
|
-
speed = 9;
|
|
273
|
+
const mistLevel = this.convertPercentageToMistLevel(percentage);
|
|
274
|
+
const success = await this.device.setMistLevel(mistLevel);
|
|
275
|
+
|
|
276
|
+
if (!success) {
|
|
277
|
+
throw new Error(`Failed to set mist level to ${mistLevel}`);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
await this.persistDeviceState('mist_level', mistLevel);
|
|
281
|
+
} catch (error) {
|
|
282
|
+
this.handleDeviceError('set mist level', error);
|
|
180
283
|
}
|
|
284
|
+
}
|
|
181
285
|
|
|
182
|
-
|
|
286
|
+
private async getLockPhysicalControls(): Promise<CharacteristicValue> {
|
|
287
|
+
return this.device.details.child_lock ? 1 : 0;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
private async setLockPhysicalControls(value: CharacteristicValue): Promise<void> {
|
|
291
|
+
try {
|
|
292
|
+
const enabled = value as number === 1;
|
|
293
|
+
const success = await this.device.setChildLock(enabled);
|
|
294
|
+
|
|
295
|
+
if (!success) {
|
|
296
|
+
throw new Error(`Failed to ${enabled ? 'enable' : 'disable'} child lock`);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
await this.persistDeviceState('child_lock', enabled);
|
|
300
|
+
} catch (error) {
|
|
301
|
+
this.handleDeviceError('set child lock', error);
|
|
302
|
+
}
|
|
183
303
|
}
|
|
184
304
|
}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { VeSyncBaseDevice } from 'tsvesync';
|
|
2
2
|
|
|
3
|
+
export interface FanConfig {
|
|
4
|
+
module: 'VeSyncAirBypass' | 'VeSyncHumidifier' | 'VeSyncWarmHumidifier' | 'VeSyncTowerFan' | 'VeSyncAirBaseV2';
|
|
5
|
+
features: string[];
|
|
6
|
+
levels?: number[];
|
|
7
|
+
}
|
|
8
|
+
|
|
3
9
|
export interface DeviceCapabilities {
|
|
4
10
|
hasBrightness: boolean;
|
|
5
11
|
hasColorTemp: boolean;
|
|
@@ -67,7 +73,39 @@ export interface VeSyncDeviceWithControls extends VeSyncDeviceWithPower {
|
|
|
67
73
|
// Combined device types for specific device categories
|
|
68
74
|
export interface VeSyncAirPurifier extends VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithAirQuality, VeSyncDeviceWithControls {}
|
|
69
75
|
|
|
70
|
-
export interface VeSyncHumidifier extends
|
|
76
|
+
export interface VeSyncHumidifier extends VeSyncBaseDevice {
|
|
77
|
+
deviceType: string;
|
|
78
|
+
deviceStatus: string;
|
|
79
|
+
humidity: number;
|
|
80
|
+
details: {
|
|
81
|
+
mode: string;
|
|
82
|
+
humidity: number;
|
|
83
|
+
mist_level: number;
|
|
84
|
+
mist_virtual_level: number;
|
|
85
|
+
water_lacks: boolean;
|
|
86
|
+
water_level: number;
|
|
87
|
+
water_tank_lifted: boolean;
|
|
88
|
+
humidity_high: boolean;
|
|
89
|
+
display: boolean;
|
|
90
|
+
automatic_stop: boolean;
|
|
91
|
+
oscillation_enabled: boolean;
|
|
92
|
+
configuration: Record<string, any>;
|
|
93
|
+
connection_status: string | null;
|
|
94
|
+
targetHumidity?: number;
|
|
95
|
+
child_lock?: boolean;
|
|
96
|
+
};
|
|
97
|
+
currentState: string;
|
|
98
|
+
waterLevel: number;
|
|
99
|
+
waterTankLifted: boolean;
|
|
100
|
+
oscillationEnabled: boolean;
|
|
101
|
+
turnOn(): Promise<boolean>;
|
|
102
|
+
turnOff(): Promise<boolean>;
|
|
103
|
+
setMistLevel(level: number): Promise<boolean>;
|
|
104
|
+
setHumidity(humidity: number): Promise<boolean>;
|
|
105
|
+
setMode(mode: string): Promise<boolean>;
|
|
106
|
+
setDisplay(enabled: boolean): Promise<boolean>;
|
|
107
|
+
setChildLock(enabled: boolean): Promise<boolean>;
|
|
108
|
+
}
|
|
71
109
|
|
|
72
110
|
export interface VeSyncFan extends VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithRotation {
|
|
73
111
|
oscillationState: boolean;
|