node-switchbot 1.6.0-beta.1 → 1.6.0-beta.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.
@@ -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,34 @@ class SwitchbotAdvertising {
256
254
  }
257
255
  return null;
258
256
  }
257
+
258
+
259
259
  let byte1 = buf.readUInt8(1);
260
260
  let byte2 = buf.readUInt8(2);
261
- // let byte3 = buf.readUInt8(3);
262
- // let byte4 = buf.readUInt8(4);
263
261
  let byte5 = buf.readUInt8(5);
264
262
 
265
- let pirState = byte1 & 0b01000000 ? true : false; // 1 - Movement detected
266
- let battery = byte2 & 0b01111111; // %
263
+
264
+ let tested = byte1 & 0b10000000 ? true : false;
265
+ let movement = byte1 & 0b01000000 ? true : false;
266
+ let battery = byte2 & 0b01111111;
267
+ let led = (byte5 & 0b00100000) >> 5;
268
+ let iot = (byte5 & 0b00010000) >> 4;
269
+ let sense_distance = (byte5 & 0b00001100) >> 2;
267
270
  let lightLevel = byte5 & 0b00000011;
271
+ let is_light = byte5 & 0b00000010 ? true : false;
268
272
 
269
273
  let data = {
270
274
  model: "s",
271
275
  modelName: "WoMotion",
272
- movement: pirState,
276
+ tested: tested,
277
+ movement: movement,
273
278
  battery: battery,
279
+ led: led,
280
+ iot: iot,
281
+ sense_distance: sense_distance,
274
282
  lightLevel:
275
283
  lightLevel == 1 ? "dark" : lightLevel == 2 ? "bright" : "unknown",
284
+ is_light: is_light,
276
285
  };
277
286
 
278
287
  return data;
@@ -291,29 +300,33 @@ class SwitchbotAdvertising {
291
300
  let byte1 = buf.readUInt8(1);
292
301
  let byte2 = buf.readUInt8(2);
293
302
  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);
303
+ let byte8 = buf.readUInt8(8);
299
304
 
300
- let pirState = byte1 & 0b01000000 ? true : false; // 1 - Movement detected
301
- let battery = byte2 & 0b01111111; // %
302
305
  let hallState = (byte3 >> 1) & 0b00000011;
306
+ let tested = byte1 & 0b10000000;
307
+ let movement = byte1 & 0b01000000 ? true : false; // 1 - Movement detected
308
+ let battery = byte2 & 0b01111111; // %
309
+ let contact_open = byte3 & 0b00000010 == 0b00000010;
310
+ let contact_timeout = byte3 & 0b00000100 == 0b00000100;
303
311
  let lightLevel = byte3 & 0b00000001;
312
+ let button_count = byte8 & 0b00001111;
304
313
 
305
314
  let data = {
306
315
  model: "d",
307
316
  modelName: "WoContact",
308
- movement: pirState,
317
+ movement: movement,
318
+ tested: tested,
309
319
  battery: battery,
320
+ contact_open: contact_open,
321
+ contact_timeout: contact_timeout,
322
+ lightLevel: lightLevel == 0 ? "dark" : "bright",
323
+ button_count: button_count,
310
324
  doorState:
311
325
  hallState == 0
312
326
  ? "close"
313
327
  : hallState == 1
314
328
  ? "open"
315
329
  : "timeout no closed",
316
- lightLevel: lightLevel == 0 ? "dark" : "bright",
317
330
  };
318
331
 
319
332
  return data;
@@ -332,20 +345,24 @@ class SwitchbotAdvertising {
332
345
  let byte2 = buf.readUInt8(2);
333
346
  let byte3 = buf.readUInt8(3);
334
347
  let byte4 = buf.readUInt8(4);
335
- // let byte5 = buf.readUInt8(5);
336
348
 
337
349
  let calibration = byte1 & 0b01000000 ? true : false; // Whether the calibration is completed
338
350
  let battery = byte2 & 0b01111111; // %
351
+ let inMotion = byte3 & 0b10000000 ? true : false;
339
352
  let currPosition = byte3 & 0b01111111; // current positon %
353
+ //let currPosition = max(min(byte3 & 0b01111111, 100), 0) //byte3 & 0b01111111; // current positon %
340
354
  let lightLevel = (byte4 >> 4) & 0b00001111; // light sensor level (1-10)
355
+ let deviceChain = byte4 & 0b00000111;
341
356
 
342
357
  let data = {
343
358
  model: "c",
344
359
  modelName: "WoCurtain",
345
360
  calibration: calibration,
346
361
  battery: battery,
362
+ inMotion: inMotion,
347
363
  position: currPosition,
348
364
  lightLevel: lightLevel,
365
+ deviceChain: deviceChain,
349
366
  };
350
367
 
351
368
  return data;
@@ -360,28 +377,37 @@ class SwitchbotAdvertising {
360
377
  }
361
378
  return null;
362
379
  }
380
+ let byte1 = buf.readUInt8(1);//power and light status
381
+ let byte2 = buf.readUInt8(2);//bulb brightness
382
+ let byte3 = buf.readUInt8(3);//bulb R
383
+ let byte4 = buf.readUInt8(4);//bulb G
384
+ let byte5 = buf.readUInt8(5);//bulb B
385
+ let byte6 = buf.readUInt8(6);//bulb temperature
386
+ let byte7 = buf.readUInt8(7);
387
+ let byte8 = buf.readUInt8(8);
388
+ let byte9 = buf.readUInt8(9);
389
+ let byte10 = buf.readUInt8(10);//bulb mode
390
+
391
+ let red = byte3;
392
+ let green = byte4;
393
+ let blue = byte5;
394
+ let color_temperature = byte6;
395
+ let state = byte7 & 0b01111111 ? true : false;
396
+ let brightness = byte7 & 0b01111111;
397
+ let delay = byte8 & 0b10000000;
398
+ let preset = byte8 & 0b00001000;
399
+ let color_mode = byte8 & 0b00000111;
400
+ let speed = byte9 & 0b01111111;
401
+ let loop_index = byte10 & 0b11111110;
363
402
 
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 = {
403
+ let data = {
381
404
  model: "u",
382
405
  modelName: "WoBulb",
383
- sequence_number: sequence_number,
384
- isOn: isOn,
406
+ color_temperature: color_temperature,
407
+ state: state,
408
+ red: red,
409
+ green: green,
410
+ blue: blue,
385
411
  brightness: brightness,
386
412
  delay: delay,
387
413
  preset: preset,
@@ -402,22 +428,22 @@ class SwitchbotAdvertising {
402
428
  }
403
429
  return null;
404
430
  }
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
431
+ let byte9 = buf.readUInt8(9); // byte9: plug mini state; 0x00=off, 0x80=on
432
+ 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
433
+ let byte11 = buf.readUInt8(11); // byte11: wifi rssi
434
+ let byte12 = buf.readUInt8(12); // byte12: bit7: overload?
435
+ let byte13 = buf.readUInt8(13); // byte12[bit0~6] + byte13: current power value
436
+
437
+ let state = byte9 === 0x00 ? "off" : byte9 === 0x80 ? "on" : null;
438
+ let delay = !!(byte10 & 0b00000001);
439
+ let timer = !!(byte10 & 0b00000010);
440
+ let syncUtcTime = !!(byte10 & 0b00000100);
441
+ let wifiRssi = byte11;
442
+ let overload = !!(byte12 & 0b10000000);
443
+ let currentPower = (((byte12 & 0b01111111) << 8) + byte13) / 10; // in watt
418
444
  // TODO: voltage ???
419
445
 
420
- const data = {
446
+ let data = {
421
447
  model: "g",
422
448
  modelName: "WoPlugMini",
423
449
  state: state,
@@ -441,22 +467,22 @@ class SwitchbotAdvertising {
441
467
  }
442
468
  return null;
443
469
  }
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
470
+ let byte9 = buf.readUInt8(9); // byte9: plug mini state; 0x00=off, 0x80=on
471
+ 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
472
+ let byte11 = buf.readUInt8(11); // byte11: wifi rssi
473
+ let byte12 = buf.readUInt8(12); // byte12: bit7: overload?
474
+ let byte13 = buf.readUInt8(13); // byte12[bit0~6] + byte13: current power value
475
+
476
+ let state = byte9 === 0x00 ? "off" : byte9 === 0x80 ? "on" : null;
477
+ let delay = !!(byte10 & 0b00000001);
478
+ let timer = !!(byte10 & 0b00000010);
479
+ let syncUtcTime = !!(byte10 & 0b00000100);
480
+ let wifiRssi = byte11;
481
+ let overload = !!(byte12 & 0b10000000);
482
+ let currentPower = (((byte12 & 0b01111111) << 8) + byte13) / 10; // in watt
457
483
  // TODO: voltage ???
458
484
 
459
- const data = {
485
+ let data = {
460
486
  model: "j",
461
487
  modelName: "WoPlugMini",
462
488
  state: state,
@@ -482,20 +508,15 @@ class SwitchbotAdvertising {
482
508
  }
483
509
  let byte1 = buf.readUInt8(1);
484
510
  let byte2 = buf.readUInt8(2);
485
- // let byte3 = buf.readUInt8(3);
486
- // let byte4 = buf.readUInt8(4);
487
- let byte5 = buf.readUInt8(5);
488
511
 
489
- //let pirState = (byte1 & 0b01000000) ? true : false; // 1 - Movement detected
512
+ let movement = (byte1 & 0b01000000) ? true : false; // 1 - Movement detected
490
513
  let battery = byte2 & 0b01111111; // %
491
- //let lightLevel = byte5 & 0b00000011;
492
514
 
493
515
  let data = {
494
516
  model: "o",
495
517
  modelName: "WoSmartLock",
496
- //movement: pirState,
497
518
  battery: battery,
498
- //lightLevel: (lightLevel == 1) ? 'dark' : ((lightLevel == 2) ? 'bright' : 'unknown'),
519
+ movement: movement,
499
520
  };
500
521
 
501
522
  return data;
@@ -516,8 +537,8 @@ class SwitchbotAdvertising {
516
537
  let byte5 = buf.readUInt8(5);
517
538
 
518
539
  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;
540
+ let temp_c = temp_sign * ((byte4 & 0b01111111) + (byte3 & 0b00001111) / 10);
541
+ let temp_f = (temp_c * 9 / 5) + 32;
521
542
  temp_f = Math.round(temp_f * 10) / 10;
522
543
 
523
544
  let data = {
@@ -545,24 +566,35 @@ class SwitchbotAdvertising {
545
566
  return null;
546
567
  }
547
568
 
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;
569
+ let byte1 = buf.readUInt8(1);//power and light status
570
+ let byte2 = buf.readUInt8(2);//bulb brightness
571
+ let byte3 = buf.readUInt8(3);//bulb R
572
+ let byte4 = buf.readUInt8(4);//bulb G
573
+ let byte5 = buf.readUInt8(5);//bulb B
574
+ let byte7 = buf.readUInt8(7);
575
+ let byte8 = buf.readUInt8(8);
576
+ let byte9 = buf.readUInt8(9);
577
+ let byte10 = buf.readUInt8(10);
578
+
579
+ let state = byte7 & 0b10000000 ? true : false;
580
+ let brightness = byte7 & 0b01111111;
581
+ let red = byte3;
582
+ let green = byte4;
583
+ let blue = byte5;
584
+ let delay = byte8 & 0b10000000;
585
+ let preset = byte8 & 0b00001000;
586
+ let color_mode = byte8 & 0b00000111;
587
+ let speed = byte9 & 0b01111111;
588
+ let loop_index = byte10 & 0b11111110;
560
589
 
561
- const data = {
590
+ let data = {
562
591
  model: "r",
563
592
  modelName: "WoStrip",
564
- isOn: isOn,
593
+ state: state,
565
594
  brightness: brightness,
595
+ red: red,
596
+ green: green,
597
+ blue: blue,
566
598
  delay: delay,
567
599
  preset: preset,
568
600
  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.10",
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": [