Skip to content

leematt/tplink-lightbulb

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

67 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

tested with LB120

tplink-lightbulb

Control TP-Link smart lightbulbs from nodejs

NPM

This will allow you to control TP-Link smart lightbulbs from nodejs or the command-line. I have only tested with LB120 bulbs, and am eager to add support for more, so send a PR, or even just a pcap file of network traffic to add support for your lightbulb.

command-line

You can install it for your system with this:

npm i -g tplink-lightbulb

Now, you can use it like this:

Usage: tplight <COMMAND> <IP_ADDRESS> [options] [<JSON>]

Commands:
  scan     Scan for lightbulbs
  on       Turn on lightbulb
  off      Turn off lightbulb
  cloud    Get cloud info
  raw      Send a raw JSON command
  details  Get details about the device

Options:
  -?, --help        Show help                                          [boolean]
  --timeout         Timeout for scan (in seconds)                   [default: 0]
  --filter          filter to a specific class of devices (ie: IOT.SMARTBULB)
  --transition, -t  Transition time (for on/off)                    [default: 0]
  --hue, -h         Hue of lightbulb (for on)
  --saturation, -s  Saturation of color (for on)
  --color, -c       Color temperature (for on)
  --brightness, -b  Brightness of light (for on)

Examples:
  tplight scan --timeout=1  Get list of lightbulbs on your network, stop
                                 after 1 second
  tplight on 10.0.0.200     Turn on a light
  tplight off 10.0.0.200    Turn off a light

library

You can install it in your project like this:

npm i -S tplink-lightbulb

Include it in your project like this:

const Bulb = require('tplink-lightbulb')

or for ES6:

import Bulb from 'tplink-lightbulb'

wireshark

If you want to analyze the protocol, you can use the included tplink-smarthome.lua.

Install in the location listed in About Wireshark/Folders/Personal Plugins

I captured packets with tcpdump running on a raspberry pi pretending to be a router. In general, this is a really useful way to capture IOT protocols and mess around with them.

I ssh'd into my pi, ran sudo apt update && sudo apt install tcpdump, then tcpdump -i wlan0 -w lights.pcap

I connected the lights to that network (reset them to factory default by turning the power off/on 5 times, then configure in Kasa app.)

After I did stuff like switch the lights on/off in app, I open the pcap file in wireshark on my desktop.

API

scanEventEmitter

Scan for lightbulbs on your network

infoPromise

Get info about the Bulb

sendPromise

Send a message to a lightbulb (for RAW JS message objects)

setPromise

Change state of lightbulb

daystatPromise

Get schedule info

cloudPromise

Get cloud info from bulb

schedulePromise

Get schedule from bulb

detailsPromise

Get operational details from bulb

encryptBuffer

Badly encrypt message in format bulbs use

decryptBuffer

Badly decrypt message from format bulbs use

scan ⇒ EventEmitter

Scan for lightbulbs on your network

Returns: EventEmitter - Emit light events when lightbulbs are found

Param Type Description
filter string Only return devices with this class, (ie 'IOT.SMARTBULB')

Example

// turn first discovered light off
const scan = Bulb.scan()
  .on('light', light => {
    light.set(false)
      .then(status => {
        console.log(status)
        scan.stop()
      })
  })

info ⇒ Promise

Get info about the Bulb

Returns: Promise - Resolves to info
Example

// get info about a light
const light = new Bulb('10.0.0.200')
light.info()
  .then(info => {
    console.log(info)
  })

send ⇒ Promise

Send a message to a lightbulb (for RAW JS message objects)

Returns: Promise - Resolves with answer

Param Type Description
msg Object Message to send to bulb

Example

const light = new Bulb('10.0.0.200')
light.send({
  'smartlife.iot.smartbulb.lightingservice': {
    'transition_light_state': {
      'on_off': 1,
      'transition_period': 0
    }
})
.then(response => {
  console.log(response)
})
.catch(e => console.error(e))

set ⇒ Promise

Change state of lightbulb

Returns: Promise - Resolves to output of command

Param Type Description
power Boolean On or off
transition Number Transition to new state in this time
options Object Object containing mode, hue, saturation, color_temp, brightness

Example

// turn a light on
const light = new Bulb('10.0.0.200')
light.set(true)
  .then(status => {
    console.log(status)
  })
  .catch(err => console.error(err))

daystat ⇒ Promise

Get schedule info

Returns: Promise - Resolves to schedule info

Param Type Description
month Number Month to check: 1-12
year Number Full year to check: ie 2017

Example

// get the light's schedule for 1/2017
const light = new Bulb('10.0.0.200')
light.schedule(1, 2017)
  .then(schedule => {
    console.log(schedule)
  })
  .catch(e => console.error(e))

cloud ⇒ Promise

Get cloud info from bulb

Returns: Promise - Resolves to cloud info
Example

// get the cloud info for the light
const light = new Bulb('10.0.0.200')
light.cloud()
  .then(info => {
    console.log(info)
  })
  .catch(e => console.error(e))

schedule ⇒ Promise

Get schedule from bulb

Returns: Promise - Resolves to schedule info
Example

// get the bulb's schedule
const light = new Bulb('10.0.0.200')
light.schedule()
  .then(schedule => {
    console.log(schedule)
  })
  .catch(e => console.error(e))

details ⇒ Promise

Get operational details from bulb

Returns: Promise - Resolves to operational details
Example

// get some extra details about the light
const light = new Bulb('10.0.0.200')
light.details()
  .then(details => {
    console.log(details)
  })
  .catch(e => console.error(e))

encrypt ⇒ Buffer

Badly encrypt message in format bulbs use

Returns: Buffer - Encrypted data

Param Type Description
buffer Buffer Buffer of data to encrypt
key Number Encryption key (default is generally correct)

Example

const encrypted = Bulb.encrypt(Buffer.from('super secret text'))

decrypt ⇒ Buffer

Badly decrypt message from format bulbs use

Returns: Buffer - Decrypted data

Param Type Description
buffer Buffer Buffer of data to decrypt
key Number Encryption key (default is generally correct)

Example

const decrypted = Bulb.decrypt(encrypted)

thanks

Thanks to hs100-api to for some good ideas, and tplink-smartplug for a good start to a wireshark dissector and some good ideas.

About

Control TP-Link smart lightbulbs from nodejs

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript 80.9%
  • Lua 19.1%