node-switchbot 1.6.0-beta.1 → 1.6.0-beta.11

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.
@@ -198,8 +198,8 @@ class SwitchbotAdvertising {
198
198
  let byte5 = buf.readUInt8(5);
199
199
 
200
200
  let temp_sign = byte4 & 0b10000000 ? 1 : -1;
201
- let temp_c = temp_sign * ((byte4 & 0b01111111) + byte3 / 10);
202
- let temp_f = (temp_c * 9) / 5 + 32;
201
+ let temp_c = temp_sign * ((byte4 & 0b01111111) + (byte3 & 0b00001111) / 10);
202
+ let temp_f = (temp_c * 9 / 5) + 32;
203
203
  temp_f = Math.round(temp_f * 10) / 10;
204
204
 
205
205
  let data = {
@@ -227,10 +227,8 @@ class SwitchbotAdvertising {
227
227
  return null;
228
228
  }
229
229
  let byte1 = buf.readUInt8(1);
230
- // let byte2 = buf.readUInt8(2);
231
- let byte3 = buf.readUInt8(3);
232
230
  let byte4 = buf.readUInt8(4);
233
- let byte5 = buf.readUInt8(5);
231
+
234
232
 
235
233
  let onState = byte1 & 0b10000000 ? true : false; // 1 - on
236
234
  let autoMode = byte4 & 0b10000000 ? true : false; // 1 - auto
@@ -256,23 +254,32 @@ class SwitchbotAdvertising {
256
254
  }
257
255
  return null;
258
256
  }
257
+
259
258
  let byte1 = buf.readUInt8(1);
260
259
  let byte2 = buf.readUInt8(2);
261
- // let byte3 = buf.readUInt8(3);
262
- // let byte4 = buf.readUInt8(4);
263
260
  let byte5 = buf.readUInt8(5);
264
261
 
265
- let pirState = byte1 & 0b01000000 ? true : false; // 1 - Movement detected
266
- let battery = byte2 & 0b01111111; // %
262
+ let tested = byte1 & 0b10000000 ? true : false;
263
+ let movement = byte1 & 0b01000000 ? true : false;
264
+ let battery = byte2 & 0b01111111;
265
+ let led = (byte5 & 0b00100000) >> 5;
266
+ let iot = (byte5 & 0b00010000) >> 4;
267
+ let sense_distance = (byte5 & 0b00001100) >> 2;
267
268
  let lightLevel = byte5 & 0b00000011;
269
+ let is_light = byte5 & 0b00000010 ? true : false;
268
270
 
269
271
  let data = {
270
272
  model: "s",
271
273
  modelName: "WoMotion",
272
- movement: pirState,
274
+ tested: tested,
275
+ movement: movement,
273
276
  battery: battery,
277
+ led: led,
278
+ iot: iot,
279
+ sense_distance: sense_distance,
274
280
  lightLevel:
275
281
  lightLevel == 1 ? "dark" : lightLevel == 2 ? "bright" : "unknown",
282
+ is_light: is_light,
276
283
  };
277
284
 
278
285
  return data;
@@ -291,29 +298,33 @@ class SwitchbotAdvertising {
291
298
  let byte1 = buf.readUInt8(1);
292
299
  let byte2 = buf.readUInt8(2);
293
300
  let byte3 = buf.readUInt8(3);
294
- // let byte4 = buf.readUInt8(4);
295
- // let byte5 = buf.readUInt8(5);
296
- // let byte6 = buf.readUInt8(6);
297
- // let byte7 = buf.readUInt8(7);
298
- // let byte8 = buf.readUInt8(8);
301
+ let byte8 = buf.readUInt8(8);
299
302
 
300
- let pirState = byte1 & 0b01000000 ? true : false; // 1 - Movement detected
301
- let battery = byte2 & 0b01111111; // %
302
303
  let hallState = (byte3 >> 1) & 0b00000011;
304
+ let tested = byte1 & 0b10000000;
305
+ let movement = byte1 & 0b01000000 ? true : false; // 1 - Movement detected
306
+ let battery = byte2 & 0b01111111; // %
307
+ let contact_open = byte3 & 0b00000010 == 0b00000010;
308
+ let contact_timeout = byte3 & 0b00000100 == 0b00000100;
303
309
  let lightLevel = byte3 & 0b00000001;
310
+ let button_count = byte8 & 0b00001111;
304
311
 
305
312
  let data = {
306
313
  model: "d",
307
314
  modelName: "WoContact",
308
- movement: pirState,
315
+ movement: movement,
316
+ tested: tested,
309
317
  battery: battery,
318
+ contact_open: contact_open,
319
+ contact_timeout: contact_timeout,
320
+ lightLevel: lightLevel == 0 ? "dark" : "bright",
321
+ button_count: button_count,
310
322
  doorState:
311
323
  hallState == 0
312
324
  ? "close"
313
325
  : hallState == 1
314
326
  ? "open"
315
327
  : "timeout no closed",
316
- lightLevel: lightLevel == 0 ? "dark" : "bright",
317
328
  };
318
329
 
319
330
  return data;
@@ -332,20 +343,24 @@ class SwitchbotAdvertising {
332
343
  let byte2 = buf.readUInt8(2);
333
344
  let byte3 = buf.readUInt8(3);
334
345
  let byte4 = buf.readUInt8(4);
335
- // let byte5 = buf.readUInt8(5);
336
346
 
337
347
  let calibration = byte1 & 0b01000000 ? true : false; // Whether the calibration is completed
338
348
  let battery = byte2 & 0b01111111; // %
349
+ let inMotion = byte3 & 0b10000000 ? true : false;
339
350
  let currPosition = byte3 & 0b01111111; // current positon %
351
+ //let currPosition = max(min(byte3 & 0b01111111, 100), 0) //byte3 & 0b01111111; // current positon %
340
352
  let lightLevel = (byte4 >> 4) & 0b00001111; // light sensor level (1-10)
353
+ let deviceChain = byte4 & 0b00000111;
341
354
 
342
355
  let data = {
343
356
  model: "c",
344
357
  modelName: "WoCurtain",
345
358
  calibration: calibration,
346
359
  battery: battery,
360
+ inMotion: inMotion,
347
361
  position: currPosition,
348
362
  lightLevel: lightLevel,
363
+ deviceChain: deviceChain,
349
364
  };
350
365
 
351
366
  return data;
@@ -360,28 +375,37 @@ class SwitchbotAdvertising {
360
375
  }
361
376
  return null;
362
377
  }
378
+ let byte1 = buf.readUInt8(1);//power and light status
379
+ let byte2 = buf.readUInt8(2);//bulb brightness
380
+ let byte3 = buf.readUInt8(3);//bulb R
381
+ let byte4 = buf.readUInt8(4);//bulb G
382
+ let byte5 = buf.readUInt8(5);//bulb B
383
+ let byte6 = buf.readUInt8(6);//bulb temperature
384
+ let byte7 = buf.readUInt8(7);
385
+ let byte8 = buf.readUInt8(8);
386
+ let byte9 = buf.readUInt8(9);
387
+ let byte10 = buf.readUInt8(10);//bulb mode
388
+
389
+ let red = byte3;
390
+ let green = byte4;
391
+ let blue = byte5;
392
+ let color_temperature = byte6;
393
+ let state = byte7 & 0b01111111 ? true : false;
394
+ let brightness = byte7 & 0b01111111;
395
+ let delay = byte8 & 0b10000000;
396
+ let preset = byte8 & 0b00001000;
397
+ let color_mode = byte8 & 0b00000111;
398
+ let speed = byte9 & 0b01111111;
399
+ let loop_index = byte10 & 0b11111110;
363
400
 
364
- const byte6 = buf.readUInt8(6);
365
- const byte7 = buf.readUInt8(7);
366
- const byte8 = buf.readUInt8(8);
367
- const byte9 = buf.readUInt8(9);
368
- const byte10 = buf.readUInt8(10);
369
-
370
-
371
- const sequence_number = byte6;
372
- const isOn = byte7 & 0b01111111 ? true : false;
373
- const brightness = byte7 & 0b01111111;
374
- const delay = byte8 & 0b10000000;
375
- const preset = byte8 & 0b00001000;
376
- const color_mode = byte8 & 0b00000111;
377
- const speed = byte9 & 0b01111111;
378
- const loop_index = byte10 & 0b11111110;
379
-
380
- const data = {
401
+ let data = {
381
402
  model: "u",
382
403
  modelName: "WoBulb",
383
- sequence_number: sequence_number,
384
- isOn: isOn,
404
+ color_temperature: color_temperature,
405
+ state: state,
406
+ red: red,
407
+ green: green,
408
+ blue: blue,
385
409
  brightness: brightness,
386
410
  delay: delay,
387
411
  preset: preset,
@@ -402,22 +426,22 @@ class SwitchbotAdvertising {
402
426
  }
403
427
  return null;
404
428
  }
405
- const byte9 = buf.readUInt8(9); // byte9: plug mini state; 0x00=off, 0x80=on
406
- const byte10 = buf.readUInt8(10); // byte10: bit0: 0=no delay,1=delay, bit1:0=no timer, 1=timer; bit2:0=no sync time, 1=sync'ed time
407
- const byte11 = buf.readUInt8(11); // byte11: wifi rssi
408
- const byte12 = buf.readUInt8(12); // byte12: bit7: overload?
409
- const byte13 = buf.readUInt8(13); // byte12[bit0~6] + byte13: current power value
410
-
411
- const state = byte9 === 0x00 ? "off" : byte9 === 0x80 ? "on" : null;
412
- const delay = !!(byte10 & 0b00000001);
413
- const timer = !!(byte10 & 0b00000010);
414
- const syncUtcTime = !!(byte10 & 0b00000100);
415
- const wifiRssi = byte11;
416
- const overload = !!(byte12 & 0b10000000);
417
- const currentPower = (((byte12 & 0b01111111) << 8) + byte13) / 10; // in watt
429
+ let byte9 = buf.readUInt8(9); // byte9: plug mini state; 0x00=off, 0x80=on
430
+ let byte10 = buf.readUInt8(10); // byte10: bit0: 0=no delay,1=delay, bit1:0=no timer, 1=timer; bit2:0=no sync time, 1=sync'ed time
431
+ let byte11 = buf.readUInt8(11); // byte11: wifi rssi
432
+ let byte12 = buf.readUInt8(12); // byte12: bit7: overload?
433
+ let byte13 = buf.readUInt8(13); // byte12[bit0~6] + byte13: current power value
434
+
435
+ let state = byte9 === 0x00 ? "off" : byte9 === 0x80 ? "on" : null;
436
+ let delay = !!(byte10 & 0b00000001);
437
+ let timer = !!(byte10 & 0b00000010);
438
+ let syncUtcTime = !!(byte10 & 0b00000100);
439
+ let wifiRssi = byte11;
440
+ let overload = !!(byte12 & 0b10000000);
441
+ let currentPower = (((byte12 & 0b01111111) << 8) + byte13) / 10; // in watt
418
442
  // TODO: voltage ???
419
443
 
420
- const data = {
444
+ let data = {
421
445
  model: "g",
422
446
  modelName: "WoPlugMini",
423
447
  state: state,
@@ -441,22 +465,22 @@ class SwitchbotAdvertising {
441
465
  }
442
466
  return null;
443
467
  }
444
- const byte9 = buf.readUInt8(9); // byte9: plug mini state; 0x00=off, 0x80=on
445
- const byte10 = buf.readUInt8(10); // byte10: bit0: 0=no delay,1=delay, bit1:0=no timer, 1=timer; bit2:0=no sync time, 1=sync'ed time
446
- const byte11 = buf.readUInt8(11); // byte11: wifi rssi
447
- const byte12 = buf.readUInt8(12); // byte12: bit7: overload?
448
- const byte13 = buf.readUInt8(13); // byte12[bit0~6] + byte13: current power value
449
-
450
- const state = byte9 === 0x00 ? "off" : byte9 === 0x80 ? "on" : null;
451
- const delay = !!(byte10 & 0b00000001);
452
- const timer = !!(byte10 & 0b00000010);
453
- const syncUtcTime = !!(byte10 & 0b00000100);
454
- const wifiRssi = byte11;
455
- const overload = !!(byte12 & 0b10000000);
456
- const currentPower = (((byte12 & 0b01111111) << 8) + byte13) / 10; // in watt
468
+ let byte9 = buf.readUInt8(9); // byte9: plug mini state; 0x00=off, 0x80=on
469
+ let byte10 = buf.readUInt8(10); // byte10: bit0: 0=no delay,1=delay, bit1:0=no timer, 1=timer; bit2:0=no sync time, 1=sync'ed time
470
+ let byte11 = buf.readUInt8(11); // byte11: wifi rssi
471
+ let byte12 = buf.readUInt8(12); // byte12: bit7: overload?
472
+ let byte13 = buf.readUInt8(13); // byte12[bit0~6] + byte13: current power value
473
+
474
+ let state = byte9 === 0x00 ? "off" : byte9 === 0x80 ? "on" : null;
475
+ let delay = !!(byte10 & 0b00000001);
476
+ let timer = !!(byte10 & 0b00000010);
477
+ let syncUtcTime = !!(byte10 & 0b00000100);
478
+ let wifiRssi = byte11;
479
+ let overload = !!(byte12 & 0b10000000);
480
+ let currentPower = (((byte12 & 0b01111111) << 8) + byte13) / 10; // in watt
457
481
  // TODO: voltage ???
458
482
 
459
- const data = {
483
+ let data = {
460
484
  model: "j",
461
485
  modelName: "WoPlugMini",
462
486
  state: state,
@@ -482,20 +506,15 @@ class SwitchbotAdvertising {
482
506
  }
483
507
  let byte1 = buf.readUInt8(1);
484
508
  let byte2 = buf.readUInt8(2);
485
- // let byte3 = buf.readUInt8(3);
486
- // let byte4 = buf.readUInt8(4);
487
- let byte5 = buf.readUInt8(5);
488
509
 
489
- //let pirState = (byte1 & 0b01000000) ? true : false; // 1 - Movement detected
510
+ let movement = (byte1 & 0b01000000) ? true : false; // 1 - Movement detected
490
511
  let battery = byte2 & 0b01111111; // %
491
- //let lightLevel = byte5 & 0b00000011;
492
512
 
493
513
  let data = {
494
514
  model: "o",
495
515
  modelName: "WoSmartLock",
496
- //movement: pirState,
497
516
  battery: battery,
498
- //lightLevel: (lightLevel == 1) ? 'dark' : ((lightLevel == 2) ? 'bright' : 'unknown'),
517
+ movement: movement,
499
518
  };
500
519
 
501
520
  return data;
@@ -516,8 +535,8 @@ class SwitchbotAdvertising {
516
535
  let byte5 = buf.readUInt8(5);
517
536
 
518
537
  let temp_sign = byte4 & 0b10000000 ? 1 : -1;
519
- let temp_c = temp_sign * ((byte4 & 0b01111111) + byte3 / 10);
520
- let temp_f = (temp_c * 9) / 5 + 32;
538
+ let temp_c = temp_sign * ((byte4 & 0b01111111) + (byte3 & 0b00001111) / 10);
539
+ let temp_f = (temp_c * 9 / 5) + 32;
521
540
  temp_f = Math.round(temp_f * 10) / 10;
522
541
 
523
542
  let data = {
@@ -545,24 +564,35 @@ class SwitchbotAdvertising {
545
564
  return null;
546
565
  }
547
566
 
548
- const byte7 = buf.readUInt8(7);
549
- const byte8 = buf.readUInt8(8);
550
- const byte9 = buf.readUInt8(9);
551
- const byte10 = buf.readUInt8(10);
552
-
553
- const isOn = byte7 & 0b10000000 ? true : false;
554
- const brightness = byte7 & 0b01111111;
555
- const delay = byte8 & 0b10000000;
556
- const preset = byte8 & 0b00001000;
557
- const color_mode = byte8 & 0b00000111;
558
- const speed = byte9 & 0b01111111;
559
- const loop_index = byte10 & 0b11111110;
567
+ let byte1 = buf.readUInt8(1);//power and light status
568
+ let byte2 = buf.readUInt8(2);//bulb brightness
569
+ let byte3 = buf.readUInt8(3);//bulb R
570
+ let byte4 = buf.readUInt8(4);//bulb G
571
+ let byte5 = buf.readUInt8(5);//bulb B
572
+ let byte7 = buf.readUInt8(7);
573
+ let byte8 = buf.readUInt8(8);
574
+ let byte9 = buf.readUInt8(9);
575
+ let byte10 = buf.readUInt8(10);
576
+
577
+ let state = byte7 & 0b10000000 ? true : false;
578
+ let brightness = byte7 & 0b01111111;
579
+ let red = byte3;
580
+ let green = byte4;
581
+ let blue = byte5;
582
+ let delay = byte8 & 0b10000000;
583
+ let preset = byte8 & 0b00001000;
584
+ let color_mode = byte8 & 0b00000111;
585
+ let speed = byte9 & 0b01111111;
586
+ let loop_index = byte10 & 0b11111110;
560
587
 
561
- const data = {
588
+ let data = {
562
589
  model: "r",
563
590
  modelName: "WoStrip",
564
- isOn: isOn,
591
+ state: state,
565
592
  brightness: brightness,
593
+ red: red,
594
+ green: green,
595
+ blue: blue,
566
596
  delay: delay,
567
597
  preset: preset,
568
598
  color_mode: color_mode,
@@ -35,10 +35,114 @@ class SwitchbotDeviceWoBulb extends SwitchbotDevice {
35
35
  }
36
36
 
37
37
  /**
38
- * @returns {Promise<boolean>} resolves with a boolean that tells whether the plug in ON(true) or OFF(false)
38
+ * @returns {Promise<number>} resolves with brightness percent
39
+ */
40
+ setBrightness(brightness) {
41
+ if (typeof brightness != "number") {
42
+ return new Promise((resolve, reject) => {
43
+ reject(
44
+ new Error(
45
+ "The type of target brightness percentage is incorrent: " +
46
+ typeof brightness
47
+ )
48
+ );
49
+ });
50
+ }
51
+ if (brightness > 100) {
52
+ brightness = 100;
53
+ } else if (brightness < 0) {
54
+ brightness = 0;
55
+ }
56
+ return this._setState([0x02, 0x14]);
57
+ }
58
+
59
+ /**
60
+ * @returns {Promise<number>} resolves with brightness percent
61
+ */
62
+ setColorTemperature(color_temperature) {
63
+ if (typeof color_temperature != "number") {
64
+ return new Promise((resolve, reject) => {
65
+ reject(
66
+ new Error(
67
+ "The type of target brightness percentage is incorrent: " +
68
+ typeof brightness
69
+ )
70
+ );
71
+ });
72
+ }
73
+ if (color_temperature > 100) {
74
+ color_temperature = 100;
75
+ } else if (color_temperature < 0) {
76
+ color_temperature = 0;
77
+ }
78
+ return this._setState([0x02, 0x17, color_temperature]);
79
+ }
80
+
81
+ /**
82
+ * @returns {Promise<number>} resolves with brightness percent
39
83
  */
40
- toggle() {
41
- return this._setState([0x02, 0x03]);
84
+ setRGB(brightness, red, green, blue) {
85
+ if (typeof brightness != "number") {
86
+ return new Promise((resolve, reject) => {
87
+ reject(
88
+ new Error(
89
+ "The type of target brightness percentage is incorrent: " +
90
+ typeof brightness
91
+ )
92
+ );
93
+ });
94
+ }
95
+ if (typeof red != "number") {
96
+ return new Promise((resolve, reject) => {
97
+ reject(
98
+ new Error(
99
+ "The type of target red is incorrent: " +
100
+ typeof red
101
+ )
102
+ );
103
+ });
104
+ }
105
+ if (typeof green != "number") {
106
+ return new Promise((resolve, reject) => {
107
+ reject(
108
+ new Error(
109
+ "The type of target green is incorrent: " +
110
+ typeof green
111
+ )
112
+ );
113
+ });
114
+ }
115
+ if (typeof blue != "number") {
116
+ return new Promise((resolve, reject) => {
117
+ reject(
118
+ new Error(
119
+ "The type of target blue is incorrent: " +
120
+ typeof blue
121
+ )
122
+ );
123
+ });
124
+ }
125
+ if (brightness > 100) {
126
+ brightness = 100;
127
+ } else if (brightness < 0) {
128
+ brightness = 0;
129
+ }
130
+ if (red > 255) {
131
+ red = 255;
132
+ } else if (red < 0) {
133
+ red = 0;
134
+ }
135
+ if (green > 255) {
136
+ green = 255;
137
+ } else if (green < 0) {
138
+ green = 0;
139
+ }
140
+ if (blue > 255) {
141
+ blue = 255;
142
+ } else if (blue < 0) {
143
+ blue = 0;
144
+ }
145
+ return this._setState([0x02, 0x12, brightness, red, green, blue]);
42
146
  }
43
147
 
44
148
  /**
@@ -35,10 +35,108 @@ class SwitchbotDeviceWoStrip extends SwitchbotDevice {
35
35
  }
36
36
 
37
37
  /**
38
- * @returns {Promise<boolean>} resolves with a boolean that tells whether the plug in ON(true) or OFF(false)
38
+ * @returns {Promise<number>} resolves with brightness percent
39
+ */
40
+ setBrightness(brightness) {
41
+ if (typeof brightness != "number") {
42
+ return new Promise((resolve, reject) => {
43
+ reject(
44
+ new Error(
45
+ "The type of target brightness percentage is incorrent: " +
46
+ typeof brightness
47
+ )
48
+ );
49
+ });
50
+ }
51
+ if (brightness > 100) {
52
+ brightness = 100;
53
+ } else if (brightness < 0) {
54
+ brightness = 0;
55
+ }
56
+ return this._setState([0x02, 0x14]);
57
+ }
58
+
59
+ /**
60
+ * @returns {Promise<number>} resolves with color temperature
61
+ */
62
+ setColorTemperature(color_temperature) {
63
+ if (color_temperature) {
64
+ return new Promise((resolve, reject) => {
65
+ reject(
66
+ new Error(
67
+ "Strip Light Doesn't Support Color temperature: " +
68
+ typeof color_temperature
69
+ )
70
+ );
71
+ });
72
+ }
73
+ }
74
+
75
+ /**
76
+ * @returns {Promise<number>} resolves with brightness + rgb
39
77
  */
40
- toggle() {
41
- return this._setState([0x02, 0x03]);
78
+ setRGB(brightness, red, green, blue) {
79
+ if (typeof brightness != "number") {
80
+ return new Promise((resolve, reject) => {
81
+ reject(
82
+ new Error(
83
+ "The type of target brightness percentage is incorrent: " +
84
+ typeof brightness
85
+ )
86
+ );
87
+ });
88
+ }
89
+ if (typeof red != "number") {
90
+ return new Promise((resolve, reject) => {
91
+ reject(
92
+ new Error(
93
+ "The type of target red is incorrent: " +
94
+ typeof red
95
+ )
96
+ );
97
+ });
98
+ }
99
+ if (typeof green != "number") {
100
+ return new Promise((resolve, reject) => {
101
+ reject(
102
+ new Error(
103
+ "The type of target green is incorrent: " +
104
+ typeof green
105
+ )
106
+ );
107
+ });
108
+ }
109
+ if (typeof blue != "number") {
110
+ return new Promise((resolve, reject) => {
111
+ reject(
112
+ new Error(
113
+ "The type of target blue is incorrent: " +
114
+ typeof blue
115
+ )
116
+ );
117
+ });
118
+ }
119
+ if (brightness > 100) {
120
+ brightness = 100;
121
+ } else if (brightness < 0) {
122
+ brightness = 0;
123
+ }
124
+ if (red > 255) {
125
+ red = 255;
126
+ } else if (red < 0) {
127
+ red = 0;
128
+ }
129
+ if (green > 255) {
130
+ green = 255;
131
+ } else if (green < 0) {
132
+ green = 0;
133
+ }
134
+ if (blue > 255) {
135
+ blue = 255;
136
+ } else if (blue < 0) {
137
+ blue = 0;
138
+ }
139
+ return this._setState([0x02, 0x12, brightness, red, green, blue]);
42
140
  }
43
141
 
44
142
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-switchbot",
3
- "version": "1.6.0-beta.1",
3
+ "version": "1.6.0-beta.11",
4
4
  "description": "The node-switchbot is a Node.js module which allows you to control your Switchbot Devices through Bluetooth (BLE).",
5
5
  "main": "./lib/switchbot.js",
6
6
  "files": [