node-switchbot
Version:
The node-switchbot is a Node.js module which allows you to control your Switchbot Devices through Bluetooth (BLE) with automatic OpenAPI fallback.
317 lines • 10.8 kB
JavaScript
/**
* Passive polling interval (24 hours)
*/
// ms
/* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
*
* settings.ts: SwitchBot v4.0.0 - Configuration and Constants
*/
import process from 'node:process';
export const PASSIVE_POLL_INTERVAL = 60 * 60 * 24 * 1000;
/**
* OpenAPI Configuration
*/
export const DEFAULT_BASE_URL = 'https://api.switch-bot.com';
export const API_VERSION = 'v1.1';
export const urls = {
base: DEFAULT_BASE_URL,
devices: `${DEFAULT_BASE_URL}/${API_VERSION}/devices`,
scenes: `${DEFAULT_BASE_URL}/${API_VERSION}/scenes`,
webhook: `${DEFAULT_BASE_URL}/${API_VERSION}/webhook`,
};
/**
* Update the base URL for all API endpoints
* @param newBaseURL - The new base URL to use
*/
export function updateBaseURL(newBaseURL) {
urls.base = newBaseURL;
urls.devices = `${newBaseURL}/${API_VERSION}/devices`;
urls.scenes = `${newBaseURL}/${API_VERSION}/scenes`;
urls.webhook = `${newBaseURL}/${API_VERSION}/webhook`;
}
/**
* BLE Configuration
*/
export const BLE_SERVICE_UUID = 'cba20d00224d11e69fb80002a5d5c51b';
export const BLE_WRITE_CHARACTERISTIC_UUID = 'cba20002224d11e69fb80002a5d5c51b';
export const BLE_NOTIFY_CHARACTERISTIC_UUID = 'cba20003224d11e69fb80002a5d5c51b';
// Alternative UUIDs for specific devices
export const SERV_UUID_PRIMARY = 'cba20d00-224d-11e6-9fb8-0002a5d5c51b';
export const CHAR_UUID_WRITE = 'cba20002-224d-11e6-9fb8-0002a5d5c51b';
export const CHAR_UUID_NOTIFY = 'cba20003-224d-11e6-9fb8-0002a5d5c51b';
export const CHAR_UUID_DEVICE = 'cba20d00-224d-11e6-9fb8-0002a5d5c51b';
/**
* BLE Timeouts (in milliseconds)
*/
export const BLE_SCAN_TIMEOUT = 10000;
export const BLE_CONNECT_TIMEOUT = 10000;
export const BLE_COMMAND_TIMEOUT = 5000;
export const READ_TIMEOUT_MSEC = 10000;
export const WRITE_TIMEOUT_MSEC = 10000;
/**
* Device Command Constants
*/
export const DEVICE_COMMANDS = {
// Bot (WoHand)
BOT: {
PRESS: [0x57, 0x01, 0x00],
TURN_ON: [0x57, 0x01, 0x01],
TURN_OFF: [0x57, 0x01, 0x02],
DOWN: [0x57, 0x01, 0x01],
UP: [0x57, 0x01, 0x02],
SET_MODE: [0x57, 0x0F, 0x47, 0x01],
SET_LONG_PRESS: [0x57, 0x0F, 0x47, 0x03],
},
// Curtain (WoCurtain)
CURTAIN: {
OPEN: [0x57, 0x0F, 0x45, 0x01, 0x05, 0xFF, 0x00],
CLOSE: [0x57, 0x0F, 0x45, 0x01, 0x05, 0xFF, 0x64],
PAUSE: [0x57, 0x0F, 0x45, 0x01, 0x00, 0xFF],
POSITION: [0x57, 0x0F, 0x45, 0x01, 0x05], // Append mode byte and position byte
EXTENDED_INFO: [0x57, 0x0F, 0x46, 0x01], // Get device chain and grouped status
},
// Blind Tilt
BLIND_TILT: {
OPEN: [0x57, 0x0F, 0x45, 0x01, 0x05, 0xFF, 0x32],
CLOSE_UP: [0x57, 0x0F, 0x45, 0x01, 0x05, 0xFF, 0x64],
CLOSE_DOWN: [0x57, 0x0F, 0x45, 0x01, 0x05, 0xFF, 0x00],
PAUSE: [0x57, 0x0F, 0x45, 0x01, 0x00, 0xFF],
},
// Bulb (WoBulb)
BULB: {
BASE: [0x57, 0x0F, 0x47, 0x01],
READ_STATE: [0x57, 0x0F, 0x48, 0x01],
TURN_ON: [0x01, 0x01],
TURN_OFF: [0x01, 0x02],
SET_BRIGHTNESS: [0x02, 0x14], // Add brightness byte
SET_COLOR_TEMP: [0x02, 0x17], // Add temp bytes
SET_RGB: [0x02, 0x12], // Add RGB bytes
SET_EFFECT: [0x03],
},
// Humidifier
HUMIDIFIER: {
HEADER: '5701',
TURN_ON: '570101',
TURN_OFF: '570102',
INCREASE: '570103',
DECREASE: '570104',
SET_AUTO_MODE: '570105',
SET_MANUAL_MODE: '570106',
},
// Air Purifier
AIR_PURIFIER: {
TURN_ON: [0x57, 0x01, 0x01],
TURN_OFF: [0x57, 0x01, 0x02],
SET_MODE: [0x57, 0x02], // Add mode byte
SET_SPEED: [0x57, 0x03], // Add speed byte
},
// Vacuum
VACUUM: {
CLEAN_UP: {
1: [0x57, 0x0F, 0x5A, 0x00, 0xFF, 0xFF, 0x70, 0x01],
2: [0x5A, 0x40, 0x01, 0x01, 0x01, 0x01, 0x26],
},
RETURN_TO_DOCK: {
1: [0x57, 0x0F, 0x5A, 0x00, 0xFF, 0xFF, 0x70, 0x02],
2: [0x5A, 0x40, 0x01, 0x01, 0x01, 0x02, 0x25],
},
},
// Plug
PLUG: {
TURN_ON: [0x57, 0x0F, 0x50, 0x01, 0x01],
TURN_OFF: [0x57, 0x0F, 0x50, 0x01, 0x02],
TOGGLE: [0x57, 0x0F, 0x50, 0x01, 0x00],
},
RELAY: {
GET_BASIC_INFO: [0x57, 0x02],
CHANNEL1_ON: [0x57, 0x0F, 0x50, 0x01, 0x01],
CHANNEL1_OFF: [0x57, 0x0F, 0x50, 0x01, 0x02],
CHANNEL2_ON: [0x57, 0x0F, 0x50, 0x02, 0x01],
CHANNEL2_OFF: [0x57, 0x0F, 0x50, 0x02, 0x02],
},
// Common commands
COMMON: {
POWER_ON: [0x57, 0x01, 0x01],
POWER_OFF: [0x57, 0x01, 0x02],
},
};
/**
* Lock Command Constants (WoSmartLock)
*/
export const WoSmartLockCommands = {
LOCK: [0x57, 0x0F, 0x4E, 0x01, 0x00],
UNLOCK: [0x57, 0x0F, 0x4E, 0x01, 0x01],
};
/**
* Lock Pro Command Constants (WoSmartLockPro)
*/
export const WoSmartLockProCommands = {
LOCK: [0x57, 0x0F, 0x4F, 0x01, 0x00],
UNLOCK: [0x57, 0x0F, 0x4F, 0x01, 0x01],
UNLATCH: [0x57, 0x0F, 0x4F, 0x01, 0x02],
};
/**
* Device Model to Type Mapping
*/
export const DEVICE_MODEL_MAP = {
'H': 'Bot',
'c': 'Curtain',
'{': 'Curtain3',
'g': 'Plug',
'j': 'Plug Mini (US)',
'T': 'Meter',
'i': 'Meter Plus',
'o': 'Lock',
'\x11': 'Lock Pro',
'k': 'Keypad',
'\x0B': 'Keypad Touch',
's': 'Motion Sensor',
'd': 'Contact Sensor',
'q': 'Ceiling Light',
'r': 'Ceiling Light Pro',
'p': 'Strip Light',
'u': 'Color Bulb',
'\x0A': 'Robot Vacuum Cleaner S1',
'\x0C': 'Robot Vacuum Cleaner S1 Plus',
'\x0F': 'Robot Vacuum Cleaner K10 Plus',
'e': 'Humidifier',
'\x07': 'Humidifier 2',
'x': 'Blind Tilt',
'\x01': 'Hub 2',
'\x02': 'Hub 3',
'\x05': 'Remote',
'\x04': 'Battery Circulator Fan',
'\x08': 'Air Purifier',
'\x09': 'Air Purifier Table',
'y': 'Water Leak Detector',
'\x06': 'Presence Sensor',
'\x0D': 'Relay Switch 1PM',
'\x0E': 'Relay Switch 1',
'\x10': 'K10+ Pro Combo',
'w': 'Meter Pro (CO2)',
'n': 'Outdoor Meter',
};
/**
* Device Type to Class Name Mapping
*/
export const DEVICE_CLASS_MAP = {
'Bot': 'WoHand',
'Curtain': 'WoCurtain',
'Curtain3': 'WoCurtain',
'Roller Shade': 'WoRollerShade',
'SwitchBot Roller Shade': 'WoRollerShade',
'Plug': 'WoPlugMiniUS',
'WoPlugUS': 'WoPlugMiniUS',
'Plug Mini (US)': 'WoPlugMiniUS',
'Plug Mini (JP)': 'WoPlugMiniJP',
'Plug Mini (EU)': 'WoPlugMiniEU',
'Meter': 'WoSensorTH',
'Meter Plus': 'WoSensorTHPlus',
'Meter Pro': 'WoSensorTHPro',
'Meter Pro (CO2)': 'WoSensorTHProCO2',
'Outdoor Meter': 'WoIOSensorTH',
'Lock': 'WoSmartLock',
'Lock Lite': 'WoSmartLockLite',
'Lock Pro': 'WoSmartLockPro',
'Lock Pro WiFi': 'WoSmartLockProWiFi',
'Lock Vision': 'WoSmartLockVision',
'Lock Vision Pro': 'WoSmartLockVisionPro',
'Keypad': 'WoKeypad',
'Keypad Touch': 'WoKeypad',
'Keypad Vision': 'WoKeypadVision',
'SwitchBot Keypad Vision': 'WoKeypadVision',
'Keypad Vision Pro': 'WoKeypadVisionPro',
'SwitchBot Keypad Vision Pro': 'WoKeypadVisionPro',
'Motion Sensor': 'WoPresence',
'Contact Sensor': 'WoContact',
'Ceiling Light': 'WoCeilingLight',
'Ceiling Light Pro': 'WoCeilingLight',
'Strip Light': 'WoStrip',
'Strip Light 3': 'WoStripLight3',
'SwitchBot Strip Light 3': 'WoStripLight3',
'Color Bulb': 'WoBulb',
'Floor Lamp': 'WoFloorLamp',
'SwitchBot Floor Lamp': 'WoFloorLamp',
'RGBICWW Strip Light': 'WoRGBICWWStripLight',
'SwitchBot RGBICWW Strip Light': 'WoRGBICWWStripLight',
'RGBICWW Floor Lamp': 'WoRGBICWWFloorLamp',
'SwitchBot RGBICWW Floor Lamp': 'WoRGBICWWFloorLamp',
'Art Frame': 'WoArtFrame',
'SwitchBot Art Frame': 'WoArtFrame',
'Robot Vacuum Cleaner S1': 'WoVacuumS10',
'Robot Vacuum Cleaner S1 Plus': 'WoVacuumS20',
'Robot Vacuum Cleaner K10 Plus': 'WoVacuumK10Plus',
'Robot Vacuum Cleaner K10+': 'WoVacuumK10Plus',
'Robot Vacuum Cleaner K10+ Pro': 'WoVacuumK10Pro',
'Robot Vacuum Cleaner K11+': 'WoVacuumK11Plus',
'Robot Vacuum Cleaner K20': 'WoVacuumK20',
'Robot Vacuum Cleaner S10': 'WoVacuumS10',
'Robot Vacuum Cleaner S20': 'WoVacuumS20',
'Humidifier': 'WoHumi',
'Humidifier 2': 'WoHumi2',
'Evaporative Humidifier': 'WoHumi2',
'Evaporative Humidifier (Auto-refill)': 'WoHumi2',
'SwitchBot Evaporative Humidifier (Auto-refill)': 'WoHumi2',
'Blind Tilt': 'WoBlindTilt',
'Hub 2': 'WoHub2',
'Hub 3': 'WoHub3',
'SwitchBot Hub 3': 'WoHub3',
'Hub Mini': 'WoHub2',
'HubMini Matter': 'WoHubMiniMatter',
'SwitchBot HubMini Matter': 'WoHubMiniMatter',
'Hub Plus': 'WoHub2',
'Remote': 'WoRemote',
'Battery Circulator Fan': 'WoCirculatorFan',
'Circulator Fan': 'WoCirculatorFan',
'USB Circulator Fan': 'WoCirculatorFan',
'Smart Thermostat Radiator': 'WoSmartThermostatRadiator',
'Thermostat Radiator': 'WoSmartThermostatRadiator',
'Radiator Thermostat': 'WoSmartThermostatRadiator',
'Climate Panel': 'WoClimatePanel',
'Smart Climate Panel': 'WoClimatePanel',
'Air Purifier': 'WoAirPurifier',
'Air Purifier Table': 'WoAirPurifierTable',
'Water Leak Detector': 'WoLeak',
'Presence Sensor': 'WoPresence',
'Relay Switch 1PM': 'WoRelaySwitch1PM',
'Relay Switch 1': 'WoRelaySwitch1',
'Relay Switch 2PM': 'WoRelaySwitch2PM',
'Garage Door Opener': 'WoGarageDoorOpener',
'K10+ Pro Combo': 'WoVacuumK10ProCombo',
'Robot Vacuum Cleaner K10+ Pro Combo': 'WoVacuumK10ProCombo',
// User-reported unknown device types
'Air Purifier PM2.5': 'WoAirPurifierPM25',
'K10+': 'WoVacuumK10Plus',
'K10+ Pro': 'WoVacuumK10Pro',
'RGBIC Neon Wire Rope Light': 'WoRGBICNeonWireRopeLight',
'Candle Warmer Lamp': 'WoCandleWarmerLamp',
'Pan/Tilt Cam Plus 3K': 'WoPanTiltCamPlus3K',
'remote with screen': 'WoRemoteWithScreen',
'AI Hub': 'WoAIHub',
'Water Detector': 'WoWaterDetector',
};
/**
* Default configuration values
*/
export const DEFAULTS = {
logLevel: 2, // WARN
scanTimeout: BLE_SCAN_TIMEOUT,
connectTimeout: BLE_CONNECT_TIMEOUT,
commandTimeout: BLE_COMMAND_TIMEOUT,
enableBLE: true,
enableFallback: true,
baseURL: DEFAULT_BASE_URL,
enableConnectionIntelligence: true,
enableCircuitBreaker: true,
enableRetry: true,
maxRetryAttempts: 3,
retryInitialDelayMs: 100,
retryMaxDelayMs: 5000,
};
/**
* Platform detection
*/
export const IS_LINUX = process.platform === 'linux';
export const IS_MACOS = process.platform === 'darwin';
export const BLE_SUPPORTED = IS_LINUX || IS_MACOS;
//# sourceMappingURL=settings.js.map