kmuto’s blog

料理と旅行といろんなIT技術

「Hi, Gregor」の機能強化をした

昨日作ったhi-gregorにいろいろと手を入れて、Slackとの連携も用意した。i18nまでは面倒なので、Slackまわりは日本語入りの「実装例」という扱い。

kmuto.hatenablog.com

github.com

Changes

  • UDPエラーがたまに出ていたので、ちゃんとログに出すようにした。
  • Boltライブラリを使ってSlackと連携してみた。わりと簡単にできるな。
  • dotenvを導入して環境変数の代わりにファイルで設定できるようにしてみた。
  • package.jsonのscriptブロックにビルドと実行を書いておいた。これで npm run status とかができる。

streamlistener.js

ボットアプリとWebSocketでつなげた状態でSlackのメッセージを追跡し、定義済みの正規表現とマッチしたらhi-gregor経由でルンバから情報を取得したり、あるいは清掃や帰還を指示したりできる。

戻るのはpause→dockの間にウェイト入れないとだめっぽいね。外出先からだとスマホアプリで実行できるのでそんなに重要なものではないけれども、Boltの手習いで作ってみた。

cron-check.js

cronから呼び出すことを前提に、ルンバの状態をチェックし、以下の状態で報告する。

ドックに座っているのに充電していない、というそもそもの問題の検出をすることが狙い。

  • 清掃中、ドック帰還途上、助けて状態
  • 停止していて、バッテリーが減っている(ひとまず60%以下)。

これを以下のようなcronで呼んでいる。8〜22時の毎時5分に実行して、上記状態なら報告。

5 8-22 * * * kmuto   cd <PATH>/hi-gregor && npm run watch --silent

TODO

execしてるのがダサいとか、UDP discoveryやLocalオブジェクト構築時にまれに無限に終わらないので強制タイムアウトが必要そうとかあるんだけど、ひとまずやりたかった要件は満たせたかな。

「Hi, Gregor」というツールを作った

ルンバがドックの位置に戻っているのに充電されていない、ということがたまにあって地味に気になっていたので、状況を確認するツールを作った。実行指示を送るほうはもっと簡単だったので、ついでに実装している。

github.com

$ node dist/hi-gregor.js status
{"phase":"charge","battery":100}

$ node dist/hi-gregor.js start
{"ok":"start"}
(てれってれー)

$ node dist/hi-gregor.js dock
{"ok":"dock"}
(てれれてってれー)

実装自体は簡単なのだが、TypeScriptの勉強がてらでなるべく綺麗に…と書いていたら1日かかってしまった。

使っているのはroomba-sdkというライブラリだけど、iRobotとは関係ないユーザーによる非公式なもの。なので、クラウドAPIは使えず、ローカルLANのAPIしかない。自宅のほうではSpotify用のWindowsに、WSLでDebianを裏で動かすようにしているので、ここにとりあえずインストールしている。

ともあれ、これはまだ入口で、状態がstop & バッテリが減っている ときの警告をSlackに流したいし、ついでに清掃開始やドックに戻れも指示したい。postは簡単だけどcallbackは全然違う仕組みで、いろいろ面倒くさいところがある。コールバック受けのインターネットサーバー側の実装、さらにローカルLANとのやりとりを考えないといけない。

このあたりはRubyで類似のを実装したことがあるので、まずはそれを流用して、Node.jsだとどう綺麗にできるかは後で考えることにしよう。

なお、名前の由来はフランツ・カフカの『変身』である。我が家のルンバは代々「ザムザ」と呼ばれており、今はザムザ・サードが正式名称。