Augmented Usamimi

it { is_expected.to be_blog.written_by(izumin5210) }

TokyuRuby会議09でIoT×RubotyについてLTしてきた #tqrk09

恒例のLT駆動開発した.

資料

スライド

動画

RSpec::LedFormatter from Masayuki IZUMI on Vimeo.

副産物

github.com

内容

最初作りたかったのは,「CIの結果を物理世界でリアルタイム通知する」やつ. それをどんな構成で実現するかを考えてるときに,Rubotyを経由させることを思いついた.LTの2日前に.

f:id:izumin5210:20150830134335p:plain

Herokuを経由しているのは,RasPiサーバを外に公開する方法がよくわからなかったから. レンタルしてるルータ/モデムの設定の問題だとは思うんだけど,1日試行錯誤してよくわからなかったのでとりあえず諦めた. ローカルマシン(Tokyo) → Heroku(Virginia) → RasPi(Tokyo)みたいなあたまの悪いルートを通ってしまうので,なんとかRasPiに直接はいれるようにしたい.

RSpecのFormatterではexampleごとにサーバにGETリクエスト飛ばしているだけなので,CI上でも動作する. CIのmasterのテストだけ通知するようにしたら職場に緊迫感とかでて便利.

RasPi × Ruboty

exampleの結果をRuboty内のWebSocketクライアントで受け取ってRasPiのGPIOを操作しているんだけど,これが重複コードだらけで鬱陶しかったのでgem化した.

github.com

f:id:izumin5210:20150830135308p:plain

Rubotyにreply送るだけでGPIO弄れるので超便利. 例ではwriteしかしてないけど,readも出来るように作ってある.

> @ruboty help
ruboty /get gpio value (?<pin>\d{,2})/ - Get GPIO value
ruboty /set gpio mode (?<pin>\d{,2}) (?<mode>in|out)/ - Set GPIO mode
ruboty /set gpio value (?<pin>\d{,2}) (?<value>high|low)/ - Set GPIO value
ruboty /unexport gpio (?<pin>\d{,2})/ - Unexport GPIO

reply受けたらセンサ値を読み取って返す みたいな機能ならruboty-alias等をうまく使ってやれば簡単に利用できるようになる. ruboty-cronとの組み合わせもおもしろいかもしれない.

Rubotyの設計思想めっちゃ好きなので,それに全力で乗っかっていきたいと思っている.

好きなGemを組み合わせて君だけの最強のBotをつくろう。

Ruby + Bot = Ruboty - ✘╹◡╹✘