コマンドラインからスマートLEDランプ(TP-Link KL110/KL130)をつける

TP-Link社のWifiスマートLEDランプ KL110/KL130 を使って、同一ネットワーク内にあるmacbookからランプをコマンドライン制御します。

<img width="20%" alt="color-temp" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11626/9a29c9dc-3111-a448-7d74-fd079a238adf.png">

このランプの良いところは、電灯のON/OFFだけでなく色温度や輝度を調節できる点です。
例えば

 - 暖色系の色で輝度を落として落ち着いた雰囲気で集中作業する
 - 手元でモノを探すときに輝度を上げる
 - 物理本を読むときに色温度を変える（Kindleの背景の白とセピアくらい紙の色味が変わる）

といったことが手元でできるのが良いです。

特に色温度を変えるとだいぶ色味が変わります。
↓実際にランプの色温度最低値と最高値で見比べた写真：2500K<--->9000K
<img width="80%" alt="color-temp" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11626/e24d8c78-76ae-f928-59ab-eb5c7205330e.png">

こういった色味、明るさ、薄暗さをそのときの気分でコマンドラインで調整できるようにします。

# 試してみた環境

macbook : macOS Mojave
Node.js : v12.12.0

準備として、最初にスマホアプリでKL110/KL130のWifi設定を済ませておきます。
そして、同一ネットワーク内にmacbookを用意して
macbook ---- Wifiルータ ---- KL110/KL130
という構成にしておきます。
ちなみにKL110/KL130は2.4GHz Wifiにしか対応していないようです。（5GHz未対応）


# tplink-lightbulb をインストール

`tplink-lightbulb`をnpmでグローバルインストールしておきます。
すると `tplight` コマンドが使えるようになります。

```bash
$ npm i -g tplink-lightbulb
$ tplight
Usage: tplight <COMMAND>

コマンド:
  tplight scan                              Scan for lightbulbs
  tplight on <ip>                           Turn on lightbulb
  tplight off <ip>                          Turn off lightbulb
  tplight temp <ip> <color>                 Set the color-temperature of the
                                            lightbulb (for those that support
                                            it)
  tplight hex <ip> <color>                  Set color of lightbulb using hex
                                            color (for those that support it)
  tplight hsb <ip> <hue> <saturation>       Set color of lightbulb using HSB
  <brightness>                              color (for those that support it)
  tplight cloud <ip>                        Get cloud info
  tplight raw <ip> <json>                   Send a raw JSON command
  tplight details <ip>                      Get details about the device

オプション:
  -h, --help  ヘルプを表示                                                [真偽]
  --version   バージョンを表示                                            [真偽]

例:
  tplight scan -h     Get more detailed help with `scan` command
  tplight on -h       Get more detailed help with `on` command
  tplight off -h      Get more detailed help with `off` command
  tplight temp -h     Get more detailed help with `temp` command
  tplight hex -h      Get more detailed help with `hex` command
  tplight hsb -h      Get more detailed help with `hsb` command
  tplight cloud -h    Get more detailed help with `cloud` command
  tplight raw -h      Get more detailed help with `raw` command
  tplight details -h  Get more detailed help with `details` command

You need a command.
```

# シェルスクリプトを書く

tplightコマンドを使ったシェルスクリプトを用意します。
スクリプト内のライトのIPアドレスは環境に合わせて書き換えてください。
`~/bin/light` などパスを通しているディレクトリにスクリプトを置きます。

```bash
#!/bin/bash
LIGHT_IP=192.168.1.14

ON_OFF=1
COLOR_TEMP=2500
BRIGHTNESS=100

if [ "${1}" = "on" ]; then
  ON_OFF=1
elif [ "${1}" = "off" ]; then
  ON_OFF=0
elif [ "${1}" = "hot" ]; then
  ON_OFF=1
  COLOR_TEMP=2500
elif [ "${1}" = "cold" ]; then
  ON_OFF=1
  COLOR_TEMP=9000
fi

if [ -n "${2}" ]; then
  BRIGHTNESS=${2}
fi

tplight raw ${LIGHT_IP} \
"{
  \"smartlife.iot.smartbulb.lightingservice\": {
    \"transition_light_state\": {
      \"on_off\": ${ON_OFF},
      \"color_temp\": ${COLOR_TEMP},
      \"brightness\": ${BRIGHTNESS},
      \"hue\": 0,
      \"saturation\": 0
    }
  }
}" > /dev/null
```

# 実行する

ライトを点ける

```
$ light on
```

ライトを消す

```
$ light off
```

暖色系のライトを点ける

```
$ light hot
```

寒色系のライトを点ける

```
$ light cold
```

暖色系のライトで輝度を20にする（max 100）

```
$ light hot 20
```

# カスタマイズする

`$ tplight details [IP address]` コマンドで現在のライトの状態・設定値をみることができます。
設定値の`light_state` あたりを眺めて `$ tplight raw [json]` でjsonを投げてやれば輝度や色温度を変えることができます。
on_offは1でon、0でoff、brightnessは輝度、color_tempは色温度、hue, saturationはカラー対応(KL130)の場合に色味の設定ができます。


```
$ tplight details 192.168.1.14
{
  "sw_ver": "1.8.11 Build 191113 Rel.105336",
  "hw_ver": "1.0",
  "model": "KL130(JP)",
  "description": "Smart Wi-Fi LED Bulb with Color Changing",
  "alias": "アプリで設定した名前がここに設定される",
  "mic_type": "IOT.SMARTBULB",
  "dev_state": "normal",
  "mic_mac": "xxxxxxxxxxxx",
  "deviceId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "oemId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "hwId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "is_factory": false,
  "disco_ver": "1.0",
  "ctrl_protocols": {
    "name": "Linkie",
    "version": "1.0"
  },
  "light_state": {
    "on_off": 1,
    "mode": "normal",
    "hue": 0,
    "saturation": 0,
    "color_temp": 2500,
    "brightness": 100
  },
  "is_dimmable": 1,
  "is_color": 1,
  "is_variable_color_temp": 1,
  "preferred_state": [
    {
      "index": 0,
      "hue": 0,
      "saturation": 0,
      "color_temp": 2700,
      "brightness": 50
    },
    {
      "index": 1,
      "hue": 0,
      "saturation": 75,
      "color_temp": 0,
      "brightness": 100
    },
    {
      "index": 2,
      "hue": 120,
      "saturation": 75,
      "color_temp": 0,
      "brightness": 100
    },
    {
      "index": 3,
      "hue": 240,
      "saturation": 75,
      "color_temp": 0,
      "brightness": 100
    }
  ],
  "rssi": -69,
  "active_mode": "none",
  "heapsize": 284368,
  "tid": "tty.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "err_code": 0,
  "lamp_beam_angle": 150,
  "min_voltage": 110,
  "max_voltage": 120,
  "wattage": 10,
  "incandescent_equivalent": 60,
  "max_lumens": 800,
  "color_rendering_index": 80
}
```

# リンク

KL110 : https://www.tp-link.com/jp/home-networking/smart-bulb/kl110/
KL130(マルチカラー対応) : https://www.tp-link.com/jp/home-networking/smart-bulb/kl130/

tplink-lightbulb : https://www.npmjs.com/package/tplink-lightbulb