5/28(水)-29(金) ブライダル産業フェア2024に共同出展します☆彡

1-14. 洗濯機の水栓の閉め忘れをLINE通知してみた(②LINE通知編)

やること

洗濯機の蛇口の閉め忘れを監視してLINE通知するシリーズ、前回は蛇口の撮影から学習まで行いました。

今回は「開」「閉」の判定結果をLINE通知するシステムを作ります。最後にリアルタイム監視を試してみましょう。

参考文献

YOLOv8の判定結果の取り出し方についてはこちらを参照してください。

結果
ベーステンソル、ボックス、キーポイントを含むUltralytics エンジンの結果を、徹底したドキュメントでマスター。

Line notifyの設定

まずLINEアカウントを作成します。皆さんだいたい持っていると思います。

Suzu
Suzu

ちなみに現在は新規アカウント登録に電話番号が必須です。050では登録できません。

管理人
管理人

「電話番号が必要」と称しながら実際にはSMSが必須。誤った案内をする。050の人権を認めない。こんなサービスは使うべきではないね(暴言)

Line notifyのWebサイトにログインし、マイページに移動します。

LINE Notify
LINE NotifyはGitHub,IFTTT,MackerelなどのWebサービスからの通知を、LINEで受信することが出来る便利なサービスです。

マイページのどこかに「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に「栓が閉まっています」という通知が来ました!

蛇口を開けると「栓が開いています」という通知に変わりました!

こちらがキャプチャ動画です。

洗濯機の水栓の閉め忘れをLINE通知してみた(②LINE通知編)

毎秒2回くらい通知が来ています、、うるさい!!!!(#^ω^)

さいごに

洗濯機の水栓の開閉状況を監視してLINE通知するシステムができました!

今後の展望として

  • ラズパイ+カメラで監視できるか
  • 通知頻度の調整
  • エラー時の処理
  • 外出中でもスマホに通知が届くか
  • 水栓にサーボモータを取り付けて遠隔操作が可能か

などを考えています。まさにSwitchBotの自作ですね。

応援はリツイートなどを実行する形でお願いします!

タイトルとURLをコピーしました