この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
先日リリースされたAlexa Settings APIでは、デバイスに設定されている以下の情報をAlexaのカスタムスキルから取得することができます。
- 温度の単位
- 距離の単位
- タイムゾーン
このエントリでは、ask-sdk
(v2)のUpsServiceClient
を使って、スキルから上記のデバイス情報を取得する方法をご紹介します。
Alexaデバイスの設定
今回スキルから取得する情報は、Alexaデバイスの設定では以下の箇所となります。
ちなみに、Alexaアプリ上での温度と距離の単位の設定は以下です。
項目 | オン | オフ |
---|---|---|
温度 | 摂氏(℃) : CELSIUS | 華氏(℉) : FAHRENHEIT |
距離 | メートル : METRIC | インペリアル : IMPERIAL |
なお、これらの情報をスキル側から取得する場合は、住所や電話番号・メールアドレスの取得とは異なり、以下を設定する必要はありません。
- スキル側でのアクセス権限の設定
- Alexaアプリでの、ユーザーによる情報提供の明示的な許可
Lambdaの実装
スキルのバックエンドLambdaの実装は以下となります。
- Node.js 8.10
- ask-sdk(v2)をnpmやyarnでインストールしておくこと
const Alexa = require('ask-sdk');
const LaunchRequestHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
},
async handle(handlerInput) {
const { requestEnvelope, responseBuilder, serviceClientFactory } = handlerInput;
const { deviceId } = requestEnvelope.context.System.device;
try {
const upsServiceClient = serviceClientFactory.getUpsServiceClient(); // Clientの作成
const distanceUnits = await upsServiceClient.getSystemDistanceUnits(deviceId); // 距離単位の取得
const tempUnit = await upsServiceClient.getSystemTemperatureUnit(deviceId); // 温度単位の取得
const timeZone = await upsServiceClient.getSystemTimeZone(deviceId); // タイムゾーンの取得
const speechText = '距離は' + distanceUnits + '、温度は' + tempUnit + '、タイムゾーンは' + timeZone;
return handlerInput.responseBuilder
.speak(speechText)
.getResponse();
} catch (error) {
if (error.name == 'ServiceError') {
console.log('ERROR StatusCode:' + error.statusCode + ' ' + error.message);
}
return responseBuilder
.speak('デバイスの情報が取得できませんでした。')
.getResponse();
}
},
};
const skillBuilder = Alexa.SkillBuilders.custom();
exports.handler = skillBuilder
.addRequestHandlers(
LaunchRequestHandler
)
.withApiClient(new Alexa.DefaultApiClient())
.lambda();
(長くなるため、スキル起動時のLaunchRequestHandler
以外のハンドラは省略しています)
ask-sdk
を使って情報を取得するには、serviceClientFactory
のgetUpsServiceClient
を呼び出し、以下の各メソッドを利用して情報を取得します。
引数にデバイスIDが必要となるので、こちらもあらかじめ取得しておきます。
const upsServiceClient = serviceClientFactory.getUpsServiceClient(); // Clientの作成
const distanceUnits = await upsServiceClient.getSystemDistanceUnits(deviceId); // 距離単位の取得
const tempUnit = await upsServiceClient.getSystemTemperatureUnit(deviceId); // 温度単位の取得
const timeZone = await upsServiceClient.getSystemTimeZone(deviceId); // タイムゾーンの取得
実機でスキルを実行すると、取得されたデバイスの設定(単位/タイムゾーン)を発話してくれます。
(開発者コンソールのテストシミュレータでは確認できませんので、注意ください)
おわりに
ask-sdk
のUpsServiceClient
を使って、スキルからタイムゾーンなどのデバイス情報を取得する方法をご紹介しました。
日本だけでなく、様々なリージョンをターゲットとしたスキルでうまく有効活用できそうですね。
それでは。
参考リンク
[日本語Alexa] Alexa-SDK Ver2(その6) 所在地情報
[日本語 #Alexa ] スキルからユーザーの名前やメールアドレス、携帯電話番号が取得できるようになりました
[ASK SDK for Node.js]Calling Alexa Service APIs