tsvesync 1.0.40 → 1.0.42

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.
@@ -12,6 +12,10 @@ export declare class VeSyncAirBypass extends VeSyncFan {
12
12
  protected readonly displayModes: readonly ["on", "off"];
13
13
  protected readonly childLockModes: readonly ["on", "off"];
14
14
  constructor(details: Record<string, any>, manager: VeSync);
15
+ /**
16
+ * Build API dictionary
17
+ */
18
+ protected buildApiDict(method: string): [Record<string, any>, Record<string, any>];
15
19
  /**
16
20
  * Get device details
17
21
  */
@@ -57,17 +61,21 @@ export declare class VeSyncAirBypass extends VeSyncFan {
57
61
  */
58
62
  automaticStopOff(): Promise<boolean>;
59
63
  /**
60
- * Set auto mode
64
+ * Set mode
61
65
  */
62
- autoMode(): Promise<boolean>;
66
+ mode_toggle(mode: string): Promise<boolean>;
63
67
  /**
64
68
  * Set manual mode
65
69
  */
66
- manualMode(): Promise<boolean>;
70
+ manual_mode(): Promise<boolean>;
67
71
  /**
68
72
  * Set sleep mode
69
73
  */
70
- sleepMode(): Promise<boolean>;
74
+ sleep_mode(): Promise<boolean>;
75
+ /**
76
+ * Set auto mode
77
+ */
78
+ auto_mode(): Promise<boolean>;
71
79
  /**
72
80
  * Turn off display
73
81
  */
@@ -76,6 +84,10 @@ export declare class VeSyncAirBypass extends VeSyncFan {
76
84
  * Turn on display
77
85
  */
78
86
  turnOnDisplay(): Promise<boolean>;
87
+ /**
88
+ * Display device info
89
+ */
90
+ display(): void;
79
91
  }
80
92
  /**
81
93
  * VeSync Humidifier Base Class
@@ -153,6 +165,10 @@ export declare class VeSyncHumidifier extends VeSyncFan {
153
165
  * Set manual mode
154
166
  */
155
167
  setManualMode(): Promise<boolean>;
168
+ /**
169
+ * Set sleep mode
170
+ */
171
+ sleepMode(): Promise<boolean>;
156
172
  /**
157
173
  * Turn off display
158
174
  */
@@ -235,7 +251,23 @@ export declare class VeSyncAirBaseV2 extends VeSyncAirBypass {
235
251
  /**
236
252
  * Set mode
237
253
  */
238
- protected mode_toggle(mode: string): Promise<boolean>;
254
+ mode_toggle(mode: string): Promise<boolean>;
255
+ /**
256
+ * Set manual mode
257
+ */
258
+ manual_mode(): Promise<boolean>;
259
+ /**
260
+ * Set sleep mode
261
+ */
262
+ sleep_mode(): Promise<boolean>;
263
+ /**
264
+ * Set auto mode
265
+ */
266
+ auto_mode(): Promise<boolean>;
267
+ /**
268
+ * Set turbo mode
269
+ */
270
+ turbo_mode(): Promise<boolean>;
239
271
  }
240
272
  /**
241
273
  * VeSync Tower Fan Implementation
@@ -19,6 +19,23 @@ class VeSyncAirBypass extends vesyncFan_1.VeSyncFan {
19
19
  this.childLockModes = ['on', 'off'];
20
20
  logger_1.logger.debug(`Initialized VeSyncAirBypass device: ${this.deviceName}`);
21
21
  }
22
+ /**
23
+ * Build API dictionary
24
+ */
25
+ buildApiDict(method) {
26
+ const head = helpers_1.Helpers.reqHeaderBypass();
27
+ const body = {
28
+ ...helpers_1.Helpers.reqBody(this.manager, 'bypassV2'),
29
+ deviceId: this.cid,
30
+ configModule: this.configModule,
31
+ payload: {
32
+ method,
33
+ source: 'APP',
34
+ data: {}
35
+ }
36
+ };
37
+ return [head, body];
38
+ }
22
39
  /**
23
40
  * Get device details
24
41
  */
@@ -406,37 +423,79 @@ class VeSyncAirBypass extends vesyncFan_1.VeSyncFan {
406
423
  return success;
407
424
  }
408
425
  /**
409
- * Set auto mode
426
+ * Set mode
410
427
  */
411
- async autoMode() {
412
- logger_1.logger.debug(`Setting auto mode for device: ${this.deviceName}`);
413
- const success = await this.setMode('auto');
414
- if (!success) {
415
- logger_1.logger.error(`Failed to set auto mode for device: ${this.deviceName}`);
428
+ async mode_toggle(mode) {
429
+ if (!this.modes.includes(mode.toLowerCase())) {
430
+ logger_1.logger.debug(`Invalid purifier mode used - ${mode}`);
431
+ return false;
432
+ }
433
+ const [head, body] = this.buildApiDict('setPurifierMode');
434
+ if (!head || !body) {
435
+ return false;
436
+ }
437
+ if (mode === 'manual') {
438
+ body.payload = {
439
+ data: {
440
+ id: 0,
441
+ level: 1,
442
+ type: 'wind'
443
+ },
444
+ method: 'setLevel',
445
+ type: 'APP'
446
+ };
447
+ }
448
+ else {
449
+ body.payload.data = {
450
+ mode: mode.toLowerCase()
451
+ };
452
+ }
453
+ const [response, status] = await this.callApi('/cloud/v2/deviceManaged/bypassV2', 'post', body, head);
454
+ const success = this.checkResponse([response, status], 'mode_toggle');
455
+ if (success) {
456
+ if (mode === 'manual') {
457
+ this.details.speed = 1;
458
+ this.details.mode = 'manual';
459
+ }
460
+ else {
461
+ this.details.mode = mode;
462
+ this.details.speed = 0;
463
+ }
464
+ }
465
+ else {
466
+ logger_1.logger.debug('Error setting purifier mode');
416
467
  }
417
468
  return success;
418
469
  }
419
470
  /**
420
471
  * Set manual mode
421
472
  */
422
- async manualMode() {
423
- logger_1.logger.debug(`Setting manual mode for device: ${this.deviceName}`);
424
- const success = await this.setMode('manual');
425
- if (!success) {
426
- logger_1.logger.error(`Failed to set manual mode for device: ${this.deviceName}`);
473
+ async manual_mode() {
474
+ if (!this.modes.includes('manual')) {
475
+ logger_1.logger.debug(`${this.deviceName} does not have manual mode`);
476
+ return false;
427
477
  }
428
- return success;
478
+ return this.mode_toggle('manual');
429
479
  }
430
480
  /**
431
481
  * Set sleep mode
432
482
  */
433
- async sleepMode() {
434
- logger_1.logger.debug(`Setting sleep mode for device: ${this.deviceName}`);
435
- const success = await this.setMode('sleep');
436
- if (!success) {
437
- logger_1.logger.error(`Failed to set sleep mode for device: ${this.deviceName}`);
483
+ async sleep_mode() {
484
+ if (!this.modes.includes('sleep')) {
485
+ logger_1.logger.debug(`${this.deviceName} does not have sleep mode`);
486
+ return false;
438
487
  }
439
- return success;
488
+ return this.mode_toggle('sleep');
489
+ }
490
+ /**
491
+ * Set auto mode
492
+ */
493
+ async auto_mode() {
494
+ if (!this.modes.includes('auto')) {
495
+ logger_1.logger.debug(`${this.deviceName} does not have auto mode`);
496
+ return false;
497
+ }
498
+ return this.mode_toggle('auto');
440
499
  }
441
500
  /**
442
501
  * Turn off display
@@ -460,6 +519,24 @@ class VeSyncAirBypass extends vesyncFan_1.VeSyncFan {
460
519
  }
461
520
  return success;
462
521
  }
522
+ /**
523
+ * Display device info
524
+ */
525
+ display() {
526
+ super.display();
527
+ const info = [
528
+ ['Mode: ', this.details.mode || ''],
529
+ ['Speed: ', this.speed],
530
+ ['Filter Life: ', this.filterLife || 0, '%'],
531
+ ['Air Quality: ', this.details.air_quality || ''],
532
+ ['Display: ', this.details.display || false],
533
+ ['Child Lock: ', this.details.child_lock || false],
534
+ ['Night Light: ', this.details.night_light || 'off']
535
+ ];
536
+ for (const [key, value, unit = ''] of info) {
537
+ logger_1.logger.info(`${key.toString().padEnd(30, '.')} ${value}${unit}`);
538
+ }
539
+ }
463
540
  }
464
541
  exports.VeSyncAirBypass = VeSyncAirBypass;
465
542
  /**
@@ -837,6 +914,17 @@ class VeSyncHumidifier extends vesyncFan_1.VeSyncFan {
837
914
  }
838
915
  return success;
839
916
  }
917
+ /**
918
+ * Set sleep mode
919
+ */
920
+ async sleepMode() {
921
+ logger_1.logger.debug(`Setting sleep mode for device: ${this.deviceName}`);
922
+ const success = await this.setMode('sleep');
923
+ if (!success) {
924
+ logger_1.logger.error(`Failed to set sleep mode for device: ${this.deviceName}`);
925
+ }
926
+ return success;
927
+ }
840
928
  /**
841
929
  * Turn off display
842
930
  */
@@ -1122,6 +1210,34 @@ class VeSyncAirBaseV2 extends VeSyncAirBypass {
1122
1210
  }
1123
1211
  return success;
1124
1212
  }
1213
+ /**
1214
+ * Set manual mode
1215
+ */
1216
+ async manual_mode() {
1217
+ return this.mode_toggle('manual');
1218
+ }
1219
+ /**
1220
+ * Set sleep mode
1221
+ */
1222
+ async sleep_mode() {
1223
+ return this.mode_toggle('sleep');
1224
+ }
1225
+ /**
1226
+ * Set auto mode
1227
+ */
1228
+ async auto_mode() {
1229
+ if (!this.modes.includes('auto')) {
1230
+ logger_1.logger.debug(`${this.deviceName} does not have auto mode`);
1231
+ return false;
1232
+ }
1233
+ return this.mode_toggle('auto');
1234
+ }
1235
+ /**
1236
+ * Set turbo mode
1237
+ */
1238
+ async turbo_mode() {
1239
+ return this.mode_toggle('turbo');
1240
+ }
1125
1241
  }
1126
1242
  exports.VeSyncAirBaseV2 = VeSyncAirBaseV2;
1127
1243
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tsvesync",
3
- "version": "1.0.40",
3
+ "version": "1.0.42",
4
4
  "description": "A TypeScript library for interacting with VeSync smart home devices",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -21,6 +21,24 @@ export class VeSyncAirBypass extends VeSyncFan {
21
21
  logger.debug(`Initialized VeSyncAirBypass device: ${this.deviceName}`);
22
22
  }
23
23
 
24
+ /**
25
+ * Build API dictionary
26
+ */
27
+ protected buildApiDict(method: string): [Record<string, any>, Record<string, any>] {
28
+ const head = Helpers.reqHeaderBypass();
29
+ const body = {
30
+ ...Helpers.reqBody(this.manager, 'bypassV2'),
31
+ deviceId: this.cid,
32
+ configModule: this.configModule,
33
+ payload: {
34
+ method,
35
+ source: 'APP',
36
+ data: {}
37
+ }
38
+ };
39
+ return [head, body];
40
+ }
41
+
24
42
  /**
25
43
  * Get device details
26
44
  */
@@ -515,13 +533,53 @@ export class VeSyncAirBypass extends VeSyncFan {
515
533
  }
516
534
 
517
535
  /**
518
- * Set auto mode
536
+ * Set mode
519
537
  */
520
- async autoMode(): Promise<boolean> {
521
- logger.debug(`Setting auto mode for device: ${this.deviceName}`);
522
- const success = await this.setMode('auto');
523
- if (!success) {
524
- logger.error(`Failed to set auto mode for device: ${this.deviceName}`);
538
+ async mode_toggle(mode: string): Promise<boolean> {
539
+ if (!this.modes.includes(mode.toLowerCase() as any)) {
540
+ logger.debug(`Invalid purifier mode used - ${mode}`);
541
+ return false;
542
+ }
543
+
544
+ const [head, body] = this.buildApiDict('setPurifierMode');
545
+ if (!head || !body) {
546
+ return false;
547
+ }
548
+
549
+ if (mode === 'manual') {
550
+ body.payload = {
551
+ data: {
552
+ id: 0,
553
+ level: 1,
554
+ type: 'wind'
555
+ },
556
+ method: 'setLevel',
557
+ type: 'APP'
558
+ };
559
+ } else {
560
+ body.payload.data = {
561
+ mode: mode.toLowerCase()
562
+ };
563
+ }
564
+
565
+ const [response, status] = await this.callApi(
566
+ '/cloud/v2/deviceManaged/bypassV2',
567
+ 'post',
568
+ body,
569
+ head
570
+ );
571
+
572
+ const success = this.checkResponse([response, status], 'mode_toggle');
573
+ if (success) {
574
+ if (mode === 'manual') {
575
+ this.details.speed = 1;
576
+ this.details.mode = 'manual';
577
+ } else {
578
+ this.details.mode = mode;
579
+ this.details.speed = 0;
580
+ }
581
+ } else {
582
+ logger.debug('Error setting purifier mode');
525
583
  }
526
584
  return success;
527
585
  }
@@ -529,25 +587,34 @@ export class VeSyncAirBypass extends VeSyncFan {
529
587
  /**
530
588
  * Set manual mode
531
589
  */
532
- async manualMode(): Promise<boolean> {
533
- logger.debug(`Setting manual mode for device: ${this.deviceName}`);
534
- const success = await this.setMode('manual');
535
- if (!success) {
536
- logger.error(`Failed to set manual mode for device: ${this.deviceName}`);
590
+ async manual_mode(): Promise<boolean> {
591
+ if (!this.modes.includes('manual')) {
592
+ logger.debug(`${this.deviceName} does not have manual mode`);
593
+ return false;
537
594
  }
538
- return success;
595
+ return this.mode_toggle('manual');
539
596
  }
540
597
 
541
598
  /**
542
599
  * Set sleep mode
543
600
  */
544
- async sleepMode(): Promise<boolean> {
545
- logger.debug(`Setting sleep mode for device: ${this.deviceName}`);
546
- const success = await this.setMode('sleep');
547
- if (!success) {
548
- logger.error(`Failed to set sleep mode for device: ${this.deviceName}`);
601
+ async sleep_mode(): Promise<boolean> {
602
+ if (!this.modes.includes('sleep')) {
603
+ logger.debug(`${this.deviceName} does not have sleep mode`);
604
+ return false;
549
605
  }
550
- return success;
606
+ return this.mode_toggle('sleep');
607
+ }
608
+
609
+ /**
610
+ * Set auto mode
611
+ */
612
+ async auto_mode(): Promise<boolean> {
613
+ if (!this.modes.includes('auto')) {
614
+ logger.debug(`${this.deviceName} does not have auto mode`);
615
+ return false;
616
+ }
617
+ return this.mode_toggle('auto');
551
618
  }
552
619
 
553
620
  /**
@@ -573,6 +640,26 @@ export class VeSyncAirBypass extends VeSyncFan {
573
640
  }
574
641
  return success;
575
642
  }
643
+
644
+ /**
645
+ * Display device info
646
+ */
647
+ override display(): void {
648
+ super.display();
649
+ const info = [
650
+ ['Mode: ', this.details.mode || ''],
651
+ ['Speed: ', this.speed],
652
+ ['Filter Life: ', this.filterLife || 0, '%'],
653
+ ['Air Quality: ', this.details.air_quality || ''],
654
+ ['Display: ', this.details.display || false],
655
+ ['Child Lock: ', this.details.child_lock || false],
656
+ ['Night Light: ', this.details.night_light || 'off']
657
+ ];
658
+
659
+ for (const [key, value, unit = ''] of info) {
660
+ logger.info(`${key.toString().padEnd(30, '.')} ${value}${unit}`);
661
+ }
662
+ }
576
663
  }
577
664
 
578
665
  /**
@@ -1033,6 +1120,18 @@ export class VeSyncHumidifier extends VeSyncFan {
1033
1120
  return success;
1034
1121
  }
1035
1122
 
1123
+ /**
1124
+ * Set sleep mode
1125
+ */
1126
+ async sleepMode(): Promise<boolean> {
1127
+ logger.debug(`Setting sleep mode for device: ${this.deviceName}`);
1128
+ const success = await this.setMode('sleep');
1129
+ if (!success) {
1130
+ logger.error(`Failed to set sleep mode for device: ${this.deviceName}`);
1131
+ }
1132
+ return success;
1133
+ }
1134
+
1036
1135
  /**
1037
1136
  * Turn off display
1038
1137
  */
@@ -1346,7 +1445,7 @@ export class VeSyncAirBaseV2 extends VeSyncAirBypass {
1346
1445
  /**
1347
1446
  * Set mode
1348
1447
  */
1349
- protected async mode_toggle(mode: string): Promise<boolean> {
1448
+ public async mode_toggle(mode: string): Promise<boolean> {
1350
1449
  const validModes = this.modes.map(m => m.toLowerCase());
1351
1450
  if (!validModes.includes(mode.toLowerCase())) {
1352
1451
  logger.debug(`Invalid mode used - ${mode}`);
@@ -1377,6 +1476,38 @@ export class VeSyncAirBaseV2 extends VeSyncAirBypass {
1377
1476
  }
1378
1477
  return success;
1379
1478
  }
1479
+
1480
+ /**
1481
+ * Set manual mode
1482
+ */
1483
+ async manual_mode(): Promise<boolean> {
1484
+ return this.mode_toggle('manual');
1485
+ }
1486
+
1487
+ /**
1488
+ * Set sleep mode
1489
+ */
1490
+ async sleep_mode(): Promise<boolean> {
1491
+ return this.mode_toggle('sleep');
1492
+ }
1493
+
1494
+ /**
1495
+ * Set auto mode
1496
+ */
1497
+ async auto_mode(): Promise<boolean> {
1498
+ if (!this.modes.includes('auto')) {
1499
+ logger.debug(`${this.deviceName} does not have auto mode`);
1500
+ return false;
1501
+ }
1502
+ return this.mode_toggle('auto');
1503
+ }
1504
+
1505
+ /**
1506
+ * Set turbo mode
1507
+ */
1508
+ async turbo_mode(): Promise<boolean> {
1509
+ return this.mode_toggle('turbo');
1510
+ }
1380
1511
  }
1381
1512
 
1382
1513
  /**