マウスで簡単に代用できる、raspberrypiの物理ボタンを実装。
ついこの間「raspberry piを使って家のIoT化」で作ったラズパイサーバーのwifi接続が切れてslackからのrebootもsshもできなくなってしまいました。
ラズパイってすごく便利なんですけどネットワーク接続が切れるとモニターを繋いで再起動もしくは再設定しないといけないので不便ですよね。
私の家ではリビングに設置しているので、モニターを持ってくるだけでも一苦労。
ちなみに我が家のラズパイに繋げられるモニターは37インチのテレビのみ...
この前は諦めて電源を引っこ抜きました。
そんなこんなで、やっぱり再起動処理のかけれる物理ボタンは実装したいなと色々思案していると、便利なnode.moduleを発見しました。
マウスのクリックイベントを簡単に取得できるnode-mouseです。
ワイヤレスマウスも安いものが出回ってるのでポチってこんな感じになりました。
壁には両面テープでつけてるだけです。
クリックは左クリック、ホイールクリック、右クリックの3つが値として取得できます。
嫁のリクエストにより左クリックには前回作った、「次のバスの時刻を発話する機能」を実装しております。
再起動処理は3つのボタンの中で使用頻度の低いホイールクリックに割り当てました。
右クリックには今のところ何も仕込んでいません。
ボタンを押す(クリック)だけで次のバスの時刻が音声で流れるのは結構好評みたいです。アプリからSlack開いてbusコマンドを打つのすら煩わしかったらしいww
再起動もサクサク動いてくれて使い勝手が良くなりました。
実装
今回のレシピはこんな感じ。シンプルですね。
- raspberry pi3
- node.js
- node-mouse
実装したソースコードは下記の通りです。
click.js
var exec = require('child_process').exec
var Mouse = require('node-mouse');
var mouseDevice = new Mouse();
mouseDevice.on('click', function(e){
if (e.button === 0) {
console.log("左クリック");
var day = get_day(new Date),
time = get_time_m(new Date),
message = bus(day,time),
command = "sh /home/pi/hubot/sh/jsay.sh " + message;
exec(command,function(error, stdout, stderr){
if(error){console.log(error);}
if(stdout){console.log(stdout);}
if(stderr){console.log(stderr);}
})
}
if (e.button === 1) {
console.log("ホイールクリック");
exec("sudo reboot",function(error, stdout, stderr){
if(error){console.log(error);}
if(stdout){console.log(stdout);}
if(stderr){console.log(stderr);}
})
}
if (e.button === 2) {
console.log("右クリック");
}
});
左クリック(e.button === 0)に記述している処理はバスの時刻取得関数です。前回制作したhubotのスクリプトからそのままclick.jsに記述してますが、上記のコードには長くなるため省略してます。
本来であれば、hubot側とclick.js側で処理が重複しているため外部に切り出してチャイルドプロセスから実行するようにしたほうがいいかもですね。いつか改修します。
前回の記事はこちらから↓↓↓
再起動時の自動立ち上げ
再起動時の立ち上げ処理も実装しておきます。
/etc/rc.localにnodeコマンドを打っておくだけの簡易実装。
/etc/rc.local
forever start /home/pi/click.js
node-moduleのforeverを使ってデーモン化をしておくと便利です。
今後について
これで我が家には物理ボタンを実装できたので実装できる機能の幅が広がります。
amazonがdashボタンとか便利な物をだしてるので、まねしてクリック一つで注文出来るシステムを作ろうかな〜とか。
音声認識はどうしたって感じですが、まだまだ重い腰があがらない...