node-switchbot 2.4.0 → 2.5.0-beta.1
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.
- package/.github/npm-version-script.cjs +81 -0
- package/CHANGELOG.md +1 -1
- package/dist/advertising.d.ts +14 -148
- package/dist/advertising.d.ts.map +1 -1
- package/dist/advertising.js +36 -92
- package/dist/advertising.js.map +1 -1
- package/dist/device/woblindtilt.d.ts +98 -13
- package/dist/device/woblindtilt.d.ts.map +1 -1
- package/dist/device/woblindtilt.js +192 -86
- package/dist/device/woblindtilt.js.map +1 -1
- package/dist/device/woblindtilt.test.d.ts +2 -0
- package/dist/device/woblindtilt.test.d.ts.map +1 -0
- package/dist/device/woblindtilt.test.js +26 -0
- package/dist/device/woblindtilt.test.js.map +1 -0
- package/dist/device/wobulb.d.ts +17 -34
- package/dist/device/wobulb.d.ts.map +1 -1
- package/dist/device/wobulb.js +53 -61
- package/dist/device/wobulb.js.map +1 -1
- package/dist/device/wobulb.test.d.ts +2 -0
- package/dist/device/wobulb.test.d.ts.map +1 -0
- package/dist/device/wobulb.test.js +52 -0
- package/dist/device/wobulb.test.js.map +1 -0
- package/dist/device/woceilinglight.d.ts +21 -51
- package/dist/device/woceilinglight.d.ts.map +1 -1
- package/dist/device/woceilinglight.js +53 -64
- package/dist/device/woceilinglight.js.map +1 -1
- package/dist/device/woceilinglight.test.d.ts +2 -0
- package/dist/device/woceilinglight.test.d.ts.map +1 -0
- package/dist/device/woceilinglight.test.js +63 -0
- package/dist/device/woceilinglight.test.js.map +1 -0
- package/dist/device/wocontact.d.ts +1 -14
- package/dist/device/wocontact.d.ts.map +1 -1
- package/dist/device/wocontact.js +13 -13
- package/dist/device/wocontact.js.map +1 -1
- package/dist/device/wocontact.test.d.ts +2 -0
- package/dist/device/wocontact.test.d.ts.map +1 -0
- package/dist/device/wocontact.test.js +34 -0
- package/dist/device/wocontact.test.js.map +1 -0
- package/dist/device/wocurtain.d.ts +5 -16
- package/dist/device/wocurtain.d.ts.map +1 -1
- package/dist/device/wocurtain.js +58 -47
- package/dist/device/wocurtain.js.map +1 -1
- package/dist/device/wocurtain.test.d.ts +2 -0
- package/dist/device/wocurtain.test.d.ts.map +1 -0
- package/dist/device/wocurtain.test.js +33 -0
- package/dist/device/wocurtain.test.js.map +1 -0
- package/dist/device/wohand.d.ts +2 -10
- package/dist/device/wohand.d.ts.map +1 -1
- package/dist/device/wohand.js +31 -33
- package/dist/device/wohand.js.map +1 -1
- package/dist/device/wohand.test.d.ts +2 -0
- package/dist/device/wohand.test.d.ts.map +1 -0
- package/dist/device/wohand.test.js +62 -0
- package/dist/device/wohand.test.js.map +1 -0
- package/dist/device/wohand2.test.d.ts +2 -0
- package/dist/device/wohand2.test.d.ts.map +1 -0
- package/dist/device/wohand2.test.js +50 -0
- package/dist/device/wohand2.test.js.map +1 -0
- package/dist/device/wohub2.d.ts +1 -19
- package/dist/device/wohub2.d.ts.map +1 -1
- package/dist/device/wohub2.js +6 -2
- package/dist/device/wohub2.js.map +1 -1
- package/dist/device/wohumi.d.ts +2 -11
- package/dist/device/wohumi.d.ts.map +1 -1
- package/dist/device/wohumi.js +31 -33
- package/dist/device/wohumi.js.map +1 -1
- package/dist/device/wohumi.test.d.ts +2 -0
- package/dist/device/wohumi.test.d.ts.map +1 -0
- package/dist/device/wohumi.test.js +61 -0
- package/dist/device/wohumi.test.js.map +1 -0
- package/dist/device/woiosensorth.d.ts +1 -19
- package/dist/device/woiosensorth.d.ts.map +1 -1
- package/dist/device/woiosensorth.js +14 -10
- package/dist/device/woiosensorth.js.map +1 -1
- package/dist/device/woiosensorth.test.d.ts +2 -0
- package/dist/device/woiosensorth.test.d.ts.map +1 -0
- package/dist/device/woiosensorth.test.js +39 -0
- package/dist/device/woiosensorth.test.js.map +1 -0
- package/dist/device/woplugmini.d.ts +12 -38
- package/dist/device/woplugmini.d.ts.map +1 -1
- package/dist/device/woplugmini.js +35 -40
- package/dist/device/woplugmini.js.map +1 -1
- package/dist/device/woplugmini.test.d.ts +2 -0
- package/dist/device/woplugmini.test.d.ts.map +1 -0
- package/dist/device/woplugmini.test.js +91 -0
- package/dist/device/woplugmini.test.js.map +1 -0
- package/dist/device/wopresence.d.ts +2 -14
- package/dist/device/wopresence.d.ts.map +1 -1
- package/dist/device/wopresence.js +11 -7
- package/dist/device/wopresence.js.map +1 -1
- package/dist/device/wopresence.test.d.ts +2 -0
- package/dist/device/wopresence.test.d.ts.map +1 -0
- package/dist/device/wopresence.test.js +42 -0
- package/dist/device/wopresence.test.js.map +1 -0
- package/dist/device/wosensorth.d.ts +3 -37
- package/dist/device/wosensorth.d.ts.map +1 -1
- package/dist/device/wosensorth.js +24 -20
- package/dist/device/wosensorth.js.map +1 -1
- package/dist/device/wosensorth.test.d.ts +2 -0
- package/dist/device/wosensorth.test.d.ts.map +1 -0
- package/dist/device/wosensorth.test.js +59 -0
- package/dist/device/wosensorth.test.js.map +1 -0
- package/dist/device/wosmartlock.d.ts +19 -33
- package/dist/device/wosmartlock.d.ts.map +1 -1
- package/dist/device/wosmartlock.js +104 -83
- package/dist/device/wosmartlock.js.map +1 -1
- package/dist/device/wosmartlock.test.d.ts +2 -0
- package/dist/device/wosmartlock.test.d.ts.map +1 -0
- package/dist/device/wosmartlock.test.js +84 -0
- package/dist/device/wosmartlock.test.js.map +1 -0
- package/dist/device/wosmartlockpro.d.ts +13 -27
- package/dist/device/wosmartlockpro.d.ts.map +1 -1
- package/dist/device/wosmartlockpro.js +90 -70
- package/dist/device/wosmartlockpro.js.map +1 -1
- package/dist/device/wosmartlockpro.test.d.ts +2 -0
- package/dist/device/wosmartlockpro.test.d.ts.map +1 -0
- package/dist/device/wosmartlockpro.test.js +124 -0
- package/dist/device/wosmartlockpro.test.js.map +1 -0
- package/dist/device/wostrip.d.ts +18 -32
- package/dist/device/wostrip.d.ts.map +1 -1
- package/dist/device/wostrip.js +58 -70
- package/dist/device/wostrip.js.map +1 -1
- package/dist/device/wostrip.test.d.ts +2 -0
- package/dist/device/wostrip.test.d.ts.map +1 -0
- package/dist/device/wostrip.test.js +115 -0
- package/dist/device/wostrip.test.js.map +1 -0
- package/dist/device.d.ts +237 -39
- package/dist/device.d.ts.map +1 -1
- package/dist/device.js +478 -366
- package/dist/device.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/parameter-checker.d.ts.map +1 -1
- package/dist/parameter-checker.js.map +1 -1
- package/dist/settings.d.ts +8 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +12 -0
- package/dist/settings.js.map +1 -0
- package/dist/switchbot.d.ts +30 -9
- package/dist/switchbot.d.ts.map +1 -1
- package/dist/switchbot.js +48 -78
- package/dist/switchbot.js.map +1 -1
- package/dist/types/bledevicestatus.d.ts +288 -0
- package/dist/types/bledevicestatus.d.ts.map +1 -0
- package/dist/types/bledevicestatus.js +2 -0
- package/dist/types/bledevicestatus.js.map +1 -0
- package/dist/types/devicelist.d.ts +89 -0
- package/dist/types/devicelist.d.ts.map +1 -0
- package/dist/types/devicelist.js +6 -0
- package/dist/types/devicelist.js.map +1 -0
- package/dist/types/deviceresponse.d.ts +13 -0
- package/dist/types/deviceresponse.d.ts.map +1 -0
- package/dist/types/deviceresponse.js +2 -0
- package/dist/types/deviceresponse.js.map +1 -0
- package/dist/types/devicestatus.d.ts +149 -0
- package/dist/types/devicestatus.d.ts.map +1 -0
- package/dist/types/devicestatus.js +3 -0
- package/dist/types/devicestatus.js.map +1 -0
- package/dist/types/devicewebhookstatus.d.ts +156 -0
- package/dist/types/devicewebhookstatus.d.ts.map +1 -0
- package/dist/types/devicewebhookstatus.js +2 -0
- package/dist/types/devicewebhookstatus.js.map +1 -0
- package/dist/types/irdevicelist.d.ts +10 -0
- package/dist/types/irdevicelist.d.ts.map +1 -0
- package/dist/types/irdevicelist.js +2 -0
- package/dist/types/irdevicelist.js.map +1 -0
- package/dist/types/pushbody.d.ts +6 -0
- package/dist/types/pushbody.d.ts.map +1 -0
- package/dist/types/pushbody.js +2 -0
- package/dist/types/pushbody.js.map +1 -0
- package/dist/{types.d.ts → types/types.d.ts} +9 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js.map +1 -0
- package/jest.config.js +3 -0
- package/package.json +22 -14
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- /package/dist/{types.js → types/types.js} +0 -0
package/dist/device/wobulb.js
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
1
2
|
/* Copyright(C) 2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
|
|
2
3
|
*
|
|
3
4
|
* wobulb.ts: Switchbot BLE API registration.
|
|
4
5
|
*/
|
|
5
|
-
import { Buffer } from 'node:buffer';
|
|
6
6
|
import { SwitchbotDevice } from '../device.js';
|
|
7
|
-
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';
|
|
7
|
+
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js';
|
|
8
8
|
/**
|
|
9
9
|
* @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/blob/latest/devicetypes/colorbulb.md
|
|
10
10
|
*/
|
|
11
11
|
export class WoBulb extends SwitchbotDevice {
|
|
12
|
-
static parseServiceData(manufacturerData, onlog) {
|
|
12
|
+
static async parseServiceData(serviceData, manufacturerData, onlog) {
|
|
13
|
+
if (serviceData.length !== 18) {
|
|
14
|
+
if (onlog && typeof onlog === 'function') {
|
|
15
|
+
onlog(`[parseServiceDataForWoBulb] Buffer length ${serviceData.length} !== 18!`);
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
13
19
|
if (manufacturerData.length !== 13) {
|
|
14
20
|
if (onlog && typeof onlog === 'function') {
|
|
15
21
|
onlog(`[parseServiceDataForWoBulb] Buffer length ${manufacturerData.length} !== 13!`);
|
|
@@ -58,38 +64,36 @@ export class WoBulb extends SwitchbotDevice {
|
|
|
58
64
|
return data;
|
|
59
65
|
}
|
|
60
66
|
/**
|
|
61
|
-
* @returns
|
|
67
|
+
* @returns resolves with a boolean that tells whether the plug in ON(true) or OFF(false)
|
|
62
68
|
*/
|
|
63
|
-
readState() {
|
|
64
|
-
return this.
|
|
69
|
+
async readState() {
|
|
70
|
+
return await this.operateBulb([0x57, 0x0F, 0x48, 0x01]);
|
|
65
71
|
}
|
|
66
72
|
/**
|
|
67
73
|
* @private
|
|
68
74
|
*/
|
|
69
|
-
|
|
75
|
+
async setState(reqByteArray) {
|
|
70
76
|
const base = [0x57, 0x0F, 0x47, 0x01];
|
|
71
|
-
return this.
|
|
77
|
+
return await this.operateBulb(base.concat(reqByteArray));
|
|
72
78
|
}
|
|
73
79
|
/**
|
|
74
|
-
* @returns
|
|
80
|
+
* @returns resolves with a boolean that tells whether the plug in ON(true) or OFF(false)
|
|
75
81
|
*/
|
|
76
|
-
turnOn() {
|
|
77
|
-
return this.
|
|
82
|
+
async turnOn() {
|
|
83
|
+
return await this.setState([0x01, 0x01]);
|
|
78
84
|
}
|
|
79
85
|
/**
|
|
80
|
-
* @returns
|
|
86
|
+
* @returns resolves with a boolean that tells whether the plug in ON(true) or OFF(false)
|
|
81
87
|
*/
|
|
82
|
-
turnOff() {
|
|
83
|
-
return this.
|
|
88
|
+
async turnOff() {
|
|
89
|
+
return await this.setState([0x01, 0x02]);
|
|
84
90
|
}
|
|
85
91
|
/**
|
|
86
|
-
* @returns
|
|
92
|
+
* @returns resolves with brightness percent
|
|
87
93
|
*/
|
|
88
|
-
setBrightness(brightness) {
|
|
94
|
+
async setBrightness(brightness) {
|
|
89
95
|
if (typeof brightness !== 'number') {
|
|
90
|
-
|
|
91
|
-
reject(new Error(`The type of target brightness percentage is incorrect: ${typeof brightness}`));
|
|
92
|
-
});
|
|
96
|
+
throw new TypeError(`The type of target brightness percentage is incorrect: ${typeof brightness}`);
|
|
93
97
|
}
|
|
94
98
|
if (brightness > 100) {
|
|
95
99
|
brightness = 100;
|
|
@@ -97,48 +101,38 @@ export class WoBulb extends SwitchbotDevice {
|
|
|
97
101
|
else if (brightness < 0) {
|
|
98
102
|
brightness = 0;
|
|
99
103
|
}
|
|
100
|
-
return this.
|
|
104
|
+
return await this.setState([0x02, 0x14, brightness]);
|
|
101
105
|
}
|
|
102
106
|
/**
|
|
103
|
-
* @returns
|
|
107
|
+
* @returns resolves with color_temperature percent
|
|
104
108
|
*/
|
|
105
|
-
setColorTemperature(color_temperature) {
|
|
109
|
+
async setColorTemperature(color_temperature) {
|
|
106
110
|
if (typeof color_temperature !== 'number') {
|
|
107
|
-
|
|
108
|
-
reject(new Error(`The type of target color_temperature percentage is incorrect: ${typeof color_temperature}`));
|
|
109
|
-
});
|
|
111
|
+
throw new TypeError(`The type of target color_temperature percentage is incorrect: ${typeof color_temperature}`);
|
|
110
112
|
}
|
|
111
|
-
if (color_temperature > 100) {
|
|
113
|
+
else if (color_temperature > 100) {
|
|
112
114
|
color_temperature = 100;
|
|
113
115
|
}
|
|
114
116
|
else if (color_temperature < 0) {
|
|
115
117
|
color_temperature = 0;
|
|
116
118
|
}
|
|
117
|
-
return this.
|
|
119
|
+
return await this.setState([0x02, 0x17, color_temperature]);
|
|
118
120
|
}
|
|
119
121
|
/**
|
|
120
|
-
* @returns
|
|
122
|
+
* @returns resolves with brightness percent
|
|
121
123
|
*/
|
|
122
|
-
setRGB(brightness, red, green, blue) {
|
|
124
|
+
async setRGB(brightness, red, green, blue) {
|
|
123
125
|
if (typeof brightness !== 'number') {
|
|
124
|
-
|
|
125
|
-
reject(new Error(`The type of target brightness percentage is incorrect: ${typeof brightness}`));
|
|
126
|
-
});
|
|
126
|
+
throw new TypeError(`The type of target brightness percentage is incorrect: ${typeof brightness}`);
|
|
127
127
|
}
|
|
128
128
|
if (typeof red !== 'number') {
|
|
129
|
-
|
|
130
|
-
reject(new Error(`The type of target red is incorrect: ${typeof red}`));
|
|
131
|
-
});
|
|
129
|
+
throw new TypeError(`The type of target red is incorrect: ${typeof red}`);
|
|
132
130
|
}
|
|
133
131
|
if (typeof green !== 'number') {
|
|
134
|
-
|
|
135
|
-
reject(new Error(`The type of target green is incorrect: ${typeof green}`));
|
|
136
|
-
});
|
|
132
|
+
throw new TypeError(`The type of target green is incorrect: ${typeof green}`);
|
|
137
133
|
}
|
|
138
134
|
if (typeof blue !== 'number') {
|
|
139
|
-
|
|
140
|
-
reject(new Error(`The type of target blue is incorrect: ${typeof blue}`));
|
|
141
|
-
});
|
|
135
|
+
throw new TypeError(`The type of target blue is incorrect: ${typeof blue}`);
|
|
142
136
|
}
|
|
143
137
|
if (brightness > 100) {
|
|
144
138
|
brightness = 100;
|
|
@@ -164,34 +158,32 @@ export class WoBulb extends SwitchbotDevice {
|
|
|
164
158
|
else if (blue < 0) {
|
|
165
159
|
blue = 0;
|
|
166
160
|
}
|
|
167
|
-
return this.
|
|
161
|
+
return await this.setState([0x02, 0x12, brightness, red, green, blue]);
|
|
168
162
|
}
|
|
169
163
|
/**
|
|
170
164
|
* @private
|
|
171
165
|
*/
|
|
172
|
-
|
|
166
|
+
async operateBulb(bytes) {
|
|
173
167
|
const req_buf = Buffer.from(bytes);
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
resolve(is_on);
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
reject(new Error(`The device returned an error: 0x${res_buf.toString('hex')}`));
|
|
186
|
-
}
|
|
168
|
+
await this.command(req_buf)
|
|
169
|
+
.then((res_bytes) => {
|
|
170
|
+
const res_buf = Buffer.from(res_bytes);
|
|
171
|
+
if (res_buf.length === 2) {
|
|
172
|
+
const code = res_buf.readUInt8(1);
|
|
173
|
+
if (code === 0x00 || code === 0x80) {
|
|
174
|
+
const is_on = code === 0x80;
|
|
175
|
+
return is_on;
|
|
187
176
|
}
|
|
188
177
|
else {
|
|
189
|
-
|
|
178
|
+
throw new Error(`The device returned an error: 0x${res_buf.toString('hex')}`);
|
|
190
179
|
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
}
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
throw new Error(`Expecting a 2-byte response, got instead: 0x${res_buf.toString('hex')}`);
|
|
183
|
+
}
|
|
184
|
+
})
|
|
185
|
+
.catch((error) => {
|
|
186
|
+
throw error;
|
|
195
187
|
});
|
|
196
188
|
}
|
|
197
189
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wobulb.js","sourceRoot":"","sources":["../../src/device/wobulb.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"wobulb.js","sourceRoot":"","sources":["../../src/device/wobulb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wobulb.test.d.ts","sourceRoot":"","sources":["../../src/device/wobulb.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
2
|
+
import * as Noble from '@stoprocent/noble';
|
|
3
|
+
/* eslint-disable no-console */
|
|
4
|
+
import { beforeEach, describe, it } from 'vitest';
|
|
5
|
+
import { WoBulb } from './wobulb.js';
|
|
6
|
+
describe('woBulb', () => {
|
|
7
|
+
let bulb;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
const peripheral = {}; // Replace with the actual peripheral object (e.g. from Noble)
|
|
10
|
+
bulb = new WoBulb(peripheral, Noble);
|
|
11
|
+
});
|
|
12
|
+
it('should parse service data correctly', () => {
|
|
13
|
+
const manufacturerData = Buffer.from([0x57, 0x0F, 0x47, 0x01, 0x64, 0x32, 0x19, 0x80, 0x08, 0x7F, 0xFE, 0x00, 0x00]);
|
|
14
|
+
const result = WoBulb.parseServiceData(manufacturerData, manufacturerData, console.log);
|
|
15
|
+
expect(result).toHaveBeenCalledWith({
|
|
16
|
+
model: 'ColorBulb',
|
|
17
|
+
power: 0x47,
|
|
18
|
+
red: 0x01,
|
|
19
|
+
green: 0x64,
|
|
20
|
+
blue: 0x32,
|
|
21
|
+
color_temperature: 0x19,
|
|
22
|
+
state: true,
|
|
23
|
+
brightness: 0x80,
|
|
24
|
+
delay: 0x80,
|
|
25
|
+
preset: 0x08,
|
|
26
|
+
color_mode: 0x08,
|
|
27
|
+
speed: 0x7F,
|
|
28
|
+
loop_index: 0xFE,
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
it('should turn on the bulb', async () => {
|
|
32
|
+
const result = await bulb.turnOn();
|
|
33
|
+
expect(result).toHaveBeenCalledWith(true);
|
|
34
|
+
});
|
|
35
|
+
it('should turn off the bulb', async () => {
|
|
36
|
+
const result = await bulb.turnOff();
|
|
37
|
+
expect(result).toHaveBeenCalledWith(false);
|
|
38
|
+
});
|
|
39
|
+
it('should set brightness correctly', async () => {
|
|
40
|
+
const result = await bulb.setBrightness(50);
|
|
41
|
+
expect(result).toHaveBeenCalledWith(50);
|
|
42
|
+
});
|
|
43
|
+
it('should set color temperature correctly', async () => {
|
|
44
|
+
const result = await bulb.setColorTemperature(75);
|
|
45
|
+
expect(result).toHaveBeenCalledWith(75);
|
|
46
|
+
});
|
|
47
|
+
it('should set RGB values correctly', async () => {
|
|
48
|
+
const result = await bulb.setRGB(50, 255, 100, 50);
|
|
49
|
+
expect(result).toHaveBeenCalledWith({ brightness: 50, red: 255, green: 100, blue: 50 });
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=wobulb.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wobulb.test.js","sourceRoot":"","sources":["../../src/device/wobulb.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,75 +1,45 @@
|
|
|
1
1
|
import { Buffer } from 'node:buffer';
|
|
2
2
|
import { SwitchbotDevice } from '../device.js';
|
|
3
|
-
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';
|
|
4
3
|
/**
|
|
5
4
|
* @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/blob/latest/devicetypes/colorbulb.md
|
|
6
5
|
*/
|
|
7
6
|
export declare class WoCeilingLight extends SwitchbotDevice {
|
|
8
|
-
static parseServiceData(manufacturerData: Buffer, onlog: ((message: string) => void) | undefined):
|
|
9
|
-
|
|
10
|
-
modelName: SwitchBotBLEModelName;
|
|
11
|
-
modelFriendlyName: SwitchBotBLEModelFriendlyName;
|
|
12
|
-
color_temperature: number;
|
|
13
|
-
power: number;
|
|
14
|
-
state: boolean;
|
|
15
|
-
red: number;
|
|
16
|
-
green: number;
|
|
17
|
-
blue: number;
|
|
18
|
-
brightness: number;
|
|
19
|
-
delay: number;
|
|
20
|
-
preset: number;
|
|
21
|
-
color_mode: number;
|
|
22
|
-
speed: number;
|
|
23
|
-
loop_index: number;
|
|
24
|
-
} | null;
|
|
25
|
-
static parseServiceData_Pro(manufacturerData: Buffer, onlog: ((message: string) => void) | undefined): {
|
|
26
|
-
model: SwitchBotBLEModel;
|
|
27
|
-
modelName: SwitchBotBLEModelName;
|
|
28
|
-
modelFriendlyName: SwitchBotBLEModelFriendlyName;
|
|
29
|
-
color_temperature: number;
|
|
30
|
-
power: number;
|
|
31
|
-
state: boolean;
|
|
32
|
-
red: number;
|
|
33
|
-
green: number;
|
|
34
|
-
blue: number;
|
|
35
|
-
brightness: number;
|
|
36
|
-
delay: number;
|
|
37
|
-
preset: number;
|
|
38
|
-
color_mode: number;
|
|
39
|
-
speed: number;
|
|
40
|
-
loop_index: number;
|
|
41
|
-
} | null;
|
|
7
|
+
static parseServiceData(manufacturerData: Buffer, onlog: ((message: string) => void) | undefined): Promise<object | null>;
|
|
8
|
+
static parseServiceData_Pro(manufacturerData: Buffer, onlog: ((message: string) => void) | undefined): Promise<object | null>;
|
|
42
9
|
/**
|
|
43
|
-
* @returns
|
|
10
|
+
* @returns resolves with a boolean that tells whether the plug in ON(true) or OFF(false)
|
|
44
11
|
*/
|
|
45
|
-
readState(): Promise<
|
|
12
|
+
readState(): Promise<void>;
|
|
46
13
|
/**
|
|
47
|
-
*
|
|
14
|
+
*
|
|
48
15
|
*/
|
|
49
|
-
|
|
16
|
+
setState(reqByteArray: number[]): Promise<void>;
|
|
50
17
|
/**
|
|
51
|
-
* @returns
|
|
18
|
+
* @returns resolves with a boolean that tells whether the plug in ON(true) or OFF(false)
|
|
52
19
|
*/
|
|
53
|
-
turnOn(): Promise<
|
|
20
|
+
turnOn(): Promise<void>;
|
|
54
21
|
/**
|
|
55
|
-
* @returns
|
|
22
|
+
* @returns resolves with a boolean that tells whether the plug in ON(true) or OFF(false)
|
|
56
23
|
*/
|
|
57
|
-
turnOff(): Promise<
|
|
24
|
+
turnOff(): Promise<void>;
|
|
58
25
|
/**
|
|
59
|
-
* @
|
|
26
|
+
* @param brightness
|
|
60
27
|
*/
|
|
61
|
-
setBrightness(brightness: number): Promise<
|
|
28
|
+
setBrightness(brightness: number): Promise<void>;
|
|
62
29
|
/**
|
|
63
|
-
* @returns
|
|
30
|
+
* @returns resolves with color_temperature percent
|
|
64
31
|
*/
|
|
65
|
-
setColorTemperature(color_temperature: number): Promise<
|
|
32
|
+
setColorTemperature(color_temperature: number): Promise<void>;
|
|
66
33
|
/**
|
|
67
|
-
* @
|
|
34
|
+
* @param brightness
|
|
35
|
+
* @param red
|
|
36
|
+
* @param green
|
|
37
|
+
* @param blue
|
|
68
38
|
*/
|
|
69
|
-
setRGB(brightness: number, red: number, green: number, blue: number): Promise<
|
|
39
|
+
setRGB(brightness: number, red: number, green: number, blue: number): Promise<void>;
|
|
70
40
|
/**
|
|
71
|
-
* @
|
|
41
|
+
* @param bytes
|
|
72
42
|
*/
|
|
73
|
-
|
|
43
|
+
operateBot(bytes: number[]): Promise<void>;
|
|
74
44
|
}
|
|
75
45
|
//# sourceMappingURL=woceilinglight.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"woceilinglight.d.ts","sourceRoot":"","sources":["../../src/device/woceilinglight.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"woceilinglight.d.ts","sourceRoot":"","sources":["../../src/device/woceilinglight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAMpC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAG9C;;GAEG;AACH,qBAAa,cAAe,SAAQ,eAAe;WACpC,gBAAgB,CAC3B,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,GAC7C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;WAoDZ,oBAAoB,CAC/B,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,GAC7C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAsDzB;;OAEG;IACG,SAAS;IAIf;;OAEG;IACG,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE;IAKrC;;OAEG;IACG,MAAM;IAIZ;;OAEG;IACG,OAAO;IAIb;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM;IAYtC;;OAEG;IACG,mBAAmB,CAAC,iBAAiB,EAAE,MAAM;IAYnD;;;;;OAKG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAoCzE;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAqBjD"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
1
2
|
/* Copyright(C) 2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
|
|
2
3
|
*
|
|
3
|
-
*
|
|
4
|
+
* woceilinglight.ts: Switchbot BLE API registration.
|
|
4
5
|
*/
|
|
5
|
-
import { Buffer } from 'node:buffer';
|
|
6
6
|
import { SwitchbotDevice } from '../device.js';
|
|
7
|
-
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';
|
|
7
|
+
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js';
|
|
8
8
|
/**
|
|
9
9
|
* @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/blob/latest/devicetypes/colorbulb.md
|
|
10
10
|
*/
|
|
11
11
|
export class WoCeilingLight extends SwitchbotDevice {
|
|
12
|
-
static parseServiceData(manufacturerData, onlog) {
|
|
12
|
+
static async parseServiceData(manufacturerData, onlog) {
|
|
13
13
|
if (manufacturerData.length !== 13) {
|
|
14
14
|
if (onlog && typeof onlog === 'function') {
|
|
15
15
|
onlog(`[parseServiceDataForWoCeilingLight] Buffer length ${manufacturerData.length} !== 13!`);
|
|
@@ -57,7 +57,7 @@ export class WoCeilingLight extends SwitchbotDevice {
|
|
|
57
57
|
};
|
|
58
58
|
return data;
|
|
59
59
|
}
|
|
60
|
-
static parseServiceData_Pro(manufacturerData, onlog) {
|
|
60
|
+
static async parseServiceData_Pro(manufacturerData, onlog) {
|
|
61
61
|
if (manufacturerData.length !== 13) {
|
|
62
62
|
if (onlog && typeof onlog === 'function') {
|
|
63
63
|
onlog(`[parseServiceDataForWoCeilingLightPro] Buffer length ${manufacturerData.length} !== 13!`);
|
|
@@ -106,38 +106,36 @@ export class WoCeilingLight extends SwitchbotDevice {
|
|
|
106
106
|
return data;
|
|
107
107
|
}
|
|
108
108
|
/**
|
|
109
|
-
* @returns
|
|
109
|
+
* @returns resolves with a boolean that tells whether the plug in ON(true) or OFF(false)
|
|
110
110
|
*/
|
|
111
|
-
readState() {
|
|
112
|
-
return this.
|
|
111
|
+
async readState() {
|
|
112
|
+
return await this.operateBot([0x57, 0x0F, 0x48, 0x01]);
|
|
113
113
|
}
|
|
114
114
|
/**
|
|
115
|
-
*
|
|
115
|
+
*
|
|
116
116
|
*/
|
|
117
|
-
|
|
117
|
+
async setState(reqByteArray) {
|
|
118
118
|
const base = [0x57, 0x0F, 0x47, 0x01];
|
|
119
|
-
return this.
|
|
119
|
+
return await this.operateBot(base.concat(reqByteArray));
|
|
120
120
|
}
|
|
121
121
|
/**
|
|
122
|
-
* @returns
|
|
122
|
+
* @returns resolves with a boolean that tells whether the plug in ON(true) or OFF(false)
|
|
123
123
|
*/
|
|
124
|
-
turnOn() {
|
|
125
|
-
return this.
|
|
124
|
+
async turnOn() {
|
|
125
|
+
return await this.setState([0x01, 0x01]);
|
|
126
126
|
}
|
|
127
127
|
/**
|
|
128
|
-
* @returns
|
|
128
|
+
* @returns resolves with a boolean that tells whether the plug in ON(true) or OFF(false)
|
|
129
129
|
*/
|
|
130
|
-
turnOff() {
|
|
131
|
-
return this.
|
|
130
|
+
async turnOff() {
|
|
131
|
+
return await this.setState([0x01, 0x02]);
|
|
132
132
|
}
|
|
133
133
|
/**
|
|
134
|
-
* @
|
|
134
|
+
* @param brightness
|
|
135
135
|
*/
|
|
136
|
-
setBrightness(brightness) {
|
|
136
|
+
async setBrightness(brightness) {
|
|
137
137
|
if (typeof brightness !== 'number') {
|
|
138
|
-
|
|
139
|
-
reject(new Error(`The type of target brightness percentage is incorrect: ${typeof brightness}`));
|
|
140
|
-
});
|
|
138
|
+
throw new TypeError(`The type of target brightness percentage is incorrect: ${typeof brightness}`);
|
|
141
139
|
}
|
|
142
140
|
if (brightness > 100) {
|
|
143
141
|
brightness = 100;
|
|
@@ -145,16 +143,14 @@ export class WoCeilingLight extends SwitchbotDevice {
|
|
|
145
143
|
else if (brightness < 0) {
|
|
146
144
|
brightness = 0;
|
|
147
145
|
}
|
|
148
|
-
return this.
|
|
146
|
+
return await this.setState([0x02, 0x14]);
|
|
149
147
|
}
|
|
150
148
|
/**
|
|
151
|
-
* @returns
|
|
149
|
+
* @returns resolves with color_temperature percent
|
|
152
150
|
*/
|
|
153
|
-
setColorTemperature(color_temperature) {
|
|
151
|
+
async setColorTemperature(color_temperature) {
|
|
154
152
|
if (typeof color_temperature !== 'number') {
|
|
155
|
-
|
|
156
|
-
reject(new Error(`The type of target color_temperature percentage is incorrect: ${typeof color_temperature}`));
|
|
157
|
-
});
|
|
153
|
+
throw new TypeError(`The type of target color_temperature percentage is incorrect: ${typeof color_temperature}`);
|
|
158
154
|
}
|
|
159
155
|
if (color_temperature > 100) {
|
|
160
156
|
color_temperature = 100;
|
|
@@ -162,31 +158,26 @@ export class WoCeilingLight extends SwitchbotDevice {
|
|
|
162
158
|
else if (color_temperature < 0) {
|
|
163
159
|
color_temperature = 0;
|
|
164
160
|
}
|
|
165
|
-
return this.
|
|
161
|
+
return await this.setState([0x02, 0x17, color_temperature]);
|
|
166
162
|
}
|
|
167
163
|
/**
|
|
168
|
-
* @
|
|
164
|
+
* @param brightness
|
|
165
|
+
* @param red
|
|
166
|
+
* @param green
|
|
167
|
+
* @param blue
|
|
169
168
|
*/
|
|
170
|
-
setRGB(brightness, red, green, blue) {
|
|
169
|
+
async setRGB(brightness, red, green, blue) {
|
|
171
170
|
if (typeof brightness !== 'number') {
|
|
172
|
-
|
|
173
|
-
reject(new Error(`The type of target brightness percentage is incorrect: ${typeof brightness}`));
|
|
174
|
-
});
|
|
171
|
+
throw new TypeError(`The type of target brightness percentage is incorrect: ${typeof brightness}`);
|
|
175
172
|
}
|
|
176
173
|
if (typeof red !== 'number') {
|
|
177
|
-
|
|
178
|
-
reject(new Error(`The type of target red is incorrect: ${typeof red}`));
|
|
179
|
-
});
|
|
174
|
+
throw new TypeError(`The type of target red is incorrect: ${typeof red}`);
|
|
180
175
|
}
|
|
181
176
|
if (typeof green !== 'number') {
|
|
182
|
-
|
|
183
|
-
reject(new Error(`The type of target green is incorrect: ${typeof green}`));
|
|
184
|
-
});
|
|
177
|
+
throw new TypeError(`The type of target green is incorrect: ${typeof green}`);
|
|
185
178
|
}
|
|
186
179
|
if (typeof blue !== 'number') {
|
|
187
|
-
|
|
188
|
-
reject(new Error(`The type of target blue is incorrect: ${typeof blue}`));
|
|
189
|
-
});
|
|
180
|
+
throw new TypeError(`The type of target blue is incorrect: ${typeof blue}`);
|
|
190
181
|
}
|
|
191
182
|
if (brightness > 100) {
|
|
192
183
|
brightness = 100;
|
|
@@ -212,34 +203,32 @@ export class WoCeilingLight extends SwitchbotDevice {
|
|
|
212
203
|
else if (blue < 0) {
|
|
213
204
|
blue = 0;
|
|
214
205
|
}
|
|
215
|
-
return this.
|
|
206
|
+
return await this.setState([0x02, 0x12, brightness, red, green, blue]);
|
|
216
207
|
}
|
|
217
208
|
/**
|
|
218
|
-
* @
|
|
209
|
+
* @param bytes
|
|
219
210
|
*/
|
|
220
|
-
|
|
211
|
+
async operateBot(bytes) {
|
|
221
212
|
const req_buf = Buffer.from(bytes);
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
resolve(is_on);
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
reject(new Error(`The device returned an error: 0x${res_buf.toString('hex')}`));
|
|
234
|
-
}
|
|
213
|
+
await this.command(req_buf)
|
|
214
|
+
.then((res_bytes) => {
|
|
215
|
+
const res_buf = Buffer.from(res_bytes);
|
|
216
|
+
if (res_buf.length === 2) {
|
|
217
|
+
const code = res_buf.readUInt8(1);
|
|
218
|
+
if (code === 0x00 || code === 0x80) {
|
|
219
|
+
const is_on = code === 0x80;
|
|
220
|
+
return is_on;
|
|
235
221
|
}
|
|
236
222
|
else {
|
|
237
|
-
|
|
223
|
+
throw new Error(`The device returned an error: 0x${res_buf.toString('hex')}`);
|
|
238
224
|
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
throw new Error(`Expecting a 2-byte response, got instead: 0x${res_buf.toString('hex')}`);
|
|
228
|
+
}
|
|
229
|
+
})
|
|
230
|
+
.catch((error) => {
|
|
231
|
+
throw error;
|
|
243
232
|
});
|
|
244
233
|
}
|
|
245
234
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"woceilinglight.js","sourceRoot":"","sources":["../../src/device/woceilinglight.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"woceilinglight.js","sourceRoot":"","sources":["../../src/device/woceilinglight.ts"],"names":[],"mappings":"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"}
|