【連載記事】Azureを使って一人暮らしの父を見守る(1)

2020年7月29日

はじめに

一人暮らしの父(80歳Over)を見守るため、Webカメラで動体監視を行い、毎日リビングで過ごしているかを見守るシステムを構築します。

何本かに記事を分けて構築を進めたいと思いますが、最終的には以下の構成になりそうです。

必要なものなど

実家には以下の物品を導入予定。

  • 常時接続可能なインターネット回線(+Wi-Fiのアクセスポイント付きルータ)
  • Webカメラ(最低限RTSP対応のもの)
  • Synology NAS(安価なものではDS-118など)

Synology NASにはSurveillance Stationという、Webカメラを利用するアプリケーションが追加インストール可能で、標準では最大2台のWebカメラが接続できます。(ライセンスを追加購入することで、より多くのWebカメラが接続可能)

オススメというか、安価な構成で構築する場合は、以下が良いと思います。

動体検知機能があって、指定したスケジュールの間にカメラが動体を検知すると、IFTTTや任意のURLにWebhookで通知を行う事が可能です。

以下の機能を実装すれば、一人暮らしの父を遠隔でも見守ることができるかと思います。

  • カメラが動体検知したら、Logic Appsでイベントを受け、受信した日時をTable Storageに保存
  • 前回の動体検知から一定時間経過している場合にはLineで自分に通知を行う(頻繁に通知が送られないようにする)
  • 定期起動するLogic Appsも動かして、日中の時間帯やいつも起きる時間を過ぎていても(例えば昼になっても)動体検知が行われていない場合はLineに通知を行う(ここでTable Storageに保存される前回受信日時を使う)

今回の記事では、最初の「カメラが動体検知したら、Logic Appsでイベントを受け、受信した日時をTable Storageに保存」まで設定します。

Synology Surveillance Stationの設定

Web管理画面にログインして、パッケージセンターから「Surveillance Station」がインストールされていなかったら、インストールします。

Surveillance Stationのアプリを起動して、「IPカメラ」からRTSPかONVIFに対応しているカメラを追加します。

続いて、「録画設定」の「スケジュール」で動体検知する時間帯を設定します。

一応簡単ですが、これでカメラの設定は完了。

Logic Appsの準備

Logic Appsを新規作成して、「HTTP要求の受診時」のトリガーをまずは作成します。

JSONスキーマは、先々LINEのメッセージも受けられるように、以下の内容を設定します。

{
    "properties": {
        "events": {
            "items": {
                "properties": {
                    "message": {
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "text": {
                                "type": "string"
                            },
                            "type": {
                                "type": "string"
                            }
                        },
                        "type": "object"
                    },
                    "replyToken": {
                        "type": "string"
                    },
                    "source": {
                        "properties": {
                            "type": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            }
                        },
                        "type": "object"
                    },
                    "timestamp": {
                        "type": "integer"
                    },
                    "type": {
                        "type": "string"
                    }
                },
                "required": [
                    "replyToken",
                    "type",
                    "timestamp",
                    "source",
                    "message"
                ],
                "type": "object"
            },
            "type": "array"
        }
    },
    "type": "object"
}

とりあえず今回は、どこかでも要求を受けたら受けた日時をTable Storageに書き込むところまで。

まずは時間を取ってきて、ローカル時間に変換します。

最後に任意のTable Storageに事前に作成しておいたテーブル名と、Partition Key, Row Key, 保存する内容を設定します。

Logic Appsの保存後に、curlコマンドなどで実際にPOSTデータを送ってみます。

$ curl -H "Content-type: application/json" -d '{"events":[{"type": "motion"}]}' -X POST 'https://prod-15.japaneast.logic.azure.com:443/workflows/xxxxxxxx/triggers/manual/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=xxxxxxxx'

実行結果を見ると、ちゃんと最後まで動作しました。

Storage Explorerで確認しましたが、ちゃんとmotionテーブルにRowKey=lastmotionで日時が登録されていました。

Synology側のイベント駆動設定

ここで残念なお知らせなのですが、Synology側で動体検知イベントを直接Logic AppsのHTTPトリガーURLに対して送ることができませんでした。

アクション規則の画面から動体検知した時に指定したURLに対してPOSTメソッドで指定するのですが、Logic Appsから払い出したURLは指定ができませんでした。どうも、「?api-version=2016-10-01~」の部分が正しく扱われずに、うまく行かなかったのです。

仕方がないので、Functionsを作成して、そのproxy機能だけを利用して回避します。

Functionsを作成して、ルートテンプレートに難読性の高いパスを設定します。バックエンドURLにはLogic AppsのHTTPトリガー用URLを指定して、許可されているHTTPメソッドはPOSTのみにします。

これで、Functions Proxyの準備はOKなので、Synologyのアクション規則を設定していきます。

「情報」タブは適当に

「イベント」タブではイベントソース「カメラ」、デバイスに設定したIPカメラの名前、イベントは「モーションを検出しました」を選択します。

「操作」タブでは、アクションデバイスに「Webhook」、URLにはFunctions Proxyで設定した方のURLを入れます。
方法は「POST」、コンテンツタイプには「application/json」を選択して、本文には「{“events":[{“type": “motion"}]}」を入力します。これはあとから効いてくるのですが、LINEと統合した時に同じエンドポイントでLINEからなのか、SynologyからなのかをLogic Appsで判別できるようになります。

「スケジュール」タブでは、とりあえず運用に入る迄の実験では、終日動体検知のテストを行いたいので、全期間を対象にしています。

動作確認

カメラの前で飛んだり跳ねたりして、動体検知が行われてそのたびにLogic Appsが呼ばれていることを確認しましょう。

おわりに

ここまでくれば、Logic Appsを使ったことがある人なら、動体検知イベントの結果をSlackやOutlookメールに送ったりと自由に機能を追加できるのではと思います。

まだ私はこの先は作成中なのですが、LINEと連携して最初に書いたとおりのみまもりシステムを完成させたいと思います。

全ての内容を一本の記事にしてしまうと、異様に長くなってしまうので今回はここまでにします。

参考になれば幸いです。