はじめに
私はワンちゃん(トイプードル)と一緒に暮らしていて、お留守番をさせているときは
部屋にSwitchbotのカメラと温湿度計を配置して、SwitchbotのIphoneAppで確認できるように
しているのですが、仕事が忙しい時などはアプリを開く暇などなく、室内の温度を確認する
頻度が少ない!と感じました。
そんなことをしていたら部屋の温度が知らないうちに急激に上がった時などがあったら危ない!
と思い、LINEに通知させてIphoneの画面でわかるようにしればよいじゃんと思い、そのベースとなる
仕組みができたのでここに記そう思いまいた。
目次
1.使用物
2.シーケンス図
3.開発手順
4.おわりに
1. 使用物
- Raspberrypi4
- SwitchBot温湿度計
2. シーケンス図
3. 開発手順
1.LINE通知
まず、LINEの通知部分については下記リンクを参考にさせていただきました。
LINEのトークンを発行してトークンと送信文字列をパラメーターに
'https://notify-api.line.me/api/notify' にリクエストします。
Tokenはコード内に埋め込みたくなかったので下記のようにローカルでもち、
都度、ファイル読み出しするようにしました。
#LineTokenの文字列取得
f = open ('LineToken.txt')
line_token = f.readline()
f.close ( )
2.Switchbot温湿度計から温湿度取得
Switchbotの温湿度計から情報取得する部分については下記リンクを参考にさせていただきました。
Switchbotについてもアプリからトークンを発行します。
トークンをパラメーターに 'https://api.switch-bot.com/v1.0/devices' にリクエストすると
アプリで表示されているSwitchbotの機器のすべてのステータスが取得できます。
今回は、温湿度計のステータス取得を行いたいので下記のように、まず、温湿度計のdevice_idを取得するために
レスポンスデータから "deviceType" が "Meter" のものの device_idを取得します。
# 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をもとにステータス(温度、湿度、その他)を取得したいので下記のようにリクエストをします。
# 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)
これで各実行部分の作成ができました。
3.Main.pyの作成
下記コードでSwitchbot温湿度計からの取得部分とLINEへの通知部分を実行します。
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にも本ソースを上げておりますので見ていただけたら幸いです。