PCからIoT家電(NatureRemo)を操作してみる

## 1. はじめに

最近、スマートホーム家電を購入したのですが、デスクでPCを眺めているのにスマホを開かないと操作ができないのはスマートでないと感じました。多くのデバイスは専用のスマホアプリからの操作のみとなっておりPCアプリがないので、このちょっとした不便を解消しようと思います。

## 2. 使用技術・環境

| API | Nature Remo Cloud API |
| --- | --- |
| 言語 | Python 3.12.0 |
| OS | Windows11 |

## 3. 実装

### 3.1 アクセストークンの取得・設定

以下のリンクから自分のアクセストークンを新規発行します。

https://home.nature.global/

### 3.2 リクエストの送信

まずは自分のNatureRemoアカウントに登録してある家電の一覧を取得してみます。

`.env`にアクセストークン（`ACCESS_TOKEN`）を保存しておきます。

```check_appliances.py
import os

import requests
from dotenv import load_dotenv

load_dotenv()

# アクセストークンを設定
ACCESS_TOKEN = os.getenv("ACCESS_TOKEN")

# ヘッダーを設定
HEADERS = {
    "Authorization": f"Bearer {ACCESS_TOKEN}",
    "Accept": "application/json"
}

# 家電一覧の取得
url = "https://api.nature.global/1/appliances"
response = requests.get(url, headers=HEADERS)
appliances = response.json()

print(appliances)
```

レスポンスから操作したい家電の`appliance_id`を記録しておきます。今回はシーリングライトをオンにする操作をしてみます。

```light_on.py
import os

import requests
from dotenv import load_dotenv

load_dotenv()

ACCESS_TOKEN = os.getenv("ACCESS_TOKEN")
APPLIANCE_ID = os.getenv("APPLIANCE_ID") # appliance_idを設定

# ヘッダーを設定
HEADERS = {
    "Authorization": f"Bearer {ACCESS_TOKEN}",
    "Accept": "application/json"
}

# ライトをオンにする
url = f"https://api.nature.global/1/appliances/{APPLIANCE_ID}/light"
data = {
		"button": "on"
}
response = requests.post(url, headers=HEADERS, data=data)

print(response.status_code)
```

### 3.3 GUI操作の実装

これでPCから家電を操作できるようになりましたが、マウスでポチポチ操作できるようにしたいです。まず、Pythonファイルの拡張子を変更します。`.py`を`.pyw`に変換すると、ダブルクリックするだけでPythonスクリプトをバックグラウンドで実行できます。そして、ランチャーアプリなどに配置すればPCから家電を操作できるリモコンの完成です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828517/ce9300c3-113c-4b1a-b6ce-04ccfcc0bccf.png)


## 4. その他の実装方法

### 4.1 Pythonライブラリ

[ライブラリ](https://github.com/morinokami/nature-remo)から操作することもできます。

1. インストール
    
    Python3.8でのサポートになる点に注意します。
    
    ```powershell
    pip install nature-remo
    ```
    
2. リクエストの送信
    
    先ほどと同様に自分のNatureRemoアカウントに登録してある家電の一覧を取得してみます。
    
    ```python
    import os
    
    from dotenv import load_dotenv
    from remo import NatureRemoAPI
    
    load_dotenv()
    
    ACCESS_TOKEN = os.getenv("ACCESS_TOKEN")
    
    api = NatureRemoAPI("ACCESS_TOKEN")
    appliances = api.get_appliances()
    
    print(appliances)
    ```
    
    <details><summary> エアコン操作 </summary>
    エアコンの設定を変更したいときは`update_aircon_settings`メソッドを使い、引数に実行したい操作コマンドを指定します。
    
    ```python
    api.update_aircon_settings(appliances[0].id, operation_mode='cool', temperature=26, air_volume=1, air_direction='auto')
    ```
        
    - **operation_mode** : モードの操作
        | **モード** | **コマンド** |
        | --- | --- |
        | 冷房 | cool |
        | 暖房 | warm |
        | 除湿 | dry |
        | 送風 | blow |
            
    - **temperature** : 温度の操作
            
        モードが冷房、暖房、除湿のみ設定可能で16~30℃の値をとれる
            
    - **air_volume** : 風量の操作
            
        すべてのモードで設定可能で1~4,autoの値をとれる
            
    - **air_direction** : 風向の操作
            
        すべてのモードでautoかswingを設定できる
            
    - **button** : 任意の操作
            
    ```python
    api.update_aircon_settings(appliances[0].id, button='power-off')
    ```
    </details>
    <details><summary>ライト操作</summary>
    ライトの設定を変更したいときは`send_light_infrared_signal`メソッドを使い、引数に実行したい操作コマンドを指定します。
        
    ```python
    api.send_light_infrared_signal(appliances[1].id, 'off')
    ```
        
    | **操作** | **操作コマンド** |
    | --- | --- |
    | オン | on |
    | オフ | off |
    | 全灯 | on-100 |
    | 常夜灯 | night |
    | お気に入り | on-favorite |
    | 色温度(暖) | colortemp-up |
    | 色温度(寒) | colortemp-down |
    | 明るさを上げる | bright-up |
    | 明るさを下げる | bright-down |

    </details>
    <details><summary>制限の確認</summary>
    現在のAPIの呼び出し回数や呼び出し制限などを確認することができます。
        
    ```python
    user = api.get_user()
    ```
        
    とすると自分のアカウントに呼び出し制限のステータスがセットされます。
        
    - **api.rate_limit.limit**： 5分以内に受けられるリクエスト数の上限
    - **api.rate_limit.remaining**：次のリクエスト制限のリセットまでに受けられる残りリクエスト数
    - **api.rate_limit.reset**：リクエスト数の制限をリセットする時刻(UTC)
    </details>

### 4.2 iPhoneのショートカット

iPhoneでNatureRemoに登録しているエアコンの温度を変更するにはNatureRemoのアプリを開かないといけなかったので、ショートカットを作成し、ホーム画面からも操作できるようにしてみました。

まず、温度を取得する関数的なショートカットを作成します。

<details><summary>レシピ</summary>

![image 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828517/e75f9fb2-8e03-477f-abd1-7b38a5c729cf.png)

</details>


`URL`は以下を設定します。

```
https://api.nature.global/1/appliances
```

`URLの内容を取得`は以下を設定します。

`方法`を`GET`に、`ヘッダ`に以下の内容を追加します。

```
キー: accept           テキスト: application/json
キー: Authorization    テキスト: Bearer APIアクセストークン
```

これで温度を取得することができるようになったので、次に、このショートカットを使ってエアコンの温度を変更するショートカットを作成します。

<details><summary>レシピ</summary>

![image 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828517/d6652a80-4241-4af4-ac0a-74b9b81eff52.png)


</details>
    

`URL`は以下を設定します。

```
https://api.nature.global/1/appliances/エアコンのID/aircon_settings
```

`URLの内容を取得`は以下を設定します。

`方法`を`POST`に、`ヘッダ`に以下の内容を追加します。

```
キー: accept           テキスト: application/json
キー: Authorization    テキスト: Bearer APIアクセストークン
キー: Content-Type     テキスト: applicaion/x-www-form-urlencoded
```

また、`本文を要求`を`フォーム`に設定し、`temperature`を`計算結果`に設定します。それ以外は空白でOKです。

これでiPhoneのホーム画面などにショートカットを置くことで、ワンタップでエアコンの温度変更ができるようになりました👏

## 5. おわりに

NatureRemo公式記事の[ユーザーのユニークな使い方](https://nature.global/blog/1053/)で紹介されていたアイデアが参考になりました。

## 6. 参考にした記事など
https://github.com/morinokami/nature-remo

https://qiita.com/morinokami/items/6eb2ac6bed48d2c7534b

https://qiita.com/sohsatoh/items/b710ab3fa05e77ab2b0a