@switchbot/homebridge-switchbot 5.0.0-beta.2 → 5.0.0-beta.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;yBAOrB,KAAK,GAAG,KAAG,IAAI;AAA/B,wBAMC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;yBAOrB,KAAK,GAAG,KAAG,IAAI;AAA/B,wBAQC"}
package/dist/index.js CHANGED
@@ -6,6 +6,8 @@ export default (api) => {
6
6
  // Call the instance method on the runtime `api` object (optional chaining in case
7
7
  // older homebridge doesn't provide it). Treat undefined as false.
8
8
  const isMatter = Boolean(api.isMatterEnabled?.());
9
+ const log = api.logger ?? console;
10
+ log.info?.(`Homebridge SwitchBot Plugin initializing in ${isMatter ? 'Matter' : 'HAP'} mode.`);
9
11
  // If Matter is enabled register the Matter platform, otherwise use HAP platform.
10
12
  api.registerPlatform(PLUGIN_NAME, PLATFORM_NAME, isMatter ? SwitchBotMatterPlatform : SwitchBotHAPPlatform);
11
13
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE1D,yCAAyC;AACzC,eAAe,CAAC,GAAQ,EAAQ,EAAE;IAChC,kFAAkF;IAClF,kEAAkE;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,CAAA;IACjD,iFAAiF;IACjF,GAAG,CAAC,gBAAgB,CAAC,WAAW,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAA;AAC7G,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE1D,yCAAyC;AACzC,eAAe,CAAC,GAAQ,EAAQ,EAAE;IAChC,kFAAkF;IAClF,kEAAkE;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,CAAA;IACjD,MAAM,GAAG,GAAI,GAAW,CAAC,MAAM,IAAI,OAAO,CAAA;IAC1C,GAAG,CAAC,IAAI,EAAE,CAAC,+CAA+C,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAA;IAC9F,iFAAiF;IACjF,GAAG,CAAC,gBAAgB,CAAC,WAAW,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAA;AAC7G,CAAC,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import type { API, DynamicPlatformPlugin, Logging, SerializedMatterAccessory } from 'homebridge';
2
+ import type { bodyChange, device } from 'node-switchbot';
2
3
  import type { SwitchBotPlatformConfig } from './settings.js';
3
4
  /**
4
5
  * MatterPlatform
@@ -11,7 +12,27 @@ export declare class SwitchBotMatterPlatform implements DynamicPlatformPlugin {
11
12
  readonly config: SwitchBotPlatformConfig;
12
13
  readonly api: API;
13
14
  readonly matterAccessories: Map<string, SerializedMatterAccessory>;
15
+ private switchBotAPI?;
16
+ private switchBotBLE?;
17
+ private discoveredDevices;
18
+ private bleEventHandler;
14
19
  constructor(log: Logging, config: SwitchBotPlatformConfig, api: API);
20
+ /**
21
+ * Map a SwitchBot device object to a MatterAccessory using the device-specific
22
+ * Matter accessory classes in `src/devices-matter`.
23
+ */
24
+ private createAccessoryFromDevice;
25
+ /**
26
+ * Discover devices via SwitchBot OpenAPI and cache them for later use
27
+ */
28
+ private discoverDevices;
29
+ /**
30
+ * Retry wrapper for control commands using SwitchBot OpenAPI
31
+ */
32
+ retryCommand(deviceObj: device, bodyChange: bodyChange, maxRetries?: number, delayBetweenRetries?: number): Promise<{
33
+ response: any;
34
+ statusCode: number;
35
+ }>;
15
36
  /**
16
37
  * Required for DynamicPlatformPlugin
17
38
  * Called when homebridge restores cached accessories from disk at startup
@@ -1 +1 @@
1
- {"version":3,"file":"platform-matter.d.ts","sourceRoot":"","sources":["../src/platform-matter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,GAAG,EACH,qBAAqB,EACrB,OAAO,EAEP,yBAAyB,EAC1B,MAAM,YAAY,CAAA;AAEnB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AA4B5D;;;;;GAKG;AACH,qBAAa,uBAAwB,YAAW,qBAAqB;aASjD,GAAG,EAAE,OAAO;aACZ,MAAM,EAAE,uBAAuB;aAC/B,GAAG,EAAE,GAAG;IAL1B,SAAgB,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAY;gBAGnE,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,uBAAuB,EAC/B,GAAG,EAAE,GAAG;IAwC1B;;;OAGG;IACH,kBAAkB;IAMlB;;;;;OAKG;IACH,wBAAwB,CAAC,SAAS,EAAE,yBAAyB;IAK7D;;OAEG;YACW,yBAAyB;IAuBvC;;OAEG;YACW,yBAAyB;IAqCvC;;OAEG;YACW,wBAAwB;IA8CtC;;OAEG;YACW,0BAA0B;IAsBxC;;OAEG;YACW,wBAAwB;IAsBtC;;OAEG;YACW,uBAAuB;IA0DrC;;OAEG;YACW,uBAAuB;IAkCrC;;OAEG;YACW,oBAAoB;IA4BlC;;;;;OAKG;YACW,wBAAwB;IAsBtC;;;;;;OAMG;YACW,qBAAqB;CAqBpC"}
1
+ {"version":3,"file":"platform-matter.d.ts","sourceRoot":"","sources":["../src/platform-matter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,GAAG,EACH,qBAAqB,EACrB,OAAO,EAEP,yBAAyB,EAC1B,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAExD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AA8B5D;;;;;GAKG;AACH,qBAAa,uBAAwB,YAAW,qBAAqB;aAgBjD,GAAG,EAAE,OAAO;aACZ,MAAM,EAAE,uBAAuB;aAC/B,GAAG,EAAE,GAAG;IAZ1B,SAAgB,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAY;IAErF,OAAO,CAAC,YAAY,CAAC,CAAkB;IACvC,OAAO,CAAC,YAAY,CAAC,CAAc;IAEnC,OAAO,CAAC,iBAAiB,CAAe;IAExC,OAAO,CAAC,eAAe,CAA8C;gBAGnD,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,uBAAuB,EAC/B,GAAG,EAAE,GAAG;IA4F1B;;;OAGG;YACW,yBAAyB;IA4TvC;;OAEG;YACW,eAAe;IAwB7B;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,SAAI,EAAE,mBAAmB,SAAO,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,GAAG,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IA0BzJ;;;OAGG;IACH,kBAAkB;IAMlB;;;;;OAKG;IACH,wBAAwB,CAAC,SAAS,EAAE,yBAAyB;IAK7D;;OAEG;YACW,yBAAyB;IAgDvC;;OAEG;YACW,yBAAyB;IAqCvC;;OAEG;YACW,wBAAwB;IA8CtC;;OAEG;YACW,0BAA0B;IAsBxC;;OAEG;YACW,wBAAwB;IAsBtC;;OAEG;YACW,uBAAuB;IA0DrC;;OAEG;YACW,uBAAuB;IAkCrC;;OAEG;YACW,oBAAoB;IA4BlC;;;;;OAKG;YACW,wBAAwB;IAsBtC;;;;;;OAMG;YACW,qBAAqB;CAqBpC"}
@@ -1,6 +1,7 @@
1
+ import { SwitchBotBLE, SwitchBotOpenAPI } from 'node-switchbot';
1
2
  import { ColorLightAccessory, ColorTemperatureLightAccessory, ContactSensorAccessory, DimmableLightAccessory, DoorLockAccessory, ExtendedColorLightAccessory, FanAccessory, HumiditySensorAccessory, LeakSensorAccessory, LightSensorAccessory, OccupancySensorAccessory, OnOffLightAccessory, OnOffOutletAccessory, OnOffSwitchAccessory, PowerStripAccessory, RoboticVacuumAccessory, SmokeCOAlarmAccessory, TemperatureSensorAccessory, ThermostatAccessory, VenetianBlindAccessory, WindowBlindAccessory, } from './devices-matter/index.js';
2
3
  import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
3
- import { cleanDeviceConfig } from './utils.js';
4
+ import { cleanDeviceConfig, formatDeviceIdAsMac, hs2rgb, rgb2hs, sleep } from './utils.js';
4
5
  /**
5
6
  * MatterPlatform
6
7
  * Demonstrates all available Matter device types in Homebridge
@@ -16,6 +17,13 @@ export class SwitchBotMatterPlatform {
16
17
  // public readonly accessories: Map<string, PlatformAccessory> = new Map()
17
18
  // Track restored Matter cached accessories
18
19
  matterAccessories = new Map();
20
+ // node-switchbot clients
21
+ switchBotAPI;
22
+ switchBotBLE;
23
+ // discovered devices cache
24
+ discoveredDevices = [];
25
+ // BLE event handlers keyed by device MAC (formatted)
26
+ bleEventHandler = {};
19
27
  constructor(log, config, api) {
20
28
  this.log = log;
21
29
  this.config = config;
@@ -53,9 +61,423 @@ export class SwitchBotMatterPlatform {
53
61
  // Register Matter accessories when Homebridge has finished launching
54
62
  this.api.on('didFinishLaunching', () => {
55
63
  this.log.debug('Executed didFinishLaunching callback');
64
+ // Initialize SwitchBot API clients
65
+ try {
66
+ if (this.config.credentials?.token && this.config.credentials?.secret) {
67
+ this.switchBotAPI = new SwitchBotOpenAPI(this.config.credentials.token, this.config.credentials.secret, this.config.options?.hostname);
68
+ // forward basic logs
69
+ if (!this.config.options?.disableLogsforOpenAPI && this.switchBotAPI?.on) {
70
+ this.switchBotAPI.on('log', (l) => this.log.debug('[SwitchBot OpenAPI]', l.message));
71
+ }
72
+ }
73
+ else {
74
+ this.log.debug('SwitchBot OpenAPI credentials not provided; cloud devices will be skipped');
75
+ }
76
+ }
77
+ catch (e) {
78
+ this.log.error('Failed to initialize SwitchBot OpenAPI:', e?.message ?? e);
79
+ }
80
+ try {
81
+ this.switchBotBLE = new SwitchBotBLE();
82
+ if (!this.config.options?.disableLogsforBLE && this.switchBotBLE?.on) {
83
+ this.switchBotBLE.on('log', (l) => this.log.debug('[SwitchBot BLE]', l.message));
84
+ }
85
+ }
86
+ catch (e) {
87
+ this.log.error('Failed to initialize SwitchBot BLE client:', e?.message ?? e);
88
+ }
89
+ // If BLE scanning is enabled, start scanning and route advertisements to registered handlers
90
+ if (this.config.options?.BLE && this.switchBotBLE) {
91
+ const ble = this.switchBotBLE;
92
+ (async () => {
93
+ try {
94
+ await ble.startScan();
95
+ }
96
+ catch (e) {
97
+ this.log.error(`Failed to start BLE scanning: ${e?.message ?? e}`);
98
+ }
99
+ // route advertisements to our handlers
100
+ ble.onadvertisement = async (ad) => {
101
+ try {
102
+ const mac = (ad.address || '').toLowerCase();
103
+ const handler = this.bleEventHandler[mac];
104
+ if (handler) {
105
+ await handler(ad.serviceData);
106
+ }
107
+ }
108
+ catch (e) {
109
+ this.log.error(`Failed to handle BLE advertisement: ${e?.message ?? e}`);
110
+ }
111
+ };
112
+ })();
113
+ }
114
+ // perform device discovery from SwitchBot OpenAPI (if configured)
115
+ void this.discoverDevices();
56
116
  this.registerMatterAccessories();
57
117
  });
58
118
  }
119
+ /**
120
+ * Map a SwitchBot device object to a MatterAccessory using the device-specific
121
+ * Matter accessory classes in `src/devices-matter`.
122
+ */
123
+ async createAccessoryFromDevice(dev) {
124
+ // Basic metadata
125
+ const displayName = dev.deviceName ?? dev.deviceId ?? 'SwitchBot Device';
126
+ const serial = dev.deviceId ?? 'unknown';
127
+ const manufacturer = 'SwitchBot';
128
+ const model = dev.deviceType ?? 'SwitchBot';
129
+ const firmware = dev.firmware ?? dev.version ?? '0.0.0';
130
+ // Helper to build a default opts object consumed by the matter device classes
131
+ const baseOpts = {
132
+ uuid: this.api.matter.uuid.generate(serial),
133
+ displayName,
134
+ serialNumber: serial,
135
+ manufacturer,
136
+ model,
137
+ firmwareRevision: String(firmware),
138
+ hardwareRevision: '1.0.0',
139
+ deviceId: dev.deviceId,
140
+ context: { deviceId: dev.deviceId },
141
+ };
142
+ // Small helper to wrap common OpenAPI on/off commands
143
+ // Helper to send an OpenAPI command
144
+ const sendOpenAPI = async (command, parameter = 'default') => {
145
+ const bodyChange = { command, parameter, commandType: 'command' };
146
+ return this.retryCommand(dev, bodyChange, this.config.options?.maxRetries ?? 1, this.config.options?.delayBetweenRetries ?? 1000);
147
+ };
148
+ // Helper to send a BLE action if Platform BLE is enabled and switchBotBLE exists
149
+ const sendBLE = async (methodName, ...args) => {
150
+ if (!this.switchBotBLE) {
151
+ throw new Error('Platform BLE not available');
152
+ }
153
+ const id = formatDeviceIdAsMac(dev.deviceId);
154
+ const list = await this.switchBotBLE.discover({ model: dev.bleModel, id });
155
+ if (!Array.isArray(list) || list.length === 0) {
156
+ throw new Error('BLE device not found');
157
+ }
158
+ const deviceInst = list[0];
159
+ if (typeof deviceInst[methodName] !== 'function') {
160
+ throw new TypeError(`BLE method ${methodName} not available on device`);
161
+ }
162
+ return await deviceInst[methodName](...args);
163
+ };
164
+ const makeOnOffHandlers = (uuid) => ({
165
+ onOff: {
166
+ on: async () => {
167
+ try {
168
+ if (this.config.options?.BLE && this.switchBotBLE) {
169
+ await sendBLE('turnOn');
170
+ }
171
+ else {
172
+ await sendOpenAPI('turnOn');
173
+ }
174
+ await this.api.matter.updateAccessoryState(uuid, this.api.matter.clusterNames.OnOff, { onOff: true });
175
+ }
176
+ catch (e) {
177
+ this.log.error(`Failed to turn on device ${dev.deviceId}: ${e?.message ?? e}`);
178
+ }
179
+ },
180
+ off: async () => {
181
+ try {
182
+ if (this.config.options?.BLE && this.switchBotBLE) {
183
+ await sendBLE('turnOff');
184
+ }
185
+ else {
186
+ await sendOpenAPI('turnOff');
187
+ }
188
+ await this.api.matter.updateAccessoryState(uuid, this.api.matter.clusterNames.OnOff, { onOff: false });
189
+ }
190
+ catch (e) {
191
+ this.log.error(`Failed to turn off device ${dev.deviceId}: ${e?.message ?? e}`);
192
+ }
193
+ },
194
+ },
195
+ });
196
+ // Mapping from SwitchBot deviceType -> constructor
197
+ const mapping = {
198
+ 'Plug': OnOffOutletAccessory,
199
+ 'Plug Mini (US)': OnOffOutletAccessory,
200
+ 'Plug Mini (JP)': OnOffOutletAccessory,
201
+ 'Color Bulb': ColorLightAccessory,
202
+ 'Ceiling Light': ColorTemperatureLightAccessory,
203
+ 'Ceiling Light Pro': ColorTemperatureLightAccessory,
204
+ 'Strip Light': ExtendedColorLightAccessory,
205
+ 'Dimmable Light': DimmableLightAccessory,
206
+ 'K10+': RoboticVacuumAccessory,
207
+ 'K10+ Pro': RoboticVacuumAccessory,
208
+ 'WoSweeper': RoboticVacuumAccessory,
209
+ 'WoSweeperMini': RoboticVacuumAccessory,
210
+ 'Robot Vacuum Cleaner S1': RoboticVacuumAccessory,
211
+ 'Robot Vacuum Cleaner S1 Plus': RoboticVacuumAccessory,
212
+ 'Robot Vacuum Cleaner S10': RoboticVacuumAccessory,
213
+ 'Smart Lock': DoorLockAccessory,
214
+ 'Smart Lock Pro': DoorLockAccessory,
215
+ 'Motion Sensor': OccupancySensorAccessory,
216
+ 'Contact Sensor': ContactSensorAccessory,
217
+ 'Water Detector': LeakSensorAccessory,
218
+ 'Meter': TemperatureSensorAccessory,
219
+ 'MeterPlus': TemperatureSensorAccessory,
220
+ 'MeterPro': TemperatureSensorAccessory,
221
+ 'WoIOSensor': TemperatureSensorAccessory,
222
+ 'Air Purifier PM2.5': HumiditySensorAccessory,
223
+ 'Battery Circulator Fan': FanAccessory,
224
+ 'Blind Tilt': VenetianBlindAccessory,
225
+ 'Curtain': WindowBlindAccessory,
226
+ 'Curtain3': WindowBlindAccessory,
227
+ 'WoRollerShade': WindowBlindAccessory,
228
+ 'Roller Shade': WindowBlindAccessory,
229
+ 'Relay Switch 1': OnOffSwitchAccessory,
230
+ 'Relay Switch 1PM': OnOffSwitchAccessory,
231
+ };
232
+ const Ctor = mapping[dev.deviceType ?? ''];
233
+ if (!Ctor) {
234
+ this.log.debug(`No Matter mapping for deviceType='${dev.deviceType}', deviceId=${dev.deviceId}`);
235
+ return undefined;
236
+ }
237
+ // Build opts and handlers tailored for basic capabilities
238
+ const uuid = baseOpts.uuid;
239
+ const handlers = {};
240
+ // On/Off common
241
+ handlers.onOff = makeOnOffHandlers(uuid).onOff;
242
+ // If this is a light, add brightness and color handlers
243
+ if (['Color Bulb', 'Ceiling Light', 'Ceiling Light Pro', 'Strip Light', 'Dimmable Light'].includes(dev.deviceType ?? '')) {
244
+ // levelControl
245
+ handlers.levelControl = {
246
+ moveToLevelWithOnOff: async (request) => {
247
+ try {
248
+ const level = request.level;
249
+ const percent = Math.round((level / 254) * 100);
250
+ if (this.config.options?.BLE && this.switchBotBLE) {
251
+ await sendBLE('setBrightness', percent);
252
+ }
253
+ else {
254
+ await sendOpenAPI('setBrightness', `${percent}`);
255
+ }
256
+ await this.api.matter.updateAccessoryState(uuid, this.api.matter.clusterNames.LevelControl, { currentLevel: level });
257
+ }
258
+ catch (e) {
259
+ this.log.error(`Failed to set brightness for ${dev.deviceId}: ${e?.message ?? e}`);
260
+ }
261
+ },
262
+ };
263
+ // colorControl
264
+ handlers.colorControl = {
265
+ moveToHueAndSaturationLogic: async (request) => {
266
+ try {
267
+ const hue = request.hue;
268
+ const saturation = request.saturation;
269
+ const [r, g, b] = hs2rgb(Math.round((hue / 254) * 360), Math.round((saturation / 254) * 100));
270
+ if (this.config.options?.BLE && this.switchBotBLE) {
271
+ await sendBLE('setRGB', Number(request.level ?? 100), r, g, b);
272
+ }
273
+ else {
274
+ await sendOpenAPI('setColor', `${r}:${g}:${b}`);
275
+ }
276
+ await this.api.matter.updateAccessoryState(uuid, this.api.matter.clusterNames.ColorControl, { currentHue: hue, currentSaturation: saturation });
277
+ }
278
+ catch (e) {
279
+ this.log.error(`Failed to set hue/sat for ${dev.deviceId}: ${e?.message ?? e}`);
280
+ }
281
+ },
282
+ moveToColorLogic: async (request) => {
283
+ try {
284
+ // MoveToColor gives colorX/colorY values; convert to approximate RGB by mapping to 0-255 scale
285
+ const colorX = request.colorX;
286
+ const colorY = request.colorY;
287
+ // Naive conversion: map X/Y into RGB via hue approximation (not colorimetrically accurate)
288
+ const hueApprox = Math.round((colorX / 65535) * 360);
289
+ const satApprox = Math.round((colorY / 65535) * 100);
290
+ const [r, g, b] = hs2rgb(hueApprox, satApprox);
291
+ if (this.config.options?.BLE && this.switchBotBLE) {
292
+ await sendBLE('setRGB', Number(request.level ?? 100), r, g, b);
293
+ }
294
+ else {
295
+ await sendOpenAPI('setColor', `${r}:${g}:${b}`);
296
+ }
297
+ await this.api.matter.updateAccessoryState(uuid, this.api.matter.clusterNames.ColorControl, { currentX: colorX, currentY: colorY });
298
+ }
299
+ catch (e) {
300
+ this.log.error(`Failed to set XY color for ${dev.deviceId}: ${e?.message ?? e}`);
301
+ }
302
+ },
303
+ };
304
+ // color temperature — map to kelvin and send setColorTemperature
305
+ handlers.colorTemperature = {
306
+ moveToColorTemperature: async (request) => {
307
+ try {
308
+ const kelvin = Math.round(1000000 / Number(request.colorTemperature));
309
+ if (this.config.options?.BLE && this.switchBotBLE) {
310
+ await sendBLE('setColorTemperature', kelvin);
311
+ }
312
+ else {
313
+ await sendOpenAPI('setColorTemperature', `${kelvin}`);
314
+ }
315
+ await this.api.matter.updateAccessoryState(uuid, this.api.matter.clusterNames.ColorControl, { currentX: request.colorX ?? 0, currentY: request.colorY ?? 0 });
316
+ }
317
+ catch (e) {
318
+ this.log.error(`Failed to set color temperature for ${dev.deviceId}: ${e?.message ?? e}`);
319
+ }
320
+ },
321
+ };
322
+ }
323
+ const opts = Object.assign({}, baseOpts, { handlers });
324
+ // Instantiate the device class and return its serialized accessory
325
+ const instance = new Ctor(this.api, this.log, opts);
326
+ // Register BLE->Matter push handler for this device's MAC (if BLE scanning is active)
327
+ try {
328
+ const mac = formatDeviceIdAsMac(dev.deviceId).toLowerCase();
329
+ // Handler receives advertisement/serviceData when BLE scan events arrive
330
+ this.bleEventHandler[mac] = async (serviceData) => {
331
+ const uuidLocal = baseOpts.uuid;
332
+ // Try to parse BLE advertisement/serviceData first (works without cloud)
333
+ try {
334
+ if (serviceData) {
335
+ // Power
336
+ const power = serviceData.power ?? serviceData.on ?? serviceData.p;
337
+ if (power !== undefined) {
338
+ const on = (String(power).toLowerCase() === 'on' || Number(power) === 1);
339
+ await this.api.matter.updateAccessoryState(uuidLocal, this.api.matter.clusterNames.OnOff, { onOff: on });
340
+ }
341
+ // Brightness
342
+ const brightness = serviceData.brightness ?? serviceData.b;
343
+ if (brightness !== undefined) {
344
+ const level = Math.round((Number(brightness) / 100) * 254);
345
+ await this.api.matter.updateAccessoryState(uuidLocal, this.api.matter.clusterNames.LevelControl, { currentLevel: level });
346
+ }
347
+ // Color (r:g:b or hex or hex without #)
348
+ const color = serviceData.color ?? serviceData.rgb ?? serviceData.c;
349
+ if (color !== undefined) {
350
+ let r = 0;
351
+ let g = 0;
352
+ let b = 0;
353
+ const c = String(color);
354
+ if (c.includes(':')) {
355
+ const parts = c.split(':').map(Number);
356
+ [r, g, b] = parts;
357
+ }
358
+ else if (c.startsWith('#')) {
359
+ const hex = c.replace('#', '');
360
+ r = Number.parseInt(hex.substring(0, 2), 16);
361
+ g = Number.parseInt(hex.substring(2, 4), 16);
362
+ b = Number.parseInt(hex.substring(4, 6), 16);
363
+ }
364
+ else if (/^[0-9a-f]{6}$/i.test(c)) {
365
+ r = Number.parseInt(c.substring(0, 2), 16);
366
+ g = Number.parseInt(c.substring(2, 4), 16);
367
+ b = Number.parseInt(c.substring(4, 6), 16);
368
+ }
369
+ const [h, s] = rgb2hs(r, g, b);
370
+ await this.api.matter.updateAccessoryState(uuidLocal, this.api.matter.clusterNames.ColorControl, { currentHue: Math.round((h / 360) * 254), currentSaturation: Math.round((s / 100) * 254) });
371
+ }
372
+ // If serviceData was present, prefer it and return early
373
+ if (serviceData) {
374
+ return;
375
+ }
376
+ }
377
+ }
378
+ catch (e) {
379
+ this.log.debug(`BLE advertisement parsing failed for ${dev.deviceId}: ${e?.message ?? e}`);
380
+ }
381
+ // Fallback to OpenAPI getDeviceStatus when serviceData is not present or parsing failed
382
+ if (!this.switchBotAPI) {
383
+ return;
384
+ }
385
+ try {
386
+ const { response, statusCode } = await this.switchBotAPI.getDeviceStatus(dev.deviceId, this.config.credentials?.token, this.config.credentials?.secret);
387
+ if (!(statusCode === 100 || statusCode === 200)) {
388
+ return;
389
+ }
390
+ const respAny = response;
391
+ const body = respAny?.body ?? respAny;
392
+ const status = body?.status ?? body;
393
+ // On/Off
394
+ if (status?.power !== undefined) {
395
+ const on = (String(status.power).toLowerCase() === 'on' || Number(status.power) === 1);
396
+ await this.api.matter.updateAccessoryState(uuidLocal, this.api.matter.clusterNames.OnOff, { onOff: on });
397
+ }
398
+ // Brightness
399
+ if (status?.brightness !== undefined) {
400
+ const level = Math.round((Number(status.brightness) / 100) * 254);
401
+ await this.api.matter.updateAccessoryState(uuidLocal, this.api.matter.clusterNames.LevelControl, { currentLevel: level });
402
+ }
403
+ // Color
404
+ if (status?.color !== undefined) {
405
+ const color = String(status.color);
406
+ let r = 0;
407
+ let g = 0;
408
+ let b = 0;
409
+ if (color.includes(':')) {
410
+ const parts = color.split(':').map(Number);
411
+ [r, g, b] = parts;
412
+ }
413
+ else if (color.startsWith('#')) {
414
+ const hex = color.replace('#', '');
415
+ r = Number.parseInt(hex.substring(0, 2), 16);
416
+ g = Number.parseInt(hex.substring(2, 4), 16);
417
+ b = Number.parseInt(hex.substring(4, 6), 16);
418
+ }
419
+ const [h, s] = rgb2hs(r, g, b);
420
+ await this.api.matter.updateAccessoryState(uuidLocal, this.api.matter.clusterNames.ColorControl, { currentHue: Math.round((h / 360) * 254), currentSaturation: Math.round((s / 100) * 254) });
421
+ }
422
+ }
423
+ catch (e) {
424
+ this.log.debug(`BLE push handler failed for ${dev.deviceId}: ${e?.message ?? e}`);
425
+ }
426
+ };
427
+ }
428
+ catch (e) {
429
+ this.log.debug(`Failed to register BLE handler for ${dev.deviceId}: ${e?.message ?? e}`);
430
+ }
431
+ return instance.toAccessory();
432
+ }
433
+ /**
434
+ * Discover devices via SwitchBot OpenAPI and cache them for later use
435
+ */
436
+ async discoverDevices() {
437
+ if (!this.switchBotAPI) {
438
+ this.log.debug('SwitchBot OpenAPI not configured; skipping discovery');
439
+ return;
440
+ }
441
+ try {
442
+ const { response, statusCode } = await this.switchBotAPI.getDevices();
443
+ this.log.debug(`SwitchBot getDevices response status: ${statusCode}`);
444
+ if (statusCode === 100 || statusCode === 200) {
445
+ const deviceList = Array.isArray(response?.body?.deviceList) ? response.body.deviceList : [];
446
+ this.discoveredDevices = deviceList;
447
+ this.log.info(`Discovered ${deviceList.length} SwitchBot device(s) from OpenAPI`);
448
+ for (const d of deviceList) {
449
+ this.log.debug(` - ${d.deviceName} (${d.deviceType}) id=${d.deviceId}`);
450
+ }
451
+ }
452
+ else {
453
+ this.log.warn(`SwitchBot getDevices returned status ${statusCode}`);
454
+ }
455
+ }
456
+ catch (e) {
457
+ this.log.error('Failed to discover SwitchBot devices:', e?.message ?? e);
458
+ }
459
+ }
460
+ /**
461
+ * Retry wrapper for control commands using SwitchBot OpenAPI
462
+ */
463
+ async retryCommand(deviceObj, bodyChange, maxRetries = 1, delayBetweenRetries = 1000) {
464
+ let retryCount = 0;
465
+ while (retryCount < maxRetries) {
466
+ try {
467
+ if (!this.switchBotAPI) {
468
+ throw new Error('SwitchBot OpenAPI not initialized');
469
+ }
470
+ const { response, statusCode } = await this.switchBotAPI.controlDevice(deviceObj.deviceId, bodyChange.command, bodyChange.parameter, bodyChange.commandType, this.config.credentials?.token, this.config.credentials?.secret);
471
+ return { response, statusCode };
472
+ }
473
+ catch (e) {
474
+ this.log.debug(`retryCommand error: ${e?.message ?? e}`);
475
+ }
476
+ retryCount++;
477
+ await sleep(delayBetweenRetries);
478
+ }
479
+ return { response: {}, statusCode: 500 };
480
+ }
59
481
  /**
60
482
  * Required for DynamicPlatformPlugin
61
483
  * Called when homebridge restores cached accessories from disk at startup
@@ -84,7 +506,32 @@ export class SwitchBotMatterPlatform {
84
506
  this.log.info('═'.repeat(80));
85
507
  // Remove accessories that are disabled in config
86
508
  await this.removeDisabledAccessories();
87
- // Register devices by Matter specification sections
509
+ // If we discovered real SwitchBot devices via OpenAPI, map and register them
510
+ if (this.discoveredDevices && this.discoveredDevices.length > 0) {
511
+ this.log.info(`Registering ${this.discoveredDevices.length} discovered SwitchBot device(s) as Matter accessories`);
512
+ const accessories = [];
513
+ for (const dev of this.discoveredDevices) {
514
+ try {
515
+ const acc = await this.createAccessoryFromDevice(dev);
516
+ if (acc) {
517
+ accessories.push(acc);
518
+ }
519
+ }
520
+ catch (e) {
521
+ this.log.error(`Failed to create Matter accessory for ${dev.deviceId}: ${e?.message ?? e}`);
522
+ }
523
+ }
524
+ if (accessories.length > 0) {
525
+ this.log.info(`✓ Registered ${accessories.length} discovered device(s)`);
526
+ for (const acc of accessories) {
527
+ this.log.info(` - ${acc.displayName}`);
528
+ }
529
+ await this.api.matter.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, accessories);
530
+ return;
531
+ }
532
+ this.log.info('No discovered devices were mapped to Matter accessories; falling back to example sections');
533
+ }
534
+ // Register example/demo devices by Matter specification sections
88
535
  await this.registerSection4Lighting();
89
536
  await this.registerSection5SmartPlugs();
90
537
  await this.registerSection6Switches();
@@ -1 +1 @@
1
- {"version":3,"file":"platform-matter.js","sourceRoot":"","sources":["../src/platform-matter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform-matter.js","sourceRoot":"","sources":["../src/platform-matter.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>default | @switchbot/homebridge-switchbot</title><meta name="description" content="Documentation for @switchbot/homebridge-switchbot"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">@switchbot/homebridge-switchbot</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="" aria-current="page">default</a></li></ul><h1>Variable default</h1></div><div class="tsd-signature"><span class="tsd-kind-variable">default</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">api</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">API</span><span class="tsd-signature-symbol">)</span> <span class="tsd-signature-symbol">=&gt;</span> <span class="tsd-signature-type">void</span></div><div class="tsd-type-declaration"><h4>Type Declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures"><li class="tsd-signature" id="__type"><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">api</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">API</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">void</span></li><li class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">api</span>: <span class="tsd-signature-type">API</span></span></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></li></ul></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/blob/56f6da4f42b660e2ff5b9a231f1f0c632265fc7f/src/index.ts#L12">index.ts:12</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">@switchbot/homebridge-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
1
+ <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>default | @switchbot/homebridge-switchbot</title><meta name="description" content="Documentation for @switchbot/homebridge-switchbot"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">@switchbot/homebridge-switchbot</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="" aria-current="page">default</a></li></ul><h1>Variable default</h1></div><div class="tsd-signature"><span class="tsd-kind-variable">default</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">api</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">API</span><span class="tsd-signature-symbol">)</span> <span class="tsd-signature-symbol">=&gt;</span> <span class="tsd-signature-type">void</span></div><div class="tsd-type-declaration"><h4>Type Declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures"><li class="tsd-signature" id="__type"><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">api</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">API</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">void</span></li><li class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">api</span>: <span class="tsd-signature-type">API</span></span></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></li></ul></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/blob/226670f563f5f2470de60fb76102084f11fdb5c8/src/index.ts#L12">index.ts:12</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">@switchbot/homebridge-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@switchbot/homebridge-switchbot",
3
3
  "displayName": "SwitchBot",
4
4
  "type": "module",
5
- "version": "5.0.0-beta.2",
5
+ "version": "5.0.0-beta.4",
6
6
  "description": "The SwitchBot plugin allows you to access your SwitchBot device(s) from HomeKit.",
7
7
  "author": "SwitchBot <support@wondertechlabs.com> (https://github.com/SwitchBot)",
8
8
  "contributors": [
package/src/index.ts CHANGED
@@ -13,6 +13,8 @@ export default (api: API): void => {
13
13
  // Call the instance method on the runtime `api` object (optional chaining in case
14
14
  // older homebridge doesn't provide it). Treat undefined as false.
15
15
  const isMatter = Boolean(api.isMatterEnabled?.())
16
+ const log = (api as any).logger ?? console
17
+ log.info?.(`Homebridge SwitchBot Plugin initializing in ${isMatter ? 'Matter' : 'HAP'} mode.`)
16
18
  // If Matter is enabled register the Matter platform, otherwise use HAP platform.
17
19
  api.registerPlatform(PLUGIN_NAME, PLATFORM_NAME, isMatter ? SwitchBotMatterPlatform : SwitchBotHAPPlatform)
18
20
  }
@@ -5,9 +5,12 @@ import type {
5
5
  MatterAccessory,
6
6
  SerializedMatterAccessory,
7
7
  } from 'homebridge'
8
+ import type { bodyChange, device } from 'node-switchbot'
8
9
 
9
10
  import type { SwitchBotPlatformConfig } from './settings.js'
10
11
 
12
+ import { SwitchBotBLE, SwitchBotOpenAPI } from 'node-switchbot'
13
+
11
14
  import {
12
15
  ColorLightAccessory,
13
16
  ColorTemperatureLightAccessory,
@@ -32,7 +35,7 @@ import {
32
35
  WindowBlindAccessory,
33
36
  } from './devices-matter/index.js'
34
37
  import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js'
35
- import { cleanDeviceConfig } from './utils.js'
38
+ import { cleanDeviceConfig, formatDeviceIdAsMac, hs2rgb, rgb2hs, sleep } from './utils.js'
36
39
 
37
40
  /**
38
41
  * MatterPlatform
@@ -47,6 +50,13 @@ export class SwitchBotMatterPlatform implements DynamicPlatformPlugin {
47
50
 
48
51
  // Track restored Matter cached accessories
49
52
  public readonly matterAccessories: Map<string, SerializedMatterAccessory> = new Map()
53
+ // node-switchbot clients
54
+ private switchBotAPI?: SwitchBotOpenAPI
55
+ private switchBotBLE?: SwitchBotBLE
56
+ // discovered devices cache
57
+ private discoveredDevices: device[] = []
58
+ // BLE event handlers keyed by device MAC (formatted)
59
+ private bleEventHandler: { [x: string]: (context: any) => void } = {}
50
60
 
51
61
  constructor(
52
62
  public readonly log: Logging,
@@ -87,10 +97,438 @@ export class SwitchBotMatterPlatform implements DynamicPlatformPlugin {
87
97
  // Register Matter accessories when Homebridge has finished launching
88
98
  this.api.on('didFinishLaunching', () => {
89
99
  this.log.debug('Executed didFinishLaunching callback')
100
+ // Initialize SwitchBot API clients
101
+ try {
102
+ if (this.config.credentials?.token && this.config.credentials?.secret) {
103
+ this.switchBotAPI = new SwitchBotOpenAPI(this.config.credentials.token, this.config.credentials.secret, this.config.options?.hostname)
104
+ // forward basic logs
105
+ if (!this.config.options?.disableLogsforOpenAPI && this.switchBotAPI?.on) {
106
+ this.switchBotAPI.on('log', (l: any) => this.log.debug('[SwitchBot OpenAPI]', l.message))
107
+ }
108
+ } else {
109
+ this.log.debug('SwitchBot OpenAPI credentials not provided; cloud devices will be skipped')
110
+ }
111
+ } catch (e: any) {
112
+ this.log.error('Failed to initialize SwitchBot OpenAPI:', e?.message ?? e)
113
+ }
114
+
115
+ try {
116
+ this.switchBotBLE = new SwitchBotBLE()
117
+ if (!this.config.options?.disableLogsforBLE && this.switchBotBLE?.on) {
118
+ this.switchBotBLE.on('log', (l: any) => this.log.debug('[SwitchBot BLE]', l.message))
119
+ }
120
+ } catch (e: any) {
121
+ this.log.error('Failed to initialize SwitchBot BLE client:', e?.message ?? e)
122
+ }
123
+
124
+ // If BLE scanning is enabled, start scanning and route advertisements to registered handlers
125
+ if (this.config.options?.BLE && this.switchBotBLE) {
126
+ const ble = this.switchBotBLE
127
+ ;(async () => {
128
+ try {
129
+ await ble.startScan()
130
+ } catch (e: any) {
131
+ this.log.error(`Failed to start BLE scanning: ${e?.message ?? e}`)
132
+ }
133
+
134
+ // route advertisements to our handlers
135
+ ble.onadvertisement = async (ad: any) => {
136
+ try {
137
+ const mac = (ad.address || '').toLowerCase()
138
+ const handler = this.bleEventHandler[mac]
139
+ if (handler) {
140
+ await handler(ad.serviceData)
141
+ }
142
+ } catch (e: any) {
143
+ this.log.error(`Failed to handle BLE advertisement: ${e?.message ?? e}`)
144
+ }
145
+ }
146
+ })()
147
+ }
148
+
149
+ // perform device discovery from SwitchBot OpenAPI (if configured)
150
+ void this.discoverDevices()
151
+
90
152
  this.registerMatterAccessories()
91
153
  })
92
154
  }
93
155
 
156
+ /**
157
+ * Map a SwitchBot device object to a MatterAccessory using the device-specific
158
+ * Matter accessory classes in `src/devices-matter`.
159
+ */
160
+ private async createAccessoryFromDevice(dev: device): Promise<MatterAccessory<Record<string, unknown>> | undefined> {
161
+ // Basic metadata
162
+ const displayName = dev.deviceName ?? dev.deviceId ?? 'SwitchBot Device'
163
+ const serial = dev.deviceId ?? 'unknown'
164
+ const manufacturer = 'SwitchBot'
165
+ const model = dev.deviceType ?? 'SwitchBot'
166
+ const firmware = (dev as any).firmware ?? (dev as any).version ?? '0.0.0'
167
+
168
+ // Helper to build a default opts object consumed by the matter device classes
169
+ const baseOpts = {
170
+ uuid: this.api.matter.uuid.generate(serial),
171
+ displayName,
172
+ serialNumber: serial,
173
+ manufacturer,
174
+ model,
175
+ firmwareRevision: String(firmware),
176
+ hardwareRevision: '1.0.0',
177
+ deviceId: dev.deviceId,
178
+ context: { deviceId: dev.deviceId },
179
+ }
180
+
181
+ // Small helper to wrap common OpenAPI on/off commands
182
+ // Helper to send an OpenAPI command
183
+ const sendOpenAPI = async (command: string, parameter = 'default') => {
184
+ const bodyChange: bodyChange = { command, parameter, commandType: 'command' }
185
+ return this.retryCommand(dev, bodyChange, this.config.options?.maxRetries ?? 1, this.config.options?.delayBetweenRetries ?? 1000)
186
+ }
187
+
188
+ // Helper to send a BLE action if Platform BLE is enabled and switchBotBLE exists
189
+ const sendBLE = async (methodName: string, ...args: any[]) => {
190
+ if (!this.switchBotBLE) {
191
+ throw new Error('Platform BLE not available')
192
+ }
193
+ const id = formatDeviceIdAsMac(dev.deviceId)
194
+ const list = await this.switchBotBLE.discover({ model: (dev as any).bleModel, id })
195
+ if (!Array.isArray(list) || list.length === 0) {
196
+ throw new Error('BLE device not found')
197
+ }
198
+ const deviceInst: any = list[0]
199
+ if (typeof deviceInst[methodName] !== 'function') {
200
+ throw new TypeError(`BLE method ${methodName} not available on device`)
201
+ }
202
+ return await deviceInst[methodName](...args)
203
+ }
204
+
205
+ const makeOnOffHandlers = (uuid: string) => ({
206
+ onOff: {
207
+ on: async () => {
208
+ try {
209
+ if (this.config.options?.BLE && this.switchBotBLE) {
210
+ await sendBLE('turnOn')
211
+ } else {
212
+ await sendOpenAPI('turnOn')
213
+ }
214
+ await this.api.matter.updateAccessoryState(uuid, this.api.matter.clusterNames.OnOff, { onOff: true })
215
+ } catch (e: any) {
216
+ this.log.error(`Failed to turn on device ${dev.deviceId}: ${e?.message ?? e}`)
217
+ }
218
+ },
219
+ off: async () => {
220
+ try {
221
+ if (this.config.options?.BLE && this.switchBotBLE) {
222
+ await sendBLE('turnOff')
223
+ } else {
224
+ await sendOpenAPI('turnOff')
225
+ }
226
+ await this.api.matter.updateAccessoryState(uuid, this.api.matter.clusterNames.OnOff, { onOff: false })
227
+ } catch (e: any) {
228
+ this.log.error(`Failed to turn off device ${dev.deviceId}: ${e?.message ?? e}`)
229
+ }
230
+ },
231
+ },
232
+ })
233
+
234
+ // Mapping from SwitchBot deviceType -> constructor
235
+ const mapping: { [key: string]: any } = {
236
+ 'Plug': OnOffOutletAccessory,
237
+ 'Plug Mini (US)': OnOffOutletAccessory,
238
+ 'Plug Mini (JP)': OnOffOutletAccessory,
239
+ 'Color Bulb': ColorLightAccessory,
240
+ 'Ceiling Light': ColorTemperatureLightAccessory,
241
+ 'Ceiling Light Pro': ColorTemperatureLightAccessory,
242
+ 'Strip Light': ExtendedColorLightAccessory,
243
+ 'Dimmable Light': DimmableLightAccessory,
244
+ 'K10+': RoboticVacuumAccessory,
245
+ 'K10+ Pro': RoboticVacuumAccessory,
246
+ 'WoSweeper': RoboticVacuumAccessory,
247
+ 'WoSweeperMini': RoboticVacuumAccessory,
248
+ 'Robot Vacuum Cleaner S1': RoboticVacuumAccessory,
249
+ 'Robot Vacuum Cleaner S1 Plus': RoboticVacuumAccessory,
250
+ 'Robot Vacuum Cleaner S10': RoboticVacuumAccessory,
251
+ 'Smart Lock': DoorLockAccessory,
252
+ 'Smart Lock Pro': DoorLockAccessory,
253
+ 'Motion Sensor': OccupancySensorAccessory,
254
+ 'Contact Sensor': ContactSensorAccessory,
255
+ 'Water Detector': LeakSensorAccessory,
256
+ 'Meter': TemperatureSensorAccessory,
257
+ 'MeterPlus': TemperatureSensorAccessory,
258
+ 'MeterPro': TemperatureSensorAccessory,
259
+ 'WoIOSensor': TemperatureSensorAccessory,
260
+ 'Air Purifier PM2.5': HumiditySensorAccessory,
261
+ 'Battery Circulator Fan': FanAccessory,
262
+ 'Blind Tilt': VenetianBlindAccessory,
263
+ 'Curtain': WindowBlindAccessory,
264
+ 'Curtain3': WindowBlindAccessory,
265
+ 'WoRollerShade': WindowBlindAccessory,
266
+ 'Roller Shade': WindowBlindAccessory,
267
+ 'Relay Switch 1': OnOffSwitchAccessory,
268
+ 'Relay Switch 1PM': OnOffSwitchAccessory,
269
+ }
270
+
271
+ const Ctor = mapping[dev.deviceType ?? '']
272
+ if (!Ctor) {
273
+ this.log.debug(`No Matter mapping for deviceType='${dev.deviceType}', deviceId=${dev.deviceId}`)
274
+ return undefined
275
+ }
276
+
277
+ // Build opts and handlers tailored for basic capabilities
278
+ const uuid = baseOpts.uuid
279
+ const handlers: Record<string, any> = {}
280
+
281
+ // On/Off common
282
+ handlers.onOff = makeOnOffHandlers(uuid).onOff
283
+
284
+ // If this is a light, add brightness and color handlers
285
+ if (['Color Bulb', 'Ceiling Light', 'Ceiling Light Pro', 'Strip Light', 'Dimmable Light'].includes(dev.deviceType ?? '')) {
286
+ // levelControl
287
+ handlers.levelControl = {
288
+ moveToLevelWithOnOff: async (request: any) => {
289
+ try {
290
+ const level = request.level as number
291
+ const percent = Math.round((level / 254) * 100)
292
+ if (this.config.options?.BLE && this.switchBotBLE) {
293
+ await sendBLE('setBrightness', percent)
294
+ } else {
295
+ await sendOpenAPI('setBrightness', `${percent}`)
296
+ }
297
+ await this.api.matter.updateAccessoryState(uuid, this.api.matter.clusterNames.LevelControl, { currentLevel: level })
298
+ } catch (e: any) {
299
+ this.log.error(`Failed to set brightness for ${dev.deviceId}: ${e?.message ?? e}`)
300
+ }
301
+ },
302
+ }
303
+
304
+ // colorControl
305
+ handlers.colorControl = {
306
+ moveToHueAndSaturationLogic: async (request: any) => {
307
+ try {
308
+ const hue = request.hue as number
309
+ const saturation = request.saturation as number
310
+ const [r, g, b] = hs2rgb(Math.round((hue / 254) * 360), Math.round((saturation / 254) * 100))
311
+ if (this.config.options?.BLE && this.switchBotBLE) {
312
+ await sendBLE('setRGB', Number(request.level ?? 100), r, g, b)
313
+ } else {
314
+ await sendOpenAPI('setColor', `${r}:${g}:${b}`)
315
+ }
316
+ await this.api.matter.updateAccessoryState(uuid, this.api.matter.clusterNames.ColorControl, { currentHue: hue, currentSaturation: saturation })
317
+ } catch (e: any) {
318
+ this.log.error(`Failed to set hue/sat for ${dev.deviceId}: ${e?.message ?? e}`)
319
+ }
320
+ },
321
+ moveToColorLogic: async (request: any) => {
322
+ try {
323
+ // MoveToColor gives colorX/colorY values; convert to approximate RGB by mapping to 0-255 scale
324
+ const colorX = request.colorX as number
325
+ const colorY = request.colorY as number
326
+ // Naive conversion: map X/Y into RGB via hue approximation (not colorimetrically accurate)
327
+ const hueApprox = Math.round((colorX / 65535) * 360)
328
+ const satApprox = Math.round((colorY / 65535) * 100)
329
+ const [r, g, b] = hs2rgb(hueApprox, satApprox)
330
+ if (this.config.options?.BLE && this.switchBotBLE) {
331
+ await sendBLE('setRGB', Number(request.level ?? 100), r, g, b)
332
+ } else {
333
+ await sendOpenAPI('setColor', `${r}:${g}:${b}`)
334
+ }
335
+ await this.api.matter.updateAccessoryState(uuid, this.api.matter.clusterNames.ColorControl, { currentX: colorX, currentY: colorY })
336
+ } catch (e: any) {
337
+ this.log.error(`Failed to set XY color for ${dev.deviceId}: ${e?.message ?? e}`)
338
+ }
339
+ },
340
+ }
341
+
342
+ // color temperature — map to kelvin and send setColorTemperature
343
+ handlers.colorTemperature = {
344
+ moveToColorTemperature: async (request: any) => {
345
+ try {
346
+ const kelvin = Math.round(1000000 / Number(request.colorTemperature))
347
+ if (this.config.options?.BLE && this.switchBotBLE) {
348
+ await sendBLE('setColorTemperature', kelvin)
349
+ } else {
350
+ await sendOpenAPI('setColorTemperature', `${kelvin}`)
351
+ }
352
+ await this.api.matter.updateAccessoryState(uuid, this.api.matter.clusterNames.ColorControl, { currentX: request.colorX ?? 0, currentY: request.colorY ?? 0 })
353
+ } catch (e: any) {
354
+ this.log.error(`Failed to set color temperature for ${dev.deviceId}: ${e?.message ?? e}`)
355
+ }
356
+ },
357
+ }
358
+ }
359
+
360
+ const opts = Object.assign({}, baseOpts, { handlers })
361
+
362
+ // Instantiate the device class and return its serialized accessory
363
+ const instance = new Ctor(this.api, this.log, opts)
364
+
365
+ // Register BLE->Matter push handler for this device's MAC (if BLE scanning is active)
366
+ try {
367
+ const mac = formatDeviceIdAsMac(dev.deviceId).toLowerCase()
368
+ // Handler receives advertisement/serviceData when BLE scan events arrive
369
+ this.bleEventHandler[mac] = async (serviceData?: any) => {
370
+ const uuidLocal = baseOpts.uuid
371
+
372
+ // Try to parse BLE advertisement/serviceData first (works without cloud)
373
+ try {
374
+ if (serviceData) {
375
+ // Power
376
+ const power = serviceData.power ?? serviceData.on ?? serviceData.p
377
+ if (power !== undefined) {
378
+ const on = (String(power).toLowerCase() === 'on' || Number(power) === 1)
379
+ await this.api.matter.updateAccessoryState(uuidLocal, this.api.matter.clusterNames.OnOff, { onOff: on })
380
+ }
381
+
382
+ // Brightness
383
+ const brightness = serviceData.brightness ?? serviceData.b
384
+ if (brightness !== undefined) {
385
+ const level = Math.round((Number(brightness) / 100) * 254)
386
+ await this.api.matter.updateAccessoryState(uuidLocal, this.api.matter.clusterNames.LevelControl, { currentLevel: level })
387
+ }
388
+
389
+ // Color (r:g:b or hex or hex without #)
390
+ const color = serviceData.color ?? serviceData.rgb ?? serviceData.c
391
+ if (color !== undefined) {
392
+ let r = 0
393
+ let g = 0
394
+ let b = 0
395
+ const c = String(color)
396
+ if (c.includes(':')) {
397
+ const parts = c.split(':').map(Number)
398
+ ;[r, g, b] = parts
399
+ } else if (c.startsWith('#')) {
400
+ const hex = c.replace('#', '')
401
+ r = Number.parseInt(hex.substring(0, 2), 16)
402
+ g = Number.parseInt(hex.substring(2, 4), 16)
403
+ b = Number.parseInt(hex.substring(4, 6), 16)
404
+ } else if (/^[0-9a-f]{6}$/i.test(c)) {
405
+ r = Number.parseInt(c.substring(0, 2), 16)
406
+ g = Number.parseInt(c.substring(2, 4), 16)
407
+ b = Number.parseInt(c.substring(4, 6), 16)
408
+ }
409
+ const [h, s] = rgb2hs(r, g, b)
410
+ await this.api.matter.updateAccessoryState(uuidLocal, this.api.matter.clusterNames.ColorControl, { currentHue: Math.round((h / 360) * 254), currentSaturation: Math.round((s / 100) * 254) })
411
+ }
412
+
413
+ // If serviceData was present, prefer it and return early
414
+ if (serviceData) {
415
+ return
416
+ }
417
+ }
418
+ } catch (e: any) {
419
+ this.log.debug(`BLE advertisement parsing failed for ${dev.deviceId}: ${e?.message ?? e}`)
420
+ }
421
+
422
+ // Fallback to OpenAPI getDeviceStatus when serviceData is not present or parsing failed
423
+ if (!this.switchBotAPI) {
424
+ return
425
+ }
426
+ try {
427
+ const { response, statusCode } = await this.switchBotAPI.getDeviceStatus(dev.deviceId, this.config.credentials?.token, this.config.credentials?.secret)
428
+ if (!(statusCode === 100 || statusCode === 200)) {
429
+ return
430
+ }
431
+ const respAny: any = response
432
+ const body = respAny?.body ?? respAny
433
+ const status = body?.status ?? body
434
+
435
+ // On/Off
436
+ if (status?.power !== undefined) {
437
+ const on = (String(status.power).toLowerCase() === 'on' || Number(status.power) === 1)
438
+ await this.api.matter.updateAccessoryState(uuidLocal, this.api.matter.clusterNames.OnOff, { onOff: on })
439
+ }
440
+
441
+ // Brightness
442
+ if (status?.brightness !== undefined) {
443
+ const level = Math.round((Number(status.brightness) / 100) * 254)
444
+ await this.api.matter.updateAccessoryState(uuidLocal, this.api.matter.clusterNames.LevelControl, { currentLevel: level })
445
+ }
446
+
447
+ // Color
448
+ if (status?.color !== undefined) {
449
+ const color = String(status.color)
450
+ let r = 0
451
+ let g = 0
452
+ let b = 0
453
+ if (color.includes(':')) {
454
+ const parts = color.split(':').map(Number)
455
+ ;[r, g, b] = parts
456
+ } else if (color.startsWith('#')) {
457
+ const hex = color.replace('#', '')
458
+ r = Number.parseInt(hex.substring(0, 2), 16)
459
+ g = Number.parseInt(hex.substring(2, 4), 16)
460
+ b = Number.parseInt(hex.substring(4, 6), 16)
461
+ }
462
+ const [h, s] = rgb2hs(r, g, b)
463
+ await this.api.matter.updateAccessoryState(uuidLocal, this.api.matter.clusterNames.ColorControl, { currentHue: Math.round((h / 360) * 254), currentSaturation: Math.round((s / 100) * 254) })
464
+ }
465
+ } catch (e: any) {
466
+ this.log.debug(`BLE push handler failed for ${dev.deviceId}: ${e?.message ?? e}`)
467
+ }
468
+ }
469
+ } catch (e: any) {
470
+ this.log.debug(`Failed to register BLE handler for ${dev.deviceId}: ${e?.message ?? e}`)
471
+ }
472
+
473
+ return instance.toAccessory()
474
+ }
475
+
476
+ /**
477
+ * Discover devices via SwitchBot OpenAPI and cache them for later use
478
+ */
479
+ private async discoverDevices(): Promise<void> {
480
+ if (!this.switchBotAPI) {
481
+ this.log.debug('SwitchBot OpenAPI not configured; skipping discovery')
482
+ return
483
+ }
484
+
485
+ try {
486
+ const { response, statusCode } = await this.switchBotAPI.getDevices()
487
+ this.log.debug(`SwitchBot getDevices response status: ${statusCode}`)
488
+ if (statusCode === 100 || statusCode === 200) {
489
+ const deviceList = Array.isArray(response?.body?.deviceList) ? response.body.deviceList : []
490
+ this.discoveredDevices = deviceList
491
+ this.log.info(`Discovered ${deviceList.length} SwitchBot device(s) from OpenAPI`)
492
+ for (const d of deviceList) {
493
+ this.log.debug(` - ${d.deviceName} (${d.deviceType}) id=${d.deviceId}`)
494
+ }
495
+ } else {
496
+ this.log.warn(`SwitchBot getDevices returned status ${statusCode}`)
497
+ }
498
+ } catch (e: any) {
499
+ this.log.error('Failed to discover SwitchBot devices:', e?.message ?? e)
500
+ }
501
+ }
502
+
503
+ /**
504
+ * Retry wrapper for control commands using SwitchBot OpenAPI
505
+ */
506
+ async retryCommand(deviceObj: device, bodyChange: bodyChange, maxRetries = 1, delayBetweenRetries = 1000): Promise<{ response: any, statusCode: number }> {
507
+ let retryCount = 0
508
+ while (retryCount < maxRetries) {
509
+ try {
510
+ if (!this.switchBotAPI) {
511
+ throw new Error('SwitchBot OpenAPI not initialized')
512
+ }
513
+ const { response, statusCode } = await this.switchBotAPI.controlDevice(
514
+ deviceObj.deviceId,
515
+ bodyChange.command,
516
+ bodyChange.parameter,
517
+ bodyChange.commandType as import('node-switchbot').commandType | undefined,
518
+ this.config.credentials?.token,
519
+ this.config.credentials?.secret,
520
+ )
521
+ return { response, statusCode }
522
+ } catch (e: any) {
523
+ this.log.debug(`retryCommand error: ${e?.message ?? e}`)
524
+ }
525
+ retryCount++
526
+
527
+ await sleep(delayBetweenRetries)
528
+ }
529
+ return { response: {}, statusCode: 500 }
530
+ }
531
+
94
532
  /**
95
533
  * Required for DynamicPlatformPlugin
96
534
  * Called when homebridge restores cached accessories from disk at startup
@@ -123,7 +561,32 @@ export class SwitchBotMatterPlatform implements DynamicPlatformPlugin {
123
561
  // Remove accessories that are disabled in config
124
562
  await this.removeDisabledAccessories()
125
563
 
126
- // Register devices by Matter specification sections
564
+ // If we discovered real SwitchBot devices via OpenAPI, map and register them
565
+ if (this.discoveredDevices && this.discoveredDevices.length > 0) {
566
+ this.log.info(`Registering ${this.discoveredDevices.length} discovered SwitchBot device(s) as Matter accessories`)
567
+ const accessories: Array<MatterAccessory<Record<string, unknown>>> = []
568
+ for (const dev of this.discoveredDevices) {
569
+ try {
570
+ const acc = await this.createAccessoryFromDevice(dev)
571
+ if (acc) {
572
+ accessories.push(acc)
573
+ }
574
+ } catch (e: any) {
575
+ this.log.error(`Failed to create Matter accessory for ${dev.deviceId}: ${e?.message ?? e}`)
576
+ }
577
+ }
578
+ if (accessories.length > 0) {
579
+ this.log.info(`✓ Registered ${accessories.length} discovered device(s)`)
580
+ for (const acc of accessories) {
581
+ this.log.info(` - ${acc.displayName}`)
582
+ }
583
+ await this.api.matter.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, accessories)
584
+ return
585
+ }
586
+ this.log.info('No discovered devices were mapped to Matter accessories; falling back to example sections')
587
+ }
588
+
589
+ // Register example/demo devices by Matter specification sections
127
590
  await this.registerSection4Lighting()
128
591
  await this.registerSection5SmartPlugs()
129
592
  await this.registerSection6Switches()