概要
Alexaのスキルはシミュレータでもデバッグできるので、比較的デバッグがしやすい。
しかし、スキルが最初に呼び出された際の挙動がシミュレータでは確認できないため、エラーが発生した際のデバッグが困難。
気づいてみれば簡単なことだったけれど、結構見つけるのに苦労したので、メモとして残しておく。
ちなみに今回対象とするのは、以下の時刻表skill。
【Alexa Skill開発】Alexaに最寄り駅の次発電車の発車時刻を教えてもらう(AmazonEcho) - 技術メモ集
現象
「時刻表で平日ダイヤを教えて」等の、IntentRequestを起動すると正常に動くが、「時刻表を開いて」とLaunchRequestを起動するとエラーが起きてしまう。
エラーの原因
IntentRequest以外の挙動の記述が記載されていなかった
pythonだと、event['request']['type']内にリクエストの種類が記載される。
今回は、IntentRequestで平日or祝日を明示的に示し、この明示がなくただ時刻表アプリを起動した場合は、平日か土日かを自動判定したいため、以下のようにIntentRequestかどうかで場合分けをすることとした。
if event['request']['type'] == "IntentRequest": intent = event['request']['intent'] value = intent['slots']['DayType']['value'] else: if (jsttime.weekday() >= 5): value = "休日" else: value = "平日"
IntentRequestで入れる項目を他で参照してしまっていた
event['request']['intent'], intent['slots']['DayType']['value']といったIntentRequestで入力されるべき項目は、LaunchRequestで参照するとエラーになってしまう。
ここで注意すべきなのは、len(event['request']['intent'])==0 として、配列が空かどうか判別するやり方ではダメ、ということ!
LaunchRequestではそもそも、event['request']['intent']といった項目がないため、値を参照した段階でエラーが発生してしまうため、配列が空かどうかでは判別できない。
感想
気づいてしまえば当たり前でごく単純なことだけれど、一旦エラーになってしまうとなかなか見つからないもの・・・・。