Alexa Real Time Location Serviceを使う

#Alexa Real Time Location Service
つい先日、Alexa Dev Summit Tokyo 2018のアフターパーティー中に「Alexaで、位置情報が使えるようになったらしい！」という話を聞いて、興奮してしまった私です。

###Device Address API
従来は、Echo端末に紐づけた住所を取得する**Device Address API**を用いて、Echo端末の現在位置を取得して、天気であったり周辺の情報を音声ベースで案内するということが出来ました。
従来であれば、この活用法で大きな問題がなく朝起きて、必要な情報をお客様に提供することに対して不足していませんでした。
しかし、昨今Alexaは家の中に留まらず利用者と一緒に使えるようになってきました。日本ではその一歩目として、AlexaアプリからAlexaを呼び出すことができるようになっています。

###Real Time Location Service
そんな風にAlexaと一緒にお出かけできるようになったら、より密度の高い情報を提供したいと思うのが当たり前かと思います。
従来のDevice Address APIでは、EchoDeviceに対して住所を紐付けていたので、動的に変化する位置情報は、使用出来ませんでした。
しかし、Alexa Real Time Location Serviceの登場によって、大きくAlexaが屋外に出ることを可能になりそうです。（まだ対応Deviceがない！）

##実際に使ってみる
### アクセス権限を有効化する
Alexa Developer Consoleから位置情報サービスをONにするスキルのアクセス権限項目に含まれる「位置情報サービス」をONにします。
![スクリーンショット 2018-12-17 22.01.28.png](https://qiita-image-store.s3.amazonaws.com/0/114168/9a23e1c7-af88-c544-6ee0-4c595b1c1369.png)

### 利用者のパーミッション有効化
位置情報サービスが有効化にされると、利用者側のAlexaアプリの有効化したスキルのページに「スキルの設定」という項目が表示されます。
そちらから、位置情報サービスの取得を許可してください。
![IMG_0523.PNG](https://qiita-image-store.s3.amazonaws.com/0/114168/c9009e51-cdab-f6e5-64b2-fb782aa59b2f.png)

### スキルのスクリプトから位置情報を実際に取得する
```sample.js
const Alexa = require('ask-sdk')

//Launch intent handler
const LaunchIntentHandler = {
    canHandle(handlerInput) {
        const request = handlerInput.requestEnvelope.request
        return request.type === 'LaunchRequest'
    },
    async handle(handlerInput) {
        //Interfaceの取得
        let isGeolocation = false;
        let supportedInterfaces = handlerInput.requestEnvelope.context.System.device.supportedInterfaces;

        if (supportedInterfaces) {
            let geolocation = supportedInterfaces.Geolocation;
            if (geolocation) {
                isGeolocation = true;
            }
        }

        //Geolocation対応デバイスか判定
        if (isGeolocation) {
            //trueの場合は、位置情報取得をサポートしている 
            let geoData = handlerInput.requestEnvelope.context.Geolocation

            //GeoDataの有無の判定
            if (geoData) {
                //geoDataを使ってなんかここでする
                return handlerInput.responseBuilder
                    .speak('ジオデータはあります！')
                    .withShouldEndSession(true)
                    .getResponse();
            }else{
                //サポートしてるけど位置情報が取れない！
                //パーミッション有効化を促す
                return handlerInput.responseBuilder
                    .speak('位置情報の取得が許可されていません。アレクサアプリのスキル設定から位置情報の取得を許可してください。')
                    .withShouldEndSession(true)
                    .getResponse();     
            }
        }else{
            //falseの場合、位置情報取得をサポートしていないデバイス
            return handlerInput.responseBuilder
                .speak('このデバイスは、位置情報取得にサポートしていません。')
                .withShouldEndSession(true)
                .getResponse();
        }
    }
}

exports.handler = Alexa.SkillBuilders.standard()
    .addRequestHandlers(
        LaunchIntentHandler,
        HelpIntentHandler,
        SkillEndHandler,
        )
    .addErrorHandlers(ErrorHandler)
    .lambda();
```

流れとしては、画面付きデバイスの判定と同じで、位置情報サービスの取得をサポートしているかをまず判定し、パーミッションがあれば位置情報データがあるので、それを使ってなんかお客様に対してレスポンスを生成する。パーミッションがなければ、位置情報データは空なので、パーミッションをONにしてくださいと促すような返答文を戻す流れになると思います。
公式ドキュメントでは、accessの項目で、パーミッションの有効無効を判別するように書いていましたが、許可していないときはGeolocationObjectも空だったので、現状の判定はGeolocationObjectの有無を見てしまって良いと思います。

###Geo dataの中身
[参考元:Alexaから位置情報を取得可能になったので試してみた](https://alexa.wp-kyoto.net/archives/1364/)
岡本さん当日はお声掛けありがとうございました。

```locationdata
     "Geolocation":{ 
        "timestamp": "2018-03-25T00:00:00Z+00:00", //位置情報取得時のデバイスの時間
        "coordinate": {
            "latitudeInDegrees": 38.2, //緯度
            "longitudeInDegrees": 28.3, //経度
            "accuracyInMeters": 12.1  //メートル単位の精度
        },
        "altitude": {
            "altitudeInMeters": 120.1, //メートル単位の高度
            "accuracyInMeters": 30.1 //メートル単位の精度
        },
        "heading": { 
            "directionInDegrees": 180.0 //向いている方向
        },
        "speed": { 
            "speedInMetersPerSecond": 10.0 //秒速何メートルで移動しているか
        }       
      }
   }
```

今の所上記の項目が戻ってきます。
しかし、公式ドキュメントでは他にもいっぱい項目が用意されてるので多分今後増えてくのかも...

##現状の使い道
正直、日本ではEchoデバイスがようやくご家庭に普及し始めている状況なので、Alexaアプリからのみ位置情報を含めたスキルの応答をどれだけの人が使うのかというと現時点では多くないかなというのが正直なところです。
ただ今後Echo Autoであったり、ウェアラブルなEchoデバイスの登場によって大きく化けたり、今までになかったような音声スキル、音声エンタメコンテンツを創り出せるキッカケには十分成り得るのではないかというのが一人の開発者として感じたところでした。
少しアイデアがあるので、冬休みの宿題で一本スキル作ってみたいなと思います。

#最後に
個人的になんですが、Alexa作る上でアプリケーションIDとか今回のGeolocationDataを取得したりするために関数作るのめんどいなって思ってます。
なので、あくまでも個人的に便利にしたいと思ってこんなユーティリティモジュールを作ってます。

**[katana-alexa-utility](https://github.com/MasamiYamate/katana-alexa-utility)**

コードも汚いですし、まだまだ未成熟ですが、多くのAlexa開発者が共通メソッドを作る手間を減らせればと思って自主的に作り始めてます。
なにか必要な機能だったり、ここはこうした方がいいよねという意見有りましたらバシバシいただけると助かります。

npmからもすでにインストールできます。

```
npm install --save katana-alexa-utility
```

詳しくは12/22のアドベントカレンダーに書きますのでお待ち下さい。