obnizのフォーラムは新しいシステムに移行しております。
新しいフォーラムはこちらになりますLINE Clovaのタイムオーバー回避方法について
-
少し前にLINEにて開催されたobnizのハンズオンの資料を参考に、Runkitでモーター制御するスキルを作りました。obniz側の動作が長くなるとClovaがタイムオーバーとなるようで、obniz側は非同期に正常動作しているにもかかわらず、Clovaから「スキルの起動に失敗しました・・・」の声が返ってきます。Clova側の仕様だとは思うのですが、何か回避方法はないでしょうか?
-
Clova側でレスポンスのタイムアウトですね.
何秒でタイムアウトになるかは非公開のようですが,体感としては2~3秒処理にかかるとタイムアウトしてしまうようです.回避方法としてはいくつかあります.
①純粋にobnizの実行にかかる時間を短くする
②clovaのレスポンスを返した後にobnizを操作する
③HTTPフックでobnizが動くようにするobnizとClovaのハンズオン資料とのことなので,こちらの資料を見られてるかと思います.
この中のコード部分をベースに回答させていただきます.
①純粋にobnizの実行にかかる時間を短くする
move関数の中で
// 1秒だけ動かす await obniz.wait(1000);
とありますが,こちらのwaitを少なくすれば,それだけClovaのタイムアウトになる可能性が減ります.
その分,動かせる距離も短くなるので,使い方次第になると思います.
②Clovaのレスポンスを返した後にobnizを操作する
コードの中では
await moveTo(direction);
したあとにresponseHelper.setSimpleSpeech()
を読んでいます.
つまり,obnizの操作(1秒程度)が終わったあとにClovaにレスポンスを返していますこれの順番を逆にすることで,Clovaにレスポンスを先に返してからobnizの操作をするようになり,十分な時間をobnizの操作に使うことができます.
ただし,runkitはレスポンスを返すともう処理が終わったと思って終了してしまうので,runkit上ではこの方法を取ることができません.
ローカルPCやherokuなど,別のnode.js環境であれば使えるので,そちらで試していただければと思います.
③webhookでobnizが動くようにする
runkit上でのobnizの操作に時間がかかるのを,webhookを使うことで逃げることができます.
webhookの先でobnizの処理に時間がかかっても,そのwebhookを起動するのは一瞬のため,Clovaをまたせずにレスポンスをすることができます.webhook先はobniz.ioのイベントで作成してもいいですし,runkit上でもう一つプログラムを書くことでも作成できます.
以上3つ挙げましたが,実用上は②か③になると思います.
環境構築できるのであれば②のほうがシンプルで簡単かなと思いますが,環境構築が難しければ③をおすすめします.
-
回答ありがとうございます。実力的に③のobniz Event Webhookで行ってみようとおもいます。その場合のRunKitでWebhookする部分のコードの具体例を教えていただけないでしょうか。Google Home IFTTTからobniz EventのWebhookの経験はあります。
-
たとえば,こちらはいかがでしょうか.
これらの中でmove()と同じことを実装し,そのwebhookを叩くために下記のコードをclovaを書いたrunkitの方に書いていただければと思います.
const fetch = require("node-fetch") const URL = 'http://www.example.com/'; // getでwebbhookを叩く fetch(URL); //webhookのリクエスト完了までの時間を確保する(レスポンスは待たない) //100msにしてますが,もっと短くても大丈夫だと思います. await new Promise((resolve)=>{setTimeout(resolve,100)});