ラズパイとSwitchbotの温湿度計を使用してLINEに部屋の温湿度を通知したい。

# はじめに

私はワンちゃん（トイプードル）と一緒に暮らしていて、お留守番をさせているときは
部屋にSwitchbotのカメラと温湿度計を配置して、SwitchbotのIphoneAppで確認できるように
しているのですが、仕事が忙しい時などはアプリを開く暇などなく、室内の温度を確認する
頻度が少ない！と感じました。
そんなことをしていたら部屋の温度が知らないうちに急激に上がった時などがあったら危ない！
と思い、LINEに通知させてIphoneの画面でわかるようにしればよいじゃんと思い、そのベースとなる
仕組みができたのでここに記そう思いまいた。

# 目次
1.使用物
2.シーケンス図
3.開発手順
4.おわりに

# 1. 使用物
 - Raspberrypi4
 - SwitchBot温湿度計

# 2. シーケンス図
```mermaid
   sequenceDiagram
        autonumber
        participant ラズパイ
        participant Switchbot OpenAPI
        participant Switchbot温湿度計
        participant LINE Notify
        participant LINE User
        ラズパイ->>ラズパイ: Main.py実行
        ラズパイ->>Switchbot OpenAPI: APIへTokenをパラメーターにリクエスト
        Switchbot OpenAPI->>Switchbot温湿度計: 各種ステータス取得
        Switchbot温湿度計->>Switchbot OpenAPI: 各種ステータス
        Switchbot OpenAPI->>ラズパイ: 各種ステータス
        ラズパイ->>ラズパイ: 温度、湿度のみに加工&送信文字列作成

        ラズパイ->>LINE Notify: LINE NotifyへTokenと送信文字列をパラメーターにリクエスト
        LINE Notify->>LINE User: 送信文字列がUserへ送信

```

# 3. 開発手順
__１．LINE通知__

まず、LINEの通知部分については下記リンクを参考にさせていただきました。

https://knt60345blog.com/line-notify/

LINEのトークンを発行してトークンと送信文字列をパラメーターに
'https://notify-api.line.me/api/notify' にリクエストします。
Tokenはコード内に埋め込みたくなかったので下記のようにローカルでもち、
都度、ファイル読み出しするようにしました。

```python
   #LineTokenの文字列取得
   f = open ('LineToken.txt')    
   line_token = f.readline()
   f.close ( )
```


__２．Switchbot温湿度計から温湿度取得__

Switchbotの温湿度計から情報取得する部分については下記リンクを参考にさせていただきました。

https://note.com/klayer123/n/nb14086840351

Switchbotについてもアプリからトークンを発行します。
トークンをパラメーターに 'https://api.switch-bot.com/v1.0/devices' にリクエストすると
アプリで表示されているSwitchbotの機器のすべてのステータスが取得できます。

今回は、温湿度計のステータス取得を行いたいので下記のように、まず、温湿度計の**device_id**を取得するために
レスポンスデータから **"deviceType"** が **"Meter"** のものの **device_id**を取得します。

```python
   # Get all device information in your switchbot hub
   response = requests.get("https://api.switch-bot.com/v1.0/devices", headers=header)
   devices  = json.loads(response.text)

   # Get switchbot bot "deviceId" in all device information
   #if部分を取得したい温湿度計(Meter)に変更
   device_id  = [device["deviceId"] for device in devices['body']['deviceList'] if "Meter" == device["deviceType"]]
```

次に、上記で取得した**device_id**をもとにステータス（温度、湿度、その他）を取得したいので下記のようにリクエストをします。

```python
    # call hygrometer state via switchbot api
    url = "https://api.switch-bot.com/v1.0/devices/" + device_id[0] + '/status'
    response = requests.get(url, headers=header)
```

これで各実行部分の作成ができました。


__３．Main.pyの作成__

下記コードでSwitchbot温湿度計からの取得部分とLINEへの通知部分を実行します。

```python
import Switchbot_temp
import LINE_Notification
import json

#実行
def main():
    humid,temp = Temp_Get()
    Line(humid,temp)


def Temp_Get():
    #Switchbotの温湿度計よりstate取得
    resp = Switchbot_temp.Switchbot_Temp_get()
    
    #print(resp.text)   #debugprint

    bot               = json.loads(resp.text)
    deviceId          = bot['body']['deviceId']
    humidity:float    = bot['body']['humidity']
    temperature:float = bot['body']['temperature']

    #debug print
    #print("deviceId    : " + deviceId )
    #print("humidity    : " , humidity )
    #print("temperature : " , temperature )

    return humidity,temperature

def Line(humid:float,temp:float):

    text = "湿度は {0} %で、温度は {1} ℃です。"
    send_text = text.format(humid,temp)
    LINE_Notification.send_line_message(send_text)


if __name__ == "__main__":
    main()
```
上記をラズパイ上で実行させます。

# 4. おわりに
今回、初めてQiitaに投稿致しました。
今後も少しずつアウトプットの場として投稿し続けれたらと思います。

GitHubにも本ソースを上げておりますので見ていただけたら幸いです。

https://github.com/YudaiUrushiyama/RaspberrypiTempNotification#readme