こんにちは。
岩津です。
Bチーム後編です。
前編はこちらをごらんください。
電話APIサービスとして有名な”Twilio”が、”Functions”サービスを公開しました。
簡単に言うと「自分でサーバを用意しなくても電話サービスを構築できる」という感じです。
以前はサーバーレスで稼働させるためにはAWS Lamdaなどを利用してシステムを作る必要がありましたが、簡単なものであればTwilio単体でシステムを完結できるようになったため、シンプルにサービスを作れるようになりました。
今回のハッカソンではこのTwilio Functionsを利用して、弊社提供サービスであるFASTIOからエッジ側の情報を電話で受け取ってみました。
まずやったことはFunctionsを利用して宿泊周辺(ニセコ)の天気を取得してみました。
今回はLINE社が提供する”Weather Hacks”を利用して天気を取得します。(認証処理が不要なので簡単に天気情報が取得できます)
FunctionsはNode.jsとなってます。
やってみたこと
コード(抜粋)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
twiml.say(sayPram, '外部システムへリクエストを送信します'); let url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=016010'; got.get(url, {json: true}) .then(response => { let desc = response.body.description; console.log(desc); if (desc === '') { twiml.say(sayPram, "該当する地方はありません。"); } else { console.log(desc.text); twiml.say(sayPram, response.body.title); twiml.say(sayPram, desc.text); } console.log('end command 10'); callback(null, twiml); }) .catch(error => { callback(error); }); |
Weather Hacksからは以下のように天気情報が取得されます
天気情報
1 2 3 4 5 6 7 8 9 |
{ … title: "道央 倶知安 の天気", description: { text: " 北海道付近は、15日夜は気圧の谷の中でしょう。16日は高気圧に覆わ れる見込みです。 石狩・空知・後志地方の15日15時の天気は、曇りまたは晴れで雨の降 っている所があります。 15日夜は、石狩・空知地方は晴れ時々曇りで、夕方まで雨の降る所があ るでしょう。後志地方は曇り時々晴れの見込みです。 16日は、晴れで朝晩曇りでしょう。 海の波の高さは、15日夜は2メートルとやや高いですが、のち1メート ルの見込みです。16日は1メートルでしょう。", publicTime: "2017-09-15T16:36:00+0900" } } |
あとはTwilio上で取得した電話番号とFanctionsを紐付けて、電話をかけると上記の天気情報が音声で案内されます。
外部システムとの連携が確認できたので次はエッジ側の状況をFunctionsで取得してみます。
実は宿泊した施設にはなんと天然温泉が引き込まれており、24時間温泉に入れるという素敵な作りになっていました。
別チームではその温泉(浴室)に温度センサーを設置していることがわかり、「電話で温泉の温度がわかると面白いんじゃないか」と思いつき、温度データを活用して「Twilio音声通知」ならぬ「Twilio温泉通知」をやってみようとなりました。
やってみたこと
FASTIO 上の温泉浴室温度グラフ
温泉浴室の温度はすでにFASTIOへ送信され続けているので、FASTIO上では刻々と温度と湿度が記録されています。
温度リスト
FASTIOに保存された温度はAPIで取得できるのでFunctionsから取得します。
コード(抜粋)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
// 日本の時間に修正 let dt = new Date(); dt.setTime(dt.getTime() + 32400000); // 1000 * 60 * 60 * 9(hour) let toDateStr = '' + dt.getFullYear() + ('0' + (dt.getMonth() + 1)).slice(-2) + ('0' + dt.getDate()).slice(-2) + ('0' + dt.getHours()).slice(-2) + ('0' + dt.getMinutes()).slice(-2) + ('0' + dt.getSeconds()).slice(-2); let fromDt = new Date(); fromDt.setTime(dt.getTime() - 3600000); // 1000 * 60 * 60 * 1(hour) let fromDateStr = '' + fromDt.getFullYear() + ('0' + (fromDt.getMonth() + 1)).slice(-2) + ('0' + fromDt.getDate()).slice(-2) + ('0' + fromDt.getHours()).slice(-2) + ('0' + fromDt.getMinutes()).slice(-2) + ('0' + fromDt.getSeconds()).slice(-2); console.log('fromDateStr:' + fromDateStr + ' toDateStr:' + toDateStr); let fastioApi = 'https://api.fastio.jp/10/logger/data/regular?access_token=XXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXX&term_id=4775&from=' + fromDateStr + '&to=' + toDateStr + '&no=6'; console.log('api:' + fastioApi); got.get(fastioApi, {json: true}) .then(response => { let onsenTmp = ''; if(response.body.data["6"]) { let onsenDate = new Date(); console.log('date onsen:' + response.body.data["6"][0][0] + '000'); onsenDate.setTime('' + response.body.data["6"][0][0] + '000'); console.log(onsenDate.toString()); onsenDate.setTime(onsenDate.getTime() + 32400000); // 1000 * 60 * 60 * 9(hour) let onsenH = onsenDate.getHours(); let onsenM = onsenDate.getMinutes(); console.log('onsenH:' + onsenH + ' onsenM:' + onsenM); console.log('response.body.data:' + response.body.data["6"]); onsenTmp = response.body.data["6"][0][1]; console.log(onsenTmp); } if (onsenTmp === '') { twiml.say(sayPram, "最新の温度取得ができませんでした。おそらく電源が入っていないようです。"); } else { console.log(onsenTmp); twiml.say(sayPram, onsenH + '時' + onsenM + '分の、' + 'Bとうの温泉部屋の温度は' + onsenTmp + '度です。'); } callback(null, twiml); }) .catch(error => { callback(error); }); |
発表では電話をTwilio番号にかけて以下のような音声が聞こえるのをデモしました。
今思えば「お湯の温度が熱くて入れない」という他メンバーの話もあったので、室温ではなくお湯を計測するのもよかったかもしれません。
実際の運用ではFASTIO側から警戒温度を超えた時点でWebfookを利用して指定の電話番号に電話をかけるなどの利用が考えられます。
反省点は端末実機との連携デモができなったところですが、そのかわりTwilioの電話会議機能や音声文字化をデモできたので社内サービスに応用していくきっかけづくりとしては良かったのではと思います。
まとめ
Functionsを利用することで気軽にTwilioの機能を試したり他のシステムと連携できるようになりました。
サービスの向上のために積極的に活用していきたいと思います。
……あと「温泉通知」と言ってみたかったんです。