๐Ÿšจ Active Supply Chain Attack:node-ipc Package Compromised.Learn More โ†’
Socket
Book a DemoSign in
Socket

@switchbot/openapi-cli

Package Overview
Dependencies
Maintainers
4
Versions
39
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@switchbot/openapi-cli

Command-line interface for SwitchBot API v1.1

Source
npmnpm
Version
1.1.0
Version published
Weekly downloads
1K
230.07%
Maintainers
4
Weekly downloads
ย 
Created
Source

@switchbot/openapi-cli

npm version npm downloads license node CI

Command-line interface for the SwitchBot API v1.1. List devices, query live status, send control commands, run scenes, and manage webhooks โ€” all from your terminal or shell scripts.

Table of contents

Features

  • ๐Ÿ”Œ Complete API coverage โ€” every /v1.1 endpoint (devices, scenes, webhooks)
  • ๐Ÿ“š Built-in catalog โ€” offline reference for every device type's supported commands, parameter formats, and status fields (no API call needed)
  • ๐ŸŽจ Dual output modes โ€” colorized tables by default; --json passthrough for jq and scripting
  • ๐Ÿ” Secure credentials โ€” HMAC-SHA256 signed requests; config file written with 0600; env-var override for CI
  • ๐Ÿ” Dry-run mode โ€” preview every mutating request before it hits the API
  • ๐Ÿงช Fully tested โ€” 282 Vitest tests, mocked axios, zero network in CI
  • โšก Shell completion โ€” Bash / Zsh / Fish / PowerShell

Requirements

  • Node.js โ‰ฅ 18
  • A SwitchBot account with Developer Options enabled (see Credentials)

Installation

npm install -g @switchbot/openapi-cli

This adds the switchbot binary to your $PATH.

From source

git clone https://github.com/OpenWonderLabs/switchbot-openapi-cli.git
cd switchbot-openapi-cli
npm install
npm run build
npm link      # optional โ€” expose `switchbot` globally

Verify:

switchbot --version
switchbot --help

Quick start

# 1. Save your credentials (one-time)
switchbot config set-token <token> <secret>

# 2. List every device on your account
switchbot devices list

# 3. Control a device
switchbot devices command <deviceId> turnOn

Credentials

The CLI reads credentials in this order (first match wins):

  • Environment variables โ€” SWITCHBOT_TOKEN and SWITCHBOT_SECRET
  • Config file โ€” ~/.switchbot/config.json (written by config set-token, mode 0600)

Obtain the token and secret from the SwitchBot mobile app: Profile โ†’ Preferences โ†’ Developer Options โ†’ Get Token.

# One-time setup (writes ~/.switchbot/config.json)
switchbot config set-token <token> <secret>

# Or export environment variables (e.g. in CI)
export SWITCHBOT_TOKEN=...
export SWITCHBOT_SECRET=...

# Confirm which source is active and see the masked secret
switchbot config show

Global options

OptionDescription
--jsonPrint the raw JSON response instead of a formatted table
-v, --verboseLog HTTP request/response details to stderr
--dry-runPrint mutating requests (POST/PUT/DELETE) without sending them
--timeout <ms>HTTP request timeout in milliseconds (default: 30000)
--config <path>Override credential file location (default: ~/.switchbot/config.json)
-V, --versionPrint the CLI version
-h, --helpShow help for any command or subcommand

Every subcommand supports --help, and most include a parameter-format reference and examples.

switchbot --help
switchbot devices command --help

--dry-run

Intercepts every non-GET request: the CLI prints the URL/body it would have sent, then exits 0 without contacting the API. GET requests (list, status, query) are still executed so you can preview the state involved.

switchbot devices command ABC123 turnOn --dry-run
# [dry-run] Would POST https://api.switch-bot.com/v1.1/devices/ABC123/commands
# [dry-run] body: {"command":"turnOn","parameter":"default","commandType":"command"}

Commands

config โ€” credential management

switchbot config set-token <token> <secret>   # Save to ~/.switchbot/config.json
switchbot config show                          # Print current source + masked secret

devices โ€” list, status, control

# List all physical devices and IR remote devices
# Columns: deviceId, deviceName, type, controlType, family, roomID, room, hub, cloud
switchbot devices list
switchbot devices list --json | jq '.deviceList[].deviceId'

# Filter by family / room (family & room info requires the 'src: OpenClaw'
# header, which this CLI sends on every request)
switchbot devices list --json | jq '.deviceList[] | select(.familyName == "Home")'
switchbot devices list --json | jq '[.deviceList[], .infraredRemoteList[]] | group_by(.familyName)'

# Query real-time status of a physical device
switchbot devices status <deviceId>
switchbot devices status <deviceId> --json

# Send a control command
switchbot devices command <deviceId> <cmd> [parameter] [--type command|customize]

# Describe a specific device (1 API call): metadata + supported commands + status fields
switchbot devices describe <deviceId>
switchbot devices describe <deviceId> --json

# Discover what's supported (offline reference, no API call)
switchbot devices types                 # List all device types + IR remote types
switchbot devices commands <type>       # Show commands, parameter formats, and status fields
switchbot devices commands Bot
switchbot devices commands "Smart Lock"
switchbot devices commands curtain      # Case-insensitive, substring match

Parameter formats

parameter is optional โ€” omit it for commands like turnOn/turnOff (auto-defaults to "default"). Numeric-only and JSON-object parameters are auto-parsed; strings with colons / commas / semicolons pass through as-is.

For the exact commands and parameter formats a specific device supports, query the built-in catalog:

switchbot devices commands <type>       # e.g. Bot, Curtain, "Smart Lock", "Robot Vacuum Cleaner S10"

Generic parameter shapes (which one applies is decided by the device โ€” see the catalog):

ShapeExample
(none)devices command <id> turnOn
<integer>devices command <id> setBrightness 75
<R:G:B>devices command <id> setColor "255:0:0"
<direction;angle>devices command <id> setPosition "up;60"
<a,b,c,โ€ฆ>devices command <id> setAll "26,1,3,on"
<json object>'{"action":"sweep","param":{"fanLevel":2,"times":1}}'
Custom IR buttondevices command <id> MyButton --type customize

For the complete per-device command reference, see the SwitchBot API docs.

scenes โ€” run manual scenes

switchbot scenes list                 # Columns: sceneId, sceneName
switchbot scenes execute <sceneId>

webhook โ€” receive device events over HTTP

# Register a receiver URL for events from ALL devices
switchbot webhook setup https://your.host/hook

# Query what is currently configured
switchbot webhook query
switchbot webhook query --details https://your.host/hook

# Enable / disable / re-submit the registered URL
switchbot webhook update https://your.host/hook --enable
switchbot webhook update https://your.host/hook --disable

# Remove the configuration
switchbot webhook delete https://your.host/hook

The CLI validates that <url> is an absolute http:// or https:// URL before calling the API. --enable and --disable are mutually exclusive.

completion โ€” shell tab-completion

# Bash: load on every new shell
echo 'source <(switchbot completion bash)' >> ~/.bashrc

# Zsh
echo 'source <(switchbot completion zsh)' >> ~/.zshrc

# Fish
switchbot completion fish > ~/.config/fish/completions/switchbot.fish

# PowerShell (profile)
switchbot completion powershell >> $PROFILE

Supported shells: bash, zsh, fish, powershell (pwsh is accepted as an alias).

Output modes

  • Default โ€” ANSI-colored tables for list/status, key-value tables for details.
  • --json โ€” raw JSON passthrough, ideal for jq and scripting.
switchbot devices list --json | jq '.deviceList[] | {id: .deviceId, name: .deviceName}'

Exit codes & error codes

CodeMeaning
0Success (including --dry-run intercept)
1Runtime error โ€” API error, network failure, missing credentials
2Usage error โ€” bad flag, missing/invalid argument, unknown subcommand, unknown device type, invalid URL, conflicting flags

Typical errors bubble up in the form Error: <message> on stderr. The SwitchBot-specific error codes that get mapped to readable English messages:

CodeMeaning
151Device type error
152Device not found
160Command not supported by this device
161Device offline (BLE devices need a Hub)
171Hub offline
190Device internal error / server busy
401Authentication failed (check token/secret)
429Request rate too high (10,000 req/day cap)

Environment variables

VariableDescription
SWITCHBOT_TOKENAPI token โ€” takes priority over the config file
SWITCHBOT_SECRETAPI secret โ€” takes priority over the config file
NO_COLORDisable ANSI colors in all output (automatically respected)

Scripting examples

# Turn off every Bot device
switchbot devices list --json \
  | jq -r '.deviceList[] | select(.deviceType == "Bot") | .deviceId' \
  | while read id; do switchbot devices command "$id" turnOff; done

# Dump each scene as `<id> <name>`
switchbot scenes list --json | jq -r '.[] | "\(.sceneId) \(.sceneName)"'

Development

git clone https://github.com/OpenWonderLabs/switchbot-openapi-cli.git
cd switchbot-openapi-cli
npm install

npm run dev -- <args>       # Run from TypeScript sources via tsx
npm run build               # Compile to dist/
npm test                    # Run the Vitest suite (282 tests)
npm run test:watch          # Watch mode
npm run test:coverage       # Coverage report (v8, HTML + text)

Project layout

src/
โ”œโ”€โ”€ index.ts              # Commander entry; mounts all subcommands; global flags
โ”œโ”€โ”€ auth.ts               # HMAC-SHA256 signature (token + t + nonce โ†’ sign)
โ”œโ”€โ”€ config.ts             # Credential load/save; env > file priority; --config override
โ”œโ”€โ”€ api/client.ts         # axios instance + request/response interceptors;
โ”‚                         # --verbose / --dry-run / --timeout wiring
โ”œโ”€โ”€ devices/catalog.ts    # Static catalog powering `devices types`/`devices commands`
โ”œโ”€โ”€ commands/
โ”‚   โ”œโ”€โ”€ config.ts
โ”‚   โ”œโ”€โ”€ devices.ts
โ”‚   โ”œโ”€โ”€ scenes.ts
โ”‚   โ”œโ”€โ”€ webhook.ts
โ”‚   โ””โ”€โ”€ completion.ts     # `switchbot completion bash|zsh|fish|powershell`
โ””โ”€โ”€ utils/
    โ”œโ”€โ”€ flags.ts          # Global flag readers (isVerbose / isDryRun / getTimeout / getConfigPath)
    โ””โ”€โ”€ output.ts         # printTable / printKeyValue / printJson / handleError
tests/                    # Vitest suite (282 tests, mocked axios, no network)

Release flow

Releases are cut on tag push and published to npm by GitHub Actions:

npm version patch        # bump version + create git tag
git push --follow-tags

Then on GitHub โ†’ Releases โ†’ Draft a new release โ†’ select tag โ†’ Publish. The publish.yml workflow runs tests, verifies the tag matches package.json, and publishes @switchbot/openapi-cli to npm with provenance.

Contributing

Bug reports, feature requests, and PRs are welcome.

  • Fork the repo and create a topic branch.
  • Keep changes small and focused; add or update Vitest cases for any behavior change.
  • Run npm test and npm run build locally โ€” both must pass.
  • Open a pull request against main. CI runs on Node 18/20/22; all three must stay green.

License

MIT ยฉ chenliuyun

References

Keywords

switchbot

FAQs

Package last updated on 17 Apr 2026

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts