Skip to content

Commit

Permalink
add Model Friendly Name
Browse files Browse the repository at this point in the history
  • Loading branch information
donavanbecker committed Jun 7, 2024
1 parent 1a0425f commit a0c2dc8
Show file tree
Hide file tree
Showing 19 changed files with 1,233 additions and 336 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ All notable changes to this project will be documented in this file. This projec
## [2.2.0](https://github.com/OpenWonderLabs/node-switchbot/releases/tag/v2.2.0) (2024-XX-XX)

### What's Changed
- Add Model Friendly Name for each deviceType
- Add SwitchBot Hub 2 Support
- Add bassic support for SwitchBot Lock Pro
- Housekeeping and update dependencies

**Full Changelog**: https://github.com/OpenWonderLabs/node-switchbot/compare/v2.1.1...v2.2.0
Expand Down
1,458 changes: 1,159 additions & 299 deletions package-lock.json

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,16 +45,16 @@
"@eslint/js": "^9.4.0",
"@stylistic/eslint-plugin": "^2.1.0",
"@types/eslint__js": "^8.42.3",
"@types/node": "^20.14.0",
"@types/node": "^20.14.2",
"eslint": "^9.4.0",
"globals": "^15.3.0",
"globals": "^15.4.0",
"homebridge": "^1.8.2",
"homebridge-config-ui-x": "4.56.2",
"nodemon": "^3.1.2",
"nodemon": "^3.1.3",
"npm-check-updates": "^16.14.20",
"rimraf": "^5.0.7",
"ts-node": "^10.9.2",
"typescript": "^5.4.5",
"typescript-eslint": "^8.0.0-alpha.25"
"typescript-eslint": "^8.0.0-alpha.28"
}
}
2 changes: 1 addition & 1 deletion src/advertising.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ export class Advertising {
sd = WoSensorTH.parseServiceData_Plus(buf, onlog);
break;
case SwitchBotBLEModel.Hub2:
sd = WoHub2.parseServiceData(buf, onlog);
sd = WoHub2.parseServiceData(manufacturerData, onlog);
break;
case SwitchBotBLEModel.OutdoorMeter:
sd = WoIOSensorTH.parseServiceData(buf, manufacturerData, onlog);
Expand Down
3 changes: 2 additions & 1 deletion src/device/woblindtilt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* woblindtilt.ts: Switchbot BLE API registration.
*/
import { SwitchbotDevice } from '../device.js';
import { SwitchBotBLEModel, SwitchBotBLEModelName } from '../types.js';
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';

export class WoBlindTilt extends SwitchbotDevice {
static parseServiceData(buf: Buffer, onlog: ((message: string) => void) | undefined) {
Expand All @@ -27,6 +27,7 @@ export class WoBlindTilt extends SwitchbotDevice {
const data = {
model: SwitchBotBLEModel.BlindTilt,
modelName: SwitchBotBLEModelName.BlindTilt,
modelFriendlyName: SwitchBotBLEModelFriendlyName.BlindTilt,
calibration: calibration,
battery: battery,
inMotion: inMotion,
Expand Down
3 changes: 2 additions & 1 deletion src/device/wobulb.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* wobulb.ts: Switchbot BLE API registration.
*/
import { SwitchbotDevice } from '../device.js';
import { SwitchBotBLEModel, SwitchBotBLEModelName } from '../types.js';
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';

/**
* @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/blob/latest/devicetypes/colorbulb.md
Expand Down Expand Up @@ -45,6 +45,7 @@ export class WoBulb extends SwitchbotDevice {
const data = {
model: SwitchBotBLEModel.ColorBulb,
modelName: SwitchBotBLEModelName.ColorBulb,
modelFriendlyName: SwitchBotBLEModelFriendlyName.ColorBulb,
color_temperature: color_temperature,
power: power,
state: state,
Expand Down
3 changes: 2 additions & 1 deletion src/device/wocontact.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* wocontact.ts: Switchbot BLE API registration.
*/
import { SwitchbotDevice } from '../device.js';
import { SwitchBotBLEModel, SwitchBotBLEModelName } from '../types.js';
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';

export class WoContact extends SwitchbotDevice {
static parseServiceData(buf: Buffer, onlog: ((message: string) => void) | undefined) {
Expand Down Expand Up @@ -33,6 +33,7 @@ export class WoContact extends SwitchbotDevice {
const data = {
model: SwitchBotBLEModel.ContactSensor,
modelName: SwitchBotBLEModelName.ContactSensor,
modelFriendlyName: SwitchBotBLEModelFriendlyName.ContactSensor,
movement: movement,
tested: tested,
battery: battery,
Expand Down
11 changes: 4 additions & 7 deletions src/device/wocurtain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* wocurtain.ts: Switchbot BLE API registration.
*/
import { SwitchbotDevice } from '../device.js';
import { SwitchBotBLEModelName } from '../types.js';
import { SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';

export class WoCurtain extends SwitchbotDevice {
static parseServiceData(buf: Buffer, onlog: ((message: string) => void) | undefined) {
Expand All @@ -27,16 +27,13 @@ export class WoCurtain extends SwitchbotDevice {
const lightLevel = (byte4 >> 4) & 0b00001111; // light sensor level (1-10)
const deviceChain = byte4 & 0b00000111;
const model = buf.subarray(0, 1).toString('utf8');
let modelName;
if (model === 'c') {
modelName = SwitchBotBLEModelName.Curtain;
} else {
modelName = SwitchBotBLEModelName.Curtain3;
}
const modelName = model === 'c' ? SwitchBotBLEModelName.Curtain : SwitchBotBLEModelName.Curtain3;
const modelFriendlyName = model === 'c' ? SwitchBotBLEModelFriendlyName.Curtain : SwitchBotBLEModelFriendlyName.Curtain3;

const data = {
model: model,
modelName: modelName,
modelFriendlyName: modelFriendlyName,
calibration: calibration,
battery: battery,
inMotion: inMotion,
Expand Down
3 changes: 2 additions & 1 deletion src/device/wohand.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* wohand.ts: Switchbot BLE API registration.
*/
import { SwitchbotDevice } from '../device.js';
import { SwitchBotBLEModel, SwitchBotBLEModelName } from '../types.js';
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';

export class WoHand extends SwitchbotDevice {
static parseServiceData(buf: Buffer, onlog: ((message: string) => void) | undefined) {
Expand All @@ -25,6 +25,7 @@ export class WoHand extends SwitchbotDevice {
const data = {
model: SwitchBotBLEModel.Bot,
modelName: SwitchBotBLEModelName.Bot,
modelFriendlyName: SwitchBotBLEModelFriendlyName.Bot,
mode: mode,
state: state,
battery: battery,
Expand Down
17 changes: 9 additions & 8 deletions src/device/wohub2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,22 @@
* wohub2.ts: Switchbot BLE API registration.
*/
import { SwitchbotDevice } from '../device.js';
import { SwitchBotBLEModel, SwitchBotBLEModelName } from '../types.js';
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';

export class WoHub2 extends SwitchbotDevice {
static parseServiceData(buf: Buffer, onlog: ((message: string) => void) | undefined) {
if (buf.length !== 16) {
static parseServiceData(manufacturerData: Buffer, onlog: ((message: string) => void) | undefined) {
if (manufacturerData.length !== 16) {
if (onlog && typeof onlog === 'function') {
onlog(
`[parseServiceDataForWoSensorTH] Buffer length ${buf.length} !== 16!`,
`[parseServiceDataForWoSensorTH] Buffer length ${manufacturerData.length} !== 16!`,
);
}
return null;
}
const byte0 = buf.readUInt8(0);
const byte1 = buf.readUInt8(1);
const byte2 = buf.readUInt8(2);
const byte12 = buf.readUInt8(12);
const byte0 = manufacturerData.readUInt8(0);
const byte1 = manufacturerData.readUInt8(1);
const byte2 = manufacturerData.readUInt8(2);
const byte12 = manufacturerData.readUInt8(12);

const temp_sign = byte1 & 0b10000000 ? 1 : -1;
const temp_c = temp_sign * ((byte1 & 0b01111111) + (byte0 & 0b00001111) / 10);
Expand All @@ -28,6 +28,7 @@ export class WoHub2 extends SwitchbotDevice {
const data = {
model: SwitchBotBLEModel.Hub2,
modelName: SwitchBotBLEModelName.Hub2,
modelFriendlyName: SwitchBotBLEModelFriendlyName.Hub2,
temperature: {
c: temp_c,
f: temp_f,
Expand Down
3 changes: 2 additions & 1 deletion src/device/wohumi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* wohumi.ts: Switchbot BLE API registration.
*/
import { SwitchbotDevice } from '../device.js';
import { SwitchBotBLEModel, SwitchBotBLEModelName } from '../types.js';
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';

export class WoHumi extends SwitchbotDevice {
static parseServiceData(buf: Buffer, onlog: ((message: string) => void) | undefined) {
Expand All @@ -26,6 +26,7 @@ export class WoHumi extends SwitchbotDevice {
const data = {
model: SwitchBotBLEModel.Humidifier,
modelName: SwitchBotBLEModelName.Humidifier,
modelFriendlyName: SwitchBotBLEModelFriendlyName.Humidifier,
onState: onState,
autoMode: autoMode,
percentage: autoMode ? 0 : percentage,
Expand Down
3 changes: 2 additions & 1 deletion src/device/woiosensorth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* woiosensorth.ts: Switchbot BLE API registration.
*/
import { SwitchbotDevice } from '../device.js';
import { SwitchBotBLEModel, SwitchBotBLEModelName } from '../types.js';
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';

export class WoIOSensorTH extends SwitchbotDevice {
static parseServiceData(serviceDataBuf: Buffer, manufacturerDataBuf: Buffer, onlog: ((message: string) => void) | undefined) {
Expand Down Expand Up @@ -36,6 +36,7 @@ export class WoIOSensorTH extends SwitchbotDevice {
const data = {
model: SwitchBotBLEModel.OutdoorMeter,
modelName: SwitchBotBLEModelName.OutdoorMeter,
modelFriendlyName: SwitchBotBLEModelFriendlyName.OutdoorMeter,
temperature: {
c: temp_c,
f: temp_f,
Expand Down
3 changes: 2 additions & 1 deletion src/device/woplugmini.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* woplugmini.ts: Switchbot BLE API registration.
*/
import { SwitchbotDevice } from '../device.js';
import { SwitchBotBLEModel, SwitchBotBLEModelName } from '../types.js';
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';

/**
* @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/blob/latest/devicetypes/plugmini.md
Expand Down Expand Up @@ -36,6 +36,7 @@ export class WoPlugMini extends SwitchbotDevice {
const data = {
model: SwitchBotBLEModel.PlugMiniUS,
modelName: SwitchBotBLEModelName.PlugMini,
modelFriendlyName: SwitchBotBLEModelFriendlyName.PlugMini,
state: state,
delay: delay,
timer: timer,
Expand Down
3 changes: 2 additions & 1 deletion src/device/wopresence.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* wopresence.ts: Switchbot BLE API registration.
*/
import { SwitchbotDevice } from '../device.js';
import { SwitchBotBLEModel, SwitchBotBLEModelName } from '../types.js';
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';

export class WoPresence extends SwitchbotDevice {
static parseServiceData(buf: Buffer, onlog: ((message: string) => void) | undefined) {
Expand Down Expand Up @@ -32,6 +32,7 @@ export class WoPresence extends SwitchbotDevice {
const data = {
model: SwitchBotBLEModel.MotionSensor,
modelName: SwitchBotBLEModelName.MotionSensor,
modelFriendlyName: SwitchBotBLEModelFriendlyName.MotionSensor,
tested: tested,
movement: movement,
battery: battery,
Expand Down
8 changes: 5 additions & 3 deletions src/device/wosensorth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* wosensorth.ts: Switchbot BLE API registration.
*/
import { SwitchbotDevice } from '../device.js';
import { SwitchBotBLEModel, SwitchBotBLEModelName } from '../types.js';
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';

export class WoSensorTH extends SwitchbotDevice {
static parseServiceData(buf: Buffer, onlog: ((message: string) => void) | undefined) {
Expand All @@ -27,6 +27,7 @@ export class WoSensorTH extends SwitchbotDevice {
const data = {
model: SwitchBotBLEModel.Meter,
modelName: SwitchBotBLEModelName.Meter,
modelFriendlyName: 'Meter',
temperature: {
c: temp_c,
f: temp_f,
Expand Down Expand Up @@ -58,8 +59,9 @@ export class WoSensorTH extends SwitchbotDevice {
const temp_f = Math.round(((temp_c * 9 / 5) + 32) * 10) / 10;

const data = {
model: 'i',
modelName: 'WoSensorTHPlus',
model: SwitchBotBLEModel.MeterPlus,
modelName: SwitchBotBLEModelName.Meter,
modelfriendlyName: SwitchBotBLEModelFriendlyName.Meter,
temperature: {
c: temp_c,
f: temp_f,
Expand Down
5 changes: 4 additions & 1 deletion src/device/wosmartlock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* adapted off the work done by [pySwitchbot](https://github.com/Danielhiversen/pySwitchbot)
*/
import { SwitchbotDevice } from '../device.js';
import { SwitchBotBLEModel, SwitchBotBLEModelName } from '../types.js';
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';
import Noble from '@stoprocent/noble';
import * as Crypto from 'crypto';

Expand All @@ -17,6 +17,8 @@ export class WoSmartLock extends SwitchbotDevice {
static COMMAND_UNLOCK = '570f4e01011080';
static COMMAND_UNLOCK_NO_UNLATCH = '570f4e010110a0';
static COMMAND_LOCK = '570f4e01011000';
static COMMAND_ENABLE_NOTIFICATIONS = '0e01001e00008101';
static COMMAND_DISABLE_NOTIFICATIONS = '0e00';

static Result = {
ERROR: 0x00,
Expand Down Expand Up @@ -87,6 +89,7 @@ export class WoSmartLock extends SwitchbotDevice {
const data = {
model: SwitchBotBLEModel.Lock,
modelName: SwitchBotBLEModelName.Lock,
modelFriendlyName: SwitchBotBLEModelFriendlyName.Lock,
battery: battery,
calibration: calibration,
status: status,
Expand Down
11 changes: 7 additions & 4 deletions src/device/wosmartlockpro.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* adapted off the work done by [pySwitchbot](https://github.com/Danielhiversen/pySwitchbot)
*/
import { SwitchbotDevice } from '../device.js';
import { SwitchBotBLEModel, SwitchBotBLEModelName } from '../types.js';
import { SwitchBotBLEModel, SwitchBotBLEModelName, SwitchBotBLEModelFriendlyName } from '../types.js';
import Noble from '@stoprocent/noble';
import * as Crypto from 'crypto';

Expand All @@ -17,6 +17,8 @@ export class WoSmartLockPro extends SwitchbotDevice {
static COMMAND_UNLOCK = '0f4e0101000180';
static COMMAND_UNLOCK_NO_UNLATCH = '570f4e010110a0';
static COMMAND_LOCK = '0f4e0101000100';
static COMMAND_ENABLE_NOTIFICATIONS = '0e01001e00008101';
static COMMAND_DISABLE_NOTIFICATIONS = '0e00';

static Result = {
ERROR: 0x00,
Expand Down Expand Up @@ -87,6 +89,7 @@ export class WoSmartLockPro extends SwitchbotDevice {
const data = {
model: SwitchBotBLEModel.LockPro,
modelName: SwitchBotBLEModelName.LockPro,
modelFriendlyName: SwitchBotBLEModelFriendlyName.LockPro,
battery: battery,
calibration: calibration,
status: status,
Expand Down Expand Up @@ -206,7 +209,7 @@ export class WoSmartLockPro extends SwitchbotDevice {
return new Promise((resolve, reject) => {
this._operateLock(WoSmartLockPro.COMMAND_LOCK_INFO)
.then(resBuf => {
const data ={
const data = {
'calibration': Boolean(resBuf[1] & 0b10000000),
'status': WoSmartLockPro.getLockStatus((resBuf[1] & 0b01110000)),
'door_open': Boolean(resBuf[1] & 0b00000100),
Expand All @@ -220,12 +223,12 @@ export class WoSmartLockPro extends SwitchbotDevice {
});
}

_encrypt(str:string) {
_encrypt(str: string) {
const cipher = Crypto.createCipheriv('aes-128-ctr', this._encryption_key!, this._iv);
return Buffer.concat([cipher.update(str, 'hex'), cipher.final()]).toString('hex');
}

_decrypt(data:Buffer) {
_decrypt(data: Buffer) {
const decipher = Crypto.createDecipheriv('aes-128-ctr', this._encryption_key!, this._iv);
return Buffer.concat([decipher.update(data), decipher.final()]);
}
Expand Down
3 changes: 2 additions & 1 deletion src/device/wostrip.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* wostrip.ts: Switchbot BLE API registration.
*/
import { SwitchbotDevice } from '../device.js';
import { SwitchBotBLEModel, SwitchBotBLEModelName } from '../types.js';
import { SwitchBotBLEModel, SwitchBotBLEModelName, SwitchBotBLEModelFriendlyName } from '../types.js';

/**
* @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/blob/latest/devicetypes/colorbulb.md
Expand Down Expand Up @@ -43,6 +43,7 @@ export class WoStrip extends SwitchbotDevice {
const data = {
model: SwitchBotBLEModel.StripLight,
modelName: SwitchBotBLEModelName.StripLight,
modelFriendlyName: SwitchBotBLEModelFriendlyName.StripLight,
state: state,
brightness: brightness,
red: red,
Expand Down
20 changes: 20 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -183,4 +183,24 @@ export enum SwitchBotBLEModelName {
MotionSensor = 'WoMotion',
BlindTilt = 'WoBlindTilt',
Unknown = 'Unknown',
}

export enum SwitchBotBLEModelFriendlyName {
Bot = 'Bot',
Hub2 = 'Hub 2',
ColorBulb = 'Color Bulb',
Curtain = 'Curtain',
Curtain3 = 'Curtain 3',
Humidifier = 'Humidifier',
Meter = 'Meter',
Lock = 'Lock',
LockPro = 'Lock Pro',
PlugMini = 'Plug Mini',
StripLight = 'Strip Light',
MeterPlus = 'Meter Plus',
OutdoorMeter = 'Outdoor Meter',
ContactSensor = 'Contact Sensor',
MotionSensor = 'Motion Sensor',
BlindTilt = 'Blind Tilt',
Unknown = 'Unknown',
}

0 comments on commit a0c2dc8

Please sign in to comment.