スマートライト「Yeelight」をPythonからクラウドを使わずに制御する

![yeelight.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58479/8a32c5c6-1f5a-d39a-7dcf-d166bd277bc8.jpeg)
（写真はソフトバンクセレクションの製品紹介ページより）

## 3行まとめ

* Yeelightはクラウドに依存せず、ローカルネットワーク経由で制御でき、APIが公開されている。
* APIを実装したPythonパッケージもあり、短いコードで制御できる。
* しかも比較的安価なので、おうちハックには最適のスマートライト。

## 1. はじめに

　2020年4月24日、ソフトバンクC&Sよりスマートライト「Yeelight」が日本国内向けに発売されました。
このスマートライトには「LAN Control」（後述）という機能があり以前から気になっていましたが、日本で発売されたので早速購入して、Pythonから制御してみました。もちろん技適もバッチリです。

## 2. Yeelightとは

　「Yeelight」（[日本語公式ページ](https://jp.yeelight.com/)）はスマートライトのブランド名で、スマートフォンや家電で有名な「Xiaomi」（小米科技、シャオミ）の製品です。
電球形、テープ形、ランタン形と様々な製品がありますが、ここでは電球形のスマートライトについて述べます。

　今回購入したモデル「YLDP13YL」は、Wi-Fi接続、24ビットカラー（約1677万色）、スマートスピーカー対応（Google Home、Alexa、Apple HomeKit）と、一般的な電球形スマートライトと同じような特徴を持ちますが、「LAN Control」という特徴的な機能を持ちます。

　「LAN Control」については後述しますが、Yeelightのその他の仕様についてはソフトバンクセレクションの[製品紹介ページ](https://www.softbankselection.jp/cart/ProductDetail.aspx?sku=4580549350218)などをご参照ください。

　上記のソフトバンクセレクションの他、Amazon.co.jp、ヨドバシ.comなどから購入することができます。

<table>
  <thead>
    <tr>
      <th>サイト</th>
      <th>モデル</th>
      <th>1個</th>
      <th>2個セット</th>
      <th>4個セット</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="2">Amazon.co.jp</th>
      <th>マルチカラー</th>
      <td><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B086LPJHMT/x7edimv35x-22/">3,300円</a></td>
      <td><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B086LPQDXV/x7edimv35x-22/">5,940円</a></td>
      <td><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B086LQVSJ8/x7edimv35x-22/">11,880円</a></td>
    </tr>
    <tr>
      <th>電球色（調光のみ）</th>
      <td><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B086LNFKM8/x7edimv35x-22/">2,200円</a></td>
      <td><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B086LNFKJP/x7edimv35x-22/">3,960円</a></td>
      <td><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B086LPS1J1/x7edimv35x-22/">7,920円</a></td>
    </tr>
    <tr>
      <th>ヨドバシ.com</th>
      <th>マルチカラー</th>
      <td><a href="https://www.yodobashi.com/product/100000001005587360/">3,630円</a></td>
      <td>-</td>
      <td>-</td>
    </tr>
  </tbody>
</table>

## 3. LAN Controlとは

　Yeelightの特徴的な機能「LAN Control」は、その名の通りLAN（Local Area Network）を経由してライトを制御するための機能で、しかもそのAPIが公開されています。
クラウドを経由せず、LAN内で完結するため、遅延の少ない制御を行うことができます。
また、APIが公開されているため、独自アプリからの制御も自由自在です。

　詳しくはYeelightの[開発者向けページ](https://www.yeelight.com/en_US/developer)をご参照ください。（ページのロードが激遅なので気長にどうぞ）

## 4. `yeelight`パッケージ

　前述のAPI仕様を読むまでもなく、Pythonであれば有志による[yeelight](https://pypi.org/project/yeelight/)パッケージが公開されており、簡単に制御することができます。本記事の執筆時点では`0.5.1`でした。

```text
mac$ pip install yeelight==0.5.1
```

　APIは大きくライトの探索（ディスカバリ）と制御に分かれています。それぞれ、見てみます。

### 4.1. 探索

　Yeelightをセットアップし、「LAN Control」を有効化すると、`yeelight.discover_bulbs()`でライトを検出することができます。
内部的にはUDPマルチキャストを使用しているので、それが到達する範囲内から実施する必要があります。（一般的には、同じWi-Fiネットワークに接続されていれば大丈夫かと思います）

　具体例を以下に示します。

```text
mac$ python
Python 3.7.0 (default, Jun 28 2018, 07:39:16)
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import yeelight
>>> yeelight.discover_bulbs()
[{'ip': '192.168.1.81', 'port': 55443, 'capabilities': {'id': '0x0000000012429e65', 'model': 'color4', 'fw_ver': '27', 'support': 'get_prop set_default set_power toggle set_bright set_scene cron_add cron_get cron_del start_cf stop_cf set_ct_abx adjust_ct set_name set_adjust adjust_bright adjust_color set_rgb set_hsv set_music', 'power': 'on', 'bright': '100', 'color_mode': '2', 'ct': '2000', 'rgb': '9109504', 'hue': '0', 'sat': '100', 'name': ''}}]
```

　なお、ライトのIPアドレスが既に分かっている場合、この手順は不要です。ライトのIPアドレスはYeelightアプリからも確認することができます。

### 4.2. 制御

　ライトのIPアドレスが分かれば、ライトを制御することができます。認証などはありません。ネットワークの構成にはご注意ください。

　具体例を以下に示します。上から順番にライトON、OFF、ON/OFFの切り替え、明るさの設定、RGB値による色の設定、HSV値による色の設定、色温度による色の設定、プロパティの取得の例です。

```text
mac$ python
Python 3.7.0 (default, Jun 28 2018, 07:39:16)
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import yeelight
>>> bulb = yeelight.Bulb("192.168.1.81")
>>> bulb.turn_on()
'ok'
>>> bulb.turn_off()
'ok'
>>> bulb.toggle()
'ok'
>>> bulb.set_brightness(50)
'ok'
>>> bulb.set_rgb(255, 0, 0)
'ok'
>>> bulb.set_hsv(320, 100, 50)
'ok'
>>> bulb.set_color_temp(3000)
'ok'
>>> bulb.get_properties()
{'power': 'on', 'bright': '100', 'ct': '3000', 'rgb': '8432127', 'hue': '221', 'sat': '49', 'color_mode': '2', 'flowing': '0', 'delayoff': '0', 'music_on': '0', 'name': None, 'bg_power': None, 'bg_flowing': None, 'bg_ct': None, 'bg_bright': None, 'bg_hue': None, 'bg_sat': None, 'bg_rgb': None, 'nl_br': None, 'active_mode': None, 'current_brightness': '100'}
```

　他にもいろいろ機能がありますので、開発者向けのAPI仕様書、`yeelight`パッケージのAPIリファレンスをご参照ください。

　それでは良いおうちハックを！