侵入者がいれば、不在(9:30-11:30)時にLine通知させる。
準備
参考サイト
https://note.com/khe00716/n/n34bb4c087fdc
https://gafuburo.net/raspi-line-message/
https://qiita.com/NaruNeko/items/36ba4d121350a94bddf3
手順はざっと以下となる。
参考サイト
https://note.com/shuzooooo/n/n311b619a3183
1.LINE Developersからログイン。
https://account.line.biz/login?redirectUri=https%3A%2F%2Fdevelopers.line.biz%2Fconsole%2F
2.プロバイダ名を作成。
m_sunafukin77 で作成しました。
3.LineBusinessIDでログインして Messaging APIのチャネルを作成。
4.Line公式アカウントの作成
5.LINE Official Account Manager より、 Messaging APIを利用する設定にする。
Channel secret を コピーする。(控える)
6.LINE Developerで チャネルアクセストークン(長期) を発行し、控える。
組み込み
1.LINE Messaging API SDK for Python を 以下よりインストール
pip install line-bot-sdk
以下メッセージがでるが、とりあえず無視。
warning: error parsing dependencies of gpg: invalid version: '1.14.0-unknown'
2.https://github.com/line/line-bot-sdk-python
に Usageがあるので 以下の部分を控えたコードに変更し、app.py(この名前でないとダメ)で保存。
line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('YOUR_CHANNEL_SECRET')
2.バックエンドのwebアプリとして動作するため、flaskが必要になるのでflaskもインストール。
pip install flask
以下メッセージがでるが、とりあえず無視。
warning: error parsing dependencies of gpg: invalid version: '1.14.0-unknown'
3.flaskのインストールが終わったらflask runを実行すると先ほどのapp.pyが起動される。
$ flask run
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
サーバの設定
1.webアプリとしてデプロイするにはサーバーが必要になるが、ngrokというサーバーソフトを使用。これは一時的に自分のパソコンのポート開いてサーバーにしてくれるソフト。エングロックをインストール
sudo npm install ngrok -g --unsafe-perm=true --allow-root
2.アパッチインストール
sudo apt-get install apache2
3.https://qiita.com/murachi1208/items/39f89531ae9059d1260c
の方より、アカウント登録が必須になったとのことで以下を実施。
アカウント登録とAuthトークン取得
1)https://ngrok.com/ にアクセスしてアカウント登録
2)Getting Started - Your Authtoken メニューを表示しトークンをコピー
以下を実行
ngrok authtoken xxxxxxxxxxxxxxxxxxx
5.ngrok 80 ポートで実行=外部公開 5000ポートで実行しようとしたが、何故か怒られたのでポート80とする。
ngrok http 80
6.公開されている URLアドレスをコピーして、Line DevelopersのMseesageAPIのwebhookURLにペースト。その際、pythonのプログラムで/callbackが呼び出されてときに返信するモジュールが呼び出されるように設定されている為、/callbackをつける。
https://XXXXX-XXXX-XXX-XXX-XXXX-XXXX-XXXX-XXXX-XXXX.ngrok-free.app/callback
webhookURLに設定するアドレスですが、ngrok http 80 の起動ごとに変わってしまう、その都度コピぺする必要が有り。
7.応答メッセージの送信をwebhookURLに設定したwebアプリにする。
8.スマホとの接続
スマホのLINEを立ち上げて、IDまたはQRコードで検索すると自分が作成したbotが出てくるのでお友達登録する。
チャットできるか試す。 いけた。 これでまずはOK。
Line通知検証
1.以下を作成。 pushMsg.py で保存。
# pushMsg.py
import requests
headers = {
"Content_Type": "application/json",
"Authorization": "Bearer " + 'Your Token'
}
def SendMsg(text,uid):
res = requests.post("https://api.line.me/v2/bot/message/push",
headers=headers,
json={
"to": uid,
"messages": [{
"type": "text",
"text": text
}]
}
).json()
if __name__ == "__main__":
SendMsg('侵入者を検知しました!', 'Your Userid')
実行したら、ボクのスマホに通知がいった。ヒャッホー。
2.仕上げ camera_jimkan.pyを変更。pushMsg.pyを呼ぶ処理を追加。
2025/1/5 14:23 ひまじんが不在の時に人感センサーが検知したようなので GPIO.cleanup()を最初にいれた。
あとコーデイングが変だったので、きっちりとコーデイングし直した。
wekeonlan.pyも見直す。
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import os
import time
import datetime
import subprocess
GPIO.cleanup()
print("GPIO clean")
GPIO_PIN = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN,GPIO.IN)
# 時間計測開始
t_start = time.perf_counter()
# オプション
# HQカメラの場合
# 写真の最大サイズは4056x3040
# 動画(H.264)の最大サイズは1920x1080, 最大画角は1440x1080
image_size = (1440, 1080) # 撮影サイズの横幅, 高さ
mode = 'movie' # 写真なら'photo', 動画なら'movie'
# pi5 = False # Raspberry Pi 5の場合True, それ以外はFalse (動画撮影の手順が異なる)
save_dir = '/home/pi' # 写真や動画を保存するディレクトリ
# interval = 60 # 1度撮影した後、再開するまでのインターバル時間[秒]
movie_duration = 10 # 動画の撮影時間[秒]
if __name__ == '__main__':
try:
while True:
# 現在時刻取得
t_end = time.perf_counter()
# 経過時間計算
elaps = t_end - t_start
# 2H超えたらブレーク
if elaps > 7200:
break
print(elaps)
if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
print("man search")
dt = datetime.datetime.now()
if mode == 'photo':
save_file = os.path.join(save_dir, dt.strftime('%y_%m%d_%H%M_%S.jpg'))
subprocess.run([
'libcamera-still', '-n', '-o',
os.path.join(save_file), '-t', '1', '--width',
str(image_size[0]), '--height',
str(image_size[1])
])
subprocess.check_call('sudo python3 /home/pi/pushMsg.py', shell=True)
time.sleep( 10 )
break
elif mode == 'movie':
save_file = os.path.join(save_dir, dt.strftime('%y_%m%d_%H%M_%S.mkv'))
h264_file = os.path.join(save_dir, 'tmp.h264')
pts_file = os.path.join(save_dir, 'tmp.txt')
subprocess.run([
'libcamera-vid', '-n', '-o', h264_file, '--save-pts', pts_file, '-t',
str(movie_duration * 1000), '--width',
str(image_size[0]), '--height',
str(image_size[1])
])
subprocess.run(['mkvmerge', '-o', save_file, '--timecodes', '0:' + pts_file, h264_file])
os.remove(h264_file)
os.remove(pts_file)
subprocess.check_call('sudo python3 /home/pi/pushMsg.py', shell=True)
time.sleep( 10 )
break
else:
print("man no search")
print(GPIO.input(GPIO_PIN))
time.sleep( 1 )
finally:
GPIO.cleanup()
print("GPIO clean完了")
これで完成。
ひまじんの環境だと Lanとwan(インターネット)が混在するからか、ケーブルをwifiルータに接続しないとダメ。これはGithubに接続するときもそうだが。とりあえずは良し。
9.あまりにも標準のケーブルが短いので。ちょっとカメラの位置をかえたいので配線を30cmのケーブルに交換。位置を変えられたので、かなり広い範囲で動画がキャプチャできるようになった。
動画の勉強してから、顔認証だったり、Python加工しよう。