homebridge-tsvesync 1.0.55 → 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.
@@ -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;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"}
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 speed control
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 = humidifierDetails.deviceStatus === 'on';
45
+ const isActive = this.device.deviceStatus === 'on';
29
46
  this.updateCharacteristicValue(this.platform.Characteristic.Active, isActive ? 1 : 0);
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;
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 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;
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 getRotationSpeed() {
102
- if (this.device.speed === undefined || this.device.speed === null) {
103
- return 0;
104
- }
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;
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 handleSetRotationSpeed(value) {
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;
126
- }
127
- // Convert HomeKit percentage (0-100) to device speed (1-9)
128
- let speed;
129
- if (percentage <= 11) {
130
- speed = 1;
131
- }
132
- else if (percentage <= 22) {
133
- speed = 2;
134
- }
135
- else if (percentage <= 33) {
136
- speed = 3;
137
- }
138
- else if (percentage <= 44) {
139
- speed = 4;
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
- else if (percentage <= 55) {
142
- speed = 5;
146
+ catch (error) {
147
+ this.handleDeviceError('set target humidity', error);
143
148
  }
144
- else if (percentage <= 66) {
145
- speed = 6;
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
- else if (percentage <= 77) {
148
- speed = 7;
181
+ catch (error) {
182
+ this.handleDeviceError('set mist level', error);
149
183
  }
150
- else if (percentage <= 88) {
151
- speed = 8;
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
- else {
154
- speed = 9;
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":"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"}
1
+ {"version":3,"file":"humidifier.accessory.js","sourceRoot":"","sources":["../../src/accessories/humidifier.accessory.ts"],"names":[],"mappings":"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"}
@@ -61,7 +61,38 @@ export interface VeSyncDeviceWithControls extends VeSyncDeviceWithPower {
61
61
  }
62
62
  export interface VeSyncAirPurifier extends VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithAirQuality, VeSyncDeviceWithControls {
63
63
  }
64
- export interface VeSyncHumidifier extends VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithHumidity, VeSyncDeviceWithControls {
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>;
65
96
  }
66
97
  export interface VeSyncFan extends VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithRotation {
67
98
  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.55",
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.50"
101
+ "tsvesync": "1.0.59"
102
102
  },
103
103
  "devDependencies": {
104
104
  "@types/jest": "^29.5.11",
@@ -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 speed control
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 as {
51
- deviceStatus: string;
52
- speed: number;
53
- };
96
+ const humidifierDetails = this.device.details;
54
97
 
55
98
  // Update active state
56
- const isActive = humidifierDetails.deviceStatus === 'on';
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 (INACTIVE = 0, IDLE = 1, HUMIDIFYING = 2, DEHUMIDIFYING = 3)
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
- isActive ? 2 : 0
121
+ currentState
66
122
  );
67
123
 
68
- // Update target state (HUMIDIFIER = 1, DEHUMIDIFIER = 2, AUTO = 0)
124
+ // Update target state (always humidifier mode)
69
125
  this.updateCharacteristicValue(
70
126
  this.platform.Characteristic.TargetHumidifierDehumidifierState,
71
- 1 // Always humidifier mode
127
+ 1 // 1 = HUMIDIFIER
72
128
  );
73
129
 
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
- }
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 getRotationSpeed(): Promise<CharacteristicValue> {
131
- if (this.device.speed === undefined || this.device.speed === null) {
132
- return 0;
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
- // 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;
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
- 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;
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
- // 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;
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
- await this.device.changeFanSpeed(speed);
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
  }
@@ -73,7 +73,39 @@ 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 VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithHumidity, VeSyncDeviceWithControls {}
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
+ }
77
109
 
78
110
  export interface VeSyncFan extends VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithRotation {
79
111
  oscillationState: boolean;