homebridge-tsvesync 1.0.59 → 1.0.61
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/humidifier.accessory.d.ts +0 -12
- package/dist/accessories/humidifier.accessory.d.ts.map +1 -1
- package/dist/accessories/humidifier.accessory.js +87 -130
- package/dist/accessories/humidifier.accessory.js.map +1 -1
- package/dist/types/device.types.d.ts +1 -32
- package/dist/types/device.types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/accessories/humidifier.accessory.ts +70 -190
- package/src/types/device.types.ts +1 -33
|
@@ -5,7 +5,6 @@ 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;
|
|
9
8
|
constructor(platform: TSVESyncPlatform, accessory: PlatformAccessory, device: VeSyncHumidifier);
|
|
10
9
|
protected setupService(): void;
|
|
11
10
|
/**
|
|
@@ -15,18 +14,7 @@ export declare class HumidifierAccessory extends BaseAccessory {
|
|
|
15
14
|
protected getDeviceCapabilities(): DeviceCapabilities;
|
|
16
15
|
private getActive;
|
|
17
16
|
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;
|
|
27
17
|
private getRotationSpeed;
|
|
28
18
|
private handleSetRotationSpeed;
|
|
29
|
-
private getLockPhysicalControls;
|
|
30
|
-
private setLockPhysicalControls;
|
|
31
19
|
}
|
|
32
20
|
//# 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;gBAGhD,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,gBAAgB;IAO1B,SAAS,CAAC,YAAY,IAAI,IAAI;IA0B9B;;OAEG;cACa,0BAA0B,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IA8CvE,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;YAcvC,SAAS;YAIT,SAAS;YAiBT,gBAAgB;YAqBhB,sBAAsB;CAiCrC"}
|
|
@@ -7,9 +7,6 @@ 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];
|
|
13
10
|
}
|
|
14
11
|
setupService() {
|
|
15
12
|
// Get or create the humidifier service
|
|
@@ -17,22 +14,8 @@ class HumidifierAccessory extends base_accessory_1.BaseAccessory {
|
|
|
17
14
|
this.accessory.addService(this.platform.Service.HumidifierDehumidifier);
|
|
18
15
|
// Set up required characteristics
|
|
19
16
|
this.setupCharacteristic(this.platform.Characteristic.Active, this.getActive.bind(this), this.setActive.bind(this));
|
|
20
|
-
// Set up
|
|
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)
|
|
17
|
+
// Set up speed control
|
|
31
18
|
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
|
-
}
|
|
36
19
|
// Add Name characteristic
|
|
37
20
|
this.setupCharacteristic(this.platform.Characteristic.Name, async () => this.device.deviceName);
|
|
38
21
|
}
|
|
@@ -40,45 +23,49 @@ class HumidifierAccessory extends base_accessory_1.BaseAccessory {
|
|
|
40
23
|
* Update device states based on the latest details
|
|
41
24
|
*/
|
|
42
25
|
async updateDeviceSpecificStates(details) {
|
|
43
|
-
const humidifierDetails =
|
|
26
|
+
const humidifierDetails = details;
|
|
44
27
|
// Update active state
|
|
45
|
-
const isActive =
|
|
28
|
+
const isActive = humidifierDetails.deviceStatus === 'on';
|
|
46
29
|
this.updateCharacteristicValue(this.platform.Characteristic.Active, isActive ? 1 : 0);
|
|
47
|
-
// Update current state
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
30
|
+
// Update current state (INACTIVE = 0, IDLE = 1, HUMIDIFYING = 2, DEHUMIDIFYING = 3)
|
|
31
|
+
this.updateCharacteristicValue(this.platform.Characteristic.CurrentHumidifierDehumidifierState, isActive ? 2 : 0);
|
|
32
|
+
// Update target state (HUMIDIFIER = 1, DEHUMIDIFIER = 2, AUTO = 0)
|
|
33
|
+
this.updateCharacteristicValue(this.platform.Characteristic.TargetHumidifierDehumidifierState, 1 // Always humidifier mode
|
|
34
|
+
);
|
|
35
|
+
// Update rotation speed - convert device speed (1-9) to HomeKit percentage (0-100)
|
|
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;
|
|
53
53
|
break;
|
|
54
|
-
case
|
|
55
|
-
|
|
54
|
+
case 6:
|
|
55
|
+
rotationSpeed = 66;
|
|
56
|
+
break;
|
|
57
|
+
case 7:
|
|
58
|
+
rotationSpeed = 77;
|
|
59
|
+
break;
|
|
60
|
+
case 8:
|
|
61
|
+
rotationSpeed = 88;
|
|
62
|
+
break;
|
|
63
|
+
case 9:
|
|
64
|
+
rotationSpeed = 100;
|
|
56
65
|
break;
|
|
57
|
-
default:
|
|
58
|
-
currentState = 0; // INACTIVE
|
|
59
66
|
}
|
|
60
67
|
}
|
|
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);
|
|
77
68
|
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
|
-
}
|
|
82
69
|
}
|
|
83
70
|
getDeviceCapabilities() {
|
|
84
71
|
return {
|
|
@@ -103,100 +90,70 @@ class HumidifierAccessory extends base_accessory_1.BaseAccessory {
|
|
|
103
90
|
if (!success) {
|
|
104
91
|
throw new Error(`Failed to turn ${isOn ? 'on' : 'off'} device`);
|
|
105
92
|
}
|
|
93
|
+
// Update device state and characteristics
|
|
94
|
+
await this.updateDeviceSpecificStates(this.device);
|
|
106
95
|
await this.persistDeviceState('deviceStatus', isOn ? 'on' : 'off');
|
|
107
96
|
}
|
|
108
97
|
catch (error) {
|
|
109
98
|
this.handleDeviceError('set active state', error);
|
|
110
99
|
}
|
|
111
100
|
}
|
|
112
|
-
async
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
return 1; // IDLE
|
|
116
|
-
case 'humidifying':
|
|
117
|
-
return 2; // HUMIDIFYING
|
|
118
|
-
default:
|
|
119
|
-
return 0; // INACTIVE
|
|
120
|
-
}
|
|
121
|
-
}
|
|
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);
|
|
101
|
+
async getRotationSpeed() {
|
|
102
|
+
if (this.device.speed === undefined || this.device.speed === null) {
|
|
103
|
+
return 0;
|
|
145
104
|
}
|
|
146
|
-
|
|
147
|
-
|
|
105
|
+
// Convert device speed (1-9) to HomeKit percentage (0-100)
|
|
106
|
+
switch (this.device.speed) {
|
|
107
|
+
case 0: return 0; // Off
|
|
108
|
+
case 1: return 11;
|
|
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;
|
|
148
118
|
}
|
|
149
119
|
}
|
|
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
120
|
async handleSetRotationSpeed(value) {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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);
|
|
121
|
+
const percentage = value;
|
|
122
|
+
if (percentage === 0) {
|
|
123
|
+
// Turn off the device instead of setting speed to 0
|
|
124
|
+
await this.device.turnOff();
|
|
125
|
+
return;
|
|
180
126
|
}
|
|
181
|
-
|
|
182
|
-
|
|
127
|
+
// Convert HomeKit percentage (0-100) to device speed (1-9)
|
|
128
|
+
let speed;
|
|
129
|
+
if (percentage <= 11) {
|
|
130
|
+
speed = 1;
|
|
183
131
|
}
|
|
184
|
-
|
|
185
|
-
|
|
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);
|
|
132
|
+
else if (percentage <= 22) {
|
|
133
|
+
speed = 2;
|
|
196
134
|
}
|
|
197
|
-
|
|
198
|
-
|
|
135
|
+
else if (percentage <= 33) {
|
|
136
|
+
speed = 3;
|
|
137
|
+
}
|
|
138
|
+
else if (percentage <= 44) {
|
|
139
|
+
speed = 4;
|
|
140
|
+
}
|
|
141
|
+
else if (percentage <= 55) {
|
|
142
|
+
speed = 5;
|
|
143
|
+
}
|
|
144
|
+
else if (percentage <= 66) {
|
|
145
|
+
speed = 6;
|
|
146
|
+
}
|
|
147
|
+
else if (percentage <= 77) {
|
|
148
|
+
speed = 7;
|
|
149
|
+
}
|
|
150
|
+
else if (percentage <= 88) {
|
|
151
|
+
speed = 8;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
speed = 9;
|
|
199
155
|
}
|
|
156
|
+
await this.device.changeFanSpeed(speed);
|
|
200
157
|
}
|
|
201
158
|
}
|
|
202
159
|
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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"}
|
|
@@ -61,38 +61,7 @@ export interface VeSyncDeviceWithControls extends VeSyncDeviceWithPower {
|
|
|
61
61
|
}
|
|
62
62
|
export interface VeSyncAirPurifier extends VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithAirQuality, VeSyncDeviceWithControls {
|
|
63
63
|
}
|
|
64
|
-
export interface VeSyncHumidifier extends
|
|
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>;
|
|
64
|
+
export interface VeSyncHumidifier extends VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithHumidity, VeSyncDeviceWithControls {
|
|
96
65
|
}
|
|
97
66
|
export interface VeSyncFan extends VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithRotation {
|
|
98
67
|
oscillationState: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.types.d.ts","sourceRoot":"","sources":["../../src/types/device.types.ts"],"names":[],"mappings":"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
|
|
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.61",
|
|
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.61"
|
|
102
102
|
},
|
|
103
103
|
"devDependencies": {
|
|
104
104
|
"@types/jest": "^29.5.11",
|
|
@@ -6,7 +6,6 @@ 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[];
|
|
10
9
|
|
|
11
10
|
constructor(
|
|
12
11
|
platform: TSVESyncPlatform,
|
|
@@ -16,10 +15,6 @@ export class HumidifierAccessory extends BaseAccessory {
|
|
|
16
15
|
super(platform, accessory, device);
|
|
17
16
|
this.device = device;
|
|
18
17
|
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];
|
|
23
18
|
}
|
|
24
19
|
|
|
25
20
|
protected setupService(): void {
|
|
@@ -34,54 +29,13 @@ export class HumidifierAccessory extends BaseAccessory {
|
|
|
34
29
|
this.setActive.bind(this)
|
|
35
30
|
);
|
|
36
31
|
|
|
37
|
-
// Set up
|
|
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)
|
|
32
|
+
// Set up speed control
|
|
70
33
|
this.setupCharacteristic(
|
|
71
34
|
this.platform.Characteristic.RotationSpeed,
|
|
72
35
|
this.getRotationSpeed.bind(this),
|
|
73
36
|
this.handleSetRotationSpeed.bind(this)
|
|
74
37
|
);
|
|
75
38
|
|
|
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
|
-
|
|
85
39
|
// Add Name characteristic
|
|
86
40
|
this.setupCharacteristic(
|
|
87
41
|
this.platform.Characteristic.Name,
|
|
@@ -93,76 +47,49 @@ export class HumidifierAccessory extends BaseAccessory {
|
|
|
93
47
|
* Update device states based on the latest details
|
|
94
48
|
*/
|
|
95
49
|
protected async updateDeviceSpecificStates(details: any): Promise<void> {
|
|
96
|
-
const humidifierDetails =
|
|
50
|
+
const humidifierDetails = details as {
|
|
51
|
+
deviceStatus: string;
|
|
52
|
+
speed: number;
|
|
53
|
+
};
|
|
97
54
|
|
|
98
55
|
// Update active state
|
|
99
|
-
const isActive =
|
|
56
|
+
const isActive = humidifierDetails.deviceStatus === 'on';
|
|
100
57
|
this.updateCharacteristicValue(
|
|
101
58
|
this.platform.Characteristic.Active,
|
|
102
59
|
isActive ? 1 : 0
|
|
103
60
|
);
|
|
104
61
|
|
|
105
|
-
// Update current 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
|
-
}
|
|
62
|
+
// Update current state (INACTIVE = 0, IDLE = 1, HUMIDIFYING = 2, DEHUMIDIFYING = 3)
|
|
119
63
|
this.updateCharacteristicValue(
|
|
120
64
|
this.platform.Characteristic.CurrentHumidifierDehumidifierState,
|
|
121
|
-
|
|
65
|
+
isActive ? 2 : 0
|
|
122
66
|
);
|
|
123
67
|
|
|
124
|
-
// Update target state (
|
|
68
|
+
// Update target state (HUMIDIFIER = 1, DEHUMIDIFIER = 2, AUTO = 0)
|
|
125
69
|
this.updateCharacteristicValue(
|
|
126
70
|
this.platform.Characteristic.TargetHumidifierDehumidifierState,
|
|
127
|
-
1 //
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
// Update current humidity
|
|
131
|
-
this.updateCharacteristicValue(
|
|
132
|
-
this.platform.Characteristic.CurrentRelativeHumidity,
|
|
133
|
-
humidifierDetails.humidity
|
|
71
|
+
1 // Always humidifier mode
|
|
134
72
|
);
|
|
135
73
|
|
|
136
|
-
// Update
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
74
|
+
// Update rotation speed - convert device speed (1-9) to HomeKit percentage (0-100)
|
|
75
|
+
let rotationSpeed = 0;
|
|
76
|
+
if (isActive && humidifierDetails.speed !== undefined) {
|
|
77
|
+
switch (humidifierDetails.speed) {
|
|
78
|
+
case 1: rotationSpeed = 11; break;
|
|
79
|
+
case 2: rotationSpeed = 22; break;
|
|
80
|
+
case 3: rotationSpeed = 33; break;
|
|
81
|
+
case 4: rotationSpeed = 44; break;
|
|
82
|
+
case 5: rotationSpeed = 55; break;
|
|
83
|
+
case 6: rotationSpeed = 66; break;
|
|
84
|
+
case 7: rotationSpeed = 77; break;
|
|
85
|
+
case 8: rotationSpeed = 88; break;
|
|
86
|
+
case 9: rotationSpeed = 100; break;
|
|
87
|
+
}
|
|
150
88
|
}
|
|
151
|
-
|
|
152
|
-
// Update rotation speed (mist level)
|
|
153
|
-
const rotationSpeed = this.convertMistLevelToPercentage(humidifierDetails.mist_level);
|
|
154
89
|
this.updateCharacteristicValue(
|
|
155
90
|
this.platform.Characteristic.RotationSpeed,
|
|
156
91
|
rotationSpeed
|
|
157
92
|
);
|
|
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
|
-
}
|
|
166
93
|
}
|
|
167
94
|
|
|
168
95
|
protected getDeviceCapabilities(): DeviceCapabilities {
|
|
@@ -192,113 +119,66 @@ export class HumidifierAccessory extends BaseAccessory {
|
|
|
192
119
|
throw new Error(`Failed to turn ${isOn ? 'on' : 'off'} device`);
|
|
193
120
|
}
|
|
194
121
|
|
|
122
|
+
// Update device state and characteristics
|
|
123
|
+
await this.updateDeviceSpecificStates(this.device);
|
|
195
124
|
await this.persistDeviceState('deviceStatus', isOn ? 'on' : 'off');
|
|
196
125
|
} catch (error) {
|
|
197
126
|
this.handleDeviceError('set active state', error);
|
|
198
127
|
}
|
|
199
128
|
}
|
|
200
129
|
|
|
201
|
-
private async
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
return 1; // IDLE
|
|
205
|
-
case 'humidifying':
|
|
206
|
-
return 2; // HUMIDIFYING
|
|
207
|
-
default:
|
|
208
|
-
return 0; // INACTIVE
|
|
130
|
+
private async getRotationSpeed(): Promise<CharacteristicValue> {
|
|
131
|
+
if (this.device.speed === undefined || this.device.speed === null) {
|
|
132
|
+
return 0;
|
|
209
133
|
}
|
|
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
|
-
}
|
|
227
134
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
this.handleDeviceError('set target humidity', error);
|
|
135
|
+
// Convert device speed (1-9) to HomeKit percentage (0-100)
|
|
136
|
+
switch (this.device.speed) {
|
|
137
|
+
case 0: return 0; // Off
|
|
138
|
+
case 1: return 11;
|
|
139
|
+
case 2: return 22;
|
|
140
|
+
case 3: return 33;
|
|
141
|
+
case 4: return 44;
|
|
142
|
+
case 5: return 55;
|
|
143
|
+
case 6: return 66;
|
|
144
|
+
case 7: return 77;
|
|
145
|
+
case 8: return 88;
|
|
146
|
+
case 9: return 100;
|
|
147
|
+
default: return 0;
|
|
242
148
|
}
|
|
243
149
|
}
|
|
244
150
|
|
|
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
|
-
|
|
264
151
|
private async handleSetRotationSpeed(value: CharacteristicValue): Promise<void> {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}
|
|
272
|
-
|
|
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);
|
|
152
|
+
const percentage = value as number;
|
|
153
|
+
|
|
154
|
+
if (percentage === 0) {
|
|
155
|
+
// Turn off the device instead of setting speed to 0
|
|
156
|
+
await this.device.turnOff();
|
|
157
|
+
return;
|
|
283
158
|
}
|
|
284
|
-
}
|
|
285
159
|
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
}
|
|
301
|
-
|
|
160
|
+
// Convert HomeKit percentage (0-100) to device speed (1-9)
|
|
161
|
+
let speed: number;
|
|
162
|
+
if (percentage <= 11) {
|
|
163
|
+
speed = 1;
|
|
164
|
+
} else if (percentage <= 22) {
|
|
165
|
+
speed = 2;
|
|
166
|
+
} else if (percentage <= 33) {
|
|
167
|
+
speed = 3;
|
|
168
|
+
} else if (percentage <= 44) {
|
|
169
|
+
speed = 4;
|
|
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;
|
|
302
180
|
}
|
|
181
|
+
|
|
182
|
+
await this.device.changeFanSpeed(speed);
|
|
303
183
|
}
|
|
304
184
|
}
|
|
@@ -73,39 +73,7 @@ export interface VeSyncDeviceWithControls extends VeSyncDeviceWithPower {
|
|
|
73
73
|
// Combined device types for specific device categories
|
|
74
74
|
export interface VeSyncAirPurifier extends VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithAirQuality, VeSyncDeviceWithControls {}
|
|
75
75
|
|
|
76
|
-
export interface VeSyncHumidifier extends
|
|
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
|
-
}
|
|
76
|
+
export interface VeSyncHumidifier extends VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithHumidity, VeSyncDeviceWithControls {}
|
|
109
77
|
|
|
110
78
|
export interface VeSyncFan extends VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithRotation {
|
|
111
79
|
oscillationState: boolean;
|