homebridge-tsvesync 1.0.63 → 1.0.65
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/base.accessory.d.ts.map +1 -1
- package/dist/accessories/base.accessory.js +3 -2
- package/dist/accessories/base.accessory.js.map +1 -1
- package/dist/accessories/humidifier.accessory.d.ts +2 -1
- package/dist/accessories/humidifier.accessory.d.ts.map +1 -1
- package/dist/accessories/humidifier.accessory.js +84 -22
- package/dist/accessories/humidifier.accessory.js.map +1 -1
- package/package.json +2 -2
- package/src/accessories/base.accessory.ts +4 -3
- package/src/accessories/humidifier.accessory.ts +111 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/base.accessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAIlF,8BAAsB,aAAa;IACjC,SAAS,CAAC,OAAO,EAAG,OAAO,CAAC;IAC5B,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAC9C,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IAChD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,qBAAqB,CAAgB;IAC7C,OAAO,CAAC,sBAAsB,CAAc;IAC5C,OAAO,CAAC,cAAc,CAAS;gBAG7B,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,qBAAqB;
|
|
1
|
+
{"version":3,"file":"base.accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/base.accessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAIlF,8BAAsB,aAAa;IACjC,SAAS,CAAC,OAAO,EAAG,OAAO,CAAC;IAC5B,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAC9C,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IAChD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,qBAAqB,CAAgB;IAC7C,OAAO,CAAC,sBAAsB,CAAc;IAC5C,OAAO,CAAC,cAAc,CAAS;gBAG7B,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,qBAAqB;IA0B/B;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,YAAY,IAAI,IAAI;IAEvC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,0BAA0B,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1E;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,qBAAqB,IAAI,kBAAkB;IAE9D;;OAEG;IACH,SAAS,CAAC,aAAa,IAAI,MAAM;IAgBjC;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BxC;;OAEG;IACU,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAY7C;;OAEG;IACH,SAAS,CAAC,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQ1D;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAC3B,cAAc,EAAE,GAAG,EACnB,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,EAC1C,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,EACrD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,OAAO,CAAC,EAAE,OAAO,GAChB,IAAI;IAqDP;;OAEG;IACH,SAAS,CAAC,yBAAyB,CACjC,cAAc,EAAE,GAAG,EACnB,KAAK,EAAE,mBAAmB,GACzB,IAAI;IAUP;;OAEG;cACa,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB9E;;OAEG;cACa,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CA2BtF"}
|
|
@@ -18,8 +18,7 @@ class BaseAccessory {
|
|
|
18
18
|
// Initialize managers
|
|
19
19
|
this.logger = new logger_1.PluginLogger(this.platform.log, this.platform.config.debug);
|
|
20
20
|
this.retryManager = new retry_1.RetryManager(this.platform.log, this.platform.config.retry);
|
|
21
|
-
//
|
|
22
|
-
this.setupAccessory();
|
|
21
|
+
// Note: setupAccessory is now called in initialize() instead of constructor
|
|
23
22
|
this.logger.debug('Accessory created', this.getLogContext());
|
|
24
23
|
}
|
|
25
24
|
/**
|
|
@@ -80,6 +79,8 @@ class BaseAccessory {
|
|
|
80
79
|
}
|
|
81
80
|
this.isInitializing = true;
|
|
82
81
|
try {
|
|
82
|
+
// Set up the accessory first
|
|
83
|
+
this.setupAccessory();
|
|
83
84
|
// Ensure platform is ready before proceeding
|
|
84
85
|
await this.platform.isReady();
|
|
85
86
|
// Update states using device info we already have from getDevices
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.accessory.js","sourceRoot":"","sources":["../../src/accessories/base.accessory.ts"],"names":[],"mappings":";;;AAGA,0CAA8C;AAC9C,4CAA2D;AAE3D,MAAsB,aAAa;IAajC,YACE,QAA0B,EAC1B,SAA4B,EAC5B,MAA6B;QATvB,eAAU,GAAG,KAAK,CAAC;QACnB,kBAAa,GAAG,KAAK,CAAC;QAGtB,mBAAc,GAAG,KAAK,CAAC;QAO7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,gCAAgC;QAChC,IAAI,CAAC,qBAAqB,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACnD,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,sBAAsB;QACtB,IAAI,CAAC,MAAM,GAAG,IAAI,qBAAY,CAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,EACjB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAC3B,CAAC;QAEF,IAAI,CAAC,YAAY,GAAG,IAAI,oBAAY,CAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,EACjB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAC3B,CAAC;QAEF,
|
|
1
|
+
{"version":3,"file":"base.accessory.js","sourceRoot":"","sources":["../../src/accessories/base.accessory.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,10 +11,11 @@ export declare class HumidifierAccessory extends BaseAccessory {
|
|
|
11
11
|
* Update device states based on the latest details
|
|
12
12
|
*/
|
|
13
13
|
protected updateDeviceSpecificStates(details: any): Promise<void>;
|
|
14
|
-
protected getDeviceCapabilities(): DeviceCapabilities;
|
|
15
14
|
private getActive;
|
|
16
15
|
private setActive;
|
|
17
16
|
private getRotationSpeed;
|
|
17
|
+
private setTargetState;
|
|
18
18
|
private handleSetRotationSpeed;
|
|
19
|
+
protected getDeviceCapabilities(): DeviceCapabilities;
|
|
19
20
|
}
|
|
20
21
|
//# 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;
|
|
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;AAO7E,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;IAoB1B,SAAS,CAAC,YAAY,IAAI,IAAI;IAwD9B;;OAEG;cACa,0BAA0B,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YAyEzD,SAAS;YAIT,SAAS;YAiBT,gBAAgB;YAqBhB,cAAc;YAyBd,sBAAsB;IAkCpC,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;CAGtD"}
|
|
@@ -4,9 +4,21 @@ exports.HumidifierAccessory = void 0;
|
|
|
4
4
|
const base_accessory_1 = require("./base.accessory");
|
|
5
5
|
class HumidifierAccessory extends base_accessory_1.BaseAccessory {
|
|
6
6
|
constructor(platform, accessory, device) {
|
|
7
|
+
// Initialize capabilities
|
|
8
|
+
const capabilities = {
|
|
9
|
+
hasBrightness: false,
|
|
10
|
+
hasColorTemp: false,
|
|
11
|
+
hasColor: false,
|
|
12
|
+
hasSpeed: true,
|
|
13
|
+
hasHumidity: true,
|
|
14
|
+
hasAirQuality: false,
|
|
15
|
+
hasWaterLevel: true,
|
|
16
|
+
hasChildLock: true,
|
|
17
|
+
hasSwingMode: false,
|
|
18
|
+
};
|
|
7
19
|
super(platform, accessory, device);
|
|
8
20
|
this.device = device;
|
|
9
|
-
this.capabilities =
|
|
21
|
+
this.capabilities = capabilities;
|
|
10
22
|
}
|
|
11
23
|
setupService() {
|
|
12
24
|
// Get or create the humidifier service
|
|
@@ -14,24 +26,44 @@ class HumidifierAccessory extends base_accessory_1.BaseAccessory {
|
|
|
14
26
|
this.accessory.addService(this.platform.Service.HumidifierDehumidifier);
|
|
15
27
|
// Set up required characteristics
|
|
16
28
|
this.setupCharacteristic(this.platform.Characteristic.Active, this.getActive.bind(this), this.setActive.bind(this));
|
|
17
|
-
// Set up
|
|
29
|
+
// Set up target state characteristic for mode mapping
|
|
30
|
+
this.setupCharacteristic(this.platform.Characteristic.TargetHumidifierDehumidifierState, async () => 1, this.setTargetState.bind(this));
|
|
31
|
+
// Set up rotation speed characteristic
|
|
18
32
|
this.setupCharacteristic(this.platform.Characteristic.RotationSpeed, this.getRotationSpeed.bind(this), this.handleSetRotationSpeed.bind(this));
|
|
19
33
|
// Add Name characteristic
|
|
20
34
|
this.setupCharacteristic(this.platform.Characteristic.Name, async () => this.device.deviceName);
|
|
35
|
+
// Add Current Relative Humidity if supported
|
|
36
|
+
if (this.capabilities.hasHumidity) {
|
|
37
|
+
if (!this.service.testCharacteristic(this.platform.Characteristic.CurrentRelativeHumidity)) {
|
|
38
|
+
this.service.addCharacteristic(this.platform.Characteristic.CurrentRelativeHumidity);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Add Water Level characteristic if supported (mapping inferred from water_lacks/water_tank_lifted)
|
|
42
|
+
if (this.capabilities.hasWaterLevel) {
|
|
43
|
+
if (!this.service.testCharacteristic(this.platform.Characteristic.WaterLevel)) {
|
|
44
|
+
this.service.addCharacteristic(this.platform.Characteristic.WaterLevel);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Add Lock Physical Controls characteristic if supported
|
|
48
|
+
if (this.capabilities.hasChildLock) {
|
|
49
|
+
this.setupCharacteristic(this.platform.Characteristic.LockPhysicalControls, async () => false, async (value) => { throw new Error('Locking physical controls is not supported by the tsvesync API.'); });
|
|
50
|
+
}
|
|
21
51
|
}
|
|
22
52
|
/**
|
|
23
53
|
* Update device states based on the latest details
|
|
24
54
|
*/
|
|
25
55
|
async updateDeviceSpecificStates(details) {
|
|
26
56
|
const humidifierDetails = details;
|
|
27
|
-
// Update active state
|
|
28
57
|
const isActive = humidifierDetails.deviceStatus === 'on';
|
|
58
|
+
// Update active state
|
|
29
59
|
this.updateCharacteristicValue(this.platform.Characteristic.Active, isActive ? 1 : 0);
|
|
30
|
-
// Update current state
|
|
31
|
-
|
|
32
|
-
//
|
|
33
|
-
|
|
34
|
-
);
|
|
60
|
+
// Update current state based on API mapping
|
|
61
|
+
// HomeKit states: 0 = INACTIVE, 1 = IDLE, 2 = HUMIDIFYING, 3 = DEHUMIDIFYING
|
|
62
|
+
// Mapping: if active and mode is 'manual' -> HUMIDIFYING (2), else INACTIVE (0)
|
|
63
|
+
const currentState = (isActive && humidifierDetails.mode === 'manual') ? 2 : 0;
|
|
64
|
+
this.updateCharacteristicValue(this.platform.Characteristic.CurrentHumidifierDehumidifierState, currentState);
|
|
65
|
+
// Update target state; always humidifier mode (1) as only humidification is supported
|
|
66
|
+
this.updateCharacteristicValue(this.platform.Characteristic.TargetHumidifierDehumidifierState, 1);
|
|
35
67
|
// Update rotation speed - convert device speed (1-9) to HomeKit percentage (0-100)
|
|
36
68
|
let rotationSpeed = 0;
|
|
37
69
|
if (isActive && humidifierDetails.speed !== undefined) {
|
|
@@ -66,19 +98,18 @@ class HumidifierAccessory extends base_accessory_1.BaseAccessory {
|
|
|
66
98
|
}
|
|
67
99
|
}
|
|
68
100
|
this.updateCharacteristicValue(this.platform.Characteristic.RotationSpeed, rotationSpeed);
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
};
|
|
101
|
+
// Update relative humidity if supported
|
|
102
|
+
if (this.capabilities.hasHumidity && humidifierDetails.humidity !== undefined) {
|
|
103
|
+
this.updateCharacteristicValue(this.platform.Characteristic.CurrentRelativeHumidity, humidifierDetails.humidity);
|
|
104
|
+
}
|
|
105
|
+
// Update water level if supported (inferred from water_lacks/water_tank_lifted)
|
|
106
|
+
if (this.capabilities.hasWaterLevel) {
|
|
107
|
+
const waterLow = humidifierDetails.water_lacks || humidifierDetails.water_tank_lifted;
|
|
108
|
+
if (this.service.getCharacteristic(this.platform.Characteristic.WaterLevel)) {
|
|
109
|
+
// Map water level as 0 for low water, 100 for sufficient water
|
|
110
|
+
this.updateCharacteristicValue(this.platform.Characteristic.WaterLevel, waterLow ? 0 : 100);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
82
113
|
}
|
|
83
114
|
async getActive() {
|
|
84
115
|
return this.device.deviceStatus === 'on' ? 1 : 0;
|
|
@@ -104,7 +135,7 @@ class HumidifierAccessory extends base_accessory_1.BaseAccessory {
|
|
|
104
135
|
}
|
|
105
136
|
// Convert device speed (1-9) to HomeKit percentage (0-100)
|
|
106
137
|
switch (this.device.speed) {
|
|
107
|
-
case 0: return 0;
|
|
138
|
+
case 0: return 0;
|
|
108
139
|
case 1: return 11;
|
|
109
140
|
case 2: return 22;
|
|
110
141
|
case 3: return 33;
|
|
@@ -117,6 +148,34 @@ class HumidifierAccessory extends base_accessory_1.BaseAccessory {
|
|
|
117
148
|
default: return 0;
|
|
118
149
|
}
|
|
119
150
|
}
|
|
151
|
+
async setTargetState(value) {
|
|
152
|
+
try {
|
|
153
|
+
// HomeKit Target State: 1 = Humidifier, 2 = Dehumidifier, 0 = Auto
|
|
154
|
+
const device = this.device;
|
|
155
|
+
if (value === 1) {
|
|
156
|
+
if (typeof device.setMode === 'function') {
|
|
157
|
+
const success = await device.setMode('manual');
|
|
158
|
+
if (!success) {
|
|
159
|
+
throw new Error('Failed to set device mode to humidification (manual)');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
throw new Error('Device API does not support setMode operation');
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else if (value === 2) {
|
|
167
|
+
throw new Error('Dehumidification mode is not supported by this device');
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
throw new Error('Unsupported target state value');
|
|
171
|
+
}
|
|
172
|
+
// After setting, update the target state to reflect humidifier mode (1)
|
|
173
|
+
this.updateCharacteristicValue(this.platform.Characteristic.TargetHumidifierDehumidifierState, 1);
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
this.handleDeviceError('set target state', error);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
120
179
|
async handleSetRotationSpeed(value) {
|
|
121
180
|
const percentage = value;
|
|
122
181
|
if (percentage === 0) {
|
|
@@ -155,6 +214,9 @@ class HumidifierAccessory extends base_accessory_1.BaseAccessory {
|
|
|
155
214
|
}
|
|
156
215
|
await this.device.changeFanSpeed(speed);
|
|
157
216
|
}
|
|
217
|
+
getDeviceCapabilities() {
|
|
218
|
+
return this.capabilities;
|
|
219
|
+
}
|
|
158
220
|
}
|
|
159
221
|
exports.HumidifierAccessory = HumidifierAccessory;
|
|
160
222
|
//# sourceMappingURL=humidifier.accessory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"humidifier.accessory.js","sourceRoot":"","sources":["../../src/accessories/humidifier.accessory.ts"],"names":[],"mappings":";;;AACA,qDAAiD;
|
|
1
|
+
{"version":3,"file":"humidifier.accessory.js","sourceRoot":"","sources":["../../src/accessories/humidifier.accessory.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.65",
|
|
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.64"
|
|
102
102
|
},
|
|
103
103
|
"devDependencies": {
|
|
104
104
|
"@types/jest": "^29.5.11",
|
|
@@ -42,9 +42,7 @@ export abstract class BaseAccessory {
|
|
|
42
42
|
this.platform.config.retry
|
|
43
43
|
);
|
|
44
44
|
|
|
45
|
-
//
|
|
46
|
-
this.setupAccessory();
|
|
47
|
-
|
|
45
|
+
// Note: setupAccessory is now called in initialize() instead of constructor
|
|
48
46
|
this.logger.debug('Accessory created', this.getLogContext());
|
|
49
47
|
}
|
|
50
48
|
|
|
@@ -126,6 +124,9 @@ export abstract class BaseAccessory {
|
|
|
126
124
|
|
|
127
125
|
this.isInitializing = true;
|
|
128
126
|
try {
|
|
127
|
+
// Set up the accessory first
|
|
128
|
+
this.setupAccessory();
|
|
129
|
+
|
|
129
130
|
// Ensure platform is ready before proceeding
|
|
130
131
|
await this.platform.isReady();
|
|
131
132
|
|
|
@@ -3,6 +3,11 @@ import { BaseAccessory } from './base.accessory';
|
|
|
3
3
|
import { TSVESyncPlatform } from '../platform';
|
|
4
4
|
import { DeviceCapabilities, VeSyncHumidifier } from '../types/device.types';
|
|
5
5
|
|
|
6
|
+
// Extended interface to include optional setMode method for humidifiers
|
|
7
|
+
interface ExtendedVeSyncHumidifier extends VeSyncHumidifier {
|
|
8
|
+
setMode?(mode: 'manual'): Promise<boolean>;
|
|
9
|
+
}
|
|
10
|
+
|
|
6
11
|
export class HumidifierAccessory extends BaseAccessory {
|
|
7
12
|
protected readonly device: VeSyncHumidifier;
|
|
8
13
|
private readonly capabilities: DeviceCapabilities;
|
|
@@ -12,9 +17,22 @@ export class HumidifierAccessory extends BaseAccessory {
|
|
|
12
17
|
accessory: PlatformAccessory,
|
|
13
18
|
device: VeSyncHumidifier
|
|
14
19
|
) {
|
|
20
|
+
// Initialize capabilities
|
|
21
|
+
const capabilities: DeviceCapabilities = {
|
|
22
|
+
hasBrightness: false,
|
|
23
|
+
hasColorTemp: false,
|
|
24
|
+
hasColor: false,
|
|
25
|
+
hasSpeed: true,
|
|
26
|
+
hasHumidity: true,
|
|
27
|
+
hasAirQuality: false,
|
|
28
|
+
hasWaterLevel: true,
|
|
29
|
+
hasChildLock: true,
|
|
30
|
+
hasSwingMode: false,
|
|
31
|
+
};
|
|
32
|
+
|
|
15
33
|
super(platform, accessory, device);
|
|
16
34
|
this.device = device;
|
|
17
|
-
this.capabilities =
|
|
35
|
+
this.capabilities = capabilities;
|
|
18
36
|
}
|
|
19
37
|
|
|
20
38
|
protected setupService(): void {
|
|
@@ -29,7 +47,14 @@ export class HumidifierAccessory extends BaseAccessory {
|
|
|
29
47
|
this.setActive.bind(this)
|
|
30
48
|
);
|
|
31
49
|
|
|
32
|
-
// Set up
|
|
50
|
+
// Set up target state characteristic for mode mapping
|
|
51
|
+
this.setupCharacteristic(
|
|
52
|
+
this.platform.Characteristic.TargetHumidifierDehumidifierState,
|
|
53
|
+
async () => 1,
|
|
54
|
+
this.setTargetState.bind(this)
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
// Set up rotation speed characteristic
|
|
33
58
|
this.setupCharacteristic(
|
|
34
59
|
this.platform.Characteristic.RotationSpeed,
|
|
35
60
|
this.getRotationSpeed.bind(this),
|
|
@@ -41,6 +66,29 @@ export class HumidifierAccessory extends BaseAccessory {
|
|
|
41
66
|
this.platform.Characteristic.Name,
|
|
42
67
|
async () => this.device.deviceName
|
|
43
68
|
);
|
|
69
|
+
|
|
70
|
+
// Add Current Relative Humidity if supported
|
|
71
|
+
if (this.capabilities.hasHumidity) {
|
|
72
|
+
if (!this.service.testCharacteristic(this.platform.Characteristic.CurrentRelativeHumidity)) {
|
|
73
|
+
this.service.addCharacteristic(this.platform.Characteristic.CurrentRelativeHumidity);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Add Water Level characteristic if supported (mapping inferred from water_lacks/water_tank_lifted)
|
|
78
|
+
if (this.capabilities.hasWaterLevel) {
|
|
79
|
+
if (!this.service.testCharacteristic(this.platform.Characteristic.WaterLevel)) {
|
|
80
|
+
this.service.addCharacteristic(this.platform.Characteristic.WaterLevel);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Add Lock Physical Controls characteristic if supported
|
|
85
|
+
if (this.capabilities.hasChildLock) {
|
|
86
|
+
this.setupCharacteristic(
|
|
87
|
+
this.platform.Characteristic.LockPhysicalControls,
|
|
88
|
+
async () => false,
|
|
89
|
+
async (value: CharacteristicValue) => { throw new Error('Locking physical controls is not supported by the tsvesync API.'); }
|
|
90
|
+
);
|
|
91
|
+
}
|
|
44
92
|
}
|
|
45
93
|
|
|
46
94
|
/**
|
|
@@ -50,25 +98,32 @@ export class HumidifierAccessory extends BaseAccessory {
|
|
|
50
98
|
const humidifierDetails = details as {
|
|
51
99
|
deviceStatus: string;
|
|
52
100
|
speed: number;
|
|
101
|
+
mode?: string;
|
|
102
|
+
humidity?: number;
|
|
103
|
+
water_lacks?: boolean;
|
|
104
|
+
water_tank_lifted?: boolean;
|
|
53
105
|
};
|
|
54
106
|
|
|
55
|
-
// Update active state
|
|
56
107
|
const isActive = humidifierDetails.deviceStatus === 'on';
|
|
108
|
+
// Update active state
|
|
57
109
|
this.updateCharacteristicValue(
|
|
58
110
|
this.platform.Characteristic.Active,
|
|
59
111
|
isActive ? 1 : 0
|
|
60
112
|
);
|
|
61
113
|
|
|
62
|
-
// Update current state
|
|
114
|
+
// Update current state based on API mapping
|
|
115
|
+
// HomeKit states: 0 = INACTIVE, 1 = IDLE, 2 = HUMIDIFYING, 3 = DEHUMIDIFYING
|
|
116
|
+
// Mapping: if active and mode is 'manual' -> HUMIDIFYING (2), else INACTIVE (0)
|
|
117
|
+
const currentState = (isActive && humidifierDetails.mode === 'manual') ? 2 : 0;
|
|
63
118
|
this.updateCharacteristicValue(
|
|
64
119
|
this.platform.Characteristic.CurrentHumidifierDehumidifierState,
|
|
65
|
-
|
|
120
|
+
currentState
|
|
66
121
|
);
|
|
67
122
|
|
|
68
|
-
// Update target state
|
|
123
|
+
// Update target state; always humidifier mode (1) as only humidification is supported
|
|
69
124
|
this.updateCharacteristicValue(
|
|
70
125
|
this.platform.Characteristic.TargetHumidifierDehumidifierState,
|
|
71
|
-
1
|
|
126
|
+
1
|
|
72
127
|
);
|
|
73
128
|
|
|
74
129
|
// Update rotation speed - convert device speed (1-9) to HomeKit percentage (0-100)
|
|
@@ -90,20 +145,26 @@ export class HumidifierAccessory extends BaseAccessory {
|
|
|
90
145
|
this.platform.Characteristic.RotationSpeed,
|
|
91
146
|
rotationSpeed
|
|
92
147
|
);
|
|
93
|
-
}
|
|
94
148
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
149
|
+
// Update relative humidity if supported
|
|
150
|
+
if (this.capabilities.hasHumidity && humidifierDetails.humidity !== undefined) {
|
|
151
|
+
this.updateCharacteristicValue(
|
|
152
|
+
this.platform.Characteristic.CurrentRelativeHumidity,
|
|
153
|
+
humidifierDetails.humidity
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Update water level if supported (inferred from water_lacks/water_tank_lifted)
|
|
158
|
+
if (this.capabilities.hasWaterLevel) {
|
|
159
|
+
const waterLow = humidifierDetails.water_lacks || humidifierDetails.water_tank_lifted;
|
|
160
|
+
if (this.service.getCharacteristic(this.platform.Characteristic.WaterLevel)) {
|
|
161
|
+
// Map water level as 0 for low water, 100 for sufficient water
|
|
162
|
+
this.updateCharacteristicValue(
|
|
163
|
+
this.platform.Characteristic.WaterLevel,
|
|
164
|
+
waterLow ? 0 : 100
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
107
168
|
}
|
|
108
169
|
|
|
109
170
|
private async getActive(): Promise<CharacteristicValue> {
|
|
@@ -134,7 +195,7 @@ export class HumidifierAccessory extends BaseAccessory {
|
|
|
134
195
|
|
|
135
196
|
// Convert device speed (1-9) to HomeKit percentage (0-100)
|
|
136
197
|
switch (this.device.speed) {
|
|
137
|
-
case 0: return 0;
|
|
198
|
+
case 0: return 0;
|
|
138
199
|
case 1: return 11;
|
|
139
200
|
case 2: return 22;
|
|
140
201
|
case 3: return 33;
|
|
@@ -148,6 +209,31 @@ export class HumidifierAccessory extends BaseAccessory {
|
|
|
148
209
|
}
|
|
149
210
|
}
|
|
150
211
|
|
|
212
|
+
private async setTargetState(value: CharacteristicValue): Promise<void> {
|
|
213
|
+
try {
|
|
214
|
+
// HomeKit Target State: 1 = Humidifier, 2 = Dehumidifier, 0 = Auto
|
|
215
|
+
const device = this.device as ExtendedVeSyncHumidifier;
|
|
216
|
+
if (value === 1) {
|
|
217
|
+
if (typeof device.setMode === 'function') {
|
|
218
|
+
const success = await device.setMode('manual');
|
|
219
|
+
if (!success) {
|
|
220
|
+
throw new Error('Failed to set device mode to humidification (manual)');
|
|
221
|
+
}
|
|
222
|
+
} else {
|
|
223
|
+
throw new Error('Device API does not support setMode operation');
|
|
224
|
+
}
|
|
225
|
+
} else if (value === 2) {
|
|
226
|
+
throw new Error('Dehumidification mode is not supported by this device');
|
|
227
|
+
} else {
|
|
228
|
+
throw new Error('Unsupported target state value');
|
|
229
|
+
}
|
|
230
|
+
// After setting, update the target state to reflect humidifier mode (1)
|
|
231
|
+
this.updateCharacteristicValue(this.platform.Characteristic.TargetHumidifierDehumidifierState, 1);
|
|
232
|
+
} catch (error) {
|
|
233
|
+
this.handleDeviceError('set target state', error);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
151
237
|
private async handleSetRotationSpeed(value: CharacteristicValue): Promise<void> {
|
|
152
238
|
const percentage = value as number;
|
|
153
239
|
|
|
@@ -181,4 +267,8 @@ export class HumidifierAccessory extends BaseAccessory {
|
|
|
181
267
|
|
|
182
268
|
await this.device.changeFanSpeed(speed);
|
|
183
269
|
}
|
|
270
|
+
|
|
271
|
+
protected getDeviceCapabilities(): DeviceCapabilities {
|
|
272
|
+
return this.capabilities;
|
|
273
|
+
}
|
|
184
274
|
}
|