やること
洗濯機の蛇口の閉め忘れを監視してLINE通知するシリーズ、前回は蛇口の撮影から学習まで行いました。
今回は「開」「閉」の判定結果をLINE通知するシステムを作ります。最後にリアルタイム監視を試してみましょう。
参考文献
YOLOv8の判定結果の取り出し方についてはこちらを参照してください。
Line notifyの設定
まずLINEアカウントを作成します。皆さんだいたい持っていると思います。
ちなみに現在は新規アカウント登録に電話番号が必須です。050では登録できません。
「電話番号が必要」と称しながら実際にはSMSが必須。誤った案内をする。050の人権を認めない。こんなサービスは使うべきではないね(暴言)
Line notifyのWebサイトにログインし、マイページに移動します。
マイページのどこかに「Generate token」というボタンがあるのでクリックします。
適当なトークン名を付けて、通知の送り先アカウントを選択します。自分と友達がずらっと並んでいるので自分を選択します。緑色の「Generate token」ボタンをクリックすると、トークン(数字とアルファベットが混ざった文字列)が生成されます。この文字列を記録しておいてください。※記録する前にページ移動してしまうとトークンが確認できなくなり再発行になります。
LINE通知を試す
こちらのコードでLINE通知のテストをします。
import requests
#トークン
token = 'your_token' #発行されたトークンをここにコピペ
#LINEにメッセージを送る
def send_line(msg):
#APIのURL
url = 'https://notify-api.line.me/api/notify'
#パラメータを用意
headers = {'Authorization': 'Bearer ' + token}
payload = {'message': msg}
#requestsモジュールのpost関数を利用してメッセージを送信
#ヘッダにトークン情報、パラメータにメッセージを指定
requests.post(url, headers=headers, params=payload)
#メッセージを送信
send_line('Hello, world!')
メッセージ送信にはHTTPのPOSTメソッドを使用します。POSTメソッドとはデータをURLに含めずにサーバーに送信する方式で画像データや長文の送信に適しています。これに対し、GETメソッドはリクエストパラメータをURLの末尾に追加して送信する方式です。今回はトークンという秘密の情報を送るため、セキュリティの観点からPOSTメソッドが適しています。
Line notifyの仕様は以下のようになっています。Line notifyはOAuth2(Webサービスやアプリの許可や認証を行うプロトコル)に基づいてユーザの許可を得てアクセストークンを取得します。これにより、HTTPSを通じたNotify APIを実行してリアルタイムの通知を行います。
リアルタイム検出の結果をLINE通知
いよいよメインの監視プログラムです。
判定結果は「result_value」に格納して、0なら「閉」、1なら「開」として通知を送信します。この数字は学習データに割り当てられていた数字のとおりです。
import cv2
import torch
import requests
from ultralytics import YOLO
#トークン
token = 'your_token' #発行されたトークンをここにコピペ
#学習済みモデル
model =YOLO('last.pt')
#LINEにメッセージを送る
def send_line(msg):
#APIのURL
url = 'https://notify-api.line.me/api/notify'
#パラメータを用意
headers = {'Authorization': 'Bearer ' + token}
payload = {'message': msg}
#requestsモジュールのpost関数を利用してメッセージを送信
#ヘッダにトークン情報、パラメータにメッセージを指定
requests.post(url, headers=headers, params=payload)
#カメラ起動
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("Don't open camera")
exit()
#監視開始
while True:
#キャプチャ
ret, frame = cap.read()
if not ret:
print("Don't get frame")
break
#判定
results = model(frame)
#判定結果を取得
for result in results:
result_value = result.boxes.cls
#0なら"water_close"
if (result_value == 0.).all():
send_line('水の栓が閉まっています')
print('close')
#1なら"water_open"
elif (result_value == 1.).all():
send_line('水の栓が開いています')
print('open')
else:
pass
#判定画像を表示
img_annotated = results[0].plot()
cv2.imshow('Camera', img_annotated)
#終了キー
if cv2.waitKey(1) == ord('q'): # qキーで終了
break
cap.release()
cv2.destroyAllWindows()
洗濯機の前でMacbookを抱えて実行した結果、LINEに「栓が閉まっています」という通知が来ました!
蛇口を開けると「栓が開いています」という通知に変わりました!
こちらがキャプチャ動画です。
毎秒2回くらい通知が来ています、、うるさい!!!!(#^ω^)
さいごに
洗濯機の水栓の開閉状況を監視してLINE通知するシステムができました!
今後の展望として
- ラズパイ+カメラで監視できるか
- 通知頻度の調整
- エラー時の処理
- 外出中でもスマホに通知が届くか
- 水栓にサーボモータを取り付けて遠隔操作が可能か
などを考えています。まさにSwitchBotの自作ですね。
応援はリツイートなどを実行する形でお願いします!また、Qiitaとnoteもやっていますのでフォローお願いします!
Qiita
note