プリンタのインク残量が低下したらSlackに通知する方法

IoT(Internet of Things, モノのインターネット)という言葉が存在感を増し続けている今日この頃ですが、ネットワーク対応のプリンタはIoT機器の元祖とも呼べる存在です。
そのネットワーク機能を使ってちょっとした業務改善をしてみました。

課題

プリンタを使おうとしたときに、インク切れですぐに印刷を始められないという状況を無くしたい。

印刷しようとしたときにインクが切れてるとイラッとしますよね。

対策

プリンタのネットワーク機能を使ってインクの残量を監視して、一定量よりも少なくなったらSlackで通知します。
監視用のサーバとして、当社の勤怠システムでも使っているRaspberry Piを利用します。

調査

オフィスで使っているプリンタはCanonのMG7530です。
問題はどうやってインクの残量を取得するかというところです。
初めはMG7530のLinux用ドライバをRaspberry Piにインストールしてそこからなんとか取得できないかと考えたのですが、どうやらこのドライバではインクの残量はサポートしていないようです。

そこで、MG7530のウェブインタフェースから取得することを考えました。
プリンタのIPアドレスにHTTPアクセスすると以下のような管理用ウェブUIが利用できます。

しかしながら、該当ウェブページのソースを見てもインク残量のデータそのものは含まれておらず、単純なスクレイピングはできそうもありません。

                <div class="InkPattern" id="inktank0">
                    <div class="InkMess"></div>
                    <div class="InkArea"><div class="InkBar"></div></div>
                </div>
                <div class="InkPattern" id="inktank1">
                    <div class="InkMess"></div>
                    <div class="InkArea"><div class="InkBar"></div></div>
                </div>
                <div class="InkPattern" id="inktank2">
                    <div class="InkMess"></div>
                    <div class="InkArea"><div class="InkBar"></div></div>
                </div>
                <div class="InkPattern" id="inktank3">
                    <div class="InkMess"></div>
                    <div class="InkArea"><div class="InkBar"></div></div>
                </div>
                <div class="InkPattern" id="inktank4">
                    <div class="InkMess"></div>
                    <div class="InkArea"><div class="InkBar"></div></div>
                </div>
                <div class="InkPattern" id="inktank5">
                    <div class="InkMess"></div>
                    <div class="InkArea"><div class="InkBar"></div></div>
                </div>
                <div class="InkPattern" id="inktank6">
                    <div class="InkMess"></div>
                    <div class="InkArea"><div class="InkBar"></div></div>
                </div>

これはどうやらJavaScriptで値を取得して埋めてるパターンだろうということでブラウザの開発ツールを開いてしばらく見張っていると、prninfo_data.cgiというCGIに定期的なアクセスが発生していることが分かりました。

prninfo_data.cgiリクエストへの応答はこんな感じ。

<?xml version="1.0" ?>
<response>
<PAGE_PRNINFO>
<INKREST0>0,0,0</INKREST0>
<INKREST1>5,6,0</INKREST1>
<INKREST2>4,2,0</INKREST2>
<INKREST3>1,2,0</INKREST3>
<INKREST4>2,7,0</INKREST4>
<INKREST5>3,3,0</INKREST5>
</PAGE_PRNINFO>
(略)

1桁目は全て異なる数値になっているのでインクの種類だろうということは想像できます。
2桁目はインク残量っぽいけど数値の意味がはっきりしません。3桁目はなんだろう?

データの意味を調べるためにprninfo_data.cgiを呼び出しているJavaScriptのファイルを調べたところ、こんな関数を発見しました。

function dispInkInfo(inktank_info, idStr) {

    var inkLVL = ['Lv100', 'Lv090', 'Lv080', 'Lv070', 'Lv060', 'Lv050', 'Lv040', 'Lv030', 'Lv020', 'Lv010', 'Lv000', 'Lv00X'];
    var inkMRK = ['InkMess', 'InkMess LwInk', 'InkMess NoInk', 'InkMess UnInk'];

    var inkCOL = ['InkBlk', 'InkPbk', 'InkCia', 'InkMaz', 'InkYel', 'InkGry', 'InkClr', 'InkBlk', 'InkCMYK'];

この関数の後ろの方を読むと、たとえば、<INKREST1>5,6,0</INKREST1>というデータはinkCOL[5](‘inkGry’), inkLVL[6](‘Lv030’), inkMRK[0](‘InkMess’)という風に使われるようです。
インク残量の画像と比べてみると、グレイが30%くらいになっているのでこれで合ってそうですね。

ということは、CGIの応答の3桁目が1(‘InkMess LwInk’)になっていたら通知すれば良さそうです。

実装

というわけで監視用のスクリプトを実装しました。

#!/bin/bash -eu

PRINTER_IP=X.X.X.X

function post_message() {
    check_dir=/home/pi/printer_ink_monitor
    check_file=POSTED

    exists=`find $check_dir -name $check_file -mtime -1|wc -l`
    if [ $exists -ne 0 ]; then
	return
    fi
    touch $check_dir/$check_file
    curl -X POST --data-urlencode 'payload={"channel": "#channel1", "username": "MG7530", "text": "プリンタのインク残量が僅かになりました", "icon_emoji": ":printer:"}' https://hooks.slack.com/services/XXX/YYY/ZZZ
}


xml=`curl -m 2 -s "http://${PRINTER_IP}/rui/prninfo_data.cgi" -H 'Content-Type: application/x-www-form-urlencoded' -H 'Authorization: Basic HOGEHOGE' --data 'GETINFO=0'`

result=`echo $xml | /home/pi/printer_ink_monitor/parsrx.sh |grep INKREST |cut -d, -f3`
for status in $result; do
    # 0: normal, 1: Low Ink, 2: No Ink, 3: Un Ink(?)
    if [ $status -eq 1 ]; then
	post_message
    fi
done

parsrx.shでXMLのデータを行指向のデータに変換しているので、以下のようにしてインク残量のデータだけを取り出せます。
この数値がどれか1個でも1になっていたら通知するようにしています。

$ curl -m 2 -s "http://X.X.X.X/rui/prninfo_data.cgi" -H 'Content-Type: application/x-www-form-urlencoded' -H 'Authorization: Basic HOGEHOGE' --data 'GETINFO=0' | bash printer_ink_monitor/parse_xml.sh | grep INKREST | cut -d',' -f3
0
0
0
0
0
0

また、通知が連続するとうっとうしいことになるので、1日1回だけ送るようにしています。

テスト

インク切れの状態はなかなか作り出せないので、上のスクリプトをいじってインク残量が0だったら通知するようにしてテスト実行してみました。

通知来た!

まとめ

完成したので毎分チェックするようにcronを設定しました。(毎分なのは、プリンタは使う時だけ電源を入れるルールなので、電源が入っているタイミングを逃さないためです)

先日インク切れが発生し通知がきたので、無事印刷をする前にインク交換をすることができました。

「PHPカンファレンス関西2017」に協賛させていただきます


「PHPカンファレンス関西2017」に、Goldスポンサーとして協賛させていただきます。
 
<期間>
2017年7月15日(土)
<会場>
大阪グランフロント
<主催>
PHPカンファレンス関西2017開催実行委員会
「PHPカンファレンス関西2017」公式サイト

もうすぐ泳げるようになりますね!

日増しに暑くなってきましたが、いかがお過ごしでしょうか。
こう暑くなってくるとプールやら海なんかで泳ぎたくなりますが、
今回はゲームのお話です。

弊社社員の中には光の戦士(FINAL FANTASY XIVプレイヤー)が数名在籍しており、
普段からお昼休みにプレイする社員までいます。

 

…他人行儀に紹介しましたが私のことです。

そんな私は、6月19日(月)から数日間有休をいただいております。
なぜ有休をとったかというと、今回はFINAL FANTASY XIVの拡張パックである紅蓮の解放者のアーリーアクセスが始まる為です。
今回の拡張パックでは、レベルキャップ開放、新ジョブ追加。
また、世界が広がり、海も泳げるようになるとのことで楽しみで仕方ありません。
ゲームの為に有休をとるの?という方もいらっしゃるかと存じますが、弊社では問題ありません。
ちなみにアーリーアクセスは6月16日(金)18時から開始されますが、その日は普段通りに出社します。
ですが安心してください、弊社では時差出勤制度があり、早く出社すればその分早く帰ることが出来ます。
8時に出勤し、お昼休みを使いリモートで自宅のクライアントをアップデート、17時に退勤し、18時からゲーム。
完璧なスケジュールですね。
また、弊社では完全週休二日制が採用されている為、土日も遊べます。

 

さりげなく(?)弊社の制度をいくつか紹介してみました。

弊社では、共に戦っていただける光のプログラマー光のデザイナーを募集しております。

Officeで消耗しないたった1つの方法

最近、引越しをしてお家をアップデートした、デザイナー兼ディレクターを甘噛みしているヒロシです。

 

アップデートといえば、MicrosoftのOfficeが2016版にアップデートされて久しいですが、導入の方はもうお済みでしょうか?

WordやExcel、PowerPointなど、今や資料作成や業務管理ツールの定番であり、ビジネスを行う上で欠かせないツールですよね。

便利だけど何年かに行われるアップデートが悩みのタネ

 

 

個人で使う分ならリプレイスもすぐに済みますが、何十人、何百人の組織になると時間もお金も大変なコストになってしまい悩まれているマネジメントの方も多いのではないでしょうか?
しかも、ボタンの配置が変わっていたり、ファイルの互換性の問題があったりと実際にソフトを使うスタッフも何かと大変だったりします。

 

そこでG Suiteがオススメです

SploutではOfficeではなくG Suiteを導入しております。
G SuiteはGoogleが提供する様々なツールを
1つのパッケージで全て利用できるサービスです。

G Suiteには、Officeと同等の機能を持つ以下のツールが利用できます。

 

・Google スプレッドシート(Excel)
・Google ドキュメント(Word)
・Google スライド(PowerPoint)etc…

 

上記のツールは年々バージョンアップされ使い勝手も向上しています。
(もちろんアップデートは自動的にしてくれるのがポイント)
スプレッドシートの関数の種類が気になる方も今ではかなり増えていますし、グラフ化対応も充実しています。データの分析など、よほど高度な使い方をしていなければ問題なくご利用できます。

 

スプレッドシートの豊富な機能についてはこちらも参考にしてみてください。
https://linq.career-tasu.jp/magazine/knowhow-google-spreadsheet-20technique/

 

さらに「Google Drive」が超便利!

 

 

プライベートでGmailを利用されていればご存知の方も多いと思いますが、このGoogle Driveはクラウドストレージです。これが大変便利で、作成したスプレッドシートやドキュメント等をクラウドに保存し、簡単に共有できてしまいます。

・共有する範囲が設定できる

例えば、「社内規定などのドキュメントは社内全員」、「プロジェクト進捗管理用スプレッドシートなどはチーム単位」で共有できます。

・フォルダを作成して用途毎に管理

Drive内にフォルダを作成できますので、デスクトップ感覚で用途毎にファイルを整理することができます。フォルダ単位での共有も可能です。

・Excelファイルの編集も自由自在

クライアントから送付されたExcelファイルをGoogle Driveにアップロードすれば、Excelファイルをスプレッドシート形式で開くこともできますし、
スプレッドシートをExcel形式やPDF形式で保存、ダウンロードができます。

・複数人での同時編集も可能!

チームで進めているプロジェクトなど、進捗管理用シートを用意して、メンバーそれぞれが進捗状況を同時に編集できてしまうんです!

さらに、シート上での作業は全て自動保存しているので、いつでも履歴から戻したい状態までさかのぼれるため、バージョン管理も簡単に行えます!

 

G Suiteを利用している会社同士なら、
受け渡しサーバー不要!

 

弊社では、G Suiteを導入されているパートーナー企業様とDrive内に共有フォルダを用意し、ファイルのやり取りを行っています。
一々、メールにファイル添付する必要もありませんし、受け渡しサーバーを用意する必要もなくなり、効率的にコミュニケーションを行うことができます。

 

お使いのドメインのまま、Gmailに移行できる!

 

独自ドメインで社内メールをGmailにすることができるのもポイントです!

Gmailならプライベートでご利用されている方も多いと思いますので、
学習コストも抑えることができるのではないでしょうか?

GmailとGoogleカレンダーを連携すれば、社内のスケジュールをGoogleカレンダーに集約することができ、モバイルからもアプリで閲覧が可能です。

もちろん2段階認証機能が付いているのでセキュリティも万全です!

 

Hangoutsでチャットでのやり取りも

 

チャットでのコミュニケーションツールといえば、ChatWorkやSlackなどを導入されている企業様も多いかと思いますが、G SuiteでもチャットツールHangoutsが無料で利用できます。

1対1のチャットだけでなく、メンバーを選択してグループチャットを簡単に行うこともできます。チャットログが残るので、以前どんなやりとりをしていたかをさかのぼって確認できるのが便利です。

またHangoutsには高度なビデオチャット機能が付いているので、Skypeなどを利用せずともビデオ会議ができてしまいます。

 

まとめ

 

いかがでしょうか?
G Suiteは、Officeに代わる機能をもつだけでなく、Gmailやカレンダー、クラウドサーバーやチャットツールなど、それら全ての機能を1つのパッケージでできてしまいます。

もちろん、他に挙げた様々なツールもそれぞれの機能に特化した優秀なツールに違いありません。ですが、G Suiteなら様々なコストを限りなく抑え、Officeで消耗しないビジネスライフを送ることができるのではないでしょうか?

 

SploutはG Suiteのパートナーです。

導入はもちろん、導入のご相談からサポートまで一貫したお手伝いをさせていただいております。この機会にG Suiteの導入をご検討してみてはいかがでしょうか?
お気軽にご相談ください。
 

 

 

 

話題のNintendoのアレをゲットしました

こんにちわ。
リエです。
 
この前お友達と飲みに行った時に、得意料理ってある?という話になりました。(お料理はたま〜にする程度です)
得意料理・・得意料理・・・なんだろ。。
すぐ出てきませんでした。
結論買ったほうが早いし美味しいよね!ということで意見はまとまりました。
ダメウーマン。
 
そして少し前にあるものを手に入れました。
それは「NintendoSwitchスクリーンショット 2017-05-23 16.25.43(2)
※画像は任天堂さんのサイトよりお借りしました。
 
運良く手に入れることができたこのSwitchですが、ゲームを買ったのはたまごっち以来というくらい普段ゲームをしない人間のわたしですがハマっております。(この話をするとたまごっちと一緒にするなと言われました)
ちなみにハマっているソフトはマリオカート8デラックスです。
 
ですが、なんせゲーム音痴なので負ける負ける。
マリオカート勝てない。
なにこれ、悔しいわ。
 
ということで「マリオカート」「うまくなる方法」でググる。
ふむふむ、ロケットスタートε≡≡ヘ( ´Д`)ノのやり方はこうなのねと大変勉強になりました。
うまくなるには練習あるのみ!ということでさっそく実践へ。
 
コツをつかむまで何回か失敗をしましたが、繰り返しなんとかできるように。
勝つと快感!楽しい!
 
マリオカートの挑戦者求む(*´ڡ`●)
 
 
 
いや、でも調子乗りましたが超絶ビギナーなのでかな〜り手加減して対戦してくださる方希望です。。(小声)