homebridge-smarthq-client 1.2.5-debug.0 → 1.2.5-debug.10
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.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PlatformAccessory, Service, Characteristic } from 'homebridge';
|
|
2
|
-
import { DeviceService } from 'ge-smarthq-api';
|
|
2
|
+
import { DeviceService, SendCommandRequest } from 'ge-smarthq-api';
|
|
3
3
|
import { SmartHqPlatform } from '../platform.js';
|
|
4
4
|
export declare class AirConditioner {
|
|
5
5
|
private readonly platform;
|
|
@@ -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 lastActiveFanSpeedMode;
|
|
12
12
|
private lastActiveCelsius;
|
|
13
13
|
private isOn;
|
|
14
14
|
private physicalOnState;
|
|
@@ -17,6 +17,20 @@ 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;
|
|
20
34
|
private client;
|
|
21
35
|
private api;
|
|
22
36
|
Service: typeof Service;
|
|
@@ -30,8 +44,7 @@ export declare class AirConditioner {
|
|
|
30
44
|
constructor(platform: SmartHqPlatform, accessory: PlatformAccessory, // Parent: Air Conditioner
|
|
31
45
|
deviceServices: DeviceService[], deviceId: string, groupAccessory: PlatformAccessory[]);
|
|
32
46
|
private setupAccessories;
|
|
33
|
-
|
|
34
|
-
private executeSendCommand;
|
|
47
|
+
sendCommand(cmdBody: SendCommandRequest): Promise<boolean>;
|
|
35
48
|
private handleUpdate;
|
|
36
49
|
private findService;
|
|
37
50
|
private getLastElementAndCapitalize;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SmartHQClient } from 'ge-smarthq-api';
|
|
2
|
+
import chalk from 'chalk';
|
|
2
3
|
export class AirConditioner {
|
|
3
4
|
platform;
|
|
4
5
|
accessory;
|
|
@@ -7,7 +8,7 @@ export class AirConditioner {
|
|
|
7
8
|
groupAccessory;
|
|
8
9
|
// State cache
|
|
9
10
|
lastActiveMode = 'cloud.smarthq.type.thermostatmode.cool';
|
|
10
|
-
|
|
11
|
+
lastActiveFanSpeedMode = 'cloud.smarthq.type.fanspeed.low';
|
|
11
12
|
lastActiveCelsius = 22.22;
|
|
12
13
|
isOn = false;
|
|
13
14
|
physicalOnState = false;
|
|
@@ -17,6 +18,22 @@ export class AirConditioner {
|
|
|
17
18
|
// Configuration thresholds
|
|
18
19
|
coolCelsiusMin = 17.77;
|
|
19
20
|
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";
|
|
20
37
|
client;
|
|
21
38
|
api;
|
|
22
39
|
Service;
|
|
@@ -62,7 +79,7 @@ export class AirConditioner {
|
|
|
62
79
|
this.lastActiveMode = thermostatService.state.mode;
|
|
63
80
|
}
|
|
64
81
|
if (thermostatService.state.fanSpeed != null) {
|
|
65
|
-
this.
|
|
82
|
+
this.lastActiveFanSpeedMode = thermostatService.state.fanSpeed;
|
|
66
83
|
}
|
|
67
84
|
}
|
|
68
85
|
// Load Celsius min/max bounds from thermostat config
|
|
@@ -128,14 +145,31 @@ export class AirConditioner {
|
|
|
128
145
|
.onSet(async (value) => {
|
|
129
146
|
this.isOn = value === 1;
|
|
130
147
|
if (this.isOn) {
|
|
131
|
-
const stateVal = this.lastActiveMode ===
|
|
148
|
+
const stateVal = this.lastActiveMode === this.MODE_FANONLY ? 1 : 3;
|
|
132
149
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
|
|
133
150
|
for (const [mode, service] of this.modeOutlets.entries()) {
|
|
134
151
|
service.updateCharacteristic(this.Characteristic.On, this.lastActiveMode === mode);
|
|
135
152
|
}
|
|
136
153
|
for (const [fanSpeed, service] of this.fanOutlets.entries()) {
|
|
137
|
-
service.updateCharacteristic(this.Characteristic.On, this.
|
|
154
|
+
service.updateCharacteristic(this.Characteristic.On, this.lastActiveFanSpeedMode === fanSpeed);
|
|
138
155
|
}
|
|
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);
|
|
139
173
|
}
|
|
140
174
|
else {
|
|
141
175
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, 0);
|
|
@@ -145,15 +179,29 @@ export class AirConditioner {
|
|
|
145
179
|
for (const service of this.fanOutlets.values()) {
|
|
146
180
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
147
181
|
}
|
|
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);
|
|
148
197
|
}
|
|
149
|
-
this.sendCommand();
|
|
150
198
|
});
|
|
151
199
|
this.acThermostat
|
|
152
200
|
.getCharacteristic(this.Characteristic.CurrentHeaterCoolerState)
|
|
153
201
|
.onGet(() => {
|
|
154
202
|
if (!this.isOn)
|
|
155
203
|
return 0;
|
|
156
|
-
return this.lastActiveMode ===
|
|
204
|
+
return this.lastActiveMode === this.MODE_FANONLY ? 1 : 3;
|
|
157
205
|
});
|
|
158
206
|
this.acThermostat
|
|
159
207
|
.getCharacteristic(this.Characteristic.TargetHeaterCoolerState)
|
|
@@ -172,7 +220,24 @@ export class AirConditioner {
|
|
|
172
220
|
.onGet(() => this.lastActiveCelsius)
|
|
173
221
|
.onSet(async (value) => {
|
|
174
222
|
this.lastActiveCelsius = value;
|
|
175
|
-
|
|
223
|
+
// Clip celsius to hardware bounds to prevent API errors
|
|
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);
|
|
176
241
|
});
|
|
177
242
|
this.acThermostat
|
|
178
243
|
.getCharacteristic(this.Characteristic.CurrentTemperature)
|
|
@@ -226,12 +291,61 @@ export class AirConditioner {
|
|
|
226
291
|
}
|
|
227
292
|
}
|
|
228
293
|
this.acThermostat.updateCharacteristic(this.Characteristic.Active, 1);
|
|
229
|
-
const stateVal = mode ===
|
|
294
|
+
const stateVal = mode === this.MODE_FANONLY ? 1 : 3;
|
|
230
295
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
|
|
231
|
-
for (const [
|
|
232
|
-
service.updateCharacteristic(this.Characteristic.On, this.
|
|
296
|
+
for (const [fanspeedMode, service] of this.fanOutlets.entries()) {
|
|
297
|
+
service.updateCharacteristic(this.Characteristic.On, this.lastActiveFanSpeedMode === fanspeedMode);
|
|
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
|
+
};
|
|
233
345
|
}
|
|
234
|
-
this.
|
|
346
|
+
this.client.debug(chalk.yellow('## Setting AC Mode:'));
|
|
347
|
+
this.client.debug(chalk.yellow(JSON.stringify(cmdBody, null, 2)));
|
|
348
|
+
this.sendCommand(cmdBody);
|
|
235
349
|
}
|
|
236
350
|
else {
|
|
237
351
|
// Toggling active mode OFF powers down system
|
|
@@ -245,7 +359,18 @@ export class AirConditioner {
|
|
|
245
359
|
}
|
|
246
360
|
this.acThermostat.updateCharacteristic(this.Characteristic.Active, 0);
|
|
247
361
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, 0);
|
|
248
|
-
|
|
362
|
+
const cmdBody = {
|
|
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);
|
|
249
374
|
}
|
|
250
375
|
}
|
|
251
376
|
});
|
|
@@ -260,16 +385,16 @@ export class AirConditioner {
|
|
|
260
385
|
.setCharacteristic(this.Characteristic.SerialNumber, this.parentAccessory.context.device.serial || 'Unknown');
|
|
261
386
|
// Clean up stale Fan Speed outlets from cache
|
|
262
387
|
const activeFanServiceUUIDs = new Set();
|
|
263
|
-
for (const
|
|
264
|
-
const [displayName] = this.getLastElementAndCapitalize(
|
|
388
|
+
for (const fanspeedMode of supportedFanSpeeds) {
|
|
389
|
+
const [displayName] = this.getLastElementAndCapitalize(fanspeedMode, '.');
|
|
265
390
|
const service = this.fanAccessory.getService(displayName) ||
|
|
266
|
-
this.fanAccessory.addService(this.Service.Outlet, displayName,
|
|
391
|
+
this.fanAccessory.addService(this.Service.Outlet, displayName, fanspeedMode);
|
|
267
392
|
if (!service.getCharacteristic(this.Characteristic.ConfiguredName)) {
|
|
268
393
|
service.addOptionalCharacteristic(this.Characteristic.ConfiguredName);
|
|
269
394
|
}
|
|
270
395
|
service.setCharacteristic(this.Characteristic.Name, displayName);
|
|
271
396
|
service.setCharacteristic(this.Characteristic.ConfiguredName, displayName);
|
|
272
|
-
activeFanServiceUUIDs.add(service.UUID + (
|
|
397
|
+
activeFanServiceUUIDs.add(service.UUID + (fanspeedMode || ''));
|
|
273
398
|
}
|
|
274
399
|
for (const service of [...this.fanAccessory.services]) {
|
|
275
400
|
if (service.UUID === this.Service.AccessoryInformation.UUID)
|
|
@@ -283,21 +408,25 @@ export class AirConditioner {
|
|
|
283
408
|
}
|
|
284
409
|
}
|
|
285
410
|
// Bind Fan Speed Outlets characteristics
|
|
286
|
-
for (const
|
|
287
|
-
const [displayName] = this.getLastElementAndCapitalize(
|
|
411
|
+
for (const fanspeedMode of supportedFanSpeeds) {
|
|
412
|
+
const [displayName] = this.getLastElementAndCapitalize(fanspeedMode, '.');
|
|
288
413
|
const service = this.fanAccessory.getService(displayName);
|
|
289
|
-
this.fanOutlets.set(
|
|
414
|
+
this.fanOutlets.set(fanspeedMode, service);
|
|
290
415
|
service
|
|
291
416
|
.getCharacteristic(this.Characteristic.On)
|
|
292
|
-
.onGet(() => this.isOn && this.
|
|
417
|
+
.onGet(() => this.isOn && this.lastActiveFanSpeedMode === fanspeedMode)
|
|
293
418
|
.onSet(async (value) => {
|
|
294
419
|
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
|
+
}
|
|
295
424
|
// Handle behavior constraint: Fan Only mode does not support Auto Fan Speed
|
|
296
|
-
if (this.lastActiveMode ===
|
|
297
|
-
|
|
425
|
+
if (this.lastActiveMode === this.MODE_FANONLY &&
|
|
426
|
+
fanspeedMode === this.FAN_SPEED_AUTO) {
|
|
298
427
|
setTimeout(() => {
|
|
299
428
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
300
|
-
const activeService = this.fanOutlets.get(this.
|
|
429
|
+
const activeService = this.fanOutlets.get(this.lastActiveFanSpeedMode);
|
|
301
430
|
if (activeService) {
|
|
302
431
|
activeService.updateCharacteristic(this.Characteristic.On, this.isOn);
|
|
303
432
|
}
|
|
@@ -305,23 +434,39 @@ export class AirConditioner {
|
|
|
305
434
|
return;
|
|
306
435
|
}
|
|
307
436
|
this.isOn = true;
|
|
308
|
-
this.
|
|
437
|
+
this.lastActiveFanSpeedMode = fanspeedMode;
|
|
309
438
|
for (const [fanSpeed, service] of this.fanOutlets.entries()) {
|
|
310
|
-
if (fanSpeed !==
|
|
439
|
+
if (fanSpeed !== fanspeedMode) {
|
|
311
440
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
312
441
|
}
|
|
313
442
|
}
|
|
314
443
|
this.acThermostat.updateCharacteristic(this.Characteristic.Active, 1);
|
|
315
|
-
const stateVal = this.lastActiveMode ===
|
|
444
|
+
const stateVal = this.lastActiveMode === this.MODE_FANONLY ? 1 : 3;
|
|
316
445
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
|
|
317
446
|
for (const [modeKey, service] of this.modeOutlets.entries()) {
|
|
318
447
|
service.updateCharacteristic(this.Characteristic.On, this.lastActiveMode === modeKey);
|
|
319
448
|
}
|
|
320
|
-
|
|
449
|
+
const cmdBody = {
|
|
450
|
+
command: {
|
|
451
|
+
mode: this.lastActiveMode,
|
|
452
|
+
fanspeed: this.lastActiveFanSpeedMode,
|
|
453
|
+
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
454
|
+
},
|
|
455
|
+
kind: 'service#command',
|
|
456
|
+
deviceId: this.deviceId,
|
|
457
|
+
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
458
|
+
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
459
|
+
domainType: 'cloud.smarthq.domain.thermostat',
|
|
460
|
+
};
|
|
461
|
+
this.client.debug(chalk.yellow('## Setting Fan Speed from mode:' + this.lastActiveMode));
|
|
462
|
+
this.client.debug(chalk.yellow(JSON.stringify(cmdBody, null, 2)));
|
|
463
|
+
this.sendCommand(cmdBody);
|
|
321
464
|
}
|
|
322
465
|
else {
|
|
323
466
|
// Toggling active fan speed OFF powers down system
|
|
324
|
-
|
|
467
|
+
// note: Fan Speed OFF is not a supported state for the AC unit, so we treat it as a power down command
|
|
468
|
+
// note: don't think the else block is ever reached
|
|
469
|
+
if (this.lastActiveFanSpeedMode === fanspeedMode) {
|
|
325
470
|
this.isOn = false;
|
|
326
471
|
for (const service of this.modeOutlets.values()) {
|
|
327
472
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
@@ -331,7 +476,18 @@ export class AirConditioner {
|
|
|
331
476
|
}
|
|
332
477
|
this.acThermostat.updateCharacteristic(this.Characteristic.Active, 0);
|
|
333
478
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, 0);
|
|
334
|
-
|
|
479
|
+
const cmdBody = {
|
|
480
|
+
command: {
|
|
481
|
+
on: this.isOn,
|
|
482
|
+
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
483
|
+
},
|
|
484
|
+
kind: 'service#command',
|
|
485
|
+
deviceId: this.deviceId,
|
|
486
|
+
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
487
|
+
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
488
|
+
domainType: 'cloud.smarthq.domain.thermostat',
|
|
489
|
+
};
|
|
490
|
+
this.sendCommand(cmdBody);
|
|
335
491
|
}
|
|
336
492
|
}
|
|
337
493
|
});
|
|
@@ -343,65 +499,95 @@ export class AirConditioner {
|
|
|
343
499
|
// ---------------------------
|
|
344
500
|
// API COMMAND SENDER
|
|
345
501
|
// ---------------------------
|
|
346
|
-
sendCommand() {
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
this.executeSendCommand();
|
|
353
|
-
}, 150);
|
|
354
|
-
}
|
|
355
|
-
async executeSendCommand() {
|
|
356
|
-
const service = this.findService('cloud.smarthq.service.thermostat.v1', 'cloud.smarthq.domain.thermostat');
|
|
357
|
-
if (!service)
|
|
358
|
-
return;
|
|
359
|
-
this.commandQueue = this.commandQueue.then(async () => {
|
|
360
|
-
const command = {
|
|
361
|
-
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
362
|
-
};
|
|
363
|
-
// Only send the 'on' parameter if it is transitioning (prevents GE firmware from resetting to ECO)
|
|
364
|
-
if (!this.isOn) {
|
|
365
|
-
command.on = false;
|
|
366
|
-
}
|
|
367
|
-
else if (!this.physicalOnState) {
|
|
368
|
-
command.on = true;
|
|
369
|
-
}
|
|
370
|
-
if (this.isOn) {
|
|
371
|
-
command.mode = this.lastActiveMode;
|
|
372
|
-
// Handle behavior constraint: Fan Only mode does not support Auto Fan Speed
|
|
373
|
-
if (this.lastActiveMode === 'cloud.smarthq.type.thermostatmode.fanonly' &&
|
|
374
|
-
this.lastActiveFanSpeed === 'cloud.smarthq.type.fanspeed.auto') {
|
|
375
|
-
command.fanSpeed = 'cloud.smarthq.type.fanspeed.low';
|
|
376
|
-
}
|
|
377
|
-
else {
|
|
378
|
-
command.fanSpeed = this.lastActiveFanSpeed;
|
|
379
|
-
}
|
|
380
|
-
// Omit coolFahrenheit in Fan Only mode (thermostat has no cooling setpoint)
|
|
381
|
-
if (this.lastActiveMode !== 'cloud.smarthq.type.thermostatmode.fanonly') {
|
|
382
|
-
// Clip celsius to hardware bounds to prevent API errors
|
|
383
|
-
const clippedCelsius = Math.max(this.coolCelsiusMin, Math.min(this.coolCelsiusMax, this.lastActiveCelsius));
|
|
384
|
-
command.coolFahrenheit = Math.round(clippedCelsius * 1.8 + 32);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
try {
|
|
388
|
-
await this.client.sendCommand({
|
|
389
|
-
command,
|
|
390
|
-
kind: 'service#command',
|
|
391
|
-
deviceId: this.deviceId,
|
|
392
|
-
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
393
|
-
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
394
|
-
domainType: 'cloud.smarthq.domain.thermostat',
|
|
395
|
-
});
|
|
502
|
+
async sendCommand(cmdBody) {
|
|
503
|
+
try {
|
|
504
|
+
const response = await this.client.sendCommand(cmdBody); // This command sets the mode and options
|
|
505
|
+
if (response == null) {
|
|
506
|
+
this.client.debug("No response from setActive command");
|
|
507
|
+
return false;
|
|
396
508
|
}
|
|
397
|
-
|
|
398
|
-
this.
|
|
509
|
+
else {
|
|
510
|
+
this.client.debug("=======================Response from set command : " + response.outcome);
|
|
511
|
+
return response.success;
|
|
399
512
|
}
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
513
|
+
}
|
|
514
|
+
catch (error) {
|
|
515
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
516
|
+
const stack = error instanceof Error ? error.stack : undefined;
|
|
517
|
+
this.platform.log.error("sendCommand failed", {
|
|
518
|
+
message,
|
|
519
|
+
stack,
|
|
520
|
+
raw: error,
|
|
521
|
+
});
|
|
522
|
+
this.client.debug(`sendCommand failed: ${message}`);
|
|
523
|
+
return false;
|
|
524
|
+
}
|
|
404
525
|
}
|
|
526
|
+
/*
|
|
527
|
+
private async executeSendCommand(command: SendCommandRequest) {
|
|
528
|
+
const service = this.findService(
|
|
529
|
+
'cloud.smarthq.service.thermostat.v1',
|
|
530
|
+
'cloud.smarthq.domain.thermostat',
|
|
531
|
+
);
|
|
532
|
+
|
|
533
|
+
if (!service) return;
|
|
534
|
+
|
|
535
|
+
//this.commandQueue = this.commandQueue.then(async () => {
|
|
536
|
+
|
|
537
|
+
const command: Record<string, unknown> = {
|
|
538
|
+
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
539
|
+
};
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
// Only send the 'on' parameter if it is transitioning (prevents GE firmware from resetting to ECO)
|
|
543
|
+
if (!this.isOn) {
|
|
544
|
+
command.on = false;
|
|
545
|
+
} else if (!this.physicalOnState) {
|
|
546
|
+
command.on = true;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
if (this.isOn) {
|
|
550
|
+
command.mode = this.lastActiveMode;
|
|
551
|
+
|
|
552
|
+
// Handle behavior constraint: Fan Only mode does not support Auto Fan Speed
|
|
553
|
+
if (
|
|
554
|
+
this.lastActiveMode === this.MODE_FANONLY &&
|
|
555
|
+
this.lastActiveFanSpeedMode === this.FAN_SPEED_AUTO
|
|
556
|
+
) {
|
|
557
|
+
command.fanSpeed = this.FAN_SPEED_LOW;
|
|
558
|
+
} else {
|
|
559
|
+
command.fanSpeed = this.lastActiveFanSpeedMode;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
// Omit coolFahrenheit in Fan Only mode (thermostat has no cooling setpoint)
|
|
563
|
+
if (this.lastActiveMode !== this.MODE_FANONLY) {
|
|
564
|
+
// Clip celsius to hardware bounds to prevent API errors
|
|
565
|
+
const clippedCelsius = Math.max(
|
|
566
|
+
this.coolCelsiusMin,
|
|
567
|
+
Math.min(this.coolCelsiusMax, this.lastActiveCelsius),
|
|
568
|
+
);
|
|
569
|
+
command.coolFahrenheit = Math.round(clippedCelsius * 1.8 + 32);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
|
|
574
|
+
try {
|
|
575
|
+
const response = await this.client.sendCommand(command);
|
|
576
|
+
|
|
577
|
+
if (response == null) {
|
|
578
|
+
this.client.debug("No response from send command");
|
|
579
|
+
} else {
|
|
580
|
+
this.client.debug(
|
|
581
|
+
"#### Response from send command : " + response.outcome,
|
|
582
|
+
);
|
|
583
|
+
return response.success;
|
|
584
|
+
}
|
|
585
|
+
} catch (error) {
|
|
586
|
+
this.platform.log.error(`Error sending command to AC:`, error);
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
return true;
|
|
590
|
+
}*/
|
|
405
591
|
// ---------------------------
|
|
406
592
|
// WEBSOCKET UPDATES HANDLING
|
|
407
593
|
// ---------------------------
|
|
@@ -423,19 +609,19 @@ export class AirConditioner {
|
|
|
423
609
|
this.lastActiveMode = state.mode;
|
|
424
610
|
}
|
|
425
611
|
if (state.fanSpeed !== undefined) {
|
|
426
|
-
this.
|
|
612
|
+
this.lastActiveFanSpeedMode = state.fanSpeed;
|
|
427
613
|
}
|
|
428
614
|
// Update HeaterCooler state dynamically based on power and mode
|
|
429
615
|
const stateVal = !this.isOn
|
|
430
616
|
? 0
|
|
431
|
-
: (this.lastActiveMode ===
|
|
617
|
+
: (this.lastActiveMode === this.MODE_FANONLY ? 1 : 3);
|
|
432
618
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
|
|
433
619
|
// Update dynamic outlets
|
|
434
620
|
for (const [mode, service] of this.modeOutlets.entries()) {
|
|
435
621
|
service.updateCharacteristic(this.Characteristic.On, this.isOn && this.lastActiveMode === mode);
|
|
436
622
|
}
|
|
437
623
|
for (const [fanSpeed, service] of this.fanOutlets.entries()) {
|
|
438
|
-
service.updateCharacteristic(this.Characteristic.On, this.isOn && this.
|
|
624
|
+
service.updateCharacteristic(this.Characteristic.On, this.isOn && this.lastActiveFanSpeedMode === fanSpeed);
|
|
439
625
|
}
|
|
440
626
|
}
|
|
441
627
|
else if (message.domainType === 'cloud.smarthq.domain.indoor.ambient') {
|
|
@@ -473,10 +659,10 @@ export class AirConditioner {
|
|
|
473
659
|
}
|
|
474
660
|
// ---------------------------
|
|
475
661
|
// HELPERS FOR DEBUGGING
|
|
476
|
-
// Adds a
|
|
662
|
+
// Adds a 'Debug State' switch to the parent accessory that logs the current state of the specified service type when toggled on
|
|
477
663
|
// ---------------------------
|
|
478
664
|
addDebugState(serviceType) {
|
|
479
|
-
const debugState = this.setupService(
|
|
665
|
+
const debugState = this.setupService('Switch', 'Debug State', `${this.deviceId}-debug-state`);
|
|
480
666
|
debugState
|
|
481
667
|
.getCharacteristic(this.Characteristic.On)
|
|
482
668
|
.onGet(() => {
|
|
@@ -488,7 +674,7 @@ export class AirConditioner {
|
|
|
488
674
|
const deviceServices = response.services ?? [];
|
|
489
675
|
for (const service of deviceServices) {
|
|
490
676
|
if (service.serviceType === serviceType) {
|
|
491
|
-
this.client.debug(
|
|
677
|
+
this.client.debug('Debug State - Device Info: ' + JSON.stringify(service, null, 2));
|
|
492
678
|
}
|
|
493
679
|
}
|
|
494
680
|
setTimeout(() => {
|
|
@@ -500,18 +686,18 @@ export class AirConditioner {
|
|
|
500
686
|
setupService(serviceType, displayName, serviceIdSuffix) {
|
|
501
687
|
let service;
|
|
502
688
|
switch (serviceType) {
|
|
503
|
-
case
|
|
689
|
+
case 'Outlet':
|
|
504
690
|
service =
|
|
505
691
|
this.accessory.getService(displayName) ||
|
|
506
692
|
this.accessory.addService(this.Service.Outlet, displayName, serviceIdSuffix);
|
|
507
693
|
break;
|
|
508
|
-
case
|
|
694
|
+
case 'Switch':
|
|
509
695
|
service =
|
|
510
696
|
this.accessory.getService(displayName) ||
|
|
511
697
|
this.accessory.addService(this.Service.Switch, displayName, serviceIdSuffix);
|
|
512
698
|
break;
|
|
513
699
|
default:
|
|
514
|
-
this.client.debug(
|
|
700
|
+
this.client.debug('Unknown service type: ' + serviceType + '');
|
|
515
701
|
service =
|
|
516
702
|
this.accessory.getService(displayName) ||
|
|
517
703
|
this.accessory.addService(this.Service.Fan, displayName, serviceIdSuffix);
|
|
@@ -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
|
@@ -5,14 +5,15 @@ import {
|
|
|
5
5
|
Characteristic,
|
|
6
6
|
} from 'homebridge';
|
|
7
7
|
|
|
8
|
-
import { SmartHQClient, DeviceService } from 'ge-smarthq-api';
|
|
8
|
+
import { SmartHQClient, DeviceService, SendCommandRequest } from 'ge-smarthq-api';
|
|
9
9
|
import { SmartHqPlatform } from '../platform.js';
|
|
10
10
|
import { ServiceMessage } from '../index.js';
|
|
11
|
+
import chalk from 'chalk';
|
|
11
12
|
|
|
12
13
|
export class AirConditioner {
|
|
13
14
|
// State cache
|
|
14
15
|
private lastActiveMode = 'cloud.smarthq.type.thermostatmode.cool';
|
|
15
|
-
private
|
|
16
|
+
private lastActiveFanSpeedMode = 'cloud.smarthq.type.fanspeed.low';
|
|
16
17
|
private lastActiveCelsius = 22.22;
|
|
17
18
|
private isOn = false;
|
|
18
19
|
private physicalOnState = false;
|
|
@@ -25,6 +26,24 @@ export class AirConditioner {
|
|
|
25
26
|
private coolCelsiusMin = 17.77;
|
|
26
27
|
private coolCelsiusMax = 30.0;
|
|
27
28
|
|
|
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
|
+
|
|
28
47
|
private client: SmartHQClient;
|
|
29
48
|
private api: API;
|
|
30
49
|
|
|
@@ -81,7 +100,7 @@ export class AirConditioner {
|
|
|
81
100
|
this.lastActiveMode = thermostatService.state.mode as string;
|
|
82
101
|
}
|
|
83
102
|
if (thermostatService.state.fanSpeed != null) {
|
|
84
|
-
this.
|
|
103
|
+
this.lastActiveFanSpeedMode = thermostatService.state.fanSpeed as string;
|
|
85
104
|
}
|
|
86
105
|
}
|
|
87
106
|
|
|
@@ -168,14 +187,37 @@ export class AirConditioner {
|
|
|
168
187
|
this.isOn = (value as number) === 1;
|
|
169
188
|
|
|
170
189
|
if (this.isOn) {
|
|
171
|
-
const stateVal = this.lastActiveMode ===
|
|
190
|
+
const stateVal = this.lastActiveMode === this.MODE_FANONLY ? 1 : 3;
|
|
172
191
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
|
|
173
192
|
for (const [mode, service] of this.modeOutlets.entries()) {
|
|
174
193
|
service.updateCharacteristic(this.Characteristic.On, this.lastActiveMode === mode);
|
|
175
194
|
}
|
|
176
195
|
for (const [fanSpeed, service] of this.fanOutlets.entries()) {
|
|
177
|
-
service.updateCharacteristic(this.Characteristic.On, this.
|
|
196
|
+
service.updateCharacteristic(this.Characteristic.On, this.lastActiveFanSpeedMode === fanSpeed);
|
|
178
197
|
}
|
|
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
|
+
|
|
179
221
|
} else {
|
|
180
222
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, 0);
|
|
181
223
|
for (const service of this.modeOutlets.values()) {
|
|
@@ -184,16 +226,35 @@ export class AirConditioner {
|
|
|
184
226
|
for (const service of this.fanOutlets.values()) {
|
|
185
227
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
186
228
|
}
|
|
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);
|
|
187
248
|
}
|
|
188
249
|
|
|
189
|
-
|
|
250
|
+
|
|
190
251
|
});
|
|
191
252
|
|
|
192
253
|
this.acThermostat
|
|
193
254
|
.getCharacteristic(this.Characteristic.CurrentHeaterCoolerState)
|
|
194
|
-
.onGet(() => {
|
|
255
|
+
.onGet(() => {
|
|
195
256
|
if (!this.isOn) return 0;
|
|
196
|
-
return this.lastActiveMode ===
|
|
257
|
+
return this.lastActiveMode === this.MODE_FANONLY ? 1 : 3;
|
|
197
258
|
});
|
|
198
259
|
|
|
199
260
|
this.acThermostat
|
|
@@ -214,7 +275,33 @@ export class AirConditioner {
|
|
|
214
275
|
.onGet(() => this.lastActiveCelsius)
|
|
215
276
|
.onSet(async (value) => {
|
|
216
277
|
this.lastActiveCelsius = value as number;
|
|
217
|
-
|
|
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);
|
|
218
305
|
});
|
|
219
306
|
|
|
220
307
|
this.acThermostat
|
|
@@ -285,14 +372,69 @@ export class AirConditioner {
|
|
|
285
372
|
}
|
|
286
373
|
|
|
287
374
|
this.acThermostat.updateCharacteristic(this.Characteristic.Active, 1);
|
|
288
|
-
const stateVal = mode ===
|
|
375
|
+
const stateVal = mode === this.MODE_FANONLY ? 1 : 3;
|
|
289
376
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
|
|
290
377
|
|
|
291
|
-
for (const [
|
|
292
|
-
service.updateCharacteristic(this.Characteristic.On, this.
|
|
378
|
+
for (const [fanspeedMode, service] of this.fanOutlets.entries()) {
|
|
379
|
+
service.updateCharacteristic(this.Characteristic.On, this.lastActiveFanSpeedMode === fanspeedMode);
|
|
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
|
+
};
|
|
293
431
|
}
|
|
294
432
|
|
|
295
|
-
this.
|
|
433
|
+
this.client.debug(chalk.yellow('## Setting AC Mode:'));
|
|
434
|
+
this.client.debug(chalk.yellow(JSON.stringify(cmdBody, null, 2)));
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
this.sendCommand(cmdBody);
|
|
296
438
|
} else {
|
|
297
439
|
// Toggling active mode OFF powers down system
|
|
298
440
|
if (this.lastActiveMode === mode) {
|
|
@@ -301,14 +443,26 @@ export class AirConditioner {
|
|
|
301
443
|
for (const service of this.modeOutlets.values()) {
|
|
302
444
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
303
445
|
}
|
|
304
|
-
for (const service of this.fanOutlets.values()) {
|
|
446
|
+
for (const service of this.fanOutlets.values()) {
|
|
305
447
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
306
448
|
}
|
|
307
449
|
|
|
308
450
|
this.acThermostat.updateCharacteristic(this.Characteristic.Active, 0);
|
|
309
451
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, 0);
|
|
310
452
|
|
|
311
|
-
|
|
453
|
+
const cmdBody: SendCommandRequest = {
|
|
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);
|
|
312
466
|
}
|
|
313
467
|
}
|
|
314
468
|
});
|
|
@@ -331,11 +485,11 @@ export class AirConditioner {
|
|
|
331
485
|
|
|
332
486
|
// Clean up stale Fan Speed outlets from cache
|
|
333
487
|
const activeFanServiceUUIDs = new Set<string>();
|
|
334
|
-
for (const
|
|
335
|
-
const [displayName] = this.getLastElementAndCapitalize(
|
|
488
|
+
for (const fanspeedMode of supportedFanSpeeds) {
|
|
489
|
+
const [displayName] = this.getLastElementAndCapitalize(fanspeedMode, '.');
|
|
336
490
|
const service =
|
|
337
491
|
this.fanAccessory.getService(displayName) ||
|
|
338
|
-
this.fanAccessory.addService(this.Service.Outlet, displayName,
|
|
492
|
+
this.fanAccessory.addService(this.Service.Outlet, displayName, fanspeedMode);
|
|
339
493
|
|
|
340
494
|
if (!service.getCharacteristic(this.Characteristic.ConfiguredName)) {
|
|
341
495
|
service.addOptionalCharacteristic(this.Characteristic.ConfiguredName);
|
|
@@ -343,7 +497,7 @@ export class AirConditioner {
|
|
|
343
497
|
service.setCharacteristic(this.Characteristic.Name, displayName);
|
|
344
498
|
service.setCharacteristic(this.Characteristic.ConfiguredName, displayName);
|
|
345
499
|
|
|
346
|
-
activeFanServiceUUIDs.add(service.UUID + (
|
|
500
|
+
activeFanServiceUUIDs.add(service.UUID + (fanspeedMode || ''));
|
|
347
501
|
}
|
|
348
502
|
|
|
349
503
|
for (const service of [...this.fanAccessory.services]) {
|
|
@@ -358,25 +512,30 @@ export class AirConditioner {
|
|
|
358
512
|
}
|
|
359
513
|
|
|
360
514
|
// Bind Fan Speed Outlets characteristics
|
|
361
|
-
for (const
|
|
362
|
-
const [displayName] = this.getLastElementAndCapitalize(
|
|
515
|
+
for (const fanspeedMode of supportedFanSpeeds) {
|
|
516
|
+
const [displayName] = this.getLastElementAndCapitalize(fanspeedMode, '.');
|
|
363
517
|
const service = this.fanAccessory.getService(displayName)!;
|
|
364
518
|
|
|
365
|
-
this.fanOutlets.set(
|
|
519
|
+
this.fanOutlets.set(fanspeedMode, service);
|
|
366
520
|
|
|
367
521
|
service
|
|
368
522
|
.getCharacteristic(this.Characteristic.On)
|
|
369
|
-
.onGet(() => this.isOn && this.
|
|
523
|
+
.onGet(() => this.isOn && this.lastActiveFanSpeedMode === fanspeedMode)
|
|
370
524
|
.onSet(async (value) => {
|
|
371
525
|
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
|
+
|
|
372
531
|
// Handle behavior constraint: Fan Only mode does not support Auto Fan Speed
|
|
373
532
|
if (
|
|
374
|
-
this.lastActiveMode ===
|
|
375
|
-
|
|
533
|
+
this.lastActiveMode === this.MODE_FANONLY &&
|
|
534
|
+
fanspeedMode === this.FAN_SPEED_AUTO
|
|
376
535
|
) {
|
|
377
536
|
setTimeout(() => {
|
|
378
537
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
379
|
-
const activeService = this.fanOutlets.get(this.
|
|
538
|
+
const activeService = this.fanOutlets.get(this.lastActiveFanSpeedMode);
|
|
380
539
|
if (activeService) {
|
|
381
540
|
activeService.updateCharacteristic(this.Characteristic.On, this.isOn);
|
|
382
541
|
}
|
|
@@ -385,26 +544,44 @@ export class AirConditioner {
|
|
|
385
544
|
}
|
|
386
545
|
|
|
387
546
|
this.isOn = true;
|
|
388
|
-
this.
|
|
547
|
+
this.lastActiveFanSpeedMode = fanspeedMode;
|
|
389
548
|
|
|
390
549
|
for (const [fanSpeed, service] of this.fanOutlets.entries()) {
|
|
391
|
-
if (fanSpeed !==
|
|
550
|
+
if (fanSpeed !== fanspeedMode) {
|
|
392
551
|
service.updateCharacteristic(this.Characteristic.On, false);
|
|
393
552
|
}
|
|
394
553
|
}
|
|
395
554
|
|
|
396
555
|
this.acThermostat.updateCharacteristic(this.Characteristic.Active, 1);
|
|
397
|
-
const stateVal = this.lastActiveMode ===
|
|
556
|
+
const stateVal = this.lastActiveMode === this.MODE_FANONLY ? 1 : 3;
|
|
398
557
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
|
|
399
558
|
|
|
400
559
|
for (const [modeKey, service] of this.modeOutlets.entries()) {
|
|
401
560
|
service.updateCharacteristic(this.Characteristic.On, this.lastActiveMode === modeKey);
|
|
402
561
|
}
|
|
403
562
|
|
|
404
|
-
|
|
563
|
+
const cmdBody: SendCommandRequest = {
|
|
564
|
+
command: {
|
|
565
|
+
mode: this.lastActiveMode,
|
|
566
|
+
fanspeed: this.lastActiveFanSpeedMode,
|
|
567
|
+
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
568
|
+
},
|
|
569
|
+
kind: 'service#command',
|
|
570
|
+
deviceId: this.deviceId,
|
|
571
|
+
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
572
|
+
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
573
|
+
domainType: 'cloud.smarthq.domain.thermostat',
|
|
574
|
+
};
|
|
575
|
+
|
|
576
|
+
this.client.debug(chalk.yellow('## Setting Fan Speed from mode:' + this.lastActiveMode));
|
|
577
|
+
this.client.debug(chalk.yellow(JSON.stringify(cmdBody, null, 2)));
|
|
578
|
+
|
|
579
|
+
this.sendCommand(cmdBody);
|
|
405
580
|
} else {
|
|
406
581
|
// Toggling active fan speed OFF powers down system
|
|
407
|
-
|
|
582
|
+
// note: Fan Speed OFF is not a supported state for the AC unit, so we treat it as a power down command
|
|
583
|
+
// note: don't think the else block is ever reached
|
|
584
|
+
if (this.lastActiveFanSpeedMode === fanspeedMode) {
|
|
408
585
|
this.isOn = false;
|
|
409
586
|
|
|
410
587
|
for (const service of this.modeOutlets.values()) {
|
|
@@ -416,8 +593,19 @@ export class AirConditioner {
|
|
|
416
593
|
|
|
417
594
|
this.acThermostat.updateCharacteristic(this.Characteristic.Active, 0);
|
|
418
595
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, 0);
|
|
419
|
-
|
|
420
|
-
|
|
596
|
+
const cmdBody: SendCommandRequest = {
|
|
597
|
+
command: {
|
|
598
|
+
on: this.isOn,
|
|
599
|
+
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
600
|
+
},
|
|
601
|
+
kind: 'service#command',
|
|
602
|
+
deviceId: this.deviceId,
|
|
603
|
+
serviceDeviceType: 'cloud.smarthq.device.airconditioner',
|
|
604
|
+
serviceType: 'cloud.smarthq.service.thermostat.v1',
|
|
605
|
+
domainType: 'cloud.smarthq.domain.thermostat',
|
|
606
|
+
};
|
|
607
|
+
|
|
608
|
+
this.sendCommand(cmdBody);
|
|
421
609
|
}
|
|
422
610
|
}
|
|
423
611
|
});
|
|
@@ -431,18 +619,36 @@ export class AirConditioner {
|
|
|
431
619
|
// ---------------------------
|
|
432
620
|
// API COMMAND SENDER
|
|
433
621
|
// ---------------------------
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
622
|
+
async sendCommand(cmdBody: SendCommandRequest) {
|
|
623
|
+
|
|
624
|
+
try {
|
|
625
|
+
const response = await this.client.sendCommand(cmdBody); // This command sets the mode and options
|
|
626
|
+
|
|
627
|
+
if (response == null) {
|
|
628
|
+
this.client.debug("No response from setActive command");
|
|
629
|
+
return false;
|
|
630
|
+
} else {
|
|
631
|
+
this.client.debug(
|
|
632
|
+
"=======================Response from set command : " + response.outcome,
|
|
633
|
+
);
|
|
634
|
+
return response.success;
|
|
635
|
+
}
|
|
636
|
+
} catch (error: unknown) {
|
|
637
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
638
|
+
const stack = error instanceof Error ? error.stack : undefined;
|
|
639
|
+
|
|
640
|
+
this.platform.log.error("sendCommand failed", {
|
|
641
|
+
message,
|
|
642
|
+
stack,
|
|
643
|
+
raw: error,
|
|
644
|
+
});
|
|
438
645
|
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
}, 150);
|
|
646
|
+
this.client.debug(`sendCommand failed: ${message}`);
|
|
647
|
+
return false;
|
|
648
|
+
}
|
|
443
649
|
}
|
|
444
|
-
|
|
445
|
-
private async executeSendCommand() {
|
|
650
|
+
/*
|
|
651
|
+
private async executeSendCommand(command: SendCommandRequest) {
|
|
446
652
|
const service = this.findService(
|
|
447
653
|
'cloud.smarthq.service.thermostat.v1',
|
|
448
654
|
'cloud.smarthq.domain.thermostat',
|
|
@@ -450,10 +656,12 @@ export class AirConditioner {
|
|
|
450
656
|
|
|
451
657
|
if (!service) return;
|
|
452
658
|
|
|
453
|
-
this.commandQueue = this.commandQueue.then(async () => {
|
|
659
|
+
//this.commandQueue = this.commandQueue.then(async () => {
|
|
660
|
+
|
|
454
661
|
const command: Record<string, unknown> = {
|
|
455
662
|
commandType: 'cloud.smarthq.command.thermostat.v1.set',
|
|
456
663
|
};
|
|
664
|
+
|
|
457
665
|
|
|
458
666
|
// Only send the 'on' parameter if it is transitioning (prevents GE firmware from resetting to ECO)
|
|
459
667
|
if (!this.isOn) {
|
|
@@ -467,16 +675,16 @@ export class AirConditioner {
|
|
|
467
675
|
|
|
468
676
|
// Handle behavior constraint: Fan Only mode does not support Auto Fan Speed
|
|
469
677
|
if (
|
|
470
|
-
this.lastActiveMode ===
|
|
471
|
-
this.
|
|
678
|
+
this.lastActiveMode === this.MODE_FANONLY &&
|
|
679
|
+
this.lastActiveFanSpeedMode === this.FAN_SPEED_AUTO
|
|
472
680
|
) {
|
|
473
|
-
command.fanSpeed =
|
|
681
|
+
command.fanSpeed = this.FAN_SPEED_LOW;
|
|
474
682
|
} else {
|
|
475
|
-
command.fanSpeed = this.
|
|
683
|
+
command.fanSpeed = this.lastActiveFanSpeedMode;
|
|
476
684
|
}
|
|
477
685
|
|
|
478
686
|
// Omit coolFahrenheit in Fan Only mode (thermostat has no cooling setpoint)
|
|
479
|
-
if (this.lastActiveMode !==
|
|
687
|
+
if (this.lastActiveMode !== this.MODE_FANONLY) {
|
|
480
688
|
// Clip celsius to hardware bounds to prevent API errors
|
|
481
689
|
const clippedCelsius = Math.max(
|
|
482
690
|
this.coolCelsiusMin,
|
|
@@ -485,25 +693,25 @@ export class AirConditioner {
|
|
|
485
693
|
command.coolFahrenheit = Math.round(clippedCelsius * 1.8 + 32);
|
|
486
694
|
}
|
|
487
695
|
}
|
|
696
|
+
|
|
488
697
|
|
|
489
698
|
try {
|
|
490
|
-
await this.client.sendCommand(
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
699
|
+
const response = await this.client.sendCommand(command);
|
|
700
|
+
|
|
701
|
+
if (response == null) {
|
|
702
|
+
this.client.debug("No response from send command");
|
|
703
|
+
} else {
|
|
704
|
+
this.client.debug(
|
|
705
|
+
"#### Response from send command : " + response.outcome,
|
|
706
|
+
);
|
|
707
|
+
return response.success;
|
|
708
|
+
}
|
|
498
709
|
} catch (error) {
|
|
499
710
|
this.platform.log.error(`Error sending command to AC:`, error);
|
|
500
711
|
}
|
|
501
|
-
}).catch((err) => {
|
|
502
|
-
this.platform.log.error(`Error in AC command queue:`, err);
|
|
503
|
-
});
|
|
504
712
|
|
|
505
|
-
return
|
|
506
|
-
}
|
|
713
|
+
return true;
|
|
714
|
+
}*/
|
|
507
715
|
|
|
508
716
|
// ---------------------------
|
|
509
717
|
// WEBSOCKET UPDATES HANDLING
|
|
@@ -529,13 +737,13 @@ export class AirConditioner {
|
|
|
529
737
|
}
|
|
530
738
|
|
|
531
739
|
if (state.fanSpeed !== undefined) {
|
|
532
|
-
this.
|
|
740
|
+
this.lastActiveFanSpeedMode = state.fanSpeed as string;
|
|
533
741
|
}
|
|
534
742
|
|
|
535
743
|
// Update HeaterCooler state dynamically based on power and mode
|
|
536
744
|
const stateVal = !this.isOn
|
|
537
745
|
? 0
|
|
538
|
-
: (this.lastActiveMode ===
|
|
746
|
+
: (this.lastActiveMode === this.MODE_FANONLY ? 1 : 3);
|
|
539
747
|
this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
|
|
540
748
|
|
|
541
749
|
// Update dynamic outlets
|
|
@@ -543,7 +751,7 @@ export class AirConditioner {
|
|
|
543
751
|
service.updateCharacteristic(this.Characteristic.On, this.isOn && this.lastActiveMode === mode);
|
|
544
752
|
}
|
|
545
753
|
for (const [fanSpeed, service] of this.fanOutlets.entries()) {
|
|
546
|
-
service.updateCharacteristic(this.Characteristic.On, this.isOn && this.
|
|
754
|
+
service.updateCharacteristic(this.Characteristic.On, this.isOn && this.lastActiveFanSpeedMode === fanSpeed);
|
|
547
755
|
}
|
|
548
756
|
} else if (message.domainType === 'cloud.smarthq.domain.indoor.ambient') {
|
|
549
757
|
if (state.celsiusConverted !== undefined) {
|
|
@@ -592,13 +800,13 @@ export class AirConditioner {
|
|
|
592
800
|
|
|
593
801
|
// ---------------------------
|
|
594
802
|
// HELPERS FOR DEBUGGING
|
|
595
|
-
// Adds a
|
|
803
|
+
// Adds a 'Debug State' switch to the parent accessory that logs the current state of the specified service type when toggled on
|
|
596
804
|
// ---------------------------
|
|
597
805
|
|
|
598
806
|
private addDebugState(serviceType: string): void {
|
|
599
807
|
const debugState = this.setupService(
|
|
600
|
-
|
|
601
|
-
|
|
808
|
+
'Switch',
|
|
809
|
+
'Debug State',
|
|
602
810
|
`${this.deviceId}-debug-state`,
|
|
603
811
|
);
|
|
604
812
|
|
|
@@ -613,7 +821,7 @@ export class AirConditioner {
|
|
|
613
821
|
const deviceServices = response.services ?? [];
|
|
614
822
|
for (const service of deviceServices) {
|
|
615
823
|
if (service.serviceType === serviceType) {
|
|
616
|
-
this.client.debug(
|
|
824
|
+
this.client.debug('Debug State - Device Info: ' + JSON.stringify(service, null, 2));
|
|
617
825
|
}
|
|
618
826
|
}
|
|
619
827
|
|
|
@@ -628,20 +836,20 @@ export class AirConditioner {
|
|
|
628
836
|
let service: Service;
|
|
629
837
|
|
|
630
838
|
switch (serviceType) {
|
|
631
|
-
case
|
|
839
|
+
case 'Outlet':
|
|
632
840
|
service =
|
|
633
841
|
this.accessory.getService(displayName) ||
|
|
634
842
|
this.accessory.addService(this.Service.Outlet, displayName, serviceIdSuffix);
|
|
635
843
|
break;
|
|
636
844
|
|
|
637
|
-
case
|
|
845
|
+
case 'Switch':
|
|
638
846
|
service =
|
|
639
847
|
this.accessory.getService(displayName) ||
|
|
640
848
|
this.accessory.addService(this.Service.Switch, displayName, serviceIdSuffix);
|
|
641
849
|
break;
|
|
642
850
|
|
|
643
851
|
default:
|
|
644
|
-
this.client.debug(
|
|
852
|
+
this.client.debug('Unknown service type: ' + serviceType + '');
|
|
645
853
|
service =
|
|
646
854
|
this.accessory.getService(displayName) ||
|
|
647
855
|
this.accessory.addService(this.Service.Fan, displayName, serviceIdSuffix);
|