0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

監視カメラ ジャンプ 不在時に侵入者がいれば、Line通知

Last updated at Posted at 2024-12-30

侵入者がいれば、不在(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のケーブルに交換。位置を変えられたので、かなり広い範囲で動画がキャプチャできるようになった。

IMG_0073.jpg

動画の勉強してから、顔認証だったり、Python加工しよう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?