地味に便利!Raspberry Piが起動したらIPアドレスを通知するチャットボットを作る
こんにちは、代表ののびすけです。
Raspberry Piは起動するたびにIPアドレスが変わってしまうことがありますよね。 だいたいの人はSSH接続していると思うのでIPアドレスが変わると再確認をしないといけませんが、 RaspberryPiは基本的にディスプレイとキーボードを接続しないとIPアドレスの確認できないのがめんどくさいですね。 (FTDIとかはありますがこれも手間はあります。)
そこで今回は、Raspberry Piの起動時に自身のIPアドレスをHipChatに通知する仕組みを作ります。
ちなみに、ここでいうチャットボットは「会話をする」というより「チャットに通知するプログラム」っていう意味合いです。
環境
- Raspberry Pi 2 ModelB
- Raspbian 8.0 Jessie
- Node.js 4.4.2
Node.jsでIPアドレスを知る
os.networkInterfaces()
でネットワーク情報を取得し、os.hostname()
でマシン名を取得できます。
「node.jsでローカルIPアドレスの取得」を参考にさせて頂きました。
//app.js
'use strict'
const os = require('os');
let interfaces = os.networkInterfaces();
let mes = '';
for (let dev in interfaces) {
interfaces[dev].forEach((details) => {
if (details.internal || details.family !== 'IPv4') return;
mes = `${os.hostname()}:${details.address} (standup)`;
console.log(mes);
});
}
実行してみましょう。
$ node app.js
raspberrypi:192.168.43.70 (standup)
これでホスト名とIPアドレスを取得することができました。
HipChatにポストする
話題のチャットボット開発。Node.jsでHipChatに投稿してみよう。の記事でHipChatに投稿している部分を外部モジュール化しておきます。
libs/hcPost.js
としました。
//app.js
'use strict'
const os = require('os');
const hcPost = require('./libs/hcPost');
let interfaces = os.networkInterfaces();
let mes = '';
for (let dev in interfaces) {
interfaces[dev].forEach((details) => {
if (details.internal || details.family !== 'IPv4') return;
mes = `${os.hostname()}:${details.address} (standup)`;
let postData = {
"color": "yellow",
"message": mes,
"notify": false,
"message_format":"text"
};
hcPost(postData);
});
}
これで実行するとホスト名とIPアドレスがHipChatに投稿されます。
ソースコードはGitHubにも載せてあります。
Raspberry Piの起動時にNode.jsアプリケーションの起動を設定する
Node.jsのアプリケーションはRaspberry Piを再起動させたタイミングで完全にプロセスが落ちてしまうので、起動時に実行されるように設定します。
「RaspberryPiの起動時にNode.jsを実行&PM2で永続化するメモ」にもあるように、/etc/rc.local
に処理を書き込むことで起動時に処理をしてくれます。
sudo vim /etc/rc.local
などでファイルを開くと、デフォルトで以下の内容が記載されています。
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
exit 0
ここにNode.jsアプリケーションの実行処理を記述しましょう。/etc/rc.local
に以下を書き込みます。
sudo -u pi /home/pi/.nvm/versions/node/v4.4.2/bin/node /home/pi/app.js
ちなみにこのsudo -u pi <nodeコマンドの絶対パス> <起動するスクリプトの絶対パス>
となります。
パスが分からない人は、whichコマンドでパスを見つけましょう。
$ which node
/home/pi/.nvm/versions/node/v4.4.2/bin/node
最終的にこうなりました。
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
sudo -u pi /home/pi/.nvm/versions/node/v4.4.2/bin/node /home/pi/app.js
exit 0
この状態で上手く動作するか確認してみます。
sudo /etc/rc.local
ここでエラーが出る場合はパスの指定などが間違ってる可能性が高いです。
こんな感じの表示がHipChat側にされたら成功です。
ちなみにHipChatの絵文字は種類が豊富で(standup)
を指定すると画像のように人が立ち上がる絵文字になります。
最後に設定が出来たらRaspberry Piの電源を再起動してみましょう。 起動直後にHipChatにRaspberry PiのIPアドレスが通知されたら、起動設定が成功している証拠です。
おわりに
これで「Raspberry PiのIPが変わってしまいSSHログインがしにくい問題」が解決しそうです。 起動した際に通知が来るので通常起動してるかどうかの監視にも使えそうです。
Raspberry Piからチャットへの一方通行な通信なので、Raspberry Piが何らかの原因で動作していない場合はMilkcocoaなどで双方向の通信を入れれば死活監視もできそうですね。
皆さんも是非活用してみて下さい。