homebridge-smarthq-client 1.2.5-debug.8 → 1.2.5-test.0
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.
|
@@ -8,7 +8,7 @@ export declare class AirConditioner {
|
|
|
8
8
|
private readonly deviceId;
|
|
9
9
|
private readonly groupAccessory;
|
|
10
10
|
private lastActiveMode;
|
|
11
|
-
private
|
|
11
|
+
private lastActiveFanSpeed;
|
|
12
12
|
private lastActiveCelsius;
|
|
13
13
|
private isOn;
|
|
14
14
|
private physicalOnState;
|
|
@@ -17,20 +17,6 @@ export declare class AirConditioner {
|
|
|
17
17
|
private currentAmbientCelsius;
|
|
18
18
|
private coolCelsiusMin;
|
|
19
19
|
private coolCelsiusMax;
|
|
20
|
-
private readonly MODE_COOL;
|
|
21
|
-
private readonly MODE_FANONLY;
|
|
22
|
-
private readonly MODE_DRY;
|
|
23
|
-
private readonly MODE_ENERGY_SAVER;
|
|
24
|
-
private readonly MODE_COOL_QUIET;
|
|
25
|
-
private readonly MODE_COOL_TURBO;
|
|
26
|
-
private readonly MODE_HEAT;
|
|
27
|
-
private readonly MODE_OFF;
|
|
28
|
-
private readonly MODE_ON;
|
|
29
|
-
private readonly FAN_SPEED_LOW;
|
|
30
|
-
private readonly FAN_SPEED_MEDIUM;
|
|
31
|
-
private readonly FAN_SPEED_HIGH;
|
|
32
|
-
private readonly FAN_SPEED_AUTO;
|
|
33
|
-
private readonly FAN_SPEED_OFF;
|
|
34
20
|
private client;
|
|
35
21
|
private api;
|
|
36
22
|
Service: typeof Service;
|
|
@@ -50,6 +36,4 @@ export declare class AirConditioner {
|
|
|
50
36
|
private findService;
|
|
51
37
|
private getLastElementAndCapitalize;
|
|
52
38
|
private setupWebSocket;
|
|
53
|
-
private addDebugState;
|
|
54
|
-
setupService(serviceType: string, displayName: string, serviceIdSuffix: string): Service;
|
|
55
39
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { SmartHQClient } from 'ge-smarthq-api';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
2
|
export class AirConditioner {
|
|
4
3
|
platform;
|
|
5
4
|
accessory;
|
|
@@ -8,7 +7,7 @@ export class AirConditioner {
|
|
|
8
7
|
groupAccessory;
|
|
9
8
|
// State cache
|
|
10
9
|
lastActiveMode = 'cloud.smarthq.type.thermostatmode.cool';
|
|
11
|
-
|
|
10
|
+
lastActiveFanSpeed = 'cloud.smarthq.type.fanspeed.low';
|
|
12
11
|
lastActiveCelsius = 22.22;
|
|
13
12
|
isOn = false;
|
|
14
13
|
physicalOnState = false;
|
|
@@ -18,22 +17,6 @@ export class AirConditioner {
|
|
|
18
17
|
// Configuration thresholds
|
|
19
18
|
coolCelsiusMin = 17.77;
|
|
20
19
|
coolCelsiusMax = 30.0;
|
|
21
|
-
//======== Thermostat mode constants ========
|
|
22
|
-
MODE_COOL = "cloud.smarthq.type.thermostatmode.cool";
|
|
23
|
-
MODE_FANONLY = "cloud.smarthq.type.thermostatmode.fanonly";
|
|
24
|
-
MODE_DRY = "cloud.smarthq.type.thermostatmode.dry";
|
|
25
|
-
MODE_ENERGY_SAVER = "cloud.smarthq.type.thermostatmode.cool.energysaver";
|
|
26
|
-
MODE_COOL_QUIET = "cloud.smarthq.type.thermostatmode.cool.quiet";
|
|
27
|
-
MODE_COOL_TURBO = "cloud.smarthq.type.thermostatmode.cool.turbo";
|
|
28
|
-
MODE_HEAT = "cloud.smarthq.type.thermostatmode.heat";
|
|
29
|
-
MODE_OFF = "cloud.smarthq.type.thermostatmode.off";
|
|
30
|
-
MODE_ON = "cloud.smarthq.type.thermostatmode.on";
|
|
31
|
-
//======== Fan speed constants ========
|
|
32
|
-
FAN_SPEED_LOW = "cloud.smarthq.type.fanspeed.low";
|
|
33
|
-
FAN_SPEED_MEDIUM = "cloud.smarthq.type.fanspeed.medium";
|
|
34
|
-
FAN_SPEED_HIGH = "cloud.smarthq.type.fanspeed.high";
|
|
35
|
-
FAN_SPEED_AUTO = "cloud.smarthq.type.fanspeed.auto";
|
|
36
|
-
FAN_SPEED_OFF = "cloud.smarthq.type.fanspeed.off";
|
|
37
20
|
client;
|
|
38
21
|
api;
|
|
39
22
|
Service;
|
|
@@ -79,7 +62,7 @@ export class AirConditioner {
|
|
|
79
62
|
this.lastActiveMode = thermostatService.state.mode;
|
|
80
63
|
}
|
|
81
64
|
if (thermostatService.state.fanSpeed != null) {
|
|
82
|
-
this.
|
|
65
|
+
this.lastActiveFanSpeed = thermostatService.state.fanSpeed;
|
|
83
66
|
}
|
|
84
67
|
}
|
|
85
68
|
// Load Celsius min/max bounds from thermostat config
|
|
@@ -145,31 +128,14 @@ export class AirConditioner {
|
|
|
145
128
|
.onSet(async (value) => {
|
|
146
129
|
this.isOn = value === 1;
|
|
147
130
|
if (this.isOn) {
|
|
148
|
-
const stateVal = this.lastActiveMode ===
|
|
131
|
+
const stateVal = this.lastActiveMode === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3;
|
|
149
132
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
|
|
150
133
|
for (const [mode, service] of this.modeOutlets.entries()) {
|
|
151
134
|
service.updateCharacteristic(this.Characteristic.On, this.lastActiveMode === mode);
|
|
152
135
|
}
|
|
153
136
|
for (const [fanSpeed, service] of this.fanOutlets.entries()) {
|
|
154
|
-
service.updateCharacteristic(this.Characteristic.On, this.
|
|
137
|
+
service.updateCharacteristic(this.Characteristic.On, this.lastActiveFanSpeed === fanSpeed);
|
|
155
138
|
}
|
|
156
|
-
// Turned on, so set mode, fan speed and temperature to last active values. Default to Cool and Low and 22.22C if no last active values.
|
|
157
|
-
const cmdBody = {
|
|
158
|
-
command: {
|
|
159
|
-
mode: this.lastActiveMode || this.MODE_COOL,
|
|
160
|
-
fanSpeed: this.lastActiveFanSpeedMode || this.FAN_SPEED_LOW,
|
|
161
|
-
temperature: this.lastActiveCelsius || 22.22,
|
|
162
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
163
|
-
},
|
|
164
|
-
kind: 'service#command',
|
|
165
|
-
deviceId: this.deviceId,
|
|
166
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
167
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
168
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
169
|
-
};
|
|
170
|
-
this.client.debug(chalk.yellow(`## Turning on AC:`));
|
|
171
|
-
this.client.debug(chalk.yellow(JSON.stringify(cmdBody, null, 2)));
|
|
172
|
-
this.sendCommand(cmdBody);
|
|
173
139
|
}
|
|
174
140
|
else {
|
|
175
141
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, 0);
|
|
@@ -179,29 +145,15 @@ export class AirConditioner {
|
|
|
179
145
|
for (const service of this.fanOutlets.values()) {
|
|
180
146
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
181
147
|
}
|
|
182
|
-
// Turned off, so send command to power down AC unit. Note: GE firmware does not support a "power off" command, so we just send the "on" parameter as false to turn off the unit.
|
|
183
|
-
const cmdBody = {
|
|
184
|
-
command: {
|
|
185
|
-
on: this.isOn,
|
|
186
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
187
|
-
},
|
|
188
|
-
kind: 'service#command',
|
|
189
|
-
deviceId: this.deviceId,
|
|
190
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
191
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
192
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
193
|
-
};
|
|
194
|
-
this.client.debug(chalk.yellow(`## Turning off AC:`));
|
|
195
|
-
this.client.debug(chalk.yellow(JSON.stringify(cmdBody, null, 2)));
|
|
196
|
-
this.sendCommand(cmdBody);
|
|
197
148
|
}
|
|
149
|
+
this.sendCommand();
|
|
198
150
|
});
|
|
199
151
|
this.acThermostat
|
|
200
152
|
.getCharacteristic(this.Characteristic.CurrentHeaterCoolerState)
|
|
201
153
|
.onGet(() => {
|
|
202
154
|
if (!this.isOn)
|
|
203
155
|
return 0;
|
|
204
|
-
return this.lastActiveMode ===
|
|
156
|
+
return this.lastActiveMode === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3;
|
|
205
157
|
});
|
|
206
158
|
this.acThermostat
|
|
207
159
|
.getCharacteristic(this.Characteristic.TargetHeaterCoolerState)
|
|
@@ -220,24 +172,7 @@ export class AirConditioner {
|
|
|
220
172
|
.onGet(() => this.lastActiveCelsius)
|
|
221
173
|
.onSet(async (value) => {
|
|
222
174
|
this.lastActiveCelsius = value;
|
|
223
|
-
|
|
224
|
-
const clippedCelsius = Math.max(this.coolCelsiusMin, Math.min(this.coolCelsiusMax, this.lastActiveCelsius));
|
|
225
|
-
const coolFahrenheit = Math.round(clippedCelsius * 1.8 + 32);
|
|
226
|
-
// Set temperature on the AC unit via API command
|
|
227
|
-
const cmdBody = {
|
|
228
|
-
command: {
|
|
229
|
-
coolFahrenheit: coolFahrenheit,
|
|
230
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
231
|
-
},
|
|
232
|
-
kind: 'service#command',
|
|
233
|
-
deviceId: this.deviceId,
|
|
234
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
235
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
236
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
237
|
-
};
|
|
238
|
-
this.client.debug(chalk.yellow('## Setting AC Temperature:'));
|
|
239
|
-
this.client.debug(chalk.yellow(JSON.stringify(cmdBody, null, 2)));
|
|
240
|
-
this.sendCommand(cmdBody);
|
|
175
|
+
this.sendCommand();
|
|
241
176
|
});
|
|
242
177
|
this.acThermostat
|
|
243
178
|
.getCharacteristic(this.Characteristic.CurrentTemperature)
|
|
@@ -291,61 +226,12 @@ export class AirConditioner {
|
|
|
291
226
|
}
|
|
292
227
|
}
|
|
293
228
|
this.acThermostat.updateCharacteristic(this.Characteristic.Active, 1);
|
|
294
|
-
const stateVal = mode ===
|
|
229
|
+
const stateVal = mode === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3;
|
|
295
230
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
|
|
296
|
-
for (const [
|
|
297
|
-
service.updateCharacteristic(this.Characteristic.On, this.
|
|
298
|
-
}
|
|
299
|
-
// Handle behavior constraint: Fan Only mode does not support Auto Fan Speed - force Fan Speed to Low
|
|
300
|
-
// Dry mode sets fan speed to Auto, which is valid. Only Fan Only mode needs to be adjusted.
|
|
301
|
-
let cmdBody;
|
|
302
|
-
switch (mode) {
|
|
303
|
-
case this.MODE_FANONLY:
|
|
304
|
-
cmdBody = {
|
|
305
|
-
command: {
|
|
306
|
-
mode: this.MODE_FANONLY,
|
|
307
|
-
fanSpeed: this.FAN_SPEED_LOW,
|
|
308
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
309
|
-
},
|
|
310
|
-
kind: 'service#command',
|
|
311
|
-
deviceId: this.deviceId,
|
|
312
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
313
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
314
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
315
|
-
};
|
|
316
|
-
break;
|
|
317
|
-
case this.MODE_DRY:
|
|
318
|
-
cmdBody = {
|
|
319
|
-
command: {
|
|
320
|
-
mode: this.MODE_DRY,
|
|
321
|
-
// fanSpeed: this.FAN_SPEED_AUTO, set to Auto by default for Dry mode, which is valid
|
|
322
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
323
|
-
},
|
|
324
|
-
kind: 'service#command',
|
|
325
|
-
deviceId: this.deviceId,
|
|
326
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
327
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
328
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
329
|
-
};
|
|
330
|
-
break;
|
|
331
|
-
// Default case handles Cool and Heat modes, which support all(?) fan speeds
|
|
332
|
-
default:
|
|
333
|
-
// Set mode on the AC unit via API command with special handling for Fan Only and Dry modes
|
|
334
|
-
cmdBody = {
|
|
335
|
-
command: {
|
|
336
|
-
mode: mode,
|
|
337
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
338
|
-
},
|
|
339
|
-
kind: 'service#command',
|
|
340
|
-
deviceId: this.deviceId,
|
|
341
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
342
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
343
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
344
|
-
};
|
|
231
|
+
for (const [fanSpeed, service] of this.fanOutlets.entries()) {
|
|
232
|
+
service.updateCharacteristic(this.Characteristic.On, this.lastActiveFanSpeed === fanSpeed);
|
|
345
233
|
}
|
|
346
|
-
this.
|
|
347
|
-
this.client.debug(chalk.yellow(JSON.stringify(cmdBody, null, 2)));
|
|
348
|
-
this.sendCommand(cmdBody);
|
|
234
|
+
this.sendCommand();
|
|
349
235
|
}
|
|
350
236
|
else {
|
|
351
237
|
// Toggling active mode OFF powers down system
|
|
@@ -359,18 +245,7 @@ export class AirConditioner {
|
|
|
359
245
|
}
|
|
360
246
|
this.acThermostat.updateCharacteristic(this.Characteristic.Active, 0);
|
|
361
247
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, 0);
|
|
362
|
-
|
|
363
|
-
command: {
|
|
364
|
-
on: this.isOn,
|
|
365
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
366
|
-
},
|
|
367
|
-
kind: 'service#command',
|
|
368
|
-
deviceId: this.deviceId,
|
|
369
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
370
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
371
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
372
|
-
};
|
|
373
|
-
this.sendCommand(cmdBody);
|
|
248
|
+
this.sendCommand();
|
|
374
249
|
}
|
|
375
250
|
}
|
|
376
251
|
});
|
|
@@ -385,16 +260,16 @@ export class AirConditioner {
|
|
|
385
260
|
.setCharacteristic(this.Characteristic.SerialNumber, this.parentAccessory.context.device.serial || 'Unknown');
|
|
386
261
|
// Clean up stale Fan Speed outlets from cache
|
|
387
262
|
const activeFanServiceUUIDs = new Set();
|
|
388
|
-
for (const
|
|
389
|
-
const [displayName] = this.getLastElementAndCapitalize(
|
|
263
|
+
for (const speed of supportedFanSpeeds) {
|
|
264
|
+
const [displayName] = this.getLastElementAndCapitalize(speed, '.');
|
|
390
265
|
const service = this.fanAccessory.getService(displayName) ||
|
|
391
|
-
this.fanAccessory.addService(this.Service.Outlet, displayName,
|
|
266
|
+
this.fanAccessory.addService(this.Service.Outlet, displayName, speed);
|
|
392
267
|
if (!service.getCharacteristic(this.Characteristic.ConfiguredName)) {
|
|
393
268
|
service.addOptionalCharacteristic(this.Characteristic.ConfiguredName);
|
|
394
269
|
}
|
|
395
270
|
service.setCharacteristic(this.Characteristic.Name, displayName);
|
|
396
271
|
service.setCharacteristic(this.Characteristic.ConfiguredName, displayName);
|
|
397
|
-
activeFanServiceUUIDs.add(service.UUID + (
|
|
272
|
+
activeFanServiceUUIDs.add(service.UUID + (speed || ''));
|
|
398
273
|
}
|
|
399
274
|
for (const service of [...this.fanAccessory.services]) {
|
|
400
275
|
if (service.UUID === this.Service.AccessoryInformation.UUID)
|
|
@@ -408,25 +283,21 @@ export class AirConditioner {
|
|
|
408
283
|
}
|
|
409
284
|
}
|
|
410
285
|
// Bind Fan Speed Outlets characteristics
|
|
411
|
-
for (const
|
|
412
|
-
const [displayName] = this.getLastElementAndCapitalize(
|
|
286
|
+
for (const speed of supportedFanSpeeds) {
|
|
287
|
+
const [displayName] = this.getLastElementAndCapitalize(speed, '.');
|
|
413
288
|
const service = this.fanAccessory.getService(displayName);
|
|
414
|
-
this.fanOutlets.set(
|
|
289
|
+
this.fanOutlets.set(speed, service);
|
|
415
290
|
service
|
|
416
291
|
.getCharacteristic(this.Characteristic.On)
|
|
417
|
-
.onGet(() => this.isOn && this.
|
|
292
|
+
.onGet(() => this.isOn && this.lastActiveFanSpeed === speed)
|
|
418
293
|
.onSet(async (value) => {
|
|
419
294
|
if (value) {
|
|
420
|
-
// If mode is Dry, then fan speed is automatically set to Auto and cannot be changed.
|
|
421
|
-
if (this.lastActiveMode === this.MODE_DRY) {
|
|
422
|
-
return;
|
|
423
|
-
}
|
|
424
295
|
// Handle behavior constraint: Fan Only mode does not support Auto Fan Speed
|
|
425
|
-
if (this.lastActiveMode ===
|
|
426
|
-
|
|
296
|
+
if (this.lastActiveMode === 'cloud.smarthq.type.thermostatmode.fanonly' &&
|
|
297
|
+
speed === 'cloud.smarthq.type.fanspeed.auto') {
|
|
427
298
|
setTimeout(() => {
|
|
428
299
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
429
|
-
const activeService = this.fanOutlets.get(this.
|
|
300
|
+
const activeService = this.fanOutlets.get(this.lastActiveFanSpeed);
|
|
430
301
|
if (activeService) {
|
|
431
302
|
activeService.updateCharacteristic(this.Characteristic.On, this.isOn);
|
|
432
303
|
}
|
|
@@ -434,36 +305,23 @@ export class AirConditioner {
|
|
|
434
305
|
return;
|
|
435
306
|
}
|
|
436
307
|
this.isOn = true;
|
|
437
|
-
this.
|
|
308
|
+
this.lastActiveFanSpeed = speed;
|
|
438
309
|
for (const [fanSpeed, service] of this.fanOutlets.entries()) {
|
|
439
|
-
if (fanSpeed !==
|
|
310
|
+
if (fanSpeed !== speed) {
|
|
440
311
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
441
312
|
}
|
|
442
313
|
}
|
|
443
314
|
this.acThermostat.updateCharacteristic(this.Characteristic.Active, 1);
|
|
444
|
-
const stateVal = this.lastActiveMode ===
|
|
315
|
+
const stateVal = this.lastActiveMode === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3;
|
|
445
316
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
|
|
446
317
|
for (const [modeKey, service] of this.modeOutlets.entries()) {
|
|
447
318
|
service.updateCharacteristic(this.Characteristic.On, this.lastActiveMode === modeKey);
|
|
448
319
|
}
|
|
449
|
-
|
|
450
|
-
command: {
|
|
451
|
-
fanspeed: this.lastActiveFanSpeedMode,
|
|
452
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
453
|
-
},
|
|
454
|
-
kind: 'service#command',
|
|
455
|
-
deviceId: this.deviceId,
|
|
456
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
457
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
458
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
459
|
-
};
|
|
460
|
-
this.sendCommand(cmdBody);
|
|
320
|
+
this.sendCommand();
|
|
461
321
|
}
|
|
462
322
|
else {
|
|
463
323
|
// Toggling active fan speed OFF powers down system
|
|
464
|
-
|
|
465
|
-
// note: don't think the else block is ever reached
|
|
466
|
-
if (this.lastActiveFanSpeedMode === fanspeedMode) {
|
|
324
|
+
if (this.lastActiveFanSpeed === speed) {
|
|
467
325
|
this.isOn = false;
|
|
468
326
|
for (const service of this.modeOutlets.values()) {
|
|
469
327
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
@@ -473,94 +331,75 @@ export class AirConditioner {
|
|
|
473
331
|
}
|
|
474
332
|
this.acThermostat.updateCharacteristic(this.Characteristic.Active, 0);
|
|
475
333
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, 0);
|
|
476
|
-
|
|
477
|
-
command: {
|
|
478
|
-
on: this.isOn,
|
|
479
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
480
|
-
},
|
|
481
|
-
kind: 'service#command',
|
|
482
|
-
deviceId: this.deviceId,
|
|
483
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
484
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
485
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
486
|
-
};
|
|
487
|
-
this.sendCommand(cmdBody);
|
|
334
|
+
this.sendCommand();
|
|
488
335
|
}
|
|
489
336
|
}
|
|
490
337
|
});
|
|
491
338
|
}
|
|
492
339
|
}
|
|
493
|
-
// D. Add Debug State switch to parent accessory
|
|
494
|
-
this.addDebugState('cloud.smarthq.service.thermostat.v1');
|
|
495
340
|
}
|
|
496
341
|
// ---------------------------
|
|
497
342
|
// API COMMAND SENDER
|
|
498
343
|
// ---------------------------
|
|
499
|
-
sendCommand(
|
|
344
|
+
sendCommand() {
|
|
500
345
|
if (this.debounceTimeout) {
|
|
501
346
|
clearTimeout(this.debounceTimeout);
|
|
502
347
|
}
|
|
503
348
|
this.debounceTimeout = setTimeout(() => {
|
|
504
349
|
this.debounceTimeout = null;
|
|
505
|
-
this.executeSendCommand(
|
|
350
|
+
this.executeSendCommand();
|
|
506
351
|
}, 150);
|
|
507
352
|
}
|
|
508
|
-
async executeSendCommand(
|
|
353
|
+
async executeSendCommand() {
|
|
509
354
|
const service = this.findService('cloud.smarthq.service.thermostat.v1', 'cloud.smarthq.domain.thermostat');
|
|
510
355
|
if (!service)
|
|
511
356
|
return;
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
// Only send the 'on' parameter if it is transitioning (prevents GE firmware from resetting to ECO)
|
|
520
|
-
if (!this.isOn) {
|
|
521
|
-
command.on = false;
|
|
522
|
-
} else if (!this.physicalOnState) {
|
|
523
|
-
command.on = true;
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
if (this.isOn) {
|
|
527
|
-
command.mode = this.lastActiveMode;
|
|
528
|
-
|
|
529
|
-
// Handle behavior constraint: Fan Only mode does not support Auto Fan Speed
|
|
530
|
-
if (
|
|
531
|
-
this.lastActiveMode === this.MODE_FANONLY &&
|
|
532
|
-
this.lastActiveFanSpeedMode === this.FAN_SPEED_AUTO
|
|
533
|
-
) {
|
|
534
|
-
command.fanSpeed = this.FAN_SPEED_LOW;
|
|
535
|
-
} else {
|
|
536
|
-
command.fanSpeed = this.lastActiveFanSpeedMode;
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
// Omit coolFahrenheit in Fan Only mode (thermostat has no cooling setpoint)
|
|
540
|
-
if (this.lastActiveMode !== this.MODE_FANONLY) {
|
|
541
|
-
// Clip celsius to hardware bounds to prevent API errors
|
|
542
|
-
const clippedCelsius = Math.max(
|
|
543
|
-
this.coolCelsiusMin,
|
|
544
|
-
Math.min(this.coolCelsiusMax, this.lastActiveCelsius),
|
|
545
|
-
);
|
|
546
|
-
command.coolFahrenheit = Math.round(clippedCelsius * 1.8 + 32);
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
*/
|
|
550
|
-
try {
|
|
551
|
-
const response = await this.client.sendCommand(command);
|
|
552
|
-
if (response == null) {
|
|
553
|
-
this.client.debug("No response from send command");
|
|
357
|
+
this.commandQueue = this.commandQueue.then(async () => {
|
|
358
|
+
const command = {
|
|
359
|
+
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
360
|
+
};
|
|
361
|
+
// Only send the 'on' parameter if it is transitioning (prevents GE firmware from resetting to ECO)
|
|
362
|
+
if (!this.isOn) {
|
|
363
|
+
command.on = false;
|
|
554
364
|
}
|
|
555
|
-
else {
|
|
556
|
-
|
|
557
|
-
return response.success;
|
|
365
|
+
else if (!this.physicalOnState) {
|
|
366
|
+
command.on = true;
|
|
558
367
|
}
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
368
|
+
if (this.isOn) {
|
|
369
|
+
command.mode = this.lastActiveMode;
|
|
370
|
+
// Handle behavior constraint: Fan Only mode does not support Auto Fan Speed
|
|
371
|
+
if (this.lastActiveMode === 'cloud.smarthq.type.thermostatmode.fanonly' &&
|
|
372
|
+
this.lastActiveFanSpeed === 'cloud.smarthq.type.fanspeed.auto') {
|
|
373
|
+
command.fanSpeed = 'cloud.smarthq.type.fanspeed.low';
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
command.fanSpeed = this.lastActiveFanSpeed;
|
|
377
|
+
}
|
|
378
|
+
// Omit coolFahrenheit in Fan Only mode (thermostat has no cooling setpoint)
|
|
379
|
+
if (this.lastActiveMode !== 'cloud.smarthq.type.thermostatmode.fanonly') {
|
|
380
|
+
// Clip celsius to hardware bounds to prevent API errors
|
|
381
|
+
const clippedCelsius = Math.max(this.coolCelsiusMin, Math.min(this.coolCelsiusMax, this.lastActiveCelsius));
|
|
382
|
+
command.coolFahrenheit = Math.round(clippedCelsius * 1.8 + 32);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
this.client.debug('## 1.2.5-test.0 -> command = ' + JSON.stringify(command, null, 2));
|
|
386
|
+
try {
|
|
387
|
+
await this.client.sendCommand({
|
|
388
|
+
command,
|
|
389
|
+
kind: 'service#command',
|
|
390
|
+
deviceId: this.deviceId,
|
|
391
|
+
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
392
|
+
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
393
|
+
domainType: 'cloud.smarthq.domain.thermostat',
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
catch (error) {
|
|
397
|
+
this.platform.log.error(`Error sending command to AC:`, error);
|
|
398
|
+
}
|
|
399
|
+
}).catch((err) => {
|
|
400
|
+
this.platform.log.error(`Error in AC command queue:`, err);
|
|
401
|
+
});
|
|
402
|
+
return this.commandQueue;
|
|
564
403
|
}
|
|
565
404
|
// ---------------------------
|
|
566
405
|
// WEBSOCKET UPDATES HANDLING
|
|
@@ -583,19 +422,19 @@ export class AirConditioner {
|
|
|
583
422
|
this.lastActiveMode = state.mode;
|
|
584
423
|
}
|
|
585
424
|
if (state.fanSpeed !== undefined) {
|
|
586
|
-
this.
|
|
425
|
+
this.lastActiveFanSpeed = state.fanSpeed;
|
|
587
426
|
}
|
|
588
427
|
// Update HeaterCooler state dynamically based on power and mode
|
|
589
428
|
const stateVal = !this.isOn
|
|
590
429
|
? 0
|
|
591
|
-
: (this.lastActiveMode ===
|
|
430
|
+
: (this.lastActiveMode === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3);
|
|
592
431
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
|
|
593
432
|
// Update dynamic outlets
|
|
594
433
|
for (const [mode, service] of this.modeOutlets.entries()) {
|
|
595
434
|
service.updateCharacteristic(this.Characteristic.On, this.isOn && this.lastActiveMode === mode);
|
|
596
435
|
}
|
|
597
436
|
for (const [fanSpeed, service] of this.fanOutlets.entries()) {
|
|
598
|
-
service.updateCharacteristic(this.Characteristic.On, this.isOn && this.
|
|
437
|
+
service.updateCharacteristic(this.Characteristic.On, this.isOn && this.lastActiveFanSpeed === fanSpeed);
|
|
599
438
|
}
|
|
600
439
|
}
|
|
601
440
|
else if (message.domainType === 'cloud.smarthq.domain.indoor.ambient') {
|
|
@@ -631,55 +470,5 @@ export class AirConditioner {
|
|
|
631
470
|
this.platform.log.error(`Failed to connect to SmartHQ WebSocket for AC ${this.deviceId}:`, error);
|
|
632
471
|
}
|
|
633
472
|
}
|
|
634
|
-
// ---------------------------
|
|
635
|
-
// HELPERS FOR DEBUGGING
|
|
636
|
-
// Adds a 'Debug State' switch to the parent accessory that logs the current state of the specified service type when toggled on
|
|
637
|
-
// ---------------------------
|
|
638
|
-
addDebugState(serviceType) {
|
|
639
|
-
const debugState = this.setupService('Switch', 'Debug State', `${this.deviceId}-debug-state`);
|
|
640
|
-
debugState
|
|
641
|
-
.getCharacteristic(this.Characteristic.On)
|
|
642
|
-
.onGet(() => {
|
|
643
|
-
return debugState.getCharacteristic(this.Characteristic.On).value;
|
|
644
|
-
})
|
|
645
|
-
.onSet(async (value) => {
|
|
646
|
-
if (value) {
|
|
647
|
-
const response = await this.client.getDevice(this.deviceId);
|
|
648
|
-
const deviceServices = response.services ?? [];
|
|
649
|
-
for (const service of deviceServices) {
|
|
650
|
-
if (service.serviceType === serviceType) {
|
|
651
|
-
this.client.debug('Debug State - Device Info: ' + JSON.stringify(service, null, 2));
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
setTimeout(() => {
|
|
655
|
-
debugState.updateCharacteristic(this.Characteristic.On, false);
|
|
656
|
-
}, 1000);
|
|
657
|
-
}
|
|
658
|
-
});
|
|
659
|
-
}
|
|
660
|
-
setupService(serviceType, displayName, serviceIdSuffix) {
|
|
661
|
-
let service;
|
|
662
|
-
switch (serviceType) {
|
|
663
|
-
case 'Outlet':
|
|
664
|
-
service =
|
|
665
|
-
this.accessory.getService(displayName) ||
|
|
666
|
-
this.accessory.addService(this.Service.Outlet, displayName, serviceIdSuffix);
|
|
667
|
-
break;
|
|
668
|
-
case 'Switch':
|
|
669
|
-
service =
|
|
670
|
-
this.accessory.getService(displayName) ||
|
|
671
|
-
this.accessory.addService(this.Service.Switch, displayName, serviceIdSuffix);
|
|
672
|
-
break;
|
|
673
|
-
default:
|
|
674
|
-
this.client.debug('Unknown service type: ' + serviceType + '');
|
|
675
|
-
service =
|
|
676
|
-
this.accessory.getService(displayName) ||
|
|
677
|
-
this.accessory.addService(this.Service.Fan, displayName, serviceIdSuffix);
|
|
678
|
-
}
|
|
679
|
-
service.setCharacteristic(this.Characteristic.Name, displayName);
|
|
680
|
-
service.addOptionalCharacteristic(this.Characteristic.ConfiguredName);
|
|
681
|
-
service.setCharacteristic(this.Characteristic.ConfiguredName, displayName);
|
|
682
|
-
return service;
|
|
683
|
-
}
|
|
684
473
|
}
|
|
685
474
|
//# sourceMappingURL=airConditioner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"airConditioner.js","sourceRoot":"","sources":["../../src/airConditioner/airConditioner.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"airConditioner.js","sourceRoot":"","sources":["../../src/airConditioner/airConditioner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "homebridge-smarthq-client",
|
|
3
|
-
"version": "1.2.5-
|
|
3
|
+
"version": "1.2.5-test.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Plugin for controlling GE refrigerator, dishwasher, air conditioner via SmartHQ API.",
|
|
6
6
|
"keywords": [
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"@types/node": "^25.5.0",
|
|
59
59
|
"@types/node-persist": "^3.1.8",
|
|
60
60
|
"@types/ws": "^8.18.1",
|
|
61
|
-
"eslint": "^10.0
|
|
61
|
+
"eslint": "^10.7.0",
|
|
62
62
|
"globals": "^17.4.0",
|
|
63
63
|
"homebridge": "^2.1.0",
|
|
64
64
|
"nodemon": "^3.1.14",
|
|
@@ -72,4 +72,4 @@
|
|
|
72
72
|
"homebridge": "^1.8.0 || ^2.0.0-beta.0"
|
|
73
73
|
},
|
|
74
74
|
"displayName": "Homebridge GE SmartHQ api"
|
|
75
|
-
}
|
|
75
|
+
}
|
|
@@ -5,15 +5,14 @@ import {
|
|
|
5
5
|
Characteristic,
|
|
6
6
|
} from 'homebridge';
|
|
7
7
|
|
|
8
|
-
import { SmartHQClient, DeviceService
|
|
8
|
+
import { SmartHQClient, DeviceService } from 'ge-smarthq-api';
|
|
9
9
|
import { SmartHqPlatform } from '../platform.js';
|
|
10
10
|
import { ServiceMessage } from '../index.js';
|
|
11
|
-
import chalk from 'chalk';
|
|
12
11
|
|
|
13
12
|
export class AirConditioner {
|
|
14
13
|
// State cache
|
|
15
14
|
private lastActiveMode = 'cloud.smarthq.type.thermostatmode.cool';
|
|
16
|
-
private
|
|
15
|
+
private lastActiveFanSpeed = 'cloud.smarthq.type.fanspeed.low';
|
|
17
16
|
private lastActiveCelsius = 22.22;
|
|
18
17
|
private isOn = false;
|
|
19
18
|
private physicalOnState = false;
|
|
@@ -26,24 +25,6 @@ export class AirConditioner {
|
|
|
26
25
|
private coolCelsiusMin = 17.77;
|
|
27
26
|
private coolCelsiusMax = 30.0;
|
|
28
27
|
|
|
29
|
-
//======== Thermostat mode constants ========
|
|
30
|
-
private readonly MODE_COOL = "cloud.smarthq.type.thermostatmode.cool";
|
|
31
|
-
private readonly MODE_FANONLY = "cloud.smarthq.type.thermostatmode.fanonly";
|
|
32
|
-
private readonly MODE_DRY = "cloud.smarthq.type.thermostatmode.dry";
|
|
33
|
-
private readonly MODE_ENERGY_SAVER = "cloud.smarthq.type.thermostatmode.cool.energysaver";
|
|
34
|
-
private readonly MODE_COOL_QUIET = "cloud.smarthq.type.thermostatmode.cool.quiet";
|
|
35
|
-
private readonly MODE_COOL_TURBO = "cloud.smarthq.type.thermostatmode.cool.turbo";
|
|
36
|
-
private readonly MODE_HEAT = "cloud.smarthq.type.thermostatmode.heat";
|
|
37
|
-
private readonly MODE_OFF = "cloud.smarthq.type.thermostatmode.off";
|
|
38
|
-
private readonly MODE_ON = "cloud.smarthq.type.thermostatmode.on";
|
|
39
|
-
|
|
40
|
-
//======== Fan speed constants ========
|
|
41
|
-
private readonly FAN_SPEED_LOW = "cloud.smarthq.type.fanspeed.low";
|
|
42
|
-
private readonly FAN_SPEED_MEDIUM = "cloud.smarthq.type.fanspeed.medium";
|
|
43
|
-
private readonly FAN_SPEED_HIGH = "cloud.smarthq.type.fanspeed.high"
|
|
44
|
-
private readonly FAN_SPEED_AUTO = "cloud.smarthq.type.fanspeed.auto";
|
|
45
|
-
private readonly FAN_SPEED_OFF = "cloud.smarthq.type.fanspeed.off";
|
|
46
|
-
|
|
47
28
|
private client: SmartHQClient;
|
|
48
29
|
private api: API;
|
|
49
30
|
|
|
@@ -100,7 +81,7 @@ export class AirConditioner {
|
|
|
100
81
|
this.lastActiveMode = thermostatService.state.mode as string;
|
|
101
82
|
}
|
|
102
83
|
if (thermostatService.state.fanSpeed != null) {
|
|
103
|
-
this.
|
|
84
|
+
this.lastActiveFanSpeed = thermostatService.state.fanSpeed as string;
|
|
104
85
|
}
|
|
105
86
|
}
|
|
106
87
|
|
|
@@ -145,7 +126,6 @@ export class AirConditioner {
|
|
|
145
126
|
// ---------------------------
|
|
146
127
|
// ACCESSORIES SETUP
|
|
147
128
|
// ---------------------------
|
|
148
|
-
|
|
149
129
|
private setupAccessories(supportedModes: string[], supportedFanSpeeds: string[]) {
|
|
150
130
|
// Clean up old cached services on the parent accessory
|
|
151
131
|
const oldServiceUUIDs = [
|
|
@@ -187,37 +167,14 @@ export class AirConditioner {
|
|
|
187
167
|
this.isOn = (value as number) === 1;
|
|
188
168
|
|
|
189
169
|
if (this.isOn) {
|
|
190
|
-
const stateVal = this.lastActiveMode ===
|
|
170
|
+
const stateVal = this.lastActiveMode === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3;
|
|
191
171
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
|
|
192
172
|
for (const [mode, service] of this.modeOutlets.entries()) {
|
|
193
173
|
service.updateCharacteristic(this.Characteristic.On, this.lastActiveMode === mode);
|
|
194
174
|
}
|
|
195
175
|
for (const [fanSpeed, service] of this.fanOutlets.entries()) {
|
|
196
|
-
service.updateCharacteristic(this.Characteristic.On, this.
|
|
176
|
+
service.updateCharacteristic(this.Characteristic.On, this.lastActiveFanSpeed === fanSpeed);
|
|
197
177
|
}
|
|
198
|
-
|
|
199
|
-
// Turned on, so set mode, fan speed and temperature to last active values. Default to Cool and Low and 22.22C if no last active values.
|
|
200
|
-
|
|
201
|
-
const cmdBody = {
|
|
202
|
-
command: {
|
|
203
|
-
mode: this.lastActiveMode || this.MODE_COOL,
|
|
204
|
-
fanSpeed: this.lastActiveFanSpeedMode || this.FAN_SPEED_LOW,
|
|
205
|
-
temperature: this.lastActiveCelsius || 22.22,
|
|
206
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
207
|
-
},
|
|
208
|
-
kind: 'service#command',
|
|
209
|
-
deviceId: this.deviceId,
|
|
210
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
211
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
212
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
213
|
-
};
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
this.client.debug(chalk.yellow(`## Turning on AC:`));
|
|
217
|
-
this.client.debug(chalk.yellow(JSON.stringify(cmdBody, null, 2)));
|
|
218
|
-
|
|
219
|
-
this.sendCommand(cmdBody);
|
|
220
|
-
|
|
221
178
|
} else {
|
|
222
179
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, 0);
|
|
223
180
|
for (const service of this.modeOutlets.values()) {
|
|
@@ -226,35 +183,16 @@ export class AirConditioner {
|
|
|
226
183
|
for (const service of this.fanOutlets.values()) {
|
|
227
184
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
228
185
|
}
|
|
229
|
-
|
|
230
|
-
// Turned off, so send command to power down AC unit. Note: GE firmware does not support a "power off" command, so we just send the "on" parameter as false to turn off the unit.
|
|
231
|
-
|
|
232
|
-
const cmdBody = {
|
|
233
|
-
command: {
|
|
234
|
-
on: this.isOn,
|
|
235
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
236
|
-
},
|
|
237
|
-
kind: 'service#command',
|
|
238
|
-
deviceId: this.deviceId,
|
|
239
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
240
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
241
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
this.client.debug(chalk.yellow(`## Turning off AC:`));
|
|
245
|
-
this.client.debug(chalk.yellow(JSON.stringify(cmdBody, null, 2)));
|
|
246
|
-
|
|
247
|
-
this.sendCommand(cmdBody);
|
|
248
186
|
}
|
|
249
187
|
|
|
250
|
-
|
|
188
|
+
this.sendCommand();
|
|
251
189
|
});
|
|
252
190
|
|
|
253
191
|
this.acThermostat
|
|
254
192
|
.getCharacteristic(this.Characteristic.CurrentHeaterCoolerState)
|
|
255
|
-
.onGet(() => {
|
|
193
|
+
.onGet(() => {
|
|
256
194
|
if (!this.isOn) return 0;
|
|
257
|
-
return this.lastActiveMode ===
|
|
195
|
+
return this.lastActiveMode === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3;
|
|
258
196
|
});
|
|
259
197
|
|
|
260
198
|
this.acThermostat
|
|
@@ -275,33 +213,7 @@ export class AirConditioner {
|
|
|
275
213
|
.onGet(() => this.lastActiveCelsius)
|
|
276
214
|
.onSet(async (value) => {
|
|
277
215
|
this.lastActiveCelsius = value as number;
|
|
278
|
-
|
|
279
|
-
// Clip celsius to hardware bounds to prevent API errors
|
|
280
|
-
const clippedCelsius = Math.max(
|
|
281
|
-
this.coolCelsiusMin,
|
|
282
|
-
Math.min(this.coolCelsiusMax, this.lastActiveCelsius),
|
|
283
|
-
);
|
|
284
|
-
const coolFahrenheit = Math.round(clippedCelsius * 1.8 + 32);
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
// Set temperature on the AC unit via API command
|
|
288
|
-
|
|
289
|
-
const cmdBody = {
|
|
290
|
-
command: {
|
|
291
|
-
coolFahrenheit: coolFahrenheit,
|
|
292
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
293
|
-
},
|
|
294
|
-
kind: 'service#command',
|
|
295
|
-
deviceId: this.deviceId,
|
|
296
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
297
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
298
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
299
|
-
};
|
|
300
|
-
|
|
301
|
-
this.client.debug(chalk.yellow('## Setting AC Temperature:'));
|
|
302
|
-
this.client.debug(chalk.yellow(JSON.stringify(cmdBody, null, 2)));
|
|
303
|
-
|
|
304
|
-
this.sendCommand(cmdBody);
|
|
216
|
+
this.sendCommand();
|
|
305
217
|
});
|
|
306
218
|
|
|
307
219
|
this.acThermostat
|
|
@@ -372,69 +284,14 @@ export class AirConditioner {
|
|
|
372
284
|
}
|
|
373
285
|
|
|
374
286
|
this.acThermostat.updateCharacteristic(this.Characteristic.Active, 1);
|
|
375
|
-
const stateVal = mode ===
|
|
287
|
+
const stateVal = mode === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3;
|
|
376
288
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
|
|
377
289
|
|
|
378
|
-
for (const [
|
|
379
|
-
service.updateCharacteristic(this.Characteristic.On, this.
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
// Handle behavior constraint: Fan Only mode does not support Auto Fan Speed - force Fan Speed to Low
|
|
383
|
-
// Dry mode sets fan speed to Auto, which is valid. Only Fan Only mode needs to be adjusted.
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
let cmdBody: SendCommandRequest;
|
|
387
|
-
switch (mode) {
|
|
388
|
-
case this.MODE_FANONLY:
|
|
389
|
-
cmdBody = {
|
|
390
|
-
command: {
|
|
391
|
-
mode: this.MODE_FANONLY,
|
|
392
|
-
fanSpeed: this.FAN_SPEED_LOW,
|
|
393
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
394
|
-
},
|
|
395
|
-
kind: 'service#command',
|
|
396
|
-
deviceId: this.deviceId,
|
|
397
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
398
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
399
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
400
|
-
};
|
|
401
|
-
break;
|
|
402
|
-
case this.MODE_DRY:
|
|
403
|
-
cmdBody = {
|
|
404
|
-
command: {
|
|
405
|
-
mode: this.MODE_DRY,
|
|
406
|
-
// fanSpeed: this.FAN_SPEED_AUTO, set to Auto by default for Dry mode, which is valid
|
|
407
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
408
|
-
},
|
|
409
|
-
kind: 'service#command',
|
|
410
|
-
deviceId: this.deviceId,
|
|
411
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
412
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
413
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
414
|
-
};
|
|
415
|
-
break;
|
|
416
|
-
// Default case handles Cool and Heat modes, which support all(?) fan speeds
|
|
417
|
-
default:
|
|
418
|
-
// Set mode on the AC unit via API command with special handling for Fan Only and Dry modes
|
|
419
|
-
|
|
420
|
-
cmdBody = {
|
|
421
|
-
command: {
|
|
422
|
-
mode: mode,
|
|
423
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
424
|
-
},
|
|
425
|
-
kind: 'service#command',
|
|
426
|
-
deviceId: this.deviceId,
|
|
427
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
428
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
429
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
430
|
-
};
|
|
290
|
+
for (const [fanSpeed, service] of this.fanOutlets.entries()) {
|
|
291
|
+
service.updateCharacteristic(this.Characteristic.On, this.lastActiveFanSpeed === fanSpeed);
|
|
431
292
|
}
|
|
432
293
|
|
|
433
|
-
this.
|
|
434
|
-
this.client.debug(chalk.yellow(JSON.stringify(cmdBody, null, 2)));
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
this.sendCommand(cmdBody);
|
|
294
|
+
this.sendCommand();
|
|
438
295
|
} else {
|
|
439
296
|
// Toggling active mode OFF powers down system
|
|
440
297
|
if (this.lastActiveMode === mode) {
|
|
@@ -443,26 +300,14 @@ export class AirConditioner {
|
|
|
443
300
|
for (const service of this.modeOutlets.values()) {
|
|
444
301
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
445
302
|
}
|
|
446
|
-
for (const service of this.fanOutlets.values()) {
|
|
303
|
+
for (const service of this.fanOutlets.values()) {
|
|
447
304
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
448
305
|
}
|
|
449
306
|
|
|
450
307
|
this.acThermostat.updateCharacteristic(this.Characteristic.Active, 0);
|
|
451
308
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, 0);
|
|
452
309
|
|
|
453
|
-
|
|
454
|
-
command: {
|
|
455
|
-
on: this.isOn,
|
|
456
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
457
|
-
},
|
|
458
|
-
kind: 'service#command',
|
|
459
|
-
deviceId: this.deviceId,
|
|
460
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
461
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
462
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
463
|
-
};
|
|
464
|
-
|
|
465
|
-
this.sendCommand(cmdBody);
|
|
310
|
+
this.sendCommand();
|
|
466
311
|
}
|
|
467
312
|
}
|
|
468
313
|
});
|
|
@@ -485,11 +330,11 @@ export class AirConditioner {
|
|
|
485
330
|
|
|
486
331
|
// Clean up stale Fan Speed outlets from cache
|
|
487
332
|
const activeFanServiceUUIDs = new Set<string>();
|
|
488
|
-
for (const
|
|
489
|
-
const [displayName] = this.getLastElementAndCapitalize(
|
|
333
|
+
for (const speed of supportedFanSpeeds) {
|
|
334
|
+
const [displayName] = this.getLastElementAndCapitalize(speed, '.');
|
|
490
335
|
const service =
|
|
491
336
|
this.fanAccessory.getService(displayName) ||
|
|
492
|
-
this.fanAccessory.addService(this.Service.Outlet, displayName,
|
|
337
|
+
this.fanAccessory.addService(this.Service.Outlet, displayName, speed);
|
|
493
338
|
|
|
494
339
|
if (!service.getCharacteristic(this.Characteristic.ConfiguredName)) {
|
|
495
340
|
service.addOptionalCharacteristic(this.Characteristic.ConfiguredName);
|
|
@@ -497,7 +342,7 @@ export class AirConditioner {
|
|
|
497
342
|
service.setCharacteristic(this.Characteristic.Name, displayName);
|
|
498
343
|
service.setCharacteristic(this.Characteristic.ConfiguredName, displayName);
|
|
499
344
|
|
|
500
|
-
activeFanServiceUUIDs.add(service.UUID + (
|
|
345
|
+
activeFanServiceUUIDs.add(service.UUID + (speed || ''));
|
|
501
346
|
}
|
|
502
347
|
|
|
503
348
|
for (const service of [...this.fanAccessory.services]) {
|
|
@@ -512,30 +357,25 @@ export class AirConditioner {
|
|
|
512
357
|
}
|
|
513
358
|
|
|
514
359
|
// Bind Fan Speed Outlets characteristics
|
|
515
|
-
for (const
|
|
516
|
-
const [displayName] = this.getLastElementAndCapitalize(
|
|
360
|
+
for (const speed of supportedFanSpeeds) {
|
|
361
|
+
const [displayName] = this.getLastElementAndCapitalize(speed, '.');
|
|
517
362
|
const service = this.fanAccessory.getService(displayName)!;
|
|
518
363
|
|
|
519
|
-
this.fanOutlets.set(
|
|
364
|
+
this.fanOutlets.set(speed, service);
|
|
520
365
|
|
|
521
366
|
service
|
|
522
367
|
.getCharacteristic(this.Characteristic.On)
|
|
523
|
-
.onGet(() => this.isOn && this.
|
|
368
|
+
.onGet(() => this.isOn && this.lastActiveFanSpeed === speed)
|
|
524
369
|
.onSet(async (value) => {
|
|
525
370
|
if (value) {
|
|
526
|
-
// If mode is Dry, then fan speed is automatically set to Auto and cannot be changed.
|
|
527
|
-
if (this.lastActiveMode === this.MODE_DRY) {
|
|
528
|
-
return;
|
|
529
|
-
}
|
|
530
|
-
|
|
531
371
|
// Handle behavior constraint: Fan Only mode does not support Auto Fan Speed
|
|
532
372
|
if (
|
|
533
|
-
this.lastActiveMode ===
|
|
534
|
-
|
|
373
|
+
this.lastActiveMode === 'cloud.smarthq.type.thermostatmode.fanonly' &&
|
|
374
|
+
speed === 'cloud.smarthq.type.fanspeed.auto'
|
|
535
375
|
) {
|
|
536
376
|
setTimeout(() => {
|
|
537
377
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
538
|
-
const activeService = this.fanOutlets.get(this.
|
|
378
|
+
const activeService = this.fanOutlets.get(this.lastActiveFanSpeed);
|
|
539
379
|
if (activeService) {
|
|
540
380
|
activeService.updateCharacteristic(this.Characteristic.On, this.isOn);
|
|
541
381
|
}
|
|
@@ -544,40 +384,26 @@ export class AirConditioner {
|
|
|
544
384
|
}
|
|
545
385
|
|
|
546
386
|
this.isOn = true;
|
|
547
|
-
this.
|
|
387
|
+
this.lastActiveFanSpeed = speed;
|
|
548
388
|
|
|
549
389
|
for (const [fanSpeed, service] of this.fanOutlets.entries()) {
|
|
550
|
-
if (fanSpeed !==
|
|
390
|
+
if (fanSpeed !== speed) {
|
|
551
391
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
552
392
|
}
|
|
553
393
|
}
|
|
554
394
|
|
|
555
395
|
this.acThermostat.updateCharacteristic(this.Characteristic.Active, 1);
|
|
556
|
-
const stateVal = this.lastActiveMode ===
|
|
396
|
+
const stateVal = this.lastActiveMode === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3;
|
|
557
397
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
|
|
558
398
|
|
|
559
399
|
for (const [modeKey, service] of this.modeOutlets.entries()) {
|
|
560
400
|
service.updateCharacteristic(this.Characteristic.On, this.lastActiveMode === modeKey);
|
|
561
401
|
}
|
|
562
402
|
|
|
563
|
-
|
|
564
|
-
command: {
|
|
565
|
-
fanspeed: this.lastActiveFanSpeedMode,
|
|
566
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
567
|
-
},
|
|
568
|
-
kind: 'service#command',
|
|
569
|
-
deviceId: this.deviceId,
|
|
570
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
571
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
572
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
573
|
-
};
|
|
574
|
-
|
|
575
|
-
this.sendCommand(cmdBody);
|
|
403
|
+
this.sendCommand();
|
|
576
404
|
} else {
|
|
577
405
|
// Toggling active fan speed OFF powers down system
|
|
578
|
-
|
|
579
|
-
// note: don't think the else block is ever reached
|
|
580
|
-
if (this.lastActiveFanSpeedMode === fanspeedMode) {
|
|
406
|
+
if (this.lastActiveFanSpeed === speed) {
|
|
581
407
|
this.isOn = false;
|
|
582
408
|
|
|
583
409
|
for (const service of this.modeOutlets.values()) {
|
|
@@ -589,44 +415,30 @@ export class AirConditioner {
|
|
|
589
415
|
|
|
590
416
|
this.acThermostat.updateCharacteristic(this.Characteristic.Active, 0);
|
|
591
417
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, 0);
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
on: this.isOn,
|
|
595
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
596
|
-
},
|
|
597
|
-
kind: 'service#command',
|
|
598
|
-
deviceId: this.deviceId,
|
|
599
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
600
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
601
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
602
|
-
};
|
|
603
|
-
|
|
604
|
-
this.sendCommand(cmdBody);
|
|
418
|
+
|
|
419
|
+
this.sendCommand();
|
|
605
420
|
}
|
|
606
421
|
}
|
|
607
422
|
});
|
|
608
423
|
}
|
|
609
424
|
}
|
|
610
|
-
|
|
611
|
-
// D. Add Debug State switch to parent accessory
|
|
612
|
-
this.addDebugState('cloud.smarthq.service.thermostat.v1');
|
|
613
425
|
}
|
|
614
426
|
|
|
615
427
|
// ---------------------------
|
|
616
428
|
// API COMMAND SENDER
|
|
617
429
|
// ---------------------------
|
|
618
|
-
private sendCommand(
|
|
430
|
+
private sendCommand() {
|
|
619
431
|
if (this.debounceTimeout) {
|
|
620
432
|
clearTimeout(this.debounceTimeout);
|
|
621
433
|
}
|
|
622
434
|
|
|
623
435
|
this.debounceTimeout = setTimeout(() => {
|
|
624
436
|
this.debounceTimeout = null;
|
|
625
|
-
this.executeSendCommand(
|
|
437
|
+
this.executeSendCommand();
|
|
626
438
|
}, 150);
|
|
627
439
|
}
|
|
628
440
|
|
|
629
|
-
private async executeSendCommand(
|
|
441
|
+
private async executeSendCommand() {
|
|
630
442
|
const service = this.findService(
|
|
631
443
|
'cloud.smarthq.service.thermostat.v1',
|
|
632
444
|
'cloud.smarthq.domain.thermostat',
|
|
@@ -634,12 +446,10 @@ export class AirConditioner {
|
|
|
634
446
|
|
|
635
447
|
if (!service) return;
|
|
636
448
|
|
|
637
|
-
|
|
638
|
-
/*
|
|
449
|
+
this.commandQueue = this.commandQueue.then(async () => {
|
|
639
450
|
const command: Record<string, unknown> = {
|
|
640
451
|
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
641
452
|
};
|
|
642
|
-
|
|
643
453
|
|
|
644
454
|
// Only send the 'on' parameter if it is transitioning (prevents GE firmware from resetting to ECO)
|
|
645
455
|
if (!this.isOn) {
|
|
@@ -653,16 +463,16 @@ export class AirConditioner {
|
|
|
653
463
|
|
|
654
464
|
// Handle behavior constraint: Fan Only mode does not support Auto Fan Speed
|
|
655
465
|
if (
|
|
656
|
-
this.lastActiveMode ===
|
|
657
|
-
this.
|
|
466
|
+
this.lastActiveMode === 'cloud.smarthq.type.thermostatmode.fanonly' &&
|
|
467
|
+
this.lastActiveFanSpeed === 'cloud.smarthq.type.fanspeed.auto'
|
|
658
468
|
) {
|
|
659
|
-
command.fanSpeed =
|
|
469
|
+
command.fanSpeed = 'cloud.smarthq.type.fanspeed.low';
|
|
660
470
|
} else {
|
|
661
|
-
command.fanSpeed = this.
|
|
471
|
+
command.fanSpeed = this.lastActiveFanSpeed;
|
|
662
472
|
}
|
|
663
473
|
|
|
664
474
|
// Omit coolFahrenheit in Fan Only mode (thermostat has no cooling setpoint)
|
|
665
|
-
if (this.lastActiveMode !==
|
|
475
|
+
if (this.lastActiveMode !== 'cloud.smarthq.type.thermostatmode.fanonly') {
|
|
666
476
|
// Clip celsius to hardware bounds to prevent API errors
|
|
667
477
|
const clippedCelsius = Math.max(
|
|
668
478
|
this.coolCelsiusMin,
|
|
@@ -671,24 +481,26 @@ export class AirConditioner {
|
|
|
671
481
|
command.coolFahrenheit = Math.round(clippedCelsius * 1.8 + 32);
|
|
672
482
|
}
|
|
673
483
|
}
|
|
674
|
-
|
|
484
|
+
|
|
485
|
+
this.client.debug('## 1.2.5-test.0 -> command = ' + JSON.stringify(command, null, 2))
|
|
675
486
|
|
|
676
487
|
try {
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
this.
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
return response.success;
|
|
686
|
-
}
|
|
488
|
+
await this.client.sendCommand({
|
|
489
|
+
command,
|
|
490
|
+
kind: 'service#command',
|
|
491
|
+
deviceId: this.deviceId,
|
|
492
|
+
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
493
|
+
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
494
|
+
domainType: 'cloud.smarthq.domain.thermostat',
|
|
495
|
+
});
|
|
687
496
|
} catch (error) {
|
|
688
497
|
this.platform.log.error(`Error sending command to AC:`, error);
|
|
689
498
|
}
|
|
499
|
+
}).catch((err) => {
|
|
500
|
+
this.platform.log.error(`Error in AC command queue:`, err);
|
|
501
|
+
});
|
|
690
502
|
|
|
691
|
-
return
|
|
503
|
+
return this.commandQueue;
|
|
692
504
|
}
|
|
693
505
|
|
|
694
506
|
// ---------------------------
|
|
@@ -715,13 +527,13 @@ export class AirConditioner {
|
|
|
715
527
|
}
|
|
716
528
|
|
|
717
529
|
if (state.fanSpeed !== undefined) {
|
|
718
|
-
this.
|
|
530
|
+
this.lastActiveFanSpeed = state.fanSpeed as string;
|
|
719
531
|
}
|
|
720
532
|
|
|
721
533
|
// Update HeaterCooler state dynamically based on power and mode
|
|
722
534
|
const stateVal = !this.isOn
|
|
723
535
|
? 0
|
|
724
|
-
: (this.lastActiveMode ===
|
|
536
|
+
: (this.lastActiveMode === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3);
|
|
725
537
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
|
|
726
538
|
|
|
727
539
|
// Update dynamic outlets
|
|
@@ -729,7 +541,7 @@ export class AirConditioner {
|
|
|
729
541
|
service.updateCharacteristic(this.Characteristic.On, this.isOn && this.lastActiveMode === mode);
|
|
730
542
|
}
|
|
731
543
|
for (const [fanSpeed, service] of this.fanOutlets.entries()) {
|
|
732
|
-
service.updateCharacteristic(this.Characteristic.On, this.isOn && this.
|
|
544
|
+
service.updateCharacteristic(this.Characteristic.On, this.isOn && this.lastActiveFanSpeed === fanSpeed);
|
|
733
545
|
}
|
|
734
546
|
} else if (message.domainType === 'cloud.smarthq.domain.indoor.ambient') {
|
|
735
547
|
if (state.celsiusConverted !== undefined) {
|
|
@@ -774,69 +586,4 @@ export class AirConditioner {
|
|
|
774
586
|
);
|
|
775
587
|
}
|
|
776
588
|
}
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
// ---------------------------
|
|
780
|
-
// HELPERS FOR DEBUGGING
|
|
781
|
-
// Adds a 'Debug State' switch to the parent accessory that logs the current state of the specified service type when toggled on
|
|
782
|
-
// ---------------------------
|
|
783
|
-
|
|
784
|
-
private addDebugState(serviceType: string): void {
|
|
785
|
-
const debugState = this.setupService(
|
|
786
|
-
'Switch',
|
|
787
|
-
'Debug State',
|
|
788
|
-
`${this.deviceId}-debug-state`,
|
|
789
|
-
);
|
|
790
|
-
|
|
791
|
-
debugState
|
|
792
|
-
.getCharacteristic(this.Characteristic.On)
|
|
793
|
-
.onGet(() => {
|
|
794
|
-
return debugState.getCharacteristic(this.Characteristic.On).value as boolean;
|
|
795
|
-
})
|
|
796
|
-
.onSet(async (value) => {
|
|
797
|
-
if (value) {
|
|
798
|
-
const response = await this.client.getDevice(this.deviceId);
|
|
799
|
-
const deviceServices = response.services ?? [];
|
|
800
|
-
for (const service of deviceServices) {
|
|
801
|
-
if (service.serviceType === serviceType) {
|
|
802
|
-
this.client.debug('Debug State - Device Info: ' + JSON.stringify(service, null, 2));
|
|
803
|
-
}
|
|
804
|
-
}
|
|
805
|
-
|
|
806
|
-
setTimeout(() => {
|
|
807
|
-
debugState.updateCharacteristic(this.Characteristic.On, false);
|
|
808
|
-
}, 1000);
|
|
809
|
-
}
|
|
810
|
-
});
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
setupService(serviceType: string, displayName: string, serviceIdSuffix: string) {
|
|
814
|
-
let service: Service;
|
|
815
|
-
|
|
816
|
-
switch (serviceType) {
|
|
817
|
-
case 'Outlet':
|
|
818
|
-
service =
|
|
819
|
-
this.accessory.getService(displayName) ||
|
|
820
|
-
this.accessory.addService(this.Service.Outlet, displayName, serviceIdSuffix);
|
|
821
|
-
break;
|
|
822
|
-
|
|
823
|
-
case 'Switch':
|
|
824
|
-
service =
|
|
825
|
-
this.accessory.getService(displayName) ||
|
|
826
|
-
this.accessory.addService(this.Service.Switch, displayName, serviceIdSuffix);
|
|
827
|
-
break;
|
|
828
|
-
|
|
829
|
-
default:
|
|
830
|
-
this.client.debug('Unknown service type: ' + serviceType + '');
|
|
831
|
-
service =
|
|
832
|
-
this.accessory.getService(displayName) ||
|
|
833
|
-
this.accessory.addService(this.Service.Fan, displayName, serviceIdSuffix);
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
service.setCharacteristic(this.Characteristic.Name, displayName);
|
|
837
|
-
service.addOptionalCharacteristic(this.Characteristic.ConfiguredName);
|
|
838
|
-
service.setCharacteristic(this.Characteristic.ConfiguredName, displayName);
|
|
839
|
-
|
|
840
|
-
return service;
|
|
841
|
-
}
|
|
842
589
|
}
|