「OK Google, ${SA-W2の状態}を教えて」- スマートスピーカーでネットワーク機器を触ってみる
2017年12月14日 木曜日
CONTENTS
【IIJ 2017TECHアドベントカレンダー 12/14(木)の記事です】
こんにちは。IIJ の金子です。
本日は、スマートスピーカーをネットワーク機器と組み合わせるというお話をします。
はじめに
生活をちょっと便利にしてくれるスマートスピーカーですが、ネットワーク運用もちょっと便利にしてくれると嬉しいですよね?
ここではスマートスピーカー × ネットワークの組合せ事例として、Google Homeに話しかけるかけるだけでSA-W2にアクションを取らせたり情報を喋ってくれるようにしてみました。以下は実際に家のSA-W2をターゲットとして動かしてみた時の動画です。
ログを取得させる例
無線LANクライアント数やチャネル使用率、CPU使用率などを教えてくれる例
ネットワーク運用管理の自動化というキーワードがホットな最近です。これとは趣を異にしますが、ネットワークのスマート化をお手持ちのスマートスピーカーを用いてやってみませんか?というのが本稿の趣旨です。
ここではIIJが開発しているサービスアダプタ SA-W2とマネジメントシステムであるSACMをターゲットに、IFTTTとDialogflowの2つを使った方式について紹介します。
SACMとサービスアダプタ
IIJでは、中小規模のオフィスでお使い頂くためのサービスアダプタ(ルータ+各種機能を搭載したアプライアンス)を開発しています。
これらの機器は単独で動作し直接的な操作が必要なネットワーク機器ではなく、IIJが開発したSACMというマネジメントシステムで集中管理するための仕組みを搭載しているのが特徴です。SACMを利用することで、リモートにある大量の機器でもコントロールパネルから一括して設定・監視・管理を行うことが可能です。
本稿ではネットワーク機器として、ギガビットイーサーネットと無線LAN(2.4/5GHz帯)を備えたサービスアダプタ、SA-W2をSACMと組み合わせて利用していきます。
Google Home + IFTTTで簡単ネットワーク機器操作: ログ保存を例に
なにかが起きた時にログやtech-supportを取っておきたいという状況は多々あると思います。スマートスピーカーを用いることで、これを音声を用いて行うことができます。
自分: 「OK Google, ログを保存して」
Google Home: 「OK, SA-W2のログを保存します。」
SACM管理下のSA-W2では、Web UI上で以下の様に”show log debug”とコマンドを打つことでログが取得でき、タスクの実行結果として後から参照することができます。
このようにネットワーク機器に対してリモートからオペレーションできるのがSACMとSA-W2の強みです。しかし、スマートスピーカーの便利さを知ってしまうとブラウザを開く→ログインする→サービスアダプタを見つける→コマンドを打つという一連の流れを踏むのは若干煩雑です。ここではIFTTTを用いて、呼びかけだけでこのオペレーションを走らせてくれるようにしてみます。
全体的な構図は以下の様になっています。
IFTTTではトリガーとしてGoogle Assistantをサポートしており、Webhooksサービスと組み合わせることで特定の呼びかけに対してPOST/GETを発行することが可能です。ここでは「ログを保存して」という呼びかけを、コマンドを実行してくれるサーバへのリクエストに紐付けます。
webhookのリクエスト先として、ここではFirebase Google Cloud Functionsを利用しています。SACMを用いる場合、ネットワーク機器(サービスアダプタ)へのコマンド実行要求はSACM APIにて行えるため、このようなサーバレス方式を用いたほうが手軽です。
もちろんオンプレミスあるいはVPSやクラウド上にサーバとアプリを立てて実現することも可能です。特にオンプレミスにある機器にSSH/Telnet等で接続しての操作に繋げたい場合は、手元の環境にサーバを置く方が都合が良いでしょう(ところでこれらの機器やサーバでも、libarmsを導入することで同じようにSACM経由でコマンドを実行ができるようになります!)。
実際にFirebaseでSACM APIにアクセスしIFTTTからのwebhookを受け付けるコードはこちらになります。
マネジメントコード(tsa)やSAコード(tsw)、SACMのAPIキー等を埋めればそのままデプロイすることが可能です。基本的にSACMの任意コマンドを実行するだけのコードになっています。このためIFTTTにてAppletとしてトリガーにしたいフレーズとコマンドを登録していけば、サポートしているコマンドはなんであれ音声で呼び出すことが可能になります。
これを用いて実際に動かしてみたのが下記の動画になります。
実際にやってみた動画
IFTTTは、ここで実演したような単純な操作を実行させるのには手軽で便利そうです。
- 「再起動して」
- 「ファームウェアをアップデートして」
- 「クライアントを全部切断して」
- 「通信を全部止めて」
- 「PPPoEガチャして」
一方、コマンドを実行させるだけで応答を得ることはできません。先のログ取得の例もそうですが、実際にログ文面を見るためにはSACMの画面にアクセスする必要があります。
ログのように長ったらしいものは読み上げられても困るのでそれでいいとしても、やはり「〜はどうなってる?」「〜だよ!」といったよりインタラクティブな使い方がスマートスピーカーの本領ではないでしょうか。
次の例では、IFTTTの「応答が寂しい」という制約を取り払ってGoogle Home自体が情報を返してくれるようにしてみます。
Dialogflowを使ってSA-W2から情報取得
たとえばAPとして動かしているSA-W2に、どれくらいのクライアントが接続しているかを知りたい場合があります。
先に挙げたように、いつも通りのオペレーションでは 1. SACMのWebUIにアクセス 2. コマンドを実行 3. テキストの結果を見る、といった段階を踏む必要がありました。スマートスピーカーを用いることで、これをハンズフリーに実現してみましょう。
自分: 「OK Google, クライアント数を教えて」
Google Home: 「クライアント数は合計7端末います」
これが実現したい流れです。
IFTTTでは、応答が決め打ちになってしまいカスタマイズができませんでした。よりインタラクティブな対話フローを作るために、ここではDialogflowを使います。
DialogflowでもIFTTTと同じくWebhookを経由して外のサーバに何かをさせることが可能です。
大きな違いとして、その際サーバが返すレスポンスを変えることで対話の応答を制御できるという点が挙げられます。先のIFTTTの例ではコマンドが失敗しても「OK, SA-W2のログを保存します」としか応答させることができません。一方Dialogflowを利用する場合、以下の様なレスポンスをサーバ側で返すことにより好きな言葉を喋らせることが可能です。
{ "speech" : "まさかのコマンド失敗!", "displayText" : "No one expects the command failure!" }
また、IFTTTではトリガーとなる発話は決め打ちでしたが、Dialogflowでは文のテンプレート化が可能です。ここでは「〜を教えて」というテンプレートを作り、教えて欲しい内容をsa_query_targetと名付けた変数に割り付けます。
webhookのリクエスト先となるサーバではこの教えて欲しい内容(sa_query_targetに格納された文言)に応じて、実際にSA-W2へのコマンド実行要求を行います。この時の組は以下の通りです。
~を教えて | SA-W2で実行されるコマンド | コマンド実行結果の整形 | 喋らせる文章 |
---|---|---|---|
メモリ使用率 | show system | メモリ使用率のみ抽出 | 「メモリ使用率は〜%です」 |
チャネル使用率 | show status wlan.air-time.occupancy.json | 2.4/5GHz帯のチャネル使用率のうちbusyとotherを抽出 | 「5GHz帯のチャネル使用率は~%, ノイズは~% でした。 2.4GHz帯のチャネル使用率は~%, ノイズは~% でした。」 |
グーグルへのRTT | ping 8.8.8.8 count 2 | pingの結果からRTTのminとロス率を抽出 | 「グーグルへのRTTは〜ミリ秒、ロス率は〜%でした」 |
クライアント数 | show status wlan.client.count.json | 無線LANの全SSIDの接続クライアント数を合計 | 「クライアントは合計〜端末います」 |
SAのバージョン | show system | SAのバージョン文字列のみ抽出 | 「SAのバージョンは〜です」 |
CPU使用率 | show system | CPU使用率のみ抽出 | 「CPU使用率は〜%です」 |
先に述べたとおり応答を返すためにIFTTTの時とは異なった処理が必要です。コマンドの実行が完了するまで待ち、その結果を適切に整形し目的のデータだけを抽出、喋らせたい文章を返すまでがサーバのお仕事になります。
先ほど同様にCloud Functions向けにこれを実装したコードがこちらになります。
実際に応答が返せているかをテストしてみたのが以下の動画になります。実際のテストアプリの実行には「テスト用アプリに話して」から始める必要がありますが、ここでは分かりやすさのためにカットした上で連続でクエリができるようにしています。
簡単な問い合わせではありますが先ほどの例よりはぐっと、ネットワーク機器とインタラクションしている感が出てきたのではないでしょうか。
終わりに
本稿ではGoogle Homeを用いてネットワーク機器であるSA-W2を操作するという、スマートスピーカーの利用例としてネットワーク運用のスマート化のまねごとをしてみました。
単純な操作であればIFTTT、もうちょっと高度な場合はDialogflowを使うことで「ネットワーク機器とスマートスピーカー越しにおしゃべり」できるという例が見て頂けたのではないでしょうか。
今回は設定変更への応用はしませんでしたが「電波強度上げて・下げて」「〜番にフィルタをしかけて」「${クライアント}をBANして」「${コンフィグの特定部分}を教えて」といった用途にも使えそうです。また今回は1つの問合せに対して1つの応答で終わっていましたが、もっと長く会話を続けさせることでトラブルシューティング時のブレークダウンといった挙動も作れるのではないでしょうか。
実際にやってみると長文をどう噛み砕くか、誤認しやすいフレーズをいかに避けるか、ターゲットをどう指定するか、ストレスのない対話をどう作っていくかという難しさはあります。しかし、手でコマンドを打たずに音声だけで操作ができたり情報が取れるというのはなかなか面白い体験です。
今回はSACMを前提にしましたがネットワークに繋がってさえいれば同じようなことができると思います。Google HomeやAmazon Echoといったスマートスピーカーをお持ちの皆様、ご自身のネットワーク機器とおしゃべりしてみませんか?