Alexaスキル開発の際、現在日時を取得する必要が出てきたため、利用者のechoデバイスのタイムゾーン情報に応じて日付時刻を計算し、取得する処理を実装しました。今回は、タイムゾーンの取得の部分に絞ってその方法を解説します。
なお、ライブラリはASK SDK v2 for Node.jsを使用しています。
作成した関数
以下のような関数を作成しました。
※AlexaSukillBuilderをカスタムで構築している場合、下記関数を実行するためには事前準備が必要となります。後述の”注意事項”をご確認ください。
// スキルを実行しているデバイスに設定されたタイムゾーンを取得
async function getUserTimeZone(handlerInput){
try {
// スキルを実行しているデバイスのIDを取得
const deviceId = handlerInput.requestEnvelope.context.System.device.deviceId;
// ServiceClientFactory取得
const serviceClientFactory = handlerInput.serviceClientFactory;
// upsServiceClientを取得し、デバイスIDに設定されたタイムゾーンを取得
const upsServiceClient = serviceClientFactory.getUpsServiceClient();
return await upsServiceClient.getSystemTimeZone(deviceId);
} catch (error) {
console.error('TimeZone取得エラー:', error.message);
throw error;
}
}
作成した関数の解説
デバイスのタイムゾーンはUpsServiceClientクラスのgetSystemTimeZone関数を使用して取得します。
そして、UpsServiceClientのインスタンスはserviceClientFactoryから生成する必要があるため、流れとしては handlerInputからserviceClientFactoryを取得 → serviceClientFactoryからUpsServiceClientのインスタンスを生成、という流れになります。
また、getSystemTimeZone関数では利用中のEchoデバイスのデバイスIDが必要となるため、こちらも関数内で取得しています。デバイスIDはhandlerInputの内容を掘り下げていくと見つかります。
ちなみに、upsはUser Profile Serviceの略です。UpsServiceClientはデバイスのタイムゾーン以外にもユーザープロファイル情報を取得する際にも使用します。(※取得しようとするデータの種類によっては利用者側での事前設定が必要な場合があります)
注意事項
AlexaSukillBuilderをカスタムで構築している場合、.withApiClient(new Alexa.DefaultApiClient())を実行する必要があります。これが抜けていると処理実行時に例外が発生するため、お気をつけください。
以下は関連する部分のみを抜粋したソースコードの例です。
const Alexa = require('ask-sdk');
// SkillBuilderインスタンスをカスタムで準備
const skillBuilder = Alexa.SkillBuilders.custom();
exports.handler = skillBuilder
.addRequestHandlers(
SkillDisabledEventHandler.SkillDisabledEventHandler,
// 省略...
)
.withApiClient(new Alexa.DefaultApiClient()) // ★カスタムビルダーでServiceClientを使用している場合、この記述が必要
.addErrorHandlers(ErrorHandler.ErrorHandler)
.lambda();
デバッグのために自身のechoデバイスのタイムゾーンを変更する方法
実装したプログラムをデバッグするには、自身の所持するechoデバイスのタイムゾーンを変更し、確認してみるのが手っ取り早いと思います。これは、デバイスのタイムゾーンの変更は以下の手順で実施します。
- Amazon Alexaアプリを開く。
- その他 > 設定 > デバイスの設定を開き、タイムゾーンを変更したいデバイスを選択する。
- デバイスの詳細画面の画面上部の歯車アイコンをタップし、デバイスの設定画面を開く。
- 一般 > タイムゾーン をタップし、タイムゾーンの設定画面に進む。
- 地域とタイムゾーンを選択し、任意のタイムゾーンに変更する。
参考リンク
スキルからAlexaデバイスに設定されたタイムゾーンや単位の情報を取得する | DevelopersIO
AlexaサービスAPIの呼び出し | Alexa Skills Kit
スキルインスタンスのコンフィギュレーション | Alexa Skills Kit