Alexaで位置情報を取得するReal-Time Location Services for Alexa Skillsの設定と流れるJSON

ごきげんよう

この記事は
**「するめごはんのVUI・スマートスピーカー Advent Calendar 2018」**
の24日目の記事です。

AlexaDevSummitの1日目で会場をふらふらしてたら、岡本さんから
「showさんやばいっす！これみてくださいよ！！」
と、ノートPCを開きながらめっちゃ興奮されてたので、そのPCをみたらAlexaが位置情報に対応してた画面でした。

岡本さんありがとうございました。

僕もその日の夜に「おおおー」となってました。

で、既に試されてる方々がブログに上がっているわけですが、僕は僕で改めて試して、流れるJSONがたしかに変わったなーと思ったのでここに記載します。

#Real-Time Location Services for Alexa Skills

これについては公式のサイトをみてください。

https://developer.amazon.com/ja/blogs/alexa/post/f23d0796-6c98-40d4-b499-e198b347a998/location-services-launch

#先に確認できた記事類

これらをみればわかると思います。

■情報提供元、岡本さんの記事
・Alexaから位置情報を取得可能になったので試してみた
https://alexa.wp-kyoto.net/archives/1364/


■さっそくためした @MYamate_jp さんの記事
・Alexa Real Time Location Serviceを使う
https://qiita.com/MYamate_jp/items/2adab9d6e1173218bb41

■ @MYamate_jp さんの他の記事
・Alexa Skill開発でよく使いそうな関数をまとめたnpmモジュールを作った
https://qiita.com/MYamate_jp/items/8cd7d80cccc54b0b510f


#僕も試してみた

まず、APL対応した画面を、スマートスピーカーを遊びたおす会で録画したかったがためのスキル
「ヒロインのテスト」
で、試します。

が、別に何でもいいです。SDK v2であるだけです。

##1.Alexa Developer Consoleのアクセス権限を押す

いつもの左下箇所です。

![アクセス権限.png](https://qiita-image-store.s3.amazonaws.com/0/67398/480bc720-5739-c42d-797f-4cc2fcf902c1.png)

##2.位置情報のトグルをONにする

いつの間にか、しれっとでてきていた、位置情報サービスのトグルをONにします。

![位置情報サービス.png](https://qiita-image-store.s3.amazonaws.com/0/67398/4e3d80eb-e7bb-5c4e-6edf-c3f85ffc1693.png)

##3.LambdaでJSONを確認してみる

単純にJSONの中身を出力します。

```javascript:ログを出すだけ

console.log(JSON.stringify(handlerInput));
```

LaunchRequestのHandlerにでも入れてみてください。

##4.スマホからスキルを起動する

スマホからスキルを起動してみたら **"alexa::devices:all:geolocation:read"** が追記されていました。

が、アクセス権を許可していないので**DENIED**になっています。


```json:流れるJSONの一部

    "requestEnvelope": {
        "version": "1.0",
        "session": {
            "new": true,
            "sessionId": "amzn1.echo-api.session.fad41c95-9292-XXXXXXXXXXXXXXX",
            "application": {
                "applicationId": "amzn1.ask.skill.fd6f4522-518c-XXXXXXXXXXXXXX"
            },
            "user": {
                "userId": "amzn1.ask.account.XXXXXXXXXXXXXXXX",
                "permissions": {
                    "scopes": {
                        "alexa::devices:all:geolocation:read": {
                            "status": "DENIED"
                        }
                    }
                }
            }
        },
        "context": {
            "System": {
                "application": {
                    "applicationId": "amzn1.ask.skill.fd6f4522-518c-40b3-8508-71e6d205ed1e"
                },
                "user": {
                    "userId": "amzn1.ask.account.XXXXXXXXXXXXXX",
                    "permissions": {
                        "scopes": {
                            "alexa::devices:all:geolocation:read": {
                                "status": "DENIED"
                            }
                        }
                    }
                },
                "device": {
                    "deviceId": "amzn1.ask.device.XXXXXXXXXXXXXXXXXX",
                    "supportedInterfaces": {
                        "Geolocation": {}
                    }
                },
                "apiEndpoint": "https://api.fe.amazonalexa.com",
                "apiAccessToken": "XXXXXXXXXXXXXXXXXXXXXXXXX"
            }
        },
```


##5.スマホのAlexaで位置情報を許可してみる

スマホ（僕はAndroid）のAlexaスキルアプリを呼び出して、スキルへの位置情報提供を許可します。

一応、スクリーンショットをとってみました。

まずは起動してメニューを表示しましょう。

![Screenshot_20181224-191947_R108.png](https://qiita-image-store.s3.amazonaws.com/0/67398/839917e7-8660-45e6-59e7-eccbde638754.png)

上記で「スキル・ゲーム」を選びます。

![Screenshot_20181224-191956_R108.png](https://qiita-image-store.s3.amazonaws.com/0/67398/7261ed81-0921-f84b-4a0a-fb8f7f97678d.png)


はい。いつもの画面です。
ここでいつも通り、有効なスキルを選びましょう。

今回の「ヒロインのテスト」は開発中のスキルなので
**開発スキル**　を選びます。

![Screenshot_20181224-192011_R108.png](https://qiita-image-store.s3.amazonaws.com/0/67398/a8851d6d-949a-c308-9a17-2e969658fccf.png)


そして、画面をスクロールして目的のスキルを選びましょう。

![Screenshot_20181224-192028_R108.png](https://qiita-image-store.s3.amazonaws.com/0/67398/c90a31c6-f41c-e4ba-33b9-101896bd44e7.png)


目的のスキルを選んだら、グレーになっている「設定」をタップ。
※個人的に選べなさそうな色にみえる。

![Screenshot_20181224-192038_R108.png](https://qiita-image-store.s3.amazonaws.com/0/67398/c37f8d45-cbc7-d1db-d225-f61bf487e98d.png)


Alexa Developer Consoleで位置情報サービスのトグルをONにしているので、権限を聞かれます。
ここで位置情報サービスの権限を許可して保存します。


![Screenshot_20181224-192051_R108.png](https://qiita-image-store.s3.amazonaws.com/0/67398/00fdd91f-8498-21ff-9674-3bcbdbc1b9dd.png)

スマホで位置情報が取得できているなら、位置情報サービスのアクセス権に許可がされたことが確認できます。

![Screenshot_20181224-192102_R108.png](https://qiita-image-store.s3.amazonaws.com/0/67398/8bddb85a-125e-5aaf-477d-1e7e23c06704.png)


#6.もう1回、スマホからスキルを呼び出してみる

再度スマホから、「ヒロインのテスト」を起動します。

するとJSONが変化しています。

"alexa::devices:all:geolocation:read"がGRANTEDに変化して、位置情報のJSONとしてGeolocationが追記されています。



 **※位置情報の有効桁数はそのままで、適当な数字をいれてます。**

```json:位置情報サービスを許可した後のJSONの一部

    "requestEnvelope": {
        "version": "1.0",
        "session": {
            "new": true,
            "sessionId": "amzn1.echo-api.session.0c9XXXXXXXXXXXXXXXX",
            "application": {
                "applicationId": "amzn1.ask.skill.XXXXXXXXXXX"
            },
            "user": {
                "userId": "amzn1.ask.accounXXXXXXXXXXXXXXXXXXXXXX",
                "permissions": {
                    "consentToken": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                    "scopes": {
                        "alexa::devices:all:geolocation:read": {
                            "status": "GRANTED"
                        }
                    }
                }
            }
        },
        "context": {
            "System": {
                "application": {
                    "applicationId": "amzn1.asXXXXXXXXXXXXXXXXXXXXXXXX"
                },
                "user": {
                    "userId": "amzn1.ask.account.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                    "permissions": {
                        "consentToken": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                        "scopes": {
                            "alexa::devices:all:geolocation:read": {
                                "status": "GRANTED"
                            }
                        }
                    }
                },
                "device": {
                    "deviceId": "amzn1.ask.device.AXXXXXXXXXXXXXXXXXXXXXXXXX",
                    "supportedInterfaces": {
                        "Geolocation": {}
                    }
                },
                "apiEndpoint": "https://api.fe.amazonalexa.com",
                "apiAccessToken": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
            },
            "Geolocation": {
                "timestamp": "2018-12-24T10:12:06Z",
                "coordinate": {
                    "latitudeInDegrees": 79.1235586,
                    "longitudeInDegrees": 283.1111355,
                    "accuracyInMeters": 33.1111104196167
                },
                "altitude": {
                    "altitudeInMeters": 40.111111525878906,
                    "accuracyInMeters": 29.23455004196167
                },
                "heading": {
                    "directionInDegrees": 0
                },
                "speed": {
                    "speedInMetersPerSecond": 0
                }
            }
        },
        "request": {
            "type": "LaunchRequest",
            "requestId": "amzn1.echo-api.request.XXXXXXXXXXXXXXXXXXX",
            "timestamp": "2018-12-24T10:13:44Z",
            "locale": "ja-JP",
            "shouldLinkResultBeReturned": false
        }
    },

```

位置情報っぽいような数値がたくさんでてきましたが、個人的にアツいと思っているのが
**speedInMetersPerSecond** です。

まだドキュメントを読んでいないので正確なことはわからないのですが、そのまま解釈すると1秒当たりの移動速度がメートル単位ででてくる・・・？？マジで？

となると、例えば車などの乗り物に搭載されたAlexaデバイスとかも想定してるのだろうかと個人的には考えています。


#というわけで

位置情報を使ったスキルを組み込むことが可能になったと思われます。
もちろん日本語版で。

となるとエラーハンドリングとかも大変そうですが、IoTやりたい勢としては実世界との融和性が高まるので・・**オラ、わくわくしてきたぞ！**


以上です。