Ruby + Sinatra + SNMPでPX-105のインク残量を取得・表示する

手元の環境ではプリンターのセットアップをラクにするために、WindowsServerのActiveDirectoryでGPOを使ってプリンターを配信しています。
Windows Server 2008 R2 のGPOにて、クライアントにプリンタを配布する - メモ的な思考的な
 

その環境でEPSONのPX-105プリンタを配信しているのですが、

  • 本体に液晶がない
  • プリンターのインクが切れた時に、インク切れのインクタンクが光らない
  • インク残量を見るためには、各端末にツールを入れる必要がある

というプリンタ仕様*1のため、インク残量が分かりにくく悩んでいました。
 

そんな中、設定ユーティリティのEpsonNet Config V4SNMPの項目があることに気づきました。試しにRubyスクリプトを使ってデータをとってみたところ、インク残量を取得することができました。

そこで、Sinatraを使ってグラフ表示すると自分以外の人でも状態が見えてラクだと考え、作ってみることにしました。

 

環境

 

 

Rubyを使った、SNMPの Printer MIBによるインク残量の取得

Rubyによるインク残量の取得は以下の記事がとても参考になりました。ありがとうございました。
rubyでsnmpを使ってネットワークプリンタのトナー残量チェック - ころもの記録
 

なお、community名はEpsonNet Config V4で確認したものを使いました。
EpsonNet Config V4 - EPSON Download
 

また、EPSONのPrinter MIBに関する資料は以下のページにありました(が、実際のものを見るには登録が必要...)。
MIB2に対するエプソンの解釈標準 - EPSON
 

他に、Printer MIBに関するRFCを探してみたところ、以下のRFC1759とRFC3805がありました。上記のエプソンのページでは、

RFC1759で規定されているPrinterMIBの各項目

と書かれていたため、PX-105でもRFC1759を採用しているのかなと想像しましたが、詳しいところはよく分かりませんでした。

 

Sinatraでのグラフ表示

グラフ表示については、以前HighChartsを使ったことがあったため、今回も使ってみることにしました。
Ruby + Heroku + Highchartsで食べたリンゴの割合をグラフ化してみた - メモ的な思考的な
 

HighChartsを手頃に使えそうなgemを探してみたところ、 LazyHighChartsがあったため、使ってみることにしました。
michelson/lazy_high_charts
 

SInatraで使う場合には、公式のサンプルを参考に以下の記述を追加しました。
Sinatra lazy high charts example - michelson/lazy_high_charts

  • gemにactionviewを追加
  • requireした後にinclude LazyHighCharts::LayoutHelperして使う
     

なお、今回使用するStacked Columnsのサンプルは以下にありました。
Example for stacked column - michelson/lazy_high_charts
 

また、「残量/100」のうちの残量をタンクの色にしたかったため、複数のグラフを用意して

div.chart {
    display: table-cell;
}

のように、cssで横並びにする方法にしました。
本当は一つのグラフだけで表現したかったのですが、やり方が分からなかったため見送りました。

 

 

インク残量の定期メール送信

ブラウザでグラフ表示するのも手間に感じることもあるため、定期的にインク残量をチェックし、メールで送信することも考えました。

定期実行する方法

gemを探してみたところ、wheneverWindows上では動かないようだったので、rufus-schedulerの3.x系を使いました。
jmettraux/rufus-scheduler

使い方については、以下のBlogを参考にしました。
webサーバー死活監視自作してみた by ruby + sinatra + heroku - shoprevのブログ

 

メールの送信

Sinatraの公式でも紹介されていたgem Pony を使用しました。
How do I send email from Sinatra? - Sinatra adamwiggins/pony

メールに関する設定は gem dotenvを使って、.envファイルに記載するようにしました。

 

RubyファイルのWindowsサービス化

普通のWindows7端末なので、WindowsUpdateなどが走ると再起動してしまうことから、以下を参考にWindowsサービス化しました。
Ruby 2.0 + Sinatra + Thin を Windows サービス化してみた - 記憶は削除の方向で

なお、サービスのGUIには表示されますが、GUIを使ってサービスの再起動をしてみたところ失敗したため、再起動などはコマンドラインから実行する必要があるようです。

 

Sinatraまわりで調べたこと

起動時に一度だけ行う処理の記載

configureメソッドを使います。今回はrufus-schedulerのインスタンスを入れました。
Intro Configuration - Sinatra
 

configureで指定できる設定内容

以下に記載がありました。
Configuring Settings - Sinatra

 

ソースコード

GitHubに上げました。初めてSinatraをModuler Applicationとして作れたので良かったです。
thinkAmi/PrinterStatus - GitHub

 

実行結果のサンプル

f:id:thinkAmi:20140522052248p:plain

 

参考資料

SNMPのPrinter MIB に関して、MIBオブジェクトの日本語解説が以下の書籍にあったので参考になりました。

複合型プリントサーバ

複合型プリントサーバ

*1:販売価格を考えると仕方ないと思いますが

*2:明示的に入れておかないとエラーで落ちた