homebridge-smarthq-client 1.2.5-debug.8 → 1.2.5-test.0

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