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 lastActiveFanSpeed;
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
- private sendCommand;
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
- lastActiveFanSpeed = 'cloud.smarthq.type.fanspeed.low';
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.lastActiveFanSpeed = thermostatService.state.fanSpeed;
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 === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3;
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.lastActiveFanSpeed === fanSpeed);
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 === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3;
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
- this.sendCommand();
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 === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3;
294
+ const stateVal = mode === this.MODE_FANONLY ? 1 : 3;
230
295
  this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
231
- for (const [fanSpeed, service] of this.fanOutlets.entries()) {
232
- service.updateCharacteristic(this.Characteristic.On, this.lastActiveFanSpeed === fanSpeed);
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.sendCommand();
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
- this.sendCommand();
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 speed of supportedFanSpeeds) {
264
- const [displayName] = this.getLastElementAndCapitalize(speed, '.');
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, speed);
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 + (speed || ''));
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 speed of supportedFanSpeeds) {
287
- const [displayName] = this.getLastElementAndCapitalize(speed, '.');
411
+ for (const fanspeedMode of supportedFanSpeeds) {
412
+ const [displayName] = this.getLastElementAndCapitalize(fanspeedMode, '.');
288
413
  const service = this.fanAccessory.getService(displayName);
289
- this.fanOutlets.set(speed, service);
414
+ this.fanOutlets.set(fanspeedMode, service);
290
415
  service
291
416
  .getCharacteristic(this.Characteristic.On)
292
- .onGet(() => this.isOn && this.lastActiveFanSpeed === speed)
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 === 'cloud.smarthq.type.thermostatmode.fanonly' &&
297
- speed === 'cloud.smarthq.type.fanspeed.auto') {
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.lastActiveFanSpeed);
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.lastActiveFanSpeed = speed;
437
+ this.lastActiveFanSpeedMode = fanspeedMode;
309
438
  for (const [fanSpeed, service] of this.fanOutlets.entries()) {
310
- if (fanSpeed !== speed) {
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 === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3;
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
- this.sendCommand();
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
- if (this.lastActiveFanSpeed === speed) {
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
- this.sendCommand();
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
- if (this.debounceTimeout) {
348
- clearTimeout(this.debounceTimeout);
349
- }
350
- this.debounceTimeout = setTimeout(() => {
351
- this.debounceTimeout = null;
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
- catch (error) {
398
- this.platform.log.error(`Error sending command to AC:`, error);
509
+ else {
510
+ this.client.debug("=======================Response from set command : " + response.outcome);
511
+ return response.success;
399
512
  }
400
- }).catch((err) => {
401
- this.platform.log.error(`Error in AC command queue:`, err);
402
- });
403
- return this.commandQueue;
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.lastActiveFanSpeed = state.fanSpeed;
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 === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3);
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.lastActiveFanSpeed === fanSpeed);
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 "Debug State" switch to the parent accessory that logs the current state of the specified service type when toggled on
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("Switch", "Debug State", `${this.deviceId}-debug-state`);
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("Debug State - Device Info: " + JSON.stringify(service, null, 2));
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 "Outlet":
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 "Switch":
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("Unknown service type: " + serviceType + "");
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "homebridge-smarthq-client",
3
- "version": "1.2.5-debug.0",
3
+ "version": "1.2.5-debug.10",
4
4
  "private": false,
5
5
  "description": "Plugin for controlling GE refrigerator, dishwasher, air conditioner via SmartHQ API.",
6
6
  "keywords": [
@@ -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 lastActiveFanSpeed = 'cloud.smarthq.type.fanspeed.low';
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.lastActiveFanSpeed = thermostatService.state.fanSpeed as string;
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 === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3;
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.lastActiveFanSpeed === fanSpeed);
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
- this.sendCommand();
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 === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3;
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
- this.sendCommand();
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 === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3;
375
+ const stateVal = mode === this.MODE_FANONLY ? 1 : 3;
289
376
  this.acThermostat.updateCharacteristic(this.Characteristic.CurrentHeaterCoolerState, stateVal);
290
377
 
291
- for (const [fanSpeed, service] of this.fanOutlets.entries()) {
292
- service.updateCharacteristic(this.Characteristic.On, this.lastActiveFanSpeed === fanSpeed);
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.sendCommand();
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
- this.sendCommand();
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 speed of supportedFanSpeeds) {
335
- const [displayName] = this.getLastElementAndCapitalize(speed, '.');
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, speed);
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 + (speed || ''));
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 speed of supportedFanSpeeds) {
362
- const [displayName] = this.getLastElementAndCapitalize(speed, '.');
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(speed, service);
519
+ this.fanOutlets.set(fanspeedMode, service);
366
520
 
367
521
  service
368
522
  .getCharacteristic(this.Characteristic.On)
369
- .onGet(() => this.isOn && this.lastActiveFanSpeed === speed)
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 === 'cloud.smarthq.type.thermostatmode.fanonly' &&
375
- speed === 'cloud.smarthq.type.fanspeed.auto'
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.lastActiveFanSpeed);
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.lastActiveFanSpeed = speed;
547
+ this.lastActiveFanSpeedMode = fanspeedMode;
389
548
 
390
549
  for (const [fanSpeed, service] of this.fanOutlets.entries()) {
391
- if (fanSpeed !== speed) {
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 === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3;
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
- this.sendCommand();
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
- if (this.lastActiveFanSpeed === speed) {
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
- this.sendCommand();
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
- private sendCommand() {
435
- if (this.debounceTimeout) {
436
- clearTimeout(this.debounceTimeout);
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
- this.debounceTimeout = setTimeout(() => {
440
- this.debounceTimeout = null;
441
- this.executeSendCommand();
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 === 'cloud.smarthq.type.thermostatmode.fanonly' &&
471
- this.lastActiveFanSpeed === 'cloud.smarthq.type.fanspeed.auto'
678
+ this.lastActiveMode === this.MODE_FANONLY &&
679
+ this.lastActiveFanSpeedMode === this.FAN_SPEED_AUTO
472
680
  ) {
473
- command.fanSpeed = 'cloud.smarthq.type.fanspeed.low';
681
+ command.fanSpeed = this.FAN_SPEED_LOW;
474
682
  } else {
475
- command.fanSpeed = this.lastActiveFanSpeed;
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 !== 'cloud.smarthq.type.thermostatmode.fanonly') {
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
- command,
492
- kind: 'service#command',
493
- deviceId: this.deviceId,
494
- serviceDeviceType: 'cloud.smarthq.device.airconditioner',
495
- serviceType: 'cloud.smarthq.service.thermostat.v1',
496
- domainType: 'cloud.smarthq.domain.thermostat',
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 this.commandQueue;
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.lastActiveFanSpeed = state.fanSpeed as string;
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 === 'cloud.smarthq.type.thermostatmode.fanonly' ? 1 : 3);
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.lastActiveFanSpeed === fanSpeed);
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 "Debug State" switch to the parent accessory that logs the current state of the specified service type when toggled on
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
- "Switch",
601
- "Debug State",
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("Debug State - Device Info: " + JSON.stringify(service, null, 2));
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 "Outlet":
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 "Switch":
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("Unknown service type: " + serviceType + "");
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);