Amazon DeeplensとAlexa proactive API で 鯖の寒干しを鳥から守ろうじゃないかl

# はじめに
「スマートスピーカーを遊びたおす会 Vol.5」

https://kotodama.connpass.com/event/120483/
呼んでいただいてありがとうございます。

## Attention
本日のスライドはQiitaのスライドモードで作っており、説明の中で画面が下スクロールします。

----

## 本日のゴール

今日は時間も短いので、**AIとAlexa** って **なんか楽しそう**で、**なんかできそうだな**と思ってもらえることがゴールです。

----

# Who are you?

Tomoharu Itoh（オランダ在住）
https://hugtech.io

- Alexa Champion.
- Assisted By Alexa Certified Skill Builder as Subject Matter Expert.

コミュニティ AAJUG(えーじゃぐ)
https://aajug.connpass.com/
（開発してるひともそうでないひとも、機会と話したいひと、みなさん Welcome です）

----

# 鯖を監視するに至った背景

- 海外在住だと日本食が恋しい。
- 幸いなことに毎週土曜、家の近くに市場が出て、新鮮なお魚が買える。
- １週間保存がきくように、干物にしておきたい。

----

## そしてあいつがやってきた。

### Version1 自作物干し機（ボール＋網）

![50586616_10213440426820978_2736226104099471360_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/49986/5f1acc8b-ce2b-f96c-4d9f-1b526bed3eab.jpeg)

流石に無防備すぎた。

### Version2（オランダでよく見る自転車のカゴ）
![50797736_10213440976274714_2988765340676128768_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/49986/9e420add-582e-8a4e-1aa9-f278a3b97f58.jpeg)

匂いは防ぎようがなく、あいつがやってきた。

### 鯖の天敵
![Gull_in_water3.jpg](https://qiita-image-store.s3.amazonaws.com/0/49986/29625e4a-8b04-1451-f721-2eaebe698388.jpeg)

----
# そして、うみねことの戦いが始まった。
----

# 鯖を安全に見守るために必要な課題を整理しよう

- 干してる間、カゴを見とくの辛い。
- あいつが来たら呼んで欲しい。
- **ちょっと僕を焦らせて欲しい。（SNSで通知来るだけでは私は性格的にスルーする可能性がある）**

----
# 実現できそうか考えてみよう。

## 1. そこにあったの。Deeplens。

AWSの提供するAIカメラ。あくまで初心者用。トレーニングすみのモデルが用意されているので、簡単にAIのパワーを体感できる。

<img width="777" alt="スクリーンショット 2019-03-04 22.20.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/86c76d87-df90-93c3-5a7e-11cc223783da.png">

もちろん、ラズパイとかObnizとか、サードパーティのマイコンにカメラくっつけて、オリジナルのモデルを動かしてもOKです。
（これはまた機会があれば、、、）

## 2. ころがるスマートスピーカーの山

焦らせてくれそうな声で話してくれれば、、、

![52854572_10213641641211212_4015413535470256128_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/49986/a5e8dff2-46ac-ed01-16b1-1e0ecbd6b742.jpeg)


## 3. ワタシAWSチョットデキル
AWS Lambdaでだいたいなんでもつながるでしょ。。


----
# 設計

## アクティビティ図
![無題の図形描画 (2).png](https://qiita-image-store.s3.amazonaws.com/0/49986/5da3151d-e9f7-4648-d625-f18afde0dc04.png)

## 使うもの的にはこう
![無題の図形描画 のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/49986/183e4607-6e3d-4807-03d0-1befa3759d0d.png)

----
# さあ、作ってみよう。
## Deeplens Object Detection Model

Deeplens にはすでに定義されたモデルがあります。Object Detectionモデルを使ってデプロイします。

<img width="1115" alt="スクリーンショット 2019-03-05 10.37.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/5ec44e29-82c5-5f87-bcb0-e9ef1bbcfa25.png">

証明書を入れ込んだりするのが多少面倒ですが、チュートリアルとドキュメントを読んでがんばりましょう。

## MQTT
MQTTはデバイス間でメッセージを軽量にやり取りするサブスリプション型のしくみです。
Deeplensにプロジェクトがデプロイされると、MQTTのメッセージバッファ（トピックといいます）も勝手にデプロイされます。

<img width="989" alt="スクリーンショット 2019-03-05 10.38.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/eb69c239-1645-e445-8c3f-6d6044ecbd20.png">

鳥（ではないかもしれないが）を検知すると、以下のようなメッセージが飛びます。
```
{ bird: <percent of confidence> }
```

## AWS IoT Rules
デプロイしたモデルはその他にも、Person（人間）とか、Dining（テーブル）とか、いろいろなものを通知してくるので、鳥だけフィルタしたいのです。そういうときには、AWS IoT Rules が使えます。

先ほどのメッセージをSQLクエリでフィルタできます。今回は **「８０％くらいの自信があって鳥だって言ってるなら」** と、設定しました。

そして、クエリにマッチした場合Lambda関数を呼ぶということも同じ画面でポチポチ設定できます。

<img width="1033" alt="スクリーンショット 2019-03-05 10.38.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/4223db7a-48fe-8491-f212-6e08a7783052.png">


## AWS Lambda
AWS IoT Rules から呼ばれるLambda関数です。
後述のAlexa Proactive API をCallするコードです。Callするには、このAPIが許可されたスキルのClientIdとClientSecretが必要です。これは後述します。

<img width="1525" alt="スクリーンショット 2019-03-05 10.43.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/1d4cb803-a062-588b-66df-9f6a97b6b6e6.png">

コードはこちら
https://github.com/haruharuharuby/bird-detect-message-handler


## Alexa Proactive API
Proactive APIは、定型句（スキーマといいます） をAlexaデバイスに通知できる機能です。

「荷物が届きました」 とか 「今日はXXXゴミの回収日です」 とか。

定義済みスキーマの一覧
https://developer.amazon.com/ja/docs/smapi/schemas-for-proactive-events.html

Proactive APIでは、通知をカスタマイズできないので、今回は **嵐** が来たことにします。

**AMAZON.WeatherAlert.Activated**

なければここからリクエストを送りましょう。みんなが希望していれば届くかもしれません。
https://alexa.uservoice.com/forums/906892-alexa-skills-developer-voice-and-vote

## Alexa Skill
Alexa Skill で、Proactive API を使うように構成します。

Alexaのデベロッパーコンソールで、「アクセス権限」 のところに、ClientIdとClientSecretがあります。
前の章で出てきたLambdaのコードで利用します。

<img width="1357" alt="スクリーンショット 2019-03-05 10.50.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/190176a8-bfec-8932-15b9-48a0900d4815.png">

一回何かしらの情報取得を有効にしないとメッセージングの項目が出て来ないことがあります。

## Skill Manifest
通知は、SkillのマニフェストにPermissionブロックとEventsブロックを記載して、許可してあげる必要があります。

<img width="539" alt="スクリーンショット 2019-03-05 11.00.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/53cb55e7-52a0-dcdc-5ed5-470dd796723f.png">

後日談として、当初 AWS CodeStarというサービスの中にAlexa Skillのテンプレートがあり、それでスキルを作ろうとしていたのですが、Manifest がデプロイされないので、やむなくASK CLIでやっています）

**Note:**
JAWS DAYS 2019 において 「CodeStarでアレクサ スキルでTwillioで電話かけてお金を払わせる」 ハンズオンの資料があります。 CodeStarに興味があればどうぞ。
https://qiita.com/motchi0214/items/a95335679ee7e9d0b660

## Alexa App
Alexa の DeveloperConsoleでの作業を終えて、Skillをデプロイして、Alexa Appを見ると、「設定」→「通知」のところに該当するスキルが出てきます。　通知を有効にします。 （開発中だったので、名前がhello nodeになってます）

<img width="1007" alt="スクリーンショット 2019-03-05 11.02.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/7e722a6c-840a-89aa-eed5-4d693084f67f.png">

<img width="1009" alt="スクリーンショット 2019-03-05 11.02.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/eed70b4b-04fb-b603-23c2-47978c99df56.png">

モバイルアプリでは、画面遷移しないことがあります。そのときは、Webブラウザからアクセスします。


## スキルで通知を許可
最後にスキル側でも、通知を許可します。（開発中だったので、名前がhello nodeになってます）

<img width="1008" alt="スクリーンショット 2019-03-05 11.04.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/2ab2fa81-fce3-ae9d-ccc7-dcf9a11f6af0.png">

コードはこちら
https://github.com/haruharuharuby/server-room

----
# 実際の映像はこちら
https://www.youtube.com/watch?v=LAIqYFEcx1E

テストように、フィルタのパラメータを以下としています。

```
select person from '<<topic-filter>>' where person > 0.400
```

実際はこうです。

```
select bird from '<<topic-filter>>' where bird > 0.800
```

英語で試していますが、もちろん日本語でもできます。

----

# Alexa Day 2019

それでは４月６日に神戸でお会いしましょう！（ちがうって）
https://alexaday2019.aajug.jp/

<img width="1634" alt="スクリーンショット 2019-03-05 10.51.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/e4c70bbe-ae7f-c9d3-9f1b-bb0de364e64d.png">

----
# ありがとうございました！