homebridge-tsvesync 1.0.59 → 1.0.60

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,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;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"}
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 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)
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 = this.device.details;
26
+ const humidifierDetails = details;
44
27
  // Update active state
45
- const isActive = this.device.deviceStatus === 'on';
28
+ const isActive = humidifierDetails.deviceStatus === 'on';
46
29
  this.updateCharacteristicValue(this.platform.Characteristic.Active, isActive ? 1 : 0);
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
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 'humidifying':
55
- currentState = 2; // HUMIDIFYING
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 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
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
- catch (error) {
147
- this.handleDeviceError('set target humidity', error);
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
- 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);
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
- catch (error) {
182
- this.handleDeviceError('set mist level', error);
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
- 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);
132
+ else if (percentage <= 22) {
133
+ speed = 2;
196
134
  }
197
- catch (error) {
198
- this.handleDeviceError('set child lock', error);
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":"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"}
1
+ {"version":3,"file":"humidifier.accessory.js","sourceRoot":"","sources":["../../src/accessories/humidifier.accessory.ts"],"names":[],"mappings":";;;AACA,qDAAiD;AAIjD,MAAa,mBAAoB,SAAQ,8BAAa;IAIpD,YACE,QAA0B,EAC1B,SAA4B,EAC5B,MAAwB;QAExB,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACnD,CAAC;IAES,YAAY;QACpB,uCAAuC;QACvC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC;YACpF,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAE1E,kCAAkC;QAClC,IAAI,CAAC,mBAAmB,CACtB,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,EACnC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAC1B,CAAC;QAEF,uBAAuB;QACvB,IAAI,CAAC,mBAAmB,CACtB,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,EAC1C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAChC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CACvC,CAAC;QAEF,0BAA0B;QAC1B,IAAI,CAAC,mBAAmB,CACtB,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EACjC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CACnC,CAAC;IACJ,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,0BAA0B,CAAC,OAAY;QACrD,MAAM,iBAAiB,GAAG,OAGzB,CAAC;QAEF,sBAAsB;QACtB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,YAAY,KAAK,IAAI,CAAC;QACzD,IAAI,CAAC,yBAAyB,CAC5B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,EACnC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACjB,CAAC;QAEF,oFAAoF;QACpF,IAAI,CAAC,yBAAyB,CAC5B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,kCAAkC,EAC/D,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACjB,CAAC;QAEF,mEAAmE;QACnE,IAAI,CAAC,yBAAyB,CAC5B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,iCAAiC,EAC9D,CAAC,CAAE,yBAAyB;SAC7B,CAAC;QAEF,mFAAmF;QACnF,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,QAAQ,IAAI,iBAAiB,CAAC,KAAK,KAAK,SAAS,EAAE;YACrD,QAAQ,iBAAiB,CAAC,KAAK,EAAE;gBAC/B,KAAK,CAAC;oBAAE,aAAa,GAAG,EAAE,CAAC;oBAAC,MAAM;gBAClC,KAAK,CAAC;oBAAE,aAAa,GAAG,EAAE,CAAC;oBAAC,MAAM;gBAClC,KAAK,CAAC;oBAAE,aAAa,GAAG,EAAE,CAAC;oBAAC,MAAM;gBAClC,KAAK,CAAC;oBAAE,aAAa,GAAG,EAAE,CAAC;oBAAC,MAAM;gBAClC,KAAK,CAAC;oBAAE,aAAa,GAAG,EAAE,CAAC;oBAAC,MAAM;gBAClC,KAAK,CAAC;oBAAE,aAAa,GAAG,EAAE,CAAC;oBAAC,MAAM;gBAClC,KAAK,CAAC;oBAAE,aAAa,GAAG,EAAE,CAAC;oBAAC,MAAM;gBAClC,KAAK,CAAC;oBAAE,aAAa,GAAG,EAAE,CAAC;oBAAC,MAAM;gBAClC,KAAK,CAAC;oBAAE,aAAa,GAAG,GAAG,CAAC;oBAAC,MAAM;aACpC;SACF;QACD,IAAI,CAAC,yBAAyB,CAC5B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,EAC1C,aAAa,CACd,CAAC;IACJ,CAAC;IAES,qBAAqB;QAC7B,OAAO;YACL,aAAa,EAAE,KAAK;YACpB,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,IAAI;YACjB,aAAa,EAAE,KAAK;YACpB,aAAa,EAAE,IAAI;YACnB,YAAY,EAAE,IAAI;YAClB,YAAY,EAAE,KAAK;SACpB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,SAAS;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAA0B;QAChD,IAAI;YACF,MAAM,IAAI,GAAG,KAAe,KAAK,CAAC,CAAC;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAEhF,IAAI,CAAC,OAAO,EAAE;gBACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;aACjE;YAED,0CAA0C;YAC1C,MAAM,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnD,MAAM,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;SACpE;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;SACnD;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE;YACjE,OAAO,CAAC,CAAC;SACV;QAED,2DAA2D;QAC3D,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YACzB,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAG,MAAM;YAC1B,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAClB,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAClB,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAClB,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAClB,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAClB,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAClB,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAClB,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAClB,KAAK,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC;YACnB,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;SACnB;IACH,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,KAA0B;QAC7D,MAAM,UAAU,GAAG,KAAe,CAAC;QAEnC,IAAI,UAAU,KAAK,CAAC,EAAE;YACpB,oDAAoD;YACpD,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC5B,OAAO;SACR;QAED,2DAA2D;QAC3D,IAAI,KAAa,CAAC;QAClB,IAAI,UAAU,IAAI,EAAE,EAAE;YACpB,KAAK,GAAG,CAAC,CAAC;SACX;aAAM,IAAI,UAAU,IAAI,EAAE,EAAE;YAC3B,KAAK,GAAG,CAAC,CAAC;SACX;aAAM,IAAI,UAAU,IAAI,EAAE,EAAE;YAC3B,KAAK,GAAG,CAAC,CAAC;SACX;aAAM,IAAI,UAAU,IAAI,EAAE,EAAE;YAC3B,KAAK,GAAG,CAAC,CAAC;SACX;aAAM,IAAI,UAAU,IAAI,EAAE,EAAE;YAC3B,KAAK,GAAG,CAAC,CAAC;SACX;aAAM,IAAI,UAAU,IAAI,EAAE,EAAE;YAC3B,KAAK,GAAG,CAAC,CAAC;SACX;aAAM,IAAI,UAAU,IAAI,EAAE,EAAE;YAC3B,KAAK,GAAG,CAAC,CAAC;SACX;aAAM,IAAI,UAAU,IAAI,EAAE,EAAE;YAC3B,KAAK,GAAG,CAAC,CAAC;SACX;aAAM;YACL,KAAK,GAAG,CAAC,CAAC;SACX;QAED,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;CACF;AAlLD,kDAkLC"}
@@ -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 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>;
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.59",
3
+ "version": "1.0.60",
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.59"
101
+ "tsvesync": "1.0.60"
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 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)
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 = this.device.details;
50
+ const humidifierDetails = details as {
51
+ deviceStatus: string;
52
+ speed: number;
53
+ };
97
54
 
98
55
  // Update active state
99
- const isActive = this.device.deviceStatus === 'on';
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 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
- }
62
+ // Update current state (INACTIVE = 0, IDLE = 1, HUMIDIFYING = 2, DEHUMIDIFYING = 3)
119
63
  this.updateCharacteristicValue(
120
64
  this.platform.Characteristic.CurrentHumidifierDehumidifierState,
121
- currentState
65
+ isActive ? 2 : 0
122
66
  );
123
67
 
124
- // Update target state (always humidifier mode)
68
+ // Update target state (HUMIDIFIER = 1, DEHUMIDIFIER = 2, AUTO = 0)
125
69
  this.updateCharacteristicValue(
126
70
  this.platform.Characteristic.TargetHumidifierDehumidifierState,
127
- 1 // 1 = HUMIDIFIER
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 target humidity
137
- if (humidifierDetails.targetHumidity !== undefined) {
138
- this.updateCharacteristicValue(
139
- this.platform.Characteristic.RelativeHumidityHumidifierThreshold,
140
- humidifierDetails.targetHumidity
141
- );
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
- );
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 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
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
- 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);
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
- try {
266
- const percentage = value as number;
267
-
268
- if (percentage === 0) {
269
- await this.device.turnOff();
270
- return;
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
- 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);
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 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
- }
76
+ export interface VeSyncHumidifier extends VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithHumidity, VeSyncDeviceWithControls {}
109
77
 
110
78
  export interface VeSyncFan extends VeSyncDeviceWithPower, VeSyncDeviceWithSpeed, VeSyncDeviceWithRotation {
111
79
  oscillationState: boolean;