81
モーションアラート機能付きRaspberry Piセキュリティカメラの作り方

Raspberry Piをウェブカメラやリアルタイムで監視するセキュリティカメラとして使うのは簡単ですが、Piが動きを検知した際に通知を受け取りたい場合はどうすればよいでしょうか?パッシブ赤外線センサー(PIR)を取り付けてモーション検出器として機能させ、デバイスからの入力を取得してそれに応じて動作するウェブサービスであるIFTTT(If This Then That)にアラートを送信するようにRaspberry Piをプログラムできます。 

IFTTTへのこのメッセージは、Telegramアカウントに出力と画像を送信し、モバイルデバイスにアラートを送信します。つまり、侵入者がセンサーの前を通り過ぎた際にあなたが不在の場合、通知が届きます。  

 必要なもの

  • ラズベリーパイ 
  • Raspberry Pi カメラモジュール。
  • このようなPIRセンサー。
  • メス-メスジャンパーワイヤー3本

 Raspberry Piとハードウェアのセットアップ

1. Raspberry Piの電源を切った状態で、 3本のジャンパー線を使ってPIRセンサーをGPIOに接続します。GNDをGNDに、 VCCをRaspberry Piの5Vピンに接続します。最後に、センサーの出力ピンをRaspberry PiのGPIO17に接続します。  

IFTTTとTelegramを使ったRaspberry Piのモーション検出

(画像提供: Linux Format)

2.  カメラをイーサネット/USBポートのすぐ隣にあるCSIポートに接続します。プラスチッククリップを軽く持ち上げ、青いタブをUSBポートに向けるようにケーブルを差し込みます。そして、プラスチッククリップでケーブルを固定します。カメラがRaspberry Piに触れないように注意してください。ショートの原因となる可能性があります。  

3.   Raspbianでカメラサポートが有効になっていない場合は、有効にしてください。Raspberry Piの電源を入れ、メインデスクトップから「Preferences」>「Raspberry Pi Configuration」に移動し、「Interfaces」タブをクリックしてPiカメラインターフェースを有効にします。プロンプトが表示されたら再起動し、Raspberry Piがデスクトップに戻るまで待ちます。  

 ソフトウェアのセットアップ  

1.   Telegramアカウントを登録します。これは、サービスのAndroidまたはiOSアプリから行う必要があります。その後、 TelegramデスクトップアプリをPCまたはMacにダウンロードしてインストールし、起動しておきます。IFTTTとの接続に必要になります。

2.    https://ifttt.comにアクセスして無料アカウントを登録します。IFTTT は「IF This, Then That」の略で、入力に基づいてアクションをトリガーするために使用します。このプロジェクトでは、Webhook(コードからWebへのリアルタイムリンク)を作成し、Telegram で侵入者を警告するメッセージを送信します。ブラウザウィンドウは開いたままにしておいてください。

Tom's Hardware の最高のニュースと詳細なレビューをあなたの受信箱に直接お届けします。

3. TelegramアカウントをIFTTTアカウントに接続します。TelegramデスクトップアプリでIFTTTを検索し選択します。 

IFTTTTをTelegramに接続する

(画像提供:Tom's Hardware)

4. [スタート]ボタンをクリックします。

IFTTTTをTelegramに接続する

(画像提供:Tom's Hardware)

5. 次に、 Telegram のhttps://iftttt.com/telegramリンクをクリックすると、ブラウザが開き、IFTTT の Telegram ページが表示されます。

IFTTTTをTelegramに接続する

パソコンのTelegramアプリからリンクをクリックしてください。(画像提供:Tom's Hardware)

6. 「接続」をクリックします。

IFTTTTをTelegramに接続する

(画像提供:Tom's Hardware)

7. 次に、「メッセージを送信」をクリックし、ブラウザでTelegramデスクトップを開くことを許可します。

IFTTTTをTelegramに接続する

(画像提供:Tom's Hardware)

8. Telegramデスクトップで、「IFTTTを認証」をクリックします。

TelegramをIFTTTに接続する: Telegramアプリで「承認」をクリック

(画像提供:Tom's Hardware)

9.  画面の右上にあるアカウントのアバターアイコンをクリックし、「作成」を選択して、 IFTTT でトリガーを作成します。 

IFTTTでトリガーを作成する

(画像提供:Tom's Hardware)

10. 次に、「If +」をクリックします。

IFTTTでトリガーを作成する

(画像提供:Tom's Hardware)

11. 「webhook」と入力し青いアイコンをクリックします。

IFTTTでトリガーを作成する

(画像提供:Tom's Hardware)

12. 次の画面で、「Web リクエストの受信」をクリックします。

IFTTTでトリガーを作成する

(画像提供:Tom's Hardware)

13.イベントに引用符なしで「trigger」という名前を付け、[トリガーの作成] をクリックします

トリガーの名前を入力し、トリガーの作成をクリックします。

(画像提供:Tom's Hardware)

14. 「Then +」をクリックします

IFTTTでトリガーを作成する

(画像提供:Tom's Hardware)

15. Telegramを検索し選択します。

IFTTTでトリガーを作成する

(画像提供:Tom's Hardware)

16.アクションとして 「写真の送信」をクリックします。

IFTTTでトリガーを作成する

(画像提供:Tom's Hardware)

17. 次の画面で、ターゲットチャットを「@IFTTT とのプライベートチャット」に設定します(まだ設定されていない場合)。 「写真のURL」セクションで「材料を追加」をクリックし「値1」を選択します。「値1」の「V」が大文字になっていることを確認してください。「キャプション」セクションで、キャプションを「動きを検出」に変更し「アクションを作成」をクリックします。

IFTTTでトリガーを作成する

(画像提供:Tom's Hardware)

18. 「完了」をクリックして、サービスを作成して開始します。

「完了」をクリック

(画像提供:Tom's Hardware)

19. 次に、「ホーム」をクリックし「Webhooks」をクリックします。 

IFTTTでトリガーを作成する

(画像提供:Tom's Hardware)

20. 次の画面で「ドキュメント」をクリックすると、Webhook がどのように構築されているかを確認できます。 

IFTTTでトリガーを作成する

(画像提供:Tom's Hardware)

21. 「POSTまたはGETの実行」セクションで、{event}をクリックしtriggerに変更します。次に、curl -X POSTで始まる一番下の行で、httpsから行末までを選択し、リンクをコピーしてメモ帳に保存し、後で使用できるようにします。完了したら、「< サービスに戻る」をクリックします。 

IFTTTでトリガーを作成する

(画像提供:Tom's Hardware)

22.   www.filestack.comでアカウントを作成します。このアカウントは、Raspberry Piからアップロードされた画像を保存するために使用します。アップロードされた画像はTelegramメッセージに添付されます。無料アカウントに登録し、ダッシュボードにログインすると、右上にAPIキーが表示されます。このキーは後で必要になります。  

ファイルスタック

(画像提供:Tom's Hardware)

23.   filestackライブラリをインストールします。Pythonでfilestackを使用するには、ライブラリをインストールする必要があります。ターミナルで以下を入力し、Enterキーを押して実行します。  

sudo pip3 install filestack-python

モーション検出プロジェクトのコーディング

1. このプロジェクトのPythonコードを書くには、お好みのPython 3エディタ(ここではThonnyを使用)を選び、「trigger.py」という新しいファイルを作成してください。定期的に保存することを忘れないでください。

最初のコードブロックは、プロジェクトを構成するライブラリのインポートで構成されています。Requests は IFTTT に Webhook を送信するために使用します。gpiozero ライブラリは PIR センサーとのインターフェースに使用します。picamera ライブラリはカメラ用です。pause from signal は、実行後にプロジェクトが閉じるのを阻止するために使用します。最後に、filestack はカメラ画像をサービスに送信するために使用します。 

import requests from gpiozero import MotionSensor from picamera import PiCamera from signal import pause from filestack import Client

2. 次に、 API キーを含む Filestack へのリンクが含まれる  client というオブジェクトを作成する必要があります。

client = Client(“YOUR API KEY HERE”)

3. PiCamera で動作するオブジェクトを作成し、カメラの解像度を 1920x1080 に設定します。 

camera = PiCamera() camera.resolution = (1920, 1080) 

4. 次のステップは、 send_alertという関数を作成することです。この関数には、Webhook経由でIFTTTに画像を送信し、その後Telegramに送信するために必要なすべての手順が含まれます。この関数が呼び出されると、まず写真を撮影してimage.jpgとして保存し、その後、Filestackにnew_filelinkとしてアップロードします。そして、このリンクはデバッグのためにPythonシェルに出力されます。 

def send_alert(): camera.capture(“image.jpg”) new_filelink = client.upload(filepath=”image.jpg”) print(new_filelink.url) 

5.画像をIFTTTに送信するには、 requestsライブラリを使って、先ほどメモしておいたWebhookアドレスに画像を投稿する必要があります。このリンクには、トリガーワード、トリガー、IFTTTのAPIキーが含まれていますが、JSONの小さなセクションも含まれています。このセクションには、IFTTTが写真のURLとして期待するキー「value1」が含まれています。つまり、このキーに紐付けられている値は、Filestack上の画像のURL  であるnew_filelink.urlオブジェクトです。

r = requests.post(“https://maker.ifttt.com/trigger/ trigger/with/key/YOUR API KEY HERE”, json={“value1” : new_filelink.url}) 

6. 画像送信時のエラー処理には、リクエストのステータスコード機能を使用して返されたコードを照会します。200であれば正常ですが、それ以外の場合はエラーが発生します。  

if r.status_code == 200: print(“Alert Sent”) else: print(“Error”) 

7.これで関数は完成です。プロジェクトの最後の3行です。pirというオブジェクトを作成しその中でPythonにPIRセンサーの接続先(GPIO17)を伝えます。そして、動きが検知されたら、先ほど作成したsend_alert関数を読み込むようにコードに指示します。 

最後に、コードは一時停止し、次のトリガーがアラームを鳴らすまで待機する必要があります。 

pir = MotionSensor(17) pir.when_motion = send_alert pause()

8. コードが完成したら、保存して実行します。 

これで、手をかざすだけでセンサーが作動するはずです。センサーは非常に敏感なので、テスト時は自分から離してお使いください。センサーが作動するたびに、カメラが写真を撮影し、Telegramに投稿します。世界中どこにいても、通知を受け取ることができます。 

この記事はもともとLinux Format Magazineの第 262 号に掲載されました