id:bash0C7の進捗

出来は上々で申し分の無い仕上がり日記

自宅のFluentd経由でiRemoconを操作する仕組み

これまでのあらすじ

自宅のFluentd経由でiRemoconの赤外線送信機能を叩きたいと思っていました。

r7kamura/iremocon · GitHubをラップして叩けばいいのねーということで、bash0C7/fluent-plugin-iremocon · GitHubというアウトプットプラグインを作りかけていました。

問題点

面倒くさがって家のリモコンをiRemoconに登録していなかったとか、連続でメッセージ飛んできたときにiRemoconに接続できない問題が残っていたとかで、ちゃんとワークできていませんでした。

解決へと動くきっかけ

最近仕事ではマネージャなるお役をいただき、自分が書くよりみんなにコードを気持ちよく書いてもらうための諸々をどうにかする業に従事しているのですが、大江戸Ruby会議04に参加して、コード書く時間を作らねばと大いに高まったため、仕掛りの当件をやりきろうと思った次第です。

解決方法

大江戸から帰宅後にさっそく家のリモコン信号をiRemoconに登録しつつ、fluent-plugin-iremoconのFluentdのOutputPluginから間隔空けて行儀よくWebのAPIを叩きたい - Qiitaやり方を使って行儀よく接続対応と、一発送信したらtelnet接続を閉じる対応を進め、自宅のインフラとして活用できるところまで持って行きました。

結果

これで、Fluentdへの何かのinputを契機に、fluent-plugin-iremoconを発動させてリモコン送信をができるようになりました。 これで外からのアクションを自宅のFluentdに食わせる事によって、自由度の高い自宅機器の自動化が行えます。

とはいえですよ

ご自宅のFluentd運用のおかげで、すべてのget系APIがインプットプラグインに、post系APIがアウトプラグインにみえてくるようになって、たのしくシンプルなFluentdで自動化生活をできつつあるんですが、先達のライブラリをラップしたり、Web APIを叩いたりといった処理を都度都度プラグインとして実装していると、本当に今後も使い続けるかわからないのにきっちりやり過ぎかなあという思いがでてきました。

そこで、かねてから作っていたbash0C7/fluent-plugin-ruby_eval · GitHubにアウトプットプラグインを追加し、設定ファイル上にスクリプトレットを書くことで、送られてきたメッセージを元に何かを叩くという処理のプロトタイピングを行いやすくしてみました。

業務できっちり動かしていくものは、プラグイン化してテストを書いて、今後の変更と再利用性を上げるといいですが、プロトタイプ実装としてはこのような簡易的な方法も悪くないんじゃないかと思ってます。

まだgemとしてリリースしていないので、お手持ちのGemfileでgithubの方を直接指すようにお願いいします。*1

channelというキーで飛んできた値を、iremocon gem経由でiRemoconに投げます。

<source>
  type exec
  command 2
  keys channel
  tag iremocon
  run_interval 5s
</source>

<match *.**>
  type ruby_eval
  require_libs iremocon
  command iremocon = Iremocon.new '192.168.0.2'; iremocon.is record['channel']; iremocon.instance_eval {@telnet.close}
  run_interval 1
</match>

*1:リリースしたいんだけど、どうにも説明文に苦しんでいています…。あとテストが。