中華製の LED 照明を Python でコントロールしてみた。

今回は、 Amazon で購入した中華製の LED 照明を Python でコントロールしてみました。
使用した LED 照明は下記のものになります。

https://www.amazon.co.jp/gp/product/B083NTW554/

# 環境

今回の環境は下記のとおりです。

## 開発端末

- **OS**： Windows 11 Pro
- **CPU**： Intel Core i7-9750H
- **メモリ**： 64GB
- **GPU**： NVIDIA GeForce RTX 2070 Max-Q

## Python 環境

- **Python**： 3.11.0
- **仮想環境**： Poetry

:::note info
**Poetry について**
Poetry の詳細は、下記の記事を参考にしてください。
https://qiita.com/IoriGunji/items/290db948c11fdc81046a
:::

# アカウントの作成

下記のサイトから Sign Up を行います。

https://iot.tuya.com/

![tuya_signup_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/1fe60b31-2c0d-85fa-b9a9-930d341341f0.png)

# プロジェクトの作成とデバイスの取得

プロジェクトを作成し、デバイスの取得を行います。

`Cloud` をクリックします。
![tuya_create_project_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/6df1336d-f0ed-ec32-a5f6-ee2fd2cf2a66.png)

`Create Cloud Project` をクリックします。
![tuya_create_project_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/c7de77b1-13b1-f047-ac61-027d4d52bdf6.png)

下記の項目を入力して、 `Create` をクリックします。

- **Project Name**： 任意のプロジェクト名
- **Industry**： Smart Home
- **Development Method**： Smart Home
- **Data Center**： Western America Data Center

![tuya_create_project_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/1a488e8a-00d1-9d26-a8f3-2866292a2b82.png)

プロジェクトが作成されたら、 `Open Project` をクリックして、プロジェクトを開きます。
![tuya_open_project_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/9344c96f-1c85-901f-7726-3fd665e872eb.png)

## デバイスの取得

`Link Tuya App Account` をクリックします。
![tuya_add-device_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/06cfb512-3552-6ad9-a19d-ea89b4a51763.png)

`Add App Account` をクリックします。
![tuya_add-device_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/d011a279-9e81-55b5-2a17-0e8bb85b5687.png)

QRコードをスマートフォンの `Smart Life` アプリで読み取ります。
![tuya_add-device_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/c6225bb6-00ce-0d43-9b93-c83953faf295.png)

スマートフォンで `Smart Life` アプリを開き、 `＋` ボタンをタップします。
![tuya_qr_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/b9dd07b8-3f8b-1565-0e27-b895ae8bbb1e.png)

`QRコードをスキャン` をクリックします。
![tuya_qr_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/149e15cc-3ae4-2a3a-2bf3-6087a7cdbb5e.png)

`ログインを確認` をクリックし、QRコードを読み取ります。
![tuya_qr_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/e5b5ddf5-b8ad-cf9a-9bdc-858232d5afd8.png)

## 認証情報の確認

API を叩く際に必要となる認証情報を事前に確認しておきます。
下記のいずれかの方法で確認ができます。

`Overview` をクリックし、 `Access ID/Client ID` と `Access Secret/Client Secret` を控えておきます。
![tuya_auth_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/6e0875d4-f0e3-a6e2-67d5-bf08ad537b45.png)

`Authorization` をクリックし、 `Cloud Authorization` から `Access ID/Client ID` と `Access Secret/Client Secret` を控えておきます。
![tuya_auth_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/73ba4b86-cf1d-9f1e-7055-e746432d7233.png)

## IoT Core の確認

`Service API` を開き、 `IoT Core` が含まれていることを確認します。

含まれていない場合は、 `Go to Authorize` をクリックし、 `IoT Core` の `Free Trial` をクリックし、 `IoT Core` を追加します。
![tuya_auth_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/4ec60a78-0815-e375-393d-60af1952ceed.png)

## デバイス ID の確認

制御したいデバイスの `Device ID` を確認します。

`Devices` をクリックし、 `All Devices` の中から制御したいデバイスの `Device ID` を確認します。
![tuya_device-id_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/91419690-ba7a-970c-771e-28953eb4c890.png)

# Python コードの作成

## インストール

### Poetry の場合

```powershell
poetry add tinytuya
```

### pip の場合

```powershell
pip install tinytuya
```

## ウィザードの実行

ウィザードを実行してデバイス情報を取得します。

### Poetry の場合

```powershell
poetry run python -m tinytuya wizard
```

### pip の場合

```powershell
python -m tinytuya wizard
```

メッセージに沿って、確認した認証情報や Device ID をそれぞれ入力していきます。
`Region` はプロジェクトの作成時に選択した `Data Center` のことです。

```powershell
Enter API Key from tuya.com: [Access ID/Client ID]
Enter API Secret from tuya.com: [Access Secret/Client Secret]
Enter any Device ID currently registered in Tuya App (used to pull full list) or 'scan' to scan for one: [Device ID]
Enter Your Region (Options: cn, us, us-e, eu, eu-w, or in): [Data Center]
Download DP Name mappings? (Y/n): y
Poll local devices? (Y/n): y
```

Download DP Name mappings? (Y/n): y
```json-doc
[
    {
        "name": "\u30c7\u30b9\u30af\u30e9\u30a4\u30c8\xxxxx\xxxxx\xxxxx",
        "id": "xxxxxxxxxxxxxxxxxxxx",
        "key": "xxxxxxxxxxxxxxxx",
        "mac": "xx:xx:xx:xx:xx:xx",
        "uuid": "xxxxxxxxxxxxxxxxxxxx",
        "sn": "xxxxxxxxxxxxxx",
        "category": "dj",
        "product_name": "CabiSmart CW",
        "product_id": "soy18v1bwdidkell",
        "biz_type": 18,
        "model": "",
        "sub": false,
        "icon": "https://images.tuyaus.com/smart/icon/ay1502415387164HkSHB/b60d503b6bb18ab229722fc4e5a669b6.jpg",
        "mapping": {},
        "ip": "192.168.0.201",
        "version": "3.3"
    },
    {
        "name": "\u30c7\u30b9\u30af\u30e9\u30a4\u30c8\yyyyy\yyyyy",
        "id": "yyyyyyyyyyyyyyyyyyyy",
        "key": "yyyyyyyyyyyyyyyy",
        "mac": "yy:yy:yy:yy:yy:yy",
        "uuid": "yyyyyyyyyyyyyyyyyyyy",
        "sn": "yyyyyyyyyyyyyy",
        "category": "dj",
        "product_name": "CabiSmart CW",
        "product_id": "soy18v1bwdidkell",
        "biz_type": 18,
        "model": "",
        "sub": false,
        "icon": "https://images.tuyaus.com/smart/icon/ay1502415387164HkSHB/b60d503b6bb18ab229722fc4e5a669b6.jpg",
        "mapping": {},
        "ip": "",
        "version": ""
    }
]
```

Poll local devices? (Y/n): y
```
[デスクライト？？] Error: No IP found
[デスクライト？？？] 192.168.0.201      - [On]  - DPS: {'20': True, '21': 'white', '22': 454, '23': 1000, '25': '030d0d0000000000000003e803e8', '26': 0}
```

ステータスコードの見方は [Github](https://github.com/jasonacox/tinytuya#version-33-devices) から確認できます。

今回使用しているデバイスは LED 照明のため、下記の表が該当しそうです。
![tuya_status_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/3c0ec52a-20f8-5933-cfc1-670fd7e65f75.png)

## Python コード

今回は LED 照明を制御するための Python コードを紹介します。

LED 照明のため、インスタンスの作成に用いる関数は ` tinytuya.BulbDevice()` になります。
また、各パラメータは下記のとおりです。

- `dev_id`： `Download DP Name mappings?` で表示された `id` です。
- `address`： `Download DP Name mappings?` で表示された `ip` です。
- `local_key`： `Download DP Name mappings?` で表示された `key` です。

### デバイスのステータスの確認

デバイスのステータスを確認するには下記のコードを実行します。

```status.py
import tinytuya

device = tinytuya.BulbDevice(
    dev_id = 'デバイスID'
    , address = 'デバイスのIPアドレス'
    , local_key = 'デバイスのローカルキー'
    , version = 3.3
)

data = device.status() 
print('set_status() result %r' % data)
```

### 電源 ON

LED 照明の電源を入れるには下記のコードを実行します。

```turn_on.py
import tinytuya

device = tinytuya.BulbDevice(
    dev_id = 'デバイスID'
    , address = 'デバイスのIPアドレス'
    , local_key = 'デバイスのローカルキー'
    , version = 3.3
)

device.turn_on()
```

### 電源 OFF

LED 照明の電源を切るには下記のコードを実行します。

```turn_off.py
import tinytuya

device = tinytuya.BulbDevice(
    dev_id = 'デバイスID'
    , address = 'デバイスのIPアドレス'
    , local_key = 'デバイスのローカルキー'
    , version = 3.3
)

device.turn_off()
```

### 調光

LED 照明の明るさを変更するには下記のコードを実行します。

```brightness.py
import tinytuya

device = tinytuya.BulbDevice(
    dev_id = 'デバイスID'
    , address = 'デバイスのIPアドレス'
    , local_key = 'デバイスのローカルキー'
    , version = 3.3
)

# device.set_brightness(10) # 10-1000
device.set_brightness_percentage(0) # 0-100
```

:::note info
set_brightness 関数について
下記の2種類の関数が利用できます。
- set_brightness() ： 10 ～ 1000 の間の整数で指定します。
- set_brightness_percentage() ： 0 ～ 100 の間の整数でしています。
:::

### 調色

LED 照明の色温度を変更するには下記のコードを実行します。

```colourtemp.py
import tinytuya

device = tinytuya.BulbDevice(
    dev_id = 'デバイスID'
    , address = 'デバイスのIPアドレス'
    , local_key = 'デバイスのローカルキー'
    , version = 3.3
)

# device.set_colourtemp(1000) # 0-1000
device.set_colourtemp_percentage(100) # 0-100
```

:::note info
set_brightness 関数について
下記の2種類の関数が利用できます。
- set_colourtemp() ： 0 ～ 1000 の間の整数で指定します。
- set_colourtemp_percentage() ： 0 ～ 100 の間の整数でしています。
:::

# 参考文献

下記のサイトを参考にさせて頂きました。

https://flogics.com/wp/2022/02/control-smart-power-strips-by-python/

https://github.com/jasonacox/tinytuya

https://pypi.org/project/tinytuya/

<!-- EOF -->