Skip to content

Commit e36f289

Browse files
v1.3.0 (#114)
## [Version 1.3.0](https://github.com/OpenWonderLabs/node-switchbot/releases/tag/v1.2.0) (2022-06-25) ### Changes - Added more Device Types, not all supported though. - Housekeeping and update dependencies **Full Changelog**: v1.2.0...v1.3.0
1 parent 9e923b6 commit e36f289

File tree

8 files changed

+786
-652
lines changed

8 files changed

+786
-652
lines changed

.github/workflows/dependabot.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
name: AutoDependabot
2+
3+
on:
4+
pull_request:
5+
push:
6+
branches:
7+
- beta
8+
9+
jobs:
10+
automerge:
11+
name: Auto-merge dependabot updates
12+
runs-on: ubuntu-latest
13+
steps:
14+
- uses: mitto98/dependabot-automerge-action@master
15+
with:
16+
token: ${{ github.token }}
17+
merge: true

.github/workflows/nodejs-beta.yml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,8 @@ jobs:
2424

2525
publish-npm:
2626
if: github.repository == 'OpenWonderLabs/node-switchbot'
27-
2827
needs: build
29-
3028
runs-on: ubuntu-latest
31-
3229
steps:
3330
- uses: actions/checkout@v3
3431
- uses: actions/setup-node@v3

.github/workflows/nodejs.yml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,8 @@ jobs:
3131
publish-npm:
3232
# publish only if we are on our own repo, event was 'release' (a tag was created) and the tag starts with "v" (aka version tag)
3333
if: github.repository == 'OpenWonderLabs/node-switchbot' && github.event_name == 'release' && startsWith(github.ref, 'refs/tags/v')
34-
3534
needs: build # only run if build succeeds
36-
3735
runs-on: ubuntu-latest
38-
3936
steps:
4037
- uses: actions/checkout@v3
4138
- uses: actions/setup-node@v3

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@
22

33
All notable changes to this project will be documented in this file. This project uses [Semantic Versioning](https://semver.org/)
44

5+
## [Version 1.3.0](https://github.com/OpenWonderLabs/node-switchbot/releases/tag/v1.2.0) (2022-06-25)
6+
7+
### Changes
8+
9+
- Added more Device Types, not all supported though.
10+
- Housekeeping and update dependencies
11+
12+
**Full Changelog**: https://github.com/OpenWonderLabs/node-switchbot/compare/v1.2.0...v1.3.0
13+
514
## [Version 1.2.0](https://github.com/OpenWonderLabs/node-switchbot/releases/tag/v1.2.0) (2022-03-04)
615

716
### Changes

lib/switchbot-advertising.js

Lines changed: 165 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,26 @@ class SwitchbotAdvertising {
7676

7777
if (model === 'H') { // WoHand
7878
sd = this._parseServiceDataForWoHand(buf, onlog);
79-
} else if (model === 'e') { // WoHumi
80-
sd = this._parseServiceDataForWoHumi(buf, onlog);
8179
} else if (model === 'T') { // WoSensorTH
8280
sd = this._parseServiceDataForWoSensorTH(buf, onlog);
83-
} else if (model === 'c') { // WoCurtain
84-
sd = this._parseServiceDataForWoCurtain(buf, onlog);
81+
} else if (model === 'e') { // WoHumi
82+
sd = this._parseServiceDataForWoHumi(buf, onlog);
8583
} else if (model === 's') { // WoMotion
8684
sd = this._parseServiceDataForWoPresence(buf, onlog);
8785
} else if (model === 'd') { // WoContact
8886
sd = this._parseServiceDataForWoContact(buf, onlog);
87+
} else if (model === 'c') { // WoCurtain
88+
sd = this._parseServiceDataForWoCurtain(buf, onlog);
89+
} else if (model === 'u') { // WoColorBulb
90+
sd = this._parseServiceDataForWoColorBulb(buf, onlog);
91+
} else if (model === 'g') { // WoPlugMini
92+
sd = this._parseServiceDataForWoPlugMini(buf, onlog);
93+
} else if (model === 'o') { // WoSmartLock
94+
sd = this._parseServiceDataForWoSmartLock(buf, onlog);
95+
} else if (model === 'i') { // WoMeterPlus
96+
sd = this._parseServiceDataForWoSensorTHPlus(buf, onlog);
97+
} else if (model === 'r') { // WoLEDStripLight
98+
sd = this._parseServiceDataForWoLEDStripLight(buf, onlog);
8999
} else {
90100
if (onlog && typeof onlog === 'function') {
91101
onlog(`[parseAdvertising.${peripheral.id}] return null, model "${model}" not available!`);
@@ -152,34 +162,6 @@ class SwitchbotAdvertising {
152162
return data;
153163
}
154164

155-
_parseServiceDataForWoHumi(buf, onlog) {
156-
if (buf.length !== 8) {
157-
if (onlog && typeof onlog === 'function') {
158-
onlog(`[_parseServiceDataForWoHumi] Buffer length ${buf.length} !== 8!`);
159-
}
160-
return null;
161-
}
162-
let byte1 = buf.readUInt8(1);
163-
// let byte2 = buf.readUInt8(2);
164-
let byte3 = buf.readUInt8(3);
165-
let byte4 = buf.readUInt8(4);
166-
let byte5 = buf.readUInt8(5);
167-
168-
let onState = (byte1 & 0b10000000) ? true : false; // 1 - on
169-
let autoMode = (byte4 & 0b10000000) ? true : false; // 1 - auto
170-
let percentage = byte4 & 0b01111111; // 0-100%, 101/102/103 - Quick gear 1/2/3
171-
172-
let data = {
173-
model: 'e',
174-
modelName: 'WoHumi',
175-
onState: onState,
176-
autoMode: autoMode,
177-
percentage: autoMode ? 0 : percentage,
178-
};
179-
180-
return data;
181-
}
182-
183165
_parseServiceDataForWoSensorTH(buf, onlog) {
184166
if (buf.length !== 6) {
185167
if (onlog && typeof onlog === 'function') {
@@ -212,6 +194,34 @@ class SwitchbotAdvertising {
212194
return data;
213195
}
214196

197+
_parseServiceDataForWoHumi(buf, onlog) {
198+
if (buf.length !== 8) {
199+
if (onlog && typeof onlog === 'function') {
200+
onlog(`[_parseServiceDataForWoHumi] Buffer length ${buf.length} !== 8!`);
201+
}
202+
return null;
203+
}
204+
let byte1 = buf.readUInt8(1);
205+
// let byte2 = buf.readUInt8(2);
206+
let byte3 = buf.readUInt8(3);
207+
let byte4 = buf.readUInt8(4);
208+
let byte5 = buf.readUInt8(5);
209+
210+
let onState = (byte1 & 0b10000000) ? true : false; // 1 - on
211+
let autoMode = (byte4 & 0b10000000) ? true : false; // 1 - auto
212+
let percentage = byte4 & 0b01111111; // 0-100%, 101/102/103 - Quick gear 1/2/3
213+
214+
let data = {
215+
model: 'e',
216+
modelName: 'WoHumi',
217+
onState: onState,
218+
autoMode: autoMode,
219+
percentage: autoMode ? 0 : percentage,
220+
};
221+
222+
return data;
223+
}
224+
215225
_parseServiceDataForWoPresence(buf, onlog) {
216226
if (buf.length !== 6) {
217227
if (onlog && typeof onlog === 'function') {
@@ -303,6 +313,129 @@ class SwitchbotAdvertising {
303313

304314
return data;
305315
}
316+
317+
_parseServiceDataForWoColorBulb(buf, onlog) {
318+
if (buf.length !== 6) {
319+
if (onlog && typeof onlog === 'function') {
320+
onlog(`[_parseServiceDataForWoColorBulb] Buffer length ${buf.length} !== 6!`);
321+
}
322+
return null;
323+
}
324+
let byte1 = buf.readUInt8(1);
325+
let byte2 = buf.readUInt8(2);
326+
// let byte3 = buf.readUInt8(3);
327+
// let byte4 = buf.readUInt8(4);
328+
let byte5 = buf.readUInt8(5);
329+
330+
let data = {
331+
model: 'u',
332+
modelName: 'WoColorBulb',
333+
};
334+
335+
return data;
336+
}
337+
338+
_parseServiceDataForWoPlugMini(buf, onlog) {
339+
if (buf.length !== 6) {
340+
if (onlog && typeof onlog === 'function') {
341+
onlog(`[_parseServiceDataForWoPlugMini] Buffer length ${buf.length} !== 6!`);
342+
}
343+
return null;
344+
}
345+
let byte1 = buf.readUInt8(1);
346+
let byte2 = buf.readUInt8(2);
347+
// let byte3 = buf.readUInt8(3);
348+
// let byte4 = buf.readUInt8(4);
349+
let byte5 = buf.readUInt8(5);
350+
351+
let data = {
352+
model: 'g',
353+
modelName: 'WoPlugMini',
354+
};
355+
356+
return data;
357+
}
358+
359+
_parseServiceDataForWoSmartLock(buf, onlog) {
360+
if (buf.length !== 6) {
361+
if (onlog && typeof onlog === 'function') {
362+
onlog(`[_parseServiceDataForWoSmartLock] Buffer length ${buf.length} !== 6!`);
363+
}
364+
return null;
365+
}
366+
let byte1 = buf.readUInt8(1);
367+
let byte2 = buf.readUInt8(2);
368+
// let byte3 = buf.readUInt8(3);
369+
// let byte4 = buf.readUInt8(4);
370+
let byte5 = buf.readUInt8(5);
371+
372+
//let pirState = (byte1 & 0b01000000) ? true : false; // 1 - Movement detected
373+
let battery = byte2 & 0b01111111; // %
374+
//let lightLevel = byte5 & 0b00000011;
375+
376+
let data = {
377+
model: 'o',
378+
modelName: 'WoSmartLock',
379+
//movement: pirState,
380+
battery: battery,
381+
//lightLevel: (lightLevel == 1) ? 'dark' : ((lightLevel == 2) ? 'bright' : 'unknown'),
382+
};
383+
384+
return data;
385+
}
386+
387+
_parseServiceDataForWoSensorTHPlus(buf, onlog) {
388+
if (buf.length !== 6) {
389+
if (onlog && typeof onlog === 'function') {
390+
onlog(`[_parseServiceDataForWoSensorTHPlus] Buffer length ${buf.length} !== 6!`);
391+
}
392+
return null;
393+
}
394+
let byte2 = buf.readUInt8(2);
395+
let byte3 = buf.readUInt8(3);
396+
let byte4 = buf.readUInt8(4);
397+
let byte5 = buf.readUInt8(5);
398+
399+
let temp_sign = (byte4 & 0b10000000) ? 1 : -1;
400+
let temp_c = temp_sign * ((byte4 & 0b01111111) + (byte3 / 10));
401+
let temp_f = (temp_c * 9 / 5) + 32;
402+
temp_f = Math.round(temp_f * 10) / 10;
403+
404+
let data = {
405+
model: 'i',
406+
modelName: 'WoSensorTHPlus',
407+
temperature: {
408+
c: temp_c,
409+
f: temp_f
410+
},
411+
fahrenheit: (byte5 & 0b10000000) ? true : false,
412+
humidity: byte5 & 0b01111111,
413+
battery: (byte2 & 0b01111111)
414+
};
415+
416+
return data;
417+
}
418+
419+
_parseServiceDataForWoLEDStripLight(buf, onlog) {
420+
if (buf.length !== 6) {
421+
if (onlog && typeof onlog === 'function') {
422+
onlog(`[_parseServiceDataForWoLEDStripLight] Buffer length ${buf.length} !== 6!`);
423+
}
424+
return null;
425+
}
426+
let byte1 = buf.readUInt8(1);
427+
let byte2 = buf.readUInt8(2);
428+
// let byte3 = buf.readUInt8(3);
429+
// let byte4 = buf.readUInt8(4);
430+
let byte5 = buf.readUInt8(5);
431+
432+
let data = {
433+
model: 'r',
434+
modelName: 'WoLEDStripLight',
435+
};
436+
437+
return data;
438+
}
306439
}
307440

308441
module.exports = new SwitchbotAdvertising();

lib/switchbot.js

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,18 @@ class Switchbot {
5151
* - duration | Integer | Optional | Duration for discovery process (msec).
5252
* | | | The value must be in the range of 1 to 60000.
5353
* | | | The default value is 5000 (msec).
54-
* - model | String | Optional | "H", "T", "e", "s", "d", or "c".
54+
* - model | String | Optional | "H", "T", "e", "s", "d", "c", "u", "g", "o", "i", or "r".
5555
* | | | If "H" is specified, this method will discover only Bots.
5656
* | | | If "T" is specified, this method will discover only Meters.
5757
* | | | If "e" is specified, this method will discover only Humidifiers.
5858
* | | | If "s" is specified, this method will discover only Motion Sensors.
5959
* | | | If "d" is specified, this method will discover only Contact Sensors.
6060
* | | | If "c" is specified, this method will discover only Curtains.
61+
* | | | If "u" is specified, this method will discover only Color Bulbs.
62+
* | | | If "g" is specified, this method will discover only Plugs.
63+
* | | | If "o" is specified, this method will discover only Locks.
64+
* | | | If "i" is specified, this method will discover only Meter Pluses.
65+
* | | | If "r" is specified, this method will discover only Locks.
6166
* - id | String | Optional | If this value is set, this method will discover
6267
* | | | only a device whose ID is as same as this value.
6368
* | | | The ID is identical to the MAC address.
@@ -79,7 +84,7 @@ class Switchbot {
7984
// Check the parameters
8085
let valid = parameterChecker.check(params, {
8186
duration: { required: false, type: 'integer', min: 1, max: 60000 },
82-
model: { required: false, type: 'string', enum: ['H', 'T', 'e', 's', 'd', 'c'] },
87+
model: { required: false, type: 'string', enum: ['H', 'T', 'e', 's', 'd', 'c', 'u', 'g', 'o', 'i', 'r'] },
8388
id: { required: false, type: 'string', min: 12, max: 17 },
8489
quick: { required: false, type: 'boolean' }
8590
}, false);
@@ -186,12 +191,12 @@ class Switchbot {
186191
case 'H':
187192
device = new SwitchbotDeviceWoHand(peripheral, this.noble);
188193
break;
189-
case 'e':
190-
device = new SwitchbotDeviceWoHumi(peripheral, this.noble);
191-
break;
192194
case 'T':
193195
device = new SwitchbotDeviceWoSensorTH(peripheral, this.noble);
194196
break;
197+
case 'e':
198+
device = new SwitchbotDeviceWoHumi(peripheral, this.noble);
199+
break;
195200
case 's':
196201
device = new SwitchbotDeviceWoPresence(peripheral, this.noble);
197202
break;
@@ -201,6 +206,21 @@ class Switchbot {
201206
case 'c':
202207
device = new SwitchbotDeviceWoCurtain(peripheral, this.noble);
203208
break;
209+
case 'u':
210+
device = new SwitchbotDeviceWoColorBulb(peripheral, this.noble);
211+
break;
212+
case 'g':
213+
device = new SwitchbotDeviceWoPlugMini(peripheral, this.noble);
214+
break;
215+
case 'o':
216+
device = new SwitchbotDeviceWoSmartLock(peripheral, this.noble);
217+
break;
218+
case 'i':
219+
device = new SwitchbotDeviceWoSensorTHPlus(peripheral, this.noble);
220+
break;
221+
case 'r':
222+
device = new SwitchbotDeviceWoLEDStripLight(peripheral, this.noble);
223+
break;
204224
default: // 'resetting', 'unknown'
205225
device = new SwitchbotDevice(peripheral, this.noble);
206226
}
@@ -235,7 +255,7 @@ class Switchbot {
235255
*
236256
* [Arguments]
237257
* - params | Object | Optional |
238-
* - model | String | Optional | "H", "T", "e", "s", "d", or "c".
258+
* - model | String | Optional | "H", "T", "e", "s", "d", "c", "u", "g", "o", "i", or "r".
239259
* | | | If "H" is specified, the `onadvertisement`
240260
* | | | event handler will be called only when advertising
241261
* | | | packets comes from Bots.
@@ -254,6 +274,21 @@ class Switchbot {
254274
* | | | If "c" is specified, the `onadvertisement`
255275
* | | | event handler will be called only when advertising
256276
* | | | packets comes from Curtains.
277+
* | | | If "u" is specified, the `onadvertisement`
278+
* | | | event handler will be called only when advertising
279+
* | | | packets comes from Color Bulb.
280+
* | | | If "g" is specified, the `onadvertisement`
281+
* | | | event handler will be called only when advertising
282+
* | | | packets comes from Plug Mini.
283+
* | | | If "o" is specified, the `onadvertisement`
284+
* | | | event handler will be called only when advertising
285+
* | | | packets comes from Smart Lock.
286+
* | | | If "i" is specified, the `onadvertisement`
287+
* | | | event handler will be called only when advertising
288+
* | | | packets comes from Meter Plus.
289+
* | | | If "r" is specified, the `onadvertisement`
290+
* | | | event handler will be called only when advertising
291+
* | | | packets comes from LED Strip Light.
257292
* - id | String | Optional | If this value is set, the `onadvertisement`
258293
* | | | event handler will be called only when advertising
259294
* | | | packets comes from devices whose ID is as same as
@@ -270,7 +305,7 @@ class Switchbot {
270305
let promise = new Promise((resolve, reject) => {
271306
// Check the parameters
272307
let valid = parameterChecker.check(params, {
273-
model: { required: false, type: 'string', enum: ['H', 'T', 'e', 's', 'd', 'c'] },
308+
model: { required: false, type: 'string', enum: ['H', 'T', 'e', 's', 'd', 'c', 'u', 'g', 'o', 'i', 'r'] },
274309
id: { required: false, type: 'string', min: 12, max: 17 },
275310
}, false);
276311

0 commit comments

Comments
 (0)