秘書兼スマートホーム計画2020: Project Jarvis (Phase II)

秘書兼スマートホーム計画2020: Project Jarvis (Phase II)

研究室の人工秘書育成計画こと Project Jarvis は第二段階に入ります。Project Jarvisとか言っちゃってだいぶ痛いですね。馬鹿なので痛いぐらいじゃないと気分が乗らないんですよ。ちなみにJarvisというのはもちろんアイアンマンのJ.A.R.V.I.Sから取っています。

研究室で走っているサーバー上で走っているNode-RED(jarvis.core)でデータの入出力を一元化した。つまりあらゆる異なるチャネルからの入力を共通のプロトコルに落とし込むことで、場所や端末や方法に関わらず同じ操作感で継続的なアシストを受けることができる。とりあえず今対応しているものとしてはメッセージング系でSlack、Apple製品からの音声入力やタップでのコントロールはSiriショートカットとPythonista。これだけでも割と便利です。これ全部IFTTT組むとまず間違いなくぐちゃぐちゃになる。

現状で対応できていること

コアがNode-REDになっているのは大学院時代IBMさんにBluemix(現IBM Cloud)で遊ばせてもらっていた名残なんですけど、多様なI/Oの視覚的な一元管理に便利なんですよ。

視覚的に組める一方で面倒なところはちゃちゃっとJavaScriptでコーディングしちゃえばいい。たとえばSlackのreal time inputなんかはuser_typingとかdesktop_notificationあたりの通知も取得できるけど正直いらないし、そこで msg.payload.type==’message’ だけ選り分けるのにわざわざ視覚的にswitchノードを使う必要はなくて(Switchで出力が増えるとノードが肥大化して気持ち悪いし)、functionノードから

if (msg.payload.type=='message'){
   return msg;
}

だけでいい(ただしmessageタイプの通知はSlack上でのメッセージの編集や削除でも飛んでくるので、実際には if (msg.payload.subtype){ return msg;}もいる)。どうせuser_typingとかデスクトップ通知とかリアクションボタンがどうこうとかやると機能が無駄に増えるだけなのでサクッと捨てる。

ゼミ関係では、うちのゼミ生は全員同じSlack Workspaceに入ることが必須条件になるので、Slack内にいるチャットボット <おたすけくん> からJarvisにアクセスできる。DMで直接メッセージ飛ばす以外にも、各チャンネル内でメンションを飛ばすことで雑談に巻き込むこともできる(雑談APIは検討中なので今のところは場合わけで対応)。たとえば質問がスケジュール関係の場合には、問い合わせ元のSlackアカウントから学年を判別したあと、学年ごとに作られた Google Calendar に問い合わせのクエリが投げられる。Google CalendarのiCal形式を非公開リンクで取得すれば、一般公開せずにシステムと統合できる。使っているノードはnode-red-contrib-ical-events: upcoming、これ一個で十分。

研究関係では第一にSoftEther VPNのログ監視。本当はsyslogをNode-REDに叩き込みたかったんだけど、フリー版のSoftEtherではsyslogには対応していないのでこれは仕方ない。ということでログをファイルに吐いてそれを監視する形で対応。異常が検知された場合にはSlackのVPN管理用のchannelに自動で投稿される。こういうのいちいちメール通知にするとすぐ受信ボックスが埋まるからだるい。

講義とその他の仕事に関しては基本的にはリマインド。講義ごとにどこの教室を使っているのかが一向に覚えられないので講義15分前にリマインドを飛ばす。必要な瞬間に必要な情報をオンデマンドで得られる術さえあればこんなことは必ずしも覚えておく必要はない。あとはタスクのリマインドと、教室変更なんかの書類はSlackからおたすけくんにお願いするとpdfのURLが吐かれる。ただ将来的には書類お願いした時点で引数入れて日付とか内容とかも自動で修正した後のファイルを吐かせたい。念の為いうとこれはRPAではない。そこまでできるといよいよ秘書感が出てくる。

スマートホーム関係では、RATOC Systemsの家電リモコンとHueをコントロールできる。とはいえこれはiPhone上ではショートカットから、家ならAlexaとHueのモーションセンサーなんかで直接操作できるから必ずしもSlackやNode-REDを介する必要はない。だからここの実装は軽めで、ポイントになるのは2点。ひとつにはiPhoneのIFTTTアプリ→ IFTTT webhook → Node-REDのルートで自宅のenter / exitの情報は取っておく。これIFTTTでやるとRATOC/Hue × リビング/寝室/廊下 × 電気/エアコンでコマンドが溢れかえるので、Node-REDで外出を検知したらコマンド飛ばしてまとめて全部消す。(ここはdelayノードでうまく処理遅らせないと赤外線リモコンが対応できないので注意。それが面倒だから全部Hueに変えようとしているのだが。)二つ目にdelayノードを使って操作を「予約」できること。赤外線のタイマー機能は使わないので「30分後に寝室のエアコン消して」「15分後にリビングのエアコンつけて」みたいに時間設定が柔軟にできるようになる。

ちなみに研究関係やスマートホームのように俺だけが使えればいいコマンドをゼミ生も使えてはたまったものではないので、随所でメッセージ内容とアカウントIDからその操作の実行権限があるかをチェックする。

最終的に我が家のAlexaを駆逐してJarvisを自宅と研究室のあらゆるところに配備したい。そのためにはまず音声入出力とSpeech-to-Textを実装しなければならない。いい感じのAPIさえあればあとはRasPiで簡単にできそうはできそうなんだけどね。

僕は配線がぐちゃぐちゃしてるのとか、使いづらいスマートホームシステムをドヤ顔で見せびらかす人とかが割と無理なので、実用性重視かつなるべくワイヤレスでなんとかなるものしか組みません。

もうちょっとでいい感じになる。