Alexa Echo FlexのモーションセンサとAmbientを使って人感監視する


Alexa Echo Flexにモーションセンサがついているので、せっかくなのでIoTとしてモーション検知を蓄積してみます。
AlexaのスキルにIFTTTを使い、IoTイベントの蓄積および可視化には、Ambientを使わせていただきました。
モーション検知後のアクションに設定可能なAlexaスキルで適当なのはIFTTTぐらいでしたが、IFTTTからAmbientに直接リクエストを送れなかったので、いったん中間のWebAPIサーバを介しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/c5cb3b2e-d8fe-9349-c2f0-c0dfe4268c73.png)

IFTTTのサイトにアクセスし、まだアカウントを作っていない場合は作成します。

https://ifttt.com

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/ac7df2de-bad2-75df-dbd7-6b44d872b2f7.png)

これから、2つのアプレットを作成します。モーション検知したときのものと、一定時間検知がなかったときのものです。
Createボタンを押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/f46f32b4-7070-d17f-5110-e86cd3614459.png)

If Thisに、Amazon Alexaを選択し、Triggerとして「Say as a specific phrase」を選択します。

Phraseには、適当に「センサーイン」と入力し、Create triggerボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/2310359e-dc33-52fe-e15c-8099ca91acc7.png)

すると、Connect Serviceの画面が表示されて、Amazon Alexaのアカウントとして接続する画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/6c1061eb-744f-a109-66c8-ffa51e9b9395.png)

Connectボタンを押下すると、Amazonアカウントのログインが促されますので、Echo Flexに設定したAmazonアカウントと同じアカウントでログインします。
この設定は最初の1回だけです。以降はこのログイン状態はIFTTTのアカウントに紐づいて記憶されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/06263f63-686b-fd93-2d2d-631289d40f41.png)

続いて、Then Thatとして、「Webhooks」を選択します。検索テキストに、webhookと入力するとすぐに見つかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/7ab852be-f270-0b7a-01a8-370cf38e8e36.png)

以下の入力画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/d189c557-a316-2111-3b17-88e8d40fa554.png)

URL：これから立ち上げるWebAPIサーバのURLを指定します。
例えば、https://【WebAPIサーバのホスト名】:20443/echosensor とします。

Method：POST を選択します。

Content Type：application/jsonを選択します。

Body：WebAPIサーバで受け取りたいJSON値を指定します。以下のようにします。
{ “id”: “id1”, “state”: 1 }

idは、Ambientに登録する際のデータ列の名前です。8個まで登録できるのかな？
stateは、1でモーション検出、0でモーション検出解除を意味します。

最後に、Create actionボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/b0c431bb-b9bd-f72a-3ee3-1a7ea724aa6a.png)

Continueボタンを押下することでトリガー待ちになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/1f4b7d53-d95e-1d5a-a2fa-9e34f0ad2390.png)

できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/303480e7-2bee-30c0-b534-f02f04f12084.png)

同様に、今度はセンサーアウトを作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/0f972423-5027-cb24-d6c3-4995e15e45f2.png)

今度は、Bodyの中のstateを0としています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/4fbbad9e-6026-c789-45f5-ba3a34b63cd5.png)


#Ambientへのチャネルの登録

Ambientに、先ほどのJSONを受け取るチャネルを作成します。

Ambient – IoTデータ可視化サービス

https://ambidata.io/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/2545f216-dab8-3fef-9062-a947a08c02fa.png)

まだユーザ登録していない場合は、右上の「ユーザー登録(無料)」から登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/d26014bd-d10e-59e7-4244-89aab723df97.png)

「チャネルを作る」ボタンを押下

そうすると、チャネル名が割り当てられてチャネルが1つ増えます。
チャネル名をクリックします。表に表示されるチャネルIDとライトキーは後で使うので覚えておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/fcd0c766-4cb9-a6d8-4f6c-0503eb6a8707.png)

まだ何もチャートが作成されていないので、一番上のチャートっぽいボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/003067f2-447b-b618-338c-ba794e7d5c52.png)

チャネル/データ設定をクリック。
チャート名には、例えば「モーションセンサー」、チャネルの種類として「稼働状態」を選択します。
そして、d1のラジオボタンを表示にします。d1というのが先ほどJSONで指定したやつです。
設定ボタンで完了です。まだ、データはないので何も表示されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/7c868b47-a3ea-131c-e698-b44b1d9e817d.png)

#WebAPIサーバ

IFTTTから呼び出しを受けて、Ambientにデータを登録するWebAPIサーバを立ち上げます。

中身はこんな感じです。Lambdaをご存じであれば、すぐ理解できると思います。
npmモジュールとして、ambient-libを使わせていただきました。

ambient-lib

https://ambidata.io/refs/js/

```js:express_template/api/controllers/echosensor/index.js
'use strict';

const HELPER_BASE = process.env.HELPER_BASE || '../../helpers/';
const Response = require(HELPER_BASE + 'response');

const AMBIENT_CHANEL_ID = '【AmbientのチャネルID】';
const AMBIENT_WRITE_KEY = '【Ambientのライトキー】';

const Ambient = require('ambient-lib');
const am = new Ambient(AMBIENT_CHANEL_ID, AMBIENT_WRITE_KEY);

exports.handler = async (event, context, callback) => {
	var body = JSON.parse(event.body);
	console.log(body);

	var value = {};
	value[body.id] = body.state;

	am.send( value );

	return new Response({ message: 'Ambient.sended' });
};
```

以下の部分は先ほど覚えておいた値を指定します。

　AMBIENT_CHANEL_ID：【AmbientのチャネルID】
　AMBIENT_WRITE_KEY ：【Ambientのライトキー】

こちらがエンドポイントのSwaggerです。

```yaml:express_template/api/controllers/echosensor/swagger.yaml
swagger: '2.0'
info:
  version: 'first version'
  title: Lambda Laboratory Server
  
paths:
  /echosensor:
    post:
      parameters:
        - in: body
          name: body
          schema:
            $ref: "#/definitions/CommonRequest"
      responses:
        200:
          description: Success
          schema:
            $ref: "#/definitions/CommonResponse"
```

WebAPIサーバの構築は、以下を参考にしてください。
　[簡単にRESTサーバ・GraphQLサーバを立ち上げる](https://qiita.com/poruruba/items/aad6a181e8ef0d956e71)


#Alexa設定

Alexaアプリから、Alexaの設定をします。私の場合は、Android版のAlexaアプリを利用しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/55077f6f-7b90-9434-064a-e744e6072e4d.png)

下のほうにあるデバイスを選択します。さらに、すべてのデバイスを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/b34a998e-cec4-8e85-5826-400923232ab1.png)

その中に、First motion sensorというのがありますでしょうか？
最初にモーションセンサーをセットアップしたときに指定した名前によってちょっとちがうかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/0493d153-185f-5dd5-63e4-e46ee3bb0d29.png)

それでは、さっそく定型アクションを作成しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/cfd42f3e-521c-b08b-0338-2e15b97b5118.png)
 
つづけて定型アクションを作成 をタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/d6850ff6-a0c6-5840-881c-374ac1ef2e7c.png)

定型アクション名として、例えば、センサーインとします。
実行条件は、スマートホームのFirst motion sensorを選択します。
そしてモーションの状態として検出を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/7ab7bf3d-1df0-bf0c-0523-50cd0bd5e908.png)

アクションの選択には、IFTTTを選択し、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/adce744c-9db3-c4fe-9deb-5f81243f3543.png)

センサーアウトとセンサーインの2つが表示されていますので、センサーインを選択します。この文字列は、IFTTTで入力したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/2a687eb1-a4d4-93cd-881e-b5abcf9a2572.png)

できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/6aa95a22-6230-7dc4-4ed6-0bbd0a13926d.png)

これと同じように、センサーアウトも作成します。

モーションの状態では、未検出間隔を聞かれますが、とりあえず3分にしてみました。お好みで。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/2c7a3dc9-6294-67a1-4b1d-0dd5c30313a1.png)

２つ出来上がりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/0bd78085-f15d-2fb8-c16a-40c45665c8a8.png)

#動かして見てみる

これまでの設定で、すべて完了したはずです。
あとは、モーションセンサーの前でうろうろしてみましょう。

Alexaアプリを見てみると、以下のように検出されたことが表示されます。
このときに、IFTTTが起動し、WebAPIを介して、Ambientにデータが登録されているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/9664ef9e-f800-f664-f4f3-e28849e3d42f.png)

短時間すぎると、可視化したグラフは面白くないので、1日蓄積してみた画像が以下です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/4333e063-384d-7852-06f7-96047d8b0efc.png) 

以上